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

如何限制LangChain文档问答机器人仅基于文档内容作答

如何限制LangChain聊天机器人仅基于PDF文档内容回答问题

要实现机器人仅依托上传的PDF文档内容作答、无相关内容时回复“我不知道”,可以从检索阈值控制、提示词约束、前置结果检查三个层面入手,以下是结合你现有代码的具体修改方案:


1. 调整检索器的相似度阈值

通过给FAISS检索器设置分数阈值,只有当向量库中存在与用户问题相似度足够高的文档片段时,才会将这些片段作为上下文传给LLM;若没有符合阈值的结果,则不传递上下文,配合后续提示词约束即可触发“我不知道”的回复。

修改检索器初始化代码:

# 调整检索器参数,score_threshold可根据实际情况在0.6-0.8之间调整
retriever = vector_store.as_retriever(search_kwargs={"k": 3, "score_threshold": 0.7})
chat = ConversationalRetrievalChain.from_llm(
    llm=llm,
    retriever=retriever,
    memory=memory
)

2. 自定义强制约束的提示词

默认的ConversationalRetrievalChain提示词没有明确限制LLM必须仅使用上下文回答,因此需要自定义提示词,明确告知机器人回答规则。

先导入PromptTemplate,再定义约束性提示词:

from langchain.prompts import PromptTemplate

# 自定义提示词,明确限制回答规则
custom_prompt = PromptTemplate(
    input_variables=["chat_history", "question", "context"],
    template="""你是一个只能基于提供的参考文档内容回答问题的助手。
聊天历史:{chat_history}
用户问题:{question}
参考文档内容:{context}

请严格遵守以下规则回答:
1. 只能使用上面提供的参考文档内容作答,绝对不能使用你自身的知识储备。
2. 如果参考文档中没有相关内容,或者无法从文档中找到对应答案,请直接回复“我不知道”,不得编造任何内容。
3. 回答需简洁准确,贴合用户问题需求。"""
)

# 创建链时传入自定义提示词
chat = ConversationalRetrievalChain.from_llm(
    llm=llm,
    retriever=vector_store.as_retriever(search_kwargs={"k": 3, "score_threshold": 0.7}),
    memory=memory,
    combine_docs_chain_kwargs={"prompt": custom_prompt}
)

3. 前置检查检索结果,直接拦截无相关内容的请求

在调用LLM之前,先手动获取检索到的文档,若没有符合要求的结果,直接返回“我不知道”,既节省API调用成本,也能避免LLM的无意义输出。

修改用户提问后的处理逻辑:

if prompt := st.chat_input("State your question"):
    st.session_state.messages.append({"role": "user", "content": prompt})
    with st.chat_message("user"):
        st.markdown(prompt)
    
    # 前置检查检索结果
    retriever = vector_store.as_retriever(search_kwargs={"k": 3, "score_threshold": 0.7})
    retrieved_docs = retriever.get_relevant_documents(prompt)
    
    if not retrieved_docs:
        full_response = "我不知道"
    else:
        result = chat({
            "question": prompt, 
            "chat_history": [(message["role"], message["content"]) for message in st.session_state.messages]
        })
        full_response = result["answer"]
    
    with st.chat_message("assistant"):
        st.markdown(full_response)
    st.session_state.messages.append({"role": "assistant", "content": full_response})

注意事项

  • 相似度阈值score_threshold需根据你的PDF内容和使用的嵌入模型调整,比如使用OpenAI的text-embedding-ada-002时,阈值建议在0.6-0.8之间测试最优值。
  • 保持temperature=0(你已设置),可降低LLM的随机性,使其更严格遵守提示词规则。
  • 若仍出现LLM编造内容的情况,可进一步强化提示词中的约束语句,或调整检索阈值至更高水平。

内容的提问来源于stack exchange,提问作者starskiin3d

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 06:36:03