🚀从零搭建RAG系统:160行代码让你彻底搞懂检索增强生成

0 阅读5分钟

🚀从零搭建RAG系统:160行代码让你彻底搞懂检索增强生成

生成 RAG 系统配图.png


最近大模型很火,但用过 ChatGPT 的朋友都知道一个痛点:模型不知道你的私有知识

你问它公司内部的规章制度、产品文档,或者某本冷门书籍的内容,它要么胡编乱造,要么直接说不知道。怎么办?

今天给大家介绍一个超轻量的 RAG 实现——CatRag,仅仅 160 行代码,却能完整展示 RAG 的核心原理。读完这篇文章,你不仅能理解 RAG 的工作流程,还能动手搭建自己的知识库问答系统。


一、什么是 RAG?

RAG(Retrieval-Augmented Generation,检索增强生成)  是一种让大模型"开卷考试"的技术。

简单说就是:先检索,再生成

用户提问 → 从知识库找相关资料 → 把资料喂给大模型 → 生成答案

这样做有两个巨大优势:

  1. 解决幻觉问题:大模型基于检索到的真实文档回答,不会瞎编
  2. 支持私域知识:不用训练模型,就能让它读懂你的内部文档

二、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. 把《南游记》切成若干段
  2. 找到包含"第六回"的片段
  3. 交给大模型整理答案

输出结果:

《南游记》第六回的标题是:到灵山真经圆满 归南海果位高升

完全正确!而且因为基于原文检索,答案准确可靠。


五、为什么这个项目值得学习?

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相关内容!