🚀从零搭建RAG系统:160行代码让你彻底搞懂检索增强生成
最近大模型很火,但用过 ChatGPT 的朋友都知道一个痛点:模型不知道你的私有知识。
你问它公司内部的规章制度、产品文档,或者某本冷门书籍的内容,它要么胡编乱造,要么直接说不知道。怎么办?
今天给大家介绍一个超轻量的 RAG 实现——CatRag,仅仅 160 行代码,却能完整展示 RAG 的核心原理。读完这篇文章,你不仅能理解 RAG 的工作流程,还能动手搭建自己的知识库问答系统。
一、什么是 RAG?
RAG(Retrieval-Augmented Generation,检索增强生成) 是一种让大模型"开卷考试"的技术。
简单说就是:先检索,再生成。
用户提问 → 从知识库找相关资料 → 把资料喂给大模型 → 生成答案
这样做有两个巨大优势:
- 解决幻觉问题:大模型基于检索到的真实文档回答,不会瞎编
- 支持私域知识:不用训练模型,就能让它读懂你的内部文档
二、CatRag:最小的完整RAG实现
本文介绍的 CatRag 的开源项目,堪称 RAG 的"最小可用产品"(MVP)。
它有多简洁?
- 核心代码只有 1 个文件,加上注释才160行代码!
- 核心依赖只有 1 个包(openai)
- 但功能完整:文档加载、切片、向量化、检索、生成,一个不少
项目结构一览
catrag/
├── main.py # 全部核心代码
├── documents/ # 放你的文档
│ └── 南游记.txt # 示例文档
└── .env # 配置API密钥
三、RAG的六步工作流程
CatRag 完整展示了 RAG 的六个关键步骤,我们逐一拆解:
第1步:加载文档
def load_document(file_path):
with open(file_path, 'r', encoding='utf-8') as f:
return f.read()
简单粗暴,从本地读取文本文件。实际生产环境可以扩展为读取 PDF、Word、网页等。
第2步:文档切片(Chunking)
def split_text(text, chunk_size=1000, overlap=100):
chunks = []
for i in range(0, len(text), chunk_size - overlap):
chunks.append(text[i:i+chunk_size])
return chunks
为什么要切片?
因为大模型的上下文长度有限,而且向量检索的粒度越细,精度越高。CatRag 采用 1000 字符为一块,重叠 100 字符,确保语义不会刚好被切断。
第3步:向量化(Embedding)
这是 RAG 的核心魔法。CatRag 使用阿里云的 text-embedding-v3 模型,把文本变成 1024 维的向量。
def get_embedding(text):
# 调用阿里云Embedding API
response = client.embeddings.create(
model="text-embedding-v3",
input=text
)
return response.data[0].embedding
向量是什么? 你可以把它理解为文本的"指纹"。语义相近的句子,在向量空间中的距离也很近。
第4步:相似度检索
当用户提问时,先把问题也向量化,然后计算与所有文档片段的余弦相似度:
def cosine_similarity(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
找出相似度最高的 Top-K 个片段,这些就是最相关的参考资料。
第5步:构建Prompt
把检索到的文档片段拼接成上下文,塞进 Prompt:
基于以下文档内容回答问题:
[文档片段1]
[文档片段2]
...
用户问题:XXX
第6步:生成答案
调用大模型(CatRag 使用阿里云的 qwen-plus),基于提供的上下文生成最终答案。
四、实际运行效果
项目内置了《南游记》作为测试文档。当你问:
"南游记的第六回的标题是什么?"
系统会:
- 把《南游记》切成若干段
- 找到包含"第六回"的片段
- 交给大模型整理答案
输出结果:
《南游记》第六回的标题是:到灵山真经圆满 归南海果位高升。
完全正确!而且因为基于原文检索,答案准确可靠。
五、为什么这个项目值得学习?
1. 去繁就简,直击本质
市面上的 RAG 框架(如 LangChain、LlamaIndex)功能强大,但封装太厚,初学者容易被各种概念绕晕。CatRag 剥离了所有非核心功能,让你看清 RAG 的本质就是:向量检索 + 上下文生成。
2. 易于扩展
你可以轻松在此基础上添加:
- 支持 PDF/Word 解析
- 接入向量数据库(如 Milvus、Qdrant)
- 实现多轮对话记忆
- 添加重排序(Rerank)优化检索效果
六、快速上手
1. 安装依赖
pip install openai python-dotenv
2. 配置API密钥
创建 .env 文件:
API_KEY=你的阿里云API密钥
3. 放入文档
把任意 txt 文件放进 documents/ 目录
4. 修改问题并运行
user_query = "你想问的问题"
python main.py
七、RAG的进阶方向
如果你已经跑通了 CatRag,可以进一步探索:
| 方向 | 说明 |
|---|---|
| 向量数据库 | 用 Milvus/Pinecone 替代本地缓存,支持海量文档 |
| 混合检索 | 向量检索 + 关键词检索(BM25),提升召回率 |
| 重排序 | 用专门的排序模型对 Top-K 结果精排 |
| 查询改写 | 让 AI 先优化用户问题,再检索 |
| 多模态RAG | 支持图片、表格、视频内容的检索 |
八、写在最后
RAG 是大模型落地企业场景的最重要技术之一。它不需要你训练模型,不需要昂贵的算力,只需要把现有文档整理好,就能让 AI 读懂你的业务知识。
CatRag 用最少的代码展示了 RAG 的完整链路,是学习这项技术的绝佳起点。正如项目的名字一样——像猫一样敏捷、轻量。
项目地址: gitee.com/edfeff/catr…
欢迎大家关注我的公众号【dev派】,今后为大家带来更多的AI相关内容!