关注

LLM RAG 系统从入门到实践

摘要:检索增强生成(RAG)是解决大语言模型知识滞后、幻觉问题的核心技术。本文将从 RAG 原理出发,深入讲解架构设计、核心组件、实战代码及生产优化,帮助读者构建企业级 RAG 系统。

关键词:LLM、RAG、向量数据库、检索增强生成、LangChain、大模型应用


📌 一、为什么需要 RAG?

1.1 大模型的三大痛点

┌─────────────────────────────────────────────────────────────────┐
│                    大语言模型的固有局限                          │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  🔴 知识截止                                                    │
│     预训练数据有截止时间,无法获取最新信息                        │
│     例:GPT-4 知识截止到 2024 年,不知道 2025 年的新闻             │
│                                                                 │
│  🔴 幻觉问题                                                    │
│     模型会"一本正经地胡说八道",编造不存在的事实                  │
│     例:编造法律条文、医学建议、引用不存在的论文                  │
│                                                                 │
│  🔴 私有知识缺失                                                │
│     无法访问企业内部文档、个人数据、专有信息                      │
│     例:公司制度、产品手册、客户数据                              │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

1.2 RAG:让大模型"开卷考试"

核心思想:在回答问题前,先从外部知识库检索相关信息,再将检索结果作为上下文提供给大模型。

┌─────────────────────────────────────────────────────────────────┐
│                                                                 │
│   闭卷考试 (纯 LLM)          vs         开卷考试 (RAG)           │
│                                                                 │
│   ┌─────────────┐                      ┌─────────────┐          │
│   │   用户问题   │                      │   用户问题   │          │
│   └──────┬──────┘                      └──────┬──────┘          │
│          │                                    │                  │
│          ▼                                    ▼                  │
│   ┌─────────────┐                      ┌─────────────┐          │
│   │   向量检索   │ ← 外部知识库          │   向量检索   │          │
│   │             │                      │             │          │
│   │             │                      │  ┌───────┐  │          │
│   │             │                      │  │相关文档│  │          │
│   │             │                      │  └───────┘  │          │
│   └──────┬──────┘                      └──────┬──────┘          │
│          │                                    │                  │
│          ▼                                    ▼                  │
│   ┌─────────────┐                      ┌─────────────┐          │
│   │    LLM      │                      │    LLM      │          │
│   │   (幻觉)    │                      │  (有依据)   │          │
│   └──────┬──────┘                      └──────┬──────┘          │
│          │                                    │                  │
│          ▼                                    ▼                  │
│   ❌ 可能编造答案                      ✅ 基于检索内容回答        │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

1.3 RAG vs 微调 vs 提示工程

方案 适用场景 知识更新 成本 效果
提示工程 简单任务,通用知识 实时 ⭐⭐
微调 任务适配,风格对齐 需重新训练 ⭐⭐⭐
RAG 知识问答,私有数据 实时更新 ⭐⭐⭐⭐

最佳实践:RAG + 微调组合使用

  • RAG 负责知识注入(动态、可更新)
  • 微调负责任务适配(格式、风格、领域术语)

📌 二、RAG 核心原理

2.1 RAG 工作流程

┌──────────────────────────────────────────────────────────────────────────┐
│                           RAG 完整工作流程                                │
│                                                                          │
│  ┌──────────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐           │
│  │  用户提问  │ →  │  查询理解  │ →  │  向量检索  │ →  │  结果排序  │           │
│  └──────────┘    └──────────┘    └──────────┘    └──────────┘           │
│       │                                                      │           │
│       │                                                      ▼           │
│       │                                            ┌──────────────┐     │
│       │                                            │  Top-K 文档   │     │
│       │                                            └──────┬───────┘     │
│       │                                                   │              │
│       │                                                   ▼              │
│       │                                            ┌──────────────┐     │
│       │                                            │   Prompt     │     │
│       │                                            │   组装上下文  │     │
│       │                                            └──────┬───────┘     │
│       │                                                   │              │
│       ▼                                                   ▼              │
│  ┌──────────┐    ┌──────────┐    ┌──────────────┐                       │
│  │  最终回答  │ ←  │  答案生成  │ ←  │  LLM 推理    │                       │
│  └──────────┘    └──────────┘    └──────────────┘                       │
│                                                                          │
└──────────────────────────────────────────────────────────────────────────┘

2.2 核心组件

(1)文档处理管道
原始文档 → 文本提取 → 分块 (Chunking) → 向量化 (Embedding) → 存储
(2)检索器 (Retriever)
  • 稠密检索:向量相似度搜索(主流)
  • 稀疏检索:BM25 关键词匹配
  • 混合检索:向量 + 关键词,效果最佳
(3)生成器 (Generator)
  • 大语言模型(GPT-4、Claude、Llama 等)
  • 接收:用户问题 + 检索到的上下文
  • 输出:基于上下文的回答

2.3 向量相似度计算

相似度度量 公式 特点
余弦相似度 cos(θ) = A·B / (‖A‖‖B‖) 最常用,范围 [-1, 1]
点积 A·B 计算快,需归一化
欧氏距离 ‖A - B‖² 几何距离,越小越相似
曼哈顿距离 Σ Ai - Bi

📌 三、RAG 系统架构设计

3.1 基础架构

