Langchain+Pinecone+Gemini部分查询返回空响应问题求助
问题:Langchain检索链调用Gemini返回空响应
- 已将《孙子兵法》嵌入向量存储至Pinecone,通过Langchain调用Gemini-pro查询时,部分问题返回空响应
- 典型案例:查询"what is art of war?"可正常返回有效结果,但"what are considerations while attack by fire?"稳定返回空
- 直接调用LLM能获取该问题的正确响应,但通过Langchain检索链调用失败;已禁用全部Gemini安全设置,问题仍存在
排查分析
- 检索召回异常:检索链的核心逻辑是先从Pinecone召回相关文档,再传给LLM生成回答。既然直接传入正确文档时LLM能正常响应,问题大概率出在检索阶段的文档召回或文档格式处理环节。
- 文档格式干扰:Langchain的
create_stuff_documents_chain会自动拼接Document对象的page_content作为上下文,若召回文档存在换行、特殊字符等格式混乱情况,可能导致Gemini无法解析上下文,进而返回空。 - 检索参数适配问题:当前设置
k=3召回3篇文档,但该问题的相关文档可能未被召回,或匹配度较低未进入结果集。
解决步骤
1. 调试检索召回结果
在调用检索链前,先打印召回的文档内容,确认是否获取到火攻相关的正确内容:
# 在创建retrieval_chain后添加调试代码 query = "what are considerations while attack by fire?" docs = retriever.invoke(query) print("召回的文档:") for doc in docs: print(doc.page_content) print("---")
若召回文档为空或无关,需调整Pinecone检索参数:
- 确认嵌入模型与存储向量时使用的模型一致
- 增大召回数量或设置匹配度阈值:
retriever = vectorstore.as_retriever(search_kwargs={"k": 5, "score_threshold": 0.7})
2. 优化上下文拼接格式
修改prompt模板,给每个文档添加编号,让上下文结构更清晰,避免格式混乱影响LLM解析:
template = """ 你是《孙子兵法》专业解读助手,仅根据提供的上下文回答问题。 如果上下文没有相关信息,回答"我没有足够的信息回答这个问题。" 上下文: {% for doc in context %} {{ loop.index }}. {{ doc.page_content }} {% endfor %} 问题:{input} 回答: """ prompt = PromptTemplate.from_template(template)
3. 检查完整响应对象
当前异常捕获仅处理顶层错误,Gemini返回空响应可能未抛出异常,需打印完整响应确认answer和context字段的具体内容:
response = retrieval_chain.invoke({"input": query}) print("完整响应对象:", response) print("上下文内容:", response.get("context", []))
4. 更换LLM模型测试
尝试切换到gemini-1.5-flash,该模型对长文本和格式兼容性更好:
llm = ChatGoogleGenerativeAI( model= "gemini-1.5-flash", safety_settings={ HarmCategory.HARM_CATEGORY_UNSPECIFIED: HarmBlockThreshold.BLOCK_NONE, HarmCategory.HARM_CATEGORY_DEROGATORY: HarmBlockThreshold.BLOCK_NONE, HarmCategory.HARM_CATEGORY_TOXICITY: HarmBlockThreshold.BLOCK_NONE, HarmCategory.HARM_CATEGORY_VIOLENCE: HarmBlockThreshold.BLOCK_NONE, HarmCategory.HARM_CATEGORY_SEXUAL: HarmBlockThreshold.BLOCK_NONE, HarmCategory.HARM_CATEGORY_MEDICAL: HarmBlockThreshold.BLOCK_NONE, HarmCategory.HARM_CATEGORY_DANGEROUS: HarmBlockThreshold.BLOCK_NONE, HarmCategory.HARM_CATEGORY_HARASSMENT: HarmBlockThreshold.BLOCK_NONE, HarmCategory.HARM_CATEGORY_HATE_SPEECH: HarmBlockThreshold.BLOCK_NONE, HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: HarmBlockThreshold.BLOCK_NONE, HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: HarmBlockThreshold.BLOCK_NONE, }, )
内容的提问来源于stack exchange,提问作者Aananda Giri
相关产品推荐
相关产品推荐

