Orca-mini-3b模型RetrievalQA上下文失效及对话历史添加问题
问题分析与解决方案
问题背景
使用orca-mini-3b.ggmlv3.q4_0模型时,在RetrievalQA.from_chain_type中自定义了PromptTemplate,但发送查询“我的名字是什么?”时,模型未按照模板要求称呼我为“Bob”,反而输出无关内容:
项目管理员 | 将担任项目自维护角色的用户。该用户可访问项目所有部分,能执行创建资源、更新配置、删除资源等操作。项目名称 | OpenShift上的项目名称,必须为小写,仅包含字母和数字,存在黑名单禁止使用某些字符。
同时需要为机器人添加对话历史上下文功能。
一、提示词未生效的原因
- 模板未包含用户查询占位符:自定义的
prompt_template仅包含{context}变量,没有将用户的查询内容传递给模型。RetrievalQA的stuff链需要明确将用户问题纳入输入,否则模型无法理解要基于“名字是Bob”的指令回答问题,只能从检索到的数据库上下文提取内容,而数据库中无Bob相关信息,因此输出无关内容。 - 指令与回答任务未绑定:模板中的指令“My name is Bob, you must call me Bob”没有和“回答用户当前问题”的任务关联,模型无法识别这是约束所有回答的规则。
二、修复提示词的代码调整
修改提示模板,加入用户查询占位符,并明确指令与回答任务的关联:
prompt_template = """ 你必须称呼我为Bob,基于以下上下文回答我的问题: {context} 我的问题是:{question} """ prompt = PromptTemplate( input_variables=["context", "question"], # 新增question变量 template=prompt_template )
调整后,模型会同时接收指令、检索上下文和用户问题,才能按照要求生成正确回答。
三、添加对话历史上下文的实现
使用LangChain的ConversationBufferMemory存储对话历史,并将其与RetrievalQA结合,让模型能参考之前的对话内容。完整核心调整代码如下:
# 新增导入对话内存模块 from langchain.memory import ConversationBufferMemory # ... 其他原有代码(嵌入模型、向量库、LLM初始化等)保持不变 ... # 修改提示模板,加入对话历史占位符 prompt_template = """ 你必须称呼我为Bob,结合之前的对话历史和以下上下文回答我的问题: 对话历史:{chat_history} 上下文:{context} 我的问题是:{question} """ prompt = PromptTemplate( input_variables=["chat_history", "context", "question"], template=prompt_template ) # 创建对话内存,指定存储键和输入键 memory = ConversationBufferMemory( memory_key="chat_history", input_key="question" ) # 配置链参数,加入内存 chain_type_kwargs = {"prompt": prompt, "memory": memory} qa = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=retriever, chain_type_kwargs=chain_type_kwargs, return_source_documents=False ) # 交互逻辑调整,传入question参数 print("start") while True: query = input("\n请输入查询内容: ") if query == "exit": break if query.strip() == "": continue start = time.time() # 以字典形式传入question,确保内存捕获对话内容 res = qa({"question": query}) answer = res['result'] end = time.time() print(f"\n> 回答(耗时 {round(end - start, 2)} 秒):") print(answer)
关键说明
ConversationBufferMemory会自动存储每一轮的问答内容,作为chat_history变量传入提示模板。- 必须在模板中添加
{chat_history}占位符,让模型读取历史对话信息。 - 调用链时需以字典形式传入
question参数,确保内存能正确捕获用户输入。
内容的提问来源于stack exchange,提问作者elodie girot
相关产品推荐
相关产品推荐

