415 lines
12 KiB
Markdown
Executable File
415 lines
12 KiB
Markdown
Executable File
# V14 详细问答
|
|
|
|
**日期**: 2026-04-18 20:11
|
|
**版本**: V14.0
|
|
|
|
---
|
|
|
|
## 问题1: 数据层是否已完全加载到项目中?
|
|
|
|
### 答案: ✅ 是,已完全加载
|
|
|
|
**PC数据文件加载状态**:
|
|
|
|
| 数据文件 | 路径 | 数据量 | 加载方式 |
|
|
|:---|:---|:---:|:---|
|
|
| `scientific_chunks.json` | `/home/xia-lab/wutx/01model/PlantConnectome_2025version/pc/` | 43,561条别名 | `pc_data_loader.py` |
|
|
| `gene_alias.json` | 同上 | 17,618个基因 | `pc_data_loader.py` |
|
|
| `relationships_by_category_final.json` | 同上 | 788种模式 | `pc_data_loader.py` |
|
|
| `all_dic.json` | 同上 | 238万实体 | `pc_data_loader.py` |
|
|
|
|
**代码实现** (`pc_data_loader.py`):
|
|
|
|
```python
|
|
class PCDataLoader:
|
|
def load_scientific_chunks(self) -> Dict[str, str]:
|
|
"""加载43,561条别名映射"""
|
|
# 小写别名 → 标准化名称
|
|
# 示例: "aan" → "AAN"
|
|
|
|
def load_gene_aliases(self) -> Dict[str, List[str]]:
|
|
"""加载17,618个基因别名"""
|
|
# 基因 → 别名列表
|
|
# 示例: "SUC5" → ["ATSUC5", "SUC5", "AT1G71890"]
|
|
|
|
def load_relationship_patterns(self) -> Dict:
|
|
"""加载788种关系模式"""
|
|
# 9大类关系模式
|
|
# 示例: "ACTIVATION/INDUCTION/PROMOTION/CAUSATION/RESULT"
|
|
|
|
def load_entity_dict(self) -> Set[str]:
|
|
"""加载238万实体目录"""
|
|
# 用于实体验证
|
|
```
|
|
|
|
**使用方式**:
|
|
```python
|
|
from src.rag.extractors.v14 import get_pc_data_loader
|
|
|
|
loader = get_pc_data_loader()
|
|
alias_map = loader.load_scientific_chunks() # 43,561条
|
|
gene_aliases = loader.load_gene_aliases() # 17,618个
|
|
```
|
|
|
|
---
|
|
|
|
## 问题2: 输出格式中的"定义4列"是什么意思?
|
|
|
|
### 答案: 指4个定义相关的输出字段
|
|
|
|
### 2.1 4列定义字段
|
|
|
|
| 列名 | 含义 | V14实现 | PC实现 |
|
|
|:---|:---|:---:|:---:|
|
|
| `source_extracted_definition` | 从文本提取的源实体定义 | ✅ 正则提取 | ✅ 相同 |
|
|
| `source_generated_definition` | LLM生成的源实体定义 | ⚠️ **模板生成** | ✅ **LLM生成** |
|
|
| `target_extracted_definition` | 从文本提取的目标实体定义 | ✅ 正则提取 | ✅ 相同 |
|
|
| `target_generated_definition` | LLM生成的目标实体定义 | ⚠️ **模板生成** | ✅ **LLM生成** |
|
|
|
|
### 2.2 V14模板生成示例
|
|
|
|
**代码位置**: `phase4_relation_extraction.py` 第200-220行
|
|
|
|
```python
|
|
def _generate_definitions(self, relations: List[Relation], text: str) -> List[Relation]:
|
|
"""生成实体定义 (模板方式)"""
|
|
templates = {
|
|
'gene': "A gene encoding {name}, involved in biological processes.",
|
|
'tissue': "A plant tissue where {name} is expressed.",
|
|
'metabolite': "A metabolite compound {name}.",
|
|
'process': "A biological process {name}.",
|
|
'compartment': "A subcellular compartment {name}.",
|
|
}
|
|
|
|
for rel in relations:
|
|
# source定义
|
|
src_template = templates.get(rel.source_type, "A biological entity {name}.")
|
|
rel.source_generated_definition = src_template.format(
|
|
name=rel.source_resolved or rel.source
|
|
)
|
|
# 结果: "A gene encoding SUC5, involved in biological processes."
|
|
```
|
|
|
|
### 2.3 PC的LLM生成效果
|
|
|
|
**来源**: `entity_disambiguation_system.py`
|
|
|
|
```python
|
|
def generate_entity_definition(self, entity_name: str, entity_type: str, context: str = ""):
|
|
"""使用LLM生成定义"""
|
|
# 调用GPT/kimi生成
|
|
# 示例输出:
|
|
# "SUC5 (Sucrose Transporter 5) is a gene encoding a sucrose/H+ symporter
|
|
# protein that facilitates the co-transport of sucrose and protons across
|
|
# membranes, playing a crucial role in phloem loading and sugar allocation
|
|
# in Arabidopsis thaliana."
|
|
```
|
|
|
|
### 2.4 对比示例
|
|
|
|
**实体**: "SUC5"
|
|
|
|
| 方式 | 生成定义 |
|
|
|:---|:---|
|
|
| **V14模板** | "A gene encoding SUC5, involved in biological processes." |
|
|
| **PC LLM** | "SUC5 encodes a sucrose/H+ symporter involved in phloem loading..." |
|
|
|
|
**差异**:
|
|
- V14: 通用模板,简单但准确
|
|
- PC: LLM生成,详细且有生物学意义
|
|
|
|
---
|
|
|
|
## 问题3: "完整被动转主动映射"是什么意思?
|
|
|
|
### 3.1 当前V14实现
|
|
|
|
**代码位置**: `phase4_relation_extraction.py` 第45-50行
|
|
|
|
```python
|
|
def _load_passive_to_active(self) -> Dict[str, str]:
|
|
"""被动转主动映射 (V14基础版)"""
|
|
return {
|
|
'is_expressed_in': 'expressed_in',
|
|
'is_regulated_by': 'regulated_by',
|
|
'is_localized_to': 'localizes_to',
|
|
'is_involved_in': 'involved_in',
|
|
}
|
|
```
|
|
|
|
**当前处理**: 只有4个基础映射
|
|
|
|
### 3.2 PC的完整映射
|
|
|
|
**来源**: `universal_extractor_v2.py` 第150-200行 (推测)
|
|
|
|
```python
|
|
# PC的完整被动转主动映射 (推测基于788种模式)
|
|
passive_to_active = {
|
|
# 表达相关
|
|
'is_expressed_in': 'expressed_in',
|
|
'was_expressed_in': 'expressed_in',
|
|
'were_expressed_in': 'expressed_in',
|
|
'is_highly_expressed_in': 'highly_expressed_in',
|
|
|
|
# 调控相关
|
|
'is_regulated_by': 'regulated_by',
|
|
'was_up_regulated_by': 'up_regulated_by',
|
|
'was_down_regulated_by': 'down_regulated_by',
|
|
'is_induced_by': 'induced_by',
|
|
'is_repressed_by': 'repressed_by',
|
|
|
|
# 定位相关
|
|
'is_localized_to': 'localizes_to',
|
|
'was_localized_to': 'localizes_to',
|
|
'is_present_in': 'present_in',
|
|
|
|
# 功能相关
|
|
'is_involved_in': 'involved_in',
|
|
'participates_in': 'participates_in',
|
|
'plays_a_role_in': 'plays_role_in',
|
|
|
|
# ... 可能还有50+个映射
|
|
}
|
|
```
|
|
|
|
### 3.3 举例说明
|
|
|
|
**原文**: "SUC5 was up-regulated by drought stress"
|
|
|
|
| 阶段 | 处理 | 结果 |
|
|
|:---|:---|:---|
|
|
| **提取** | 正则匹配 | relation="was_up_regulated_by" |
|
|
| **标准化** | 被动转主动 | relationship_resolved="up_regulated_by" |
|
|
| **最终** | 存储 | "up_regulated_by" |
|
|
|
|
**差异**:
|
|
- V14: 可能无法识别 "was_up_regulated_by" → 保持原样
|
|
- PC: 识别为 "up_regulated_by" → 标准化
|
|
|
|
### 3.4 实体链接优化
|
|
|
|
**优化前 (V14当前)**:
|
|
```python
|
|
# 简单字符串匹配
|
|
if entity_name.lower() in entity_map:
|
|
resolved = entity_map[entity_name.lower()]
|
|
```
|
|
|
|
**问题**:
|
|
- "SUC5" 和 "suc5" 匹配
|
|
- 但 "Sucrose transporter 5" 和 "SUC5" 不匹配
|
|
|
|
**优化后 (PC风格)**:
|
|
```python
|
|
# 使用PC的scientific_chunks.json
|
|
alias_map = {
|
|
'suc5': 'SUC5',
|
|
'sucrose transporter 5': 'SUC5',
|
|
'at1g71890': 'SUC5',
|
|
'atsuc5': 'SUC5',
|
|
}
|
|
|
|
# 模糊匹配 + 别名扩展
|
|
resolved = alias_map.get(entity_name.lower(), entity_name)
|
|
```
|
|
|
|
**效果**:
|
|
- 输入: "sucrose transporter 5"
|
|
- 输出: "SUC5" (标准化)
|
|
|
|
---
|
|
|
|
## 问题4: Neo4j知识图谱集成
|
|
|
|
### 4.1 已实现的Neo4j集成
|
|
|
|
**确认**: ✅ **已实现**
|
|
|
|
**相关文件**:
|
|
|
|
| 文件 | 路径 | 功能 |
|
|
|:---|:---|:---|
|
|
| `neo4j_store.py` | `src/rag/temporal/neo4j_store.py` | 时序知识图谱Neo4j存储 |
|
|
| `import_neo4j.py` | `import_neo4j.py` | 基础Neo4j导入 |
|
|
| `import_to_neo4j.py` | `import_to_neo4j.py` | V13结果导入Neo4j |
|
|
| `demo_neo4j_import.py` | `demo_neo4j_import.py` | Neo4j导入演示 |
|
|
| `kg.db` | `kg.db` (69KB) | SQLite知识图谱数据库 |
|
|
|
|
### 4.2 时序知识图谱实现
|
|
|
|
**代码** (`src/rag/temporal/neo4j_store.py`):
|
|
|
|
```python
|
|
class TemporalNeo4jStore:
|
|
"""时序知识图谱Neo4j存储"""
|
|
|
|
def __init__(self, config: Optional[Neo4jConfig] = None):
|
|
self.config = config or Neo4jConfig()
|
|
self._driver = GraphDatabase.driver(...)
|
|
self._init_schema()
|
|
|
|
def save_temporal_entity(self, entity: TemporalEntity):
|
|
"""保存时序实体"""
|
|
# CREATE (e:TemporalEntity {entity_id: ..., valid_time: ...})
|
|
|
|
def save_temporal_relation(self, relation: TemporalRelation):
|
|
"""保存时序关系"""
|
|
# CREATE (s)-[:RELATION {valid_time: ...}]->(t)
|
|
|
|
def query_temporal_evolution(self, entity_id: str, time_range: TimePeriod):
|
|
"""查询实体时序演化"""
|
|
# MATCH (e)-[r]->() WHERE r.valid_time STARTS >= ...
|
|
```
|
|
|
|
### 4.3 使用方法
|
|
|
|
```python
|
|
from src.rag.temporal import TemporalNeo4jStore, TemporalKnowledgeGraph
|
|
|
|
# 初始化存储
|
|
store = TemporalNeo4jStore()
|
|
|
|
# 保存时序KG
|
|
kg = TemporalKnowledgeGraph()
|
|
# ... 构建KG ...
|
|
store.save_graph(kg)
|
|
|
|
# 时序查询
|
|
evolution = store.query_temporal_evolution("SUC5", TimePeriod(2020, 2024))
|
|
```
|
|
|
|
---
|
|
|
|
## 问题5: "自学习机制"是什么意思?
|
|
|
|
### 5.1 概念解释
|
|
|
|
**自学习机制**: 系统从用户反馈中自动改进,无需人工修改代码
|
|
|
|
### 5.2 举例说明
|
|
|
|
#### 场景1: 新关系模式学习
|
|
|
|
**用户反馈**:
|
|
```
|
|
用户: "这个关系 'modulates' 没有被识别"
|
|
```
|
|
|
|
**自学习过程**:
|
|
```python
|
|
# 1. 记录反馈
|
|
feedback = {
|
|
'text': "SUC5 modulates sugar uptake",
|
|
'missed_relation': 'modulates',
|
|
'context': '...',
|
|
}
|
|
|
|
# 2. 自动生成模式
|
|
new_pattern = {
|
|
'relation': 'modulates',
|
|
'pattern': r'(\b[A-Z][a-z]+[A-Z]+\d+\b).*?modulates?\s+(\w+)',
|
|
'source_type': 'gene',
|
|
'target_type': 'process',
|
|
'learned_from': feedback['text'],
|
|
}
|
|
|
|
# 3. 添加到模式库
|
|
self.relation_patterns.append(new_pattern)
|
|
|
|
# 4. 验证 (下次提取时生效)
|
|
```
|
|
|
|
#### 场景2: 别名映射学习
|
|
|
|
**用户反馈**:
|
|
```
|
|
用户: "'Suc transporter 5' 应该映射到 'SUC5'"
|
|
```
|
|
|
|
**自学习过程**:
|
|
```python
|
|
# 1. 记录别名映射
|
|
new_alias = {
|
|
'alias': 'suc transporter 5',
|
|
'canonical': 'SUC5',
|
|
'learned_from': 'user_feedback',
|
|
'confidence': 0.95,
|
|
}
|
|
|
|
# 2. 更新别名映射表
|
|
self.alias_map['suc transporter 5'] = 'SUC5'
|
|
|
|
# 3. 持久化到文件
|
|
with open('learned_aliases.json', 'a') as f:
|
|
json.dump(new_alias, f)
|
|
```
|
|
|
|
#### 场景3: 实体类型纠正
|
|
|
|
**用户反馈**:
|
|
```
|
|
用户: "'sucrose' 被错误标记为 'gene',应该是 'metabolite'"
|
|
```
|
|
|
|
**自学习过程**:
|
|
```python
|
|
# 1. 记录纠正
|
|
correction = {
|
|
'entity': 'sucrose',
|
|
'wrong_type': 'gene',
|
|
'correct_type': 'metabolite',
|
|
}
|
|
|
|
# 2. 更新类型规则
|
|
self.entity_type_rules['sucrose'] = 'metabolite'
|
|
|
|
# 3. 调整实体识别器
|
|
if word.lower() == 'sucrose':
|
|
entity_type = self.entity_type_rules.get('sucrose', 'gene')
|
|
```
|
|
|
|
### 5.3 自学习架构
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────┐
|
|
│ 自学习机制架构 │
|
|
├─────────────────────────────────────────────────────────┤
|
|
│ 用户反馈 → 反馈分类 → 模式生成 → 验证 → 持久化 → 生效 │
|
|
├─────────────────────────────────────────────────────────┤
|
|
│ 反馈类型: │
|
|
│ - 遗漏的关系模式 │
|
|
│ - 错误的别名映射 │
|
|
│ - 错误的实体类型 │
|
|
│ - 不准确的定义 │
|
|
├─────────────────────────────────────────────────────────┤
|
|
│ 学习存储: │
|
|
│ - learned_patterns.json (新关系模式) │
|
|
│ - learned_aliases.json (新别名映射) │
|
|
│ - learned_corrections.json (类型纠正) │
|
|
└─────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### 5.4 当前V14状态
|
|
|
|
**现状**: ❌ **未实现自学习机制**
|
|
|
|
**需要添加**:
|
|
1. 反馈收集接口
|
|
2. 模式生成算法
|
|
3. 验证机制
|
|
4. 持久化存储
|
|
|
|
---
|
|
|
|
## 总结
|
|
|
|
| 问题 | 状态 | 说明 |
|
|
|:---|:---:|:---|
|
|
| 数据层加载 | ✅ 完成 | 4个PC数据文件已完全加载 |
|
|
| 定义4列 | ⚠️ 模板生成 | 使用模板而非LLM,可升级 |
|
|
| 被动转主动映射 | ⚠️ 基础版 | 仅4个映射,需扩展 |
|
|
| 实体链接优化 | ⚠️ 简单匹配 | 需使用PC别名库进行模糊匹配 |
|
|
| Neo4j集成 | ✅ 已实现 | 时序知识图谱已完整实现 |
|
|
| 自学习机制 | ❌ 未实现 | 需新增反馈收集和模式生成 |
|