第5章:典型应用场景 - AI检索、推荐系统、语义搜索¶
5.1 应用场景概览¶
mindmap
root((向量数据库应用))
RAG检索增强
企业知识库
智能问答
文档摘要
推荐系统
电商推荐
内容推荐
音乐视频
语义搜索
搜索引擎
智能客服
代码搜索
多模态检索
以图搜图
视频理解
音视频检索
异常检测
金融风控
网络安全
质量控制
AI Agent
记忆存储
工具调用
上下文管理
5.2 RAG(检索增强生成)¶
什么是RAG¶
RAG(Retrieval-Augmented Generation,检索增强生成) 是一种结合了检索系统和大型语言模型的技术架构。它让AI能够"查阅"外部知识库,然后基于检索到的内容生成回答。
为什么需要RAG:
| 问题 | 说明 | RAG解决方案 |
|---|---|---|
| 知识过时 | LLM训练数据有截止日期 | 实时检索最新知识 |
| 幻觉 | LLM可能生成错误信息 | 基于真实文档回答 |
| 私有知识 | LLM不了解企业私有数据 | 检索企业知识库 |
| 可追溯性 | 无法验证回答的来源 | 提供引用来源 |
RAG系统架构¶
flowchart TD
subgraph 用户查询
Q["用户问题:
'公司年假政策是什么?'"]
end
subgraph 检索流程
Q -->|1| EQ["查询向量化"]
EQ -->|2| SN["向量数据库检索"]
SN -->|3| RD["返回相关文档"]
RD -->|4| CT["构建提示词"]
end
subgraph 生成流程
CT -->|5| LLM["大语言模型"]
LLM -->|6| A["生成回答"]
end
subgraph 知识库
SN -.->|"查询"| KB["文档集合"]
KB -->|"存储"| CH["分块存储"]
CH -->|"向量化"| KV["向量索引"]
end
style Q fill:#e1f5fe
style SN fill:#fff3e0
style LLM fill:#c8e6c9
style A fill:#c8e6c9
style KB fill:#ffccbc
RAG工作流程详解¶
# RAG系统实现示例
from sentence_transformers import SentenceTransformer
import vector_db # 假设的向量数据库客户端
# 1. 初始化组件
model = SentenceTransformer('all-MiniLM-L6-v2')
db = vector_db.Client("localhost:6333")
collection = db.get_collection("company_docs")
# 2. 用户查询
user_query = "公司年假政策是什么?"
# 3. 将查询向量化
query_embedding = model.encode(user_query)
# 4. 检索相关文档
results = collection.search(
vector=query_embedding,
top_k=5,
filter={"department": "HR"} # 可选过滤
)
# 5. 构建上下文
context = "\n\n".join([r.content for r in results])
# 6. 构建提示词
prompt = f"""基于以下信息回答用户问题。如果信息不足,请说明不知道。
上下文:
{context}
用户问题:{user_query}
回答:"""
# 7. 调用LLM生成回答
response = llm.generate(prompt)
print(response)
RAG查询流程时序图¶
sequenceDiagram
participant User as 用户
participant Embed as 嵌入模型
participant VDB as 向量数据库
participant LLM as 大语言模型
User->>Embed: 1. 发送查询文本
Embed-->>User: 2. 返回查询向量
User->>VDB: 3. 发送查询向量
VDB-->>User: 4. 返回Top-K相似文档
User->>LLM: 5. 发送文档+问题
LLM-->>User: 6. 返回生成的回答
文档分块策略¶
RAG的效果很大程度上取决于文档的分块方式:
# 常见的分块策略
# 1. 固定大小分块(最简单)
def chunk_by_size(text, chunk_size=500, overlap=50):
chunks = []
for i in range(0, len(text), chunk_size - overlap):
chunks.append(text[i:i + chunk_size])
return chunks
# 2. 按段落分块(保持语义完整)
def chunk_by_paragraph(text):
paragraphs = text.split('\n\n')
return [p for p in paragraphs if p.strip()]
# 3. 递归分块(更智能)
def chunk_recursively(text, delimiters=['\n\n', '\n', '。', '!']):
# 优先尝试大的分隔符,逐级细化
pass
| 分块策略 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 固定大小 | 简单可控 | 可能切断句子 | 通用场景 |
| 按段落 | 保持语义 | 块大小不一 | 结构化文档 |
| 递归分块 | 平衡好坏 | 实现复杂 | 最佳实践 |
5.3 推荐系统¶
推荐系统中的向量表示¶
在推荐系统中,用户和物品都可以表示为向量:
# 推荐系统向量表示
user_vector = model.encode("用户A的兴趣特征")
item_vector = model.encode("物品B的特征")
# 计算用户对物品的兴趣分数
score = np.dot(user_vector, item_vector) # 点积
top_items = find_top_k(score, k=10)
推荐系统架构¶
flowchart TD
subgraph 用户画像
U["用户A"] -->|行为数据| UH["用户向量
[0.8, 0.3, 0.7, ...]"]
end
subgraph 物品库
I1["商品1"] -->|特征| IV1["[0.9, 0.1, 0.6, ...]"]
I2["商品2"] -->|特征| IV2["[0.2, 0.8, 0.4, ...]"]
I3["商品3"] -->|特征| IV3["[0.7, 0.4, 0.9, ...]"]
end
subgraph 匹配引擎
UH -->|计算相似度| MATCH["向量点积"]
IV1 --> MATCH
IV2 --> MATCH
IV3 --> MATCH
MATCH -->|排序| TOP["Top-K推荐"]
end
style UH fill:#e1f5fe
style MATCH fill:#fff3e0
style TOP fill:#c8e6c9
推荐系统代码示例¶
# 电影推荐系统示例
from sentence_transformers import SentenceTransformer
import numpy as np
model = SentenceTransformer('all-MiniLM-L6-v2')
# 电影数据库
movies = [
{"id": 1, "title": "星际穿越", "genre": "科幻"},
{"id": 2, "title": "泰坦尼克号", "genre": "爱情"},
{"id": 3, "title": "盗梦空间", "genre": "科幻"},
{"id": 4, "title": "阿甘正传", "genre": "剧情"},
]
# 构建电影向量
movie_vectors = model.encode([m["title"] for m in movies])
# 用户偏好
user_liked = "科幻电影 太空 时间旅行"
user_vector = model.encode(user_liked)
# 计算相似度
similarities = np.dot(user_vector, movie_vectors.T)
# 排序并返回推荐
top_indices = np.argsort(similarities)[::-1][:2]
recommendations = [movies[i]["title"] for i in top_indices]
print(f"推荐电影: {recommendations}")
# 输出: ['星际穿越', '盗梦空间']
5.4 语义搜索¶
语义搜索 vs 关键词搜索¶
graph LR
subgraph 关键词搜索
KQ["查询:'苹果'"] --> KM["匹配包含'苹果'的文档"]
KM --> KR["'苹果手机降价'
'苹果派做法'
'烟台苹果批发'"]
end
subgraph 语义搜索
SQ["查询:'苹果'"] --> SE["理解查询意图:水果?公司?"]
SE --> SR["'苹果手机'
'Apple公司'
'红富士苹果'"]
end
style KQ fill:#ffccbc
style SQ fill:#c8e6c9
style KR fill:#ffccbc
style SR fill:#c8e6c9
语义搜索示例¶
# 语义搜索代码示例
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
# 文档语料库
documents = [
"人工智能将改变我们的生活方式",
"机器学习是AI的一个重要分支",
"今天天气真好,适合外出游玩",
"深度学习在图像识别领域取得突破",
"最新的iPhone手机采用了A17芯片",
]
# 向量化文档
doc_vectors = model.encode(documents)
# 语义搜索查询
query = "什么是深度学习?"
query_vector = model.encode(query)
# 计算相似度
from sklearn.metrics.pairwise import cosine_similarity
similarities = cosine_similarity([query_vector], doc_vectors)[0]
# 返回最相关的文档
top_idx = np.argsort(similarities)[::-1][0]
print(f"最相关文档: {documents[top_idx]}")
# 输出: '深度学习在图像识别领域取得突破'
多语言搜索¶
# 跨语言语义搜索
query_vector = model.encode("How to cook pasta?") # 英文查询
# 中文文档也能被检索到
chinese_docs = [
"如何做意大利面",
"北京天气怎么样",
"学习Python编程",
]
doc_vectors = model.encode(chinese_docs)
# 通过多语言模型,语义相近的内容会返回高相似度
5.5 多模态检索¶
什么是多模态检索¶
多模态检索能够同时处理和关联不同类型的数据(文本、图片、音频、视频),实现"以文搜图"、"以图搜图"等功能。
graph TD
subgraph 输入
T1["文本:'一只橘色的猫'"]
I1["图片:猫咪照片"]
A1["音频:猫叫声"]
end
subgraph 向量空间
T2["文本向量"]
I2["图片向量"]
A2["音频向量"]
end
subgraph 跨模态检索
T1 -->|CLIP编码| T2
I1 -->|CLIP编码| I2
A1 -->|CLIP编码| A2
T2 -.->|"相似度"| I2
T2 -.->|"相似度"| A2
end
style T2 fill:#e1f5fe
style I2 fill:#fff3e0
style A2 fill:#c8e6c9
多模态检索代码示例¶
# 以图搜图示例
import clip
import torch
from PIL import Image
# 加载CLIP模型
model, preprocess = clip.load("ViT-B/32", device="cpu")
# 图片数据库向量化
def encode_image(img_path):
image = preprocess(Image.open(img_path)).unsqueeze(0)
with torch.no_grad():
image_features = model.encode_image(image)
return image_features.numpy()
# 图片集合
image_paths = ["cat1.jpg", "cat2.jpg", "dog.jpg"]
image_vectors = [encode_image(p) for p in image_paths]
# 查询图片
query_image = preprocess(Image.open("query_cat.jpg")).unsqueeze(0)
query_vector = model.encode_image(query_image).numpy()
# 找出最相似的图片
similarities = cosine_similarity(query_vector, np.array(image_vectors))
most_similar_idx = np.argmax(similarities)
print(f"最相似的图片: {image_paths[most_similar_idx]}")
5.6 异常检测¶
向量数据库在异常检测中的应用¶
flowchart TD
subgraph 正常模式学习
D1["正常数据样本"] -->|聚类| C1["正常模式中心"]
D1 -->|向量表示| V1["正常向量空间"]
end
subgraph 异常检测
N["新数据"] -->|向量化| NV
NV -->|计算距离| DIST["到正常中心的距离"]
DIST -->|判断| RESULT{距离 > 阈值?}
RESULT -->|是| ANOMALY["异常"]
RESULT -->|否| NORMAL["正常"]
end
style C1 fill:#c8e6c9
style ANOMALY fill:#ffccbc
style NORMAL fill:#c8e6c9
异常检测代码示例¶
# 金融欺诈检测示例
from sklearn.cluster import KMeans
import numpy as np
# 正常交易特征向量
normal_transactions = np.random.rand(1000, 20) # 1000笔正常交易,20维特征
# 学习正常模式
kmeans = KMeans(n_clusters=10, random_state=42)
kmeans.fit(normal_transactions)
# 检测新交易
new_transaction = np.random.rand(1, 20)
# 计算到最近正常中心的距离
distance = np.min(np.linalg.norm(
new_transaction - kmeans.cluster_centers_,
axis=1
))
# 判断是否异常
threshold = 2.5
is_fraud = distance > threshold
print(f"交易异常: {is_fraud}, 距离: {distance:.2f}")
5.7 AI Agent记忆存储¶
Agent系统架构¶
flowchart LR
subgraph Agent核心
P["规划 Planning"]
M["记忆 Memory"]
A["行动 Action"]
end
subgraph 记忆类型
M -->|短期| STM["短期记忆
当前对话上下文"]
M -->|长期| LTM["长期记忆
向量数据库存储"]
end
subgraph 检索流程
Q["当前任务"] -->|查询| VDB["向量数据库"]
VDB -->|返回相关记忆| A
end
style M fill:#e1f5fe
style VDB fill:#fff3e0
style P fill:#c8e6c9
style A fill:#c8e6c9
Agent记忆系统代码示例¶
# AI Agent记忆系统
class AgentMemory:
def __init__(self, vector_db, embed_model):
self.db = vector_db
self.embed = embed_model
def add_memory(self, content, memory_type="experience"):
"""添加记忆"""
vector = self.embed.encode(content)
self.db.insert({
"vector": vector,
"content": content,
"type": memory_type
})
def retrieve(self, query, top_k=5):
"""检索相关记忆"""
query_vector = self.embed.encode(query)
results = self.db.search(query_vector, top_k=top_k)
return [r["content"] for r in results]
def reflect(self, recent_experiences):
"""反思总结:将短期经验转化为长期记忆"""
summary = self.llm.summarize(recent_experiences)
self.add_memory(summary, memory_type="reflection")
# 使用示例
agent = AgentMemory(vector_db, embed_model)
# Agent与环境交互
while not task_complete:
# 1. 检索相关记忆
relevant_memories = agent.retrieve(f"当前任务: {task}")
context = "\n".join(relevant_memories)
# 2. 基于记忆决策
action = agent.decide(context, task)
# 3. 执行并记录
result = agent.execute(action)
agent.add_memory(f"执行{action},结果:{result}")
5.8 应用场景对比总结¶
| 应用场景 | 核心价值 | 向量数据库作用 | 典型产品 |
|---|---|---|---|
| RAG | 解决LLM知识不足 | 存储和检索文档 | ChatGPT+PDF |
| 推荐系统 | 个性化推荐 | 用户-物品匹配 | TikTok、抖音 |
| 语义搜索 | 理解意图而非字面 | 语义相似性检索 | Elasticsearch |
| 多模态检索 | 打破模态壁垒 | 统一向量空间 | Google Images |
| 异常检测 | 发现异常行为 | 模式偏离检测 | 金融风控 |
| AI Agent | 持久化记忆 | 长期记忆存储 | AutoGPT |
本章小结¶
本章要点:
- RAG检索增强:
- 结合向量检索和LLM生成
- 解决LLM知识过时、幻觉等问题
-
文档分块策略影响效果
-
推荐系统:
- 用户和物品都表示为向量
- 通过向量点积计算兴趣匹配度
-
实现个性化推荐
-
语义搜索:
- 理解查询意图而非字面匹配
- 支持跨语言搜索
-
提升搜索体验
-
多模态检索:
- 统一不同模态的向量空间
- 实现"以文搜图"等功能
-
CLIP等模型是关键技术
-
其他应用:
- 异常检测、金融风控
- AI Agent长期记忆
下一章预告:第6章:学习路径与资源推荐 - 获取继续深入学习的资源和建议 →