从零实现 GeekAgent —— Day14 轻 RAG 知识库
内容提要
本文介绍从零实现GeekAgent第14天,构建轻量RAG知识库。通过`rag_add`采集网页或文件,按800字切块存入JSON;`rag_search`用BM25检索相关段落,最多返回四块。复用Day13的切块与搜索函数,实现“先查资料再回答”,支持`/rag`命令管理,适合少量文档场景。
延伸解读
轻 RAG 的适用边界
本文实现的轻 RAG 用 BM25 替代向量检索,用 JSON 文件替代向量数据库,适合少量教程和本地资料。它不支持向量检索、结果重排、文档删除更新,也不识别标题章节,HTML 清理仅基础处理。若文档规模大或需要语义检索,需考虑更成熟的方案。
采集与阅读分离的意义
rag_add 在内部完成读取、切块和写盘,只返回摘要,避免长文占用上下文。这体现了 RAG 的核心思想:先查资料再回答。模型只在需要时通过 rag_search 获取相关段落,既节省上下文,又保证回答有据可依。
复用与差异:记忆与知识库
知识库复用 Day 13 的切块、分词和 BM25 函数,但块大小不同:记忆默认 320 字,知识库用 800 字,以保留更完整的上下文。固定窗口切块简单,但可能在标题与正文间切断,成熟方案会按段落或标题切分。
Q&A
什么是轻 RAG 知识库?
轻 RAG 知识库是 GeekAgent 中用于保存外部资料(如网页、文件)的模块,通过 rag_add 采集文档并切块存储,rag_search 用 BM25 检索相关段落,实现“先查资料再回答”。它适合少量文档场景,不依赖向量数据库。
为什么不能把整篇文档都塞进上下文?
因为文档会占用大量上下文,且模型只需要其中几段,却要反复阅读全文,效率低。RAG 通过先检索相关段落再交给模型,避免这些问题。
rag_add 和 rag_search 分别有什么作用?
rag_add 用于采集网页或本地文件,将正文按 800 字切块并写入 JSON 文件,只返回摘要;rag_search 用于对自然语言问题分词并用 BM25 排序,最多返回四个相关块,每块带文档标题和段号。
轻 RAG 知识库的存储格式是什么?
知识库存储在一个 JSON 文件 .geekagent/rag/index.json 中,包含 docs 数组,每个文档有 title、source、addedAt 和 chunks(文本块数组)。
轻 RAG 知识库与长期记忆有什么区别?
长期记忆保存用户偏好、项目事实等短信息,由模型提炼后写入;RAG 知识库保存教程、手册等外部资料,由程序采集原文并切块。两者都按问题搜索,但保存对象和写入方式不同。
如何通过 /rag 命令管理知识库?
/rag 无参数时显示知识库总览(文档数、块数、来源清单);/rag add <URL 或路径>... 可以连续采集多个来源,采集前会询问确认。
轻 RAG 知识库有哪些局限性?
不做向量检索和结果重排;不支持删除、更新和自动同步文档;只按固定字符数切块,不识别标题和章节;HTML 只做基础清理,导航和页脚可能留在正文中;长期记忆与知识库分别搜索,还没有合并结果。