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

基于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。")
]

验证步骤

  1. 调用retriever.get_relevant_documents(user_question),检查返回的文档是否包含本地和互联网的相关内容
  2. 打印response["source_documents"],确认上下文已正确传入LLM
  3. 简化prompt,直接传入本地文档和搜索结果,测试LLM是否能生成有效回答

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 05:53:16