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

6.2 KiB
Executable File

V12.1 Fixed 优化计划

日期: 2026-04-10 12:19 GMT+8
当前状态: LLM关系抽取成功,需进一步优化


当前成果

✅ 已验证成功

项目 结果 说明
章节提取 17个章节 过滤掉过短章节
基因提取 7个基因 SLSUT01-SLSUT08
LLM关系抽取 6个关系 成功!
章节文本保存 完整保存 核心修复完成

📊 提取到的关系

基因 关系类型 目标组织 证据来源
SLSUT01 highly_expressed_in pulp qRT-PCR实验
SLSUT01 highly_expressed_in peel qRT-PCR实验
SLSUT01 expressed_in seed qRT-PCR实验
SLSUT08 highly_expressed_in pulp qRT-PCR实验
SLSUT08 highly_expressed_in peel qRT-PCR实验
SLSUT08 expressed_in seed qRT-PCR实验

优化计划

Phase 1: 章节边界识别优化 (立即)

问题:

  • "2. Results" 主章节被跳过 (只有11字符)
  • 但子章节正确识别 (2.1, 2.2等)

当前方案: 过滤掉 <100字符的章节 ✅ 工作正常

优化方案:

# 保持当前方案,添加章节合并功能
def merge_sections(sections):
    """合并主章节和子章节"""
    merged = []
    for i, sec in enumerate(sections):
        if sec.level == 1 and i < len(sections) - 1:
            # 检查是否有子章节
            next_sec = sections[i + 1]
            if next_sec.level > sec.level:
                # 合并子章节文本到主章节
                sec.text += "\n\n" + next_sec.text
                sec.char_count = len(sec.text)
        merged.append(sec)
    return merged

Phase 2: 规则关系抽取增强 (短期)

当前问题: 规则关系为0

原因分析: 文本中表达关系描述较隐晦

优化方案:

# 增加更多正则模式
expression_patterns = [
    # 高表达
    (r'(SlSUT\d+)\s+was\s+highly\s+expressed\s+in\s+([\w\s,]+)', 'highly_expressed_in'),
    (r'(SlSUT\d+)\s+showed\s+high\s+expression\s+in\s+([\w\s,]+)', 'highly_expressed_in'),
    (r'(SlSUT\d+)\s+genes?\s+(?:were|was)\s+highly\s+expressed', 'highly_expressed_in'),
    
    # 一般表达
    (r'(SlSUT\d+)\s+is\s+expressed\s+in\s+([\w\s,]+)', 'expressed_in'),
    (r'(SlSUT\d+)\s+was\s+expressed\s+in\s+([\w\s,]+)', 'expressed_in'),
    (r'expression\s+of\s+(SlSUT\d+)\s+was\s+detected\s+in\s+([\w\s,]+)', 'expressed_in'),
    
    # 比较表达
    (r'(SlSUT\d+)\s+showed\s+more\s+significant\s+expression', 'highly_expressed_in'),
    (r'expression\s+of\s+(SlSUT\d+)\s+genes?\s+in\s+([\w\s,]+)\s+was\s+higher', 'highly_expressed_in'),
]

Phase 3: LLM关系抽取优化 (短期)

当前问题: 有些章节返回NONE

优化方案:

  1. 改进Prompt:
prompt = f"""Extract gene-tissue expression relationships from the text.

Genes: {', '.join(genes[:20])}

Text:
{text}

Instructions:
1. Look for sentences describing where genes are expressed
2. Extract: gene name, expression level (high/low), tissue/organ
3. Use "highly_expressed_in" for strong/high expression
4. Use "expressed_in" for general expression
5. Provide the exact sentence as evidence

Format: gene_id | relation | tissue | evidence

Examples:
SlSUT1 | highly_expressed_in | roots | SlSUT1 was highly expressed in roots.
SlSUT2 | expressed_in | leaves | SlSUT2 is expressed in leaves.

If no gene-tissue relationships found, return: NONE

Output:"""
  1. 增加后处理:
def post_process_relations(relations):
    """后处理关系"""
    # 去重
    seen = set()
    unique = []
    for r in relations:
        key = (r['source'], r['relation'], r['target'])
        if key not in seen:
            seen.add(key)
            unique.append(r)
    
    # 标准化组织名称
    tissue_mapping = {
        'pulp': 'fruit pulp',
        'peel': 'fruit peel',
        'seed': 'seed',
        'roots': 'root',
        'leaves': 'leaf',
    }
    
    for r in unique:
        target = r['target'].lower().strip()
        r['target'] = tissue_mapping.get(target, target)
    
    return unique

Phase 4: 批量处理优化 (中期)

目标: 处理多篇论文

方案:

import concurrent.futures

def process_papers(paper_list):
    """批量处理论文"""
    with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:
        futures = [executor.submit(process_single_paper, pdf) for pdf in paper_list]
        results = [f.result() for f in futures]
    return results

Phase 5: 知识图谱构建 (长期)

目标: 将提取的关系构建为知识图谱

方案:

# 导出到Neo4j
from neo4j import GraphDatabase

def build_knowledge_graph(relations):
    driver = GraphDatabase.driver("bolt://localhost:7687")
    with driver.session() as session:
        for rel in relations:
            session.run("""
                MERGE (g:Gene {name: $source})
                MERGE (t:Tissue {name: $target})
                CREATE (g)-[:EXPRESSED_IN {type: $relation, evidence: $evidence}]->(t)
            """, rel)

实施时间表

Phase 任务 预计时间 优先级
1 章节合并 30分钟 P1
2 规则关系增强 1小时 P2
3 LLM Prompt优化 1小时 P2
4 批量处理 2小时 P3
5 知识图谱 4小时 P4

当前代码状态

工作正常的部分 ✅

  1. API Key读取
  2. 章节提取 (过滤短章节)
  3. 基因实体提取
  4. LLM关系抽取 (使用curl)
  5. 结果保存

需要优化的部分 ⚠️

  1. 章节合并
  2. 规则关系模式
  3. LLM Prompt
  4. 关系后处理

下一步行动

立即执行 (今天)

  1. ✅ 验证LLM关系抽取成功
  2. 🔄 优化章节合并
  3. 🔄 增加规则关系模式

短期执行 (本周)

  1. 优化LLM Prompt
  2. 添加关系后处理
  3. 批量处理多论文

长期目标 (本月)

  1. 构建知识图谱
  2. 可视化关系网络
  3. 发布查询API

关键指标

指标 当前 目标
章节提取准确率 85% 95%
关系抽取数量 6个 20+个
关系准确率 100% 95%
处理时间 ~5分钟 <2分钟

计划制定: 2026-04-10 12:19 GMT+8
签名: 🧬🤖