286 lines
6.2 KiB
Markdown
Executable File
286 lines
6.2 KiB
Markdown
Executable File
# PlantConnectome 工作原理深度分析
|
|
|
|
## 核心发现
|
|
|
|
### PC的数据来源
|
|
**不是从chunks提取,而是从完整论文原文处理!**
|
|
|
|
```
|
|
输入: 71,000篇论文 (abstracts + full-texts)
|
|
↓
|
|
GPT-4o处理
|
|
├── 实体识别: 基因、代谢物、组织等
|
|
├── 关系抽取: 调控、表达、运输等
|
|
└── 证据提取: 原文片段、实验方法
|
|
↓
|
|
输出
|
|
├── all_dic.json: 320万关系三元组
|
|
├── scientific_chunks.json: 实体索引的文本片段
|
|
└── gene_alias.json: 基因别名映射
|
|
```
|
|
|
|
---
|
|
|
|
## PC vs 我们的方案对比
|
|
|
|
### 数据来源对比
|
|
|
|
| 维度 | PlantConnectome | gene-family-mas-v2 |
|
|
|------|-----------------|-------------------|
|
|
| **输入** | 71,000篇完整论文 | 1篇PDF + 附表 |
|
|
| **文本来源** | PubMed abstracts + full-texts | PDF提取的章节 |
|
|
| **预处理** | GPT-4o批量处理 | V12.1规则提取 |
|
|
| **输出** | 320万关系 | 107关系 |
|
|
|
|
### 关键差异
|
|
|
|
#### 1. 文本长度
|
|
```
|
|
PC的输入:
|
|
- Abstract: 200-300词
|
|
- Full-text: 3,000-10,000词
|
|
- 每篇论文可抽取数十个关系
|
|
|
|
我们的输入:
|
|
- Gene-centric chunk: 100-500字符
|
|
- 只有基因摘要,缺少详细描述
|
|
- 每个基因只能抽取0-3个关系
|
|
```
|
|
|
|
#### 2. 信息完整性
|
|
```
|
|
PC的信息:
|
|
- 基因表达: "SUC5 is expressed in developing embryos"
|
|
- 功能描述: "SUC5 transports biotin and sucrose"
|
|
- 实验证据: "Uptake measurements of radiolabelled biotin"
|
|
- 物种信息: "Arabidopsis thaliana"
|
|
|
|
我们的信息:
|
|
- 基因表达: {"Root": "High"} (结构化数据)
|
|
- 功能描述: 缺少详细文本
|
|
- 实验证据: 缺少方法描述
|
|
- 物种信息: "Litchi chinensis" (单一物种)
|
|
```
|
|
|
|
#### 3. 关系抽取方法
|
|
```
|
|
PC的方法 (GPT-4o):
|
|
1. 读取完整论文文本
|
|
2. 识别所有基因实体
|
|
3. 理解上下文语义
|
|
4. 抽取关系三元组
|
|
5. 生成实体定义
|
|
6. 提取证据文本
|
|
|
|
我们的方法 (规则匹配):
|
|
1. 读取gene-centric chunk
|
|
2. 正则表达式匹配关键词
|
|
3. 基于模式抽取关系
|
|
4. 无法处理复杂语义
|
|
```
|
|
|
|
---
|
|
|
|
## PC的工作原理详解
|
|
|
|
### 阶段1: 数据预处理 (离线)
|
|
|
|
#### 1.1 论文获取
|
|
```python
|
|
# 从PubMed获取71,000篇论文
|
|
papers = fetch_pubmed_papers(query="Arabidopsis gene", limit=71000)
|
|
|
|
for paper in papers:
|
|
pmid = paper['pmid']
|
|
abstract = paper['abstract']
|
|
fulltext = paper['fulltext'] # 通过PMC获取
|
|
```
|
|
|
|
#### 1.2 GPT-4o处理
|
|
```python
|
|
# 使用GPT-4o处理每篇论文
|
|
prompt = f"""
|
|
从以下论文中提取基因关系:
|
|
|
|
PMID: {pmid}
|
|
Title: {title}
|
|
Abstract: {abstract}
|
|
Full-text: {fulltext}
|
|
|
|
任务:
|
|
1. 识别所有基因实体
|
|
2. 提取关系三元组 (source, relationship, target)
|
|
3. 确定实体类型 (gene, protein, metabolite, tissue...)
|
|
4. 提取证据文本
|
|
5. 生成实体定义
|
|
|
|
输出格式:
|
|
{{
|
|
"entities": [
|
|
{{
|
|
"name": "SUC5",
|
|
"type": "gene",
|
|
"definition": "A sucrose transporter gene...",
|
|
"aliases": ["ATSUC5", "AT1G71890"]
|
|
}}
|
|
],
|
|
"relations": [
|
|
{{
|
|
"source": "SUC5",
|
|
"source_type": "gene",
|
|
"relationship": "transports",
|
|
"target": "biotin",
|
|
"target_type": "metabolite",
|
|
"evidence": "SUC5 also transports biotin...",
|
|
"basis": "Uptake measurements..."
|
|
}}
|
|
]
|
|
}}
|
|
"""
|
|
|
|
result = gpt4o.generate(prompt)
|
|
```
|
|
|
|
#### 1.3 数据存储
|
|
```python
|
|
# 存储到MongoDB
|
|
db.all_dic.insert_many(relations)
|
|
db.scientific_chunks.insert_many(chunks)
|
|
db.gene_alias.insert_many(aliases)
|
|
```
|
|
|
|
### 阶段2: 查询服务 (在线)
|
|
|
|
#### 2.1 用户查询
|
|
```python
|
|
# 用户搜索 "SUC5"
|
|
query = "SUC5"
|
|
results = db.all_dic.find({"source": query})
|
|
```
|
|
|
|
#### 2.2 关系验证 (GPT-4o-mini)
|
|
```python
|
|
# 验证关系准确性
|
|
prompt = f"""
|
|
验证以下关系是否正确:
|
|
|
|
文本: {evidence_text}
|
|
关系: ({source}, {relationship}, {target})
|
|
|
|
输出:
|
|
- Validation Status: ✅ Correct / ❓ Uncertain / ❌ Incorrect
|
|
- Supporting Evidence: [原文引用]
|
|
- Explanation: [解释]
|
|
"""
|
|
|
|
validation = gpt4o_mini.generate(prompt)
|
|
```
|
|
|
|
#### 2.3 原文获取
|
|
```python
|
|
# 通过PMID获取原文
|
|
p_source = "23031218_abstract"
|
|
pmid = p_source.split('_')[0]
|
|
|
|
# 调用PubMed API
|
|
original_text = pubmed_api.fetch(pmid)
|
|
```
|
|
|
|
---
|
|
|
|
## 我们的改进方案
|
|
|
|
### 方案A: 使用V12.1章节文本 (推荐)
|
|
|
|
```python
|
|
# V12.1已经提取了章节文本
|
|
sections = {
|
|
"Introduction": "...",
|
|
"Expression Analysis": "...详细表达描述...",
|
|
"Functional Characterization": "...功能描述...",
|
|
"Subcellular Localization": "...定位描述...",
|
|
"Discussion": "..."
|
|
}
|
|
|
|
# 使用章节文本进行LLM抽取
|
|
for section_name, text in sections.items():
|
|
relations = llm_extractor.extract(text, gene_id)
|
|
```
|
|
|
|
**优势**:
|
|
- 已有完整文本
|
|
- 无需额外API调用
|
|
- 信息丰富
|
|
|
|
### 方案B: 整合多数据源
|
|
|
|
```python
|
|
# 结合多个数据源
|
|
data_sources = {
|
|
"gene_centric_chunks": chunks,
|
|
"paper_sections": sections,
|
|
"supplementary_tables": tables,
|
|
"figures_captions": captions
|
|
}
|
|
|
|
# 综合抽取
|
|
all_relations = []
|
|
for source, text in data_sources.items():
|
|
relations = llm_extractor.extract(text, gene_id)
|
|
all_relations.extend(relations)
|
|
```
|
|
|
|
### 方案C: 批量论文处理 (长期)
|
|
|
|
```python
|
|
# 类似PC的方法,但针对基因家族
|
|
papers = search_gene_family_papers(family="SUT", species="Litchi")
|
|
|
|
for paper in papers:
|
|
relations = gpt4o.extract(paper)
|
|
store_to_kg(relations)
|
|
```
|
|
|
|
---
|
|
|
|
## 关键结论
|
|
|
|
### PC的优势
|
|
1. **规模大**: 71,000篇论文
|
|
2. **信息全**: 完整abstract + full-text
|
|
3. **智能高**: GPT-4o理解语义
|
|
4. **关系多**: 320万关系
|
|
|
|
### 我们的优势
|
|
1. **深度深**: 单基因详细信息
|
|
2. **结构好**: 染色体、分组、多组学
|
|
3. **成本低**: 无需大量API调用
|
|
4. **可控强**: 规则+人工验证
|
|
|
|
### 互补性
|
|
```
|
|
PC: 广度优先 (多论文, 浅信息)
|
|
GF: 深度优先 (少论文, 深信息)
|
|
|
|
结合: PC的广度 + GF的深度 = 完整知识图谱
|
|
```
|
|
|
|
---
|
|
|
|
## 实施建议
|
|
|
|
### 短期 (本周)
|
|
1. 使用V12.1章节文本重新抽取
|
|
2. 实现简单的LLM抽取 (规则+轻量LLM)
|
|
3. 验证抽取质量
|
|
|
|
### 中期 (本月)
|
|
1. 批量处理10-20篇相关论文
|
|
2. 构建基因家族专用知识图谱
|
|
3. 与PC数据对齐
|
|
|
|
### 长期 (本季度)
|
|
1. 实现完整的GPT-4o抽取流程
|
|
2. 构建可扩展的抽取pipeline
|
|
3. 发布基因家族知识图谱API
|