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

使用RetrievalQAWithSourcesChain调用GooglePaLM时遇IndexError问题求助

解决RetrievalQAWithSourcesChain的IndexError问题

错误原因分析

报错IndexError: list index out of range源自LangChain的输出解析器尝试访问空列表的第一个元素,说明Google PaLM模型没有返回有效输出,或者返回内容不符合Chain预期格式。常见触发场景包括:

  • PaLM API调用失败,无响应返回
  • FAISS向量库中无有效文档,Retriever返回空结果导致LLM无法生成答案
  • 默认Chain提示模板与PaLM输出格式不兼容

解决方案

1. 验证PaLM模型基础可用性

先跳过Chain,直接测试PaLM调用是否正常:

# 单独测试PaLM响应
response = llm("What is the price of Tiago iCNG?")
print("LLM Response:", response)

如果无输出或报错,检查以下项:

  • 确认Google Cloud API密钥配置正确(环境变量或代码传入)
  • 检查网络连接是否能访问Google PaLM服务
  • 确认PaLM模型(如text-bison)的权限已开启

2. 检查FAISS向量库有效性

确认向量库中存在可检索的文档:

# 测试向量库检索结果
docs = vectorIndex.similarity_search("Tiago iCNG price")
print(f"Retrieved docs count: {len(docs)}")
if docs:
    print("First doc content:", docs[0].page_content)
    print("First doc source:", docs[0].metadata.get("source", "No source"))

如果返回0条文档,说明URL内容嵌入存储流程有问题,需重新检查:

  • 确认URL内容已成功爬取并拆分为Document对象
  • 验证嵌入模型(如PaLM Embeddings)生成的向量是否正常
  • 确认FAISS索引已正确添加文档并保存

3. 调整RetrievalQAWithSourcesChain配置

减少检索文档数量

默认Retriever可能返回过多文档,超出PaLM上下文窗口导致无输出:

# 限制检索文档数量为2
retriever = vectorIndex.as_retriever(search_kwargs={"k": 2})
chain = RetrievalQAWithSourcesChain.from_llm(llm=llm, retriever=retriever)

自定义适配PaLM的提示模板

给PaLM指定清晰的输出格式要求:

from langchain.prompts import PromptTemplate

# 自定义提示,明确要求返回答案和来源
prompt_template = """Answer the question based only on the provided sources.

Sources:
{sources}

Question: {question}

Your response must follow this format:
Answer: [your answer here]
Sources: [list of source URLs/names used]
"""
prompt = PromptTemplate(
    template=prompt_template,
    input_variables=["sources", "question"]
)

chain = RetrievalQAWithSourcesChain.from_llm(
    llm=llm,
    retriever=retriever,
    prompt=prompt,
    return_source_documents=True  # 可选,便于调试
)

改用StuffDocumentsChain(替代MapReduce)

MapReduceDocumentsChain对输出稳定性要求更高,可尝试更简单的Stuff模式:

from langchain.chains.qa_with_sources import load_qa_with_sources_chain

chain = load_qa_with_sources_chain(
    llm=llm,
    chain_type="stuff",
    retriever=retriever
)

4. 增强调试细节

开启详细日志查看LLM输入输出:

# 打印LLM完整输入输出
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler

chain = RetrievalQAWithSourcesChain.from_llm(
    llm=llm,
    retriever=retriever,
    callbacks=[StreamingStdOutCallbackHandler()]
)
result = chain(input_data)

通过输出可确认PaLM是否接收到正确的检索文档,以及返回内容是否符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 19:07:06