LangChain 入门学习第六篇-持久化索引和本地知识库问答
内容提要
本文介绍LangChain第六篇,将RAG流程拆为构建索引和问答两阶段。构建索引时读取文章、切分、生成向量,保存为JSON文件;问答时加载索引,用余弦相似度检索并调用模型回答。该实现适合教学,但非生产级,真实项目需用向量数据库。
延伸解读
索引持久化的核心:保存什么
本文明确了一个RAG索引至少需要保存三类信息:chunk文本、metadata(如来源、标题)和embedding向量。这种设计让索引可以脱离原始文档独立存在,问答时只需加载索引即可,无需重新处理文档。理解这一点有助于把握向量数据库的基本存储结构。
教学实现与生产级方案的差距
作者指出,JSON文件保存索引仅适合教学,存在文件膨胀、全量遍历、无增量更新、无版本记录等问题。真实项目应使用Chroma、FAISS、PGVector或Milvus等向量数据库。这提醒读者,学习时需明确技术方案的适用边界,避免将教学代码直接用于生产。
检索过程的透明化
本文没有使用InMemoryVectorStore,而是手写余弦相似度计算,使检索过程更透明:将问题转为向量,与索引中所有向量计算相似度,取top_k。这有助于理解向量检索的本质,也为后续调优(如第七篇提到的检索不准问题)打下基础。
Q&A
LangChain 入门学习第六篇主要讲了什么?
本文介绍了LangChain中RAG流程的持久化索引实现,将流程拆分为构建索引和问答两个阶段,并提供了教学示例代码。
如何构建持久化索引?
运行命令 `uv run python -m chapter06.build_index`,该命令会读取文章、切分文档、生成向量,并将索引保存为JSON文件。
持久化索引中保存了哪些信息?
索引中保存了每个文本片段(chunk)的正文内容、元数据(如来源文章、标题、分类)以及对应的embedding向量。
如何从持久化索引中检索答案?
运行命令 `uv run python -m chapter06.persistent_rag "问题"`,程序会加载索引,用问题生成查询向量,计算余弦相似度,返回最相关的片段,并调用模型生成回答。
为什么需要持久化索引?
因为之前的实现每次运行都要重新读取文章、切分、生成向量,文章多时效率低。持久化索引将处理好的向量和文本保存下来,下次直接加载,避免重复计算。
这个持久化索引实现有哪些局限性?
局限性包括:JSON文件会随文章数量增大而变大;每次查询需要遍历所有向量,效率低;没有增量更新机制;没有记录索引版本和生成参数。真实项目应使用向量数据库如FAISS、Chroma等。
RAG流程被拆分为哪两个阶段?
离线阶段:读取文档、切分、生成向量、保存索引;在线阶段:加载索引、检索、生成回答。