幻觉级联:当你的智能体无法从自身错误中吸取教训时

发布日期:2026-06-23 10:03:38   浏览量 :11
发布日期:2026-06-23 10:03:38  
11

我的基础设施分析智能体陷入了一个我尚未命名的循环中。

它会编写一个包含虚构列名的结构化查询语言(SQL)查询。该查询会因 PostgreSQL 错误而失败。我的错误处理程序会从 pg_attribute 返回真实的列列表作为响应。智能体会读取这些信息,在其推理轨迹中确认修正,然后在下一次尝试中写出完全相同的错误列名。

不是不同的错误列,而是同一个。

我开始称这种现象为“虚构级联”。以下是实际发生的情况、为什么这更多是一个工具设计问题而非模型问题,以及我对此采取的措施。

背景设置

Nexus 是我的个人智能平台。它运行着 8 个以上的自主智能体,针对一个包含 191 张表的 PostgreSQL 数据库模式执行操作,例如每周生活章节分析、关系健康跟踪,以及基于 24 年个人数据进行传记推断。基础设施分析智能体负责查询这些表,以发现模式和异常。

当智能体在 Nexus 中编写 SQL 时,它们会通过 tool-executor.ts 中的 handleQueryDb 函数进行处理。该处理程序强制仅允许 SELECT 访问权限,应用智能体作用域的角色,并在失败时调用 query-db-schema-hint.ts 中的 buildQueryDbSchemaHint() 来增强错误消息。

问题就出在最后这一步。

被动式模式提示

buildQueryDbSchemaHint() 执行两项操作:

  • 当出现“列不存在”错误时:内省 pg_attribute 并返回该表的真实列列表

  • 当出现“表不存在”错误时:在 pg_class 中搜索相似的表名并提供建议

这很有用。当触发时,智能体会获得准确的模式信息。问题在于“当”这个词。这种提示完全是被动的。它仅在查询失败后才会触发。

没有 describe_table 工具。没有 get_schema 调用。智能体无法在编写 SQL 之前询问“aurora_life_chapters 有哪些列?”。获取真实信息的唯一途径是试错。

因此,智能体的循环如下:

  1. 生成查询。列名来自训练权重加上上下文——称之为一个自信的先验概率。

  2. 查询失败。错误消息带着真实列列表到达。

  3. 智能体将修正作为上下文处理,用于下一次生成。

  4. 训练先验概率重新占据主导。相同的错误列名出现在新查询中。

  5. 回到第 1 步。

智能体并没有忽略修正。它接收到了两个相互竞争的信号:一个是基于现实的错误消息修正,另一个是嵌入在模型权重中更强的模式先验概率。修正只出现一次。而先验概率在每个令牌生成时都会出现。猜猜哪一个赢了。

为什么这是一个工具设计问题

人们很容易将此归结为“模型应该更加关注错误消息”。这种 framing 将修复工作置于提示工程领域——增加强调、重新排序上下文、告诉模型这次一定要认真阅读提示。

这可能会在边际上有所帮助。但它无法解决结构性问题。

结构性问题在于,我设计了一个工具界面,使得自信地猜测成为获取准确信息的唯一入口。智能体在行动前无法验证结构。它只能通过失败来学习。当模型的训练先验概率很强时,这种学习通道是有损耗的。

将其与你为人类设计工具的方式进行比较。如果你给人类提供一个应用程序接口(API),而他们询问接受哪些字段,你会给他们提供文档。你不会让他们提交格式错误的请求,直到错误消息教会他们

免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。

关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据