每个 AI Agent 都可以有 PostgreSQL,但不该都拥有真相

2026-08-19 56 预计阅读时间: 1 分钟
来源: postgr.es AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:16 分钟

Databricks 收购 Electric,值得关注的地方不只是交易本身,更在于它提示了一种正在成形的架构:PostgreSQL 不再只能作为远程服务器运行,也可以进入浏览器、应用进程、无服务器环境,甚至 AI Agent 的沙箱。

Electric 的 PGlite 是编译为 WebAssembly 的 PostgreSQL,可以嵌入 JavaScript 环境,并支持本地持久化、事务、SQL 以及包括 pgvector 在内的一部分扩展。配合同步技术,本地数据库可以与中心 PostgreSQL 系统连接起来。

这会让 Agent 的执行循环更快、更独立。但它也带来一个必须正面回答的问题:如果每个 Agent 都有自己的数据库,究竟哪个数据库拥有真相?

Agent 带来的新状态问题

传统应用通常拥有相对稳定的执行路径。查询由开发者预先设计,数据访问模式可以测试,基础设施也较容易统一管理。

Agent 的执行路径则可能在运行时决定。它可能检索文档、生成向量、调用工具、制定计划、修改假设、协调其他 Agent,并把中间结果保留到下一次执行。于是,系统会产生大量不同性质的状态:

  • 临时计划、检索片段和一次性工具结果;
  • 需要跨会话保留的检查点、批准记忆和工作成果;
  • 客户、财务、权限、身份和最终业务结果等企业权威数据。

把所有中间操作都写入远程数据库,会增加网络延迟和系统耦合。把所有内容留在 Agent 沙箱中,又会产生难以治理、审计和对账的孤岛。

一个更清晰的做法,是把状态分成三层:

1. 临时工作状态

包括中间计划、短期上下文、检索文档片段、临时 embedding、测试数据和一次性工具响应。这类数据通常适合放在 Agent 本地,任务结束后可以清理,也不必进入企业系统。

2. 持久 Agent 状态

包括任务检查点、经过批准的记忆、已完成的工作成果,以及其他 Agent 需要继续处理的信息。它必须跨执行会话存活,但不代表它自动成为企业事实。

这类状态需要明确同步方向、保留期限、冲突处理、访问权限和复用规则。

3. 企业权威状态

客户记录、金融交易、订阅权益、身份、策略、受监管信息和最终业务结果,应当存放在受治理的系统记录中。Agent 可以读取这些数据,也可以提出变更,但本地数据库不应悄悄变成另一个事实来源。

PostgreSQL 在单个本地沙箱中可以保证事务完整性,却不能自动保证成千上万个独立 Agent 之间的数据一致性和业务正确性。

PGlite 的价值:熟悉的数据库进入执行现场

PGlite 的意义不只是“在浏览器里放一个 SQL 数据库”。它把 PostgreSQL 本身编译为 WebAssembly,让开发者能够在受限环境中继续使用熟悉的数据类型、Schema、事务和部分扩展生态。

这带来几个实际收益:

  • Agent 可以在本地完成低延迟的上下文查询;
  • 关系数据、全文检索、元数据和向量检索可以放在同一套模型中;
  • 开发、测试、浏览器沙箱和生产 Agent 可以共享更多 SQL 与迁移知识;
  • 对短期任务而言,不必为每个本地执行环境启动完整数据库服务器。

但兼容 PostgreSQL 并不等于本地实例和中心实例可以互相替代。PGlite 当前运行在 PostgreSQL 的单用户模式中,通常对应一个进程和一个连接。由于 WebAssembly 不具备 PostgreSQL 服务器常用的 fork 后端模型,多连接支持仍然是另一个工程问题。

因此,PGlite 更适合被视为 Agent 的本地执行存储,而不是共享系统的权威数据库。

一个可实践的本地状态模式

