跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

基于 LangChain 搭建最小化 RAG 系统实战

检索增强生成(RAG)是解决大模型知识幻觉的关键技术。基于 LangChain 框架,详细讲解了搭建最小化 RAG 系统的完整流程。内容涵盖环境配置、数据加载与切片、BGE 向量化模型集成、Chroma 向量数据库存储、检索器构建以及 LCEL 链式生成逻辑。文章还分析了简单 RAG 系统常见的幻觉与检索精度问题,并提出了混合检索、重排序等优化方向,为开发者提供了一套可落地的参考实现方案。

DotNetGuy发布于 2025/2/6更新于 2026/9/1267 浏览
基于 LangChain 搭建最小化 RAG 系统实战

基于 LangChain 搭建最小化 RAG 系统实战

检索增强生成(Retrieval-Augmented Generation, RAG)是近年来大模型应用中最核心的技术架构之一。它通过引入外部知识库,有效缓解了大模型的知识幻觉问题。本文将利用 LangChain 框架,从零开始搭建一个最简化的 RAG 系统,解析其核心原理与实现细节。

环境准备

建议使用 Python 3.9+ 环境。LangChain 版本更新较快,建议安装最新稳定版以避免兼容性问题。

主要依赖包包括:

  • langchain:核心框架
  • chromadb:向量数据库
  • sentence-transformers 或 huggingface_hub:用于加载 BGE 嵌入模型
  • PyPDF2 或 unstructured:视数据格式而定

RAG 核心原理

RAG 流程主要分为三个步骤:

  1. 索引建立:将非结构化文本数据通过向量化模型转换为向量,并存储到向量数据库中。
  2. 检索:根据用户查询,在向量数据库中查找语义最相关的 Top-K 片段。
  3. 生成:将检索到的上下文与用户问题拼接成提示词,输入给大语言模型生成最终答案。

该架构的核心在于利用向量相似度匹配解决信息检索的准确性问题,同时利用大模型的生成能力保证回答的自然流畅。

索引建立

我们使用 Chroma 作为轻量级向量数据库,调用 BGE (BAAI General Embedding) 模型完成文本向量化。原始数据采用 Markdown 格式,便于直接使用 TextLoader 加载。

代码实现

import os
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain.embeddings.huggingface import HuggingFaceBgeEmbeddings

# 配置模型路径
BGE_MODEL_PATH = "BAAI/bge-large-zh"
root_dir = "./data"  # 替换为你的数据目录

def extract_file_dirs(directory):
    file_paths = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.endswith(".md"):
                fp = os.path.join(root, file)
                file_paths.append(fp)
    return file_paths

# 1. 加载文档
files = extract_file_dirs(root_dir)
loaders = [TextLoader(f, encoding='utf-8') for f in files]
docs = []
for l in loaders:
    docs.extend(l.load())

# 2. 文本切片
# chunk_size 控制每个片段的大小,chunk_overlap 控制重叠部分以保留上下文连贯性
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
documents = text_splitter.split_documents(docs)

# 3. 向量化与存储
embedding = HuggingFaceBgeEmbeddings(model_name=BGE_MODEL_PATH)
vectorstore = Chroma.from_documents(
    documents=documents,
    embedding=embedding,
    persist_directory="./vectorstore"
)

注意:实际生产中需确保 model_factory 中的 LLM 客户端已正确初始化。此处仅展示向量库构建逻辑。

检索模块

将向量数据库转换为检索器(Retriever)是 LangChain 的标准用法。通过 as_retriever() 方法,可以方便地调用检索接口。

retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
query = "如何快速找到最有价值的内容?"
docs = retriever.invoke(query)

for doc in docs:
    print(doc.page_content)

这里使用了 invoke 方法替代旧版的 get_relevant_documents,这是 LangChain 较新版本的推荐写法。search_kwargs 允许自定义检索参数,如返回数量 k 或搜索类型(similarity, mmr 等)。

生成模块

定义提示词模板,将检索到的上下文与用户问题结合。使用 LangChain Expression Language (LCEL) 构建链式处理流程。

from langchain.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough

