当前位置: 首页 > article >正文

别再让Langchain流式输出卡脖子了!FastAPI + SSE实战,附ChatGLM3完整配置

Langchain流式输出实战FastAPI与SSE深度整合指南引言在当今AI应用开发领域流式输出已成为提升用户体验的关键技术。想象一下当用户与你的AI助手交互时等待完整响应的时间可能长达数秒甚至更久——这种等待体验在实时交互场景中尤为致命。流式输出技术正是解决这一痛点的利器它允许模型生成的内容像流水一样逐步呈现给用户而不是等待全部完成后再一次性展示。对于使用Langchain框架的开发者而言实现真正的流式输出并非易事。官方文档中的示例往往停留在控制台输出层面而社区中的许多解决方案实际上是伪流式——先完整生成再分块返回。本文将彻底解决这一问题通过FastAPI和Server-Sent Events(SSE)技术构建一个可直接供前端调用的高效流式接口。1. 环境准备与基础配置1.1 核心依赖安装首先确保你的Python环境(建议3.8)已准备就绪。我们需要安装以下关键包pip install langchain fastapi uvicorn sse-starlette python-dotenv对于ChatGLM3等本地模型的集成还需额外安装对应的模型包。这里以ChatGLM3-6B为例pip install transformers4.33.3 cpm_kernels torch2.0 sentencepiece1.2 环境变量管理良好的配置管理是项目可维护性的基础。创建.env文件存储敏感信息# .env示例 MODEL_NAMEchatglm3-6b MODEL_PATH/path/to/your/model MAX_TOKENS2048 TEMPERATURE0.7在代码中通过python-dotenv加载这些配置from dotenv import load_dotenv import os load_dotenv() model_name os.getenv(MODEL_NAME, chatglm3-6b) max_tokens int(os.getenv(MAX_TOKENS, 2048))2. 流式输出核心架构设计2.1 SSE技术原理剖析Server-Sent Events(SSE)是一种允许服务器向客户端推送更新的轻量级协议。与WebSocket相比SSE具有以下优势特性SSEWebSocket协议HTTP独立协议方向性单向(服务端→客户端)双向复杂度低高自动重连支持需手动实现浏览器兼容性良好优秀对于单纯的流式输出场景SSE通常是更简单高效的选择。2.2 Langchain流式回调机制Langchain通过回调系统实现流式输出。关键组件是StreamingStdOutCallbackHandler我们需要自定义其行为from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler class CustomStreamingCallback(StreamingStdOutCallbackHandler): def __init__(self): super().__init__() self.token_queue asyncio.Queue() async def on_llm_new_token(self, token: str, **kwargs): await self.token_queue.put(token) async def aiter_tokens(self): while True: token await self.token_queue.get() if token is None: # 结束信号 break yield token这种实现方式避免了线程安全问题完全基于异步IO构建。3. FastAPI接口深度实现3.1 完整API代码实现下面是一个可直接用于生产的FastAPI实现from fastapi import FastAPI, Request from sse_starlette.sse import EventSourceResponse import asyncio from typing import AsyncGenerator app FastAPI() app.post(/stream_chat) async def chat_stream(request: Request, query: str): callback CustomStreamingCallback() # 初始化模型链 llm ChatOpenAI( modelmodel_name, streamingTrue, callbacks[callback], max_tokensmax_tokens ) prompt ChatPromptTemplate.from_messages([ (system, 你是一个专业的AI助手。), (human, {query}) ]) chain prompt | llm async def event_generator() - AsyncGenerator: # 在后台运行模型预测 task asyncio.create_task(chain.ainvoke({query: query})) # 流式返回tokens async for token in callback.aiter_tokens(): yield { event: message, data: json.dumps({ token: token, generated_text: # 可累计已生成文本 }) } yield {event: end, data: } return EventSourceResponse(event_generator())3.2 关键参数调优指南模型参数对输出质量和性能有重大影响。以下是ChatGLM3的推荐配置范围参数推荐范围影响说明max_tokens512-4096控制响应长度越大生成越慢temperature0.5-1.0值越高输出越随机top_p0.7-0.95影响输出的多样性frequency_penalty0-1抑制重复内容在FastAPI中可以通过查询参数动态调整这些设置app.post(/chat) async def chat_endpoint( query: str, max_tokens: int Query(default1024, le4096), temperature: float Query(default0.7, ge0.1, le1.0) ): # 使用参数初始化模型 llm ChatOpenAI( modelmodel_name, streamingTrue, max_tokensmax_tokens, temperaturetemperature ) # ...其余逻辑相同4. 前端集成与性能优化4.1 前端SSE连接示例前端实现非常简单以下是一个React组件示例function ChatStream() { const [messages, setMessages] useState([]); const handleSubmit async (query) { const eventSource new EventSource(/stream_chat?query${encodeURIComponent(query)}); eventSource.onmessage (event) { const data JSON.parse(event.data); if (event.event end) { eventSource.close(); } else { setMessages(prev [...prev, data.token]); } }; eventSource.onerror () { eventSource.close(); }; }; return ( div {/* 聊天界面实现 */} /div ); }4.2 性能优化技巧在实际部署中以下几个优化点可以显著提升性能连接复用保持SSE连接长时间开放避免频繁重连压缩传输启用gzip压缩减少网络负载负载均衡当使用多个GPU实例时确保SSE连接始终路由到同一后端心跳机制定期发送注释行保持连接活跃# FastAPI中添加心跳 async def event_generator(): last_sent time.time() while True: if time.time() - last_sent 15: # 15秒心跳 yield :keepalive\n\n last_sent time.time() # ...正常token处理5. 高级应用与故障排查5.1 多模型路由策略对于需要支持多个模型的大型应用可以实现智能路由MODEL_REGISTRY { chatglm3: ChatGLM3Pipeline, qwen: QWenPipeline, openai: OpenAIClient } app.post(/chat/{model_name}) async def model_router(model_name: str, query: str): if model_name not in MODEL_REGISTRY: raise HTTPException(404, Model not supported) model_class MODEL_REGISTRY[model_name] llm model_class(streamingTrue) # ...其余逻辑相同5.2 常见错误与解决方案错误现象可能原因解决方案连接频繁断开代理或LB超时调整Nginx的proxy_read_timeout输出不连贯模型生成速度波动前端添加缓冲机制内存泄漏未正确释放资源确保finally块中关闭连接高延迟模型加载策略不当实现模型预热机制对于内存泄漏问题特别要注意资源清理app.on_event(shutdown) async def cleanup(): await model.close() # 确保模型正确释放资源6. 生产环境部署建议6.1 容器化部署使用Docker可以简化依赖管理。以下是示例DockerfileFROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 特别针对transformers的优化 ENV TRANSFORMERS_CACHE/app/model_cache RUN mkdir -p $TRANSFORMERS_CACHE COPY . . CMD [uvicorn, main:app, --host, 0.0.0.0, --port, 8000]6.2 监控与日志完善的监控是生产系统的必备条件。推荐集成Prometheus指标通过prometheus-fastapi-instrumentator暴露指标结构化日志使用structlog或loguru性能追踪集成OpenTelemetry# 日志配置示例 from loguru import logger logger.add(logs/chat_{time}.log, rotation100 MB) app.middleware(http) async def log_requests(request: Request, call_next): start_time time.time() response await call_next(request) process_time (time.time() - start_time) * 1000 logger.info(f{request.method} {request.url} - {process_time:.2f}ms) return response7. 架构演进与扩展思路随着业务规模增长基础架构可能需要演进。以下是几个扩展方向分布式流式处理使用Kafka或Redis Stream作为中间层输出缓存对常见查询结果进行缓存自适应流控根据客户端网络状况调整传输速率AB测试框架支持不同模型版本的并行测试一个简单的Redis缓存集成示例from redis import asyncio as aioredis redis aioredis.from_url(redis://localhost) app.post(/cached_chat) async def cached_chat(query: str): cache_key fchat:{hash(query)} cached await redis.get(cache_key) if cached: return JSONResponse({result: cached.decode()}) # 流式处理并缓存结果 full_response async for token in stream_response(query): full_response token # ...流式返回逻辑 await redis.setex(cache_key, 3600, full_response) # 缓存1小时

