
Silent exception swallowing in Property Graph LLM Path Extractors
快速结论:当使用 DynamicLLMPathExtractor、SchemaLLMPathExtractor 或 SimpleLLMPathExtractor 进行属性图路径提取时,若 LLM API 调用超时、速率限制或输出验证失败,异常会被完整吞灭,返回空三元组列表 [],且日志仅输出一条错误信息。优先排查是否开启了 raise_on_error=True 选项。
问题场景
用户在 LlamaIndex 的属性图(Property Graph)模块中,使用 DynamicLLMPathExtractor、SchemaLLMPathExtractor 或 SimpleLLMPathExtractor 进行知识图谱三元组提取时,如果 LLM API 发生超时、速率限制或输出验证约束失败,异常会被广泛捕获(Exception / ValueError),并返回空列表 []。下游代码(如异步编排器、批量摄取管道、UI 层)无法感知到该失败,导致“空图”结果且难以调试。
报错原文
# 异常未被传播到调用者,而是被内部 catch 后返回空列表
# 日志中仅输出类似:
ERROR:llama_index:Error extracting paths: ...
# 但异常对象被静默吞灭
原因分析
可能原因是三个提取器(DynamicLLMPathExtractor、SchemaLLMPathExtractor、SimpleLLMPathExtractor)在提取过程中广泛捕获了 Exception / ValueError,并将异常吞灭,返回空的三元组列表 []。这种设计导致 LLM API 调用超时、速率限制或输出验证约束失败等关键错误无法向上传播。开发者已提交 PR #22195 修复此行为,添加了 raise_on_error=True 选项来控制是否传播异常。
环境排查
- 确认使用的 LlamaIndex 版本:检查是否包含
raise_on_error参数的支持。 - 确认 LLM 配置:检查使用的 LLM 实例(如 OpenAI、MockLLM 等)是否可能触发超时、速率限制或 API 错误。
- 确认日志级别:检查是否配置了
logging.INFO级别日志以查看错误信息。
解决步骤
- 可优先尝试:在实例化提取器时传递
raise_on_error=True参数(此修复在 PR #22195 中实现,需确保 LlamaIndex 版本已包含该改动)。例如:extractor = DynamicLLMPathExtractor( llm=your_llm, raise_on_error=True ) - 如果当前版本尚未包含该参数,请升级到包含该修复的最新版本,或暂时手动捕获异常并在调用者处自行处理。
- 如果不想让异常传播,保留默认行为(不传递
raise_on_error或设为False),此时异常仍会被吞灭并返回空列表。
验证方法
使用模拟失败 LLM(例如 FailingMockLLM)运行提取流程:
- 设置
raise_on_error=False(默认)时,提取应静默完成,返回空列表,日志中输出错误信息。 - 设置
raise_on_error=True时,提取应抛出异常(如ValueError: Simulated RateLimitError from OpenAI API),而不是静默吞灭。
确认下游代码能正常捕获异常并处理(如中止管道、触发重试等)。



