📚 RAG完整教程

检索增强生成 - 给AI装上企业知识库

🔍 向量检索 🗄️ 数据库选型 ⚡ 性能优化 📊 效果评估
← 返回 Agent 层

什么是RAG?为什么需要RAG?

检索增强生成(RAG)是当前最实用的AI技术之一,让大模型能够访问最新知识和企业私有数据

🎓 RAG核心概念

RAG基本原理

检索增强生成(Retrieval-Augmented Generation) 是一种将信息检索大语言模型生成相结合的技术架构。

简单理解:就像开卷考试,让AI在回答问题前先"翻书查资料", 而不是仅凭"记忆"(训练数据)回答。

🔄 工作流程(5步):

1

用户提问

例:"什么是RAG系统?"

2

问题向量化

用Embedding模型转为1024维向量

3

向量检索

从向量数据库找出最相关的top-k文档

4

拼接上下文

将检索文档 + 用户问题组合成提示词

5

LLM生成回答

基于检索内容生成准确答案

为什么需要RAG?

解决知识时效性问题

LLM训练数据有截止日期(如GPT-4是2023年4月),RAG可实时访问最新数据、新闻、产品信息

大幅降低幻觉(Hallucination)

基于真实文档回答,要求标注来源,减少模型"胡编乱造",准确率从60%提升到85%+

访问私有知识库

无需重新训练模型就能使用企业内部文档、产品手册、技术规范等私有数据

可追溯性与可信度

每个回答都能标注引用来源和段落,方便验证准确性,满足合规要求

成本更优

比微调模型便宜10倍以上,更新知识只需重新索引文档,而非重新训练

📊 RAG vs 其他方案对比

方案 知识更新 开发成本 运行成本 准确率 适用场景
纯Prompt 不可更新 极低 极低 低60% 通用对话、创作
RAG 实时更新 高85%+ 知识库、客服、文档
微调 需重新训练 很高90%+ 垂直专业领域
RAG+微调 灵活 较高 中等 最高95%+ 企业级专业应用

📈 RAG技术发展历程

📄

2020年:RAG概念提出

Facebook AI Research发表论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》

首次系统性提出RAG架构,证明检索能显著提升QA任务性能

学术阶段
🚀

2021年:向量数据库兴起

Pinecone、Weaviate、Milvus等专用向量数据库快速发展

解决了大规模向量存储和快速检索的工程化问题

工程化
🛠️

2022年:框架成熟

LangChain、LlamaIndex等开发框架诞生,降低RAG开发门槛

从"写论文"到"写代码",开发者可以快速构建RAG应用

框架时代
💼

2023年:企业大规模应用

ChatGPT插件、Notion AI、Microsoft Copilot等产品广泛采用RAG

RAG从实验室走向生产,成为企业AI应用的标配技术

商业化
🌟

2024-2025年:高级RAG时代

HyDE、Self-RAG、Corrective RAG、Graph RAG等高级技术涌现

准确率从85%提升到95%+,RAG与Agent深度融合

长上下文 多模态RAG Agent+RAG
当前

📊 RAG应用现状

80%

企业AI应用

使用RAG技术

10倍

比微调便宜

开发+运行成本

85%+

准确率

优化后可达

3天

开发周期

从0到上线

🎯 业务场景与技术选型指南

根据实际业务需求和技术背景,选择最合适的RAG技术栈

📖

企业知识库问答

员工查询内部文档、规章制度、产品手册

推荐技术栈:

框架 LlamaIndex
向量库 Qdrant
Embedding bge-large-zh
LLM 通义千问

关键特性:

  • • 中文优化,准确率高
  • • 快速部署,成本可控
  • • 支持权限控制
💻

技术文档检索

开发者查询API文档、代码示例

推荐技术栈:

框架 LangChain
向量库 Chroma
Embedding text-embedding-3
LLM GPT-4o-mini

关键特性:

  • • 代码理解能力强
  • • 轻量快速部署
  • • 支持代码高亮
🤖

智能客服系统

自动回答客户常见问题

推荐技术栈:

框架 Dify
向量库 Pinecone
Embedding m3e-base
LLM Claude-3.5

关键特性:

  • • 可视化配置,易维护
  • • 多轮对话支持
  • • 高并发低延迟
⚖️

专业领域(法律/医疗)

高准确率要求,专业术语多

推荐技术栈:

框架 LangChain
向量库 Milvus
Embedding 领域微调
Rerank Cohere Rerank

关键特性:

  • • 重排序提升准确率
  • • 领域Embedding优化
  • • 海量数据支持
🛍️

电商产品搜索

多模态搜索,图文结合

推荐技术栈:

框架 Haystack
向量库 Weaviate
Embedding CLIP
搜索 混合检索

关键特性:

  • • 多模态支持(图文)
  • • 关键词+语义搜索
  • • 高并发性能
📝

个人知识管理

个人笔记、文档整理

推荐技术栈:

框架 LlamaIndex
向量库 Chroma
Embedding 本地模型
LLM Ollama

关键特性:

  • • 完全本地化,隐私安全
  • • 零成本运行
  • • 轻量快速

🌳 技术选型决策树

🌱 零编程基础?想快速验证想法?

推荐路线:
Dify
Chroma
Ollama

✓ 可视化界面,拖拽配置 | ✓ 30分钟内跑通 | ✓ 适合原型验证

👨‍💻 有Python基础?追求灵活性和定制?

推荐路线:
LlamaIndex
Qdrant
OpenAI/本地模型

✓ 代码友好,易于定制 | ✓ 生态成熟 | ✓ 适合个人项目

🏢 企业级应用?需要高性能和可扩展性?

推荐路线:
LangChain
Pinecone/Milvus
多模型支持

✓ 功能全面,可扩展 | ✓ 支持Agent | ✓ 适合生产环境

🔍 专注搜索?需要企业级搜索引擎?

推荐路线:
Haystack
Elasticsearch
混合检索

✓ 搜索优化 | ✓ Pipeline架构 | ✓ 适合大规模文档

🧬 Embedding模型详解与选择

Embedding模型将文本转换为向量,是RAG系统的核心。选对模型可以让检索准确率提升30%+

bge-large-zh-v1.5

推荐

智源(BAAI)开源的中文Embedding模型,中文检索效果业界领先

向量维度 1024
最大长度 512 tokens
模型大小 1.3GB
推理速度
# 安装
pip install sentence-transformers

# 使用示例
from sentence_transformers import SentenceTransformer

model = SentenceTransformer('BAAI/bge-large-zh-v1.5')
embeddings = model.encode([
    "什么是RAG系统?",
    "如何构建知识库?"
])

适用场景:

  • • 中文企业知识库
  • • 中文技术文档
  • • 本地部署需求

text-embedding-3

商业

OpenAI最新的Embedding模型,性能强大,支持可变维度

向量维度 256-3072可调
最大长度 8191 tokens
成本 $0.13/1M tokens
性能 优秀
# 安装
pip install openai

# 使用示例
from openai import OpenAI
client = OpenAI()

response = client.embeddings.create(
    model="text-embedding-3-small",
    input="RAG系统开发指南",
    encoding_format="float"
)
vector = response.data[0].embedding

