使用 Flask 和 LangChain 流式传输 ChatGPT 的结果

Dan*_*uez 10 python flask openai-api langchain large-language-model

基本上我想用 Flask 和 LangChain 来实现这一点:https://www.youtube.com/watch?v =x8uwwLNxqis 。

我正在构建一个在后端使用 LangChain 的问答 Flask 应用程序,但我在传输来自 ChatGPT 的响应时遇到问题。我的链条看起来像这样:

chain = VectorDBQA.from_chain_type(llm=ChatOpenAI(model_name="gpt-3.5-turbo", streaming=True, chain_type="stuff", vectorstore=docsearch)
...
result = chain({"query": query})
output = result['result']
Run Code Online (Sandbox Code Playgroud)

Jinja 只是打印{{ output }},并且工作正常,但结果不会出现在网站中,直到整个响应完成。我想流式传输由 ChatGPT 生成的结果。

我尝试过使用stream_template,但它不起作用(它不传输结果,它只是立即打印完整的响应,尽管我可能做错了什么)。


我终于解决了:

https://github.com/DanteNoguez/FlaskGPT

Jos*_*lff 2

为了更清楚地表明这个问题有答案并避免将来出现链接损坏(当有人只留下链接时常见的 StackOverflow 问题),但丁(OP)在这里解决了它:

https://github.com/DanteNoguez/FlaskGPT

def gen_prompt(docs, query) -> str:
    return f"""To answer the question please only use the Context given, nothing else. Do not make up answer, simply say 'I don't know' if you are not sure.
Question: {query}
Context: {[doc.page_content for doc in docs]}
Answer:
"""

def prompt(query):
     docs = docsearch.similarity_search(query, k=4)
     prompt = gen_prompt(docs, query)
     return prompt


def stream(input_text):
     completion = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=[
            {"role": "system", "content": "You're an assistant."},
            {"role": "user", "content": f"{prompt(input_text)}"},
        ], stream=True, max_tokens=500, temperature=0)
     for line in completion:
        if 'content' in line['choices'][0]['delta']:
            yield line['choices'][0]['delta']['content']

@app.route('/completion', methods=['GET', 'POST'])
def completion_api():
    if request.method == "POST":
        data = request.form
        input_text = data['input_text']
        return Response(stream(input_text), mimetype='text/event-stream')
    else:
        return Response(None, mimetype='text/event-stream')
Run Code Online (Sandbox Code Playgroud)