跳转到主要内容

你的智能体能否平衡这些账目?

发布日期 阅读需 2 分钟Mike ThriftMike Thrift
你的智能体能否平衡这些账目?

一次有记录的智能体运行,将一份由三条合成行组成的账目从银行 CSV 文件导入为已检查的账目。期初余额为 1000 USD,报表包含三行,预期答案在运行任何报告之前就已通过算术得出:检查账户余额为 2958.50 USD,九月利润为 1958.50 USD。该次运行精确达到了这些数字,期间经历了一次它自行诊断的真实失败。

输入

挑战包含三个已发布的文件,位于 /downloads/agent-accounting/ 目录下,完整场景见 智能体记账指南。账目于 2026-09-01 以美元开立,Assets:Checking 账户中有 1000 USD。报表包含三个九月的行:2026-09-02 一笔 2000.00 USD 的客户付款,2026-09-03 一笔 -29.00 USD 的托管账单,以及 2026-09-04 一笔 -12.50 USD 的咖啡馆消费。规则将客户付款映射到 Income:Consulting,托管账单映射到 Expenses:Software,咖啡馆消费映射到 Expenses:Dining,并且规则中提到的每个账户都在起始账目中以所需日期开设。

预期结果由这些行加上期初余额独立得出,不依赖任何报告输出:1000 + 2000 - 29 - 12.50 等于 2958.50 USD 的检查账户余额,2000 - 29 - 12.50 等于 1958.50 USD 的九月利润。如果输入更改或预期错误,验证将失败,而不是打印一份看似合理的报告。

方法论

分为两层,保持独立。首先,一个已安装的 CLI 验证器(scripts/check-agent-accounting.py,固定使用 bea 0.1.0)在一个使用隔离配置的全新临时目录中执行预览、应用、重复应用、检查、余额和收支报表查询。它断言预览报告 3 条就绪且不写入任何内容,首次应用写入 3 条条目,重复应用报告 0 条就绪且包含 3 条完全重复条目而不写入任何内容,预览和被拒绝的写入后字节一致性保持,检查干净,并且两个总数与上述算术相符。它还尝试一笔不平衡的交易(Assets:Checking -5 USD 对应 Expenses:Dining 4 USD),要求退出码为 1,并验证账目字节未更改。

其次,在下载内容的全新副本上运行一次真实的智能体运行。客户端是 muse 1.1.1(Muse Code),模型为 muse-spark-1.3-contributor,以无头模式启动,在工作目录内启用 shell 和文件写入工具,禁用网络工具,运行期间无人工干预。关键的是,没有提供 rules.toml —— 智能体根据账目中已开设的账户自行推导分类。

观察到的结果

智能体进行了 22 次工具调用(21 次 shell 加 1 次文件写入),并以退出码 0 结束。它检查了 CSV 文件和 16 个已开设账户,阅读了 CLI 帮助界面,编写了自己的 rules.toml(字面大小写匹配,由于匹配不区分大小写,与规范模式等效),预览了 3 条就绪且未写入任何内容,应用了 3 条条目,并运行了一次干净的检查。它报告的总数为检查账户 2958.50 USD 和九月利润 1958.50 USD。操作员随后在智能体的账目上重跑了两个只读查询,确认了相同数字与独立的预期值一致。

下面的简短演示从规范的下载内容中确定性地重现了该工作路径。这是一个回放,而非实时运行:

$ bea --version
bea 0.1.0
$ bea import (preview)
csv → Assets:Checking: 3 ready, 0 exact duplicates, 0 possible duplicates
$ bea import --apply
Wrote 3 entries to $WORK/books/main.bean.
$ bea check
$WORK/books/main.bean: no errors
$ bea balance Assets:Checking
    Checking                                      2,958.50 USD
$ bea report income-statement -t 2026-09
Net Profit: 1,958.50 USD
checking: 2958.50 USD (expected)
profit: 1958.50 USD (expected)
REPLAY OK: preview 3/0, applied 3, check clean, 2958.50 / 1958.50 USD.

失败与干预

记录保留了原始顺序,包括失败在内。两次探索性调用无害地失败了(未安装 pip;一个可编辑安装路径探测发现源代码在 site-packages 之外),智能体继续前进。有一次真实失败:首次 --apply 因工作区外的缓存锁上的 Operation not permitted 而失败,因为沙箱阻止了在用户主目录缓存下创建锁文件。智能体搜索了产品源代码,发现缓存目录遵循 XDG_CACHE_HOME,于是将其指向工作目录内重新运行,写入了与预览相同的 3 条条目,并在之后清除了临时缓存。账目从未被手工编辑;每条条目都来自 bea import --apply。运行期间无干预:由于是无头模式且关闭了审批,人工仅在事后审查了事件日志。

局限性

这是对单个客户端在合成数据上的单次运行的 CLI 输出验证——而非模型基准测试。它不声明其他客户端或其他通用记账准确性,也不适用于无人值守的生产使用。有两个重要区别。首先,类别判断与结构验证:智能体选择每行所属的账户,该判断的质量仅取决于其对三条无歧义行的解读。之后 bea 验证的所有内容——余额、零和结构、重复检测——都是结构性的:通过的检查证明账目平衡,但从未证明咖啡馆消费属于 Expenses:Dining 账户是正确的。其次,账目是一个玩具示例:三行、单一货币、无分类歧义、无冲突历史。更难的语句将考验判断力;本语句测试的是流程。

下载

所有挑战输入和完整运行记录,作为各种语言环境共享的静态文件:

复现方法:下载三个输入,先预览,再应用,并将两个总数与 1000 + 2000 - 29 - 12.50 进行比较。智能体指南 逐步解释了相同步骤。

分享这篇文章

来源:https://beancount.io/zh/bean-labs/research-logs/2026/09/10/can-your-agent-balance-these-books

发布日期: 2026年9月10日