适用场景:

  • • 英文技术文档
  • • 多语言混合场景
  • • 追求最佳效果

m3e-base

开源

Moka AI开源的中文Embedding,性能与bge接近,更轻量

向量维度 768
最大长度 512 tokens
模型大小 400MB
特点 轻量化
# 安装
pip install sentence-transformers

# 使用示例
from sentence_transformers import SentenceTransformer

model = SentenceTransformer('moka-ai/m3e-base')
embeddings = model.encode([
    "客服问答系统",
    "知识库检索"
])

适用场景:

  • • 资源受限环境
  • • 快速响应需求
  • • 客服对话系统

CLIP

多模态

OpenAI的图文多模态模型,统一编码文本和图像

向量维度 512/768
支持类型 文本+图像
应用 图搜图/文搜图
# 安装
pip install torch torchvision clip

# 使用示例
import clip
model, preprocess = clip.load("ViT-B/32")

# 文本编码
text_features = model.encode_text(
    clip.tokenize(["商品图片"])
)
# 图像编码
image_features = model.encode_image(
    preprocess(image).unsqueeze(0)
)

适用场景:

  • • 电商商品搜索
  • • 图片库管理
  • • 多模态检索

all-MiniLM-L6-v2

轻量

sentence-transformers最受欢迎的轻量级英文模型

向量维度 384
模型大小 80MB
速度 极快
# 使用
from sentence_transformers import SentenceTransformer

model = SentenceTransformer(
    'all-MiniLM-L6-v2'
)
embeddings = model.encode([
    "How to build RAG?",
    "Vector database guide"
])

适用场景:

  • • 英文文档检索
  • • 边缘设备部署
  • • 实时响应需求

multilingual-e5

多语言

微软的多语言Embedding,支持100+种语言

向量维度 768
语言数 100+
跨语言 支持
# 使用
from sentence_transformers import SentenceTransformer

model = SentenceTransformer(
    'intfloat/multilingual-e5-large'
)
# 支持中英文混合
embeddings = model.encode([
    "English document",
    "中文文档"
])

适用场景:

  • • 跨语言检索
  • • 多语言知识库
  • • 国际化应用

📊 Embedding模型全面对比(10个主流模型)

模型名称 维度 最大长度 语言 模型大小 速度 准确率 成本 最佳场景
bge-large-zh-v1.5
(智源)
1024 512 中文 1.3GB ⚡ 快 95% 免费 中文知识库、企业文档
text-embedding-3-large
(OpenAI)
3072 8191 多语言 云端 ⚡⚡ 很快 98% $0.13/1M 英文文档、国际化应用
m3e-base
(Moka)
768 512 中文 400MB ⚡⚡⚡ 极快 92% 免费 轻量级应用、快速原型
CLIP
(OpenAI)
512 77 图文 350MB ⚡⚡ 快 94% 免费 多模态检索、图片搜索
all-MiniLM-L6-v2
(微软)
384 256 英文 80MB ⚡⚡⚡ 极快 88% 免费 边缘设备、移动端
multilingual-e5-large
(微软)
1024 512 100+ 1.1GB ⚡ 中等 96% 免费 跨语言检索、多语言应用
gte-large-zh
(阿里)
1024 512 中文 1.2GB ⚡ 快 94% 免费 电商搜索、推荐系统
embed-multilingual-v3
(Cohere)
1024 512 100+ 云端 ⚡⚡ 快 97% $0.1/1M 企业级、高精度需求
bge-m3
(智源)
1024 8192 100+ 2.2GB ⚡ 中等 96% 免费 长文本、多语言混合
jina-embeddings-v2
(Jina AI)
768 8192 多语言 云端 ⚡⚡ 快 95% $0.02/1M 长文档、代码检索

📌 关键指标说明

维度:越高表示信息丰富度越高,但计算成本也越大

最大长度:支持的最大token数,超过需要截断

速度:推理速度,影响实时检索体验

准确率:基于MTEB等公开基准测试

成本:API调用成本或本地部署硬件要求

模型大小:本地部署所需磁盘/内存

语言支持:中文、英文、多语言、多模态等

推荐场景:根据实际业务特点选择

🎯 Embedding模型选择建议

中文场景

首选 bge-large-zh-v1.5
备选 m3e-base/gte-large
商业 通义Embedding

英文场景

最佳 text-embedding-3
开源 all-MiniLM-L6
长文本 jina-v2

多语言场景

推荐 bge-m3
备选 multilingual-e5
商业 Cohere Embed v3

🎯 Rerank重排序:RAG性能提升的秘密武器

Rerank(重排序)可以将检索准确率从70%提升到90%,是性价比最高的优化手段

🔍 Rerank是什么?为什么有效?

工作原理

两阶段检索策略:

  1. 1️⃣ 粗排(Fast Retrieval):
    向量检索快速筛选top 50-100候选
  2. 2️⃣ 精排(Rerank):
    用更强大的模型对候选重新打分排序
  3. 3️⃣ 返回:
    取top 3-5给LLM生成

为什么有效?

  • 更准确:Rerank模型考虑问题和文档的完整交互,而不仅是向量相似度
  • 性价比高:只对少量候选重排,计算量可控
  • 即插即用:在现有RAG系统中加一层Rerank即可
  • 效果显著:准确率提升20-30%

Cohere Rerank

商业API

业界领先的Rerank API服务,支持多语言,效果最佳

模型 rerank-multilingual-v3.0
支持语言 100+
最大文档数 1000
成本 $2/1000次
# 安装
pip install cohere

# 使用示例
import cohere
co = cohere.Client('YOUR_API_KEY')

# Rerank文档
results = co.rerank(
    query="什么是RAG系统?",
    documents=[
        "RAG是检索增强生成...",
        "向量数据库用于存储...",
        "LLM是大语言模型..."
    ],
    top_n=3,
    model='rerank-multilingual-v3.0'
)

# 获取重排序后的文档
for hit in results.results:
    print(f"分数: {hit.relevance_score}")
    print(f"文档: {documents[hit.index]}")

优势:

  • ✓ 效果最好,准确率+30%
  • ✓ 多语言支持完善
  • ✓ 易于集成,API简单

bge-reranker

开源免费

智源开源的中文Rerank模型,可本地部署,中文效果优秀

模型 bge-reranker-large
模型大小 1.1GB
部署 本地/云端
成本 免费
# 安装
pip install FlagEmbedding

# 使用示例
from FlagEmbedding import FlagReranker

reranker = FlagReranker(
    'BAAI/bge-reranker-large',
    use_fp16=True
)

# 计算相关性分数
scores = reranker.compute_score([
    ["什么是RAG?", "RAG是检索增强生成"],
    ["什么是RAG?", "Python是编程语言"]
])
# 分数越高越相关
print(scores)  # [0.98, 0.12]

优势:

  • ✓ 完全免费,本地部署
  • ✓ 中文效果优秀
  • ✓ 数据隐私可控

Cross-Encoder

通用方案

sentence-transformers的通用Rerank模型

模型 ms-marco-MiniLM
语言 英文
速度
# 安装
pip install sentence-transformers

# 使用示例
from sentence_transformers import CrossEncoder

