如何限制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
相关产品推荐
相关产品推荐

