Files
PlantAI-rag/docs/analysis/llm_extraction_summary.md
2026-07-10 17:59:59 +08:00

5.1 KiB
Executable File

LLM关系抽取实现总结

PlantConnectome的方法

1. 预处理阶段 (离线)

  • 工具: GPT-4o
  • 输入: 71,000篇论文 (abstract + fulltext)
  • 输出: 3,207,996个关系三元组
  • 存储: MongoDB + CSV

2. 查询阶段 (在线)

  • 工具: GPT-4o-mini
  • 功能: 关系验证、同义词提取
  • Prompt示例:
prompt = f"""
You are a scientific expert in molecular biology...
Validate whether a given source-target interaction is correctly derived...

**Scientific Text:**
{text}

**Proposed Relationship:**
- Source: {source}
- Interaction: {interaction}
- Target: {target}

Respond in structured format:
- Validation Status: (✅ Correct / ❓ Uncertain / ❌ Incorrect)
- Supporting Evidence: Quote exact sentences...
- Explanation: Justify the assessment...
"""

3. 核心特点

  • 实体消歧: 使用GPT-4o进行实体标准化
  • 关系分类: 9大类,788个关系词
  • 证据溯源: 每个关系都有原文证据
  • 置信度评分: 验证时给出正确/不确定/错误

我们的实现

已实现

1. 规则抽取器 (llm_extractor_simple.py)

class LLMRelationExtractor:
    def extract_relations(self, text, gene_id):
        # 规则1: 表达关系
        pattern: r'highly expressed in ([\w\s]+)'
        → relation: highly_expressed_in
        
        # 规则2: 功能关系
        keyword: 'transporter' + 'sucrose'
        → relation: transports
        
        # 规则3: 定位关系
        keyword: 'membrane'
        → relation: localizes_to
        
        # 规则4: 调控关系
        pattern: r'regulates ([\w\s]+)'
        → relation: regulates

2. 抽取结果

  • 表达关系: 9个 (highly_expressed_in)
  • 其他关系: 0个 (文本太短)

问题分析

问题1: chunks文本太短

SlSUT2 chunk: 125字符
- 只有基本信息,没有描述性文本
- 无法抽取关系

SlSUT1 chunk: 514字符
- 有Expression Profile
- 成功抽取表达关系

问题2: 缺少原始论文文本

  • PC使用完整论文文本 (abstract + fulltext)
  • 我们只用gene-centric chunks
  • chunks是摘要,缺少详细描述

问题3: 没有使用真正的LLM

  • 当前使用规则匹配
  • 需要OpenAI API key使用GPT-4o
  • 规则无法处理复杂句式

解决方案

方案A: 使用原始论文文本 (推荐)

# 从V12.1提取的章节文本中抽取
sections = {
    "Expression Analysis": "...详细表达描述...",
    "Functional Characterization": "...功能描述...",
    "Subcellular Localization": "...定位描述..."
}

# 使用LLM抽取
for section_name, text in sections.items():
    relations = llm_extractor.extract(text, gene_id)

方案B: 使用真正的LLM (GPT-4o)

import openai

client = openai.OpenAI(api_key=api_key)

prompt = f"""
从以下文本中提取基因关系:
{text}

基因: {gene_id}

输出JSON格式:
[
  {{
    "source": "{gene_id}",
    "relationship": "expressed_in",
    "target": "root",
    "target_type": "tissue",
    "evidence": "..."
  }}
]
"""

response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": prompt}],
    temperature=0
)

方案C: 结合PC的预训练模型

# 使用PC的320万关系作为训练数据
# 微调自己的抽取模型
# 或使用PC的关系验证API

实施建议

短期 (今天)

  1. 从V12.1的完整章节文本抽取
  2. 使用规则+简单LLM (如果API可用)

中期 (本周)

  1. 获取OpenAI API key
  2. 实现完整的GPT-4o抽取
  3. 批量处理所有基因

长期 (本月)

  1. 构建自己的抽取模型
  2. 结合PC的关系验证
  3. 持续优化Prompt

关键代码

完整的LLM抽取器

class PlantConnectomeStyleExtractor:
    def __init__(self, api_key):
        self.client = openai.OpenAI(api_key=api_key)
    
    def extract(self, text, gene_id):
        prompt = self._build_prompt(text, gene_id)
        response = self.client.chat.completions.create(
            model="gpt-4o-mini",
            messages=[
                {"role": "system", "content": "You are a precise scientific information extractor."},
                {"role": "user", "content": prompt}
            ],
            temperature=0.0,
            response_format={"type": "json_object"}
        )
        return json.loads(response.choices[0].message.content)
    
    def _build_prompt(self, text, gene_id):
        return f"""Extract gene relationships from:
        
Gene: {gene_id}
Text: {text}

Output JSON with fields:
- source: gene name
- relationship: one of [expressed_in, transports, regulates, ...]
- target: related entity
- target_type: [tissue, metabolite, process, ...]
- evidence: exact quote from text
- confidence: 0.0-1.0
"""

总结

维度 PlantConnectome 我们的实现
方法 GPT-4o处理71K论文 规则匹配40基因
规模 320万关系 107关系
精度 高 (LLM理解) 中 (规则匹配)
成本 高 (API费用) 低 (本地规则)
可扩展 好 (批量API) 好 (无需API)

建议: 先用规则快速验证,再用LLM提升精度