单细胞RNA测序极大地丰富了我们对细胞异质性的认识。然而,准确的细胞类型标注仍然是下游分析中的一个主要瓶颈。人工标注耗时费力,很大程度上依赖于专业的背景知识,并且缺乏可重复性。为此,人们开发了各种自动化方法,但这些方法在可扩展性、对不同生物系统的适应性或跨平台兼容性方面往往存在不足。

AICelltype 是一款由前沿大型语言模型“Claude 3.5 Sonnet”驱动的智能细胞类型标注工具。在对79个领先模型进行了全面的测试后,最终选取表现最佳的模型 (Claude 3.5 Sonnet),作为此工具的模型用于细胞类型注释。
pacman::p_load(dplyr, Seurat, AICellType)
pbmc.data <- Read10X(data.dir = "filtered_gene_bc_matrices/hg19")
pbmc <- CreateSeuratObject(counts = pbmc.data, project = "pbmc3k", min.cells = 3, min.features = 200)
pbmc
An object of class Seurat
13714 features across 2700 samples within 1 assay
Active assay: RNA (13714 features, 0 variable features)
1 layer present: counts
pbmc[["percent.mt"]] <- PercentageFeatureSet(pbmc, pattern = "^MT-")
pbmc <- subset(pbmc, subset = nFeature_RNA > 200 & nFeature_RNA < 2500 & percent.mt < 5)
pbmc <- NormalizeData(pbmc)
pbmc <- FindVariableFeatures(pbmc, selection.method = "vst", nfeatures = 2000)
all.genes <- rownames(pbmc)
pbmc <- ScaleData(pbmc, features = all.genes)
pbmc <- RunPCA(pbmc, features = VariableFeatures(object = pbmc))
pbmc <- FindNeighbors(pbmc, dims = 1:10)
pbmc <- FindClusters(pbmc, resolution = 0.5)
pbmc
An object of class Seurat
13714 features across 2638 samples within 1 assay
Active assay: RNA (13714 features, 2000 variable features)
3 layers present: counts, data, scale.data
1 dimensional reduction calculated: pca
前期数据处理到这就可以进行细胞类型注释了,注释过程很简单一行代码搞定:
pbmc <- AnnotateCelltype(scRNA=pbmc, tissuename="PBMC")
Calculating cluster 0
Calculating cluster 1
Calculating cluster 2
Calculating cluster 3
Calculating cluster 4
Calculating cluster 5
Calculating cluster 6
Calculating cluster 7
Calculating cluster 8
[1] "claude-3-5-sonnet-20240620"
但不出意外的话意外就该出现了,估计还是会遇到如下所示的错误:
[1] "httr2 API call error: Failed to perform HTTP request. \n"
Error inresp_body_json():
!respmust be an HTTP response object, not a function.
Runrlang::last_trace()to see where the error occurred.
错误提醒已经挺明显了,稍微懂点英语的人应该就可以理解,网络访问发生了错误。引发网络错误的原因很多,例如API网址或者api_key无法正常使用了,具体原因这里就不讨论了。
上面的方式比较简单,一键式注释,其中内置了差异基因的步骤,使用默认参数来寻找差异基因,然后每个分组的差异基因选取前10个基因作为marker用于注释细胞类型。
那么,如果想精细控制差异基因的寻找过程及marker基因,可以用下面的过程:
pbmc.markers <- FindAllMarkers(pbmc, only.pos = TRUE)
top10 <- pbmc.markers %>% group_by(cluster) %>% dplyr::filter(avg_log2FC > 1) %>% slice_head(n = 10) %>% ungroup()
markergenes<- SeuratMarkerGeneToStr(top10)
celltype <- GetCellType(markergenes=markergenes, tissuename="PBMC")
new.cluster.ids <- sapply(celltypes$content, `[[`, 1)
names(new.cluster.ids) <- levels(pbmc)
pbmc <- RenameIdents(pbmc, new.cluster.ids)
从前面的错误提示可知,软件自带的API是无法使用了。如果还继续想用这个软件需要提供自己使用的大模型API网址和api_key,也就是自定义设置AnnotateCelltype或者GetCellType函数的参数,代码类似如下:
pbmc <- AnnotateCelltype(scRNA = pbmc, tissuename = "PBMC", model = "openai/gpt-4", base_url = "https://openrouter.ai/api/v1/chat/completions", api_key ="your-key")
如果想自定义模型的参数,建议还是用GetCellType这个过程,因为AnnotateCelltype函数有BUG (这里使用软件的版本为1.0.0),内部把base_url、api_key两个参数写死了,自定义无效。
除了软件外,还有配套一个在线注释网站,昨天还可以正常使用,今天网站却没法访问了:

用大模型做细胞类型注释,核心过程是API调用,其实也是网络访问,不论是软件还是网站,最核心的过程代码类似如下:
request_body <- list(tissue = "PBMC", markergenes = markergenes, temperature = 0.1)
response <- request(base_url) %>% req_headers(`Content-Type` = "application/json") %>% req_timeout(seconds = 200) %>% req_body_json(request_body) %>% req_perform()
result <- bind_rows(lapply(resp_body_json(response), function(x) {if(is.null(x$basis)){x$basis <- NA}; as_tibble(x)}))
作者居然测试了温度对模型的影响,使用软件时可以设置temperature参数。经测试AICellType对温度变化具有极高的稳定性,在0.1-0.3范围内保持100%一致。