相关文章:

别再让Langchain流式输出卡脖子了!FastAPI + SSE实战,附ChatGLM3完整配置

Langchain流式输出实战:FastAPI与SSE深度整合指南 引言 在当今AI应用开发领域,流式输出已成为提升用户体验的关键技术。想象一下,当用户与你的AI助手交互时,等待完整响应的时间可能长达数秒甚至更久——这种等待体验在实时交互场…...

从理论实验室到全球加密网络的技术跃迁

量子通信基于量子力学原理构建绝对安全的加密体系。其核心量子密钥分发(QKD)技术利用量子不可克隆、测量坍缩及纠缠分发三大特性,实现“窃听必留痕”的物理级防护,从根本上抵御量子计算攻击。中国在该领域实现多重突破&#xff1a…...

novel-downloader:终极小说下载指南,永久保存你的阅读时光

novel-downloader:终极小说下载指南,永久保存你的阅读时光 【免费下载链接】novel-downloader 一个可扩展的通用型小说下载器。 项目地址: https://gitcode.com/gh_mirrors/no/novel-downloader 你是否曾为心爱的小说突然消失而心痛?是…...

Windows风扇控制终极指南:Fan Control免费软件让电脑散热更智能

Windows风扇控制终极指南:Fan Control免费软件让电脑散热更智能 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Tr…...

Hermes Agent:2026 年最火的 AI Agent,到底牛在哪?

Hermes Agent:2026 年最火的 AI Agent,到底牛在哪?最近 AI 圈有个叫 Hermes 的东西火得一塌糊涂,GitHub 星标蹭蹭涨。很多人第一反应:“爱马仕出 AI 了?” 😂 不不不,此 Hermes 非彼…...

Windows窗口管理革命:如何用AlwaysOnTop彻底改变你的多任务工作方式

Windows窗口管理革命:如何用AlwaysOnTop彻底改变你的多任务工作方式 【免费下载链接】AlwaysOnTop Make a Windows application always run on top 项目地址: https://gitcode.com/gh_mirrors/al/AlwaysOnTop 在数字化工作时代,窗口管理已成为提升…...

如何永久保存网络小说:novel-downloader完整指南

如何永久保存网络小说:novel-downloader完整指南 【免费下载链接】novel-downloader 一个可扩展的通用型小说下载器。 项目地址: https://gitcode.com/gh_mirrors/no/novel-downloader 在数字阅读时代,网络小说已成为许多人日常娱乐的重要组成部分…...

轻量级AI聊天界面的技术实现:Ollama Web UI Lite深度解析

轻量级AI聊天界面的技术实现:Ollama Web UI Lite深度解析 【免费下载链接】ollama-webui-lite 项目地址: https://gitcode.com/gh_mirrors/ol/ollama-webui-lite 你是否曾想过,在本地部署AI模型时,如何获得既美观又高效的交互界面&am…...

创业团队如何利用 Taotoken 统一管理多个 AI 模型的 API 调用与成本

创业团队如何利用 Taotoken 统一管理多个 AI 模型的 API 调用与成本 1. 多模型管理的常见挑战 小型创业团队在同时接入多个大模型时,通常会面临几个典型问题。首先是密钥管理分散,不同模型的 API Key 需要分别申请、存储和轮换,增加了安全风…...

如何永久保存微信聊天记录:三步实现完整备份与深度分析

如何永久保存微信聊天记录:三步实现完整备份与深度分析 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeCh…...

从0到1构建奶牛行为智能监控系统(一)

这篇博客记录了我博士期间搭建的一个奶牛行为智能监控系统,系统整体由边缘侧、本地模型部署与云端界面协同的分层架构设计。系统集成了视频监控、行为识别、数据分析以及AI交互等核心功能。 目录 1.系统整体框架 2.硬件录像 3.云服务器界面 4.具体工具展示 &…...

构建企业级知识库问答系统时的大模型接入实践

构建企业级知识库问答系统时的大模型接入实践 1. 企业级知识库问答系统的技术挑战 在企业环境中构建知识库问答系统需要处理大量内部文档,包括技术手册、产品规格、会议纪要和客户支持记录等非结构化数据。这类系统通常面临三个核心挑战:模型选择灵活性…...

68.YOLOv8视频推理优化,30FPS实时检测,代码可复用

摘要 YOLO(You Only Look Once)是目标检测领域最经典的算法之一,以单阶段检测、实时性强、精度高著称。 本文从零开始,系统讲解YOLOv8的核心原理与完整实战流程,涵盖环境搭建、数据准备、模型训练、推理与部署。提供完整可运行代码,并针对常见问题给出避坑指南,帮助读者…...

AI赋能算法设计:借助快马平台生成智能车竞赛弯道模糊控制优化方案

最近在准备智能车竞赛,发现弯道控制一直是影响成绩的关键因素。传统PID控制虽然稳定,但在复杂弯道场景下适应性不够好。于是尝试用模糊控制来优化过弯速度,借助InsCode(快马)平台的AI辅助功能,快速实现了算法原型。 模糊控制设计…...

鸣潮智能剧情助手:5分钟实现后台自动跳过与多账号管理

鸣潮智能剧情助手:5分钟实现后台自动跳过与多账号管理 【免费下载链接】better-wuthering-waves 🌊更好的鸣潮 - 后台自动剧情 项目地址: https://gitcode.com/gh_mirrors/be/better-wuthering-waves 厌倦了《鸣潮》中重复冗长的剧情对话&#xf…...

特朗普孤注一掷,美国要最后的疯狂了!

坏土豆 作品首发于微信号 一个坏土豆陪我的国一起复兴特朗普要孤注一掷了,要带领美国进入最后的疯狂,未来的全球局势将发生巨大变化。5月2日,白宫发了一段堪称史诗级的神奇的视频,全世界都震惊了。视频里面就是特朗普在各种场合疯…...

新手入门CV:手把手教你下载和使用ADE20K数据集(附Python解析代码)

从零玩转ADE20K:计算机视觉新手的实战数据解析指南 推开计算机视觉的大门,ADE20K数据集就像一座藏满宝石的矿洞——但对第一次拿起数据镐的新手来说,如何准确找到矿脉入口往往比挖掘本身更令人头疼。这份指南将化身你的数字矿工手册&#xff…...

semi-utils:摄影师的终极批量水印解决方案

semi-utils:摄影师的终极批量水印解决方案 【免费下载链接】semi-utils 一个批量添加相机机型和拍摄参数的工具,后续「可能」添加其他功能。 项目地址: https://gitcode.com/gh_mirrors/se/semi-utils 还在为一张张手动添加水印而烦恼吗&#xff…...

RSSHub Radar浏览器扩展:5分钟快速上手智能RSS订阅终极指南

RSSHub Radar浏览器扩展:5分钟快速上手智能RSS订阅终极指南 【免费下载链接】RSSHub-Radar 🧡 Browser extension that simplifies finding and subscribing RSS and RSSHub 项目地址: https://gitcode.com/gh_mirrors/rs/RSSHub-Radar 在信息爆炸…...

AISMM认证不是考试,是合规博弈:基于2026 SITS2026真题库的4层证据链构建法

更多请点击: https://intelliparadigm.com 第一章:SITS2026分享:AISMM认证流程 AISMM(AI System Maturity Model)是由SITS2026大会正式发布的AI系统成熟度评估框架,其认证流程强调可验证性、可审计性与工程…...

Linux内核调优笔记:调整tcp_sack与tcp_dsack参数,对高并发服务网络性能的实际影响测试

