基于LangChain与Ollama的本地RAG系统实战:从零搭建知识库问答应用

📅 发布时间:2026/8/25 19:10:21
基于LangChain与Ollama的本地RAG系统实战:从零搭建知识库问答应用
这次我们来看一个 Udemy 上的热门课程《Generative AI: RAG, LangChain, GraphRAG Fine-Tuning》。对于想快速上手大模型应用开发特别是想搞懂 RAG检索增强生成和 LangChain 框架的开发者来说这门课提供了一个从理论到实战的完整路径。它不是某个具体的开源工具而是一个体系化的学习资源重点解决“如何用 LangChain 等框架构建企业级 AI 应用”的问题。课程的核心价值在于它没有停留在概念层面而是直接带你动手搭建 RAG 系统、实现 GraphRAG、进行模型微调并处理企业级应用中的真实痛点。如果你关心如何将大模型能力集成到自己的项目中如何设计高效的检索流程以及如何应对幻觉、引用溯源等挑战这篇文章会为你拆解这门课的核心内容并提供一个可落地的自学与验证路线。本文会带你了解这门课程的核心模块并基于常见的开源技术栈如 LangChain、Chroma、Ollama 等演示如何搭建一个最小可运行的本地 RAG 知识库问答系统验证课程中提到的关键概念。我们重点关注的是环境如何快速搭建、核心流程如何跑通、以及如何验证 RAG 系统的效果。1. 核心能力速览虽然这是一门课程但我们可以将其“能力”理解为学完后能掌握的技术栈和可实现的系统特性。能力项说明课程类型在线视频课程Udemy平台核心技术栈RAG, LangChain, GraphRAG, Fine-Tuning, 向量数据库硬件门槛无特殊要求。本地实践部分如需运行本地大模型需准备 GPU 或足够内存的 CPU。核心产出掌握构建检索增强生成RAG系统的完整流程理解 LangChain 框架能实现 GraphRAG 和基础微调。适合场景希望系统学习 RAG 和 LangChain 的开发者、AI 应用工程师、技术决策者。前置知识基础的 Python 编程能力对机器学习和大模型有基本了解更佳。2. 适用场景与使用边界这门课程适合以下几类人AI 应用开发者已经了解了大模型 API 调用但不知道如何将其与私有数据结合构建更智能、更可靠的问答或对话系统。全栈/后端工程师希望将 AI 能力集成到现有产品中需要理解 RAG 的架构、接口设计和性能考量。技术团队负责人/架构师需要评估 RAG、GraphRAG 等技术方案为团队选择合适的技术栈和开发框架。学生与研究者希望快速进入 AIGC 应用开发领域需要一个结构化的实战指南。它能解决的核心问题包括知识滞后与幻觉通过 RAG让大模型能够基于最新的、私有的文档数据生成回答减少“一本正经地胡说八道”。复杂查询处理通过 GraphRAG 利用知识图谱让模型能理解实体间的关系回答更复杂的、需要推理的问题。成本与可控性通过微调Fine-Tuning可以用较小的成本让通用大模型更适应特定领域或任务提升效果和可控性。需要注意的边界非零代码平台课程聚焦于代码开发使用 LangChain 等框架。如果你寻求像 Dify 这样的低代码平台课程内容可能偏底层。深度与广度作为一门课程它覆盖了关键主题但每个主题的深度可能不及专门的论文或专著。它是优秀的“入门到进阶”指南。实践依赖本地环境课程中的动手环节需要你自己配置 Python 环境、安装依赖、可能还需要部署本地模型对动手能力有一定要求。3. 环境准备与前置条件为了能跟着课程思路进行本地实践你需要准备好以下环境。我们将以一个典型的本地 RAG 系统为例。操作系统Windows 10/11, macOS 或 Linux (Ubuntu 20.04 推荐)。本文演示以 Ubuntu/Linux 环境为主Windows 用户可使用 WSL2。Python 环境Python 3.9 或 3.10。推荐使用conda或venv创建独立的虚拟环境。基础工具Git, 代码编辑器 (VS Code 等)。大模型资源二选一方案A推荐低成本启动使用Ollama在本地运行轻量级大模型如 Llama 3.1:8B, Qwen2.5:7B。这需要你的机器有至少 8GB 可用内存纯CPU或 4GB 显存GPU加速。方案B免部署需网络和费用使用云端大模型 API如 OpenAI GPT-3.5/4, Anthropic Claude, 或国内平台的 API。你需要相应的 API Key。向量数据库选择一款轻量级的向量数据库用于存储和检索文档片段。ChromaDB因其简单易用是学习和原型开发的首选。4. 安装部署与启动方式我们跳过课程视频观看步骤直接进入实战环节搭建一个最小化的本地 RAG 系统。这个系统将模拟课程中讲授的核心流程。4.1 创建虚拟环境与安装依赖首先创建一个项目目录并设置虚拟环境。# 创建项目目录 mkdir local_rag_demo cd local_rag_demo # 创建 Python 虚拟环境 (以 venv 为例) python3 -m venv venv # 激活虚拟环境 # Linux/macOS source venv/bin/activate # Windows # venv\Scripts\activate # 升级 pip pip install --upgrade pip接下来安装核心依赖。我们将安装 LangChain、本地向量数据库 Chroma、文档加载器、文本分割器以及用于连接 Ollama 的库。pip install langchain langchain-community langchain-chroma pip install chromadb pip install pypdf # 用于读取PDF pip install sentence-transformers # 用于本地 embedding 模型可选 pip install ollama # 用于连接本地 Ollama 服务4.2 启动本地大模型服务 (Ollama)如果你选择方案A本地模型需要先安装并启动 Ollama。安装 Ollama 访问 Ollama 官网 根据你的操作系统下载并安装。拉取并运行一个模型 打开终端运行以下命令拉取一个适合你硬件条件的模型。例如使用qwen2.5:7b模型约 4.7GB。# 拉取模型 ollama pull qwen2.5:7b # 运行模型服务默认在 11434 端口 ollama run qwen2.5:7b运行ollama run命令会启动一个交互式对话。对于 RAG 系统我们需要的是其 API 服务。实际上Ollama 在后台会启动一个 REST API 服务默认localhost:11434langchain-ollama包会直接与之通信。所以只要你拉取了模型后续 LangChain 就能调用。4.3 准备知识库文档在项目目录下创建一个docs文件夹放入你的知识文档支持.txt,.pdf,.md等格式。例如你可以放一份产品手册或几篇技术文章。local_rag_demo/ ├── docs/ │ ├── product_manual.pdf │ └── faq.txt ├── app.py └── requirements.txt5. 功能测试与效果验证现在我们来编写核心的 RAG 流程代码并验证其效果。5.1 构建 RAG 链文档加载、切分、向量化与检索创建一个名为app.py的 Python 脚本。# app.py import os from langchain_community.document_loaders import DirectoryLoader, TextLoader, PyPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_chroma import Chroma from langchain_community.embeddings import OllamaEmbeddings from langchain_community.llms import Ollama from langchain.chains import RetrievalQA from langchain.prompts import PromptTemplate # 1. 加载文档 documents [] doc_path ./docs for root, dirs, files in os.walk(doc_path): for file in files: file_path os.path.join(root, file) if file.endswith(.pdf): loader PyPDFLoader(file_path) elif file.endswith(.txt) or file.endswith(.md): loader TextLoader(file_path, encodingutf-8) else: continue documents.extend(loader.load()) print(f已加载 {len(documents)} 个文档。) # 2. 分割文本 text_splitter RecursiveCharacterTextSplitter( chunk_size500, # 每个块的大小 chunk_overlap50 # 块之间的重叠部分 ) texts text_splitter.split_documents(documents) print(f分割为 {len(texts)} 个文本块。) # 3. 创建向量存储使用本地 Ollama 的 Embedding 模型 # 确保 Ollama 服务已运行并且有 nomic-embed-text 等嵌入模型 # ollama pull nomic-embed-text embeddings OllamaEmbeddings(modelnomic-embed-text) vectorstore Chroma.from_documents( documentstexts, embeddingembeddings, persist_directory./chroma_db # 向量数据库持久化目录 ) print(向量数据库创建完成。) # 4. 初始化 LLM (使用本地 Ollama 的对话模型) llm Ollama(modelqwen2.5:7b, temperature0.1) # temperature 控制随机性 # 5. 创建检索器 retriever vectorstore.as_retriever(search_kwargs{k: 3}) # 检索最相关的3个块 # 6. 定义自定义提示模板这是优化效果的关键课程中会重点讲解 prompt_template 请根据以下上下文信息回答问题。如果你不知道答案就说你不知道不要编造答案。 上下文 {context} 问题{question} 答案 PROMPT PromptTemplate( templateprompt_template, input_variables[context, question] ) # 7. 创建 RetrievalQA 链 qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, # 最简单的合并上下文方式 retrieverretriever, chain_type_kwargs{prompt: PROMPT}, return_source_documentsTrue # 返回源文档用于引用溯源 ) # 测试问答 if __name__ __main__: while True: query input(\n请输入你的问题 (输入 quit 退出): ) if query.lower() quit: break result qa_chain.invoke({query: query}) print(f\n答案{result[result]}) print(\n--- 参考来源 ---) for i, doc in enumerate(result[source_documents]): print(f[{i1}] {doc.page_content[:200]}...) # 打印前200字符5.2 运行与效果验证运行脚本 在激活的虚拟环境中运行python app.py。首次运行脚本会加载文档、进行分割、调用 Ollama 的嵌入模型生成向量并存入 ChromaDB。这个过程可能会花费一些时间取决于文档大小和你的机器性能。交互问答程序启动后会在命令行提示你输入问题。尝试问一些基于你docs/文件夹内文档内容的问题。验证成功标准基础检索系统能返回一个答案。引用溯源答案下方能打印出参考的文档片段source_documents。这是 RAG 区别于普通对话的核心——答案有据可查。减少幻觉对于文档中不存在的信息模型应回答“不知道”或给出谨慎的推断取决于你的提示词设计。示例测试 假设你的docs/faq.txt中有一行“本产品的保修期为一年。”你问“保修期多久”预期输出模型应回答“一年”并引用包含“保修期为一年”的文档块。你问“如何烹饪意大利面”预期输出模型可能回答“根据提供的信息我无法回答这个问题”或者给出一个非常通用的答案如果模型本身知道但不会引用你的文档。6. 接口 API 与批量任务一个完整的 RAG 系统通常需要提供 API 服务供其他应用调用并可能处理批量文档问答任务。6.1 使用 FastAPI 构建简易 API 服务我们可以用 FastAPI 将上面的 RAG 链包装成一个 Web API。安装 FastAPIpip install fastapi uvicorn创建api.py# api.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel from typing import List import sys import os sys.path.append(os.path.dirname(os.path.abspath(__file__))) # 导入之前写好的 RAG 链创建函数需要稍作重构 # 假设我们将创建链的逻辑封装在一个函数中 from rag_core import get_qa_chain app FastAPI(title本地 RAG 问答 API) qa_chain get_qa_chain() # 这个函数需要你从 app.py 中提取并封装 class QueryRequest(BaseModel): question: str top_k: int 3 # 可自定义返回的文档数量 class SourceDoc(BaseModel): content: str metadata: dict class QueryResponse(BaseModel): answer: str sources: List[SourceDoc] app.post(/query, response_modelQueryResponse) async def query_rag(request: QueryRequest): try: # 动态修改检索数量 qa_chain.retriever.search_kwargs[k] request.top_k result qa_chain.invoke({query: request.question}) sources [ SourceDoc(contentdoc.page_content, metadatadoc.metadata) for doc in result[source_documents] ] return QueryResponse(answerresult[result], sourcessources) except Exception as e: raise HTTPException(status_code500, detailstr(e)) app.get(/health) async def health_check(): return {status: healthy}启动 API 服务uvicorn api:app --host 0.0.0.0 --port 8000 --reload服务启动后访问http://localhost:8000/docs可以看到自动生成的 API 文档。调用 API 可以使用curl或 Pythonrequests库进行测试。curl -X POST http://localhost:8000/query \ -H Content-Type: application/json \ -d {question: 保修期多久, top_k: 2}6.2 批量任务处理对于需要处理大量问题或文档的场景需要考虑批量处理。批量问答可以编写脚本读取一个包含多个问题的文件如 CSV 或 JSONL循环调用qa_chain.invoke或上述 API并将结果写入输出文件。关键点加入延迟、错误重试机制和日志记录。批量文档入库上述app.py中的文档加载和向量化过程本身就可以通过脚本自动化监控一个目录当有新文档加入时自动更新向量数据库。这涉及到增量索引的管理是高级 RAG 的课题。7. 资源占用与性能观察在本地运行 RAG 系统性能瓶颈主要在两个环节Embedding向量化和LLM 推理。Embedding 模型我们使用了nomic-embed-text。它是一个轻量级模型在 CPU 上运行速度尚可。在文档入库阶段你会观察到 CPU 使用率升高。对于大量文档这个过程可能较慢。可以考虑使用更高效的嵌入模型或将此过程异步化。LLM 推理使用qwen2.5:7b在纯 CPU 模式下推理速度较慢可能数秒到数十秒生成一个回答内存占用约 8-10GB。如果有 NVIDIA GPU 并配置了 Ollama 的 GPU 加速速度会大幅提升显存占用约 6-8GB。向量检索ChromaDB 在内存中操作检索速度极快几乎无感。但若向量库非常大百万级则需要考虑性能优化和持久化策略。观察方法CPU/内存使用系统监控工具如htop,任务管理器。GPU使用nvidia-smi命令观察显存占用和利用率。响应时间在代码中记录每个环节检索、LLM生成的耗时。优化建议文本分块策略chunk_size和chunk_overlap对检索质量影响巨大。太小会丢失上下文太大会引入噪声并增加 LLM 的负担。需要根据文档类型调整。检索策略search_kwargs{“k”: 3}中的k值决定了返回多少相关片段。增加k可能提高召回率但也会增加 LLM 的上下文长度和计算成本。模型选择在效果和速度之间权衡。对于初步验证qwen2.5:7b是不错的选择。追求速度可尝试更小的模型如phi3:mini追求效果可尝试更大的模型或专用模型。8. 常见问题与排查方法在搭建和运行本地 RAG 系统时你可能会遇到以下问题问题现象可能原因排查方式解决方案运行ollama命令提示未找到Ollama 未安装或未加入系统 PATH。在终端输入ollama --version。重新安装 Ollama并确保安装目录在系统 PATH 中。拉取模型失败或极慢网络连接问题。检查网络尝试使用代理或镜像源。Ollama 支持通过环境变量OLLAMA_HOST设置代理。或寻找国内镜像。OllamaEmbeddings调用报错指定的嵌入模型未下载。运行ollama list查看已下载模型。运行ollama pull nomic-embed-text下载嵌入模型。向量数据库创建失败chromadb依赖问题或目录权限问题。查看错误堆栈信息。确保pip install chromadb成功。确保当前用户对项目目录有写权限。LLM 回答速度极慢在 CPU 模式下运行 7B 模型。观察 CPU 占用率。1. 考虑使用更小模型如 3B。2. 确认显卡驱动和 CUDA 已安装Ollama 应能自动使用 GPU。运行ollama run qwen2.5:7b看启动日志是否提示 GPU 可用。答案未引用文档幻觉1. 检索到的文档不相关。2. 提示词Prompt未强制要求基于上下文。3. LLM 的temperature参数过高。1. 检查source_documents内容是否与问题相关。2. 检查提示词模板。1. 优化文本分块和检索策略如换用其他嵌入模型。2. 强化提示词例如加入“必须严格依据上下文”。3. 降低temperature(如设为 0.1)。API 服务启动失败端口被占用端口 8000 已被其他程序使用。使用netstat -ano | findstr :8000(Win) 或lsof -i:8000(Linux/macOS) 查看。在启动命令中更换端口如--port 8001。处理长文档时内存不足一次性加载了过大的文件。监控内存使用情况。使用RecursiveCharacterTextSplitter确保分块足够小。对于超大 PDF考虑使用专门解析器分页加载。9. 最佳实践与使用建议基于课程内容和实战经验以下建议能帮助你更好地构建和维护 RAG 系统从简单开始迭代优化不要一开始就追求复杂的 GraphRAG 或多路召回。先用最简单的流程如本文示例跑通确保基础检索和生成能工作再逐步增加重排序Re-ranking、HyDE 等高级技术。提示词工程是关键RAG 的效果严重依赖提示词。精心设计你的prompt_template明确指令模型“基于上下文回答”、“引用原文”、“不知道就说不知道”。可以尝试 LangChain 的FewShotPromptTemplate来提供示例。评估与监控建立简单的评估流程。准备一组“问题-标准答案”对定期运行测试计算答案的相似度或人工评估。监控 API 的响应时间、错误率和 Token 消耗。数据预处理至关重要垃圾进垃圾出。确保你的源文档质量高。清理无关字符、处理格式错乱、进行必要的中文分词如果需要。好的文本分割策略是成功的一半。版本化与配置管理将模型名称、嵌入模型、分块大小、提示词模板等参数保存在配置文件如config.yaml中方便实验和回滚。安全与合规数据安全如果你的知识库包含敏感信息确保 API 有认证授权机制向量数据库存储加密。版权与隐私确保你用于构建知识库的文档拥有合法的使用权。不要将受版权保护或包含个人隐私的数据公开部署。内容过滤在 LLM 的输入和输出端考虑加入内容安全过滤防止生成有害内容。10. 总结与下一步通过本文的拆解和实战你应该对《Generative AI: RAG, LangChain, GraphRAG Fine-Tuning》这门课程的核心价值有了清晰的认识它提供了一套可落地的技术框架和实现思路。我们不仅看了课程大纲还亲手用 LangChain、Ollama 和 ChromaDB 搭建了一个能跑起来的本地 RAG 系统验证了从文档加载到智能问答的全流程。最值得尝试的点快速构建一个基于私有数据的对话原型。这是验证想法成本最低的方式。你可以在几个小时内就让大模型“读懂”你的文档并回答问题。最先应该验证的功能引用溯源。确保你的系统在返回答案时能明确指出信息来源于哪个文档片段。这是 RAG 可信度的基石。最容易踩的坑环境配置Python 包版本冲突、Ollama 模型下载慢。建议使用虚拟环境并耐心解决网络问题。效果不佳直接归咎于模型而忽略了文本分块和提示词。这两个环节的调优往往能带来立竿见影的效果提升。后续可以继续扩展的方向GraphRAG在现有 RAG 基础上引入知识图谱。使用工具从文档中抽取实体和关系构建图结构。当用户进行复杂、多跳的查询时系统可以利用图谱进行推理。这对应课程的中后部分是提升复杂问题解答能力的关键。高级检索技巧实现多向量检索为文档同时生成摘要向量和内容向量、重排序用更精细的模型对初步检索结果进行二次排序、HyDE让模型先假设一个答案再用这个假设去检索。微调Fine-Tuning如果你有大量高质量的领域问答对可以考虑对开源小模型如 Qwen2.5-7B进行 LoRA 微调让它更擅长你的领域术语和回答风格。这能进一步提升回答的准确性和专业性。前端界面使用 Gradio 或 Streamlit 快速构建一个 Web 界面让非技术人员也能方便地使用你的 RAG 系统。这门课程的价值在于它将这些进阶主题串联了起来给出了学习路径和实战案例。建议你在完成本文的基础实践后带着具体问题去学习课程中的相应章节理解其背后的设计原理从而能够灵活地解决自己项目中遇到的真实挑战。