如果把一段 DNA 直接贴给普通大语言模型,模型看到的通常不是生物学意义上的片段,而是通用文本分词器拆出的零散字符组合。它也许能谈论基因,却不等于能稳定地对原始序列做计算。
Hugging Face Bio 与研究伙伴在 2026 年 10 月 22 日发布的 Carbon-X,尝试把这两件事接到同一个 14.8B 参数解码器里:普通文字仍用 Qwen3 的 BPE 词表,DNA 则按连续 6 个碱基组成的 6-mer 编码。研究者可以在一条消息中同时给出序列、变异位置和自然语言问题,模型也可以同时输出解释与 DNA。
现在值得关注的不只是一个新模型名称。官方同时提供了权重、训练与评测代码、GGUF 量化文件;llama.cpp 在 10 月 19 日发布的 b11742 又加入了对应的混合分词器支持。本地运行的链路因此已经形成。不过,Carbon-X 仍是研究起点:项目明确写着尚未经过临床验证,团队也向 WIRED 表示还没有完成湿实验验证。
核心不是“懂 DNA”,而是先把 DNA 表达对
Carbon-X 只有一个 decoder,没有先把 DNA 送进独立编码器再与文本对齐。输入最终都是同一串 token,区别发生在入口:
自然语言 ── Qwen3 BPE ──┐
├── 同一 token 序列 ── Carbon-X decoder
DNA 序列 ── 6-mer ──────┘2
3
DNA 的标准字母只有 A、C、G、T。固定取 6 个位置,共有 4^6 = 4096 种组合,因此可以为每一种 6-mer 分配一个确定 token。例如:
ACGTACGATTCA
↓
<dna> ACGTAC GATTCA </dna>2
3
这样,12 个碱基只需要两个内容 token,而不是让文本分词器碰运气。Carbon-X 还为长度不能被 6 整除的序列准备了 1,364 个短尾 token,并加入 <dna>、</dna>、<oov> 标记;计入对齐到 128 倍数的保留位后,DNA 侧词表共有 5,515 个 token,完整词表为 157,184 个。
可以把它理解成给同一位翻译员两本字典:遇到英语就翻普通词,进入 <dna> 区间后改查 6 个碱基一组的专用字典。优点是文字和序列能直接进入同一上下文;代价是分组边界、未知字符和最长输入都会成为模型行为的一部分。
我复现了分词器,边界比演示更重要
我把官方模型仓库固定在提交 539ad36,加载其中的 HybridDNATokenizer,并固定它指定的 Qwen3 基础词表版本。下面这段最小代码实际运行通过;执行位置是模型仓库根目录,它只下载基础分词器,不下载 14.8B 模型权重:
from tokenizer import HybridDNATokenizer
tokenizer = HybridDNATokenizer(tail="pad_n")
text = "Describe: ACGTACGATTCA"
ids = tokenizer(text)["input_ids"]
print(tokenizer.convert_ids_to_tokens(ids))
print(tokenizer.decode(ids))2
3
4
5
6
7
8
在固定源码下,等价测试得到的关键结果是:
ACGTACGATTCA自动变成<dna> ACGTAC GATTCA </dna>;小写输入也会先转为大写。- 显式输入
<dna>ACGTACGATT</dna>时,最后 4 个碱基编码成GATTNN这个短尾 token,解码后仍精确还原为GATT。长度为 1 到 5 的尾部都能往返还原。 - 用空格排版的
A C G T A C G A T T C A会先合并,再得到相同的两个 6-mer。 - 传入
auto_dna_tags=False后,同一序列不再走 DNA 词表,而会被文本 BPE 拆成AC、GT、AC、G、ATT、CA。
最容易忽略的是歧义碱基。自动检测允许长度至少为 12、且 IUPAC 歧义字符不超过 20% 的片段进入 DNA 模式;但真正组成 6-mer 的仍只能是 A、C、G、T。实测 ACGTACNATTCA 的后六位会整体变成 <oov>,解码也只能得到 ACGTAC<oov>,原始碱基信息已经丢失。相反,歧义比例过高的片段可能根本不会被自动识别为 DNA,而是落回文本 BPE。
因此,正式流水线不能只检查“输入是不是一串碱基字母”。至少要记录自动标签结果、<oov> 数量和过滤规则;涉及变异位点时,最好显式加 <dna> 标签并在分词后做一次可逆性检查。
本地运行已经可行,但版本不能猜
官方 GGUF 仓库给出的本地路径要求 llama.cpp b11742 或更新版本。这是首个支持 Carbon HybridDNATokenizer 的版本;旧版可能成功加载 GGUF,却用错误方式切分 DNA。它不是普通的“版本旧一点、速度慢一点”,而是输入本身已经变了。
当前可选文件从 9.6 GB 的 Q4_K_M 到 29.7 GB 的 BF16。项目方推荐 15.8 GB 的 Q8_0,并报告其在两项复测中的分数与原模型接近;这些数字来自项目团队的一次采样评测,不是独立验证。运行前应先确认版本:
llama-server --version
llama-server -hf HuggingFaceBio/Carbon-X-GGUF:Q8_0 \
-ngl 99 -c 40960 --jinja \
--chat-template-kwargs '{"enable_thinking": false}' \
--temp 0.6 --top-p 0.95 --top-k 20 --min-p 0 \
--port 80802
3
4
5
6
7
这段启动命令来自官方 GGUF 说明,我没有在本次环境下载 15.8 GB 权重,也没有宣称完成端到端推理或 GPU 性能测试。已经独立执行的是 Python 分词器及上述边界样例。若要在生产环境采用,还应把真实序列、量化版本、随机参数和 llama.cpp 提交一起固定,并比较输出稳定性,而不只是确认服务能启动。
另一个常见误读是上下文长度。模型配置接受 40,960 token,但中期训练序列长度为 8,192 token,约对应 49 kbp DNA,后训练样例短于 16k token。项目方明确表示,没有充分评估远长于训练样例的输入。把 40,960 直接乘以 6,再宣传成可靠处理 24 万碱基,会把“接口允许”误写成“能力经过验证”。
评测数字该怎样看
Carbon-X 模型卡报告:在五项 DNA 基准上关闭 thinking 后,平均分为 66.7%,高于其列出的 Qwen3-14B 基线 39.8%,接近 GPT-6.1 Sol 的 67.5%。其中既有文献数据集,也有团队新建的 FrontierVEP 和 NextBase;指标又混合了准确率、F1 与逐碱基准确率,平均值适合看总体方向,不等于每种生物学任务都有相同提升。
更关键的是,这些结果由模型团队自己生成,部分闭源模型通过 API 测试,提示词、采样和成本假设都会影响比较。WIRED 报道也指出,目前没有湿实验来确认模型预测的实际可靠性。把基准领先写成“能够判断某个变异是否致病”,跨过了从计算基准到临床证据的鸿沟。
对使用者,更有意义的验证顺序是:
- 先用公开基准复现分词、提示模板和得分;
- 再用未参与训练、带明确来源与时间切分的数据做盲测;
- 与现有专业工具和人类专家基线比较,而不是只比通用聊天模型;
- 最终仍由实验、统计与临床流程验证关键结论。
适合什么,不适合什么
Carbon-X 目前更适合作为研究助手或候选生成器:快速比较一批局部序列、为变异优先级提供第二视角、把序列问题与文献背景放进一次对话,或者在不把敏感数据上传到第三方 API 的前提下做原型验证。本地部署有助于控制数据去向,但隐私仍取决于日志、缓存、访问权限和应用层设计,不会因为模型在本机就自动解决。
它不适合直接作出医疗决策,也不应成为唯一的致病性判断、药物设计或基因编辑依据。长序列超出训练分布、含大量 N 的组装结果、坐标和链方向不清楚的输入,都可能让看似流畅的解释失去依据。模型能生成 DNA,也不代表生成序列具备预期功能、安全性或可合成性。
Carbon-X 真正值得关注的地方,是它把 DNA 与自然语言连接成了一条已经可以检查、量化和本地部署的开源链路:6-mer 让序列表达更紧凑,统一 decoder 让问题和序列能够互相条件化,GGUF 与 llama.cpp 则把试用门槛降到单机范围。
但它也把边界暴露得很清楚:一个 N 可能让整个 6-mer 变成 <oov>,旧运行时可能静默分错 token,最大上下文不等于有效生物学范围,基准分数更不等于实验结论。是否值得上手,不取决于“能与 DNA 聊天”这句口号,而取决于你的任务能否接受这些限制,并且有没有一套独立验证流程。
💬 评论