手撸一个 RAG,没那么难
前些天发现了一个巨牛的人工智能学习网站通俗易懂风趣幽默忍不住分享一下给大家。点击跳转到网站https://www.captainai.net/dongkelun上一篇讲了 RAG 是什么——开卷考试先查资料再回答。这篇直接上手。用 Python 搭一个最简单的 RAG 系统从文档导入到问答跑通大概 100 行代码。准备工作你需要的东西Python 3.9一个 OpenAI API Key或者兼容 OpenAI 接口的大模型服务几篇本地文档随便什么 markdown 或者 txt 文件都行然后装几个库pipinstalllangchain langchain-community langchain-openai chromadb解释一下这几个东西LangChain封装了 RAG 的通用流程不用自己从零写Chroma一个纯本地的向量数据库装完就能用不用单独起服务langchain-openai让 LangChain 能调用 OpenAI 的 embedding 和 chat 模型装完就开始。第一步把文档变成向量建一个文件夹docs/放几篇你的文档进去。然后跑下面的脚本importosfromlangchain_community.document_loadersimportDirectoryLoaderfromlangchain.text_splitterimportRecursiveCharacterTextSplitterfromlangchain_openaiimportOpenAIEmbeddingsfromlangchain_community.vectorstoresimportChroma# 1. 加载文档loaderDirectoryLoader(docs/,glob**/*,show_progressTrue)docsloader.load()print(f加载了{len(docs)}个文件)# 2. 切段splitterRecursiveCharacterTextSplitter(chunk_size500,# 每段最多 500 字chunk_overlap50,# 段与段之间重叠 50 字)chunkssplitter.split_documents(docs)print(f切成了{len(chunks)}段)# 3. 生成向量并存入 ChromaembeddingOpenAIEmbeddings(modeltext-embedding-3-small)vectorstoreChroma.from_documents(documentschunks,embeddingembedding,persist_directory./chroma_db,# 存到本地)vectorstore.persist()print(向量库已保存到 ./chroma_db)跑完之后你会看到一个chroma_db/文件夹里面就是你的向量数据库。这个过程每步在干什么加载把文件读进来LangChain 会自动处理 txt、md、pdf 等格式切段大模型输入有长度限制你不能把整篇文章一次性塞进去。切成 500 字一段既够表达完整意思又方便后续检索转向量用 text-embedding-3-small 模型把每段文字转成一组数字1536 维的向量。语义相近的文字向量距离也近存入Chroma 把向量和原文一起存到本地磁盘text-embedding-3-small 是 OpenAI 最便宜的 embedding 模型处理 1000 页文档大概几毛钱。也有免费方案比如 HuggingFace 的all-MiniLM-L6-v2但效果略差一点。第二步检索 回答向量库建好了接下来就是用户提问→检索→生成回答这条线。fromlangchain_openaiimportChatOpenAIfromlangchain.chainsimportRetrievalQA# 1. 加载已有的向量库embeddingOpenAIEmbeddings(modeltext-embedding-3-small)vectorstoreChroma(persist_directory./chroma_db,embedding_functionembedding,)# 2. 创建检索器retrievervectorstore.as_retriever(search_kwargs{k:3})# 3. 创建 QA 链llmChatOpenAI(modelgpt-4o-mini,temperature0)qa_chainRetrievalQA.from_chain_type(llmllm,chain_typestuff,# 把检索结果和问题一起塞给模型retrieverretriever,return_source_documentsTrue,# 返回来源方便验证)# 4. 开问question你们公司的退款政策是什么resultqa_chain.invoke({query:question})print(回答,result[result])print(\n--- 参考来源 ---)fordocinresult[source_documents]:print(f来自{doc.metadata[source]}{doc.page_content[:100]}...)跑完你会看到类似这样的输出回答 我们公司支持 7 天无理由退货运费由买家承担…… --- 参考来源 --- 来自 docs/refund-policy.md支持 7 天无理由退货商品不影响二次销售…… 来自 docs/faq.mdQ退货需要什么条件A自签收之日起 7 日内……看到参考来源那部分了吗这是 RAG 比纯模型好的地方——它能告诉你我是从哪看到的。你觉得答案不对可以点过去核实。一些可能有用的调整一次检索多少段上面代码里search_kwargs{k: 3}表示每次检索取最相似的 3 段。如果你的文档比较长可以调大到 5 或 8。太多了模型会分心太少了可能漏关键信息。用本地模型如果你不想走 API也可以用本地模型做 embedding 和回答# embedding 用本地的fromlangchain_community.embeddingsimportHuggingFaceEmbeddings embeddingHuggingFaceEmbeddings(model_nameall-MiniLM-L6-v2)# 问答用本地 LLM需要先装 Ollama# ollama pull llama3.2fromlangchain_community.llmsimportOllama llmOllama(modelllama3.2)效果取决于你电脑的性能和模型大小。一般来说本地 embedding 模型够用但本地 LLM 回答质量明显不如 GPT-4o-mini。混合方案比较实用embedding 用本地免费的回答用 API。文件变了怎么办文档更新了你不需要重建整个库。可以增量添加vectorstore.add_documents(new_chunks)或者删掉chroma_db/文件夹重新跑一遍——反正 embedding 很快重跑也就几十秒。总结跑通 RAG 就这三步文档 → 向量加载、切段、embedding向量 → 数据库存到 Chroma提问 → 检索 → 回答查向量库 丢给大模型全流程不超过 100 行代码。剩下的事情就是优化怎么切段更合理、怎么让检索更准、怎么让回答更靠谱——那是另一篇文章的事了。你上篇学到了 RAG 的概念这篇用代码跑了一遍流程。下篇聊聊市面上的 RAG 工具怎么选。

