
1. 从整理临床试验到3.7万个智能体这个动作到底拆出了什么多智能体AI重构早期药物研发这件事我最初是在一份Science的报道里看到的标题提了一句超3.7万个智能体整理55984项临床试验。第一反应不是好厉害而是整理这两个字怎么可能值得动用3.7万个Agent后来仔细把逻辑捋了一遍才明白这里说的整理根本不是简单的清洗去重而是把五万多条临床试验记录从公开数据库里捞出来逐条拆解成药物、疾病、阶段、入排标准、终点指标、不良事件这些结构化字段再对齐术语、去重归并、交叉验证最后变成一套可以直接支撑早期药物研发决策的数据库。这个工作量如果靠人去读每条试验记录少说也要花一个上午五万条就是几万个人天。所以真正的问题不是要不要用AI而是用什么架构才能在可控成本下把这个量级的活干完、干稳。多智能体方案给出的答案是不追求一个全知全能的超级模型而是把整件事拆成大量可独立执行的小任务每个任务对应一个带角色、带目标、带上下文的Agent实例由调度层统一分配让它们各管一段、互相校验。3.7万这个数字也就解释得通了——它不是真的有3.7万个不同岗位而是同一个执行Agent在五万多条记录、多个处理环节里被反复实例化了这么多次。这个思路对于任何一个被海量文档结构化整理折磨过的人来说都值得仔细琢磨因为这套架构的迁移价值远不止药物研发。这篇内容适合三类人看一类是做AI工程落地、想了解多智能体系统怎么处理真实业务的一类是做药物研发、信息学或者医学数据治理的从业者还有一类是手里有大把非结构化文档、想搞清楚多Agent协作到底能替人干多少活的技术决策者。我会把我对这套架构的理解、合理的实现路径、以及自己复现类似系统时踩过的坑都放进来尽量说到能直接启发你自己搭建的程度。1.1 临床试验数据到底有多乱为什么要动AI临床试验记录不是一堆整齐的Excel表。主数据源ClinicalTrials.gov提供的是半结构化的XML和大量PDF附件每条记录里有官方标题、简要摘要、详细描述、干预措施、用药分组Arm、入组标准、排除标准、终点指标、不良事件、随访时间、试验阶段……这些字段内部又是大段自由文本。一个III期试验的完整记录拉下来动辄几十页而且不同年代、不同申办方填写的风格完全不一致有的把剂量写在标题里有的写在正文中段有的用Experimental: 50mg BID有的写成Arm A: Drug X 50 mg twice daily。这种数据给谁看都头疼更别说要让计算机批量检索、对比、聚合。传统做法是写规则和正则表达式。维护过这种代码的人都懂规则永远追不上真实数据的多样性你今天为一种写法写了规则明天就出现一种新的缩写。直接整篇丢给大模型总结也不稳输出格式漂移、字段遗漏、数值改写都是常见问题。多智能体架构在这里的价值在于把读完整条记录这个高难度动作分解成读标题抽适应症读干预字段抽药物和剂量读入排标准抽结构化条件这类单一任务每个Agent只做一件事可以给更聚焦的指令、更严格的输出约束再靠下层校验Agent兜底。单个Agent能力要求降低整体系统的可控性反而上升。1.2 3.7万个Agent是怎么算出来的55984项临床试验每项试验在完整处理链路里至少经过抽取、清洗、对齐、校验四类动作。假设每条试验被拆成4到6个子任务每个子任务对应一次Agent运行那就是22万到33万次调用。但实践中很多子任务可以合并执行而且同一Agent实例可以并行处理多条同类记录。3.7万这个数字如果理解为实际启动的Agent运行实例数只算主流程不算重试和质检对应的就是大约每条试验0.66次主流程运行——这意味着很多简单记录可能一次Agent实例就完成了主体抽取只有复杂的才需要二次处理。换句话说这个数量级并不是用了什么超大规模集群而是任务拆得足够细、批量跑出来的结果。这个比例对工程选型有直接参考意义如果你的处理对象有5万条按拆分粒度估算出Agent实例总数大概是多少就能反推需要多少调用额度、多少并发队列、多少成本。很多团队一上来就想我要起3万个Agent实际上你只需要一个任务分发器加一个执行池把Agent实例当作廉价的、按需创建的Worker就行跑完即销毁不用常驻。1.3 早期药物研发真正需要的数据底座跑完3.7万个Agent得到的不是一份文档摘要合集而是一张可以查询的关系表。这张表里应该有试验编号NCT号、试验药物标准名、药物别名、作用靶点、适应症、试验分期、入组人数、主要终点、试验状态、申办方、入排除条件摘要、不良事件频率等字段。有了这个底座药物研发早期阶段很多动作都能提速看某个靶点当前有多少在研试验、竞争格局是什么样查某个适应症在不同阶段的入组标准差异比较同类药物的终点设计偏好分析某类药物不良事件报告规律。这些以前需要医学信息专员人工翻几十上百个网页才能汇总的信息现在一条SQL就能查出来。所以整理这件事的技术含量不在AI本身而在于对业务字段的深刻理解和对数据质量的苛刻要求。字段定义错了后面谁用谁倒霉数据抽错了模型再强也是垃圾进垃圾出。这也是为什么我坚持认为多智能体只是手段真正值钱的是任务拆解和质检闭环的设计。2. 多智能体流水线怎么搭角色、调度与任务编排这套系统的工程结构我理解下来可以概括成一个三角关系控制Agent负责任务规划、分派和验收执行Agent池负责具体的读取、抽取、清洗动作任务队列和状态存储负责把两者解耦让三万个实例能并行而不冲突。控制Agent不直接读原始记录它先把55984项临床试验分解成多个批次每个批次包含一批NCT ID再根据处理规则为每条记录生成任务描述可能是一个抽取任务从XML里抽出arms和interventions也可能是一个校验任务核对上一步抽取的数值是否与原文一致。这些任务被丢进队列执行Agent从队列里取一个干一个干完把结果写回状态库再取下一个。控制Agent定期扫描状态库发现失败率过高的任务模式就调整Prompt或者换一种指令再去处理。2.1 控制Agent、执行Agent与任务队列的三角结构为什么一定要用队列把控制Agent和执行Agent拆开因为三万多个实例如果都直接跟控制Agent通信控制Agent立刻变成瓶颈而且任何一个执行Agent挂掉都会阻塞全局。任务队列的好处是天然削峰填谷就算某段时间执行池只有10个并发Worker任务也都在队列里存着不会丢。控制Agent也不用实时盯每个Worker只需要根据队列积压和失败率做宏观调整即可。角色提示词也值得花心思。控制Agent的Prompt定位是负责规划与验收的项目经理它不关心某条具体试验的正文细节只关心当前批次任务完成率是多少、哪些类型的抽取需要补充指令。执行Agent的Prompt则更像具备医学信息学背景的临床试验编码员它唯一的目标就是把分配给它的字段从原文里准确地抽出来带上原始文本出处。角色分离越清晰系统行为越可预测。2.2 拆解具体角色抽取、清洗、对齐、校验各司其职抽取Agent干的活是把自由文本变成结构化字段。以干预措施为例输入是一段话Experimental: Drug X 50 mg administered orally twice daily for 12 weeks输出应该是一个JSON对象包含drug_name、dose_value、dose_unit、route、frequency、duration这些键。药物别名和标准名对齐由对齐Agent负责它手头有一份标准词表可能是MedDRA或者MeSH的术语子集拿到Drug X后要去找它对应的标准概念ID查不到就标记成需人工确认而不是硬编一个编码出来。清洗Agent处理的是明显格式噪音比如全角半角混杂、空格异常、大小写不统一、单位写法混乱mg、MG、milligram得归一成mg。校验Agent的职责最重它要把抽取结果重新跟原文比对一遍剂量数值有没有被改动、枚举字段有没有落在允许值集合内、字段冲突时以哪条原文为准。这四个角色组合起来才算是整理而不是单纯的抽取。2.3 让3.7万个实例不打架状态管理与幂等设计多Agent系统最隐蔽的坑是状态管理。两个Worker同时处理某条试验的不同子任务没问题但如果一个Worker刚把干预措施更新进数据库另一个Worker又把整条记录旧版本写回来数据就乱了。所以必须做到两条一是以NCT ID为维度的字段级更新二是谁后写、以哪个版本为准的版本号机制。每条记录维护一个字符串值用于递增版本Worker写入时带上自己读取时的版本号版本不匹配就重新拉取再写。这个机制本质上就是乐观锁和并发编程里保护共享资源是同一个道理。幂等设计针对的是重试场景。LLM调用不可能每次都成功超时、断连、返回格式非法都需要重试。可问题在于你没法保证上一次失败前模型没有把结果写一部分进数据库。解决办法是给每次任务生成一个全局唯一任务ID写入结果时把task_id也带上目标表加唯一约束。这样同一任务无论重试多少次最终只会有一份有效结果后写覆盖先写整个队列可以放心地狂重试。3. 一套可落地的临床试验整理链路从原始XML到干净数据理论讲完我更想直接展示一条我实际跑通过的处理链路。这套链路不要求你有大规模集群一台配置尚可的服务器加一个开源多Agent框架就能起步。3.1 数据获取API优先爬虫兜底ClinicalTrials.gov提供API按NCT号批量拉取JSON/XML是最稳妥的路径。实测下来它的API有基本限速需要控制并发数建议控制在每秒1到2个请求配合退避重试几万条记录要跑大半天到一天。如果你要处理的对象来自没有API的网站那就得考虑爬虫。爬虫场景我建议用Playwright做渲染后抓取别用简单的requests硬碰动态页面而且必须设好断点续采——把已抓取的NCT名单存进SQLite每抓一条更新一条断了重启就接着跑不用从头再来。拉回来的原始数据先落盘归档。我习惯按NCT ID分目录存储目录下放原始XML、解析后的JSON副本、以及后续每一步的处理日志。这个习惯在数据复核时极其救命任何一条记录出问题你都能从原始文件开始重跑而不是对着数据库里的脏数据干瞪眼。3.2 LLM抽取的正确姿势固定Schema、枚举约束与证据溯源抽取环节是整套系统精度的心脏我有四个实操原则。第一输出必须是严格Schema。用一个JSON Schema约束每个字段的类型和允许值模型输出不合规就自动重试最多三次三次都失败就把该条丢进人工队列。与其让模型自由发挥后解析失败不如让它在约束内尽力而为。{ type: object, properties: { nct_id: {type: string, pattern: ^NCT\\d{8}$}, drug_name: {type: [string, null]}, intervention_type: { type: string, enum: [Drug, Biological, Device, Procedure, Behavioral, Other] }, dose_value: {type: [number, null]}, dose_unit: {type: [string, null]}, route: {type: [string, null]}, frequency: {type: [string, null]}, evidence: {type: string} }, required: [nct_id, intervention_type, evidence] }第二凡是能枚举的字段绝不开放自由填写。试验阶段就那几档Early Phase 1、Phase 1、Phase 1/2、Phase 2……干预类型也就那几种给药途径也有标准词表。模型只需要做选择题不要做填空题错误率能降一个数量级。第三强制证据溯源。每个抽取字段必须附带evidence字段里面是原文中支持这个结论的原始片段。这样做有两个直接好处校验Agent可以拿evidence去跟原文比对不用重新读全文人工抽检时也能快速定位到原文不用在一大段文字里找针。第四明确不知道选项。模型在原文里找不到某个字段时我要求它输出null并标注not_found而不是根据训练记忆瞎猜。临床数据找的是事实不是常识推理。允许模型说不知道至少能保住准确率底线。3.3 交叉验证与质检闭环Agent之间互相查岗单靠一个抽取Agent我无论如何不放心。实践里我会再加两个保险。保险一抽样双跑。从每个批次随机抽5%的试验用不同的模型比如一个用大参数模型一个用性价比高的模型各跑一遍抽取把两份结果做字段级比对不一致的地方自动标记为需人工审核。不需要全量双跑5%的抽样双跑就能把大方向质量问题兜住。保险二规则引擎二次校验。办法很土但很有效——对数值型字段做合法范围检查剂量不能是负数、入组人数不能超过原始记录、日期格式必须合法对枚举字段做合法性检查phase取值必须在预定义集合里。看到这里你可能会问这和LLM有什么关系关系在于LLM抽取的错误往往是看起来很合理的错误规则引擎恰好能把这类错误筛出来。规则负责守住底线LLM负责扩展覆盖面两者配合远比单车独行稳定。质检闭环的最后一道是人工审核队列。所有在双跑中结果不一致、规则校验失败、或者LLM明确标记无法确定的记录统一进入一个人工审核工作台。审核员看到的是原文片段、两个Agent的抽取结果、以及差异高亮只需点点鼠标确认哪个正确。这批人工审核的结果还可以沉淀成few-shot样例下个批次直接喂给抽取Agent当参考形成越跑越准的正循环。4. 复现这套系统我踩过的坑幻觉、上下文与账单理论说得再好落地全是坑。这一节我把自己实际踩过的、以及跟同行交流时高频遇到的一类问题集中讲一讲每一条都对应真实会丢钱丢时间的教训。4.1 一整条试验记录塞不进上下文分段摘录是唯一出路刚开始我天真地以为用长上下文模型把整个XML直接丢进去就行。实际处理一条大型III期试验记录时发现完整的XML包含所有历史修改版本、事件表、统计结果token轻松超过10万。即便是支持长上下文的模型能接收推理速度和成本也是不能承受的——处理5万条记录的费用直接起飞。我的解决思路是分段摘录。为每个试验先做一步预处理用独立的段落分割步骤把XML按field切块比如标题一块、干预措施一块、入排标准一块、结果数据一块。每个Agent只拿到它需要的那个切片。针对需要跨字段理解的环节比如判断药物与适应症是否匹配再单独做一个汇总Agent把几个切片的关键摘录压缩成几百字的浓缩摘要后再做判断。这套做法实测下来不仅大幅降低了单次调用的token数量还因为喂给模型的内容更聚焦抽取准确性反而提升了。对长上下文的迷信在人多的办公室里容易流行但在账单面前很容易清醒。4.2 大模型幻觉在结构化抽取里会被放大整理这种任务里幻觉不表现为编造一篇论文而表现为把50mg改写成500mg把Phase 3写成了Phase 2把静脉注射写成了口服。这类错误特别阴险因为它结构合法、看着合理不仔细对照原文根本发现不了。我压住幻觉主要靠三招。一是上面说的枚举约束让模型只能在封闭集合里选不给自由发挥空间。二是证据溯源模型必须交代每个结论来自原文哪个片段没有证据的一律视为无效。三是在Prompt里写死一条规则如果你在原文中没有找到目标字段输出null禁止根据你对药物的一般常识推断。大模型特别容易自作主张给你补全信息它觉得这个药一般是口服的所以原文即便没写我也写口服。这种补全在整理历史数据时是致命的。4.3 几万次调用的成本控制模型分层和缓存策略成本是这套系统能不能从小样跑到全量的关键。我不建议几万条任务全用最强模型两条经验值得参考。第一条是模型分层。简单任务如提取NCT ID、检查字段格式、做词汇归一化直接用轻量模型复杂任务如判断两个药物名是否为同一实体、理解入排标准的复杂逻辑才用强模型。按这个策略整体成本能比全用强模型下降一半以上而准确率损失有限因为瓶颈本来就不在简单任务上。第二条是缓存机制。LLM调用天然可以设计缓存我在数据库里建了一张prompt_hash到response的映射表。任何一次请求发出前先算Prompt的哈希如果命中了就直接用缓存结果不消耗调用配额。因为很多任务往往有重复模式比如条件相似、药名相似缓存命中率实测能到15%到20%。另外任务的失败重试也要限制次数而不是无限重试否则一次模型输出格式异常可能触发七八次重试钱就悄悄烧掉了。4.4 整理结果怎么评估字段级F1和抽样人审很多人跑完一遍整理链路看输出挺像样就直接用了。我建议无论如何都要先做一个量化评估否则你根本不知道数据库的准确率在什么水平下游研究用起来心里也没底。评估方法不复杂从全量里随机抽200到300条记录让有医学背景的人逐字段核对拿人工标注当Ground Truth计算每个字段的精确率、召回率和F1。我举一个实际项目里的例子药品名称字段F1能到0.95以上但剂量数值字段F1只有0.88——原因就是单位写法差异和50 mg与50mg这类小差异造成抽取不一致后来针对性地加了预处理规则才拉回到0.93。如果只给一个笼统的准确率90%这种问题根本发现不了。所以评估一定要落在字段级别只算整体。后续每次改动Prompt或者调整流程都要重新跑一遍这个评估集用同一个标准看指标变化防止改好一个字段、弄坏三个字段。5. 这套多智能体重构方案能搬到哪些场景如果你认真读到这里你会发现这套东西的核心根本不是药物研发而是一个通用范式海量异构文档拆成可验收子任务用多Agent并行处理以结构和证据约束保证质量最后沉淀成可查询数据底座。这个范式能吃下很多传统RPA和数据治理团队做到崩溃的活。5.1 批量文档整理的通用范式合同、简历、病例、专利厂子里堆着两万份历史合同想抽出资方、服务期限、付款节点、违约条款思路完全一致按条款类型拆Agent用统一Schema约束输出双跑抽样质检。简历库要按技能、年限、期望薪资结构化同理。专利库要抽技术领域、申请人、优先权日、权利项结构还是一样。这套架构的迁移成本主要不在技术选型而在你对目标文档的字段理解有多深。把字段定义清楚再往上套Agent框架会比反过来更顺。值得提醒的是不同领域里证据溯源的含义也不同合同场景里证据是指原条款文本病例场景里证据是指病历原文段落专利场景里证据是指权利要求书原文。只要每个Agent都养成给结论附出处的习惯这套系统的可追溯性就能立住。5.2 小团队复刻的起步建议先跑100条再说最后分享一个我对所有想复刻这套系统的人说的建议。不要一开始就奔着55984条去先拿100条手工整理过的数据做测试集。把你最想要的结构化字段定出来手写这100条的金标准然后拿两个Agent跑一版对照金标准看F1。这个阶段的目的不是追求工程完备而是搞清楚两个问题你定义的字段原始文档里到底能不能稳定抽出来哪一类文档、哪个字段最费劲值不值得为它单独设一个角色Agent100条能跑到满意再考虑扩到1000条1000条的工程链路队列、缓存、质检、断点续跑跑顺了再翻量到全量。直接一头扎进全量工程大概率会花大把时间写了一套完美框架但发现核心抽取效果不行又回头改Prompt工程侧返工成本很高。这套架构最吸引人的地方在于它把让AI干活从一个人跟一个模型聊很久变成了组织一大堆模型各干一小段、再互相检验。“整理”这个曾经最容易被低估的环节恰恰是AI在专业领域里最先能产生确定价值的位置。你不需要三万七千个Agent你只需要先把一件事拆得足够清楚然后放心地把几十个Agent放出去让它们在各自的岗位上互相补位。