model = CrossEncoder(
    'cross-encoder/ms-marco-MiniLM-L-6-v2'
)

# 打分
scores = model.predict([
    ("query", "document 1"),
    ("query", "document 2")
])
# 按分数排序
sorted_docs = sorted(
    zip(documents, scores),
    key=lambda x: x[1],
    reverse=True
)

优势:

  • ✓ 开源免费
  • ✓ 易于集成
  • ✓ 社区支持好

Jina Reranker

8K上下文

Jina AI开源的长文本Rerank模型,支持8K token

模型 jina-reranker-v1
最大长度 8192 tokens
语言 多语言
# 使用API
import requests

url = "https://api.jina.ai/v1/rerank"
data = {
    "model": "jina-reranker-v1-base-en",
    "query": "What is RAG?",
    "documents": [
        "RAG is retrieval...",
        "Vector database..."
    ],
    "top_n": 3
}
response = requests.post(
    url,
    headers={"Authorization": "Bearer YOUR_KEY"},
    json=data
)

优势:

  • ✓ 支持长文本
  • ✓ API和本地都可用
  • ✓ 性能优秀

📊 Rerank模型全面对比(6个主流模型)

模型名称 类型 语言支持 最大长度 部署方式 成本 准确率提升 最佳场景
Cohere Rerank v3.0
(Cohere)
商业API 100+ 4096 云端API $2/1000次 +35% 企业级、多语言
bge-reranker-large
(智源)
开源 中文优 512 本地/云端 免费 +32% 中文知识库
Cross-Encoder ms-marco
(微软)
开源 英文 512 本地 免费 +28% 英文搜索
jina-reranker-v1
(Jina AI)
商业API 多语言 8192 云端/本地 $0.02/1K +30% 长文本、代码
ColBERT v2
(斯坦福)
开源 英文 512 本地 免费 +33% 学术研究
MonoT5-3B
(Google)
开源 多语言 512 本地 免费 +34% 生成式Rerank

🏢 企业首选

Cohere Rerank v3.0:效果最好,支持100+语言,API简单

💰 成本:$2/1000次(可接受)

🇨🇳 中文最佳

bge-reranker-large:开源免费,中文效果优秀,可本地部署

💰 成本:免费(GPU推理)

📄 长文本

Jina Reranker:支持8K长度,适合代码和长文档

💰 成本:$0.02/1000次(极低)

📌 性能指标说明

准确率提升:相比纯向量检索的提升幅度

最大长度:支持的query+document总长度

部署方式:云端API、本地部署或两者都支持

语言支持:中文、英文、多语言或全部

成本:API调用费用或本地GPU成本

类型:商业API或开源模型

📊 加入Rerank后的效果提升

+30%

准确率提升

从70%到90%+

-50%

无关文档

过滤噪音数据

2-5倍

用户满意度

回答质量大幅提升

💻 Rerank集成完整示例

🦙

LlamaIndex + Cohere Rerank

# 完整RAG + Rerank示例
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core.postprocessor import CohereRerank
from llama_index.llms.openai import OpenAI

# 1. 加载文档
documents = SimpleDirectoryReader('data/').load_data()

# 2. 构建索引
index = VectorStoreIndex.from_documents(documents)

# 3. 配置Rerank
reranker = CohereRerank(
    api_key="YOUR_COHERE_KEY",
    top_n=3  # 从向量检索的10个候选中选出top 3
)

# 4. 创建查询引擎
query_engine = index.as_query_engine(
    similarity_top_k=10,  # 粗排:先取10个候选
    node_postprocessors=[reranker],  # 精排:Rerank到3个
    llm=OpenAI(model="gpt-4o-mini")
)

# 5. 查询
response = query_engine.query("什么是RAG系统?")
print(response)
⛓️

LangChain + BGE Reranker

# LangChain集成示例
from langchain.vectorstores import Qdrant
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import FlashrankRerank

# 1. 创建向量库
embeddings = HuggingFaceEmbeddings(
    model_name="BAAI/bge-large-zh-v1.5"
)
vectorstore = Qdrant.from_documents(
    documents,
    embeddings,
    location=":memory:"
)

# 2. 基础检索器(粗排)
base_retriever = vectorstore.as_retriever(
    search_kwargs={"k": 20}  # 先取20个候选
)

# 3. 配置Reranker(精排)
compressor = FlashrankRerank(
    model="ms-marco-MiniLM-L-12-v2",
    top_n=5  # 重排后取top 5
)

# 4. 压缩检索器
compression_retriever = ContextualCompressionRetriever(
    base_compressor=compressor,
    base_retriever=base_retriever
)

# 5. 检索
docs = compression_retriever.get_relevant_documents(
    "如何优化RAG检索质量?"
)
for doc in docs:
    print(f"相关度: {doc.metadata.get('relevance_score')}")
    print(f"内容: {doc.page_content[:100]}")

🗄️ 向量数据库详细对比与选择

向量数据库是RAG系统的存储核心,选择合适的数据库对性能和成本影响巨大

Chroma

入门首选

AI原生的嵌入式数据库,设计简洁,专为LLM应用优化

部署方式 嵌入式/服务器
数据规模 10万-100万
学习难度 极简单
GitHub Stars 16K+
# 安装
pip install chromadb

# 使用示例
import chromadb

# 创建客户端
client = chromadb.Client()
collection = client.create_collection("docs")

# 添加文档
collection.add(
    documents=["RAG系统指南", "向量检索教程"],
    ids=["doc1", "doc2"],
    metadatas=[{"source": "doc1"}, {"source": "doc2"}]
)

# 查询
results = collection.query(
    query_texts=["什么是RAG"],
    n_results=5
)

适用场景:

  • ✓ 快速原型开发
  • ✓ 个人项目
  • ✓ 学习和测试

Qdrant

推荐

Rust编写的高性能向量引擎,支持过滤、分组、实时更新

部署方式 Docker/云服务
数据规模 百万-千万
过滤能力 强大
GitHub Stars 22K+
# 安装
pip install qdrant-client

# 使用示例
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams

client = QdrantClient(":memory:")

# 创建集合
client.create_collection(
    collection_name="docs",
    vectors_config=VectorParams(
        size=1024,
        distance=Distance.COSINE
    )
)

# 插入向量
client.upsert(
    collection_name="docs",
    points=[{
        "id": 1,
        "vector": embedding,
        "payload": {"text": "RAG系统"}
    }]
)

# 搜索(带过滤)
results = client.search(
    collection_name="docs",
    query_vector=query_embedding,
    limit=5,
    query_filter={"category": "技术文档"}
)

适用场景:

  • ✓ 中小企业生产环境
  • ✓ 需要元数据过滤
  • ✓ 平衡性能和成本

Pinecone

托管服务

完全托管的向量数据库,无需运维,支持亿级规模

部署方式 云端托管
数据规模 亿级
运维 免运维
成本 $70+/月
# 安装
pip install pinecone-client

# 使用示例
import pinecone

pinecone.init(api_key="YOUR_KEY")

# 创建索引
index = pinecone.Index("docs")

# 上传向量
index.upsert([
    ("id1", embedding1, {"text": "文档1"}),
    ("id2", embedding2, {"text": "文档2"})
])

