【实践记录】拒绝“拍脑袋”开发:使用Spec-driven 模式在 Coze 落地一个“专家级”病理研读 Agent

前言
作为一名主攻 AI 病理图像处理的工科研究生,日常的实验中感受到以下痛点:一是数据工程痛点,手头积累了大量非结构化的病理诊断文本,急需清洗为标准 JSON 格式以构建训练集;二是文献研读痛点,在阅读长篇英文 WSI(全切片图像)分析论文时,通用大模型容易产生幻觉,难以精准提取复杂的实验参数。而传统的 Prompt 调优往往顾此失彼,陷入“打地鼠”的死循环。
最近,GitHub 开源项目 AI Code Guide 中的 Spec-driven(规格驱动) 开发理念给了我很大启发。不再依赖盲目的试错,我基于 Coze (扣子) 平台重构了开发流程,从零搭建并上线了这款定制版本的 PathoInsight 病理科研助手。
🔗 成品体验地址PathoInsight - 您的智能病理科研助手


1. 核心思维:为什么选择 Spec-driven?

刚开始了解到 Agent 制作,一开始简单的认为就是“打开 Coze 就拖节点,写个 Prompt 就上线”。而这种“拍脑袋”开发很容易导致后期逻辑混乱。
github中提到的模式Spec-driven ,其核心在于“先定规矩再动手”,参考 AI Code Guide 的最佳实践,可以将整个开发拆解为三步:

  1. The Interview:让 AI 扮演架构师,把我也没想清楚的需求“审”出来。
  2. The Spec:生成一份死磕细节的 PRD 和核心“宪法”(Constitution)。
  3. The Implementation:基于 Spec,在 Coze 中进行确定性的工作流编排。

2. 第一阶段:需求挖掘 (The Interview)

尝试利用一套通用的架构师 Prompt,让 AI 来反向拷问我。

🛠️ 通用模版 (可复制)

Role: 你是一位资深的 AI 产品架构师,精通 Agent 设计模式。
Task: 我有一个关于 [你的项目名] 的初步想法。请你对我进行“面试”,通过一系列追问,帮我理清以下细节:

  1. 目标用户是谁?核心痛点是什么?
  2. 输入数据的格式(PDF/图片/文本)?有哪些 Corner Case(极端情况)?
  3. 输出的严格格式要求(JSON Schema 或 Markdown)?
  4. 核心的约束条件(什么不能做)?
    Action: 请一次只问 1-2 个问题,引导我逐步完善需求,直到你认为可以生成 PRD 为止。

💡 实战复盘:
在我的项目中,AI 提出了一个我完全没想到的问题:“如果用户上传的是一篇纯算法的病理 AI 论文(如 MIL 架构),而不是临床病例,系统该怎么处理?”
这个问题直接促使我确立了 “双模式路由 (Dual-Mode Routing)” 机制——系统必须自动判断是“临床模式”还是“学术模式”,防止用看病的逻辑去解读算法论文。
❗️个人感受:需求挖掘的这一步十分重要!


3. 第二阶段:规格定义 (The Spec)

面试结束后,我让 AI 生成了一份“宪法”(Constitution),这成为了后续 Coze 开发的唯一真理。

🛠️ 通用模版 (可复制)

Task: 基于上述沟通,请为我生成一份详细的 Agent 开发规格书 (Spec)。
Content:

  1. Workflow Logic: 用伪代码描述数据流转逻辑。
  2. System Prompt (Constitution): 包含 Role, Constraints (负面约束), Workflow, Output Format。
  3. Edge Case Handling: 针对空输入、乱码、知识库未命中时的兜底策略。

📜 我的 PathoInsight 宪法片段:

Critical Constraints (宪法):

  1. 严禁移花接木:严禁使用【参考知识库】中的示例病例来回答用户问题。如果用户文件为空,必须报错,不能编造。
  2. 模式隔离
  • 遇到 学术论文:聚焦 Model Architecture, AUC, Dataset。
  • 遇到 临床报告:聚焦 Diagnosis, IHC Markers, Risk Assessment。

4. 第三阶段:架构设计与 Coze 实现 (The Implementation)

拿着 Spec,我在 Coze 里的开发就变成了“填空题”,而不是“作文题”。
(对于如何使用coze进行开发,现在已经有很多成熟的教程以及ai指导,大家可以自行学习与探索)

4.1 核心架构图

请添加图片描述

