
最近AI科学发现的圈子里一个案例被翻来覆去地讨论有人用Claude去分析噬菌体DNA结果Claude从中发现了一套类CRISPR新酶系统消息还提到Anthropic方面用同样的模型重跑了10次却一次都没复制出这个结果。先别急着下“AI科研不靠谱”或者“工作人员不会用AI”这种结论这事真正有价值的地方在于它把AI辅助科学发现的三个关键问题一次性摆在了桌上AI到底是怎么“发现”的、为什么复现会失败、以及怎样让这种发现变得可以信任。作为常年做生物信息分析和LLM应用的人我想从发现、复现、验证这条链路把这件事彻底拆一遍也想把那些能直接照着用的工程化方法分享出来。1. 先把这个事件拆开噬菌体里的“类CRISPR新酶系统”到底是怎么来的1.1 类CRISPR不是CRISPR但比CRISPR更稀缺CRISPR-Cas系统大家都不陌生细菌和古菌用一小段一小段的间隔序列记住入侵噬菌体的DNA再由Cas核酸酶在RNA引导下精准切割目标。因为这个机制天然具备“可编程”属性Cas9、Cas12、Cas13这些蛋白早就被改造成了基因编辑工具。但自然界里的Cas蛋白远不止商用的那几种尤其在宏基因组、噬菌体、转座子这些“边缘地带”还藏着大量序列上差异很大、功能上相近的远缘同源物。所谓的“类CRISPR新酶系统”指的就是这类候选基因簇它的组成逻辑与经典CRISPR类似比如附近有重复-间隔阵列、有核酸酶结构域、有RNA结合模块但和已知Cas家族的序列同源性很低无法用常规BLAST直接捞出来。噬菌体DNA里出现这种系统为什么让人兴奋简单说细菌用CRISPR打噬菌体而噬菌体一直在偷学宿主基因来反制。大型噬菌体尤其喜欢从宿主基因组里“薅羊毛”经常携带各种免疫相关基因甚至会把宿主的Cas基因片段搬进自己的基因组然后在重组压力下演化出全新的催化组合。所以噬菌体并不是“垃圾序列”而是一个天然的新酶库。问题是它的基因密度高、序列短、注释覆盖差恰恰是传统分析流程最不擅长处理的区域。1.2 Claude在发现流程里担任的角色根据流传的版本Claude在这次发现里并不是像BLAST那样直接接受序列比对而是更像一个能理解脚本输出、阅读注释表格、并综合文献知识提出假设的“分析搭档”。比如你把一段噬菌体基因组序列或GFF注释文件丢给它它会顺着上下文去检查这里有没有短串联重复重复附近有没有一个注释信息贫乏、但拓扑结构可疑的蛋白编码框这个蛋白的预测结构是否有核酸酶折叠的潜质这正是LLM的独特之处Claude在预训练时吸收了海量生物学文献、数据库说明、论坛讨论和代码示例它不擅长直接“比对”序列但擅长把知识碎片重新组合成可检验的假设。它可能不会告诉你某个蛋白与Cas12a有20%的序列一致性但它会提醒你“这个位置的基因簇结构很像CRISPR应当仔细验证”。第一次发现能成功大概率就是这种推理路径被完整走通了先观察到重复结构再顺藤摸瓜找到候选效应蛋白。1.3 为什么第一遍能成功我必须强调LLM的“成功发现”和传统算法的成功不是一回事。传统算法只要参数、数据库、数据不变同一份输入重跑一百遍结果都一样。但LLM生成的是路径不是答案。第一遍能成功往往依赖了几条幸运路径对话上下文里已经累积了足够多线索、用户问了一个足够开放又足够聚焦的问题、外部工具刚好返回了关键比对结果甚至只是某一次随机采样把某个有希望的假设放在了输出靠前的位置。也就是说初始成功更像“灵感闪现”而不是稳定复现的方法。这也能解释为什么同一个模型、同一个数据换个人换个对话可能就找不到了。我们不能因为一次成功就神话AI也不能因为十次失败就否定AI。真正需要做的是把“灵感”背后的条件一项项固定下来让它从偶然变成工程。2. 常规流程为什么看走眼这类发现天生就不在“数据库比对”的射程里2.1 噬菌体基因组的“暗物质”属性跑过病毒宏基因组的人应该都有体会噬菌体基因组的注释结果里经常有20%到50%的蛋白编码基因被标成“hypothetical protein”。这不是因为那些蛋白不存在而是因为数据库里根本没有相似序列或者相似序列被注释为“未知功能”。噬菌体基因组本身又小、又紧凑基因常常相互重叠启动子和终止子信号也和细菌不完全一样。Prokka这类注释软件默认阈值往往偏向保守短于某个长度的开放阅读框直接就被忽略一些真实且有功能的微型蛋白就这样丢失了。如果类CRISPR候选效应蛋白恰好只有200多个氨基酸又在基因簇边缘被注释为“假设蛋白”完全正常。传统筛选流程的第一道关卡是“有没有注释”实际看到的是“没有注释”于是直接丢弃。Claude这样的模型反而不会被注释字段绑架它会读上下文、读周围基因的预测功能、读重复序列结构然后把这些原本孤立的信号串起来。2.2 远缘同源与“折叠相似但序列不同”的难点比注释缺失更麻烦的是远缘同源。很多新效应酶与已知Cas蛋白的序列一致性可能连15%都不到但三维折叠却高度相似。BLAST这类基于线性序列相似的工具有一个天然盲区它找的是“字母排列相似”而进化保守的往往是结构功能域不是氨基酸字母本身。HMM profile能改善一些但它依然依赖已知家族的多序列比对对一个全新的、还没有人建profile的家族无能为力。近年来大家开始用AlphaFold2/ColabFold预测所有候选蛋白的结构再通过Foldseek或TM-align把预测结构与PDB里的Cas核酸酶结构做全局比对。这是发现“折叠同源但序列远缘”新酶的主流思路。Claude无法直接跑AlphaFold但它知道这个思路知道结构域数据库的局限也理解“序列上找不到结构上也许能找到”的逻辑。因此在分析时它会把“候选蛋白似乎富含正电荷残基”“可能存在HTH结构域”这些模糊特征与类CRISPR的文献模式联系在一起。常规管线单独看每条信号都不够显著LLM却擅长把弱信号叠加起来形成假设。2.3 阈值设高设低都是坑做序列筛选的人都经历过阈值纠结。把BLAST E值阈值设到1e-10确实干净但会丢掉所有真正的远缘同源物设到1e-3能召回更多候选但每次分析都会收获几百个假阳性。类CRISPR新系统藏在中间地带它可能有一个结构域的E值在1e-5附近看似“可接受”但对应蛋白长度只有300个残基覆盖率又低。没有经验的工程师一般不会把它列为高优先级于是这个候选就在“守门阶段”被干掉了。反过来LLM没有固定阈值它会在阅读完整段序列特征后做一种模糊打分。这种模糊性既是优势也是风险。优势在于不会因为单个指标不达标就放弃候选风险在于它可能过度解读随机特征给出一个看似合理、实际经不起验证的“幻觉发现”。所以AI提出候选之后必须回到结构预测、系统发育、实验验证这些硬标准上去。3. 10次重跑全落空的真正原因你复现的其实是对话不是结果3.1 随机性不等于唯一变量上下文才是说到复现失败大家第一反应是“模型随机采样”。这确实是因素之一但往往不是主要因素。Anthropic这类API默认的temperature并非固定值如果重跑时用的是默认对话模型每次采样不同输出自然漂移。但真正致命的是上下文丢失第一遍发现时用户可能和Claude持续对话了一个多小时里面包含了对序列的逐段讨论、对可疑区域的圈定、对Blast结果的人工解读。到了复现阶段这些上下文全部没了重跑者只把最终任务“帮我找类CRISPR系统”再发一次。模型等于从零开始走一条完全不同的思考路径得不出同样结论非常正常。换句话说你第一次得到结果时模型是在一段很长的“思维历史”上工作重跑时你让它在没有历史的情况下徒手发明那条路径。这不是AI失效而是我们没复现对话历史。3.2 提示词的暗示会制造“确认偏误”复现时的提示措辞也可能导致模型走向错误方向。如果复现者看过第一次的答案很容易在提示里写“请验证是否存在类CRISPR酶系统”。这种措辞本身就包含了期望的结论模型会顺着暗示去“找证据”而不是客观探索所有可能。结果它可能输出一个听起来很像结论、实际上是对已知答案的想象性展开——出现“幻觉式确认”。这也是为什么我向来反对在AI分析中直接告诉模型“你认为答案是X请验证”尤其是还处于探索阶段时。更隐蔽的是“锚定”如果重跑时把第一次发现的候选区域坐标也写进提示模型可能会把注意力限定在那个坐标附近忽略其他可能的但更弱的信号。第一次发现是一个开放搜索的结果第二次被锚定成一个局促的通道两者当然不同。3.3 工具链和第三方数据没有一起复现如果第一遍分析过程中Claude实际调用了BLAST、HHpred、NCBI数据库或者某个表格文件而复现时只给它原始序列文本那么变量就更多了。LLM内置的知识是静态的它对具体基因序列的“内在推理”能力有限真正的计算支持来自外部工具。工具返回的排名、阈值、数据库版本都会改变后续推理。很多会话式AI工具包括Claude Code这类能执行命令的环境会让模型自己决定何时运行什么命令。复现时如果不把工具调用序列、版本、参数全部固定下来模型每跑一遍都可能选择不同的检索路径结果自然不会一致。你要复现的不是一个答案而是一整套分析行为链。3.4 怎么提高复现成功率先把变量锁死这里我整理了一张实际可用的对照表建议做AI科研任务时直接按这个思路操作。复现失败的现象潜在真实原因工程化对策换会话就找不到目标上下文丢失导出完整会话JSONL存档中间推理同一提示输出漂移采样温度过高或版本变化固定模型版本temperature设为0或接近0复现时模型开始“胡说”提示词包含期望答案去掉引导性结论改用开放探索式提问候选区域前后不一致数据切片或截断不同对输入文件做哈希校验用统一预处理脚本工具结果不可比BLAST/HHpred库版本不同锁定数据库版本与工具参数多次跑出不同但都“合理”多解空间过大使用多提示模板集成投票取交集候选这张表不是理论是我在实际上手复现AI科研结果时一条条踩出来的。4. AI出的候选如何“坐实”从FASTA到湿实验的完整验证链路4.1 先做序列级过滤和重复序列扫描AI给出的候选通常是一个“坐标范围”或“基因ID列表”。拿到之后第一件事不是发朋友圈而是做序列级验证。我会先用minced或PILER-CR跑一遍目标区域看看是否真的存在CRISPR阵列——也就是那种由短重复单元和间隔序列交替构成的结构。没有重复阵列就不能叫“类CRISPR系统”至少不能叫完整系统。接着检查候选基因是否完整有没有起始密码子、终止密码子有没有被错误截断GC含量是否异常。再跑CDD、InterProScan、BLASTx做结构域和同源搜索。这一阶段的E值、覆盖率、结构域注释都要记录在案。注意这里不要因为一次比对结果不好就直接枪毙候选因为类CRISPR系统的新颖性恰恰体现在比对结果边缘。你需要的是一个“有待结构验证”的候补名单而不是一个“已确认”的结论。4.2 结构预测、远程同源搜索和系统发育序列层面通过后立刻进入结构阶段。我通常会用ColabFold对候选蛋白做AlphaFold2预测然后用Foldseek把预测结构在PDB或专门的Cas蛋白结构库里搜索。如果找到可比的核酸酶结构域再计算TM-score。TM-score大于0.5属于同一个折叠家族0.7以上基本可以认为是同源结构。之后构建系统发育树把候选蛋白放进已知Cas家族的大背景里看位置。注意区分“结构类似”和“功能等效”有些蛋白有核酸酶折叠但可能只能非特异切割或者需要额外亚基才能工作。如果候选蛋白自成一个独立支旁边是已知的Cas12类核酸酶那就有文章可做如果它完全孤立在树外则要更加谨慎。4.3 体外切割与体内干扰实验的判定标准计算验证做到顶候选还是“潜在”的只有实验报告能给它转正。体外实验一般是这样把候选蛋白表达纯化合成与候选CRISPR阵列对应的引导RNA再把靶标DNA或RNA按预期切割位点设计好。混合反应后用凝胶电泳看是否出现预期大小的切割条带。阳性对照用已知活性的Cas酶阴性对照用突变失活的候选蛋白跑在同一块胶上。体内实验则更接近真实应用场景把候选系统构建进大肠杆菌导入带有靶序列的质粒或者直接用噬菌体感染。如果表达了系统的菌株对靶标噬菌体出现明显抗性同时序列分析证实靶标被切割这才算“类CRISPR新酶系统”得到初步证明。整套验证至少需要几周到几个月时间。这也是我判断AI发现是否“有价值”的核心标准它能不能把发现链路的后期成本大幅下降。Claude的价值不在“直接告诉你这是真的”而在于让假说空间收敛把科研人员从大海捞针变成重点排查。5. 把AI变成稳定科研队友的实操清单5.1 给每次AI分析建立“运行档案”在科研里你不写实验记录就会被骂用AI做科研不写运行档案同样不应该。每次分析前我都要求至少记录这几项模型名称和版本、temperature/top_p参数、系统提示词、用户输入的数据文件哈希、完整对话导出文件、外部工具版本和数据库日期。哪怕只是用网页版做探索性分析我也会截屏保存关键轮次。没有这些信息任何后续“复现失败”都无从排查。一个小技巧对输入DNA序列或GFF文件算一个SHA256哈希直接把哈希写进提示词既能让模型知道数据版本也能让后人快速确认用的到底是不是同一份文件。5.2 用脚本固定温度、模型版本和数据哈希Anthropic API并没有开放seed参数所以想降低随机性我会把temperature设为0同时用多个提示变体做重复实验。下面是一段非常简单的Python示例控制模型版本、读取固定提示文件并把输出与数据哈希一起落到JSONL里。import hashlib import json import time from anthropic import Anthropic client Anthropic(api_keyYOUR_API_KEY) prompt open(prompt_v1.txt).read() data_hash hashlib.sha256(open(phage_data.gff, rb).read()).hexdigest() prompt_variants [ prompt, prompt \n请从结构特征角度再次检查候选区域。, prompt.replace(探索所有区域, 优先检查未注释区域), ] results [] for idx, p in enumerate(prompt_variants): resp client.messages.create( modelclaude-3-5-sonnet-20241020, max_tokens4096, temperature0, top_p1, messages[{role: user, content: p}], ) results.append({ variant: idx, model: claude-3-5-sonnet-20241020, data_hash: data_hash, output: resp.content[0].text, timestamp: time.time(), }) with open(run_results.jsonl, w, encodingutf-8) as f: for rec in results: f.write(json.dumps(rec, ensure_asciiFalse) \n)把这段逻辑做成固定的分析脚本之后每次跑都是一个可追溯的“实验事件”。我自己是把脚本和数据一起放进Git仓库托管每次分析的提示、输出、工具输出全部一并提交。这样就算后来发现结论站不住脚也能回头看看是哪一步出了问题。5.3 一个可用的提示模板框架经验告诉我能让Claude稳定产出候选假设的提示必须同时包含角色设定、明确输入格式、具体要求、禁止事项。下面这个模板我在很多分析场景里都试过效果比“帮我找找”稳定得多。你是一位经验丰富的微生物基因组学分析师。我会给你一份噬菌体基因组的GFF注释文件和对应的DNA序列。请重点关注以下任务识别可能的CRISPR阵列结构短串联重复与间隔序列交替区域。找出阵列附近的蛋白编码基因尤其是被注释为“hypothetical protein”或“unknown function”的基因。根据蛋白长度、结构域特征、序列特征判断哪一个蛋白最可能是核酸酶候选。如果发现候选请说明你的推理依据并明确指出哪些证据来自我提供的数据哪些来自你的背景知识。禁止你编造数据库检索结果禁止在没有证据的情况下给出“一定存在”的结论。这个模板的要点在于“禁止编造数据库检索结果”虽然模型不一定总能完全遵守但它会显著降低幻觉输出。另外一个关键是要求模型把“数据内证据”和“背景知识”分开这能避免把预训练知识里的案例误当成当前数据的分析结果。5.4 最少要过的三道交叉验证关单一提示、单一模型、单次运行的阳性结果我会只当作假设。我建议至少做三道验证第一用三个不同措辞的提示模板跑同一份数据候选区域取交集第二如果条件允许用另一个模型比如GPT系列、Gemini跑同样的数据看是否指向类似的基因簇第三把计算验证链路完整走一遍包括重复序列扫描、结构预测、远程同源搜索。只有三道关都过了再考虑进入湿实验。这个事件里“重跑10次全错过”大概率就是缺少了其中一道关的固定条件。把AI当灵感源没毛病但灵感源必须接上实验方法和工程化流程否则下次它依然会给你惊喜再下次依然让你空手而归。我自己日常用Claude分析序列时前几次也反复踩“换个会话就找不到结果”的坑。后来强制自己记录完整会话、固定模型版本和提示模板并规定每个阳性结果至少跑三次变体踩坑率才明显降下来。这个案例给我的最大启发不是AI能不能做科研而是我们把AI当同事用的时候得像对待人类实习生一样给它留文档、留数据、留复现路径。没有这些再聪明的模型也只能给你一次性的灵感。下次再看到“AI发现了什么”的新闻先别急着激动问一句“把条件锁死它还能复现吗”这一问比任何争论都有价值。