# 查询
results = index.query(
    vector=query_embedding,
    top_k=5,
    include_metadata=True
)

适用场景:

  • ✓ 企业生产环境
  • ✓ 追求稳定性
  • ✓ 不想管理基础设施

Milvus

大规模

云原生分布式向量数据库,支持万亿级规模

部署方式 K8s/Docker
数据规模 千万-万亿
分布式 支持
GitHub Stars 31K+
# 安装
pip install pymilvus

# 使用示例
from pymilvus import connections, Collection

# 连接
connections.connect("default", host="localhost", port="19530")

# 创建集合
from pymilvus import CollectionSchema, FieldSchema, DataType
fields = [
    FieldSchema("id", DataType.INT64, is_primary=True),
    FieldSchema("embedding", DataType.FLOAT_VECTOR, dim=1024),
    FieldSchema("text", DataType.VARCHAR, max_length=500)
]
schema = CollectionSchema(fields)
collection = Collection("docs", schema)

# 搜索
results = collection.search(
    data=[query_embedding],
    anns_field="embedding",
    param={"metric_type": "COSINE", "params": {"nprobe": 10}},
    limit=5
)

适用场景:

  • ✓ 超大规模数据
  • ✓ 高并发场景
  • ✓ 需要分布式

Weaviate

多模态

开源向量搜索引擎,支持多模态、GraphQL、混合搜索

部署方式 Docker/云端
查询语言 GraphQL
混合搜索 原生支持
GitHub Stars 12K+
# 安装
pip install weaviate-client

# 使用示例
import weaviate

client = weaviate.Client("http://localhost:8080")

# 创建Schema
class_obj = {
    "class": "Document",
    "vectorizer": "text2vec-transformers",
    "properties": [
        {"name": "content", "dataType": ["text"]}
    ]
}
client.schema.create_class(class_obj)

# 混合搜索
results = client.query.get("Document", ["content"]) \
    .with_hybrid(query="RAG系统", alpha=0.5) \
    .with_limit(5) \
    .do()

适用场景:

  • ✓ 需要混合搜索
  • ✓ 多模态应用
  • ✓ GraphQL偏好

pgvector

SQL友好

PostgreSQL的向量扩展,利用成熟SQL数据库

部署方式 PostgreSQL
数据规模 百万级
SQL支持 完整
GitHub Stars 13K+
# 安装(PostgreSQL扩展)
CREATE EXTENSION vector;

# Python使用
import psycopg2

conn = psycopg2.connect("dbname=mydb")
cur = conn.cursor()

# 创建表
cur.execute("""
    CREATE TABLE documents (
        id serial PRIMARY KEY,
        content text,
        embedding vector(1024)
    )
""")

# 插入
cur.execute("""
    INSERT INTO documents (content, embedding)
    VALUES (%s, %s)
""", ("RAG指南", embedding))

# 向量搜索
cur.execute("""
    SELECT content
    FROM documents
    ORDER BY embedding <=> %s
    LIMIT 5
""", (query_embedding,))

适用场景:

  • ✓ 已有PostgreSQL
  • ✓ 需要事务支持
  • ✓ SQL查询需求

📊 向量数据库性能对比

数据库 部署难度 查询速度 过滤能力 成本 推荐场景
Chroma 极简 基础 免费 原型开发、学习
Qdrant 简单 免费/托管 中小企业、生产
Pinecone 极简 极快 $70+/月 企业、大规模
Milvus 中等 极快 免费/托管 超大规模、分布式
Weaviate 中等 免费/托管 多模态、混合搜索
pgvector 简单 SQL 免费 已有PG、事务需求

🤖 LLM生成模型详解与选择

LLM是RAG系统的最终回答生成器,模型选择直接影响回答质量、成本和响应速度

📊 主流LLM模型全面对比(12个模型)

模型名称 上下文长度 能力评分 响应速度 输入成本 输出成本 语言优势 最佳场景
GPT-4
(OpenAI)
128K 98分 ⚡ 中等 $5/1M $15/1M 英文 高质量RAG回答
Claude-3.5 Sonnet
(Anthropic)
200K 99分 ⚡⚡ 快 $3/1M $15/1M 英文 长文档RAG
GPT-4o-mini
(OpenAI)
128K 92分 ⚡⚡⚡ 极快 $0.15/1M $0.6/1M 多语言 性价比首选
DeepSeek-V3
(DeepSeek)
64K 95分 ⚡⚡ 快 $0.27/1M $1.1/1M 中英 极致性价比
通义千问-Turbo
(阿里)
8K 88分 ⚡⚡⚡ 极快 ¥0.3/1M ¥0.6/1M 中文 中文RAG
GLM-4
(智谱)
128K 90分 ⚡⚡ 快 ¥5/1M ¥5/1M 中文 中文理解强
Llama 3.1 70B
(Meta)
128K 93分 ⚡ 中等 免费 本地 英文 本地部署
Qwen2.5 72B
(阿里)
128K 94分 ⚡ 中等 免费 本地 中文 中文本地
Gemini Pro 1.5
(Google)
1M 96分 ⚡⚡ 快 $1.25/1M $5/1M 多语言 超长上下文
Mistral Large
(Mistral)
128K 91分 ⚡⚡ 快 $2/1M $6/1M 多语言 欧洲用户
文心一言 4.0
(百度)
32K 87分 ⚡⚡ 快 ¥10/1M ¥30/1M 中文 百度生态
Moonshot-v1
(月之暗面)
200K 89分 ⚡⚡ 快 ¥1/1M ¥1/1M 中文 长文本RAG

🏆 效果最佳

Claude-3.5 Sonnet:99分,200K上下文

适合:高质量内容、长文档RAG

💰 性价比王

GPT-4o-mini:$0.15/1M输入

适合:高频调用、成本敏感

🇨🇳 中文首选

DeepSeek-V3:95分+超低价

适合:中文企业、成本优化

🔒 本地部署

Qwen2.5 72B:94分+开源

适合:数据安全、私有部署

📌 关键指标说明

上下文长度:能处理的最大token数,影响RAG中可以塞入多少检索文档

能力评分:综合评测(MMLU、GSM8K等),越高越聪明

响应速度:实际推理速度,影响用户体验

成本:输入/输出token的价格,商业模型按API计费

语言优势:擅长的语言类型,中文RAG选中文优化模型

最佳场景:根据特点推荐的应用场景

本地部署:开源模型可自行部署,成本=硬件成本

商业API:按token计费,无需自己运维

🎯 RAG场景LLM选择建议

🏢

企业知识库

需要高准确率,成本可控

推荐方案:

  • 中文:DeepSeek-V3(性价比)
  • 英文:GPT-4o-mini(均衡)
  • 混合:Claude-3.5(长文档)

预估成本:¥200-500/月(10万query)

🤖

智能客服

高并发,响应速度优先

推荐方案:

  • 首选:GPT-4o-mini(极快)
  • 备选:通义千问Turbo(便宜)
  • 本地:Qwen2.5-14B(私有)

预估成本:¥100-300/月(10万query)

📚

技术文档

长文档,推理能力强

推荐方案:

  • 最佳:Claude-3.5(200K)
  • 备选:Gemini Pro(1M)
  • 开源:Llama 3.1 70B