相关新闻

如何将MacBook触控板变成精准电子秤:TrackWeight完整指南

如何将MacBook触控板变成精准电子秤:TrackWeight完整指南

如何将MacBook触控板变成精准电子秤:TrackWeight完整指南 【免费下载链接】TrackWeight Use your Mac trackpad as a weighing scale 项目地址: https://gitcode.com/gh_mirrors/tr/TrackWeight 你是否曾想过,你的MacBook触控板除了点击和滑动&am…

2026/10/5 0:15:48 阅读更多 →
自动售货机端侧AI推理部署实战:从YOLOv11n到RK3588的全链路工程实践~YH

自动售货机端侧AI推理部署实战:从YOLOv11n到RK3588的全链路工程实践~YH

2026年被业界定义为"端侧AI规模化落地的元年",这一趋势在自动售货机行业尤为显著。传统云端推理方案面临延迟不稳定、带宽成本高、网络依赖性强三大瓶颈,而端侧AI方案正在快速替代这一模式。本文基于RK3588平台,从硬件选型、模型部…

2026/10/6 17:15:33 阅读更多 →
Ollama 生成 React 组件省了 3 天,却让我多花了 2 周改 Bug——AI 写前端的真实成本清单

Ollama 生成 React 组件省了 3 天,却让我多花了 2 周改 Bug——AI 写前端的真实成本清单

Ollama 生成 React 组件省了 3 天,却让我多花了 2 周改 Bug--AI 写前端的真实成本清单 AI 辅助前端开发的陷阱与实战解决方案:从崩溃到稳定的全流程复盘 为什么选择 Ollama 作为开发起点 当产品经理在周一晨会上甩来 15 个复杂表单的需求时,我面临着一个典型的技术决策点:是手…

2026/9/29 10:53:06 阅读更多 →

最新新闻

Discuz! 3.2 英文语言包替换完整指南:告别中英混杂

Discuz! 3.2 英文语言包替换完整指南:告别中英混杂

简介:这是一套专为 Discuz! 3.2 论坛系统精心制作的完整英文语言包,主要面向拥有海外用户、希望搭建国际社区的站点,也适合开发者用于源码研读与二次开发,能够彻底解决中文界面带来的阅读和操作困扰。压缩包整体体积仅 772KB&…

2026/10/14 21:44:47 阅读更多 →
递归解决24点问题:从暴力枚举到剪枝优化实践

递归解决24点问题:从暴力枚举到剪枝优化实践

1. 24点问题的本质:为什么暴力枚举会爆炸,递归却能精准命中先说个老实话,很多人第一次看到24点题,脑子里冒出来的想法是"穷举所有可能"。四张牌,每张牌有4种可能的数字(A到K对应1到13&#xff0c…

2026/10/14 21:44:47 阅读更多 →
Python3字符编码完全指南:str/bytes/UTF-8/GBK转换与乱码排查

Python3字符编码完全指南:str/bytes/UTF-8/GBK转换与乱码排查

先从一个我前几天亲手踩过的坑说起。从旧系统导出一批报表数据,文件在 Excel 里打开一切正常,但脚本里open(file).read()之后打印,满屏都是锟斤拷。问题出在文件当初是 GBK 编码保存的,而 Python3 在读文本时默认按 UTF-8 解码&am…

2026/10/14 21:44:47 阅读更多 →
手写负载均衡算法:从轮询到一致性哈希的完整实战

手写负载均衡算法:从轮询到一致性哈希的完整实战

经常有人问我:负载均衡不是网关干的活吗,你一个写业务逻辑的,折腾它干嘛?说实话,我早些年也是这么想的。后来在服务治理、RPC 框架、缓存路由这些场景里被按在地上摩擦了几次,才明白一个道理:网…

2026/10/14 21:44:47 阅读更多 →
Java自建短信网关:阿里云ECS上实现高可用验证码服务

Java自建短信网关:阿里云ECS上实现高可用验证码服务

1. 项目概述:为什么一个“快乐项目”要从短信验证码开始?“快乐项目”这个词乍一听像学生课设或者兴趣小组的代号,但在我带过的几十个实际落地项目里,它往往藏着最真实的需求——不是炫技,不是堆砌架构,而是…

2026/10/14 21:44:47 阅读更多 →
AI Agent实战指南:从架构设计到工程落地的核心要点

AI Agent实战指南:从架构设计到工程落地的核心要点

1. 从"会聊天的模型"到"能办事的Agent":认知先对齐很多人第一次接触 AI Agent,脑子里浮现的还是那个对话框——你问一句,它答一句,答完就结束。但如果你真拿这种心态去搭 Agent,大概率会在第三天就…

2026/10/14 21:43:45 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →