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

ConversationalRetrievalChain与LLMChain选型及相似性搜索等问题求助

问题解决方案

一、相似性搜索InvalidRequestError: '$.input' is invalid的原因及修复

  • 报错根源是Streamlit环境下,向量数据库搜索请求的输入格式不合法:
    • 要么是传给similarity_search的查询参数不是纯字符串(比如误传了Streamlit组件对象、未处理的状态变量)
    • 要么是向量数据库客户端在Streamlit会话中重复初始化,导致配置参数(如API密钥)丢失,请求体格式被破坏
  • 修复操作:
    1. 强制转换查询参数为字符串:docs = vector_store.similarity_search(str(user_query)),确保输入符合向量数据库要求
    2. 用st.cache_resource缓存向量数据库客户端实例,或者把初始化代码放在if __name__ == "__main__":块内,避免重复初始化导致的配置混乱

二、ConversationalRetrievalChain自定义Prompt的ValidationError修复

  • 报错提示context未在输入变量中,是因为你自定义的Prompt没声明context变量,或者输入变量列表遗漏了它——ConversationalRetrievalChain的默认逻辑会自动传入context(检索到的文档内容),必须在Prompt中对应接收
  • 正确配置自定义模板:
    1. 自定义Prompt必须包含context、question,如果需要对话历史还要加chat_history,示例:
      from langchain.prompts import PromptTemplate
      
      custom_prompt = PromptTemplate(
          input_variables=["context", "question", "chat_history"],
          template="""基于以下上下文回答问题,若无法从上下文找到确定答案,直接回复"我无法回答这个问题"。
      对话历史:{chat_history}
      上下文:{context}
      问题:{question}
      回答:"""
      )
      
    2. 初始化Chain时,把自定义Prompt传入load_qa_chain的prompt参数,再将这个qa链传给ConversationalRetrievalChain:
      from langchain.chains import ConversationalRetrievalChain
      from langchain.chains.question_answering import load_qa_chain
      
      qa_chain = load_qa_chain(llm, chain_type="stuff", prompt=custom_prompt)
      conversational_chain = ConversationalRetrievalChain(
          retriever=vector_store.as_retriever(),
          combine_docs_chain=qa_chain,
          return_source_documents=True
      )
      

三、实现“LLM不确定时不回答”的Chain选择

  • 优先用ConversationalRetrievalChain,它原生支持对话历史管理和上下文检索,适配知识库问答场景,且容易通过Prompt和前置逻辑控制回答边界
  • 实现方式:
    1. 在自定义Prompt中明确指令:如果上下文无匹配信息或无法确定答案,直接返回预设的拒绝语
    2. 增加检索结果过滤:用similarity_search_with_score获取带相似度得分的文档,过滤掉得分低于阈值(如0.7)的内容,若剩余为空则直接返回拒绝语,无需调用LLM:
      docs_with_scores = vector_store.similarity_search_with_score(user_query, k=3)
      relevant_docs = [doc for doc, score in docs_with_scores if score > 0.7]
      if not relevant_docs:
          st.write("我无法回答这个问题")
      else:
          result = conversational_chain({"question": user_query, "chat_history": chat_history})
          st.write(result["answer"])
      

内容的提问来源于stack exchange,提问作者Al Mahdi Bakkali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 21:37:28