预估成本:¥500-1000/月(5万query)

💻 完整RAG系统实战代码

从文档加载到查询的完整流程,包含最佳实践和优化技巧

🦙

LlamaIndex 完整RAG系统

包含文档加载、分块、索引、检索、Rerank的完整流程

# 1. 安装依赖
pip install llama-index qdrant-client sentence-transformers cohere

# 2. 完整RAG系统代码
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.llms.openai import OpenAI
from llama_index.vector_stores.qdrant import QdrantVectorStore
from llama_index.core.postprocessor import CohereRerank
from llama_index.core.node_parser import SentenceSplitter
import qdrant_client

# 配置全局设置
Settings.llm = OpenAI(model="gpt-4o-mini", temperature=0.1)
Settings.embed_model = HuggingFaceEmbedding(
    model_name="BAAI/bge-large-zh-v1.5"
)

# 3. 文档加载与分块
documents = SimpleDirectoryReader(
    input_dir="./data",
    recursive=True,
    filename_as_id=True
).load_data()

# 优化分块策略
node_parser = SentenceSplitter(
    chunk_size=512,        # 块大小
    chunk_overlap=50,      # 重叠10%
    paragraph_separator="\n\n"
)
nodes = node_parser.get_nodes_from_documents(documents)

# 4. 创建向量数据库
client = qdrant_client.QdrantClient(path="./qdrant_data")
vector_store = QdrantVectorStore(
    client=client,
    collection_name="knowledge_base"
)

# 5. 构建索引
index = VectorStoreIndex(
    nodes,
    vector_store=vector_store
)

# 6. 配置Rerank(性能提升关键)
reranker = CohereRerank(
    api_key="YOUR_COHERE_KEY",
    top_n=3,
    model="rerank-multilingual-v3.0"
)

# 7. 创建查询引擎
query_engine = index.as_query_engine(
    similarity_top_k=10,              # 粗排:取10个候选
    node_postprocessors=[reranker],   # 精排:Rerank到3个
    response_mode="compact",          # 压缩上下文
)

# 8. 查询
response = query_engine.query("什么是RAG系统?如何构建?")
print(f"回答: {response}")

# 查看引用来源
for node in response.source_nodes:
    print(f"\n来源: {node.metadata.get('file_name')}")
    print(f"相关度: {node.score:.3f}")
    print(f"内容: {node.text[:100]}...")
⛓️

LangChain 混合检索系统

向量检索 + BM25关键词检索,准确率更高

# 安装
pip install langchain langchain-community qdrant-client rank-bm25

# 完整混合检索代码
from langchain.vectorstores import Qdrant
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.retrievers import EnsembleRetriever, BM25Retriever
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import DirectoryLoader
from langchain_openai import ChatOpenAI
from langchain.chains import RetrievalQA

# 1. 加载文档
loader = DirectoryLoader('./data', glob="**/*.txt")
documents = loader.load()

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

# 3. 创建Embedding和向量库
embeddings = HuggingFaceEmbeddings(
    model_name="BAAI/bge-large-zh-v1.5",
    model_kwargs={'device': 'cpu'},
    encode_kwargs={'normalize_embeddings': True}
)

vectorstore = Qdrant.from_documents(
    texts,
    embeddings,
    path="./qdrant_db",
    collection_name="docs",
    force_recreate=False
)

# 4. 向量检索器
vector_retriever = vectorstore.as_retriever(
    search_kwargs={"k": 10}
)

# 5. BM25关键词检索器
bm25_retriever = BM25Retriever.from_documents(texts)
bm25_retriever.k = 10

# 6. 混合检索器(向量 + 关键词)
ensemble_retriever = EnsembleRetriever(
    retrievers=[vector_retriever, bm25_retriever],
    weights=[0.6, 0.4]  # 向量60%,关键词40%
)

# 7. 创建QA链
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.1)
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=ensemble_retriever,
    return_source_documents=True
)

# 8. 查询
result = qa_chain({"query": "如何优化RAG检索质量?"})
print(f"回答: {result['result']}")
print(f"\n引用来源数: {len(result['source_documents'])}")
🚀

生产级RAG系统(混合检索+Rerank)

企业级完整方案,包含缓存、监控、错误处理

# 生产级RAG完整代码
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.llms.openai import OpenAI
from llama_index.vector_stores.qdrant import QdrantVectorStore
from llama_index.core.postprocessor import CohereRerank, SimilarityPostprocessor
from llama_index.core.node_parser import SentenceSplitter
from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.core.retrievers import VectorIndexRetriever
import qdrant_client
import logging

# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

class ProductionRAG:
    def __init__(self):
        # 配置Embedding
        Settings.embed_model = HuggingFaceEmbedding(
            model_name="BAAI/bge-large-zh-v1.5",
            cache_folder="./models"
        )
        
        # 配置LLM
        Settings.llm = OpenAI(
            model="gpt-4o-mini",
            temperature=0.1,
            max_tokens=1000
        )
        
        # 向量数据库
        self.client = qdrant_client.QdrantClient(
            host="localhost",
            port=6333,
            timeout=60
        )
        
        self.vector_store = QdrantVectorStore(
            client=self.client,
            collection_name="production_kb"
        )
        
    def build_index(self, data_dir="./data"):
        """构建索引"""
        try:
            # 加载文档
            documents = SimpleDirectoryReader(
                input_dir=data_dir,
                recursive=True
            ).load_data()
            
            logger.info(f"加载了 {len(documents)} 个文档")
            
            # 优化分块
            splitter = SentenceSplitter(
                chunk_size=512,
                chunk_overlap=50
            )
            nodes = splitter.get_nodes_from_documents(documents)
            
            # 构建索引
            self.index = VectorStoreIndex(
                nodes,
                vector_store=self.vector_store,
                show_progress=True
            )
            
            logger.info("索引构建完成")
            return True
            
        except Exception as e:
            logger.error(f"构建索引失败: {e}")
            return False
    
    def create_query_engine(self):
        """创建查询引擎"""
        # 检索器配置
        retriever = VectorIndexRetriever(
            index=self.index,
            similarity_top_k=20  # 粗排:取20个候选
        )
        
        # 后处理器(多层过滤)
        postprocessors = [
            SimilarityPostprocessor(similarity_cutoff=0.7),  # 过滤低相关
            CohereRerank(
                api_key="YOUR_KEY",
                top_n=5,  # 精排:选出5个
                model="rerank-multilingual-v3.0"
            )
        ]
        
        # 创建查询引擎
        query_engine = RetrieverQueryEngine(
            retriever=retriever,
            node_postprocessors=postprocessors,
            response_synthesizer=self.index.as_query_engine().response_synthesizer
        )
        
        return query_engine
    
    def query(self, question: str):
        """执行查询"""
        try:
            query_engine = self.create_query_engine()
            response = query_engine.query(question)
            
            # 返回结果
            return {
                "answer": str(response),
                "sources": [
                    {
                        "file": node.metadata.get("file_name"),
                        "score": node.score,
                        "text": node.text[:200]
                    }
                    for node in response.source_nodes
                ]
            }
        except Exception as e:
            logger.error(f"查询失败: {e}")
            return {"error": str(e)}

