【AI大模型应用开发】【LangChain系列】9. 实用技巧:大模型的流式输出在 OpenAI 和 LangChain 中的使用

  • 大家好,我是同学小张,日常分享AI知识和实战案例
  • 欢迎 点赞 + 关注 👏,持续学习持续干货输出
  • +v: jasper_8017 一起交流💬,一起进步💪。
  • 微信公众号也可搜【同学小张】 🙏

本站文章一览:

在这里插入图片描述


当大模型的返回文字非常多时,返回完整的结果会耗费比较长的时间。如果等待大模型形成完整的答案再展示给用户,明显会给用户不好的体验。所以,现在市面上大多数的AI应用,在给用户结果时,都是以流式输出的方式展示给用户的。所谓的流式输出,就是类似打字机式的方式,一个字或一个词的输出,给用户一种答案逐渐出现的动画效果。

今天我们来学习下如何流式输出大模型的返回结果。本文将涵盖 LangChain 的流式输出方式和 OpenAI 原生的流式输出方式。

0. LangChain的流式输出 Streaming

0.1 实现流式输出

我们在 【AI大模型应用开发】【LangChain系列】实战案例4:再战RAG问答,提取在线网页数据,并返回生成答案的来源 代码的基础上,增加流式输出。

原代码:

import bs4
from langchain import hub
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import</
在 FastAPI 中集成 LangChain流式输出通常需要使用 **Server-Sent Events (SSE)** 来实现。因为 `agent.run()` 是阻塞式的,不能直接用于异步 Web 框架中,所以我们需要通过自定义回调函数将流式内容发送给客户端。 下面是一个完整的示例,展示如何在 FastAPI 中集成 LangChain 并实现流式输出: --- ### ✅ 示例代码:FastAPI + LangChain 流式输出 ```python from fastapi import FastAPI, HTTPException from fastapi.responses import StreamingResponse from langchain.agents import initialize_agent, AgentType from langchain.chat_models import ChatOpenAI from langchain.tools import Tool from langchain.callbacks.base import BaseCallbackHandler import asyncio app = FastAPI() # 自定义流式回调处理器(用于将每块响应发送到客户端) class StreamCallback(BaseCallbackHandler): def __init__(self): self.queue = asyncio.Queue() async def on_llm_new_token(self, token: str, **kwargs) -> None: await self.queue.put(token) async def get_tokens(self): while True: token = await self.queue.get() if token is None: break yield token # 示例工具 def add_tool(input_str: str) -> int: a, b = map(int, input_str.split(",")) return a + b tools = [ Tool(name="AddTool", func=add_tool, description="Useful for adding two numbers. Input should be two integers separated by comma.") ] # 初始化语言模型(不立即设置回调) llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0) # 初始化代理 agent = initialize_agent( tools=tools, llm=llm, agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION, verbose=True, handle_parsing_errors=True ) @app.post("/stream") async def stream_query(): callback = StreamCallback() # 在后台线程中运行 agent.run() async def run_agent(): try: await asyncio.get_event_loop().run_in_executor( None, lambda: agent.run("What is the sum of 5 and 7?", callbacks=[callback]) ) finally: await callback.queue.put(None) # 结束信号 # 启动 agent.run() 异步执行 asyncio.create_task(run_agent()) # 返回流式响应 async def stream_output(): async for token in callback.get_tokens(): yield token return StreamingResponse(stream_output(), media_type="text/event-stream") ``` --- ### 🔍 解释: 1. **`StreamCallback` 类**: - 继承自 `BaseCallbackHandler` - 使用 `asyncio.Queue` 缓存每个新 token - 实现 `on_llm_new_token` 方法来捕获每次生成的新 token 2. **`StreamingResponse`**: - FastAPI 提供的流式响应类 - 设置 `media_type="text/event-stream"` 表示这是一个 SSE 响应 3. **异步调用 `agent.run()`**: - 因为 `agent.run()` 是同步方法,需要用 `run_in_executor` 放入线程池中运行,避免阻塞主线程 4. **SSE(Server-Sent Events)**: - 客户端可以通过 EventSource 接收服务端推送的事件流 - 非常适合用于聊天机器人等需要逐步返回结果的场景 --- ### 🛠️ 运行方式: 1. 安装依赖: ```bash pip install fastapi uvicorn langchain openai ``` 2. 启动服务: ```bash uvicorn your_file_name:app --reload ``` 3. 访问接口: - 打开浏览器访问 `http://localhost:8000/stream`,你会看到内容逐字显示。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

同学小张

如果觉得有帮助,欢迎给我鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值