凌晨两点,指令只有一句话:"帮我设计一个能结合锌离子的蛋白,用4个骨架,每个骨架6条序列。"六分钟后,屏幕上跳出三个数字:88.6、88.2、82.4——全部是高置信度的pLDDT。中间没有人点过一次"下一步"。RFDiffusion 吐出骨架,ProteinMPNN 自动把 24 条候选序列跑了个遍,Boltz-2 挨个验证,Qwen3.6-27B 挑出前三名并写好了改进建议。整条链路,从骨架到结构验证,零点击。

这不是调用哪家公司的蛋白质设计 API。这是一套完全长在自己内网 HPC 集群里的东西,代号 BioTender Assistant,是用 Claude Code 一行一行"手搓"出来的。这篇文章记录它是怎么被搭起来的——包括那些让人半夜想砸键盘的 bug,以及最后是怎么被 Claude Code 揪出来的。

【图1:BioTender Assistant 首页——左侧工具面板,右侧对话流】

01 先把家底盘清楚:三台机器,五个模型

动手之前先想清楚一件事:让语言模型"自己设计蛋白质",本质上不是训练一个新模型,而是把一堆各自独立的专业工具,用一个会规划、会调度的大脑串起来。工作台最终长这样——一个大脑,四件称手的工具:

(1)骨架从头生成:RFDiffusion,扩散模型生成蛋白骨架→RTX 4090 (2)序列逆向设计:ProteinMPNN,基于结构的序列优化→RTX 4090 (3)结构预测与验证:Boltz-2,端到端结构预测,输出 pLDDT→RTX 4090 (4)蛋白-配体复合物:OpenDDE,655M 参数联合结构预测→RTX 4090 自然语言交互:Qwen3.6-27B,本地部署,OpenAI 兼容 API → A100 80GB

Qwen3.6-27B 在整个系统里的角色很单纯:理解用户用中文描述的研究目标,规划该调哪个工具、按什么顺序调,再把工具吐出来的结果读懂、分析、给建议。四个计算工具各自只做一件事,谁都不需要"聪明",聪明的事交给大脑。

02 手搓的第一步:把工具翻译成模型看得懂的语言

Qwen3.6-27B 本身不知道什么是 RFDiffusion。要让它"会用"这些工具,第一步是把每个工具包装成 OpenAI 格式的 function calling 定义,交给模型去挑:

generate_backbone:RFDiffusion 骨架生成,支持 unconditional(给定残基数量随机生成拓扑)和 motif scaffolding(围绕已知功能位点设计新骨架)两种模式 ,design_sequences:ProteinMPNN 批量序列设计,对所有骨架都跑一遍,返回全局排序结果 ,validate_structure:Boltz-2 批量结构验证,接受一份序列列表,返回每条的 pLDDT ,predict_structure:Boltz-2 单序列预测,附带 3D 可视化。

后端用 FastAPI 撑起一组对应的接口:/api/backbone 启动骨架生成、/api/design 启动序列设计并自动遍历所有骨架、/api/validate 跑批量验证、/api/predict 做单条预测。每个任务都扔进 BackgroundTasks 异步执行,状态存在内存字典 JOBS 里,前端轮询 /api/status/{job_id} 拿进度,完事之后用 /api/result/{id} 下载 PDB 文件。整套设计的哲学很朴素:后端只管把重活甩给 GPU 节点,脏活累活留给大脑去调度。

03 让AI自己把链路串起来:零点击的野心

光有工具还不够,真正的难点是让 AI 在拿到一个结果后,自己判断"接下来该干什么",而不是每一步都要人点一下"继续"。这靠两轮对话接口撑起来:/api/chat 负责第一轮,Qwen 决定调用哪个工具,返回 tool_call 或者纯文本;/api/chat/resume 负责把工具结果喂回去,让 Qwen 决定是链式调用下一个工具,还是收工写总结。

一条完整的自动流程长这样。用户发一句"帮我设计一个结合锌离子的蛋白":

  1. Qwen 解析意图,先用一两句话说明设计思路,随即调用 generate_backbone

  2. 前端轮询直到骨架生成完成,把结果反馈给 Qwen

  3. Qwen 收到骨架后立即调用 design_sequences

  4. ProteinMPNN 对所有骨架批量设计完成,Qwen 挑出 score 最低的前三条,调用 validate_structure

  5. Boltz-2 批量验证完成,Qwen 生成综合分析——pLDDT 对比、改进建议

这条链路能不能真的"自动"跑下去,几乎全靠一份写得够狠的 SYSTEM_PROMPT。三条硬约束缺一不可:第一,先解释后执行——第一次调用工具前必须先用一两句话说明设计意图和参数选择的理由;第二,链式自动调用——拿到工具结果之后立刻调下一步,不等用户确认;第三,批量验证指引——明确要求从序列设计结果里挑 score 最低的三条,作为列表传进验证工具。没有这三条约束,模型要么调用一次就停下来等指令,要么一次只验证一条序列,整条流水线根本跑不完。

04 界面:暗色系+金色调

前端没有用任何框架,纯 HTML/CSS/JS 写成单文件 index.html,部署起来最省心。视觉上选了深色主题配金色调强调色,等宽字体展示序列这类数据,符合一个"实验台"该有的气质。

左侧固定侧边栏分三块:语言模型区显示 Qwen3.6-27B 的在线状态;计算工具区列出 Boltz-2、OpenDDE、ProteinMPNN、RFDiffusion,各自标注所在节点;工作流区放了几个常用流程的快捷入口。

【图2:左侧边栏——模型与工具状态面板】

首屏还摆了四张功能卡片,点一下就把提示词自动填进对话框,省去用户想措辞的功夫。

