192 lines
6.0 KiB
Markdown
Executable File
192 lines
6.0 KiB
Markdown
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` 开头添加:
|
|
```python
|
|
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()` 方法,添加失败自动切换逻辑:
|
|
```python
|
|
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:
|
|
```yaml
|
|
default:
|
|
provider: "ollama"
|
|
model: "qwen3:0.6b"
|
|
```
|
|
|
|
### 测试结果
|
|
|
|
| 查询 | 状态 |
|
|
|------|------|
|
|
| `SPL gene` | ✅ 返回苦荞 FtSPL 相关文献 |
|
|
| `MYB` | ✅ 返回葫芦科相关文献 |
|
|
| `WRKY` | ✅ 返回甜橙 WRKY 相关文献 |
|
|
| `What is SPL gene?` | ❌ 分数太低,无结果 |
|
|
| `我应该怎么做` | ❌ 无匹配内容 |
|
|
|
|
### 当前限制
|
|
|
|
1. **长句/复杂问句匹配差** - 检索基于关键词匹配,不是语义理解
|
|
2. **需要关键词触发** - 查询需要包含基因家族名称 (SPL, MYB, WRKY 等)
|
|
3. **知识库有限** - 当前仅 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`
|
|
|
|
### 原有优化方向
|
|
|
|
1. **降低检索阈值** - 让更多结果通过,增加 LLM 可用上下文
|
|
2. **添加系统提示** - 让 LLM 根据少量内容生成完整回答
|
|
3. **扩展知识库** - 添加基因家族分析方法论文献
|
|
4. **意图识别** - 区分查询类型 (是什么/怎么做/有多少)
|
|
|
|
---
|
|
|
|
## 📁 相关文件路径
|
|
|
|
| 类型 | 路径 |
|
|
|------|------|
|
|
| 主项目 | `/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*
|