Langchain 流式输出

Langchain 流式输出

当我们深入使用Langchain时,我们都会考虑如何进行流式输出。尽管官方网站提供了一些流式输出的示例,但这些示例只能在控制台中输出,并不能获取我们所需的生成器。而网上的许多教程也只是伪流式输出,即先完全生成结束,再进行流式输出。

以下是我为大家提供的真正的流式输出示例代码:
方法一: 不使用任何异步的操作,但是只适用于对 非 Chain(链)的 LLM Model 进行使用

from langchain.chat_models import ChatOpenAI

llm = ChatOpenAI(engine='GPT-35')
messages= [ChatMessage(role="user",content="写一个1000字的修仙小说")]
result = llm._stream(messages) # 这里会得到生成器
text = ""
for i in result:
      text = text+i.message.content

方法二: 基于 python 异步机制实现 (最有效,最好的方式)
为了方便展示,我直接使用gradio写一个小webUI,因为流式输出的场景就是用于Web的展示。直接进行python输出也是可以的。
值得注意的是 方法 一定要加上 async ,这里对于小白可能看不懂, 因为这里涉及到,异步协程等概念。

import gradio as gr
import asyncio
from langchain.chat_models import ChatOpenAI
#使用 异步的 Callback   AsyncIteratorCallbackHandler
from langchain.callbacks import AsyncIteratorCallbackHandler

async def f():
   callback = AsyncIteratorCallbackHandler()
   llm = ChatOpenAI(engine='GPT-35',streaming=True,callbacks=[callback])
   coro = llm.apredict("写一个1000字的修仙小说")  # 这里如果是 LLMChain的话 可以 换成  chain.acall()
   asyncio.create_task(coro)
   text = ""
   async for token in callback.aiter():
       text = text+token
       yield gr.TextArea.update(value=text)

with gr.Blocks() as demo:
    with gr.Column():
         摘要汇总 = gr.TextArea(value="",label="摘要总结",)
         bn = gr.Button("触发", variant="primary")
    bn.click(f,[],[摘要汇总])

demo.queue().launch(share=False, inbrowser=False, server_name="0.0.0.0", server_port=8001)

实际上,这些方法非常简单,但是在文档和网上教程中确实很难找到。我花费了半天的时间研究了Langchain的源码,才发现可以通过以下方式实现。

方法来之不易,如果您有所收获,请点赞,收藏,关注

你可能感兴趣的:(langchain,大数据,AIGC)