# 使用示例
if __name__ == "__main__":
    rag = ProductionRAG()
    
    # 构建索引(首次运行)
    rag.build_index("./data")
    
    # 查询
    result = rag.query("如何优化RAG检索质量?")
    print(f"回答: {result['answer']}")
    print(f"\n引用来源:")
    for src in result['sources']:
        print(f"  - {src['file']} (相关度: {src['score']:.3f})")

❓ RAG常见问题与解决方案

Q1

检索质量差,经常找不到相关内容?

解决方案:

  • 优化分块:chunk_size调整为256-512,overlap 10-20%
  • 混合检索:向量+BM25关键词
  • 查询重写:用LLM扩展查询
  • 更换Embedding:中文用bge,英文用text-embedding-3
Q2

模型不使用检索到的文档?

解决方案:

  • 强化提示词:"必须基于文档回答"
  • 要求引用:"标注段落编号"
  • 减少候选:top_k从10降到3-5
  • 上下文压缩:过滤无关内容
Q3

Token消耗太大,成本过高?

解决方案:

  • 减小chunk_size:从512降到256
  • 分级模型:简单问题用mini模型
  • 缓存机制:相似问题返回缓存
  • 提示词精简:去掉冗余描述
Q4

响应速度太慢,用户体验差?

解决方案:

  • HNSW索引:向量库使用HNSW算法
  • 流式输出:启用streaming逐字返回
  • 异步处理:检索和生成并发
  • 本地部署:Ollama本地模型

⚡ RAG性能优化速查表

🔍 检索性能优化

优化项 推荐配置 提升
索引算法 HNSW 10x
chunk_size 256-512 平衡
overlap 10-20% 上下文
top_k 3-10 准确
相似度阈值 >0.7 过滤
Rerank 必加 +30%

✨ 生成性能优化

优化项 推荐配置 效果
temperature 0.1-0.3 稳定
max_tokens 512-1024 成本↓
streaming 开启 体验↑
模型选择 分级使用 成本↓40%
缓存 Redis 命中50%

📊 性能基准参考值

85%+

准确率目标

测试集验证

<500ms

端到端延迟

不含LLM

1000+

Token/回答

平均消耗

99.9%

系统可用性

生产环境

🏆 RAG最佳实践总结

📊

数据质量第一

  • • 清理噪音数据
  • • 统一文档格式
  • • 添加丰富元数据
  • • 定期更新知识库
🔍

混合检索策略

  • • 向量检索捕获语义
  • • BM25补充精确匹配
  • • Rerank重排序
  • • 查询扩展提高召回

提示词优化

  • • 明确角色和任务
  • • 要求标注来源
  • • 处理"不知道"
  • • Few-shot示例
📈

持续评估优化

  • • 建立评估指标
  • • A/B测试对比
  • • 收集用户反馈
  • • 迭代改进流程
💰

成本控制

  • • 缓存相似查询
  • • 分级使用模型
  • • 压缩上下文
  • • 监控API消耗
🔒

安全与合规

  • • 敏感信息过滤
  • • 访问权限控制
  • • 审计日志记录
  • • 数据隐私保护

🎯 RAG开发快速参考

⚡ 性能优化口诀

  • • 数据质量决定80%效果
  • • 混合检索优于单一检索
  • • Rerank是性价比之王
  • • 缓存能省50%成本
  • • 监控先于优化

🎯 参数推荐值

  • • chunk_size: 256-512
  • • overlap: 10-20%
  • • top_k: 3-10
  • • temperature: 0.1-0.3
  • • similarity: >0.7

📚 必读资源

  • • LlamaIndex官方文档
  • • DeepLearning.AI课程
  • • RAG Techniques合集
  • • Prompt Engineering Guide
  • • 加入Discord社区

🎓 深度学习:掌握完整AI技术栈

RAG是企业AI应用的核心,但要构建完整的AI系统,还需要掌握相关技术

💡 进阶学习建议

1️⃣

巩固基础

学习提示词工程, 优化RAG的检索和生成效果

重点内容:

  • • 查询重写技巧
  • • 生成提示词模板
  • • Few-shot示例
2️⃣

能力提升

学习Agent开发, 让RAG系统更智能

重点内容:

  • • Agent调用RAG
  • • 多步检索推理
  • • 自主知识库选择
3️⃣

专业定制

学习模型微调, 打造垂直领域RAG

重点内容:

  • • Embedding微调
  • • LLM领域适配
  • • 微调+RAG组合

💻 RAG开发完整示例(从0到1)

选择合适的开发框架能让RAG开发效率提升10倍!提供5种方案:代码开发、可视化平台、国产LLM、本地部署,满足不同需求

🦙

LlamaIndex完整示例

最适合RAG开发,API简洁,专注数据索引,代码量少30%

📦 包含内容:

  • ✓ 环境配置(pip、conda)
  • ✓ 文档加载与分块
  • ✓ Embedding模型选择
  • ✓ 向量存储(Chroma/Qdrant)
  • ✓ 检索与生成
  • ✓ Rerank集成
  • ✓ 完整可运行代码(80行)
⏱️ 学习时间 30分钟
📊 难度 ⭐⭐ 简单
🎯 推荐度 ⭐⭐⭐⭐⭐
🦙 查看完整教程 →
⛓️

LangChain完整示例

最流行框架,功能全面,生态丰富,适合复杂应用和Agent集成

📦 包含内容:

  • ✓ 环境配置(完整依赖)
  • ✓ Document Loader使用
  • ✓ 混合检索(向量+BM25)
  • ✓ Chain构建
  • ✓ Memory管理
  • ✓ 与Agent结合
  • ✓ 完整可运行代码(100行)
⏱️ 学习时间 45分钟
📊 难度 ⭐⭐⭐ 中等
🎯 推荐度 ⭐⭐⭐⭐
⛓️ 查看完整教程 →
🐍

纯Python基础示例

从零理解原理,不依赖框架,手把手实现RAG核心逻辑

📦 包含内容:

  • ✓ 环境配置(最小依赖)
  • ✓ 手动实现Chunking
  • ✓ 自己调用Embedding API
  • ✓ 手动向量检索
  • ✓ 手动构建Prompt
  • ✓ 调用LLM生成
  • ✓ 完整可运行代码(60行)
⏱️ 学习时间 20分钟
📊 难度 ⭐ 极简
🎯 推荐度 ⭐⭐⭐⭐⭐
🐍 查看完整教程 →
🎨

Dify可视化平台

零代码RAG,可视化拖拽,5分钟搭建,适合非技术人员

📦 包含内容:

  • ✓ Docker一键部署
  • ✓ 可视化配置界面
  • ✓ 拖拽式工作流
  • ✓ 多种Embedding选择
  • ✓ 内置向量数据库
  • ✓ 提示词模板库
  • ✓ 零代码开发
⏱️ 学习时间 5分钟
📊 难度 ⭐ 极简
🎯 推荐度 ⭐⭐⭐⭐
🎨 查看完整教程 →
🇨🇳

DeepSeek国产方案

国产LLM首选,95分能力+超低价,性价比极致