【图3:首页功能卡片区——结构预测、序列分析、蛋白质工程、从头设计】

对于不需要调用计算工具的普通问题,AI 直接用结构化中文流式回复,支持 Markdown 渲染。

【图4:AI 普通问答——解释 RFDiffusion 与 ProteinMPNN 的分工】

而一旦触发工具调用,对话流里会内嵌实时卡片:running 状态是旋转动画配进度文字(比如"骨架生成中……""ProteinMPNN 对 2/4 骨架设计完成……");success 状态换成绿色钻石图标,附结果摘要和下载链接。序列设计面板会把所有候选序列列出来,每条标注来自第几个骨架、score 多少;批量验证面板则是一张表格,pLDDT 数值配上置信度标签。

05 Claude Code踩坑记:六个让流水线卡死的瞬间

把这套系统从"能跑通一次"改造成"零点击全自动",中间踩的坑比想象中密集。以下六个是最典型的——每一个都靠 Claude Code 逐层排查日志、对照代码、定位到具体行才解决,记下来是因为它们背后的教训比 bug 本身更值钱。

▶ Bug 01:ESMFold需要的openfold,装不上 现象:pip 安装到的只是一个占位包,真正能用的 openfold 需要现场 CUDA 编译,在现有环境里根本装不起来,验证工具一调用就报模块找不到的错误。 解法:不再纠结装环境,直接把验证函数的函数体换成调用 Boltz-2——输出同样是 pLDDT,接口完全兼容,改一个函数体,问题就没了。

▶ Bug 02:AI明明说了话,用户却什么都看不到 现象:Qwen 在 thinking 模式下,会把调工具前的说明文字写进内部思考标签里,而后端在这一段直接硬编码返回了空字符串——结果就是"先解释后执行"这条约束表面上生效了,用户却完全看不到 AI 说了什么。 解法:把完整内容取出来,用正则去掉思考标签,剩下的纯文字部分才是真正要展示的说明。

▶ Bug 03:"零点击"承诺被自己的一个按钮打破了 现象:骨架生成跑完之后,前端会在对话区插入一个"下一步:ProteinMPNN 设计序列"的按钮,得等用户手动点一下才会触发下一步——这跟"零点击自动流程"的设计目标是直接矛盾的。 解法:把这个按钮插入逻辑整个删掉,骨架生成完成后直接把结果传给下一层处理函数,由它自动继续走下一步,没有中间商,也没有等待。

▶ Bug 05:四个骨架,只有一个被真正设计了序列 现象:序列验证工具的参数原本是单数形式,AI 只能选得分最低的一条去验证,没法对比不同骨架设计出来的质量差异;再往上查,序列设计函数本身只取了第一个骨架,四个骨架跑完 RFDiffusion 之后,只有第一个真正被 ProteinMPNN 设计了序列。 解法:两处一起改:工具参数从单数改成列表,后端逐条调用 Boltz-2 并按 pLDDT 降序返回;序列设计函数改成遍历所有骨架列表,对每个骨架独立跑一遍 ProteinMPNN,把结果合并起来,每条序列标注来自哪个骨架,再全局按 score 排序。

一点体会:这些 bug 有个共同点——没有一个是模型不够聪明导致的,全部出在"胶水层":CDN 版本、字节编码、依赖安装、字段解析、交互逻辑、参数形状。用 Claude Code 手搓 agent 的大部分时间,其实花在这些看起来最不起眼的接缝上;调度大脑越"聪明",越需要胶水层稳,一处松动就会让整条链路在用户完全无感的情况下悄悄断掉。

06 实测:一句话,六分钟,零次点击

改造完成后拿一条真实指令做验收:"帮我设计一个能结合锌离子的蛋白,用4个骨架,每个骨架6条序列。"全程约 6 分钟,AI 自主走完全部流程,中间没有一次人工干预:

骨架生成 · RFDiffusion · 4个100aa骨架PDB · 约90秒 序列设计 · ProteinMPNN · 24条序列(4骨架×6条),全局按score排序 · 约40秒 批量验证 · Boltz-2 · top-3序列pLDDT:88.6/88.2/82.4(均高置信)· 约3分钟 综合分析 · Qwen3.6-27B · 最优候选推荐+Motif Scaffolding改进建议 · 约30秒

AI 先用两句话解释设计思路——为什么选这个骨架长度、参数为什么这么定——随即自动触发 RFDiffusion,对话区弹出工具卡片,标注"RFDiffusion · 骨架生成 · 进行中……"。

【图5:AI 自主触发 Pipeline——解释意图后立即调用 generate_backbone】

07 接下来打算加什么

· Motif Scaffolding 流程:预置常见金属结合位点 PDB(锌指、铜蓝蛋白等),支持 motif 模式一键触发 · 并行验证:目前串行跑 Boltz-2,可以用 asyncio 配合多 GPU 并行提速 · 历史会话持久化:目前存在内存里,服务一重启就丢,打算换成 SQLite 或 Redis · 3D 结构查看器:已经引入了 mol* viewer,继续完善骨架生成结果的三维展示 · 接入更多工具:AlphaFold3、RoseTTAFold、ESM-2 之类,理论上都可以按同一套架构接进来 · 用户认证与配额:目前完全没有认证,后续要加 JWT 加计算配额管理

回头看这套系统最值钱的部分,是那条串起来的 SYSTEM_PROMPT,和被 Claude Code 一个一个揪出来的胶水层 bug。工具会变——RFDiffusion 换成别的骨架生成模型,Boltz-2 换成下一代结构预测器,架构本身几乎不用动。这大概就是"手搓 agent"和"调用别人 API"最大的区别:前者踩完坑之后,坑是自己的经验;后者出了问题,只能等别人发公告。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