简易论文数据库(PaperRAG)搭建流程
整体架构
PDF论文 → PyMuPDF提取文本 → 段落分块(800字符) → SentenceTransformer编码 → ChromaDB存储
↓
用户查询 → SentenceTransformer编码查询 → ChromaDB向量相似度搜索 → 返回相关分块
两大使用方式:
直接调用 ChromaDB:Python脚本直接操作数据库
MCP Server:通过
mcp_server.py提供三个工具(search_papers / list_papers / get_paper_detail),供 AI 客户端调用
数据入库流程(ingest.py)
1. PDF文本提取
使用 PyMuPDF(fitz)的
page.get_text("text")提取纯文本层每页内容标记页码:
[Page N]同时提取元数据(标题、作者),元数据缺失时从文件名推断
2. 文本分块
先按
\n\n分割段落再以800字符为窗口合并段落,重叠100字符
重叠部分从上一个chunk尾部截取,拼接到下一个chunk开头
问题:固定字符窗口会切断跨段落语义上下文
3. 向量编码与存储
模型:all-MiniLM-L6-v2(SentenceTransformer)
每个chunk → 1个384维向量
存入 ChromaDB,使用 cosine 相似度(HNSW索引)
每个chunk附带元数据:title / author / filename / chunk_index / total_chunks
嵌入模型详解(all-MiniLM-L6-v2)
架构
参数 | 值 -- | -- 类型 | Transformer Encoder 层数 | 6 隐藏维度 | 384 注意力头数 | 12 最大输入长度 | 256 tokens 输出向量维度 | 384关键文件
ingest.py:PDF提取 + 分块 + 嵌入 + 入库mcp_server.py:MCP Server,提供搜索/列表/详情三个工具chroma_db/:ChromaDB持久化数据库(SQLite + HNSW向量索引)
运行方式
# 入库conda run -n aion python ingest.py# 启动MCP Serverconda run -n aion python mcp_server.py# 直接查询(Python脚本)conda run -n aion python -c "..."注意:Windows PowerShell + conda run 存在GBK编码问题,Unicode字符(如公式符号)会导致 UnicodeEncodeError。解决方法:将脚本写成 .py 文件执行,输出写入文件再读取。