跳转至

第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

本章小结

本章要点:

  1. RAG检索增强
  2. 结合向量检索和LLM生成
  3. 解决LLM知识过时、幻觉等问题
  4. 文档分块策略影响效果

  5. 推荐系统

  6. 用户和物品都表示为向量
  7. 通过向量点积计算兴趣匹配度
  8. 实现个性化推荐

  9. 语义搜索

  10. 理解查询意图而非字面匹配
  11. 支持跨语言搜索
  12. 提升搜索体验

  13. 多模态检索

  14. 统一不同模态的向量空间
  15. 实现"以文搜图"等功能
  16. CLIP等模型是关键技术

  17. 其他应用

  18. 异常检测、金融风控
  19. AI Agent长期记忆

下一章预告第6章:学习路径与资源推荐 - 获取继续深入学习的资源和建议 →