我的工作流包含三个关键的技术模块:

  1. 多模态数据汇聚层 (Data Merger)
  • 问题:用户可能上传 PDF、图片,也可能直接粘贴文本。Coze 的插件输出格式各不相同。
  • 解决:编写 Python Code 节点作为“数据中间件”。无论上游是 OCR 识别的文字、LinkReader 解析的文档,还是用户的 Query,都在这里被清洗合并为统一的 full_context 变量。
  1. 意图路由层 (Intent Router)
  • 问题:用户有时是“数据工程师”(要清洗 JSON),有时是“医生”(要看病),一套 Prompt 无法兼顾。
  • 解决:引入 Router 节点,通过关键词权重(如 JSON清洗 vs 诊断分析)将流量分发到两条完全独立的分支。
  1. 双模态推理层 (Dual-Mode Core)
  • ETL 分支:使用低 Temperature 的模型,专注于结构化抽取。
  • Analysis 分支:挂载 NCCN/WHO 知识库,开启 RAG(检索增强),专注于逻辑推理。

5. 实战踩坑与迭代 (The Pitfalls)

这一部分是我在开发过程中遇到的真实挑战,也是 Spec-driven 模式发挥作用的关键时刻。

坑一:大文件导致的“严重幻觉”

现象:在测试 ROAM 论文(11MB PDF)时,Coze 的 LinkReader 插件因超时返回了空内容。结果 LLM 为了完成任务,竟然根据知识库里的示例,编造了一个“子宫内膜癌”的病例分析。而这篇文章主要是针对胶质瘤病种。

解决 (Guardrails)
我回到 Spec 层面,在 Analyst 节点的 System Prompt 中追加了一条**“输入围栏”**:

Critical Constraint: 你必须首先检查【用户核心文件】是否为空。如果为空,立即熔断,输出:“无法读取文件内容(可能文件过大),请截取关键页面或粘贴文本。”

坑二:非结构化数据的“脏”文本

现象:医生手写的病理报告经常包含“同侧”、“异型性不明显”等模糊词,直接提取 JSON 容易丢字段。

解决 (Few-Shot)
我在 Prompt 中使用了 Few-Shot Learning(少样本学习),给模型展示了 3 个典型的“脏数据 -> 清洗后数据”的 Pair 对,并强制规定了 Unknown 值的填充逻辑。


6. 最终效果展示 (Showcase)

经过上述打磨,PathoInsight 现在能稳定处理 数据清洗、学术研读、临床校验 三类核心任务。大家可以直接复制下面的用例去体验。

场景 A:数据工程师模式 (JSON 清洗)

任务:将一段混乱的胶质瘤病理文本(包含非标准术语)清洗为标准 JSON,用于构建训练数据集。

👉 测试 Prompt:

我是数据工程师,请将以下病例数据清洗为 JSON 格式。

【原始记录】
患者 ID: GL-2024-089,右侧额叶占位。
病理描述:肿瘤细胞密度高,可见显著的微血管增生及栅栏状坏死。
免疫组化:GFAP(+), Olig-2(+), IDH1-R132H(-), ATRX(缺失), p53(>50%), Ki-67(40%).
分子检测:IDH1/2 Wildtype, TERT Mutant, EGFR Amplified, MGMT Unmethylated.
初步诊断:胶质母细胞瘤,WHO 4级。

✅ Agent 输出效果:
它会输出一段严格符合 Schema 的 JSON 代码。

  • 标准化:自动将 GFAP(+) 映射为 "Positive",将 IDH1-R132H(-) 映射为 "Wildtype"
  • 容错处理:自动忽略非关键的描述性文字,无需二次清洗即可入库。

场景 B:算法研究员模式 (学术研读)

任务:阅读一篇论文(Nature Machine Intelligence - ROAM 模型),提取核心架构参数与实验结果。

👉 测试 Prompt (建议粘贴论文核心文本):

我是算法研究员。请阅读以下文本,从技术角度分析:
1. ROAM 模型的架构特点是什么?
2. 它在 IDH 突变预测上的 AUC 是多少?

【论文片段】
To overcome limitations... we propose ROAM... utilizes the pyramid transformer to model both intrascale and interscale correlations...
Results: ROAM achieved an AUC of 0.886 for predicting IDH mutations...

✅ Agent 输出效果:

  • 架构解析:准确识别出 Pyramid Transformer、Intrascale/Interscale Attention 机制。
  • 指标提取:精准提取所需指标,且不会混淆“训练集”与“测试集”数据。

场景 C:临床医生模式 (逻辑校验 & 辅助诊断)

任务:模拟病理科医生场景,检查一份病理报告中的免疫组化结果分子分型是否存在逻辑冲突,并依据 WHO CNS 5 标准给出整合诊断建议。

👉 测试 Prompt:

我是病理科医生。请基于 WHO CNS 5 标准,对以下报告进行逻辑校验和预后分析。

【病理报告片段】
部位:左侧额叶
形态学:弥漫性胶质瘤,瘤细胞形态一致,可见核周空晕(煎蛋样特征)。
免疫组化:IDH1 R132H (+), ATRX (核表达保留), p53 (野生型), Ki-67 (10%).
分子病理(FISH):1p/19q 共缺失 (Co-deleted).

