如何为基于ConversationBufferMemory的CRC PDF聊天机器人配置系统指令?
解决方案
问题出在你把海盗风格指令加到了生成独立问题的Prompt里,而不是最终回答的生成模板。ConversationalRetrievalChain的PROMPT参数是用来将对话历史+当前问题转化为独立检索问题的,不会影响最终回答的语气风格。
以下是两种正确实现方式:
方法1:修改CombineDocsChain的Prompt(适用于普通LLM)
直接针对最终回答环节设置带海盗风格的模板:
from langchain.prompts import PromptTemplate from langchain.chains import ConversationalRetrievalChain from langchain.memory import ConversationBufferMemory from langchain.llms import OpenAI # 定义最终回答的海盗风格模板 answer_template = """你是一个海盗风格的助手,要用海盗的语气回答问题,每句结尾都要加'Ay Ay Matey'。 参考以下对话历史和检索到的文档内容来回答: 对话历史:{chat_history} 文档内容:{context} 用户问题:{question} 回答:""" ANSWER_PROMPT = PromptTemplate( input_variables=["chat_history", "context", "question"], template=answer_template ) memory = ConversationBufferMemory(memory_key='chat_history', return_messages=True, output_key='answer') # 通过combine_docs_chain_kwargs传入自定义回答模板 qa = ConversationalRetrievalChain.from_llm( OpenAI(temperature=0.7), # 调高温度让语气更生动 vectorstore.as_retriever(), memory=memory, return_source_documents=True, combine_docs_chain_kwargs={"prompt": ANSWER_PROMPT} )
方法2:使用ChatPromptTemplate结合SystemMessage(适用于ChatLLM,如gpt-3.5-turbo)
如果用Chat模型,用SystemMessage定义角色更规范:
from langchain.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate from langchain.chains import ConversationalRetrievalChain from langchain.memory import ConversationBufferMemory from langchain.chat_models import ChatOpenAI # 系统消息定义海盗角色 system_template = """你是一个海盗风格的助手,要用海盗的语气回答问题,每句结尾都要加'Ay Ay Matey'。 你会根据提供的对话历史和文档内容来回答用户的问题。""" system_message_prompt = SystemMessagePromptTemplate.from_template(system_template) # 人类消息模板 human_template = """参考对话历史:{chat_history} 参考文档内容:{context} 用户问题:{question}""" human_message_prompt = HumanMessagePromptTemplate.from_template(human_template) # 组合聊天模板 chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt]) memory = ConversationBufferMemory(memory_key='chat_history', return_messages=True, output_key='answer') qa = ConversationalRetrievalChain.from_llm( ChatOpenAI(temperature=0.7), vectorstore.as_retriever(), memory=memory, return_source_documents=True, combine_docs_chain_kwargs={"prompt": chat_prompt} )
关键说明
- ConversationalRetrievalChain分为两个核心环节:生成独立检索问题和结合文档+历史生成最终回答,你之前的模板只影响第一个环节,所以无效。
- 通过
combine_docs_chain_kwargs参数将自定义模板传入回答生成环节,才能让助手用海盗风格说话。 - 若使用记忆功能返回消息对象(
return_messages=True),确保模板中的变量名和memory的memory_key一致。
内容的提问来源于stack exchange,提问作者Hudson Etkin
相关产品推荐
相关产品推荐