# 假设 model 已初始化为具体的 LLM 实例
# from model_factory import yi_llm 
# model = yi_llm

template = """Answer the question based only on the following context:

{context}

Question: {question},请用中文输出答案。
"""
prompt = ChatPromptTemplate.from_template(template)

def format_docs(docs):
    return "\n\n".join([d.page_content for d in docs])

# 构建 Chain
chain = (
    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    | prompt
    | model
    | StrOutputParser()
)

response = chain.invoke(query)
print(response)

LCEL 的优势在于其流式处理能力与模块化设计,便于调试和组合不同的组件。RunnablePassthrough 用于透传用户问题,format_docs 负责格式化检索结果。

效果评估与优化

在实际应用中,简单的 RAG 系统可能面临以下挑战:

  1. 检索精度不足:如果切片过大或过小,都会影响语义匹配。建议尝试不同的 chunk_size 或使用元数据过滤。
  2. 大模型幻觉:即使有上下文,模型仍可能编造信息。可通过在 Prompt 中强调'若不知道则回答不知道'来缓解。
  3. 延迟问题:向量检索 + 大模型生成存在串行延迟。可考虑异步处理或缓存常用查询。

优化方向

  • 混合检索:结合关键词检索(BM25)与向量检索,提升召回率。
  • 重排序(Re-ranking):对初步检索结果进行精细打分,选取最相关片段。
  • 查询改写:对用户问题进行扩展或重写,使其更适合向量空间匹配。

总结

本文演示了如何使用 LangChain、Chroma 和 BGE 模型构建基础的 RAG 系统。虽然示例代码较为精简,但涵盖了从数据加载、向量化、检索到生成的完整链路。开发者可根据具体业务场景,引入更复杂的检索策略与模型微调方案,以提升系统的鲁棒性与实用性。

在实际部署前,请务必检查所有依赖包的版本兼容性,并确保敏感数据(如 API Key)通过环境变量管理,避免硬编码在代码中。

目录

  1. 基于 LangChain 搭建最小化 RAG 系统实战
  2. 环境准备
  3. RAG 核心原理
  4. 索引建立
  5. 代码实现
  6. 配置模型路径
  7. 1. 加载文档
  8. 2. 文本切片
  9. chunksize 控制每个片段的大小,chunkoverlap 控制重叠部分以保留上下文连贯性
  10. 3. 向量化与存储
  11. 检索模块
  12. 生成模块
  13. 假设 model 已初始化为具体的 LLM 实例
  14. from modelfactory import yillm
  15. model = yi_llm
  16. 构建 Chain
  17. 效果评估与优化
  18. 优化方向
  19. 总结

更多推荐文章

查看全部
  • 苍穹外卖实战:Spring Task 定时任务与 WebSocket 应用
  • CSS Subgrid 实现复杂响应式布局
  • 程序员转行方向推荐:数据分析师、AI 大模型工程师、产品经理与云计算工程师
  • C# 老项目里怎么搭配 Visual Studio 和 VSCode
  • C++11 列表初始化、新式声明、范围 for 与 STL 变化
  • 中国人工智能大模型技术白皮书核心内容解读与学习指南
  • Uncaught TypeError: Cannot read properties of undefined 报错排查与根治方案
  • OpenClaw 本地部署飞书机器人实战
  • Java 常见异常全面解析:出现场景、错误排查与代码修正实战
  • Django 多数据库连接配置与迁移管理实战
  • 从硅谷产品经理视角看 AI 产品经理是否需要懂技术与算法
  • AI 产品经理入门指南:核心职责、技能与实战路径
  • GitHub Copilot 学生认证排查笔记
  • 大模型检索增强生成(RAG)技术综述
  • IDA Pro 远程调试指南:gdbserver 与 armlinux_server 实战
  • 美赛备赛指南:排版工具选择、论文阅读与避坑策略
  • Python 自动化抢票脚本实战:基于 Selenium 的 12306 购票流程
  • 12 个免费 AI 一键生成 PPT 网站推荐
  • OpenClaw Mac 安装与配置飞书机器人完整指南
  • 基于STM32的智能家居环境监测与控制系统设计

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online