下面是一个简化示例。它演示如何在 Agent 本地使用 PGlite 保存临时上下文,并通过 outbox 记录准备同步到中心系统的持久意图。

这是一个可改造的实践示例,不代表所有 PGlite 版本都具有完全相同的同步插件接口。运行前可以先创建一个空的 Node.js 项目,并安装当前版本的 PGlite:

mkdir agent-local-db
cd agent-local-db
npm init -y
npm install @electric-sql/pglite

创建 agent.mjs

import { PGlite } from '@electric-sql/pglite';

const db = new PGlite('./data/agent');

await db.exec(`
  CREATE TABLE IF NOT EXISTS working_context (
    key TEXT PRIMARY KEY,
    value JSONB NOT NULL,
    expires_at TIMESTAMPTZ
  );

  CREATE TABLE IF NOT EXISTS outbox (
    event_id UUID PRIMARY KEY,
    event_type TEXT NOT NULL,
    aggregate_id TEXT NOT NULL,
    payload JSONB NOT NULL,
    created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
    sent_at TIMESTAMPTZ
  );
`);

await db.transaction(async (tx) => {
  await tx.query(
    `INSERT INTO working_context (key, value, expires_at)
     VALUES ($1, $2::jsonb, now() + interval '30 minutes')
     ON CONFLICT (key) DO UPDATE
     SET value = EXCLUDED.value, expires_at = EXCLUDED.expires_at`,
    ['customer_context', JSON.stringify({ customerId: 'cust_123', intent: 'renewal' })]
  );

  // 只记录可重试的持久意图,不在数据库事务中调用外部服务。
  await tx.query(
    `INSERT INTO outbox (event_id, event_type, aggregate_id, payload)
     VALUES (gen_random_uuid(), $1, $2, $3::jsonb)`,
    [
      'renewal.proposed',
      'cust_123',
      JSON.stringify({ source: 'agent-local', requestedBy: 'agent_42' })
    ]
  );
});

const result = await db.query(
  `SELECT event_id, event_type, aggregate_id, payload
   FROM outbox
   WHERE sent_at IS NULL
   ORDER BY created_at
   LIMIT 100`
);

console.log(JSON.stringify(result.rows, null, 2));
await db.close();

这个模式有几个关键边界:临时上下文可以留在本地;需要跨会话传递的动作先写入 outbox;真正的外部调用由可恢复的后台工作执行;中心系统在接收事件后,仍然负责校验权限、业务规则和最终状态。

在真实系统中,还需要为 outbox 增加事件去重键、重试次数、错误原因、租约和死信处理。对于金融交易、订单提交或基础设施变更,不能仅凭本地事务判断外部动作是否成功。

同步比运行 PostgreSQL 更难

在单个 Agent 中运行 PostgreSQL 是工程实现问题;同步一批分布式 PostgreSQL 实例,才是系统架构问题。

至少需要回答以下问题:

  • 两个 Agent 同时修改同一个实体时,谁能胜出?
  • Agent 失去权限后,本地沙箱还能运行多久?
  • 断网期间产生的事务是否可以安全重放?
  • 哪些数据允许最终一致,哪些操作必须先获得中心批准?
  • Schema、扩展和安全策略如何传播到正在运行的沙箱?
  • 如何证明某次决策使用了哪个版本的数据、策略、模型和提示词?

同步的不应只有数据行,还应包括数据的控制上下文。授权范围、租户边界、数据分类和策略版本如果没有一起传播,系统可能复制了数据,却削弱了数据原本的治理含义。

当前文档中提到的 PGlite 同步能力仍有早期阶段的限制,例如本地写入向外同步和冲突解决。更完整的同步引擎可以提供更广泛的能力,但这也说明架构愿景与成熟的企业级实现之间仍有距离。

用 C.A.L.M. 检查平台是否值得信任

当本地状态开始跨越 Agent 边界时,可以用四个维度检查整体平台:Changeability、Assurance、Leverage 和 Measurability。

Changeability:能否持续改变

