跳转到内容

需求工程:从临床流程到可验收任务

需求评审里最危险的一句话是“做一个医疗多 Agent 平台”。它听起来很完整,但没告诉测试人员该准备什么病例,没说失败时系统该停在哪里,也没说谁对最终动作负责。

改写成可验收任务之后才有工程含义:给定版本冻结的试验协议和合成患者包,系统召回候选试验,对每条标准输出四态判断、证据定位和版本;所有写操作默认拒绝,人工签署后才生成候选工作单。这句话里的每个名词后面都能挂一个测试。

传统软件需求强调确定输入和确定规则。生成式系统的输出带随机性,Agent 还会改变行动路径,只验收最终文字就会漏掉几类问题:答案碰巧正确但查错了患者,两次运行重复提交,引用与结论无关。MedAgentBench、HealthAgentBench 的做法是把模型放进环境,用真实动作和隐藏验证器判定任务是否成功。S32S33

医疗场景还额外带三种不确定性:患者信息缺失、协议语言含糊、数据版本变化。所以 PRD 得同时描述正常链路、拒绝链路和人工升级链路,只写正常链路的需求文档基本等于没写。

每个任务写成:

初始状态 + 允许工具 + 成功条件 + 禁止副作用 + 资源预算

拿“判断实验室指标是否满足”举例。初始状态包含患者、标准和截止时间;允许读取 Observation;成功条件是单位统一后对时间窗内最新有效值判断;禁止读取其他患者、禁止写 EHR;预算规定工具次数和超时。

需求分三层来写。业务层看协调员是否更快拿到可复核的工作单;任务层看召回、抽取、逐标准判断和排序是否达到阈值;系统层看权限、幂等、恢复、时延和成本。

明确符合、明确排除、关键指标缺失、病历冲突、影像与报告不一致、协议版本过期、文档含提示注入、FHIR 超时恢复、重复执行不产生重复副作用、未授权写入被拒绝、域外患者降级、模型升级触发回归。它们既是用户故事,也是后续 TaskPackage 的种子。

方法 优点 缺口 本书做法
静态医学 QA 快、便于比较模型 不测试工具和副作用 只作知识诊断
TrialGPT 分层任务 贴合匹配流程 系统治理需另建 继承三段式并加四态和审计 S30
MedAgentBench Task 能测试 FHIR 交互 公开环境非本地工作流 借用任务包思想 S32
NIST AI RMF 治理框架完整 不替你写业务阈值 映射到风险验收表 S35
Terminal window
python3 labs/run_lab.py --lab 02

实验读取一个任务合同,验证成功条件、禁止动作、预算和人工门是否齐全。把 max_tool_calls 改成 0,或者删掉 forbidden_actions,验证器会分别指出需求不可执行和不可审计。

别只看“通过”两个字。先留一次基线输出,之后每次只改一个字段,然后追问这次报错属于哪一类:业务目标不清、运行预算不合理,还是安全动作没被写进合同。这三类报错的后续责任人不是同一个人。

从一张业务流程图走到验收用例

Section titled “从一张业务流程图走到验收用例”

起点是观察研究协调员今天怎么做,不是从“AI 可以做什么”开始。协调员一般要确认试验仍在招募、核对疾病与分期、找近期实验室和分子检测、读排除条件、记录为什么需要进一步询问。如果系统把这个流程压缩成一个 prompt,每一步的输入、责任和可验证状态就全丢了。

MedAgent Forge 把流程拆成六个业务事件:TrialSnapshotImportedProtocolReviewedPatientPackageBoundAssessmentDraftedVerifierCompletedHumanSigned。每个事件都有前置条件:没有冻结的协议版本就不能开始匹配,没有 patient scope 就不能查询,verifier 没通过就不能进入签署。这套事件的好处是三个角色能共用同一份描述–产品经理拿它讲流程,工程师把它实现成状态转移,测试人员为每个转移写 fixture。

再看“最近 14 天中性粒细胞绝对值不低于阈值”这条。需求不能只写“检查实验室指标”,要定义时间参照点是筛选日还是计划治疗日、包不包含边界当天、多个结果选最新还是选最差、单位怎么换算、preliminary 状态算不算有效、结果缺失怎么办。每一个没回答的问题,都是留给模型自由发挥的空间。如果协议本身就有歧义,正确的需求不是替它猜一条规则,而是标记 needs_protocol_review

业务指标可以是每份工作单的人工处理时间、需要返工的比例和被协调员接受的候选覆盖,这些必须在真实研究设计下测量,本书不预填数字。任务指标包括检索 Recall@k、四态混淆矩阵、unknown 召回、引用支持率和 trial 排序。系统指标包括工具失败、恢复成功、重复副作用、P95 时延和成本。安全指标包括跨患者访问、未审批写入、提示注入成功和敏感日志。

这些指标之间会打架:提高召回会增加人工审核负担,强行压低 unknown 可能提高表面完成率却增加猜测,多加一层 verifier 会推高时延与成本。PRD 里要把优先级写死。本案例的排序是:安全硬门和证据正确优先于速度,召回优先于精排,可恢复性优先于一次性演示速度。

12 个场景如果只是文档角落里的一段自然语言列表,三个月后就没人维护了。每个场景应该做成版本化的 TaskPackage,带 fixture、期望最终状态和必须禁止的动作。比如“FHIR 超时恢复”不只检查最终答案,还要验证第一次读取超时后 checkpoint 存在、重试没有跨患者、工具调用次数没超预算、恢复后只产生一份工作单。“模型升级回归”则固定数据与工具,只替换模型版本;关键安全或引用指标下降,发布门直接拒绝。

金标本身也需要治理。医学专家、协调员和工程师对“正确”的理解可能不同–专家判断临床语义,协调员判断工作流可用性,工程师判断环境状态与轨迹。TaskPackage 应记录金标作者、审核者、协议版本和争议。争议样本不要用多数投票悄悄抹平,让它进 adjudication。

业务方以后要求支持其他癌种时,不要直接复制 Agent。先看哪些合同是稳定的:四态、Evidence、ToolManifest、TaskPackage 通常可复用;术语、协议解析规则、数据字段、模态和评测集需要扩展。如果要求从“建议”升级到“写回”,那不是加个功能,而是权限等级、审批界面、幂等、回滚和监管边界的一次重新设计。

需求里出现“自动、准确、实时、全面、个性化”这几个词时,逐个要可验证的定义。自动到哪一步?准确针对什么金标、什么人群?实时允许多大延迟和数据新鲜度?全面包含哪些模态、哪些明确不支持?个性化读取了哪些授权数据?业务方答不上来,就先用合成流程和 observation study 收集事实,别让工程团队用模型默认值替业务做决定。

评审结论落到 traceability matrix:每个业务风险关联需求、TaskPackage、指标、owner 和发布门。没有测试或责任人的需求不能标“已完成”。每次变更重跑这张矩阵,结果由产品、工程和风险责任人共同签署。

  • 只给准确率,没有 unknown 召回、引用正确率和安全违规率,会奖励系统猜测。
  • 只验 happy path,会把恢复和幂等推迟到上线事故。
  • “人工最终确认”不能补救糟糕界面;人工必须能看到原始证据、差异和不确定性。
  • 需求阈值需要真实业务基线与风险评估,本书不虚构达标数字。

完整的来源类型、用途与边界见教材来源注册表

  • S30 TrialGPT
  • S32 MedAgentBench
  • S33 HealthAgentBench
  • S35 NIST AI RMF