Orchidea Science
抗体研发科学算法引擎 —— Orchidea 平台的「科学计算层」。
把仪器产出的原始数据(NGS FASTQ、流式 FCS、SPR/BLI 传感图、质谱谱图)与 科研序列数据,转化为可被管理闭环消费的结构化结论(CDR 序列、效价、KD、 Tm、表位风险、群体比例、二级结构……)。
定位:LLM 是「调度者」,本引擎是「计算者」。凡涉及蛋白质折叠、结合动力学、 序列注释、群体门控等确定性计算,均由本引擎完成,而非交给语言模型。
2026-11 能力更新(v1.1.0)
- 结构预测:ESMFold(单序列端到端、逐残基 pLDDT)与 IgFold 真实适配
- 分子对接:DiffDock / AutoDock Vina 真实姿态搜索
- 免疫原性与注释:NetMHCpan 真实 CLI 调用、IgBLAST(AIRR)序列注释
- 存储:新增 S3 存储后端与测试
- 诚实降级:后端缺失或失败时如实回落并写入
warnings,绝不伪造
一、设计原则
| 原则 | 说明 |
|---|---|
| 离线优先 | 核心依赖仅 numpy + scipy,可在客户内网隔离区断网环境安装运行 |
| 后端可插拔 | 重型模型(IgFold / ESMFold / AlphaFold2 / NetMHCpan / DiffDock / pyopenms / FlowKit)作为可选后端;缺失时自动降级到内置轻量实现并显式告警,绝不伪造结果 |
| 零侵入 | 统一 EngineRegistry + MCP 工具对外暴露,业务侧无需改动核心包 |
| 可解释 | 每个引擎返回统一 EngineResult,携带 backend(结果溯源)、warnings(降级/近似说明)与 elapsed_ms |
| 序列保密 | 结构预测与序列分析全部本地化;客户序列不进入任何公有云 API |
二、引擎清单
| 引擎 | name | category | 内置能力 | 可选后端 |
|---|---|---|---|---|
| 序列分析 | sequence_analyze | sequence | 链型识别、CDR/FR 划分、分子量、等电点、GRAVY、稳定性指数 | Biopython / IgBLAST(真实注释:CDR/FR + germline) |
| 曲线拟合 | curve_fit | curvefit | ELISA 四参数(EC50/相对效价)、SPR-BLI 1:1 动力学(ka/kd/KD)、DSF 熔解温度 | — |
| 免疫原性 | immunogenicity | immunogenicity | MHC-I 表位打分、强结合筛选、表位簇、免疫原性风险分 | NetMHCpan(真实 CLI + -xlsfile 解析) |
| 分子对接 | docking | docking | 结合界面残基、接触对、埋藏面积估计、界面打分 | DiffDock / AutoDock Vina(真实姿态搜索) |
| 质谱 | mass_spectra | spectra | 找峰、去同位素、胰酶肽段匹配、序列覆盖度、糖型质量位移 | pyopenms |
| 流式 | flow_cytometry | cytometry | 矩形/多边形门控、群体频率、MFI、阳性率、四象限 | FlowKit |
| 可开发性 | developability | developability | 风险基序(脱酰胺/异构化/氧化/N-糖基化/DP/RGD/游离 Cys/焦谷氨酸)、疏水-电荷斑块、聚集倾向、四维风险分与综合可开发性评分 | — |
| 去风险突变设计 | mutation_design | design | 基于可开发性的定点突变建议 + 变体重评分 + 组合变体(不预测亲和力) | — |
| 人源化 | humanization | design | 最近人 germline 选择 + CDR 移植 + 人源化前后框架一致性 | OGRDB 真实人源 V 基因(下载→翻译→缓存,离线优先) / 外部 germline 库 |
| 亲和力成熟 | affinity_maturation | design | 副位(CDR)热点候选 + 保守/芳香替换;未接后端不预测亲和力 | FoldX(真实结合界面 ΔΔG,需复合物 PDB) |
| 结构预测 | structure_predict | structure | Chou-Fasman 二级结构、回转半径估计 | IgFold / ESMFold(均真实,产出 PDB + 逐残基置信度) / AlphaFold2 |
| 原始数据存储 | raw_store | storage | 内容寻址落盘、SQLite 索引、完整性校验(FASTQ/FCS/序列) | — |
统一契约:run(payload: dict) -> EngineResult。
二·补、原始数据存储层
方案要求「原始数据接入与存储」。io 层负责解析,storage 层负责落盘与检索, 二者共同构成原始数据闭环:
仪器原始文件 ──io 解析──▶ 结构化对象 ──storage 落盘──▶ 内容寻址 blob + SQLite 索引
│
path_for() ──▶ 交回 io/引擎 再解析(闭环)
- 内容寻址:payload 按
sha256存入blobs/<前2位>/<sha256>,相同内容自动去重。 - 记录独立:每次
put生成独立dataset_id(同内容不同样本互不覆盖)。 - 索引:
index.sqlite3(纯标准库 sqlite3),记录种类/名称/大小/记录数/创建时间/自定义元数据。 - 完整性:
verify重算 sha256 比对,可检出落盘篡改。 - 默认根目录:
$ORCHIDEA_SCIENCE_STORE或~/.orchidea/science。
from orchidea_science.storage import RawDataStore
from orchidea_science.io.fcs import read_fcs
store = RawDataStore()
meta = store.put_fcs("sample.fcs", meta={"project": "SAIYEE-01"})
fcs = read_fcs(store.path_for(meta.dataset_id)) # 存储 → 分析 闭环
三、安装
# 核心(离线可用,仅 numpy + scipy)
uv pip install -e .
# REST 网关
uv pip install -e ".[api]"
# 重型后端(按需,隔离区用内网源离线安装)
uv pip install -e ".[bio]" # Biopython
uv pip install -e ".[structure]" # torch(IgFold / ESMFold 依赖)
uv pip install -e ".[spectra]" # pyopenms
uv pip install -e ".[cytometry]" # flowkit
# 开发
uv pip install -e ".[dev]"
要求 Python ≥ 3.9。
四、快速开始
4.1 命令行
# 列出全部引擎
orchidea-science-cli engines
# 查看某引擎能力
orchidea-science-cli describe curve_fit
# 运行引擎(ELISA 效价)
orchidea-science-cli run curve_fit --payload '{"model":"elisa_4pl","points":[[0.1,0.06],[0.5,0.9],[1,2.1],[5,2.95]]}'
# 序列分析
orchidea-science-cli run sequence_analyze --payload '{"sequence":"EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS"}'
# 可选后端可用性
orchidea-science-cli backends
# 人源 germline 参考库运维(离线优先):预联网预热缓存 / 导出便携 JSON
orchidea-science-cli germline fetch --source ogrdb:human # 下载并缓存(人类 IGH/IGK/IGL V 基因)
orchidea-science-cli germline list --cache ~/.cache/orchidea-science/germline
orchidea-science-cli germline export --source ogrdb:human:IGH --out germline_igh.json
# 启动 REST 网关
orchidea-science-cli serve --host 0.0.0.0 --port 8100
4.2 REST API
curl -s localhost:8100/health
curl -s localhost:8100/api/v1/engines
curl -s -X POST localhost:8100/api/v1/engines/curve_fit/run \
-H 'Content-Type: application/json' \
-d '{"payload":{"model":"elisa_4pl","points":[[0.1,0.06],[0.5,0.9],[1,2.1],[5,2.95]]}}'
4.3 Python
from orchidea_science import registry
result = registry.run("curve_fit", {
"model": "elisa_4pl",
"points": [[0.1, 0.06], [0.5, 0.9], [1, 2.1], [5, 2.95]],
})
print(result.ok, result.backend, result.data.get("ec50"))
4.4 MCP(供 Agent 调用)
python3 -m orchidea_science.mcp.server
暴露工具:science_list_engines / science_describe_engine /
science_run_engine / science_backends。在 orchidea-director 中登记后,
工具名形如 mcp__science__science_run_engine。
五、离线 / 隔离区部署
隔离区(离线内网 GPU 服务器)
├── orchidea-science(本包)—— 纯 CPU 引擎 + 结构预测(GPU 可选)
├── 内网 PyPI/conda 镜像(devpi / Nexus)
└── 模型权重 + 参考数据库(经「交换区」下载杀毒后摆渡)
要点:
- 一次性离线导入:依赖包与模型权重在交换区下载、杀毒后摆渡进隔离区,之后永久断网。
- 内网私有源:隔离区内以
pip install --index-url http://<内网源>安装。 - 分级启用:一期只启用纯 Python 引擎(曲线拟合、序列分析);二期上轻量结构后端(IgFold / ESMFold);三期上 AlphaFold2 全量与分子设计。
六、目录结构
orchidea-science/
├── orchidea_science/
│ ├── core/ 核心框架(引擎抽象、注册表、后端探测、异常、执行护栏 guard)
│ ├── io/ 原始数据接入(FASTQ / FCS / FASTA)
│ ├── storage/ 原始数据存储(内容寻址 blob + SQLite 索引)
│ ├── engines/ 12 个科学算法引擎
│ ├── viz/ 可视化视图层 + 内置演示页(Chart.js / 3Dmol.js)
│ ├── utils/ 配置中心(config)与结构化日志(logging)
│ ├── api/ REST 网关 + 认证 + 限流 + 指标 + 中间件 + 生命周期
│ ├── mcp/ stdio MCP Server
│ ├── cli/ 命令行工具
│ ├── service.py 服务层:护栏 + 日志 + 统一错误契约(唯一调用入口)
│ └── registry.py 默认引擎装配(12 引擎)
├── tests/ 单元与集成测试
├── docs/ 部署指南 / 运维手册
├── deploy/ K8s 清单与部署说明
├── Dockerfile 多阶段镜像(非 root + 健康检查)
├── docker-compose.yml
├── .env.example
├── .github/workflows/ CI(多版本矩阵 + 部署工件校验)
├── SPEC.md 引擎接口规范
└── pyproject.toml
七、平台集成(Orchidea Director)
科学引擎以 stdio MCP Server 形式接入 Orchidea Director,工具名形如
mcp__science__science_run_engine。已作为内置默认上游端点登记在
orchidea-director/bridge/gateway/src/upstream-mcp.ts:
| 字段 | 值 |
|---|---|
| name | science |
| mode | stdio |
| command | python3 |
| args | ["-m", "orchidea_science.mcp.server"] |
| cwd | $ORCHIDEA_SCIENCE_DIR 或工作区 orchidea-science/ |
| timeoutMs | 30000(结构预测等重计算放宽超时) |
可用 ORCHIDEA_MCP_ENDPOINTS 覆盖或禁用;端点不可达时仅不贡献工具,不影响其余服务。
八、生产运行
网关已具备生产级防护与可观测性(详见 docs/deployment.md 与 docs/operations.md)。
生产就绪状态、能力边界与上线前检查表见 PRODUCTION_READINESS.md; 版本演进记录见 CHANGELOG.md。
8.1 环境变量
前缀统一为 ORCHIDEA_SCIENCE_:
| 变量 | 默认 | 说明 |
|---|---|---|
HOST / PORT | 0.0.0.0 / 8100 | 监听地址与端口 |
API_KEY | 未设置 | 设置后启用认证(X-API-Key 或 Bearer);未设置则开放并告警 |
RATE_LIMIT_PER_MIN / RATE_LIMIT_BURST | 600 / 60 | 令牌桶速率与突发容量 |
ENGINE_TIMEOUT_MS | 30000 | 单次引擎执行超时,超时返回 ENGINE_TIMEOUT |
MAX_PAYLOAD_BYTES | 8388608 | 请求体/载荷上限,超限 413 / PAYLOAD_TOO_LARGE |
LOG_LEVEL / LOG_JSON | INFO / true | 日志级别与 JSON 输出 |
CORS_ORIGINS | 空 | 逗号分隔的允许来源 |
STORE | ~/.orchidea/science | 原始数据存储根目录 |
MAX_WORKERS | 16 | 引擎执行线程池上限 |
8.2 安全与限流
- 认证:仅当设置
API_KEY时启用;比较使用常量时间算法。 - 限流:按客户端(API Key 优先,否则 IP)令牌桶;限流先于认证,未认证洪泛同样受限。
- 护栏:请求体上限(413)+ 引擎执行超时(线程池受控,避免耗尽)。
8.3 可观测性
| 能力 | 入口 |
|---|---|
| 健康总览 | GET /health |
| 存活探针 | GET /health/live(恒 200) |
| 就绪探针 | GET /health/ready(依赖异常时 503) |
| Prometheus 指标 | GET /metrics(science_* / http_*) |
| 运行配置(脱敏) | GET /api/v1/config |
| 请求追踪 | 每个响应带 X-Request-ID 与 X-Response-Time-ms,并注入 JSON 日志 |
8.4 部署
# 本地
orchidea-science-cli serve --port 8100
# Docker
docker build -t orchidea-science:1.0.0 .
docker run -p 8100:8100 -e ORCHIDEA_SCIENCE_API_KEY=$(openssl rand -hex 24) orchidea-science:1.0.0
# Kubernetes
kubectl apply -f deploy/k8s/
生产务必设置 API_KEY(启动日志会在未设置时告警),并按 docs/operations.md
配置告警规则。
8.5 可视化与三维结构
内置可视化演示页:启动服务后打开 http://127.0.0.1:8100/viz。页面用 Chart.js 渲染曲线/散点/棒状谱/区段轨道,用 3Dmol.js 渲染三维分子。
| 入口 | 说明 |
|---|---|
GET /viz | 演示页(静态壳,数据接口仍受认证/限流保护;页面内可填 API Key) |
GET /api/v1/viz/views | 可用可视化场景清单 |
GET /api/v1/viz/{engine}?scenario= | 用内置 demo 载荷生成视图模型 |
POST /api/v1/viz/{engine} | 用自定义载荷生成视图模型(供桌面端携带本次真实结果) |
三维分子结构:结构预测已接入 IgFold(权重随包内置、离线可跑,CPU 约 1s/条)与 ESMFold(fair-esm + openfold,单序列端到端,CPU 约 20s/条·120aa,自动兼容新版 openfold 的 Linear 命名)。当 structure_predict 返回真实 PDB 时,演示页的 3D 查看器会渲染 cartoon 结构(spectrum 着色);无后端时 pdb=null 并显示明确提示(绝不伪造坐标)。
深链:orchidea_science.viz.deeplink(engine, payload) 可生成
/viz#engine=<e>&payload=<base64url>,让桌面端把「本次真实结果」(含 IgFold PDB)
直接带到演示页渲染。
九、测试
python3 -m pytest -q