zjchina.net

Drogon · ROS 2 · 独立开发笔记

ENGINEERING NOTES/工程笔记

逼出 Agent II:排班、问责、召唤——从团队到员工

2026 年 10 月 24 日。一个月前写了《逼出 Agent》,讲的是 tidewatch 的团队设计:四个部门、一条规则链。但这一个月里我们诚实地承认了一件事:那套 Agent 还是「工具」——人不敲命令,它一动不动。 这篇文章讲 10 月 24 日这一天(17 个 commit,+8254 行)怎么把它变成「员工」:有排班表、有可证伪的 KPI、有应急召唤。顺带记三个单元测试抓不到、只有真机能现形的 bug。

一、先看这一天

一天四条主线,全部真机验证后合入:

主线干成了什么
行情工作台(渲染)盘口/分时页签、板块榜单、多窗格总览、F10 基本面化;十字光标、相机钳位、缩放右缘锚定
数据纵深(datafeed)降级链从两级扩到四级:东财→新浪→腾讯→TDX 协议直连;TDX 长连接抗会话风控;分笔成交腾讯兜底
量化回测底座分钟线历史回填:腾讯 320 根/页分页、幂等存储、断点续跑
Agent 制度化排班(周末班)+ 问责(预测打分)+ 召唤(事件辩论)

这天下午东财的 WAF 还在惩罚我们的 IP(约一半连接被掐),但系统全程满血——降级链第一次在真实封锁下证明自己。这本身就是「逼出」的一部分:你逼不出没经过坏日子的系统。

二、问题:工具再强也不是员工

10 月 24 日之前的触发入口清单:run(盘后管线)、digest(盘前盘后摘要)、team(团队决策)、broker(飞书问答)。看着不少,但全部有一个共同前提——人在场。

周六没人敲命令,Agent 就休假;周日的公告和政策发布,Agent 不知道;上周的预测对着错过的行情,没人回头打分。所谓「多 Agent 自治」,自治程度约等于一台需要摇启动的拖拉机。

解法不是加功能,是立制度。员工和工具差三样:排班表、KPI、问责。三件套分别对应三个新机制。

三、排班:shift——周六周报、周日展望

一个 tw-cli shift 子命令,两个班次:

  • 周六 10:00 周报:本周复盘——标的周度表现、板块轮动、系统决策复盘、下周关注
  • 周日 16:00 展望:下周预测——大盘研判、板块观点、个股关注、风险清单、可证伪预测

两个设计决定值得展开:

数据包只准装库内事实。 班次的输入是一个纯 SQL 拼出来的数据包:周度涨幅、板块均值、主力净流入、决策记录。prompt 里写死「只引用数据中出现的事实与数字,不得编造」。LLM 在这套系统里只干两件事:解释事实、组织语言。判断数字从哪来?从数据源和公式来。这是整个 tidewatch 一以贯之的纪律。

班次门槛写进代码。 周报只认周六,展望只认周日;--date 视为手动补跑免检。缺班(LLM 挂了、数据断供)会进 runs 表留痕——缺席本身就是一条记录,这是问责的第一层。

四、问责:预测必须可证伪

「看多后市」不是预测,「机器人板块周均涨幅 -8% ~ +5%,置信度 60%,有效 2026-10-26 ~ 10-30」才是。展望班的 prompt 强制每条预测带四个字段:方向、区间、置信度、时间窗。

然后是关键一步——机器解析,不劳 LLM。展望成文后,解析器把「可证伪预测」小节拆成结构化行落库:主语分类(个股代码/板块标签)、区间、置信度、时间窗、原文留痕。下个周六,周报班开场先跑一遍打分器:actual 取覆盖周首开盘到末收盘(与数据包同口径),逐条 ✅❌,成绩单拼进周报正文最前——Agent 下周写预测时,看着自己上周的成绩单写。

三条宽容解析的规则,是这一天里最值钱的经验:

  1. 解析不了的不评分,但原文照样留痕。 模糊预测的代价不是丢失,是「记录在案、无人喝彩」。
  2. 区间支持中文。 a% ~ b%、±x%、>x、「跌破 x 以内」——LLM 写什么格式都接得住,别用 format 约束倒逼模型。
  3. 原文永存。 结构化字段是给机器的,statement 原文是给人看的,防「事后说我说的是另一个意思」。

真机首跑就抓到两个单元测试根本抓不到的 bug:

Bug 1:chrono 的 %d 接受 1 位数字。 滑动窗口解析 2026-10-26 ~ 2026-10-30 时,在 2026-10-3 处就 parse 成功了,把 30 截成 3,时间窗尾日变成 10-03。修法:先验「4 位年 + 横杠 + 2 位月 + 横杠 + 2 位日」的字符形状,再 parse。教训:宽松 parse 和滑动窗口不能同时用。

Bug 2:板块成员的名字就叫板块名。 机器人板块有个成员 300024,证券简称「机器人」——主语「机器人板块」同时命中板块标签和个股名,分类器两边都放弃。修法:名字匹配与板块词同词时让位板块,代码匹配(6 位数字)不受影响。教训:中文主语分类必须有专有名词冲突意识。

两个 bug 的共性:测试全绿、真机现形。 每次交付配真机冒烟不是仪式感,是刚需。

五、召唤:react——事件来了,Agent 上桌

排班覆盖了「到点干活」,但深 V 急跌不会看你班表。召唤机制三条线:

埋点即事件。 盘中异动告警触发 → 落 alert_fire 事件(severity=涨跌幅绝对值);回填时东财回退腾讯 → 落 source_fallback 事件。埋点就一行,落在动作发生的地方,不另起监视进程。

重大事件自动辩论。 tw-cli react 扫未处理事件:急跌 ≥3% 的事件自动构建快照、拉四个 Agent 首轮观点、进 debate() 收敛——就是盘后决策那套辩论引擎,只是触发器从「人到点了」变成「事发生了」。辩论结果和 LLM 成文的简报一起推飞书。

防刷屏和幂等。 事件清单最多展示 12 条、辩论最多 2 场(去重标的);处理完标 handled,重复运行不重复召唤。自治系统的第一守则:别把人训练成飞书通知的奴隶。

crontab 一行接入:盘中每 10 分钟扫一次,无事即静默退出。

六、可复制的四条

给想给自己系统立同样制度的人:

  1. 确定性归机器,语言归 LLM。 打分是 SQL 加减法,别让模型「自我评价」;成文是模型的活,别让人写周报。
  2. 留痕是自治系统的呼吸。 班次缺席进 runs、预测原文进 statement、事件处理进 handled——所有「没做成」和「做成了」一样值得一张表。
  3. 宽容解析三规则(见第四节):模糊留痕、失败不评分、原文永存。
  4. 真机冒烟是测试套件的必要条件,不是可选项。 这天的两个解析 bug、一个布局叠印,全是真机抓的。

七、下一步

  • 下周五:预测问责第一次真实闭环——上周展望的预测对账打分,成绩进周报
  • 回测 M2:分钟线底座已就位,事件研究(深 V 日横截面扩样本)开工
  • 口径债:腾讯兜底源是未复权口径,除权日两侧有跳变,已标注——东财解封后用前复权重刷
  • 周末班扩展:数据质量稽核班、决策归因班在清单上

尾

一个月前那篇的结尾说,让 Agent 从「工具」变「同事」。今天补上后半句:同事不是喊来的,是逼出来的——逼它的不是喊话,是排班表、成绩单和一声「来活了」。

下个周六,这位员工要交第一份带分数的作业。它写得怎么样,机器说了算。

← 返回首页全部文章