RAG技术向量数据库知识库

RAG技术详解:让AI拥有知识库

2025-01-08·20 分钟·RAG技术

RAG技术详解:让AI拥有知识库

你有没有想过,如何让AI"记住"你公司的文档、产品信息或专业知识?答案就是 RAG(Retrieval-Augmented Generation,检索增强生成)

什么是RAG?

RAG是一种结合了信息检索文本生成的AI技术。简单来说:

  1. 检索(Retrieval):从知识库中找到相关信息
  2. 增强(Augmented):将找到的信息加入到问题中
  3. 生成(Generation):AI基于这些信息生成回答

为什么要使用RAG?

传统LLM的局限:

  • ❌ 知识截止日期有限
  • ❌ 无法访问私有数据
  • ❌ 可能产生"幻觉"(编造信息)

RAG的优势:

  • ✅ 实时更新的知识
  • ✅ 可以使用私有数据
  • ✅ 回答更加准确可靠
  • ✅ 可以追溯信息来源

RAG的工作原理

让我们通过一个实际例子来理解RAG:

场景:客户服务问答

问题:"你们公司的退货政策是什么?"

传统LLM:可能会给出通用或错误的回答

RAG系统

  1. 在公司知识库中搜索"退货政策"
  2. 找到相关政策文档
  3. 将政策内容提供给AI
  4. 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]}")

流行的向量数据库

  1. FAISS(Facebook AI Similarity Search)

    • 开源、高效
    • 适合中小规模数据
  2. Pinecone

    • 托管服务
    • 易于使用
  3. Chroma

    • 轻量级
    • 适合本地开发
  4. 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系统的方法
  • ✅ 实际应用案例

下一步

继续深入学习:

  1. Agent开发:让RAG系统更智能
  2. 多模态RAG:支持图片、视频
  3. RAG评估:建立评估体系
  4. 生产部署:性能优化和监控

RAG是AI应用的基石技术,掌握它,你就能构建更强大的AI系统! 🚀


参考资源: