How can I stream a response from LangChain‘s OpenAI using Flask API?

题意:怎样在 Flask API 中使用 LangChain 的 OpenAI 模型流式传输响应

问题背景:

I am using Python Flask app for chat over data. In the console I am getting streamable response directly from the OpenAI since I can enable streming with a flag streaming=True.

我正在使用 Python Flask 应用程序进行数据聊天。在控制台中,我直接从 OpenAI 获取流式响应,因为我可以通过设置 `streaming=True` 来启用流式传输。

The problem is, that I can't "forward" the stream or "show" the stream than in my API call.

问题是,我无法在 API 调用中“转发”或“显示”这个流式响应。

Code for the processing OpenAI and chain is:

处理 OpenAI 和链的代码如下:

def askQuestion(self, collection_id, question):collection_name = "collection-" + str(collection_id)self.llm = ChatOpenAI(model_name=self.model_name, temperature=self.temperature, openai_api_key=os.environ.get('OPENAI_API_KEY'), streaming=True, callback_manager=CallbackManager([StreamingStdOutCallbackHandler()]))self.memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True,  output_key='answer')chroma_Vectorstore = Chroma(collection_name=collection_name, embedding_function=self.embeddingsOpenAi, client=self.chroma_client)self.chain = ConversationalRetrievalChain.from_llm(self.llm, chroma_Vectorstore.as_retriever(similarity_search_with_score=True),return_source_documents=True,verbose=VERBOSE, memory=self.memory)result = self.chain({"question": question})res_dict = {"answer": result["answer"],}res_dict["source_documents"] = []for source in result["source_documents"]:res_dict["source_documents"].append({"page_content": source.page_content,"metadata":  source.metadata})return res_dict

and the API route code:        以及 API 路由的代码:

@app.route("/collection/<int:collection_id>/ask_question", methods=["POST"])
def ask_question(collection_id):question = request.form["question"]# response_generator = document_thread.askQuestion(collection_id, question)# return jsonify(response_generator)def stream(question):completion = document_thread.askQuestion(collection_id, question)for line in completion['answer']:yield line

I am testing my endpoint with curl and I am passing flag -N to curl, so I should get the streamable response, if it is possible.

我正在使用 curl 测试我的端点,并传递了 `-N` 标志,因此如果可能的话,我应该能得到流式响应。

When I make API call first the endpoint is waiting to process the data (I can see in my terminal in VS code the streamable answer) and when finished, I get everything displayed in one go.

当我发起 API 调用时,端点首先等待处理数据(我可以在 VS Code 的终端中看到流式的回答),处理完成后,所有内容一次性显示出来。

问题解决:

With the usage of threading and callback we can have a streaming response from flask API.

通过使用 `threading` 和 `callback`,我们可以在 Flask API 中实现流式响应。

In flask API, you may create a queue to register tokens through langchain's callback.

在 Flask API 中,可以创建一个队列,通过 LangChain 的回调函数来注册令牌。

class StreamingHandler(BaseCallbackHandler):...def on_llm_new_token(self, token: str, **kwargs) -> None:self.queue.put(token)

You may get tokens from the same queue in your flask route.

你可以在 Flask 路由中从同一个队列获取令牌。

from flask import Response, stream_with_context
import threading @app.route(....):
def stream_output():q = Queue()def generate(rq: Queue):...# add your logic to prevent while loop# to run indefinitely  while( ...):yield rq.get()callback_fn = StreamingHandler(q)threading.Thread(target= askQuestion, args=(collection_id, question, callback_fn))return Response(stream_with_context(generate(q))

In your langchain's ChatOpenAI add the above custom callback StreamingHandler.

在你的 LangChain 的 `ChatOpenAI` 中添加上述自定义回调 `StreamingHandler`。

self.llm = ChatOpenAI(model_name=self.model_name, temperature=self.temperature, openai_api_key=os.environ.get('OPENAI_API_KEY'), streaming=True, callback=[callback_fn,]
)

For reference:        参考如下

  • https://python.langchain.com/en/latest/modules/callbacks/getting_started.html#creating-a-custom-handler
  • Streaming Contents — Flask Documentation (2.3.x)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/146477.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

JZ2440开发板——S3C2440的UART

以下内容源于韦东山课程的学习与整理&#xff0c;如有侵权请告知删除。 一、UART硬件简介 UART&#xff0c;全称是“Universal Asynchronous Receiver Transmitter”&#xff0c;即“通用异步收发器”&#xff0c;也就是我们日常说的“串口”。 它在嵌入式中用途非常广泛&…

一文彻底让你搞懂轨迹规划(总结)

机器人在运行中不可避免的会进行运动&#xff0c;那么就会产生出轨迹规划的概念。 轨迹规划的特点&#xff1a;用一定的函数形式表示控制量&#xff08;位置&#xff0c;速度&#xff0c;加速度&#xff09;的控制律&#xff0c;根据约束或最优目标&#xff0c;求取控制控制参…

STM32固件库介绍

CMSIS标准介绍 早期的标准库叫STD 不管是hal库还是标准库都是封好库然后给我们使用的 标准库可能兼容不了F1 F4 F7 但是用HAL库就能够兼容那么多 我们可以用cubex来配置一个工程 固件库文件夹介绍 CMSIS的启动文件&#xff0c;RTOS实时操作系统文件 外设驱动文件 Inc外设的头…

Java面试篇基础部分-ReentrantLock详解

ReentrantLock 是继承了Lock接口,并且实现了再接口中定义的方法,属于一个可重入的独占锁。ReentrantLock 通过自定义队列同步器(Abstract Queued Synchroinzed,AQS)来实现锁的获取与释放。   那么什么是独占锁呢?独占锁就是指这个锁在同一时刻只能被一个线程所获取到,…

《关键跃升》读书笔记9

最后一章 《协作》部分 如果你只交代员⼯⼀件事还好&#xff0c;做到靠谱并不难&#xff0c;但如果你交代他3件 事、5件事、8件事甚⾄20件事&#xff0c;这就会带来两个问题。 第⼀&#xff0c;从数量上说&#xff0c;根据⽶勒法则&#xff0c;⼀个⼈的⼤脑最多能同时记住⼤ 约…

网络资源模板--Android Studio 通讯录App

目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 一、项目演示 网络资源模板--基于Android studio 通讯录 二、项目测试环境 三、项目详情 首页 MainActivity 类是一个 Android 地址簿应用的核心部分&#xff0c;负责管理联系人列表的显示、搜索和添…

Java | Leetcode Java题解之第421题数组中的两个数的最大异或值

题目&#xff1a; 题解&#xff1a; class Solution {// 字典树的根节点Trie root new Trie();// 最高位的二进制位编号为 30static final int HIGH_BIT 30;public int findMaximumXOR(int[] nums) {int n nums.length;int x 0;for (int i 1; i < n; i) {// 将 nums[i…

Element Plus 中Input输入框

通过鼠标或键盘输入字符 input为受控组件&#xff0c;他总会显示Vue绑定值&#xff0c;正常情况下&#xff0c;input的输入事件会正常被响应&#xff0c;他的处理程序应该更新组件的绑定值&#xff08;或使用v-model&#xff09;。否则&#xff0c;输入框的值将不会改变 不支…

Nginx配置虚拟主机

基于域名的虚拟主机 修改配置 进入nginx里的conf目录 修改nginx配置文件nginx.conf vi nginx.conf worker_processes auto;(自动识别CPU数) worker_rlimit_nofile 20480;&#xff08;指定 worker 子进程可以打开的最大文件句柄数&#xff0c;默认为1024&#xff09; use …

【有啥问啥】摄像头成像质量量化标准解读与测试方法

摄像头成像质量量化标准解读与测试方法 在自动驾驶和智能驾驶舱领域&#xff0c;摄像头是关键的感知设备&#xff0c;直接关系到系统的环境感知能力。为确保摄像头在实际应用中表现出色&#xff0c;需明确了解其成像质量标准和测试方法。本文将围绕成像质量的核心指标、测试方…

