You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 20:23:14