基于LangChain构建可访问自定义数据与互联网的ChatBot故障排查
问题排查与修复方案
核心可能原因
- 多源数据未整合进检索链:ConversationalRetrievalChain默认仅对接单个向量库,若本地文档和互联网搜索结果未合并到同一检索上下文,模型无法获取有效参考信息
- 检索参数设置不合理:向量相似度检索的
k值(召回数量)或相似度阈值过高,导致无相关上下文被召回 - 互联网搜索结果未转换为可检索格式:搜索结果未封装为
Document对象或未传入链的上下文逻辑,仅作为孤立信息存在 - 对话历史格式错误:对话历史未遵循
(用户提问, AI回答)的元组列表格式,干扰检索逻辑
具体修复步骤
1. 合并本地文档与互联网搜索结果的检索上下文
将互联网搜索结果转换为标准Document对象,与本地文档片段合并后构建统一向量库,确保检索链能同时获取两类信息:
from langchain.schema import Document from langchain.vectorstores import Chroma from langchain.embeddings import OpenAIEmbeddings # 假设search_results是互联网搜索返回的文本列表 web_docs = [Document(page_content=res, metadata={"source": "web"}) for res in search_results] # 合并本地文档与网页文档 all_docs = local_processed_docs + web_docs # 构建统一向量库 vectorstore = Chroma.from_documents(all_docs, embedding=OpenAIEmbeddings())
2. 调整检索参数
降低相似度阈值或增加召回数量,确保有足够相关内容被返回:
# 调整检索参数,k为召回数量,score_threshold为相似度阈值 retriever = vectorstore.as_retriever(search_kwargs={"k": 5, "score_threshold": 0.5}) # 初始化ConversationalRetrievalChain时使用调整后的retriever chain = ConversationalRetrievalChain.from_llm( llm=ChatOpenAI(temperature=0), retriever=retriever, return_source_documents=True )
3. 确保互联网搜索结果实时传入上下文
若采用实时搜索而非预存向量库,需自定义QA链,将搜索结果作为额外上下文传入LLM:
from langchain.chains import ConversationalRetrievalChain, LLMChain from langchain.chains.question_answering import load_qa_chain # 自定义包含互联网结果的prompt与QA链 def build_custom_qa_chain(llm): base_chain = load_qa_chain(llm, chain_type="stuff") # 修改prompt,加入互联网搜索结果字段 updated_prompt = base_chain.prompt.copy() updated_prompt.template = """结合以下本地文档和互联网搜索结果回答问题: 本地文档内容: {context} 互联网搜索结果: {web_content} 问题:{question} 回答:""" return LLMChain(llm=llm, prompt=updated_prompt) # 初始化自定义检索链 chain = ConversationalRetrievalChain( retriever=vectorstore.as_retriever(), combine_docs_chain=build_custom_qa_chain(ChatOpenAI(temperature=0)), return_source_documents=True ) # 调用时传入互联网搜索结果 response = chain({ "question": user_question, "chat_history": chat_history, "web_content": "\n".join(search_results) })
4. 校准对话历史格式
确保对话历史是(用户提问, AI回答)的元组列表,避免格式错误干扰检索:
# 正确的对话历史格式示例 chat_history = [ ("本地文档里有Python相关内容吗?", "有的,包含Python基础语法教程。"), ("互联网上Python最新版本是多少?", "当前Python最新稳定版是3.12.4。") ]
验证步骤
- 调用
retriever.get_relevant_documents(user_question),检查返回的文档是否包含本地和互联网的相关内容 - 打印
response["source_documents"],确认上下文已正确传入LLM - 简化prompt,直接传入本地文档和搜索结果,测试LLM是否能生成有效回答
内容的提问来源于stack exchange,提问作者Zaesar
相关产品推荐
相关产品推荐

