检索增强生成 - 给AI装上企业知识库
检索增强生成(RAG)是当前最实用的AI技术之一,让大模型能够访问最新知识和企业私有数据
检索增强生成(Retrieval-Augmented Generation) 是一种将信息检索与大语言模型生成相结合的技术架构。
简单理解:就像开卷考试,让AI在回答问题前先"翻书查资料", 而不是仅凭"记忆"(训练数据)回答。
🔄 工作流程(5步):
用户提问
例:"什么是RAG系统?"
问题向量化
用Embedding模型转为1024维向量
向量检索
从向量数据库找出最相关的top-k文档
拼接上下文
将检索文档 + 用户问题组合成提示词
LLM生成回答
基于检索内容生成准确答案
✓ 解决知识时效性问题
LLM训练数据有截止日期(如GPT-4是2023年4月),RAG可实时访问最新数据、新闻、产品信息
✓ 大幅降低幻觉(Hallucination)
基于真实文档回答,要求标注来源,减少模型"胡编乱造",准确率从60%提升到85%+
✓ 访问私有知识库
无需重新训练模型就能使用企业内部文档、产品手册、技术规范等私有数据
✓ 可追溯性与可信度
每个回答都能标注引用来源和段落,方便验证准确性,满足合规要求
✓ 成本更优
比微调模型便宜10倍以上,更新知识只需重新索引文档,而非重新训练
| 方案 | 知识更新 | 开发成本 | 运行成本 | 准确率 | 适用场景 |
|---|---|---|---|---|---|
| 纯Prompt | 不可更新 | 极低 | 极低 | 低60% | 通用对话、创作 |
| RAG | 实时更新 | 中 | 中 | 高85%+ | 知识库、客服、文档 |
| 微调 | 需重新训练 | 高 | 低 | 很高90%+ | 垂直专业领域 |
| RAG+微调 | 灵活 | 较高 | 中等 | 最高95%+ | 企业级专业应用 |
Facebook AI Research发表论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》
首次系统性提出RAG架构,证明检索能显著提升QA任务性能
Pinecone、Weaviate、Milvus等专用向量数据库快速发展
解决了大规模向量存储和快速检索的工程化问题
LangChain、LlamaIndex等开发框架诞生,降低RAG开发门槛
从"写论文"到"写代码",开发者可以快速构建RAG应用
ChatGPT插件、Notion AI、Microsoft Copilot等产品广泛采用RAG
RAG从实验室走向生产,成为企业AI应用的标配技术
HyDE、Self-RAG、Corrective RAG、Graph RAG等高级技术涌现
准确率从85%提升到95%+,RAG与Agent深度融合
点击查看每种模型的完整使用指南和代码示例
将文本转为向量,是RAG的基础
中文首选
bge-large-zh-v1.5(智源)
英文最佳
text-embedding-3(OpenAI)
多语言
multilingual-e5(微软)
多模态
CLIP(OpenAI)
轻量级
all-MiniLM-L6-v2
重排序,准确率提升30%
商业最佳
Cohere Rerank v3.0
开源中文
bge-reranker-large
开源英文
Cross-Encoder ms-marco
长文本
Jina Reranker(8K)
生成回答的大语言模型
效果最佳
GPT-4 / Claude-3.5 Sonnet
性价比高
GPT-4o-mini / DeepSeek
中文优化
通义千问 / GLM-4
本地部署
Llama 3.1 / Qwen2
长上下文
Claude-3.5(200K)
80%
企业AI应用
使用RAG技术
10倍
比微调便宜
开发+运行成本
85%+
准确率
优化后可达
3天
开发周期
从0到上线
根据实际业务需求和技术背景,选择最合适的RAG技术栈
员工查询内部文档、规章制度、产品手册
推荐技术栈:
LlamaIndex
Qdrant
bge-large-zh
通义千问
关键特性:
开发者查询API文档、代码示例
推荐技术栈:
LangChain
Chroma
text-embedding-3
GPT-4o-mini
关键特性:
自动回答客户常见问题
推荐技术栈:
Dify
Pinecone
m3e-base
Claude-3.5
关键特性:
高准确率要求,专业术语多
推荐技术栈:
LangChain
Milvus
领域微调
Cohere Rerank
关键特性:
多模态搜索,图文结合
推荐技术栈:
Haystack
Weaviate
CLIP
混合检索
关键特性:
个人笔记、文档整理
推荐技术栈:
LlamaIndex
Chroma
本地模型
Ollama
关键特性:
✓ 可视化界面,拖拽配置 | ✓ 30分钟内跑通 | ✓ 适合原型验证
✓ 代码友好,易于定制 | ✓ 生态成熟 | ✓ 适合个人项目
✓ 功能全面,可扩展 | ✓ 支持Agent | ✓ 适合生产环境
✓ 搜索优化 | ✓ Pipeline架构 | ✓ 适合大规模文档
Embedding模型将文本转换为向量,是RAG系统的核心。选对模型可以让检索准确率提升30%+
智源(BAAI)开源的中文Embedding模型,中文检索效果业界领先
1024
512 tokens
# 安装
pip install sentence-transformers
# 使用示例
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('BAAI/bge-large-zh-v1.5')
embeddings = model.encode([
"什么是RAG系统?",
"如何构建知识库?"
])
适用场景:
OpenAI最新的Embedding模型,性能强大,支持可变维度
256-3072可调
8191 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
适用场景:
Moka AI开源的中文Embedding,性能与bge接近,更轻量
768
512 tokens
# 安装
pip install sentence-transformers
# 使用示例
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('moka-ai/m3e-base')
embeddings = model.encode([
"客服问答系统",
"知识库检索"
])
适用场景:
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)
)
适用场景:
sentence-transformers最受欢迎的轻量级英文模型
384
# 使用
from sentence_transformers import SentenceTransformer
model = SentenceTransformer(
'all-MiniLM-L6-v2'
)
embeddings = model.encode([
"How to build RAG?",
"Vector database guide"
])
适用场景:
微软的多语言Embedding,支持100+种语言
768
# 使用
from sentence_transformers import SentenceTransformer
model = SentenceTransformer(
'intfloat/multilingual-e5-large'
)
# 支持中英文混合
embeddings = model.encode([
"English document",
"中文文档"
])
适用场景:
| 模型名称 | 维度 | 最大长度 | 语言 | 模型大小 | 速度 | 准确率 | 成本 | 最佳场景 |
|---|---|---|---|---|---|---|---|---|
|
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调用成本或本地部署硬件要求
模型大小:本地部署所需磁盘/内存
语言支持:中文、英文、多语言、多模态等
推荐场景:根据实际业务特点选择
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(重排序)可以将检索准确率从70%提升到90%,是性价比最高的优化手段
两阶段检索策略:
业界领先的Rerank API服务,支持多语言,效果最佳
rerank-multilingual-v3.0
# 安装
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]}")
优势:
智源开源的中文Rerank模型,可本地部署,中文效果优秀
bge-reranker-large
# 安装
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]
优势:
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 AI开源的长文本Rerank模型,支持8K token
jina-reranker-v1
# 使用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
)
优势:
| 模型名称 | 类型 | 语言支持 | 最大长度 | 部署方式 | 成本 | 准确率提升 | 最佳场景 |
|---|---|---|---|---|---|---|---|
|
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或开源模型
+30%
准确率提升
从70%到90%+
-50%
无关文档
过滤噪音数据
2-5倍
用户满意度
回答质量大幅提升
# 完整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集成示例
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系统的存储核心,选择合适的数据库对性能和成本影响巨大
AI原生的嵌入式数据库,设计简洁,专为LLM应用优化
# 安装
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
)
适用场景:
Rust编写的高性能向量引擎,支持过滤、分组、实时更新
# 安装
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": "技术文档"}
)
适用场景:
完全托管的向量数据库,无需运维,支持亿级规模
# 安装
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
)
适用场景:
云原生分布式向量数据库,支持万亿级规模
# 安装
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
)
适用场景:
开源向量搜索引擎,支持多模态、GraphQL、混合搜索
# 安装
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()
适用场景:
PostgreSQL的向量扩展,利用成熟SQL数据库
# 安装(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,))
适用场景:
| 数据库 | 部署难度 | 查询速度 | 过滤能力 | 成本 | 推荐场景 |
|---|---|---|---|---|---|
| Chroma | 极简 | 中 | 基础 | 免费 | 原型开发、学习 |
| Qdrant | 简单 | 快 | 强 | 免费/托管 | 中小企业、生产 |
| Pinecone | 极简 | 极快 | 强 | $70+/月 | 企业、大规模 |
| Milvus | 中等 | 极快 | 强 | 免费/托管 | 超大规模、分布式 |
| Weaviate | 中等 | 快 | 强 | 免费/托管 | 多模态、混合搜索 |
| pgvector | 简单 | 中 | SQL | 免费 | 已有PG、事务需求 |
LLM是RAG系统的最终回答生成器,模型选择直接影响回答质量、成本和响应速度
| 模型名称 | 上下文长度 | 能力评分 | 响应速度 | 输入成本 | 输出成本 | 语言优势 | 最佳场景 |
|---|---|---|---|---|---|---|---|
|
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计费,无需自己运维
需要高准确率,成本可控
推荐方案:
预估成本:¥200-500/月(10万query)
高并发,响应速度优先
推荐方案:
预估成本:¥100-300/月(10万query)
长文档,推理能力强
推荐方案:
预估成本:¥500-1000/月(5万query)
从文档加载到查询的完整流程,包含最佳实践和优化技巧
包含文档加载、分块、索引、检索、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]}...")
向量检索 + 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完整代码
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})")
解决方案:
解决方案:
解决方案:
解决方案:
| 优化项 | 推荐配置 | 提升 |
|---|---|---|
| 索引算法 | 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是企业AI应用的核心,但要构建完整的AI系统,还需要掌握相关技术
RAG提示词优化
学习如何优化RAG的检索提示词和生成提示词,让准确率再提升20%
让Agent自主调用RAG
学习如何将RAG集成到Agent系统中,实现自主知识库查询和推理
最强组合方案
微调提升模型理解能力,RAG提供最新知识,组合使用准确率可达95%+
完整技术体系
返回Agent层主页,查看提示词、RAG、Agent、微调四大技术的关系图
选择合适的开发框架能让RAG开发效率提升10倍!提供5种方案:代码开发、可视化平台、国产LLM、本地部署,满足不同需求
最适合RAG开发,API简洁,专注数据索引,代码量少30%
📦 包含内容:
最流行框架,功能全面,生态丰富,适合复杂应用和Agent集成
📦 包含内容:
从零理解原理,不依赖框架,手把手实现RAG核心逻辑
📦 包含内容:
零代码RAG,可视化拖拽,5分钟搭建,适合非技术人员
📦 包含内容:
国产LLM首选,95分能力+超低价,性价比极致
📦 包含内容:
完全私有化,数据不出本地,适合敏感数据场景
📦 包含内容:
| 特性 | LlamaIndex | LangChain | 纯Python |
|---|---|---|---|
| 代码量 | 80行 | 100行 | 60行 |
| 学习曲线 | ⭐⭐ 简单 | ⭐⭐⭐ 中等 | ⭐ 极简 |
| 向量数据库 | ✓ 10+ (内置) | ✓ 15+ (内置) | 需手动集成 |
| Embedding支持 | ✓ 20+ 模型 | ✓ 30+ 模型 | 需手动调用 |
| Rerank集成 | 简单 | 中等 | 复杂 |
| Agent支持 | ✓ 基础 | ✓ 强大 | ✗ 无 |
| 文档质量 | 优秀 | 优秀 | N/A |
| GitHub Stars | 37K+ | 80K+ | N/A |
| 最佳场景 | RAG专项 | 复杂应用 | 学习原理 |
不依赖任何框架,从零手写RAG系统,帮你深刻理解RAG工作原理
# 最小依赖安装 pip install openai numpy # 或使用国内源加速 pip install openai numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
只需要2个包:OpenAI(调用API)+ Numpy(向量计算)
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():基于文档生成回答问题:什么是RAG系统?
答案:RAG(检索增强生成)是一种结合信息检索和大语言模型的系统架构。它通过先检索相关文档, 再将文档作为上下文提供给LLM生成回答,可以有效解决知识时效性问题和减少幻觉。
最适合RAG开发的框架!API简洁,专注数据索引,30分钟从0搭建完整RAG系统
3分钟
5分钟
10分钟
12分钟
# ============ 步骤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?")
最流行的LLM框架!功能全面,生态丰富,45分钟掌握混合检索+Agent集成
# ============ 步骤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)
# 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"
)
| 方案 | 代码量 | 难度 | 时间 | 成本 | 最佳场景 |
|---|---|---|---|---|---|
| 🐍 纯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%数据不出本地
合规:满足安全审计