跳转到主要内容

结算与授权:智能体交易揭示的行动边界问题

获得现金进行交易的智能体往往会反复买卖:问题不在于策略,而在于意图与已记录持仓之间缺少结算边界。

服务器机架的近景,带有状态 LED 和网络线缆,代表后端系统中的状态对账。

语料信号

在智能体交易实验中反复出现的一种模式是:一个拿到现金余额和市场行情数据的智能体,并不会只下几笔经过深思熟虑的订单。它会频繁交易。它买入、卖出、再买入,交易日志里塞满了没有任何既定策略能解释的往返交易。人们很容易把这解读为策略失败——信号不好、风险偏好不当、提示词过于急切。这种解读错过了更有用的信号。真正有意思的失败是结构性的:智能体的意图与它下一步据以行动的状态之间,缺少结算边界。

在传统交易系统中,这个循环是显式的。订单被授权、提交、确认、成交,然后结算。每个阶段都有自己的表示,策略看到的持仓是经过对账的视图,而不是它希望下的那笔订单。没有这道边界的智能体会把各个阶段压扁。它把已授权的行动当作已执行的行动,把已执行的行动当作已结算的持仓。结果就是反复的往返交易,因为智能体从未得知实际发生了什么。

已授权不等于已执行

许可与结果是两回事,而智能体框架经常把它们混为一谈。智能体可以持有有效的交易授权,却仍然基于过时状态行动。授权说明它可以做什么;它完全没有说明世界当前是什么状态。当两者不被分开时,智能体的下一个决策就建立在假设而非事实之上。

想想交易循环必须区分开的三个不同对象:

  • 订单——智能体有权发出的指令。
  • 成交——交易场所对该订单的部分或全部执行。
  • 已记录持仓——清算后经过对账、已结算的持有量。

订单不是成交。成交不是持仓。持仓不是可以再次动用的余额。每一次转换都可能失败、部分完成,或以乱序到达。一个把自己的意图当作状态读回来的智能体,会针对并不存在的持仓、或已经动用的现金,重新发出指令。

反复的往返交易是缺少对账的可见症状。如果智能体无法读回自己持有什么,它就无法知道先前的行动是否落地。于是它再次行动。一次又一次。这种频繁交易不是策略;它是被表达为交易活动的对账缺口。只要智能体被赋予某种能力却没有相应的读回路径,同样的动态就会出现。

结算层必须承载什么

Close-up of an industrial air duct labeled SUPPLY

面向智能体的结算层不是最后外挂上去的一张数据库表。它是让意图与状态得以对账的组件。三项属性承担了大部分分量。

幂等键按预期行动而非按请求

大多数幂等实现以 HTTP 请求为键。对智能体来说,这是错误的单位。智能体可能重试请求、改写提示词,或派生一个子智能体,通过不同路径发出同一个逻辑行动。如果键由请求派生,同一个意图就可能产生多个效果。键必须由预期行动派生——一个智能体在行动前就承诺、并在每次重试和每种传输方式中复用的稳定标识符。

intent_id = hash(agent_id, action_type, target, quantity, window)

智能体生成一次 intent_id,记录下来,并把它附加到每一次尝试上。结算层接受该键的第一个效果,拒绝或去重其余效果。这就是把至少一次的智能体变成恰好一次效果的方式,而无需要求模型本身可靠。

与正向路径同等权限的回退路径

如果智能体能够提交一个行动,却无法干净地回退它,那么每个错误都会变成永久性的,每种不确定性都会变成再次行动的理由。回退必须是一等操作,拥有与正向行动相同的授权、相同的审计轨迹和相同的幂等纪律。补偿行动不是异常处理器;它是正常接口的一部分。没有它,智能体要么冻结,要么过度交易,因为纠正疑似错误的唯一方式就是再发出一个正向行动。

把对账作为一等智能体工具

对账通常是下游批处理任务:一个夜间流程,把内部记录与交易场所进行比对。对智能体来说,这太慢,也离决策太远。对账必须作为工具暴露出来,让智能体在再次行动前调用。该工具回答一个狭窄的问题:我当前的已结算状态是什么,我的哪些Blue liquid poured into glass test tubes in a lab, stock photomedia/server-rack-closeup-79da28-73e14b.jpg)

推广到金融之外

这种结构并不特定于交易。任何带有结算步骤的领域都有相同的形状,也会在智能体获得授权却没有读回路径时出现相同的失败模式。

  • 结账。 智能体授权一笔支付,支付处理方捕获它,订单状态异步结算。把已授权支付当作已完成订单的智能体会重试结账、重复扣款,或承诺它并不持有的库存。幂等键属于购买意图,而不是 API 调用。
  • 预订。 一个预订被请求、确认,然后占用一份可释放的容量。把确认读作已结算预订的智能体,会在占用过期时超售,因为它从未对两者进行对账。
  • 资源开通。 一个资源被请求、创建,然后在一段延迟后变为可用。把请求当作正在运行的资源来行动的智能体,会针对尚不存在的东西发出依赖行动。

在每种情况下,补救方法都一样:智能体必须在再次行动前读回状态,系统必须按意图而非按请求去重。领域改变的是词汇,不是机制。

诚实的权衡

结算边界会带来延迟和复杂性。在行动前读回状态会给每个决策增加一次往返,而维护意图键、回退路径和对账工具是实实在在的工程工作,朴素的智能体循环会避开它。对于以读为主或低风险的领域,人们会忍不住跳过它,因为重复行动的代价很小。

这种权衡是合理的,但应当被明确做出,而不是靠省略来默认。跳过它的失败模式不是智能体变慢;而是智能体无法分辨自己做过什么。在交易中,这表现为频繁交易。在结账中,这表现为重复扣款。在资源开通中,这表现为孤儿资源。结算层让智能体能够带着权限行动,同时仍然知道它所请求的与真实情况之间的区别。

一条设计规则

如果智能体能够采取带有结算步骤的行动,它就需要三样东西:意图的稳定身份、同等权限的回退路径,以及读回已结算状态的工具。仅有授权是不够的。来自智能体交易的语料信号不是说智能体交易得很糟;而是说当没有边界把它们的意图与世界分开时,它们会反复交易。构建这道边界,频繁交易就不再是症状,而会成为一个决策。

封面照片:panumas nikhomkhai / Pexels。

分享XLinkedIn永久链接6 分钟阅读

相关阅读

这能回答的问题

Why do trading agents buy and sell repeatedly?

Repeated round-trips are usually a reconciliation gap, not a strategy. If the agent cannot read back its settled position, it treats its own intent as state and acts again on stale information.

What is the difference between an order, a fill and a position?

An order is an instruction the agent may issue. A fill is the venue's execution of that order. A position is the reconciled, settled holding. Conflating them lets an agent act on cash or inventory it does not actually control.

Why key idempotency on intent rather than the request?

An agent may retry, rephrase, or route the same logical action through different requests. Keying on the request allows duplicate effects; keying on a stable intent identifier collapses them to one.

Does every agent need a settlement layer?

Any agent whose actions have a settlement step does. Read-mostly or low-stakes domains may skip it, but that trade-off should be explicit, because the failure mode is an agent that cannot tell what it has done.