如何从零构建第一个RAG系统?cgft-llm LlamaIndex实现RAG完整教程(PDF/文本双支持)
【免费下载链接】cgft-llmcgft-llm 是一个学习大语言模型(LLM)开发的开源资源。它提供代码、文档和视频教程,帮助用户通过实践掌握前沿核心 LLM 技术项目地址: https://gitcode.com/echonoshy/cgft-llm
cgft-llm 仓库中的 llama-index 实战模块,手把手带你用 LlamaIndex 框架从零构建第一个 RAG(检索增强生成)系统,同时支持 txt 文本与 PDF 双数据源,结合 Ollama 本地模型即可运行。无需 GPU、无需调用云端 API,跟着 5 步 Pipeline 走一遍,你就能让大模型基于你自己的私有文档回答问题,彻底解决 LLM "失忆"和幻觉问题。🚀
一、为什么需要 RAG?🧠
大语言模型再强大,也有两个天生短板:
- 知识截止:训练数据有截止日期,不知道最新信息
- 私有知识盲区:你的公司文档、笔记、论文,模型从来没见过
RAG(Retrieval-Augmented Generation,检索增强生成)的思路很直观:先把你自己的数据建成"知识索引",回答问题时先从索引里检索出最相关的内容,再把这些内容连同问题一起交给 LLM 去生成答案。模型回答不再靠"死记硬背",而是靠"现查资料",答案更准确、更可追溯。
下图就是 RAG 的基本架构:各种数据源(数据库、文档、API)汇入索引,用户提问后,索引检索出相关数据,与问题拼接成 Prompt 送入 LLM,最终返回回答。
二、RAG 的 5 步 Pipeline 🧩
cgft-llm 的 README.md 把朴素 RAG 拆解成了 5 个步骤,这也是所有 RAG 系统的通用骨架:
| 步骤 | 作用 |
|---|---|
| 1️⃣ Loading | 从不同来源加载数据(txt、PDF、API 等) |
| 2️⃣ Embedding | 把文档切分成小块,向量化成数字表示 |
| 3️⃣ Storing | 将向量存入向量库,避免重复计算 |
| 4️⃣ Indexing | 把"问题"也向量化,检索出最相近的知识 |
| 5️⃣ Querying | 问题 + 检索结果一起喂给模型,生成答案 |
理解这 5 步后,你会发现后面几个 Python 脚本不过是在逐步落地它们。
三、环境搭建:3 条命令搞定 📦
RAG 需要两个模型配合:Embedding 模型(负责向量化)和LLM(负责生成答案)。本教程用 Ollama 在本地运行,全程免费。
安装依赖只需三行:
pip install llama-index pip install llama-index-llms-ollama pip install llama-index-embeddings-ollama核心代码中通过Settings两个配置项完成模型绑定:Settings.embed_model指定向量化模型,Settings.llm指定对话模型,示例脚本统一使用wangshenzhi/llama3-8b-chinese-chat-ollama-q8这个中文优化模型。
四、实战 1:对多个文本文件的 RAG 问答 📄
仓库内置了 3 篇财经资讯 txt 文件作为示例语料,位于 docs/ 目录,其中包括霸王茶姬相关资讯——正好用来验证"模型能不能答出它本来不知道的细节"。
对应脚本是 index-doc.py,逻辑非常精简:
SimpleDirectoryReader("llama-index/docs").load_data()—— 一键读取目录下所有 txt 文件(Loading)VectorStoreIndex.from_documents(documents)—— 自动完成切分、向量化、建索引(Embedding + Storing + Indexing)query_engine.query("霸王茶姬香港店什么时候开业?店长薪酬多少?")—— 发起提问(Querying)
5 行核心代码,一个能问答的 RAG 就跑起来了。这类问题的答案模型训练时几乎不可能见过,答对说明它确实在检索你的文档。✨
五、实战 2:PDF 文档的 RAG 问答(含向量库持久化)📑
PDF 比纯文本更复杂(有版面、表格、扫描件),LlamaIndex 用专门的PDFReader来解析。示例脚本 index-pdf.py 配合语料 Subclass 500 Student visa.pdf,演示了完整流程:
parser = PDFReader() documents = SimpleDirectoryReader( "llama-index/pdf", file_extractor={".pdf": parser} ).load_data()关键亮点是向量库持久化:首次运行时把索引写入db/pdf-db目录(里面包含docstore.json、index_store.json等 JSON 文件),之后每次运行直接load_index_from_storage加载现成索引,省去重复向量化的时间——文档没变就绝不重算,这是生产环境必备的优化。🎯
然后就可以向模型提问"如果我想获得澳洲 500 签证,TOEFL 最少要考多少分?"这类细节问题了。
六、进阶:拆解 Query 的每一步 🔍
默认的query_engine.query()是黑盒,query.py 演示了如何把它拆开手动组装,理解检索与生成是如何解耦的:
- Retriever(检索器):
VectorIndexRetriever通过similarity_top_k=2控制每次只召回最相似的前 2 个文本块——召回多了会稀释关键信息,召回少了又可能漏答案,这是 RAG 调优的核心参数之一 - Response Synthesizer(答案合成器):把检索到的文本块与问题拼装成 Prompt,交给 LLM 生成最终回答
- Query Engine(查询引擎):将两者组装起来
掌握这个"三件套"结构后,你就知道 RAG 的每个环节都可以单独替换和调优,比如换检索策略、换合成模板。
七、常见问题速查 💬
Q:为什么本地 Ollama 模型答得慢?A:8B 级别模型在 CPU/消费级 GPU 上生成速度有限,脚本里已设置request_timeout=360防止超时。
Q:txt 和 PDF 的脚本可以合并成一个知识库吗?A:可以。SimpleDirectoryReader支持file_extractor混合指定多种解析器,不同格式文档统一进入同一个VectorStoreIndex即可。
Q:检索不准怎么办?A:优先调similarity_top_k,其次检查文档切分粒度和 Embedding 模型的语言能力。
八、学习路线与文件清单 🗂️
建议按以下顺序动手,每一步都对应仓库里的现成文件:
| 顺序 | 目标 | 文件 |
|---|---|---|
| 1 | 理解 RAG 原理 | README.md |
| 2 | 文本 RAG 问答 | index-doc.py |
| 3 | PDF RAG + 持久化 | index-pdf.py |
| 4 | 拆解检索流程 | query.py |
| 5 | 扩展到更多数据源 | docs/、pdf/ |
跑通这一套后,你的 RAG 已经具备了"加载 → 索引 → 持久化 → 检索 → 生成"的完整闭环。接下来可以探索 GraphRAG、混合检索等进阶方向,仓库中 graph-rag/ 和 rag-knowledge-base/ 模块都有延伸阅读。🚀
从零到一构建 RAG 系统,LlamaIndex 把最繁琐的工程细节都封装好了——你只需要准备好数据,剩下的交给这 5 步 Pipeline。动手跑一遍脚本,你对 RAG 的理解会从"听说过"直接跃升到"会用"。
【免费下载链接】cgft-llmcgft-llm 是一个学习大语言模型(LLM)开发的开源资源。它提供代码、文档和视频教程,帮助用户通过实践掌握前沿核心 LLM 技术项目地址: https://gitcode.com/echonoshy/cgft-llm
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考