你的数据库模式是 AI Agent 的心智模型
大多数构建智能体(agent)的团队将数据库模式(schema)视为后端关注的问题。这种模式是由工程师为工程师设计的,遵循了数十年关系型数据库的最佳实践:积极规范化、避免冗余、拆分引用表、强制执行外键。这种方法对于联机事务处理(OLTP)系统是正确的,但对于 AI 智能体来说通常是错误的。
当智能体读取你的模式以确定如何回答问题时,它并不是在解析数据结构,而是在构建你业务的心智模型。如果你的模式是为已经理解该领域的应用程序代码构建的,那么智能体将根据为别人绘制的地图进行工作。结果就是幻觉式的联接、错误的聚合,以及原本只需两步却需要八步的工具调用链。
这主要不是提示词(prompting)的问题。你可以在系统提示词中添加模式描述,提供少样本示例(few-shot examples),并通过思维链(chain-of-thought)生成查询——但仍然会得到错误的结果。根本问题在于你的实体模型编码了 LLM 无法读取的假设。对智能体友好的模式仅凭结构就能使正确答案一目了然。
规范化陷阱
规范化是传统数据库设计的优点。第三范式消除了冗余,防止了更新异常,并保持了数据的一致性。它也是智能体 SQL 错误最常见的单一来源。
关于 LLM 如何处理不同模式形式的研究显示了一个清晰的模式:对于简单的检索查询,反规范化模式的表现显著优于规范化模式,而规范化模式在复杂的聚合方面具有优势。问题在于智能体经常面临检索查询——“获取客户当前的计划”或“这类产品有哪些”——而规范化模式将这些查询中的每一个都转化为多表联接,模型必须从头开始进行推理。
规范化模式导致的四种最常见失败模式是:
联接类型混淆。 模型在正确答案需要左外联接(LEFT OUTER JOIN)时默认使用内联接(INNER JOIN)。当记录在联接表中可能没有对应行时(例如没有发货的订单、没有订阅的用户),这很重要,因为内联接会静默丢弃这些行。智能体会返回自信但错误的结果。
基础表选择错误。 当规范化模式拥有如 users、user_profiles 和 user_preferences 之类的表时,智能体经常为查询选择错误的锚点表。它们会从听起来与问题最相关的实体开始,而不是从正确代表查询语义的实体开始。
空值处理失败。 反规范化模式以不同方式暴露可空性问题。在规范化模式中,缺失的关系表现为缺失的外键行。在反规范化的模式中,它是一个空的列值。当空值的含义在模式中不明确时,智能体很难正确应用 IS NULL / IS NOT NULL 过滤器。
命名不透明。 像 FLEX_FIELD_1、status_cd 或 acct_type 这样的列名对于没有应用层上下文来解码它们的模型来说是不透明的。隐晦的名称迫使智能体猜测或产生关于列代表什么的幻觉。如果它猜错了,它就会使用错误的过滤器,你就会得到结构有效但在语义上错误的结果。
为什么你的实体模型会成为智能体的心智模型
更深层的问题是概念性的。编写应用程序代码的人类工程师通过数月的背景信息来理解领域:产品会议、代码审查、团队内部知识。他们知道 status = 2 意味着“活跃”,因为他们在两年前的 Slack 讨论中读过那条注释。
智能体获取你的模式、可能还有一些描述,以及一个用户问题。它必须仅凭这些来重建你的领域模型。如果你的模式具有表现力——表名读起来像句子,关系显而易见,引用数据具有人类可读性——智能体就可以快速构建准确的模型。如果你的模式是为应用效率而构建的规范化关系结构,那么智能体在每次查询时都在对外部代码库进行逆向工程。
这直接影响工具调用的次数。查询设计不当模式的智能体会发出更多调用:首先探索模式结构,然后检查状态列包含哪些值,接着验证使用哪个联接,最后纠正初始错误结果。这些往返过程增加了延迟和成本。直接表达领域语义的模式可以显著减少这种探索开销。
