AI 原生日志:捕获决策过程,而不仅仅是 I/O
一个客服 Agent 在 12% 的工单中生成了幻觉式的故障排查步骤。HTTP 日志全部显示 200 OK。延迟正常。错误率平稳。从每一项传统指标来看,系统都是健康的——但它却在大规模地悄悄捏造答案。
当工程师最终对决策层进行插桩后,根本原因在几分钟内便浮出水面:检索到的文档块相似度得分全部低于 0.4,对上下文的置信度为 0.28,而模型输出的置信度却显示为 0.91。这是一个巨大的不匹配——在传统日志中完全不可见,但在捕获了决策状态的追踪中一目了然。
这就是将传统日志应用于 LLM 系统时的根本问题。I/O 日志告诉你系统运行了。AI 原生日志告诉你它是否推理正确。
传统日志的根本缺陷
从 Web 服务继承下来的模式很简单:记录输入和输出,记录状态码和延迟,在错误率飙升时发出告警。这之所以有效,是因为确定性服务对相同输入产生相同输出。故障是二元的:服务要么返回了正确的结果,要么没有。
LLM Agent 打破了所有这些假设。
一个产生幻觉的客服 Agent 会返回 HTTP 200,响应看起来合情合理。检索到过时或无关文档的检索步骤会报告成功。选错工具的模型会在没有错误的情况下完成调用。系统在运行,但它没有正常工作。传统日志无法区分这些状态。
还存在一个更深层的结构性问题:传统日志是扁平的。一个 Agent 处理单个用户请求时,可能会调用三个工具、进行四次模型调用、更新两次内存状态,并根据检索结果对推理进行分支。线性日志流将整个层级结构折叠成一系列带时间戳的事件,没有任何因果关联。你看到 Agent 调用了 search_kb,然后调用了 send_response,却看不到搜索返回了垃圾数据、模型置信度崩溃、响应是被捏造出来的。
决策逻辑——真正决定 Agent 是否推理正确的内容——完全存在于那些被记录的事件之间。而在当今大多数生产系统中,它是完全不可见的。
日志行间遗失的信息
思考一下传统日志为一个三步 Agent 交互捕获的内容:
10:22:34 | tool_call | function=search_kb | status=success
10:22:35 | llm_call | model=claude-3-5 | input_tokens=2500 | output_tokens=180
10:22:36 | tool_call | function=send_response | status=success
再思考一下实际发生了什么:
- 搜索查询与索引之间存在嵌入不匹配
- 检索到的文档块相似度得分分别为 0.42、0.38 和 0.35——全部低于有效阈值
- 模型识别到了低质量的上下文(置信度:0.28),但仍然产生了高置信度的输出(0.91)
- 输出包含了从模型训练中"记住"的某个程序中捏造的步骤
这些都没有出现在日志中。三行 status=success,一个困惑的用户。
在生产故障中,未被捕获的信息类别是一致的:
- 决策理由:Agent 为何选择这个工具而非它考虑过的备选方案?
- 被拒绝的备选方案:Agent 考虑并拒绝了什么,置信度水平如何?
- 置信度信号:模型的确定性在哪里下降?在哪里恢复?输入和输出置信度在哪里出现了分歧?
- 检索质量:文档块获得了什么相似度得分?模型是否承认对上下文质量存在不确定性?
- 状态变更:决策前读取了哪些内存?之后写入了什么?状态如何影响了下一步?
- 中间推理:工具调用之间,模型的思维链产生了什么?
这些不是边缘情况的调试奇观。它们是最常见 Agent 故障模式的主要诊断面:幻觉、错误的工具选择、循环行为、级联检索退化。