✅ Agent 输出效果:

  • 逻辑校验:Agent 识别出 IDH突变 + 1p/19q共缺失 + ATRX保留 是典型的 少突胶质细胞瘤 (Oligodendroglioma) 特征。
  • 整合诊断:输出推断结论 “Oligodendroglioma, IDH-mutant and 1p/19q-codeleted, WHO Grade 2”
  • 指南引用:会自动引用 NCCN 指南,提示该亚型对 PCV 化疗方案敏感,预后相对较好。
    (注:此功能依赖 RAG 检索,若知识库未覆盖特定罕见亚型,Agent 会触发围栏机制,提示“需进一步结合临床”而非瞎编。)

7. 总结

这次实战最大的感触是:AI 时代,PM 的文档能力(Spec)就是生产力。

  1. 架构决定上限:Router + Merger 的设计解决了多场景兼容问题。
  2. 围栏决定下限:Prompt 中的 Guardrails 是防止医疗 AI 产生幻觉的最后一道防线。

没问题!在 AI Agent 开发领域,把这些专业术语用好了,能瞬间提升你简历和博客的“含金量”,让面试官觉得你不仅会用工具,更懂背后的工程原理

以下是结合你的 PathoInsight 项目,为你整理的 5 个最核心的专业术语(话术已优化,可直接用于面试或写作):


8. 术语小结

1. Router (意图路由 / 分发器)

🤖 形象比喻:医院的分诊台护士
📖 简要定义
一种基于语义理解的控制机制。它接收用户的原始输入,分析其意图 (Intent),然后像交通指挥员一样,将任务分发给最合适的下游工作流处理。
💡 在项目中的应用

“我的系统不会傻乎乎地用一套逻辑处理所有问题。Router 会判断:如果用户发的是‘杂乱数据’,就分发给 Data Cleaner (ETL) 分支去清洗 JSON;如果用户发的是‘论文 PDF’,就分发给 Analyst (RAG) 分支去研读。这避免了‘拿手术刀切菜’的资源浪费。”

2. RAG (Retrieval-Augmented Generation / 检索增强生成)

🤖 形象比喻开卷考试
📖 简要定义
大模型(LLM)有时会胡说八道(幻觉),RAG 就是在让模型回答问题前,先去查阅外挂的知识库 (Knowledge Base),找到准确的参考资料,再结合资料生成答案。
💡 在项目中的应用

“为了防止模型瞎编病理诊断,我挂载了 NCCN 指南WHO 分类标准作为外挂知识库。模型在回答‘IDH 突变的预后’时,不是靠瞎猜,而是先检索 (Retrieve) 指南原文,再生成 (Generate) 靠谱的结论。”

3. Guardrails (围栏 / 安全护栏)

🤖 形象比喻:悬崖边的防护栏
📖 简要定义
在 LLM 输入或输出端设置的一套硬性规则过滤机制。它的作用是拦截不合规、不安全或无效的请求,防止 AI 产生幻觉、泄露隐私或输出有害内容。
💡 在项目中的应用

“针对 11MB 大文件读不到内容的 Bug,我设计了 Input Guardrails:一旦检测到输入内容为空,系统会触发熔断机制,直接报错‘无法读取’,而不是让模型根据幻觉去编造一个不存在的病例。”

4. Few-Shot Prompting (少样本提示 / 上下文学习)

🤖 形象比喻照猫画虎
📖 简要定义
在提示词 (Prompt) 中不只给指令,还给出 3-5 个具体的‘问题-答案’示例。大模型有极强的模仿能力,看了例子后,能迅速学会某种特定的格式或逻辑。
💡 在项目中的应用

“医生手写的病理报告格式千奇百怪。我在 Prompt 里放了 3 个 Few-Shot 示例,教模型把 (-) 映射为 Wildtype,把 +++ 映射为 Strong Positive。这样不需要微调模型,就能实现高精度的标准化清洗。”

5. ETL (Extract, Transform, Load / 数据清洗与转换)

🤖 形象比喻:把刚挖出来的脏土豆变成超市货架上的净菜
📖 简要定义
数据工程中的经典概念。

  • Extract (抽取):从 PDF、图片里把文字读出来。
  • Transform (转换):把乱七八糟的文字改成标准的 JSON 格式。
  • Load (加载):把洗好的数据存到数据库或发给用户。
    💡 在项目中的应用

“我的 Agent 本质上是一个智能化的 ETL Pipeline。它把非结构化的临床文本(脏数据),自动化地转化为结构化的 JSON 数据(净数据),直接喂给下游的深度学习模型训练。”


“本项目采用 Router-Branch 架构,基于用户意图将任务分流。在数据处理链路中,利用 Few-Shot Prompting 实现非结构化文本的 ETL 清洗;在科研分析链路中,结合 RAG 技术 引入外部指南,并配合 Guardrails 机制 有效抑制了长文本研读中的幻觉风险。”


碎碎念

  • 目前该项目还有很多需要进一步精进和完善的地方!继续加油!感谢大家看到这里!❤️

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