两周前,一个本来打算早睡的晚上,我翻到 arXiv:2610.39681。cs.MA,交叉挂 cs.AI,标题 Can AI Agents Interface Clinicians and Complex Models?,21 页,7 张图,760 KB,八位作者,提交人署名 Giulio Colombini。
点开它跟流行病学没关系。我在找一个正面样本——一个 agent 系统,把大模型老老实实摁在调度层,脏活交给人类写好的模型去干。
这诉求说出来有点寒酸。这两年我看过的 agent demo,十个里有八个是让模型既当调度又当计算器,最后甩给你一段非常流畅的分析,里面的数字没有一个能追到源头。
EpidemIA 是那个少数派。
骨架三句话能说完:本地跑一个开放权重的大模型,撑起两个子 agent;agent 底下是人类专家写的、模块化的流行病学模型套件;整套东西不做额外训练,单块 GPU 工作站就能跑。测试用的是博洛尼亚 IRCCS Sant'Orsola 的急诊科就诊数据。
先说“不训练”这条。我认。
拿一个科室、一家医院的数据量去做领域微调,最后调出来的通常不是一个更懂流行病学的模型,是一个更会说这个科室黑话的模型——它学会了像专家一样讲话,没学会像专家一样不确定。这个税我缴过,不想缴第二次。EpidemIA 赌的是通用模型加一套好接口,不是喂数据喂出来的领域感。
“本地跑”这条更值得说,虽然它一点都不性感。
医疗数据不出院,这话写在任何一份合规文档的第一句。但真到实现层面,我见过太多 demo 直接把数据往云端 API 一贴,然后在 README 里补一句“生产环境请自行替换为本地模型”。画外音:这句“请自行替换”翻译过来就是“我们也没试过”😅。我现在看到 README 里出现“生产环境”四个字,第一反应是往下翻有没有对应的 issue。
开放权重模型塞进单卡工作站,水平肯定不如云端旗舰——这两年这块变化太快,具体能到什么档位我不想张口就来——但代价是明的,换来的是数据不出门。这笔账在医疗场景里根本不用算。
然后是真正让我坐直的那一层:模型被关在哪儿。
用户说人话,agent 把这句话翻译成一次具体调用,动力学模型负责算,agent 再把结果翻译回人话。整条链路里,产生数字的永远是那个专家写的、人能读懂的模型,不是 LLM。
我照着这个思路画过一张调用草图(不是论文里的图,是我自己拿来对照用的):
# 用户: "下个月急诊量会涨吗"
plan = agent.plan(query)
# -> tool="ts_forecast", horizon=30,
# model="er_weekly", config="config/epi/er_weekly.yaml"
result = models.run(plan.tool, **plan.args)
# -> forecast=3842, ci=[3632, 4052]
agent.render(result)
关键不在能不能跑通,在于这张图里任何一步出错,我都能指到一个具体的东西上:是模型选错了,参数填错了,还是 YAML 里那个周期项本来就该改。而如果你让模型自己去“估算”,你得到的是一个同样自信、同样流畅、但没有任何东西可以指认的数字。
这就是我这两年对 agent 最大的偏见:能不能审计,比能不能多干活重要一个数量级。这活儿交给实习生干没问题,前提是实习生不许自己发挥。
不过有个细节我从摘要里看不出来——上面那个 plan 里,“哪句话该选哪个模型”这件事,到底是一张人写死的映射表,还是一堆工具丢给模型让它自己挑。这两者在 demo 阶段看不出区别,上了真实场景差得远:前者出错是配置错,后者出错是“它觉得应该这样”。论文正文里应该有,我没细抠,先记一笔,不替它猜。
接下来是我不同意的地方,而且不同意得挺坚决。
作者说,临床上这类复杂模型采用率低,主要障碍是语言和方法学上的隔阂——医生读不懂动力学模型那套符号,也写不动代码,学习曲线太陡。所以让 LLM 来做翻译,把门槛从“会写 R”降到“会说话”。
这个归因太舒服了。因为它给出的解药,正好就是这篇论文做的东西。
我的判断是,语言隔阂顶多算第一层,第二层是责任:模型吐出一个预测,谁签字?
我见过的失败案例,没有一个是“医生不会用工具”——工具早就好用得很,R 包、Shiny、拖拽式 BI,谁都能点两下。真正卡住的是点完那两下之后,屏幕上出现一个数字,而这个数字要拿去排班、调床位、写进周会材料。医生心里那个问题是“我凭什么信它”,不是“我怎么点它”。
EpidemIA 把操作门槛降下来了,但同时,它把理解门槛也降下来了,而且降得更狠。以前用模型的人至少自己写过那几行代码,知道里面有哪些假设;现在他只需要说一句话。这两件事在临床场景里根本不是一回事:前者是麻烦,后者是风险。
我承认这里有我自己的样本偏差——我经手的翻车基本都是责任问题,不是工具问题。也许在博洛尼亚那家医院,语言隔阂真的是主要矛盾。但我还是觉得,一个把采用率低归因于“用户不会用”的方案,容易在 demo 阶段显得特别对症,到采购和落地阶段就哑火。
再补一句作者其实很克制:proof-of-concept,一个数据集,一家医院,一个科室,论文里没吹。是我这种读者容易一看“多智能体 + 临床”就开始脑补它下个月进医院。这毛病得改。
那这篇东西对我有什么用?
不是让我去搭一个 EpidemIA。是我从它身上抄到了一个可以拿去质问自己项目的句式:这个数字是谁算的,他写完那段代码以后有没有人读过,出错的时候我的手能指到哪儿。
我手上正在弄的那个东西,agent 编排得比它花哨,但被问到第三个问题时有点卡——因为有一部分输出,确实是模型自己“顺手”给的,没人写死过。
- "根据历史趋势,预计下周增长约 12%"
+ run(forecast_model, horizon=7, params=cfg) # cfg 是人写的
差的就是这一行。前者读起来更像人话,所以我一直没动它;现在想想,这恰恰是最该动的地方。
这里我纠结了一下要不要把整块重写——毕竟跑得好好的,改了要重新对齐一堆东西。后来决定先只改这一处,把那个“顺手”的口子堵上,其余的等下次真出事再说。别问,问就是懒。
以后我评一个 agent 方案,先问两句:模型被关在哪一层;出错的时候,手指能不能指到一个人类写过的东西上。这两条答不上来,demo 再漂亮我也只是看看。
至于 EpidemIA 什么时候真进医院——不是我该操心的事,我也操心不了。我只知道我那行 diff 明天得改。