┌─────────────────────────────────────────────────────────────────┐
│                        RAG 系统架构                              │
│                                                                 │
│   ┌─────────────────────────────────────────────────────────┐   │
│   │                    应用层 (Application)                  │   │
│   │  ┌───────────┐  ┌───────────┐  ┌───────────┐           │   │
│   │  │ Web 界面   │  │  API 服务  │  │  ChatBot  │           │   │
│   │  └───────────┘  └───────────┘  └───────────┘           │   │
│   └─────────────────────────────────────────────────────────┘   │
│                              │                                  │
│                              ▼                                  │
│   ┌─────────────────────────────────────────────────────────┐   │
│   │                    编排层 (Orchestration)                │   │
│   │  ┌───────────────────────────────────────────────────┐  │   │
│   │  │  LangChain / LlamaIndex / 自研框架                 │  │   │
│   │  │  - Query 改写  - 检索策略  - Prompt 管理  - 缓存   │  │   │
│   │  └───────────────────────────────────────────────────┘  │   │
│   └─────────────────────────────────────────────────────────┘   │
│                              │                                  │
│              ┌───────────────┴───────────────┐                  │
│              ▼                               ▼                  │
│   ┌─────────────────────┐       ┌─────────────────────┐        │
│   │    检索层 (Retrieval) │       │    生成层 (Generation)│       │
│   │  ┌───────────────┐  │       │  ┌───────────────┐  │        │
│   │  │  向量数据库   │  │       │  │   LLM 服务    │  │        │
│   │  │  - Milvus     │  │       │  │  - OpenAI    │  │        │
│   │  │  - Pinecone   │  │       │  │  - Claude    │  │        │
│   │  │  - Qdrant     │  │       │  │  - Llama     │  │        │
│   │  │  - Chroma     │  │       │  │  - 本地部署   │  │        │
│   │  └───────────────┘  │       │  └───────────────┘  │        │
│   │  ┌───────────────┐  │       │                     │        │
│   │  │  Embedding    │  │       │                     │        │
│   │  │  - text-embedding│ │       │                     │        │
│   │  │  - m3e        │  │       │                     │        │
│   │  │  - bge        │  │       │                     │        │
│   │  └───────────────┘  │       │                     │        │
│   └─────────────────────┘       └─────────────────────┘        │
│                              │                                  │
│                              ▼                                  │
│   ┌─────────────────────────────────────────────────────────┐   │
│   │                    数据层 (Data Layer)                   │   │
│   │  ┌───────────┐  ┌───────────┐  ┌───────────┐           │   │
│   │  │  PDF/Word  │  │  网页爬取  │  │  数据库   │           │   │
│   │  └───────────┘  └───────────┘  └───────────┘           │   │
│   └─────────────────────────────────────────────────────────┘   │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

3.2 数据流向

用户提问
    │
    ▼
┌─────────────────┐
│  Query 预处理   │  ← 拼写纠正、同义扩展、查询改写
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  向量化 (Embedding)│
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  向量数据库检索  │  ← 返回 Top-K 相似文档块
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  结果重排序     │  ← Cross-Encoder 精排
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  Prompt 组装    │  ← 系统提示 + 上下文 + 用户问题
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  LLM 生成答案   │
└────────┬────────┘
         │
         ▼
    返回给用户

📌 四、技术选型指南

4.1 向量数据库对比

数据库 类型 规模 延迟 特点 适用场景
Chroma 内存/本地 <100 万 轻量、易上手 原型开发、小规模
Qdrant 服务化 <1000 万 Rust 编写、性能好 中小规模生产
Milvus 服务化 亿级 功能全、生态好 大规模生产
Pinecone SaaS 亿级 托管服务、免运维 快速上线
Weaviate 服务化 千万级 支持混合检索 通用场景
Elasticsearch 搜索引擎 亿级 关键词 + 向量 混合检索

4.2 Embedding 模型对比

模型 维度 语言 效果 (MTEB) 速度 推荐场景
text-embedding-3-large 3072 多语言 64.6 效果优先
text-embedding-3-small 1536 多语言 62.3 性价比
bge-large-zh-v1.5 1024 中文 64.0 中文场景
m3e-base 768 中文 63.2 中文轻量
jina-embeddings-v2 1024 多语言 62.8 多语言

4.3 框架对比

框架 语言 学习曲线 功能 社区 推荐度
LangChain Python/JS 全面 活跃 ⭐⭐⭐⭐
LlamaIndex Python RAG 专精 活跃 ⭐⭐⭐⭐⭐
Haystack Python 生产级 稳定 ⭐⭐⭐
Dify 低代码 可视化 新兴 ⭐⭐⭐⭐

📌 五、实战:构建 RAG 系统

5.1 环境准备

# 基础依赖
pip install langchain langchain-community langchain-openai
pip install chromadb sentence-transformers
pip install pypdf python-docx beautifulsoup4

# 可选:高级功能
pip install langchain-chroma langchain-text-splitters
pip install rank-bm25  # 混合检索
pip install fastapi uvicorn  # API 服务

5.2 最小可行 RAG(100 行代码)

from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
import os

# 配置 API Key
os.environ["OPENAI_API_KEY"] = "your-api-key"

# 1. 加载文档
loader = PyPDFLoader("company_handbook.pdf")
documents = loader.load()

# 2. 文本分块
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50,
    separators=["\n\n", "\n", "。", "!", "?", " ", ""]
)
chunks = text_splitter.split_documents(documents)

# 3. 创建向量存储
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_documents(
    documents=chunks,
    embedding=embeddings,
    persist_directory="./chroma_db"
)

# 4. 创建检索器
retriever = vectorstore.as_retriever(
    search_type="similarity",
    search_kwargs={
   
   "k": 3}  # 返回 3 个最相关文档
)

# 5. 创建问答链
llm = ChatOpenAI(model="gpt-4o", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=retriever,
    return_source_documents=True
)

# 6. 提问
query = "公司的年假政策是什么?"
result = qa_chain.invoke({
   
   "query": query})

print(f"问题:{
     
     

转载自CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/dongdeaiziji/article/details/158542140

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--