RAG技术向量数据库知识库
RAG技术详解:让AI拥有知识库
2025-01-08·20 分钟·RAG技术
RAG技术详解:让AI拥有知识库
你有没有想过,如何让AI"记住"你公司的文档、产品信息或专业知识?答案就是 RAG(Retrieval-Augmented Generation,检索增强生成)!
什么是RAG?
RAG是一种结合了信息检索和文本生成的AI技术。简单来说:
- 检索(Retrieval):从知识库中找到相关信息
- 增强(Augmented):将找到的信息加入到问题中
- 生成(Generation):AI基于这些信息生成回答
为什么要使用RAG?
传统LLM的局限:
- ❌ 知识截止日期有限
- ❌ 无法访问私有数据
- ❌ 可能产生"幻觉"(编造信息)
RAG的优势:
- ✅ 实时更新的知识
- ✅ 可以使用私有数据
- ✅ 回答更加准确可靠
- ✅ 可以追溯信息来源
RAG的工作原理
让我们通过一个实际例子来理解RAG:
场景:客户服务问答
问题:"你们公司的退货政策是什么?"
传统LLM:可能会给出通用或错误的回答
RAG系统:
- 在公司知识库中搜索"退货政策"
- 找到相关政策文档
- 将政策内容提供给AI
- AI基于真实政策给出准确回答
RAG的技术架构
用户问题
↓
[向量化] → 将问题转为向量
↓
[向量检索] → 在向量数据库中搜索相似文档
↓
[文档检索] → 获取最相关的文档片段
↓
[提示构建] → 将问题+文档组合成提示
↓
[LLM生成] → AI基于文档内容生成回答
↓
最终答案
动手实现RAG系统
让我们一步步构建一个简单的RAG系统!
准备工作
安装必要的库:
pip install langchain langchain-openai langchain-community faiss-cpu tiktoken
步骤1:准备知识库
首先,我们需要一些文档作为知识库:
knowledge_base = [
"我们的退货政策是:购买后30天内可以无理由退货,商品需要保持原包装完好。",
"包邮政策:订单满99元免运费,否则收取10元运费。",
"客服时间:工作日9:00-18:00,周末10:00-17:00。",
"支付方式:支持微信支付、支付宝、银行卡支付。"
]
步骤2:文档切分
长文档需要切分成小块:
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=100, # 每块的大小
chunk_overlap=20, # 块之间的重叠
length_function=len,
)
texts = text_splitter.create_documents(knowledge_base)
步骤3:创建向量存储
使用OpenAI的Embedding模型:
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
embeddings = OpenAIEmbeddings()
# 创建向量数据库
vectorstore = FAISS.from_documents(texts, embeddings)
步骤4:创建检索器
retriever = vectorstore.as_retriever(
search_type="similarity",
search_kwargs={"k": 2} # 返回最相关的2个文档
)
步骤5:构建RAG链
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4")
# 定义提示模板
prompt = ChatPromptTemplate.from_template("""
基于以下文档内容回答问题。如果你不知道答案,就说不知道,不要编造。
文档内容:
{context}
问题:{input}
回答:
""")
# 创建链
document_chain = create_stuff_documents_chain(llm, prompt)
retrieval_chain = create_retrieval_chain(retriever, document_chain)
步骤6:测试RAG系统
question = "你们的退货政策是什么?"
response = retrieval_chain.invoke({"input": question})
print(f"问题:{question}")
print(f"回答:{response['answer']}")
print(f"来源文档:{response['context']}")
向量数据库详解
向量数据库是RAG的核心,让我们深入了解:
什么是向量?
向量就是数字列表,比如:
"猫" → [0.1, -0.3, 0.8, 0.2, ...]
"狗" → [0.2, -0.1, 0.7, 0.3, ...]
相似的词语会有相似的向量!
向量相似度
我们使用余弦相似度来衡量向量的相似性:
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
vec1 = np.array([0.1, 0.2, 0.3])
vec2 = np.array([0.1, 0.2, 0.3])
vec3 = np.array([-0.1, -0.2, -0.3])
print(f"相似度 (vec1, vec2): {cosine_similarity([vec1], [vec2])[0][0]}")
print(f"相似度 (vec1, vec3): {cosine_similarity([vec1], [vec3])[0][0]}")
流行的向量数据库
-
FAISS(Facebook AI Similarity Search)
- 开源、高效
- 适合中小规模数据
-
Pinecone
- 托管服务
- 易于使用
-
Chroma
- 轻量级
- 适合本地开发
-
Weaviate
- 开源
- 功能丰富
优化RAG系统
1. 改进文档切分
# 更智能的切分策略
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
separators=["\n\n", "\n", "。", "!", "?", " ", ""]
)
2. 混合检索
结合关键词检索和向量检索:
from langchain.retrievers import BM25Retriever, EnsembleRetriever
# 关键词检索
bm25_retriever = BM25Retriever.from_documents(texts)
bm25_retriever.k = 2
# 混合检索
ensemble_retriever = EnsembleRetriever(
retrievers=[bm25_retriever, vectorstore.as_retriever()],
weights=[0.5, 0.5]
)
3. 重排序(Reranking)
对检索结果重新排序:
from langchain_community.cross_encoders import HuggingFaceCrossEncoder
reranker = HuggingFaceCrossEncoder(model_name="BAAI/bge-reranker-base")
# 先检索更多文档
docs = vectorstore.similarity_search(query, k=10)
# 重新排序
reranked_docs = reranker.rank(query, docs, top_k=3)
实际应用案例
1. 客户服务助手
用户 → "产品如何保修?"
↓
RAG系统 → 检索保修政策文档
↓
LLM → 基于政策生成回答
↓
用户 → "收到,请问保修期是多长?"
2. 企业知识库
- 内部文档查询
- 技术支持助手
- HR政策问答
3. 教育辅助
- 课程内容问答
- 作业辅导
- 学习资料推荐
常见问题
Q: RAG会完全替代Fine-tuning吗?
A: 不会。RAG和Fine-tuning各有优势:
- RAG:适合需要最新知识、可追溯来源的场景
- Fine-tuning:适合需要特定风格、格式的场景
- 最佳实践:两者结合使用
Q: 如何评估RAG系统?
A: 关注以下指标:
- 检索准确率:检索到的文档是否相关
- 答案质量:生成的答案是否准确
- 响应速度:端到端的延迟
- 用户满意度:实际使用反馈
Q: RAG系统成本高吗?
A: 成本主要来自:
- Embedding API:按token计费
- LLM API:按模型和token计费
- 向量数据库:开源方案免费
优化建议:
- 使用缓存减少重复查询
- 选择合适的模型大小
- 定期清理无用数据
进阶主题
多模态RAG
不仅支持文本,还支持图片、音频等:
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
# 多模态Embedding
multimodal_embeddings = OpenAIEmbeddings(model="multimodal")
# 图像+文本检索
vectorstore = FAISS.from_texts_and_images(
texts=texts,
images=images,
embedding=multimodal_embeddings
)
Agent + RAG
让Agent能够主动检索知识:
from langchain.agents import initialize_agent, Tool
# 创建RAG工具
rag_tool = Tool(
name="知识库搜索",
func=lambda q: retrieval_chain.invoke({"input": q}),
description="搜索公司知识库获取信息"
)
# Agent可以决定何时使用RAG
agent = initialize_agent(
tools=[rag_tool],
llm=llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION
)
总结
恭喜你掌握了RAG技术!🎉
本文我们学习了:
- ✅ RAG是什么以及为什么需要它
- ✅ RAG的工作原理和架构
- ✅ 如何从零构建RAG系统
- ✅ 向量数据库的基础知识
- ✅ 优化RAG系统的方法
- ✅ 实际应用案例
下一步
继续深入学习:
- Agent开发:让RAG系统更智能
- 多模态RAG:支持图片、视频
- RAG评估:建立评估体系
- 生产部署:性能优化和监控
RAG是AI应用的基石技术,掌握它,你就能构建更强大的AI系统! 🚀
参考资源: