TypeScript中LangChain调用Pinecone后实现响应流式输出方案咨询
实现LangChain + Pinecone的流式响应输出
原代码中的VectorDBQAChain通过call()方法一次性返回完整结果,要实现流式输出到控制台,需要调整LLM配置并改用支持流式的链结构,具体方案如下:
关键调整点
- 开启OpenAI模型的流式返回模式,设置回调函数实时输出token
- 使用
RetrievalQA链替代VectorDBQAChain,该链支持配合流式LLM输出
修改后的完整代码
import { PineconeClient } from "@pinecone-database/pinecone"; import { RetrievalQAChain } from "langchain/chains"; import { PineconeStore } from "langchain/vectorstores/pinecone"; import { OpenAIEmbeddings } from "langchain/embeddings/openai"; import { OpenAI } from "langchain/llms/openai"; const embeddings = new OpenAIEmbeddings({ openAIApiKey: process.env.OPENAI_API_KEY, }); const pinecone = new PineconeClient(); // 配置支持流式的OpenAI实例 const model = new OpenAI({ openAIApiKey: process.env.OPENAI_API_KEY, streaming: true, // 开启流式返回 onToken: (token) => process.stdout.write(token), // 实时输出每个token到控制台 }); async function main(namespaceID: string) { await pinecone.init({ apiKey: process.env.PINECONE_API_KEY, environment: "us-west4-gcp-free", }); const pineconeIndex = pinecone.Index("index-test"); const vectorStore = await PineconeStore.fromExistingIndex( embeddings, { pineconeIndex } ); vectorStore.namespace = namespaceID; // 创建RetrievalQA链,替代原VectorDBQAChain const chain = RetrievalQAChain.fromLLM(model, vectorStore.asRetriever(5), { returnSourceDocuments: true, verbose: true, }); // 调用stream方法获取流式响应 const stream = await chain.stream({ query: "What is the status of Project X" }); // 处理流结束后的逻辑(可选) stream.on("end", () => { console.log("\n--- 响应结束 ---"); // 若需要获取源文档,可通过chain.call()单独获取,因为stream方法默认不返回源文档 // 若同时需要流式输出和源文档,可先调用chain.call()获取源文档,再调用stream输出内容 }); } main("TEST_NAMESPACE");
补充说明
- 若需要同时获取流式响应和源文档,可以分两步:先调用
chain.call()获取源文档,再调用stream()输出内容,因为stream()方法默认只返回生成的文本流。 process.stdout.write(token)会在控制台实时拼接输出每个token,避免console.log()带来的换行问题。
内容的提问来源于stack exchange,提问作者Kancha
相关产品推荐
相关产品推荐

