如何为RetrievalQA.from_chain_type添加记忆,为ConversationalRetrievalChain添加自定义提示词?
解决方案
方法一:给ConversationalRetrievalChain配置自定义提示词
ConversationalRetrievalChain本身支持自定义prompt,你可以通过构造CombineDocumentsChain时传入自定义模板,再将这个链整合进ConversationalRetrievalChain。示例代码如下:
from langchain.chains import ConversationalRetrievalChain from langchain.chains.question_answering import load_qa_chain from langchain.prompts import PromptTemplate from langchain.memory import ConversationBufferMemory # 自定义提示词模板 custom_prompt = PromptTemplate( template="""结合以下对话历史和文档片段,回答用户问题: 对话历史:{chat_history} 文档片段:{context} 用户问题:{question} 请严格基于给定内容回答,不要编造信息。""", input_variables=["chat_history", "context", "question"] ) # 加载QA链并传入自定义prompt qa_chain = load_qa_chain(llm, chain_type="stuff", prompt=custom_prompt) # 初始化记忆组件 memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True) # 创建带自定义prompt和记忆的对话链 chain = ConversationalRetrievalChain( retriever=your_vectorstore_retriever, combine_docs_chain=qa_chain, memory=memory ) # 使用示例 response = chain({"question": "文档中关于XX的具体规则是什么?"}) print(response["answer"])
方法二:给RetrievalQA添加记忆组件
RetrievalQA没有内置记忆,但可以通过手动整合记忆组件实现需求。示例代码如下:
from langchain.chains import RetrievalQA from langchain.memory import ConversationBufferMemory from langchain.prompts import PromptTemplate # 自定义检索问答提示词 qa_prompt = PromptTemplate( template="""根据以下文档内容回答问题:{context} 问题:{question} 回答:""", input_variables=["context", "question"] ) # 初始化RetrievalQA retrieval_qa = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=your_vectorstore_retriever, chain_type_kwargs={"prompt": qa_prompt} ) # 初始化记忆组件 memory = ConversationBufferMemory() # 自定义带记忆的问答逻辑 def chat_with_memory(question): # 读取对话历史 chat_history = memory.load_memory_variables({})["history"] # 调用检索问答链 qa_result = retrieval_qa({"query": f"对话历史:{chat_history}\n用户问题:{question}"}) # 更新记忆 memory.save_context({"input": question}, {"output": qa_result["result"]}) return qa_result["result"] # 使用示例 print(chat_with_memory("文档的核心结论是什么?")) print(chat_with_memory("刚才提到的结论有哪些数据支撑?"))
这两种方案都能同时满足基于文档对话、记忆功能和自定义提示词的需求,可根据实际场景选择适配的实现方式。
内容的提问来源于stack exchange,提问作者Hudson Etkin
相关产品推荐
相关产品推荐

