
前些天发现了一个巨牛的人工智能学习网站通俗易懂风趣幽默忍不住分享一下给大家。点击跳转到网站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 工具怎么选。