103.运行tomcat的Tomcatstartup.bat时,终端打印的中文显示为乱码

目录 原因 解决方法 原因 当运行Tomcat的Tomcatstartup.bat时&#xff0c;如果终端中文显示为乱码&#xff0c;这通常是因为Tomcat使用的日志输出编码与Windows命令行默认的编码不匹配。 解决方法 针对这一问题&#xff0c;你可以尝试以下步骤来解决&#…

2024年9月第3周AI资讯

阅读时间&#xff1a;3-4min 更新时间&#xff1a;2024.9.16-2024.9.20 目录 OpenAI 推出 o1&#xff1a;一种新的“推理”人工智能模型 微软为 Excel 和 Word 添加了更快的 Copilot World Labs 利用 AI 创建 3D 世界 AI 利用文本创建开放世界视频游戏 OpenAI 推出 o1&#x…

【源码+文档+调试讲解】微信小程序的投票系统

摘 要 伴随着我国社会的发展&#xff0c;人民生活质量日益提高。于是对各种需求进行规范而严格是十分有必要的&#xff0c;所以许许多多的微信小程序应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套微信小程序的投票系统&#xff0c;进行作品信…

Vue3DevTools7是如何在vscode定位指定文件位置的?

Vue3DevTools7是如何在vscode定位指定文件位置的&#xff1f; 背景 今天在使用vue脚手架创建项目的时候&#xff0c;并发现一个新的&#xff08;实验中的新功能&#xff09;&#xff0c;可以直接在我们的项目中集成Vue DevTools插件&#xff0c;浏览器插件devtools即将成为历史…

JAVA毕业设计178—基于Java+Springboot+vue的智能家具管理系统(源代码+数据库+万字论文)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue的智能家具管理系统(源代码数据库万字论文)178 一、系统介绍 本项目前后端分离(可以改为ssm版本)&#xff0c;分为用户、管理员两种角色 1、用户&#xff1…

带你0到1之QT编程:十四、QV/HBoxLayout和QStatckedWidget双剑合璧

此为QT编程的第十四谈&#xff01;关注我&#xff0c;带你快速学习QT编程的学习路线&#xff01; 每一篇的技术点都是很很重要&#xff01;很重要&#xff01;很重要&#xff01;但不冗余&#xff01; 我们通常采取总-分-总和生活化的讲解方式来阐述一个知识点&#xff01; …

如何写一个自动化Linux脚本去进行等保测试--引言

#我的师兄喜欢给我的休闲实习生活加活&#xff0c;说是让我在实习期间写一个自动化脚本去进行等保测试。呵呵哒。 怎么办呢&#xff0c;师兄的指令得完成&#xff0c;师兄说让我使用Python完成任务。 设想如下&#xff1a; 1、将Linux指令嵌入到python脚本中 2、调试跑通 …

【Day02-JS+Vue+Ajax】

1. JS介绍 在前面的课程中&#xff0c;我们已经学习了HTML、CSS的基础内容&#xff0c;我们知道HTML负责网页的结构&#xff0c;而CSS负责的是网页的表现。 而要想让网页具备一定的交互效果&#xff0c;具有一定的动作行为&#xff0c;还得通过JavaScript来实现。那今天,我们就…

如何用 Web 界面 AI 工作流提升科研写作效率?

&#xff08;注&#xff1a;本文为小报童精选文章。已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费&#xff09; 更易用&#xff0c;更高效。 痛点 作为一名研究生导师&#xff0c;我深深体会到学生在撰写论文时拖延症的严重程度。他们往往打开一个空白的 Word 文档&…

CSS01-语法规范、基础选择器

一、CSS语法规范 示例&#xff1a; 二、CSS的基础选择器 选择器(选择符)就是根据不同需求把不同的标签选出来这就是选择器的作用。 简单来说&#xff0c;就是选择标签用的。 选择器的分类&#xff1a; 1、标签选择器 2、类选择器&#xff08;开发最常用&#xff09; 长字符命名…