LangChain.js中ConversationalRetrievalQAChain自定义lang变量报错问题
解决LangChain.js中ConversationalRetrievalQAChain自定义prompt变量的问题
问题出在ConversationalRetrievalQAChain默认只认question和chat_history这两个输入变量,你在prompt里加了lang但没告诉Chain这个变量是合法输入,所以才会报「缺少输入值」的错误。按下面步骤改就能解决:
1. 用PromptTemplate定义带lang变量的模板
别直接传字符串prompt,用PromptTemplate明确指定所有输入变量,包括lang:
import { PromptTemplate } from "langchain/prompts"; // 模板里包含lang变量,同时声明所有输入变量 const customPrompt = PromptTemplate.fromTemplate( "请结合以下聊天历史,用{lang}回答用户问题:\n聊天历史:{chat_history}\n用户问题:{question}", { inputVariables: ["question", "chat_history", "lang"] } );
2. 创建Chain时关联自定义模板并配置输入变量
需要把自定义模板传给Chain内部的QA逻辑,同时显式声明输入变量包含lang:
import { ConversationalRetrievalQAChain, RetrievalQAChain } from "langchain/chains"; import { ChatOpenAI } from "langchain/chat_models/openai"; import { MemoryVectorStore } from "langchain/vectorstores/memory"; import { OpenAIEmbeddings } from "langchain/embeddings/openai"; // 初始化向量存储(替换成你实际的向量存储) const vectorStore = new MemoryVectorStore(new OpenAIEmbeddings()); const llm = new ChatOpenAI({ temperature: 0 }); // 先创建带自定义prompt的QAChain const qaChain = RetrievalQAChain.fromLLM(llm, vectorStore.asRetriever(), { prompt: customPrompt, }); // 再创建ConversationalRetrievalQAChain,指定输入变量 const conversationalChain = ConversationalRetrievalQAChain.fromLLM( llm, vectorStore.asRetriever(), { qaChain: qaChain, inputKeys: ["question", "chat_history", "lang"], } );
3. 调用Chain时传入lang参数
调用时把lang和其他参数一起传进去就行:
const response = await conversationalChain.call({ question: "LangChain主要用来做什么?", chat_history: "", // 首次调用可以传空字符串 lang: "西班牙语", }); console.log(response.text);
这样就能实现动态传入语言参数,不会再报缺失变量的错误了。
内容的提问来源于stack exchange,提问作者MENNY
相关产品推荐
相关产品推荐