📦 包含内容:

  • ✓ DeepSeek API配置
  • ✓ bge-large-zh中文Embedding
  • ✓ Qdrant向量数据库
  • ✓ 全国产技术栈
  • ✓ 成本极低($0.27/1M)
  • ✓ 中英文都优秀
  • ✓ 完整可运行代码(70行)
⏱️ 学习时间 25分钟
📊 难度 ⭐⭐ 简单
🎯 推荐度 ⭐⭐⭐⭐⭐
🇨🇳 查看完整教程 →
🔒

Ollama本地部署

完全私有化,数据不出本地,适合敏感数据场景

📦 包含内容:

  • ✓ Ollama安装配置
  • ✓ Qwen2.5本地部署
  • ✓ bge-large-zh本地Embedding
  • ✓ Chroma本地向量库
  • ✓ 0云端调用,完全私有
  • ✓ 数据安全合规
  • ✓ 完整可运行代码(85行)
⏱️ 学习时间 40分钟
📊 难度 ⭐⭐⭐ 中等
🎯 推荐度 ⭐⭐⭐⭐
🔒 查看完整教程 →

🚀 快速导航:选择适合你的示例

👨‍💻

新手入门

从未接触过RAG?想快速上手?

推荐路径:

  1. 1. 纯Python示例(理解原理)
  2. 2. LlamaIndex示例(快速开发)
🏢

企业应用

需要复杂功能和Agent集成?

推荐路径:

  1. 1. LangChain示例(功能全面)
  2. 2. 查看Agent集成

快速原型

需要快速验证想法?

推荐路径:

  1. 1. LlamaIndex示例(30分钟)
  2. 2. 查看可视化工具(Dify)

📊 三大框架快速对比

特性 LlamaIndex LangChain 纯Python
代码量 80行 100行 60行
学习曲线 ⭐⭐ 简单 ⭐⭐⭐ 中等 ⭐ 极简
向量数据库 ✓ 10+ (内置) ✓ 15+ (内置) 需手动集成
Embedding支持 ✓ 20+ 模型 ✓ 30+ 模型 需手动调用
Rerank集成 简单 中等 复杂
Agent支持 ✓ 基础 ✓ 强大 ✗ 无
文档质量 优秀 优秀 N/A
GitHub Stars 37K+ 80K+ N/A
最佳场景 RAG专项 复杂应用 学习原理

🐍 纯Python RAG基础示例(从0到1)

不依赖任何框架,从零手写RAG系统,帮你深刻理解RAG工作原理

1

环境准备(1分钟)

# 最小依赖安装
pip install openai numpy

# 或使用国内源加速
pip install openai numpy -i https://pypi.tuna.tsinghua.edu.cn/simple

只需要2个包:OpenAI(调用API)+ Numpy(向量计算)

2

完整代码(60行)

所有核心逻辑都在这60行代码里!包含文档分块、向量化、检索、生成全流程

查看完整代码 ↓

📝 basic_rag.py(60行完整代码)

import openai
import numpy as np

# 配置API密钥
openai.api_key = "your-api-key-here"

# 示例文档
documents = [
    "RAG是检索增强生成系统,结合信息检索和大语言模型。",
    "向量数据库用于存储和检索文本的向量表示。",
    "Embedding模型将文本转换为固定维度的向量。",
    "Rerank模型可以提升检索准确率30%以上。",
    "LlamaIndex专注于RAG开发,API简洁易用。"
]

def get_embedding(text):
    """获取文本的向量表示"""
    response = openai.Embedding.create(
        model="text-embedding-3-small",
        input=text
    )
    return response['data'][0]['embedding']

def cosine_similarity(vec1, vec2):
    """计算余弦相似度"""
    return np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))

def retrieve(query, documents, top_k=3):
    """检索最相关的文档"""
    # 1. 查询向量化
    query_emb = get_embedding(query)
    
    # 2. 文档向量化(实际应用中应提前做好并缓存)
    doc_embs = [get_embedding(doc) for doc in documents]
    
    # 3. 计算相似度
    scores = [cosine_similarity(query_emb, doc_emb) for doc_emb in doc_embs]
    
    # 4. 排序取top-k
    top_indices = np.argsort(scores)[::-1][:top_k]
    
    return [documents[i] for i in top_indices]

def generate_answer(query, context_docs):
    """基于检索文档生成回答"""
    # 构建提示词
    context = "\n".join([f"- {doc}" for doc in context_docs])
    prompt = f"""基于以下参考文档回答问题:

参考文档:
{context}

问题:{query}

请基于参考文档回答,如果参考文档中没有相关信息,请说明。
"""
    
    # 调用LLM生成
    response = openai.ChatCompletion.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": prompt}],
        temperature=0.3
    )
    
    return response.choices[0].message.content

# 主流程
if __name__ == "__main__":
    query = "什么是RAG系统?"
    
    # 检索
    print("🔍 检索相关文档...")
    relevant_docs = retrieve(query, documents, top_k=2)
    print(f"找到 {len(relevant_docs)} 个相关文档")
    
    # 生成
    print("\n🤖 生成回答...")
    answer = generate_answer(query, relevant_docs)
    print(f"\n答案:{answer}")
🔑 核心函数说明
  • get_embedding():调用OpenAI API获取向量
  • cosine_similarity():计算向量相似度
  • retrieve():检索最相关的top-k文档
  • generate_answer():基于文档生成回答
💡 优化建议
  • ✓ 文档向量应提前计算并缓存(避免重复计算)
  • ✓ 添加Rerank提升准确率30%
  • ✓ 使用向量数据库代替内存存储
  • ✓ 实现文档分块处理长文本

✨ 运行效果示例

问题:什么是RAG系统?

答案:RAG(检索增强生成)是一种结合信息检索和大语言模型的系统架构。它通过先检索相关文档, 再将文档作为上下文提供给LLM生成回答,可以有效解决知识时效性问题和减少幻觉。

🦙 LlamaIndex RAG完整开发流程

最适合RAG开发的框架!API简洁,专注数据索引,30分钟从0搭建完整RAG系统

1

安装依赖

3分钟

2

加载文档

5分钟

3

构建索引

10分钟

4

检索生成

12分钟

📝 llamaindex_rag.py(80行完整代码)

# ============ 步骤1:安装依赖 ============
# pip install llama-index llama-index-llms-openai llama-index-embeddings-openai
# pip install chromadb  # 向量数据库

# ============ 步骤2:导入并配置 ============
import os
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.core.node_parser import SentenceSplitter
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.llms.openai import OpenAI
from llama_index.core.postprocessor import SentenceTransformerRerank
from llama_index.vector_stores.chroma import ChromaVectorStore
import chromadb

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

# 配置全局设置
Settings.llm = OpenAI(model="gpt-4o-mini", temperature=0.3)
Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small")
Settings.node_parser = SentenceSplitter(chunk_size=512, chunk_overlap=50)

# ============ 步骤3:加载文档 ============
# 方式1:从目录加载
documents = SimpleDirectoryReader("./docs").load_data()

# 方式2:从文本加载
# from llama_index.core import Document
# documents = [
#     Document(text="RAG是检索增强生成系统..."),
#     Document(text="向量数据库用于存储...")
# ]

