基因编辑器的特异性,决定了它在临床和工业场景里敢不敢被用。CRISPR 系统设计时最怕的就是 guide RNA 与脱靶位点结合,一旦脱靶,表型不可控,实验全部白做。传统方法通常用序列比对打分,再叠加实验规则,但这种方法本质上是在一维序列上做判断,忽略了三维空间中真实的碱基接触关系。北大、华东师大等团队提出的 ContactSeek,选择用 AlphaFold 3(AF3)预测得到的接触概率,来重新评估基因编辑器的结合特异性。这是一条很直接的技术路线:把结构预测模型引入基因编辑设计流程,把“接触概率”变成可量化的特异性特征。
这篇文章不打算讲玄幻的概念。我会围绕 ContactSeek 的几个核心问题展开:它到底解决什么问题、底层用到了 AF3 的什么输出、本地复现需要准备哪些环境、如何把单条序列测试扩展成批量筛选、以及最容易被卡住的资源占用和模型许可证问题。如果你是做计算生物学、基因编辑设计、或者给实验室搭分析流程的工程师,这篇文章可以直接收藏。先说明一个前提:目前公开信息主要来自论文和项目发布页,具体代码接口要以实际 Release 为准。下面的命令都是通用模板,需要按你的项目目录调整。
1. 核心能力速览
先给一张速览表,把 ContactSeek 的关键信息放在前面。这样你不用读完整篇文章,也能快速判断这个项目适不适合自己。
| 能力项 | 说明 |
|---|---|
| 项目名称 | ContactSeek |
| 提出单位 | 北京大学、华东师范大学等 |
| 底层模型 | AlphaFold 3(AF3) |
| 核心输入 | guide RNA 序列、靶标 DNA 序列、潜在脱靶位点、编辑酶蛋白质序列 |
| 核心输出 | 接触概率矩阵、特异性打分、候选 guide RNA 排序 |
| 主要应用 | CRISPR-Cas9、碱基编辑器、Prime Editing 等基因编辑器的特异性评估与序列设计 |
| 相对优势 | 从一维序列打分升级到三维结构接触信息,可能捕获结构环境导致的特异性差异 |
| 硬件门槛 | 高,AF3 推理通常需要较大显存 GPU,具体以官方要求为准 |
| 启动方式 | 命令行脚本,一般不是一键 WebUI |
| 接口 API | 看项目 Release,大概率以本地脚本/工作流形式提供,而非固定 HTTP 服务 |
| 批量任务 | 理论支持,通过输入多条 guide RNA 序列批量输出打分 |
| 适合人群 | 基因编辑设计、蛋白质结构预测、生物信息学流程开发研究者 |
从这张表能看出,ContactSeek 不是“装完就能用”的工具,它依赖 AlphaFold 3 的预测结果。因此,你的硬件环境、AF3 依赖库和模型参数权重,会直接决定整个流程能不能跑通。
2. 原理拆解:为什么“接触概率”能增强特异性
2.1 传统基因编辑特异性打分的局限
CRISPR guide RNA 与 DNA 靶标的结合,涉及 RNA-DNA 异源双链的形成,以及 Cas 蛋白的结构构象变化。传统打分方法,比如碱基错配计数、热力学稳定性预测、或者基于实验数据的加权打分,本质上都在做“序列上下文”的近似。它们能覆盖常见错配规则,却很难处理 DNA 甲基化、染色体可达性、PAM 序列附近的局部结构,以及 guide RNA 与编辑酶结合后的空间位阻效应。
这些信息只有放到三维结构语境里才看得清。比如某个脱靶位点虽然序列相似度不高,但恰好位于编辑酶结构上容易接触的区域,就有可能在空间上被结合;反过来,一个序列上看起来很匹配的位点,可能因为空间位阻或结构扭曲,实际结合效率很低。传统打分模型很难捕捉这种非局部效应。
2.2 AlphaFold 3 输出接触概率的意义
AlphaFold 3 不再只是预测单链蛋白质结构。它能够对蛋白质、DNA、RNA、配体等复合物做联合结构预测,并在推理过程中输出残基和碱基之间的接触概率。这个接触概率描述了预测结构中两个位置在空间上处于接触状态的可能性,而不是简单的序列相似度。
ContactSeek 的思路,就是把这些接触概率当成“结构层面的结合信号”。具体来说,给定一个 guide RNA 序列和一个候选靶标序列,ContactSeek 会构建包含编辑酶、guide RNA、DNA 靶标的复合物输入,让 AF3 去预测这个复合物的结构,然后提取 RNA-DNA 界面的接触概率,并汇总成一个特异性分数。分数越高,说明该 guide RNA 与候选位点的结合在结构上越可信。
2.3 ContactSeek 整体流程
从流程上看,ContactSeek 是一个桥接工具,它本身不重新训练 AF3,而是把 AF3 的输出转化成基因编辑设计可用的特征。
- 输入准备:整理 guide RNA 序列、目标位点序列、潜在脱靶序列、编辑酶序列。
- AF3 预测:为每个“guide RNA + 靶标 + 编辑酶”组合生成复合物结构预测,并输出接触概率。
- 特征提取:从预测结果中提取 RNA-DNA 接触概率矩阵,计算接触热点区域。
- 特异性打分:对比靶标位点与脱靶位点的接触概率差异,生成特异性排序。
- 候选筛选:输出排序结果,供实验人员选择高特异性 guide RNA。
这个流程看起来不复杂,但每一步都有很多工程细节。尤其是 AF3 推理的输入格式、接触概率文件的位置和解析方式,需要根据实际项目的文档来确认。
3. 适用场景与使用边界
3.1 适合什么场景
ContactSeek 最适合的场景,是在实验之前做一轮计算预筛选。比如你要为某个基因设计 5 条 guide RNA,传统方法会先用序列比对软件找候选,再用实验验证。加入 ContactSeek 后,可以先把候选列表扩到几十条,用接触概率排序,把结构上明显不合理的候选过滤掉,减少实验试错成本。
更具体地说,以下场景价值明显:
- 碱基编辑器优化:碱基编辑器通常需要把脱氨酶融合到 Cas 蛋白上,融合后的结构变化会影响编辑窗口和特异性。使用 ContactSeek 可以评估不同融合构型下的接触差异。
- Prime Editing 引导序列设计:Prime Editor 需要设计更长的 pegRNA,其中有反转录模板和 PBS 序列,结构关系更复杂,适合用接触概率做判断。
- 脱靶风险评估:给定一批潜在脱靶位点,ContactSeek 可以输出接触概率排序,帮助优先验证风险最高的位点。
3.2 不适合什么场景
也要把边界说清楚。ContactSeek 的计算成本很高,不适合在超大基因组范围内做全基因组脱靶筛选,那种任务还是用序列比对工具先粗筛更合理。另一个边界是,接触概率基于结构预测,不等于真实实验结合效率。基因编辑系统在细胞内还受到染色质状态、DNA 损伤修复通路、蛋白降解等因素影响,这些是结构预测覆盖不到的。
此外,如果你使用的编辑系统没有可用的高置信度结构域,或者 guide RNA 与靶标的相互作用过于依赖动态构象,AF3 的静态接触概率可能无法给出准确判断。这时候需要结合分子动力学模拟或实验数据校准。
3.3 版权、伦理与安全边界
必须强调:基因编辑是受法规和伦理约束的领域。ContactSeek 只能用于计算模拟和学术研究,不能直接作为体内或临床实验的决策依据。如果你需要用真实细胞实验进一步验证,必须有相关资质和授权。涉及人类基因组、临床样本、可遗传编辑时,更要严格遵守所在地法规和伦理审查要求。工具本身只输出分数,但它影响的下游实验可能带来不可逆后果,使用前务必明确边界。
4. 环境准备与前置条件
4.1 操作系统与基础软件
ContactSeek 的上游 AF3 主要面向 Linux 环境。Windows 和 macOS 上不是完全不能用,但会多很多兼容问题。建议使用 Ubuntu 20.04 或 22.04 这类主流 Linux 发行版。
基础软件清单如下:
| 软件 | 用途 | 建议 |
|---|---|---|
| Linux 系统 | 运行环境 | Ubuntu 20.04/22.04 |
| NVIDIA 驱动 | GPU 计算 | 535 或更高版本,具体看 AF3 要求 |
| CUDA | GPU 计算库 | 12.x 系列,按 AF3/JAX 版本选择 |
| Conda 或 Mamba | Python 环境管理 | 隔离依赖,避免污染系统环境 |
| Python | 运行脚本 | 3.9 或 3.10 较稳妥 |
| Git | 拉取代码 | 最新稳定版即可 |
| Docker | 可选容器方案 | AF3 官方提供 Docker 镜像时用 |
4.2 AlphaFold 3 依赖与数据库
AlphaFold 3 不是一个小包。运行它需要准备好多个数据库文件,包括蛋白质序列库、结构模板库、MSA 数据库等。这些数据库下载下来通常占用大量磁盘空间,几百 GB 是常见量级。具体需要哪些数据库和占用大小,要以 AF3 官方文档为准。
如果你只需要复现 ContactSeek 的少量测试案例,可以不下载完整数据库,而是用论文或项目仓库提供的测试数据。先跑通流程,再决定是否准备全量数据库。
4.3 GPU 与显存建议
AF3 推理对显存的要求比较高。从公开经验看,结构较小的复合物需要 16GB 以上显存,复杂的多链复合物可能需要 24GB 或更多。实际显存占用取决于序列长度、模型参数和推理配置。ContactSeek 本身的后处理脚本通常不占用太多显存,大头在 AF3 推理环节。
预算有限的情况下,可以先拿短序列测试。如果本地显卡不够,可以用云 GPU 实例,但要确认数据合规,尤其涉及基因序列时要注意数据安全。
4.4 通用环境检查清单
在开始安装前,先执行一遍环境检查:
# 检查 GPU 是否可用 nvidia-smi # 检查 Python 版本 python --version # 检查 Conda 是否存在 conda --version # 查看磁盘剩余空间 df -h如果nvidia-smi能正确显示显卡型号和驱动版本,说明基础 GPU 环境可用。如果 Python 版本低于 3.8,建议先用 Conda 创建新环境,而不是直接升级系统 Python。
5. 安装部署与启动方式
5.1 获取代码与模型权重
ContactSeek 是否已经公开完整代码,本文写作时还没有统一结论。稳妥的做法是先去项目发布页或论文补充材料看有没有 GitHub 仓库链接,然后克隆到本地。AlphaFold 3 的模型参数权重通常也需要单独申请或下载,许可证会限制使用范围,不能随意转发。
拿到代码后的目录结构可能类似:
ContactSeek/ ├── README.md ├── environment.yml ├── contactseek/ │ ├── run_inference.py │ ├── parse_contact.py │ └── score.py ├── scripts/ │ ├── prepare_fasta.py │ └── run_af3_batch.sh ├── test_data/ │ └── example_input.csv └── configs/ └── default.yaml这只是一个典型结构,实际以仓库为准。
5.2 Python 环境创建
官方一般会提供一个environment.yml。用 Conda 创建环境:
# 进入项目目录 cd ContactSeek # 根据 environment.yml 创建环境 conda env create -f environment.yml conda activate contactseek如果environment.yml缺失,可以手动创建最小环境:
conda create -n contactseek python=3.10 conda activate contactseek pip install numpy pandas pyyaml注意,AF3 依赖的 JAX 版本与 CUDA 版本强相关。安装出错时,优先检查 JAX、CUDA、驱动三者是否匹配。
5.3 准备输入序列文件
ContactSeek 的输入一般是以 FASTA 或表格文件组织的序列组合。可以准备一个 CSV 文件,每行包含一条 guide RNA 和一个靶标位点:
guide_id,guide_sequence,target_sequence,edit_enzyme g01,ACGTTGGCACTGATACGTAG,TGCACGTTGGCACTGATACGTAGGG,SpCas9 g02,ACGTTGGCACTGATACGTAC,TGCACGTTGGCACTGATACGTAGGG,SpCas9具体列名要根据项目文档调整。如果项目只接受 FASTA,可以用脚本把 CSV 转换成 FASTA。
5.4 运行 AF3 推理
ContactSeek 的核心计算通常分成两步:先跑 AF3,再跑打分。AF3 的通用运行方式如下:
python run_af3.py \ --json_path input/example.json \ --model_dir /path/to/weights \ --output_dir output/af3_results \ --jackhmmer_n_cpu 8 \ --n_gpus 1这里的input/example.json是 AF3 输入格式,需要包含复合物链信息和序列。如果你不熟悉 AF3 输入格式,先看官方示例文件。--jackhmmer_n_cpu控制 MSA 搜索使用的 CPU 核数,核数越多速度越快,但内存也会上升。
5.5 运行 ContactSeek 打分
AF3 跑完后,在输出目录里会生成结构文件和预测模型文件。ContactSeek 要读取这些输出,提取接触概率并打分:
python contactseek/score.py \ --af3_output output/af3_results \ --input_csv input/guide_target_pairs.csv \ --output_csv output/contactseek_scores.csv如果项目提供了配置文件,也可以在 YAML 里指定各项参数:
af3_output_dir: output/af3_results input_csv: input/guide_target_pairs.csv output_csv: output/contactseek_scores.csv contact_threshold: 0.5 contact_window: 10 score_method: difference这里的contact_threshold和contact_window是我给出的示例参数,实际项目可能完全不同,需要看文档。
6. 功能测试与效果验证
6.1 测试一:单条 guide RNA 接触概率输出
先跑最小案例。选择一条已知工作良好的 guide RNA 和对应靶标,目标是把 AF3 + ContactSeek 流程整体跑通。
操作步骤:
- 准备一条 guide RNA 和靶标序列,写入 CSV。
- 调用 AF3 推理,记录运行日志。
- 调用 score.py,读取输出。
- 检查输出 CSV 中是否包含接触概率列和特异性分数列。
预期结果:
- 流程无报错。
- 输出文件不为空。
- 目标位点的接触概率明显高于随机位点。
判断标准很简单:能连续跑通两步,且输出数字是有限浮点数而不是 NaN,就说明基础流程没问题。
6.2 测试二:脱靶位点对比
ContactSeek 的核心是特异性。你需要选一个已知脱靶位点,与正确靶标位点对比。
输入示例:
guide_id,guide_sequence,target_sequence,label g01,ACGTTGGCACTGATACGTAG,TGCACGTTGGCACTGATACGTAGGG,on_target g01,ACGTTGGCACTGATACGTAG,TGCACGTTGGCACTGATACGTACGG,off_target运行同一个流程,对比两个位点的得分。理想情况下,on_target得分高于off_target。如果结果相反,要排查是 AF3 预测问题、接触概率提取问题,还是打分函数设计问题。
6.3 测试三:批量 guide RNA 筛选
把几十条候选 guide RNA 放到 CSV 中,循环运行 AF3 和评分脚本。这里建议写一个独立的 shell 脚本管理批量任务,并对结果做日志记录:
#!/bin/bash # 批量运行示例,按实际路径调整 for row in $(seq 1 20); do python run_af3.py --json_path input/case_${row}.json \ --model_dir /path/to/weights \ --output_dir output/af3_results_${row} \ --n_gpus 1 > logs/af3_${row}.log 2>&1 python contactseek/score.py \ --af3_output output/af3_results_${row} \ --input_csv input/case_${row}.csv \ --output_csv output/scores_${row}.csv >> logs/score_${row}.log 2>&1 done批量任务一定要加日志。任何一步失败,你都能从日志里定位原因,而不是从头跑一遍。
6.4 验证标准与常见失败
验证成功可以从三个维度看:
- 计算稳定性:批量过程中没有内存溢出、显存溢出、进程被杀。
- 特征合理性:接触概率与已知生物学知识不冲突,比如 PAM 区域附近有接触热点。
- 排序有效性:与已有实验数据或文献结果对比,排序相关性合理。
常见失败包括:AF3 输出目录结构与 ContactSeek 预期不匹配,导致解析失败;接触概率定义的坐标体系不一致,提取到错误链;输入序列命名不规范,导致 AF3 复合物链关系错位。遇到这些问题,首先打印中间文件结构,再对照项目文档逐字段确认。
7. 接口 API 与批量任务
7.1 是否提供 HTTP API
从标题和项目形态看,ContactSeek 更像一个科研计算工具,而不是对外开放的 Web 服务。如果项目没有提供 HTTP API,不建议自己强行封装成 Web 服务。更合理的做法是把它嵌入 Snakemake 或 Nextflow 工作流。
但如果项目仓库中确实提供了api.py或server.py,则可以考虑本地启动一个简单服务。通用的启动方式如下:
python api.py --host 127.0.0.1 --port 8080启动后,用 Python 调用:
import requests url = "http://127.0.0.1:8080/predict" payload = { "guide_sequence": "ACGTTGGCACTGATACGTAG", "target_sequence": "TGCACGTTGGCACTGATACGTAGGG", "edit_enzyme": "SpCas9" } response = requests.post(url, json=payload, timeout=300) print(response.status_code) print(response.json())这个接口路径和字段是我举例的,不是真实存在的。使用前必须查阅项目自带接口文档,按实际字段发送请求。
7.2 批量任务设计
如果没有 API,批量任务就靠脚本循环。工程化建议:
- 每一条输入生成一个独立子目录,避免文件互相覆盖。
- 每次运行记录开始时间、结束时间、退出码。
- AF3 推理失败时自动跳过并写入 failed 列表,而不是中断整个批量任务。
- 每隔一段时间清理临时文件,防止磁盘写满。
一个简单的 Python 批量调度器示意:
import os import subprocess import time cases = [ {"id": "g01", "json": "input/case_1.json", "out": "output/af3_1"}, {"id": "g02", "json": "input/case_2.json", "out": "output/af3_2"}, ] failed = [] for case in cases: cmd = [ "python", "run_af3.py", "--json_path", case["json"], "--model_dir", "/path/to/weights", "--output_dir", case["out"], "--n_gpus", "1", ] print(f"[{time.strftime('%H:%M:%S')}] running {case['id']}") result = subprocess.run(cmd, capture_output=True, text=True) if result.returncode != 0: print(f"failed: {case['id']}") failed.append(case["id"]) continue print("done. failed cases:", failed)这个脚本没有做超时控制和资源限制,实际使用时需要按批量规模和服务器配置补上。
8. 资源占用与性能观察
8.1 AF3 是资源消耗大头
ContactSeek 的后处理只占很小一部分计算资源,真正的瓶颈是 AF3 推理。AF3 在推理前要做 MSA 搜索,这个过程是 CPU 密集型,序列越多,搜索越慢。进入模型推理后,GPU 显存成为限制因素。
需要重点观察的指标有三个:
- GPU 显存占用
- CPU 使用率
- 磁盘读写速度
观察命令:
# 实时查看 GPU 占用 watch -n 2 nvidia-smi # 查看 CPU 和内存开销 top # 查看进程存活情况 ps -aux | grep run_af3如果显存接近上限,优先降低序列长度或减少批量大小。如果 CPU 一直跑满但 GPU 利用率很低,说明 MSA 搜索拖慢了整体进度,可以多给几个 CPU 核,同时检查多线程参数是否被正确传入。
8.2 降低资源占用的方法
- 使用预计算 MSA:如果多次运行包含相同序列,缓存 MSA 可以省掉重复搜索。
- 限制序列长度:ContactSeek 只需要关注 guide RNA 和靶标区域,没必要把整个基因序列都丢给 AF3。
- 降低采样次数:AF3 会生成多个结构样本,减少 seed 数量可以显著降低推理时间,但也会降低接触概率估计的稳定性。
- 拆分子任务:把一个大的批量任务拆成多个小批次,避免一次性占满所有显存。
8.3 性能评估日志
建议把每次运行的关键指标写入日志文件,方便后续回溯。比如:
case_id,af3_time_sec,gpu_mem_max_mb,cpu_cores,status case_1,187.4,18732,8,ok case_2,221.6,20104,8,ok后面需要扩展数据量时,这份日志能帮你估算总的计算成本和排队时间。
9. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| AF3 启动报 CUDA 错误 | CUDA、驱动、JAX 版本不匹配 | 运行nvidia-smi和python -c "import jax; print(jax.lib.xla_bridge.get_backend())" | 按 AF3 官方要求的 CUDA 版本重装依赖 |
| 显存不足 | 输入序列过长或 batch 太大 | 查看nvidia-smi显存占用 | 缩短序列、降低 seed 数、分批运行 |
| MSA 搜索卡死 | 数据库路径错误或网络不可用 | 查看是否有远程数据库请求 | 本地导入数据库,检查数据库路径权限 |
| AF3 输出目录为空 | AF3 推理未成功完成 | 查看 AF3 日志 | 确认输入 JSON 格式,检查输出路径可写 |
| ContactSeek 解析不到接触概率 | 接触概率文件格式与预期不一致 | 打印 AF3 输出文件结构 | 按项目文档调整解析路径 |
| 批量任务部分失败 | 单条序列输入格式问题 | 查看 failed 列表和日志 | 修正输入文件,重跑失败样本 |
| 打分结果全为 NaN | 序列长度过短或接触概率缺失 | 检查输入序列是否有效 | 过滤过短序列,调整接触窗口 |
| 表现不如预期 | 接触概率阈值或打分函数选择不当 | 用已知实验数据做校准 | 调整阈值,或参考论文的校准方法 |
这些问题里,最常见的是环境版本和输入格式问题。建议把每一步的输出都落盘,不要只依赖终端打印。终端日志会滚动覆盖,文件日志才是可回溯的。
10. 最佳实践与使用建议
10.1 第一次跑通用小数据
不要一上来就跑全基因组脱靶评估。先从 5 条以内序列测试,确认 AF3 输出、ContactSeek 打分、文件路径都正确,再逐步扩大规模。小数据跑通后,把整个环境固化成 Conda 环境文件或 Docker 镜像,避免后续重新搭建时踩版本坑。
10.2 保持数据目录整洁
以下目录结构值得参考:
project/ ├── input/ │ ├── raw.csv │ └── af3_json/ ├── output/ │ ├── af3_results/ │ ├── scores/ │ └── logs/ ├── scripts/ └── db/ └── af3_databases/输入、输出、脚本、数据库分开,不要混在一起。批量任务规模大时,每个样本单独一个子目录,方便失败重跑。
10.3 结合实验数据校准
ContactSeek 输出的分数是计算指标,不是实验结论。在正式使用前,建议准备一组已知的特异性正负样本,把 ContactSeek 分数与实验表型做一次对比。找到一个合适的阈值后,再用于大规模筛选。没有校准的阈值只是经验值,不能直接当作决策依据。
10.4 从工程角度考虑任务调度
如果实验室有多卡服务器或集群,直接用 Slurm 把批量任务提交到队列:
# sbatch submit_contactseek.sbatch #SBATCH --job-name=contactseek #SBATCH --partition=gpu #SBATCH --gres=gpu:1 #SBATCH --cpus-per-task=16 #SBATCH --time=24:00:00 module load cuda/12.1 conda activate contactseek python run_contactseek_batch.py --config configs/batch_config.yaml这样可以避免手动管理 GPU 资源,任务失败后也可以方便地重调度。
10.5 声明数据和模型许可
AlphaFold 3 模型参数有自己的使用条款,ContactSeek 项目代码也可能有开源许可证。复制、分发、商用前,先查看LICENSE文件。基因序列数据如果是未公开的人类样本数据,还要遵守数据保护规定,不能直接上传到第三方云平台。
11. 总结与下一步
ContactSeek 最值得尝试的地方,是它把 AlphaFold 3 的接触概率和基因编辑特异性结合在了一起,提供了一个从一维序列打分升级到三维结构判断的计算方向。对于每天都在设计 guide RNA 的人来说,这种思路值得跟进。
如果你要在自己数据集上复现,最先应该验证的功能是:单条 guide RNA 能否正确跑通 AF3 推理和接触概率提取。只要这一步通了,后续批量筛选、参数校准、与其他工具集成都只是脚本工程问题。
最容易踩的坑有两个:一是 AF3 的输入格式和数据库依赖,二是 ContactSeek 与 AF3 输出文件之间的解析接口。前者决定你能不能跑起来,后者决定你的结果可不可信。把这两个环节的日志和中间文件保存好,就能省掉大量排查时间。
后续可以继续扩展的方向包括:把 ContactSeek 接入现有的 guide RNA 设计工具链、做更多编辑酶变体的特异性对比、或者和分子动力学模拟联合使用,补充动态构象信息。建议保持关注论文仓库的更新,看到有用数据格式变化及时调整自己的流程。