如何将LangChain向量库检索结果与完整文档一同传入OpenAI?
LangChain完全支持将指定完整任务文档与向量库检索结果一起传给OpenAI的需求,下面是两种适合新手的修改方案,基于你提供的代码调整:
方案一:自定义提示模板,整合固定文档与检索结果
这种方式直接在prompt里加入固定任务文档的内容,让LLM同时参考固定文档和检索到的内容。
读取指定的完整任务文档
先把你的任务文档内容读入变量:// 替换为你的任务文档路径 const taskDocContent = await fs.readFileSync('./task-document.txt', 'utf8');自定义RetrievalQAChain的提示模板
创建包含固定文档占位符的prompt,让链同时接收固定文档、检索内容和用户问题:const customPrompt = new PromptTemplate({ template: `请结合以下固定任务文档和检索到的相关内容回答用户问题:
固定任务文档:
{task_doc}
检索到的相关文档:
{context}
用户问题:{question}`,
inputVariables: ['task_doc', 'context', 'question'],
});
3. **创建带自定义prompt的RetrievalQAChain** 在创建链时传入自定义的prompt: ```javascript const chain = RetrievalQAChain.fromLLM(model, vectorStore.asRetriever(), { prompt: customPrompt, });
- 调用链时传入固定文档内容
注意把原来的query参数名改成question避免和prompt变量混淆:// userPrompt是你的用户问题 const chatGptRes = await chain.call({ question: userPrompt, task_doc: taskDocContent, });
方案二:合并固定文档与检索结果后传入链
这种方式先获取向量库的检索结果,再把固定文档和检索结果合并后一起传给LLM,灵活性更高。
获取向量库的检索结果
const retriever = vectorStore.asRetriever(); const retrievedDocs = await retriever.getRelevantDocuments(userPrompt);合并固定文档与检索结果
把固定文档包装成LangChain的Document对象,和检索结果合并:const taskDoc = new Document({ pageContent: taskDocContent }); const combinedDocs = [taskDoc, ...retrievedDocs];创建文档合并链并调用
使用StuffDocumentsChain把所有文档内容整合到prompt中,再传给LLM:const llmChain = new LLMChain({ llm: model, prompt: new PromptTemplate({ template: `请结合以下所有文档内容回答用户问题:
{context}
用户问题:{question}`,
inputVariables: ['context', 'question'],
})
});
const combineChain = new StuffDocumentsChain({
llmChain: llmChain,
documentVariableName: 'context',
});
const result = await combineChain.call({
input_documents: combinedDocs,
question: userPrompt,
});
## 注意事项 - 留意OpenAI的token限制,如果固定文档过长,可能需要使用支持更长上下文的模型(如gpt-3.5-turbo-16k、gpt-4),或者对超长文档做必要的分割处理(但如果你需要完整文档,优先选长上下文模型)。 - 变量名尽量清晰,避免出现同名变量导致的逻辑混乱。 内容的提问来源于stack exchange,提问作者Ben Shekhtman

