
本文通过50行纯Python代码教你跑通一个基础的RAG检索增强生成系统实现文档问答功能。文章从环境准备、代码结构、逐行解析到真实文档接入全程无LangChain、向量数据库和Docker适合小白和程序员快速入门。核心步骤包括文档切分、文本向量化、相似度检索和调用大模型生成答案。通过本文读者将对RAG有直观认识为后续学习更复杂的向量库选型、Rerank等打下基础。手写一个迷你 RAG50 行代码跑通文档问答系列RAG 实战系列 第01篇 上一篇MCP vs A2A vs ACP2026 年 Agent 协议选型指南协议层系列完结 预计阅读12 分钟 读完你能得到一个能跑、能改、能接你真实文档的迷你 RAG——完整 50 行代码在文末可直接复制引子每个想做 RAG 的人都死在第一周一位读者的原话私信“想让公司内部文档能问答。搜了三天教程LangChain 版本对不上、LlamaIndex 文档看不懂、还得先装 Docker 起个 Milvus……我到现在一行代码都没跑起来。”这是 RAG 落地最真实的死法——不是死于技术难是死于框架太重。RAG 的本质其实非常简单把你的文档切成小块 → 变成向量 → 用户提问时找到最相关的几块 → 塞进 prompt 让大模型回答。就这么四步。什么 LangChain、向量数据库、Docker都是这四步的工业化包装。包装有价值但你不应该先学包装再学本质。这篇用 50 行纯 Python 跑通上面四步——不用 LangChain不用向量数据库不用 Docker。跑通之后你会对后面三篇踩坑实录、向量库选型、Rerank里的每个概念都有体感。一、环境准备2 分钟装好1 装依赖只需要两个包Python 3.9pip install sentence-transformers openai包干什么备注sentence-transformers文本向量化本地跑免费会自动带上 torchopenai调大模型 API兼容 DeepSeek 等任何 OpenAI 格式接口2 验证安装python -c import sentence_transformers; print(OK, sentence_transformers.__version__) # 输出类似: OK 3.x.x —— 就绪3 准备大模型 API Key用 DeepSeek 举例换任何 OpenAI 格式的服务都行打开 https://platform.deepseek.com/API Keys → 创建 → 复制形如sk-xxxx第一次跑SentenceTransformer时会下载模型文件约 100MB一次性。国内网络慢的话设置镜像export HF_ENDPOINThttps://hf-mirror.com环境就绪。下面进入正题——先看全景再逐块拆。二、全景50 行代码长什么样先上完整结构细节下节拆。整个 RAG 就三个函数 一段准备# ── 准备文档 嵌入模型 ────────────────── docs [...] # ① 你的文档切成块后的 model SentenceTransformer(...) # ② 嵌入模型本地 doc_vecs model.encode(docs) # ③ 全部向量化建索引 # ── 检索函数 ────────────────────────────── def retrieve(query, top_k): # ④ 问题向量化 → 余弦相似度 → 排序取前K # ── 生成函数 ────────────────────────────── def answer(question): # ⑤ 检索 → 拼上下文 → 调大模型没有向量数据库。 因为 5 条文档的向量检索就是一个矩阵乘法——numpy一行搞定。向量数据库解决的是百万级向量的检索性能你先用不到等用到时再看第 03 篇。对照上图这 50 行覆盖了管道的核心三层切分→向量化→检索→生成。工业级管道里剩下的层清洗、重排、评估是后面三篇的主角。三、逐块拆解每一行为什么这么写1 文档块chunk 是什么docs [ RAG 是检索增强生成的缩写通过检索外部知识来增强大模型的回答。, RAG 系统的核心组件包括文档切分、向量化、向量存储、检索和生成。, RAG 相比微调的优势成本低、知识可随时更新、不遗忘通用能力。, chunk 是 RAG 中的最小检索单元通常包含 256-512 个 token。, 余弦相似度是 RAG 中最常用的向量相似度度量方法。, ]为什么是一条一条而不是整篇文档 因为检索的粒度决定命中的精度你问chunk 多大合适如果索引的是整篇 5000 字文档向量是全文语义的平均值跟问题的相关度就被稀释了。切成小块每块向量语义集中命中率才高。这里的 5 条是演示数据手工切好的。接真实文档时把你的 md/txt 读进来按段落或每 300-500 字切一刀即可——第 02 篇会专门讲切分怎么踩坑。2 向量化本地嵌入模型model SentenceTransformer(BAAI/bge-small-zh-v1.5) doc_vecs model.encode(docs, normalize_embeddingsTrue)BAAI/bge-small-zh-v1.5中文小模型本地 CPU 可跑512 维。选它是中文 免费 快三个条件的最优解normalize_embeddingsTrue把向量归一化成单位长度。这一步是后面矩阵乘法 余弦相似度的前提——不是可选项是伏笔跑完doc_vecs是一个5 × 512的矩阵。你的向量索引建好了就一个 numpy 数组。3 检索一个矩阵乘法def retrieve(query: str, top_k: int 2): q_vec model.encode([query], normalize_embeddingsTrue) scores q_vec doc_vecs.T # 余弦相似度 top_idx scores[0].argsort()[::-1][:top_k] return [docs[i] for i in top_idx]这五行是 RAG 的心脏逐行看q_vec doc_vecs.T1×512乘512×51×5得到问题和 5 个文档块的相似度。因为两边都归一化了矩阵乘积就是余弦相似度——这就是 3.2 那个伏笔的回收argsort()[::-1]按分数从高到低排序[:top_k]取前 K 个。K 是超参数迷你版取 2验证一下检索好不好使print(retrieve(RAG 有什么优点)) # 期望输出第一条是「RAG 相比微调的优势成本低、知识可随时更新……」如果你的第一条不是它先检查normalize_embeddingsTrue是不是漏了——没归一化时矩阵乘法算的是点积受向量长度影响排序会错。4 生成拼上下文调大模型client OpenAI(api_keysk-xxx, base_urlhttps://api.deepseek.com) def answer(question: str) - str: context /n.join(f[{i1}] {c} for i, c in enumerate(retrieve(question))) resp client.chat.completions.create( modeldeepseek-chat, messages[ {role: system, content: f仅根据以下资料回答资料里没有就明确说不知道。/n{context}}, {role: user, content: question}, ], ) return resp.choices[0].message.content三个细节决定回答质量system prompt 里那句资料里没有就明确说不知道——防幻觉的最低成本手段。没有它模型会用自己的参数知识补答案跟你的文档没关系带[1] [2]编号——后续要求模型引用编号就得到最朴素的引用溯源只塞 top_k 个块不塞全部——上下文不是越多越好第 02 篇讲中间衰减时会展开5 跑起来if __name__ __main__: print(answer(RAG 的核心组件有哪些))预期输出根据资料 [2]RAG 系统的核心组件包括文档切分、向量化、向量存储、检索和生成。问一个资料里没有的print(answer(RAG 支持图片检索吗)) # 预期资料里没有提到……而不是模型自己编一段第二个输出比第一个更重要——它验证了知识边界生效这正是 RAG 相比裸模型的全部意义。四、接你的真实文档10 行改造迷你版到真实版就差一个读文件 切分import re def load_chunks(path: str, size: int 300) - list: 读文本文件按段落粗切成 ~size 字的块 text open(path, encodingutf-8).read() paras [p.strip() for p in re.split(r/n/s*/n, text) if p.strip()] chunks, buf [], for p in paras: # 小段合并、大段切开 if len(buf) len(p) size: buf /n p else: chunks.append(buf.strip()); buf p chunks.append(buf.strip()) return [c for c in chunks if len(c) 20] docs load_chunks(你的文档.md) # 替换这里 doc_vecs model.encode(docs, normalize_embeddingsTrue) # 重建索引之后retrieve/answer一行都不用改。这就是分层的红利换数据不动逻辑。千万文档块也别慌1 万块 × 512 维的矩阵乘法在笔记本上也就百毫秒级。真正的瓶颈在每次都重算全部文档向量——所以工业界把doc_vecs存起来这就叫向量库第 03 篇。五、踩坑实录跟做时最容易翻的 4 个坑坑 1模型下载 403/超时 症状Connection error卡住。解法export HF_ENDPOINThttps://hf-mirror.com后重跑。坑 2检索结果驴唇不对马嘴 症状retrieve第一条永远不对。十有八九是normalize_embeddingsTrue漏了点积冒充了余弦相似度。加上它。坑 3回答是模型自己编的跟文档无关 症状问资料外的问题模型对答如流。解法检查 system prompt 的仅根据资料回答没有就说不知道是不是被你精简掉了。这句是防幻觉底线。坑 4中文模型却全是英文文档或反之 症状英文文档用bge-small-zh检索质量暴跌。嵌入模型有语言域——中英混合场景换BAAI/bge-m3多语言稍大。这四个坑只是开胃菜。检索效果差的真实原因有 5 大类chunk 边界、中间衰减、嵌入换版……下一篇逐个拆。六、完整代码复制即跑mini_rag.py — 50 行跑通 RAG 文档问答 依赖: pip install sentence-transformers openai import re import numpy as np from sentence_transformers import SentenceTransformer from openai import OpenAI # ── ① 文档块换成 load_chunks(你的文档.md) 即接真实数据── docs [ RAG 是检索增强生成的缩写通过检索外部知识来增强大模型的回答。, RAG 系统的核心组件包括文档切分、向量化、向量存储、检索和生成。, RAG 相比微调的优势成本低、知识可随时更新、不遗忘通用能力。, chunk 是 RAG 中的最小检索单元通常包含 256-512 个 token。, 余弦相似度是 RAG 中最常用的向量相似度度量方法。, ] # ── ② 嵌入模型本地免费 ③ 建索引 ── model SentenceTransformer(BAAI/bge-small-zh-v1.5) doc_vecs model.encode(docs, normalize_embeddingsTrue) # ── ④ 检索 ── def retrieve(query: str, top_k: int 2) - list: q_vec model.encode([query], normalize_embeddingsTrue) scores q_vec doc_vecs.T top_idx scores[0].argsort()[::-1][:top_k] return [docs[i] for i in top_idx] # ── ⑤ 生成 ── client OpenAI(api_keysk-替换成你的, base_urlhttps://api.deepseek.com) def answer(question: str) - str: context /n.join(f[{i1}] {c} for i, c in enumerate(retrieve(question))) resp client.chat.completions.create( modeldeepseek-chat, messages[ {role: system, content: f仅根据以下资料回答资料里没有就明确说不知道。/n{context}}, {role: user, content: question}, ], ) return resp.choices[0].message.content # ── 接真实文档的切分器可选── def load_chunks(path: str, size: int 300) - list: text open(path, encodingutf-8).read() paras [p.strip() for p in re.split(r/n/s*/n, text) if p.strip()] chunks, buf [], for p in paras: if len(buf) len(p) size: buf /n p else: chunks.append(buf.strip()); buf p chunks.append(buf.strip()) return [c for c in chunks if len(c) 20] if __name__ __main__: print(answer(RAG 的核心组件有哪些))如何学习大模型 AI 由于新岗位的生产效率要优于被取代岗位的生产效率所以实际上整个社会的生产效率是提升的。但是具体到个人只能说是“最先掌握AI的人将会比较晚掌握AI的人有竞争优势”。这句话放在计算机、互联网、移动互联网的开局时期都是一样的道理。我在一线互联网企业工作十余年里指导过不少同行后辈。帮助很多人得到了学习和成长。我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限很多互联网行业朋友无法获得正确的资料得到学习提升故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】为什么要学习大模型我国在A大模型领域面临人才短缺,数量与质量均落后于发达国家。2023年人才缺口已超百万凸显培养不足。随着AI技术飞速发展预计到2025年,这一缺口将急剧扩大至400万,严重制约我国AI产业的创新步伐。加强人才培养,优化教育体系,国际合作并进是破解困局、推动AI发展的关键。大模型入门到实战全套学习大礼包1、大模型系统化学习路线作为学习AI大模型技术的新手方向至关重要。 正确的学习路线可以为你节省时间少走弯路方向不对努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划带你从零基础入门到精通2、大模型学习书籍文档学习AI大模型离不开书籍文档我精选了一系列大模型技术的书籍和学习文档电子版它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。3、AI大模型最新行业报告2025最新行业报告针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估以了解哪些行业更适合引入大模型的技术和应用以及在哪些方面可以发挥大模型的优势。4、大模型项目实战配套源码学以致用在项目实战中检验和巩固你所学到的知识同时为你找工作就业和职业发展打下坚实的基础。5、大模型大厂面试真题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我精心整理了一份大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。适用人群第一阶段10天初阶应用该阶段让大家对大模型 AI有一个最前沿的认识对大模型 AI 的理解超过 95% 的人可以在相关讨论时发表高级、不跟风、又接地气的见解别人只会和 AI 聊天而你能调教 AI并能用代码将大模型和业务衔接。大模型 AI 能干什么大模型是怎样获得「智能」的用好 AI 的核心心法大模型应用业务架构大模型应用技术架构代码示例向 GPT-3.5 灌入新知识提示工程的意义和核心思想Prompt 典型构成指令调优方法论思维链和思维树Prompt 攻击和防范…第二阶段30天高阶应用该阶段我们正式进入大模型 AI 进阶实战学习学会构造私有知识库扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架抓住最新的技术进展适合 Python 和 JavaScript 程序员。为什么要做 RAG搭建一个简单的 ChatPDF检索的基础概念什么是向量表示Embeddings向量数据库与向量检索基于向量检索的 RAG搭建 RAG 系统的扩展知识混合检索与 RAG-Fusion 简介向量模型本地部署…第三阶段30天模型训练恭喜你如果学到这里你基本可以找到一份大模型 AI相关的工作自己也能训练 GPT 了通过微调训练自己的垂直大模型能独立训练开源多模态大模型掌握更多技术方案。到此为止大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗为什么要做 RAG什么是模型什么是模型训练求解器 损失函数简介小实验2手写一个简单的神经网络并训练它什么是训练/预训练/微调/轻量化微调Transformer结构简介轻量化微调实验数据集的构建…第四阶段20天商业闭环对全球大模型从性能、吞吐量、成本等方面有一定的认知可以在云端和本地等多种环境下部署大模型找到适合自己的项目/创业方向做一名被 AI 武装的产品经理。硬件选型带你了解全球大模型使用国产大模型服务搭建 OpenAI 代理热身基于阿里云 PAI 部署 Stable Diffusion在本地计算机运行大模型大模型的私有化部署基于 vLLM 部署大模型案例如何优雅地在阿里云私有部署开源大模型部署一套开源 LLM 项目内容安全互联网信息服务算法备案…学习是一个过程只要学习就会有挑战。天道酬勤你越努力就会成为越优秀的自己。如果你能在15天内完成所有的任务那你堪称天才。然而如果你能完成 60-70% 的内容你就已经开始具备成为一名大模型 AI 的正确特征了。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】