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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 21:44:56