Linux内核TCP调优实战:SACK与D-SACK对高并发服务的性能影响量化分析 在游戏服务器、实时通信系统等高并发场景中,网络性能的细微差异可能直接导致用户体验的分水岭。当服务器需要处理数万并发连接时,TCP协议栈的默认配置往往成为性能瓶颈的隐…...

从WSDM顶会论文看2024时空预测新趋势:CityCAN、CreST这些模型到底解决了啥实际问题?

从WSDM顶会论文看2024时空预测新趋势:CityCAN、CreST这些模型到底解决了啥实际问题? 清晨6点的城市交通调度中心,大屏上闪烁的红点正在蔓延——这是早高峰拥堵的前兆。但今天的系统给出了不同以往的预警:基于CreST模型的不确定性量…...

OpenCL 3.1 正式发布:强制集成 SPIR-V,多项特性成核心规范要求

【导语:在 OpenCL 3.0 临时版本发布六年后,Khronos Group 正式发布 OpenCL 3.1,将成熟功能整合到核心规范,在性能、开发效率等方面带来诸多提升,且相关扩展功能也即将推出。】强制集成 SPIR-V:消除工具采用…...

在多模型间切换时如何通过用量看板透明管理API成本

在多模型间切换时如何通过用量看板透明管理API成本 1. 用量看板的核心功能 Taotoken平台提供的用量看板是开发者管理API成本的核心工具。该看板以小时为单位更新数据,展示当前账户下所有模型调用的详细记录。主要数据维度包括调用次数、输入输出token总量、各模型…...

2026 年微软 Xbox 新 CEO 宣布:终止 Copilot AI 游戏开发,启动领导层大重组!

2026 年 5 月 5 日,微软 Xbox 部门新任 CEO Asha Sharma 发备忘录,宣布终止 Copilot AI 在游戏领域开发,启动大规模领导层重组,以扭转收入下滑局面。 新官上任三把火 Sharma 今年 2 月接替 Phil Spencer 成为 Xbox CEO。她 2024 年…...

ARM TrustZone与AHB5总线安全机制详解

1. ARM TrustZone安全机制深度解析 在嵌入式系统安全领域,ARM TrustZone技术已经成为硬件级安全方案的行业标准。我第一次接触这项技术是在开发一款金融支付终端时,当时我们需要在同一个Cortex-A53处理器上同时运行支付应用和第三方应用,而Tr…...

5分钟学会Unity游戏去马赛克:六大插件完全指南

5分钟学会Unity游戏去马赛克:六大插件完全指南 【免费下载链接】UniversalUnityDemosaics A collection of universal demosaic BepInEx plugins for games made in Unity3D engine 项目地址: https://gitcode.com/gh_mirrors/un/UniversalUnityDemosaics 你…...

从哈工大论文到你的DSP:ESO谐波抑制算法移植实战,附C代码核心片段与调试心得

ESO谐波抑制算法在永磁同步电机控制中的工程实现 永磁同步电机(PMSM)因其高效率、高功率密度等优势,在工业驱动、电动汽车等领域广泛应用。然而在实际运行中,逆变器非线性特性(如死区效应)和电机本体特性(如磁链谐波)会导致相电流中出现5、7次谐波&#…...

魔兽地图格式转换终极指南:如何用w3x2lni解决地图兼容性问题

魔兽地图格式转换终极指南:如何用w3x2lni解决地图兼容性问题 【免费下载链接】w3x2lni 魔兽地图格式转换工具 项目地址: https://gitcode.com/gh_mirrors/w3/w3x2lni 如果你是一名魔兽争霸III地图开发者,是否经常遇到这样的困扰:精心制…...

通过taotokencli一键配置团队开发环境中的大模型密钥

通过 Taotoken CLI 一键配置团队开发环境中的大模型密钥 1. 安装 Taotoken CLI 工具 Taotoken CLI 提供两种安装方式,适合不同使用场景。对于需要频繁调用 CLI 的团队成员,推荐全局安装: npm install -g taotoken/taotoken对于临时使用或项…...