1. 空间单细胞蛋白组学锁定无痕修复靶点:Visium/CODEX 数据整合到底难在哪
空间单细胞蛋白组学,说白了就是既要知道“有哪些细胞”,又要知道“它们在组织里站在哪、挨着谁”。Visium 给你转录本的空间分布,CODEX(PCF)给你单细胞级别的蛋白原位定量,scRNA-seq 给你大尺度的细胞亚群发现能力。三者叠在一起,才能回答一个关键问题:口腔粘膜为什么能无痕修复,而面部皮肤却容易留疤。
我试过把这三种数据塞进同一条分析流水线,最直观的感受是:数据本身不难拿,难的是“对齐”。Visium 的 spot 是 55 微米级别的混合信号,CODEX 是单细胞级别的蛋白通道,scRNA-seq 是解离后的悬浮细胞。三者的分辨率、坐标系、细胞命名体系都不一样。你要做的第一件事不是跑聚类,而是建立一套统一的细胞标签映射表。
具体来说,scRNA-seq 定义了 9 种成纤维细胞簇,CODEX 在蛋白水平识别出 20 个细胞集群。这两套命名怎么锚定?靠的是标志蛋白。比如 scRNA-seq 里高表达Axl的 Fibroblast 4 簇,在 CODEX 里对应的是 AXL 蛋白高信号的成纤维细胞集群。这个锚定过程需要你手动核对标志基因和对应蛋白,不能全交给自动注释。
另一个坑是空间邻接分析。KNN 算法算的是细胞质心之间的距离,但 CODEX 的细胞分割质量直接决定质心准不准。如果分割把两个细胞合并成一个,KNN 结果就会把“相邻”算成“同一细胞”,后续的 AXL-FAK 空间逆相关分析就全歪了。所以分割后一定要做一轮人工抽检,看 DAPI 通道和膜标志物的分割边界是否吻合。
Visium 这边的问题在于基因和蛋白的对应。Visium 测的是Axl和Ptk2(FAK 的编码基因)的 mRNA,CODEX 测的是 AXL 和 FAK 蛋白。mRNA 和蛋白的表达量并不总是一一对应,尤其是 FAK 这种磷酸化修饰后才有功能的蛋白。所以 Visium 只能给你“趋势”,不能给你“结论”。真正的原位定量证据必须来自 CODEX。
把这些数据整合起来,你需要一个统一的配置骨架来管理路径、参数和模型调用。下面这套config.toml就是我在实际项目里反复调整后留下来的结构,你可以直接拿去改路径和参数。
2. TaoToken 前置:统一 Key 与 API 通道怎么接
在跑空间组学分析的时候,你可能会用到一些需要调用大模型能力的环节,比如自动生成细胞类型注释的候选标签、批量整理靶点列表、或者用自然语言描述来辅助筛选候选通路。这些环节如果每个工具都单独配一套 API Key,管理起来很乱。TaoToken 的做法是给你一个统一的 Key,通过同一个 API 通道去调用不同的模型。
官网入口在这里:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=。进去之后先注册账号,然后在控制台里生成 API Key。这个 Key 就是你后面所有配置里要填的凭证。
拿到 Key 之后,你需要确认两件事:Base URL 和 Model ID。Base URL 是https://taotoken.net/api,注意这个地址后面不加 UTM 参数,直接写就行。Model ID 取决于你要调用的模型,比如你要用 Claude 系列做代码辅助,就填对应的模型标识;要用 GPT 系列做文本整理,就换另一个标识。具体可用的模型列表在控制台的模型对话页面能看到。
如果你用的是 Claude Code 做编码辅助,配置方式稍微不同。Claude Code 需要你设置环境变量或者配置文件来指向自定义的 API 端点。TaoToken 提供了对应的接入文档,路径在 doc 页面里。你按照文档把 Base URL 和 Key 填进去,Claude Code 就能通过 TaoToken 的通道去调用模型。
对于长期做空间组学分析、需要反复调用模型来辅助注释和筛选的场景,Coding Plan 可能更划算。它提供的是包月或包量的调用方式,不用每次单独计费。你可以在 console 页面里看到具体的套餐选项。
这里要提醒一句:TaoToken 只是一个 API 通道,它不替代你的分析工具。你的 Visium 数据处理还是在 Seurat 或 Scanpy 里跑,CODEX 分割还是在 QuPath 或 HALO 里做,TaoToken 只是帮你把需要模型能力的那些环节统一到一个 Key 上。
3. 可复制配置:config.toml 骨架与 settings 片段
下面这套config.toml是我在整合 Visium、CODEX 和 scRNA-seq 数据时用的骨架。你可以直接复制,然后把路径改成你自己的。
# config.toml - 空间单细胞蛋白组学分析配置骨架 [project] name = "oral_regenerative_target_screening" species = "Mus musculus" reference_genome = "mm10" timepoint = "POD4" # 伤后第4天,组织重塑关键期 control = "UW" # 未受损对照 [paths] # Visium 空间转录组数据路径 visium_dir = "/data/spatial/visium/POD4" visium_control_dir = "/data/spatial/visium/UW" # CODEX/PCF 蛋白组数据路径 codex_dir = "/data/protein/codex/POD4" codex_panel = "/data/protein/codex/panel_41markers.csv" # scRNA-seq 数据路径 scrnaseq_dir = "/data/scrnaseq/fibroblast_clusters" # 输出路径 output_dir = "/results/spatial_integration" [visium] spot_size_um = 55 min_counts = 500 min_genes = 200 normalization = "SCT" n_pcs = 30 cluster_resolution = 0.8 [codex] panel_size = 41 segmentation_method = "ilastik" # 或 "watershed" min_cell_area_px = 50 max_cell_area_px = 500 # 核心机制蛋白通道 mechanism_markers = ["AXL", "pAXL", "GAS6", "FAK"] # 成纤维细胞异质性标志 fibroblast_markers = ["PDGFRa", "COL1", "COL3", "Lumican", "Aebp1", "Enpp2", "Prrx1"] # 环境基标 environment_markers = ["DAPI", "CD31", "EpCAM", "CD45"] [scrnaseq] n_clusters = 9 fibroblast_subset = true integration_method = "harmony" batch_key = "sample_id" [spatial_neighborhood] knn_k = 10 distance_metric = "euclidean" permutation_test = true n_permutations = 1000 # 关注的互作对 interaction_pairs = [ ["AXL_high_fibroblast", "EpCAM_epithelial"], ["AXL_high_fibroblast", "CD31_endothelial"], ["FAK_high_fibroblast", "smooth_muscle"] ] [target_screening] # 候选靶点筛选阈值 min_expression_pct = 0.3 min_log2fc = 0.5 adj_pval_cutoff = 0.05 # 空间逆相关分析 inverse_correlation_markers = ["AXL", "FAK"] correlation_method = "spearman" [taotoken] base_url = "https://taotoken.net/api" api_key = "sk-your-key-here" # 替换为你在控制台生成的 Key model_id = "claude-sonnet-4-20250514" # 按需替换 timeout_sec = 120 max_retries = 3如果你用的是 Claude Code 做辅助编码,还需要在项目根目录下加一个.claude/settings.json:
{ "api_endpoint": "https://taotoken.net/api", "api_key": "sk-your-key-here", "model": "claude-sonnet-4-20250514", "max_tokens": 8192, "temperature": 0.2 }如果你用的是 Cline 或者带 MCP 的编辑器插件,配置项类似,核心就是三件套:Base URL 填https://taotoken.net/api,Key 填你生成的,Model ID 填你要用的模型标识。这三项缺一不可,少一个就会报连接错误。
配置写完之后,先别急着跑全流程。用一个小样本测试一下 TaoToken 的连通性,确认 Key 和 Base URL 没问题。
4. 验证请求:从连通性测试到靶点列表输出
配置写好了,下一步是验证。我习惯分两步走:先测 API 连通性,再跑靶点筛选流程。
连通性测试最简单的方式是用 curl 发一个请求:
curl -X POST https://taotoken.net/api/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer sk-your-key-here" \ -d '{ "model": "claude-sonnet-4-20250514", "messages": [ {"role": "user", "content": "请用一句话说明空间单细胞蛋白组学中CODEX和Visium的分辨率差异。"} ], "max_tokens": 200 }'如果返回的 JSON 里有choices字段,并且内容是一段正常的文本,说明通道没问题。如果返回 401,说明 Key 不对;如果返回local proxy failed,说明 Base URL 写错了或者网络不通;如果返回reading choices相关的错误,说明返回结构和你预期的不一样,需要检查模型标识是否正确。
连通性确认之后,跑靶点筛选。核心逻辑是:从 CODEX 数据里提取 AXL 高表达和 FAK 高表达的成纤维细胞,然后做空间邻接分析,看它们分别倾向于和哪些细胞类型相邻。下面这段 Python 代码是简化版的筛选流程:
import pandas as pd import numpy as np from sklearn.neighbors import NearestNeighbors from scipy.stats import spearmanr # 读取 CODEX 细胞表型数据 codex = pd.read_csv("/results/spatial_integration/codex_cell_phenotypes.csv") # 列包括:cell_id, x, y, AXL_intensity, FAK_intensity, cell_type # 定义 AXL 高和 FAK 高的成纤维细胞 fibroblasts = codex[codex["cell_type"] == "fibroblast"].copy() axl_threshold = fibroblasts["AXL_intensity"].quantile(0.75) fak_threshold = fibroblasts["FAK_intensity"].quantile(0.75) axl_high = fibroblasts[fibroblasts["AXL_intensity"] > axl_threshold] fak_high = fibroblasts[fibroblasts["FAK_intensity"] > fak_threshold] # 空间邻接分析 coords = codex[["x", "y"]].values nbrs = NearestNeighbors(n_neighbors=10, metric="euclidean").fit(coords) def neighbor_composition(cell_indices, all_cells, k=10): distances, indices = nbrs.kneighbors(all_cells.iloc[cell_indices][["x", "y"]].values) neighbor_types = [] for idx_row in indices: neighbor_types.extend(all_cells.iloc[idx_row]["cell_type"].tolist()) return pd.Series(neighbor_types).value_counts(normalize=True) axl_neighbors = neighbor_composition(axl_high.index, codex) fak_neighbors = neighbor_composition(fak_high.index, codex) print("AXL高成纤维细胞的邻居组成:") print(axl_neighbors.head(10)) print("\nFAK高成纤维细胞的邻居组成:") print(fak_neighbors.head(10)) # 空间逆相关分析 corr, pval = spearmanr(fibroblasts["AXL_intensity"], fibroblasts["FAK_intensity"]) print(f"\nAXL与FAK空间相关性: r={corr:.3f}, p={pval:.2e}")跑完之后你会看到类似这样的输出:AXL 高成纤维细胞的邻居里,EpCAM 上皮细胞和 CD31 内皮细胞的比例明显偏高;FAK 高成纤维细胞的邻居里,平滑肌细胞的比例偏高。同时 AXL 和 FAK 的 Spearman 相关系数是负的,说明两者在空间上存在排他性。
这个结果和文献里的发现一致:口腔再生区域 AXL 占主导,面部纤维化区域 FAK 占主导。你的靶点列表就可以围绕 AXL-GAS6 通路来构建,同时把 FAK 作为反向验证的指标。
最后一步是把候选靶点列表整理出来,用 TaoToken 的模型对话功能做一轮语义去重和优先级排序。你可以把靶点列表贴进去,让模型帮你按“与无痕修复的关联强度”排个序。这一步不是必须的,但能帮你快速筛掉明显不相关的候选。
5. 常见报错排查:401、local proxy failed、reading choices、OAuth
配置和跑流程的过程中,最容易卡在几个报错上。我按实际遇到的频率排个序。
401 Unauthorized:这个最常见,原因就一个——Key 不对。检查三件事:Key 是不是从控制台复制的完整字符串,有没有多余空格;config.toml里的api_key字段有没有写错;如果你用的是环境变量,确认变量名和代码里读的一致。有时候 Key 过期了也会报 401,去控制台重新生成一个就行。
local proxy failed:这个报错说明请求根本没发出去。检查 Base URL 是不是写成了https://taotoken.net/api,有没有多写斜杠或者少写api。如果你在settings.json里配了api_endpoint,确认它和config.toml里的base_url一致。另外检查一下你的网络环境能不能正常访问这个地址,用 curl 测一下最直接。
reading choices 相关错误:这个通常出现在你解析返回 JSON 的时候。TaoToken 返回的结构和 OpenAI 兼容,choices[0].message.content是标准路径。如果你用的模型标识不对,返回结构可能不一样。确认model_id填的是控制台里列出的可用模型,不要自己编一个名字。
OAuth 相关报错:如果你用的是 Claude Code 或者某些需要 OAuth 授权的工具,可能会遇到 token 刷新失败的问题。这种情况下,检查你的settings.json里是不是同时配了 API Key 和 OAuth 凭证,两者选一个就行。用 TaoToken 的 Key 通道就不需要 OAuth,把 OAuth 相关的配置删掉,只留api_endpoint和api_key。
还有一个不太常见但很坑的问题:config.toml里的timeout_sec设得太短。空间组学分析有时候要传比较大的上下文给模型,比如整个靶点列表加注释信息,如果超时设成 30 秒,请求还没传完就断了。建议设成 120 秒以上,max_retries设成 3,这样偶发的网络抖动不会直接让流程挂掉。
排查的时候记住一个原则:先测连通性,再查配置,最后看代码。连通性用 curl 测,配置用cat config.toml看,代码里打印一下实际读到的base_url和api_key前几位。三步下来,大部分问题都能定位。
6. 从靶点列表到验证动作:下一步怎么走
拿到候选靶点列表之后,别急着下结论。空间组学的输出是“关联证据”,不是“因果证据”。你需要设计验证动作来确认这些靶点是否真的驱动无痕修复。
第一步是原位验证。用 CODEX 或者免疫荧光在同一个组织切片上同时标记 AXL、FAK 和你的候选靶点,看它们在空间上是否真的存在排他性或共定位。这一步能排除“转录本噪声”导致的假阳性。
第二步是功能扰动。如果你有体外成纤维细胞培养体系,可以用 siRNA 或者小分子抑制剂敲低候选靶点,然后看下游的纤维化标志物(比如 COL1、COL3)表达有没有变化。这一步是从“相关”到“因果”的关键跳跃。
第三步是跨样本验证。你现在的分析可能只基于一个时间点(POD4)和一个物种(C57BL/6 鼠)。如果条件允许,至少在另一个时间点(比如 POD7 或 POD14)重复一遍空间邻接分析,看 AXL-FAK 的逆相关是否稳定。
如果你在验证过程中需要批量整理候选靶点的功能注释,或者用自然语言描述来辅助筛选通路,可以继续用 TaoToken 的模型对话功能。把靶点列表和对应的空间统计结果贴进去,让模型帮你生成一份结构化的验证优先级建议。这一步能省不少手动查文献的时间。
长期做这类分析的话,Coding Plan 的包量方式比按次计费更省心。你可以在 console 页面里看具体的额度选项,选一个匹配你调用频率的套餐。
最后提醒一句:空间单细胞蛋白组学的核心价值在于提供原位空间定量证据,但它不能替代功能实验。靶点列表只是起点,真正的验证还是要回到湿实验里。