# ============ 步骤4:配置向量数据库 ============
# 初始化Chroma客户端
chroma_client = chromadb.PersistentClient(path="./chroma_db")
chroma_collection = chroma_client.get_or_create_collection("my_rag")

# 创建向量存储
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)

# ============ 步骤5:构建索引 ============
index = VectorStoreIndex.from_documents(
    documents,
    vector_store=vector_store,
    show_progress=True
)

# ============ 步骤6:添加Rerank(可选但推荐)============
reranker = SentenceTransformerRerank(
    model="BAAI/bge-reranker-base",
    top_n=3
)

# ============ 步骤7:创建查询引擎 ============
query_engine = index.as_query_engine(
    similarity_top_k=10,  # 先检索10个候选
    node_postprocessors=[reranker]  # Rerank精排到3个
)

# ============ 步骤8:查询 ============
def query_rag(question):
    """查询RAG系统"""
    response = query_engine.query(question)
    
    # 打印回答
    print(f"问题:{question}")
    print(f"回答:{response}")
    print(f"\n来源文档:")
    for node in response.source_nodes:
        print(f"- {node.text[:100]}... (相似度: {node.score:.3f})")
    
    return response

# ============ 步骤9:使用示例 ============
if __name__ == "__main__":
    # 单次查询
    query_rag("什么是RAG系统?")
    
    # 持续对话
    # query_engine_chat = index.as_chat_engine()
    # response = query_engine_chat.chat("什么是RAG?")
✨ 框架优势
  • ✓ 仅80行代码完成完整RAG
  • ✓ 自动处理文档分块
  • ✓ 内置10+向量数据库
  • ✓ 一行代码集成Rerank
🔧 支持的模型
  • Embedding:20+ (OpenAI, bge, m3e...)
  • LLM:30+ (GPT, Claude, 通义...)
  • Rerank:Cohere, BGE, ColBERT
  • 向量库:Chroma, Qdrant, Pinecone...
📚 文档加载器
  • ✓ PDF、Word、Excel
  • ✓ Markdown、TXT
  • ✓ 网页、API
  • ✓ 数据库、CSV

⛓️ LangChain RAG完整开发流程

最流行的LLM框架!功能全面,生态丰富,45分钟掌握混合检索+Agent集成

📝 langchain_rag.py(100行完整代码)

# ============ 步骤1:安装依赖 ============
# pip install langchain langchain-openai langchain-community
# pip install chromadb faiss-cpu  # 向量数据库
# pip install rank-bm25  # BM25检索

# ============ 步骤2:导入模块 ============
import os
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
from langchain.document_loaders import DirectoryLoader, TextLoader
from langchain.retrievers import BM25Retriever, EnsembleRetriever

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

# ============ 步骤3:加载和处理文档 ============
# 从目录加载文档
loader = DirectoryLoader('./docs', glob="**/*.txt", loader_cls=TextLoader)
documents = loader.load()

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

print(f"加载了 {len(documents)} 个文档,分块为 {len(chunks)} 个")

# ============ 步骤4:配置Embedding和向量库 ============
# 初始化Embedding模型
embeddings = OpenAIEmbeddings(
    model="text-embedding-3-small"
)

# 创建向量存储
vectorstore = Chroma.from_documents(
    documents=chunks,
    embedding=embeddings,
    persist_directory="./chroma_langchain"
)

# ============ 步骤5:混合检索(向量+BM25)============
# 向量检索器
vector_retriever = vectorstore.as_retriever(
    search_type="similarity",
    search_kwargs={"k": 5}
)

# BM25关键词检索器
bm25_retriever = BM25Retriever.from_documents(chunks)
bm25_retriever.k = 5

# 组合检索器(0.5权重各半)
ensemble_retriever = EnsembleRetriever(
    retrievers=[vector_retriever, bm25_retriever],
    weights=[0.5, 0.5]
)

# ============ 步骤6:配置LLM ============
llm = ChatOpenAI(
    model="gpt-4o-mini",
    temperature=0.3
)

# ============ 步骤7:自定义Prompt ============
custom_prompt = PromptTemplate(
    template="""基于以下参考文档回答问题。如果参考文档中没有相关信息,请诚实说明。

参考文档:
{context}

问题:{question}

请提供详细且准确的回答,并说明信息来源:
""",
    input_variables=["context", "question"]
)

# ============ 步骤8:创建QA Chain ============
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",  # 将所有文档塞入一个prompt
    retriever=ensemble_retriever,
    return_source_documents=True,
    chain_type_kwargs={"prompt": custom_prompt}
)

# ============ 步骤9:查询函数 ============
def query_rag(question):
    """查询RAG系统"""
    result = qa_chain({"query": question})
    
    print(f"\n问题:{question}")
    print(f"\n回答:{result['result']}")
    print(f"\n参考文档({len(result['source_documents'])}个):")
    for i, doc in enumerate(result['source_documents'], 1):
        print(f"{i}. {doc.page_content[:100]}...")
    
    return result

# ============ 步骤10:使用示例 ============
if __name__ == "__main__":
    # 单次查询
    query_rag("什么是RAG系统?")
    
    # 批量查询
    questions = [
        "RAG有哪些优势?",
        "如何选择Embedding模型?",
        "Rerank的作用是什么?"
    ]
    for q in questions:
        query_rag(q)
🌟 LangChain特色
  • 混合检索:向量检索 + BM25关键词检索
  • Chain组合:灵活的Chain链式调用
  • Memory:内置对话历史管理
  • Agent:强大的Agent工具调用
  • 生态丰富:80K+ GitHub Stars
🔗 与Agent集成
# RAG作为Agent工具
from langchain.agents import Tool

rag_tool = Tool(
    name="RAG_Search",
    func=qa_chain.run,
    description="搜索知识库回答问题"
)

# 集成到Agent
from langchain.agents import initialize_agent
agent = initialize_agent(
    tools=[rag_tool],
    llm=llm,
    agent="zero-shot-react"
)

🎓 继续深入学习

掌握了基础RAG开发?接下来学习Agent集成、提示词优化、模型微调

📊 6种RAG方案全面对比

方案 代码量 难度 时间 成本 最佳场景
🐍 纯Python 60行 ⭐ 极简 20分钟 学习原理
🦙 LlamaIndex 80行 ⭐⭐ 简单 30分钟 RAG专项开发
⛓️ LangChain 100行 ⭐⭐⭐ 中等 45分钟 复杂应用+Agent
🎨 Dify平台 0行 ⭐ 极简 5分钟 零代码快速原型
🇨🇳 DeepSeek 70行 ⭐⭐ 简单 25分钟 极低 国产+性价比
🔒 Ollama 85行 ⭐⭐⭐ 中等 40分钟 0云端 私有化部署
👨‍💻

技术人员

想深入理解原理并定制开发

初学者:纯Python → LlamaIndex

进阶:LangChain + Agent

国产:DeepSeek方案

🎨

非技术人员

需要快速搭建,不想写代码

首选:Dify可视化平台

5分钟:从0到上线

优势:零代码开发

🔒

敏感数据场景

金融、医疗等需要私有化部署

必选:Ollama本地方案

保障:100%数据不出本地

合规:满足安全审计