6.0 KiB
Executable File
6.0 KiB
Executable File
Gene Family MAS - RAG 模块项目记录
最后更新: 2026-03-06 项目状态: RAG核心功能可用,LLM对话已修复
📌 项目概述
项目目标: 构建基因家族分析 RAG 系统,从"文献检索工具"升级为"具备领域推理能力的虚拟合作者"。
核心技术栈:
- 嵌入模型: BGE-M3 (本地模型)
- LLM: 多提供商 (GLM, Kimi, MiniMax, DeepSeek) + Ollama (本地 qwen3:0.6b)
- 向量存储: FAISS + 自定义存储
- 前端: Vue 3 + Element Plus
数据资源:
- 当前文献: 87 篇 (已索引)
- Chunk 数量: 5,107
- 待处理文献: 12,483 篇 Q1 论文
✅ 2026-03-06 更新日志
修复内容
| 问题 | 原因 | 解决方案 | 状态 |
|---|---|---|---|
| BGE-M3 模型加载失败 | PyTorch 输出大量进度日志导致 IO 瓶颈 | 添加环境变量抑制 (TF_CPP_MIN_LOG_LEVEL, TRANSFORMERS_VERBOSITY) |
✅ |
| /chat 返回空结果 | 1) BM25 索引返回空 2) 无 fallback 机制 3) 默认 LLM 无 API Key | 1) 添加 substring fallback 2) 改用 Ollama 本地模型 | ✅ |
技术细节
1. BGE-M3 模型加载问题
- 现象: 模型加载时输出大量 "Loading weights: xx%" 进度日志
- 原因: 不是缺库,而是 PyTorch 加载 2GB 模型权重时输出大量日志
- 解决: 在
rag_api.py开头添加:
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
os.environ['TOKENIZERS_PARALLELISM'] = 'false'
os.environ['TRANSFORMERS_VERBOSITY'] = 'error'
os.environ['HF_HOME'] = '/tmp/hf_home'
2. 搜索 fallback 机制
- 问题:
/chat默认使用normal模式调用hybrid_search,依赖 BM25 索引,但 BM25 返回空结果时直接失败 - 解决: 修改
hybrid_retriever.py的search()方法,添加失败自动切换逻辑:
if mode == "normal":
results = await self._hybrid_search(query, top_k, alpha)
if results:
return results
# Fallback to substring if hybrid fails
return await self._substring_search(query, top_k)
3. LLM 配置
- 问题: 默认使用 GLM 但没有 API Key
- 解决: 修改
config/llm.yaml,将默认 provider 改为 Ollama:
default:
provider: "ollama"
model: "qwen3:0.6b"
测试结果
| 查询 | 状态 |
|---|---|
SPL gene |
✅ 返回苦荞 FtSPL 相关文献 |
MYB |
✅ 返回葫芦科相关文献 |
WRKY |
✅ 返回甜橙 WRKY 相关文献 |
What is SPL gene? |
❌ 分数太低,无结果 |
我应该怎么做 |
❌ 无匹配内容 |
当前限制
- 长句/复杂问句匹配差 - 检索基于关键词匹配,不是语义理解
- 需要关键词触发 - 查询需要包含基因家族名称 (SPL, MYB, WRKY 等)
- 知识库有限 - 当前仅 87 篇论文,缺少分析方法论文献
✅ 第一阶段:基础设施搭建 (已完成)
1.1 核心模块修复
| 任务 | 文件 | 状态 | 备注 |
|---|---|---|---|
| RAG API 修复 | scripts/rag_api.py |
✅ | 添加 /chat 端点支持 RAG+LLM |
| PDF 提取器修复 | src/rag/pdf_extractor.py |
✅ | 添加 Unicode 清理,处理中文 PDF |
| Ollama 提供商修复 | src/llm/providers/ollama.py |
✅ | 修复 async/sync 问题 |
| 前端语法修复 | frontend/index.html |
✅ | 修复 JSON.stringify 语法错误 |
| BGE-M3 加载修复 | src/rag/embeddings.py |
✅ | 添加日志抑制 |
| 检索 fallback | src/rag/hybrid_retriever.py |
✅ | 添加失败自动切换 |
| LLM 配置 | config/llm.yaml |
✅ | 改用 Ollama |
1.2 索引构建
| 指标 | 数值 |
|---|---|
| PDF 数量 | 87 篇 |
| Chunk 数量 | 5,107 |
| 索引大小 | ~98 MB (chunks + embeddings) |
🔬 第二阶段:技术调研结论
2.1 切块方法对比
| 方法 | 优点 | 缺点 | 结论 |
|---|---|---|---|
| Fixed-Size | 简单、快 | 可能切断语义 | ✅ 当前使用 (50词+30重叠=60%) |
| Recursive | 平衡好 | 仍可能切断专业术语 | 备选 |
| Semantic | 语义完整 | 2-3x 嵌入成本 | 非必须 |
2.2 检索方式对比
| 方法 | 精度提升 | 复杂度 | 结论 |
|---|---|---|---|
| 纯向量 | 基准 | 低 | ✅ 当前使用 |
| 混合检索 (BM25+向量+RRF) | +20-35% | 高 | 后续可升级 |
🧬 基因家族 RAG 需求分析
核心模块 (已完成)
| 模块 | 状态 |
|---|---|
| 向量检索基础 | ✅ |
| PDF 提取 | ✅ |
| LLM 集成 | ✅ |
| 实体提取 | ✅ |
| 外部链接 | ✅ |
待开发模块
| 模块 | 实现方式 | 难度 |
|---|---|---|
| 物种识别 | 正则 + 物种数据库校验 | ⭐ |
| Pfam 提取 | 正则匹配 PFxxxxx | ⭐ |
| 基因名提取 | 正则 + 物种基因名数据库 | ⭐⭐ |
| 数据集编号 | 正则匹配 GSE/SRA/PRJNA | ⭐ |
📋 后续优化方向
2026-03-19 更新:开源项目对比结论
| 项目 | 建议 | 优先级 |
|---|---|---|
| Mem0 | ✅ 优先集成,解决跨对话记忆 | P0 |
| Qdrant | ✅ 完全迁移,支持持久化 | P1 |
| Unstructured | ⚠️ 可选,PyMuPDF 目前够用 | P2 |
| LlamaIndex/LangChain | ❌ 不建议,会丢失技能化架构 | - |
核心结论: 不需要迁移到 LlamaIndex/LangChain,只需在现有编排器上加 Mem0 记忆层。详见 memory/2026-03-19.md
原有优化方向
- 降低检索阈值 - 让更多结果通过,增加 LLM 可用上下文
- 添加系统提示 - 让 LLM 根据少量内容生成完整回答
- 扩展知识库 - 添加基因家族分析方法论文献
- 意图识别 - 区分查询类型 (是什么/怎么做/有多少)
📁 相关文件路径
| 类型 | 路径 |
|---|---|
| 主项目 | /home/xia-lab/gene-family-mas/ |
| RAG API | /home/xia-lab/gene-family-mas/scripts/rag_api.py |
| 嵌入模型 | /home/xia-lab/wutx/00test/bbav2/scripts/bge-m3-model |
| 索引数据 | /home/xia-lab/gene-family-mas/data/rag_index/ |
| 实体数据库 | /home/xia-lab/gene-family-mas/data/rag/entities.db |
记录人: Sisyphus AI Agent 最后更新: 2026-03-19