高中学习 RAG 问答助手
在普通 Windows 电脑上,把九科教材与 Obsidian 笔记接入 AnythingLLM,形成带引用的本地检索与云端生成问答链路。
项目状态:已完成本地落地与小规模问答抽查。当前版本属于 RAG 问答助手,尚未实现自主规划、工具选择和连续任务执行。
项目背景
高中学习资料分散在九科教材 PDF、Obsidian 笔记和速记手册中。这个项目希望在不改变原有笔记习惯的前提下,增加一个可以检索教材与笔记、生成回答并标注来源的问答入口。
运行机器是普通 Windows 10 电脑,没有适合本地大模型推理的高性能独立显卡。因此系统把文档、嵌入和向量检索留在本机,把生成回答交给 MiMo API。
已交付结果
| 项目 | 本次落地记录 |
|---|---|
| 知识来源 | 127 篇 Obsidian 笔记、九科 40 本教材 |
| 数据规模 | 780 个文档、7,059 个向量块,原始材料约 500 万字 |
| 本地组件 | AnythingLLM Desktop、multilingual-e5-small、LanceDB |
| 云端组件 | 小米 MiMo API,用于生成回答 |
| 首次搭建 | 本次记录约半天,包括下载、配置和教材入库 |
| 问答延迟 | 本机抽查约 3–6 秒 |
| 当前验证 | 5 个跨学科问题命中预期教材或笔记,相似度约 0.87–0.91 |
这些数字来自 2026 年 9 月的指定机器和材料,不代表其他环境或模型版本。相似度只能说明检索排序信号,不能单独证明答案准确率。
技术架构
| 组件 | 选型 | 作用 |
|---|---|---|
| 问答界面与 RAG 管理 | AnythingLLM Desktop v1.16.1 | 文档管理、检索、对话和引用展示 |
| 嵌入模型 | multilingual-e5-small(本地 ONNX) | 把中文教材和笔记转换成向量 |
| 向量数据库 | LanceDB | 在本机保存与检索向量 |
| 生成模型 | MiMo API | 根据问题与召回片段生成回答 |
数据与隐私边界
教材、笔记、解析文本、嵌入模型和向量数据库保存在本机。使用 MiMo API 生成回答时,用户问题与检索命中的文本片段会发送给模型服务商。因此本项目是“本地存储与检索 + 云端生成”,不能描述为全部数据不出机。
API Key 只通过 AnythingLLM 配置或本地环境变量保存,不写入脚本、截图和版本库。涉及个人信息、未公开试卷或其他敏感资料时,应先脱敏,或改用经过验证的本地模型。
实施过程
1. 配置中文检索
AnythingLLM 默认嵌入模型对本项目的中文材料表现不理想,因此切换为本地 multilingual-e5-small。模型文件约 470 MB;本次环境无法稳定访问官方 CDN,改从可用镜像下载后放入本地模型目录。
2. 批量导入笔记
少量文件可以通过界面上传。127 篇 Markdown 笔记使用本地脚本调用 AnythingLLM API 批量上传、加入工作区并写入导入台账,避免重复处理未变化文件。
3. 修复教材 PDF 丢正文
部分文字版教材由 AnythingLLM 直接解析时丢失大量正文。一个约 15 万字的样本只得到约 4 千词,主要剩下封面和版权页。
处理方式改为:使用 pypdf 按页提取文本,每 10 页组成一个带原始页码标记的 Markdown 分节,再上传并建立向量。这样既保留了正文,也让引用能够回到教材页段。扫描页没有可靠文本层时,仍需要单独走 OCR 和人工抽检。
4. 增量维护
导入脚本用文件路径、哈希和处理状态记录增量台账。新增或修改笔记后重新扫描,只处理变化项;完成后核对源文件、台账、工作区文档和向量状态,而不是只相信上传接口返回成功。
真实踩坑
| 问题 | 表现 | 本次处理 |
|---|---|---|
| PDF 解析不完整 | 大量教材正文缺失 | pypdf 按页提取并保留页码,再分节入库 |
| 中文召回不理想 | 问题与教材语义相关但排序靠后 | 改用 multilingual-e5-small,并重新建立向量 |
| 模型下载失败 | 下载长期停留在 0% | 使用可访问镜像下载并核对模型文件 |
| 批量上传文件名异常 | 含逗号的文件名导致 multipart 处理失败 | 改用脚本构造上传请求,避免命令行参数歧义 |
| 同步状态不透明 | 上传成功不代表已加入工作区并生成向量 | 分别核对上传、工作区文档和向量状态 |
当前实践边界
本次实践用语文、历史、生物和政治等 5 个问题检查了检索、回答和引用链路,均找到预期教材或笔记,检索相似度约为 0.87–0.91。这些结果用于记录本机搭建效果,不代表所有学科问题都能达到相同表现,也不把相似度解释成答案准确率。
配套脚本
| 脚本 | 用途 |
|---|---|
import_vault.py | 增量导入 Markdown 笔记并维护台账 |
import_all_textbooks.py | 提取教材 PDF、按页段切分、上传与嵌入 |
archive_pdfs.py | 按科目整理教材文件 |
ask*.py | 调用指定工作区进行问答与引用抽查 |
stats.py | 统计文档、向量块和磁盘占用 |
下一步
- 按学科拆分工作区,减少跨学科检索干扰;
- 对扫描教材增加 OCR,并改善公式、表格和多栏排版处理;
- 为不同学科设计回答模板,继续保留教材引用;
- 自动同步新增笔记,并完善失败重试、去重和备份;
- 在验证稳定后加入自动出题、错题整理和笔记回写;
- 只有形成自主规划与工具执行闭环后,再升级为学习 Agent。
工具配置会随版本变化。复现前请核对 AnythingLLM Desktop 官方说明和 MiMo API 官方快速开始。本文中的版本、成本和性能数字均为本次环境记录。
搭建过程和关键取舍可继续阅读实战文章。