Agent 的数量可能从几百增长到数百万。平台需要管理本地 Schema、扩展、数据契约、同步规则和安全策略的演进。

数据库本身可以是短命的,但 Schema 不兼容往往会长期存在。迁移策略必须能够处理版本差异、暂停同步、回滚和逐步升级。使用 PostgreSQL 的兼容性,应该帮助团队保留架构选择,而不是把所有本地应用锁定在某个同步服务上。

Assurance:谁对结果负责

第一问永远是:每种状态由哪个 PostgreSQL 实例负责?

接下来还要确认冲突规则、权限传播延迟、敏感数据清理、中心审批和本地状态隔离。Agent 越自主,边界就越需要精确。一个本地事务成功,并不代表企业已经接受了这个结果。

Leverage:是否真正减少了复杂度

统一使用 PostgreSQL 可以复用 SQL、数据模型、迁移、事务概念和成熟工具。pgvector 这类扩展也让本地检索不必完全切换到另一种数据库模型。

但统一基础设施不等于所有实例承担相同职责。PGlite 负责本地低延迟执行,中心 PostgreSQL 负责共享、治理和权威记录,这种职责差异应当写进架构与代码中。

Measurability:是否能解释发生了什么

没有观测能力的分布式自主性,最终会变成分布式不确定性。至少需要监控:

  • 同步延迟和失败率;
  • 本地上下文的新鲜度;
  • 冲突写入和重放次数;
  • 权限与策略传播状态;
  • 每个本地数据库的资源使用和生命周期;
  • Agent 观察到的上下文与中心最终变更之间的关联。

理想的审计记录不只回答“Agent 做了什么”,还应回答“它在什么时间、基于哪一版数据和策略、在什么权限下做出了决定”。

Agent 一旦产生外部副作用,就要遵守 ORBIT

临时状态如果永远留在沙箱内,风险相对有限。一旦 Agent 开始修改持久数据或调用外部系统,就需要更严格的执行纪律:

  • Outbox First:在同步或调用外部系统前,先事务性记录持久意图;
  • Rate State Is Shared State:全局配额和 API 限流不能依赖每个沙箱的本地判断;
  • Background Is the Unit of Execution:同步和外部调用应由可恢复的后台任务完成,不应绑在长事务中;
  • Idempotency Before Day One:从第一天就设计幂等键,确保重试和重放不会重复业务动作;
  • Trace Everything:本地上下文、数据库变更、同步事件、工具调用和中心结果必须串成一条追踪链。

例如,Agent 先在本地提交订单意图,再调用支付服务;调用完成后网络断开,本地状态却还没有同步。任务恢复时,如果系统无法确认支付是否完成,盲目重试就可能造成重复扣款。PostgreSQL 可以保护本地事务,不能单独保护跨系统的最终结果。

采用前的检查清单

可以把以下问题作为落地前的最低检查标准:

  • 临时、持久和权威状态是否有明确分类?
  • 每类数据的唯一事实来源是否已经写明?
  • 本地写入、中心审批和冲突解决的边界是否明确?
  • 权限、策略和数据版本是否可审计?
  • 同步失败、断网、撤权和 Schema 升级是否有恢复方案?
  • 外部动作是否使用 outbox、幂等键和可恢复后台任务?
  • 是否能从 Agent 决策追溯到本地上下文和中心结果?

PGlite 说明 PostgreSQL 已经足够灵活,可以进入浏览器、应用进程和 Agent 沙箱。未来的重点不是创建多少个 PostgreSQL 数据库,而是为每个数据库划定清楚的权限、生命周期和责任边界。

本地 PostgreSQL 负责靠近执行现场,中心 PostgreSQL 负责持久性、治理和企业真相。两者可以使用同一种数据库语言和技术基础,但不应因此被误认为拥有同一种权威。真正成熟的 Agent 架构,必须同时保留本地自主性和企业对最终事实的控制。


相关推荐