Semantic Search

核心概念

语义搜索是一种搜索引擎技术,通过理解查询意图和上下文来返回结果,而非简单匹配字面词汇。

解决的问题

痛点 旧方案(关键词搜索) 新方案(语义搜索)
用户不知道精确词汇 同义词扩展 直接用自然语言描述
一词多义 无法区分 理解上下文区分含义
意图不明确 返回字面匹配 推断用户意图
概念相关但不匹配 搜不到 匹配相关概念

工作原理

核心流程

用户查询 → Embedding 编码 → 向量表示 → kNN 最近邻匹配 → 语义排序 → 返回结果

三步详解

  1. Query Encoding:用户查询被转换为向量(Embedding)
  2. Vector Matching:kNN 算法在向量数据库中寻找最相似的文档向量
  3. Semantic Ranking:根据语义相关性对结果排序返回

上下文理解

语义搜索考虑多种上下文:

  • 地理上下文:“football” 在美国指 soccer,在英国指橄榄球
  • 文本上下文:词语在句子中的位置和搭配
  • 历史上下文:用户的搜索历史

意图识别

意图类型 用户目标 语义搜索响应
信息型 了解某个主题 返回权威解释
交易型 购买产品 返回购买链接
导航型 找到特定网站 返回目标网站
商业型 产品对比 返回对比内容

代表模型/工具

名称 特点 适用场景
Elasticsearch + ELSER Elastic 官方 NLP 模型,零样本 企业搜索
OpenAI Embeddings + FAISS 高质量 Embedding + 快速搜索 通用 RAG
ChromaDB 轻量级向量数据库 原型/小规模
Pinecone 云原生向量数据库 生产环境

优缺点对比

优势 局限
理解用户意图 计算成本高于关键词搜索
自然语言查询 需要足够的向量数据库
概念匹配能力强 结果可解释性较弱
支持多语言 对低资源语言效果较差

关键术语

  • Semantic Search (语义搜索):通过理解单词和短语的含义来返回搜索结果,而非字面匹配
  • kNN (k-Nearest Neighbors, k-最近邻算法):通过计算向量距离找到最相似的 k 个结果
  • Vector Search (向量搜索):在多维空间中基于向量相似度进行搜索
  • Intent (意图):用户搜索背后的真实目的(信息型、交易型、导航型、商业型)
  • Context (上下文):影响搜索含义的额外信息(地理位置、搜索历史、文本上下文)
  • ELSER (Elastic Learned Sparse EncodeR):Elastic 的语义搜索模型,零样本训练
  • Query Encoding (查询编码):将用户查询转换为向量表示的过程

知识关联

纵向关联:从基础到应用的层次关系

Embedding 向量化
      ↓
向量数据库
      ↓
语义搜索 ← → RAG 检索增强生成

横向关联:同层次技术的对比

技术 特点 适用场景
关键词搜索 字面匹配,同义词扩展 精确词汇查询
语义搜索 概念匹配,意图理解 自然语言查询
向量搜索 相似度计算,高维空间 近似匹配,推荐系统

实际应用场景

  1. 电商搜索:用户输入"巧克力味道的牛奶"而不是"chocolate milk",语义搜索能理解意图返回正确产品
  2. 智能问答:用户用自然语言提问,语义搜索找到最相关的文档片段
  3. 推荐系统:通过用户历史行为和当前查询的语义匹配,推荐相关内容

典型案例:chocolate milk vs milk chocolate

这是一个经典的语义搜索例子:

  • “chocolate milk”(巧克力牛奶):牛奶加巧克力调味
  • “milk chocolate”(牛奶巧克力):巧克力的一种,含牛奶成分

虽然词汇完全相同,但顺序不同导致含义完全不同。语义搜索通过理解词语之间的关系和上下文,能够准确区分这两种意思并返回正确结果。


📚 相关资源

  • [[wiki/sources/elastic-semantic-search]] — 本文来源:Elastic 官方语义搜索指南
  • [[wiki/concepts/Embedding向量化]] — 语义搜索的核心技术基础
  • [[wiki/concepts/向量数据库]] — 存储和检索向量的数据库系统
  • [[wiki/sources/cloudflare-embeddings]] — Embedding 入门:向量、向量化、相似度搜索

Data Classification 数据分类

核心概念

数据分类(Data Classification)是根据数据的敏感度、重要性和预定义标准对数据进行组织和分类的过程,使组织能够有效地保护和管理数据资产。

解决的问题

痛点 旧方案 新方案(数据分类)
敏感数据无法识别 统一保护,成本高效果差 按敏感度分级保护
合规要求不明确 事后补救,面临罚款 事前识别,主动合规
资源分配不合理 平均分配资源 优先保护高敏感数据
数据访问控制模糊 粗粒度权限管理 细粒度基于分类的访问控制

工作原理

核心流程

定义分类标准 → 识别数据资产 → 分配分类级别 → 应用安全控制 → 持续监控

步骤详解

  1. 定义分类模式:确定分类类别(Public、Internal、Restricted、Confidential)和标准
  2. 识别数据资产:识别结构化和非结构化数据,使用自动化工具扫描
  3. 分配分类级别:基于内容、元数据或属性匹配到预定义类别
  4. 应用安全控制:加密、基于角色的访问控制、数据保留策略
  5. 持续监控:自动化监控云环境中的数据资产,定期审核

分类级别

级别 敏感度 保护要求 示例
Public(公开) 最低或无需保护 公司新闻稿、营销材料
Internal Use(内部使用) 基本保护 员工工资信息、内部备忘录
Restricted(受限制) 中高 中等保护 客户信息、营销计划
Confidential(机密) 极高 最严格保护 商业机密、PII、财务数据
Archived(归档) 取决于原级别 按原级别保留 旧财务报告、人事记录

敏感数据类型

PII(个人身份信息)

数据类型 说明
姓名 自然人姓名
社会安全号 (SSN) 身份证号
地址 居住地址
电话号码 联系方式
邮箱 电子邮箱
金融账户 银行账户信息
生物特征 指纹、面部识别等

PHI(受保护健康信息)

数据类型 说明
医疗记录 诊断记录、病历
诊断结果 检查结果、检验报告
处方信息 药物处方
健康保险信息 保险信息

法规要求:受 HIPAA(美国健康保险便携性和责任法案)监管

PCI(支付卡行业数据)

标准:PCI DSS(支付卡行业数据安全标准)
适用:处理、存储或传输持卡人数据的商家、金融机构和服务提供商

对数据安全的提升

1. 风险评估

通过分类识别最关键资产,优先保护高敏感数据类别

2. 访问控制

机密数据 → 仅少数授权人员可访问
内部数据 → 部门内共享
公开数据 → 所有员工可访问

3. 数据加密

数据级别 加密要求
机密 静态加密 + 传输加密
受限制 静态加密
内部使用 可选加密
公开 无需加密

4. 备份和恢复

数据级别 备份频率 存储位置
机密 每日 安全异地存储
受限制 每周 异地存储
内部使用 每月 本地或异地
公开 按需 标准存储

5. 合规性

数据分类是满足以下法规要求的第一步:

  • GDPR:欧盟通用数据保护条例
  • HIPAA:美国健康保险便携性和责任法案
  • PCI DSS:支付卡行业数据安全标准

关键术语

  • PII (Personally Identifiable Information, 个人身份信息):可用于识别个人的任何数据
  • PHI (Protected Health Information, 受保护健康信息):与个人健康状况相关的敏感信息
  • PCI DSS (Payment Card Industry Data Security Standard, 支付卡行业数据安全标准):保护持卡人数据的全球安全标准
  • GDPR (General Data Protection Regulation, 通用数据保护条例):欧盟数据隐私法规
  • HIPAA (Health Insurance Portability and Accountability Act, 健康保险便携性和责任法案):美国医疗信息隐私法规
  • DSPM (Data Security Posture Management, 数据安全态势管理):自动化分类和监控云环境中数据资产的解决方案

知识关联

纵向关联:从基础到应用的层次关系

数据分类
      ↓
数据安全 ← → 合规管理
      ↓
访问控制 + 加密 + 备份

横向关联:同层次技术的对比

技术 特点 适用场景
数据分类 按敏感度分级 数据资产管理
访问控制 基于角色的权限 系统安全
数据加密 保护数据本身 传输和存储安全

📚 相关资源

  • [[wiki/sources/paloaltonetworks-data-classification]] — 本文来源:Palo Alto Networks 官方数据分类指南

Recommendation Engines 推荐引擎

核心概念

推荐引擎(Recommendation Engine)是一种人工智能系统,通过大数据分析和机器学习算法分析用户行为模式,向用户推荐他们可能感兴趣的内容、产品或服务。

解决的问题

痛点 旧方案 新方案(推荐引擎)
信息过载 用户自己搜索浏览 智能推送个性化内容
长尾产品难以曝光 只有热门产品被看到 推荐带动长尾销售
用户发现成本高 用户主动搜索才能找到 AI 帮助发现新选项
转化率低 随机浏览碰运气 个性化推荐引导购买

工作原理

5 阶段流程

数据收集 → 存储 → 分析 → 过滤 → 精调
阶段 说明 关键点
数据收集 收集用户行为数据 明确数据(评论/点赞/评分)+ 隐式数据(浏览/点击/购买)
存储 保存收集的数据 数据仓库、数据湖或数据湖仓一体化
分析 使用 ML 算法处理数据 检测模式、识别相关性、评估强度
过滤 应用数学规则过滤数据 根据推荐引擎类型应用不同过滤算法
精调 评估和优化模型 定期评估输出,持续提升准确性和质量

数据类型详解

明确数据(Explicit Data)

用户主动提供的数据:

  • 评分(1-5 星)
  • 评论
  • 点赞/踩
  • 收藏
隐式数据(Implicit Data)

从用户行为推断的数据:

  • 浏览历史
  • 点击数据
  • 购买历史
  • 搜索历史
  • 购物车事件
  • 停留时间
辅助数据
  • 人口统计:年龄、性别、地理位置
  • 心理统计:兴趣、生活方式
  • 项目特征:价格范围、产品类型、品牌

推荐引擎三大类型

类型对比总览

类型 原理 代表案例 冷启动问题
协同过滤 基于相似用户推荐 Amazon、Spotify 严重
内容过滤 基于项目特征推荐 “看了这个,你可能也喜欢” 轻微
混合过滤 结合两者优点 Netflix 可缓解

1. 协同过滤(Collaborative Filtering)

核心思想:找到与目标用户相似的用户群体,推荐这些相似用户喜欢但目标用户还没看过的项目。

用户 A 的行为 → 找到与 A 相似的用户 B → 推荐 B 喜欢但 A 还没看过的项目
基于内存的协同过滤

用户-based 过滤

  1. 计算目标用户与其他所有用户的相似度(余弦相似度/皮尔逊相关系数)
  2. 找到最相似的 k 个用户
  3. 根据这 k 个用户的评分预测目标用户的评分

项目-based 过滤

  1. 通过用户行为计算项目之间的相似度
  2. 不是基于项目特征,而是基于用户如何与项目交互
  3. 适合用户数量远大于项目数量时

问题:矩阵稀疏性

  • 大多数用户-项目矩阵非常稀疏(大多数评分为空)
  • 导致难以找到高质量的相似用户或项目
基于模型的协同过滤

通过机器学习训练预测模型:

  • 矩阵分解:SVD、SVD++、NMF
  • 深度学习:神经网络学习复杂交互模式
  • 聚类:K-means 聚类相似用户
  • 贝叶斯分类器:概率模型预测
冷启动问题
问题场景 解决方案
新用户注册 引导填写偏好问卷
新产品上架 用特征匹配现有用户
用户数据不足 popularity-based 推荐热门

2. 内容过滤(Content-Based Filtering)

核心思想:基于项目本身的特征进行推荐,假设用户喜欢某个项目,就会喜欢与该项目特征相似的其他项目。

向量空间模型
项目向量 = [特征1权重, 特征2权重, 特征3权重, ...]
用户向量 = [偏好特征1, 偏好特征2, 偏好特征3, ...]

相似度 = cos(用户向量, 项目向量)
推荐流程
  1. 收集用户历史行为:用户看过的/喜欢的项目
  2. 提取项目特征:从历史项目中提取特征(类型、颜色、价格、品牌…)
  3. 构建用户画像:根据特征构建用户向量
  4. 计算相似度:候选项目与用户画像的余弦相似度
  5. 排序推荐:按相似度排序返回 Top-K 推荐
局限性
  • 洞察有限:只能推荐与正在查看/购买的产品相似的内容
  • 无法跨类别推荐:如果用户只看科幻电影,系统永远不会推荐纪录片
  • 新用户数据不足:需要积累一定的历史行为

3. 混合过滤(Hybrid)

结合协同过滤和内容过滤,Netflix 是典型案例。

混合推荐 = 协同过滤 + 内容过滤
         │              │
         ▼              ▼
    发现用户潜在兴趣   提供稳定推荐基础

混合策略

  1. 加权混合:两种算法的结果加权求和
  2. 切换混合:根据情况切换使用不同算法
  3. 级联混合:先用一种筛选候选,再用另一种排序

典型应用场景

1. 电商零售

Amazon 案例

  • 35% 的销售额来自产品推荐
  • “买了这个的人也买了…”
  • “浏览了这个,你也可能喜欢…”

应用方式

推荐类型 说明 目的
配套推荐 推荐配件/套装 提升客单价
交叉销售 推荐搭配产品 增加订单
长尾推荐 推荐冷门产品 库存优化

2. 媒体娱乐

Netflix 案例

  • 80% 观看的电影来自推荐
  • 2021 年收入增加 10 亿美元

Spotify 音乐推荐

  • 基于播放历史和相似用户
  • “Discover Weekly” 个性化播放列表

3. 旅行酒店

基于用户预算和历史推荐:

  • 酒店和住宿选项
  • 餐厅和活动
  • 行程规划

4. AIOps

推荐解决方案帮助 IT 运维团队:

  • 快速响应技术问题
  • 自动化故障排查

关键指标

指标 说明 行业标杆
点击率 (CTR) 推荐被点击的比例 -
转化率 推荐带来购买的比例 10%-15% 提升
平均订单价值 每笔订单的金额 显著提升
用户留存率 回头客比例 20% 提升
推荐覆盖率 能被推荐的项目比例 -

优缺点总结

优势 局限
个性化体验,76% 用户期待个性化 需要大量用户数据
发现新内容,用户可能从未主动搜索 计算资源投入大
提升转化和收入(推荐占电商收入 31%) 实时性要求高(毫秒级响应)
长尾产品曝光,优化库存 隐私合规挑战(GDPR 等)
推荐多样性,可发现意外惊喜 冷启动问题(新用户/新产品)

关键术语

  • Collaborative Filtering (协同过滤):基于相似用户行为进行推荐
  • Content-Based Filtering (内容过滤):基于项目特征进行推荐
  • Cold Start (冷启动):新用户或新产品缺乏历史数据的问题
  • Matrix Factorization (矩阵分解):降维技术,将大矩阵分解为用户矩阵和项目矩阵
  • Hybrid Recommender (混合推荐):结合多种过滤方法的推荐系统
  • kNN (k-最近邻):找最近相似用户的算法
  • Explicit Data (明确数据):用户主动提供的评分/评论
  • Implicit Data (隐式数据):从用户行为推断的浏览/购买历史
  • User-Item Matrix (用户-项目矩阵):存储用户对项目评分的矩阵
  • Sparsity (稀疏性):矩阵中大部分元素为空的问题
  • Cosine Similarity (余弦相似度):衡量向量方向相似程度
  • Feature Vector (特征向量):表示项目特征的向量
  • User Profile (用户画像):表示用户偏好的向量
  • TF-IDF (词频-逆文档频率):文本特征提取方法

知识关联

纵向关联:从基础到应用的层次关系

Embedding 向量化(底层基础)
      ↓
推荐引擎(上层应用)
      │
 ┌────┼────┐
 ▼    ▼    ▼
协同  内容  混合
过滤  过滤  推荐
      │
      ↓
 电商/媒体/旅行/运维

横向关联:同层次技术的对比

技术 数据依赖 冷启动 推荐多样性 特征工程
协同过滤 用户行为数据 严重 不需要
内容过滤 项目特征数据 轻微 受限 需要
混合推荐 两者都需要 可缓解 需要

协同过滤 vs 内容过滤 详细对比

对比维度 协同过滤 内容过滤
推荐依据 相似用户的行为 项目本身的特征
需要的数据 用户-项目交互数据 项目特征/元数据
冷启动问题 严重(新用户/新项目) 轻微(新用户可以,新项目难)
推荐多样性 受限于历史偏好
需要特征工程 不需要 需要
可解释性
新项目曝光
计算成本

典型案例数据

公司 应用 效果数据
Netflix 电影推荐 80% 观看内容来自推荐,2021 年增加收入 10 亿美元
Amazon 产品推荐 35% 销售额来自推荐
Spotify 音乐推荐 Discover Weekly 个性化播放
Algolia AI 推荐 订单率+150%,转化率+13%,跳出率-24%

📚 相关资源

  • [[wiki/sources/algolia-recommendation-engine]] — 推荐引擎定义、5阶段原理、三大类型、优劣势
  • [[wiki/sources/algolia-ai-recommendation-systems]] — AI 如何增强推荐、协同/内容/混合过滤详解
  • [[wiki/concepts/Collaborative-Filtering协同过滤]] — 协同过滤详解:用户-项目矩阵、KNN、矩阵分解
  • [[wiki/concepts/Content-Based-Filtering内容过滤]] — 内容过滤详解:向量空间、特征提取、余弦相似度

Anomaly Detection

Anomaly Detection 异常检测

核心概念

异常检测(Anomaly Detection)是识别数据中不符合预期模式或行为的异常点的技术。这些异常点通常被称为 outliers、anomalies 或 novelties。

解决的问题

痛点 旧方案 新方案(异常检测)
人工检查效率低 100% 人工审核 自动识别异常
海量数据难以处理 抽样检查 全量分析
异常定义模糊 依赖主观判断 基于数据模式
实时性要求 事后分析 实时检测

异常类型

类型 说明 示例
点异常 (Point Anomaly) 单个数据点异常 温度突然升高
上下文异常 (Contextual Anomaly) 在特定上下文中才异常 冬天的温度升高
集体异常 (Collective Anomaly) 整体序列异常 连续的心跳停止

LLM 在异常检测中的应用

7 大应用模式概览

模式 LLM 角色 解决的问题 典型案例
1. 直接异常检测 分析器 简化检测流程 LogPrompt、SIGLLM
2. 数据增强 生成器 异常样本不足 NVIDIA Morpheus
3. 异常解释 解释器 理解为什么异常 GPT-4/LLaMA3
4. 表示学习 特征变换器 提取语义特征 Databricks
5. 智能模型选择 推荐引擎 模型选择困难 pyOD 2
6. 多智能体系统 协作者 端到端自动化 Argos
7. LLM 系统监控 监控器 MAS 行为异常 SentinelAgent

模式详解

1. 直接异常检测

核心思想:直接用 LLM 作为异常检测器,不需要传统 ML 模型。

原始数据 → 转换为文本 → LLM 分析 → 异常判断 + 解释

案例

案例 数据类型 LLM 方法
LogPrompt 系统日志 LLM CoT + Few-shot
SIGLLM 时间序列 LLM 转换 + 预测/直接判断

SIGLLM 时间序列处理流程

时间序列 → 缩放 → 量化 → 滚动窗口 → 分词 → LLM

优点

  • 简单直接,适合入门
  • 对文本数据效果好
  • 可生成解释

局限

  • 隐含假设 LLM 知识足够(niche 领域效果差)
  • 数据转换可能丢失信息
  • 计算成本高

2. 数据增强

核心思想:用 LLM 生成合成异常样本,解决冷启动问题。

真实数据不足 → LLM 生成异常样本 → 平衡数据集 → 监督学习

案例:NVIDIA Morpheus

  • 在网络安全日志上训练 GPT-2
  • 生成合成日志用于训练
  • 目的:减少误报

优点

  • 可控生成(指定特征)
  • 针对盲点生成
  • 成本效益高

挑战

  • 如何保证生成数据的真实性?
  • 如何保证多样性和代表性?
  • 如何验证质量?

3. 异常解释

核心思想:不仅判断异常,还解释"为什么"。

检测到异常 → LLM 分析 → 自然语言解释

案例:GPT-4/LLaMA3 对时间序列异常的解释

“There are anomalies in indices 17, 18, and 19 — Here, the values unexpectedly plateau at 4, which does not align with the previous cycles observed…”

质量差异

  • 点异常:解释质量高
  • 上下文/形状异常:解释质量较低

注意:警惕幻觉问题!


4. 基于 LLM 的表示学习

核心思想:LLM 作为特征提取器,将数据转换为语义向量。

原始数据 → LLM Embedding → 语义向量 → 传统算法检测

案例:Databricks 欺诈检测

购买数据 → Gemini Embedding → PCA/聚类 → 异常分数 → 阈值判断

优点

  • 捕获深层语义
  • 保留上下文信息
  • 可结合传统算法

局限

  • Embedding 高维不透明,难以解释根因
  • 高度依赖 LLM 预训练知识
  • 计算成本高(实时性挑战)

5. 智能检测模型选择

核心思想:让 LLM 充当"AI 评委",自动推荐最佳算法。

案例:pyOD 2

步骤 说明
Model Profiling 分析算法论文/源码,提取优缺点元数据
Dataset Profiling 计算数据统计特征,转为符号标签
Intelligent Selection 符号匹配 + LLM 推理,选择最优模型

优点

  • 透明可解释
  • 适合非专家
  • 可整合团队最佳实践

注意

  • 警惕幻觉
  • 需要 RAG 保持知识更新

6. 多智能体系统

核心思想:多个专业 Agent 协作,实现端到端异常检测。

案例:Argos 三 Agent 管道

检测 Agent → 生成 Python 检测规则
     ↓
修复 Agent → 执行 + 修正语法错误
     ↓
审查 Agent → 评估准确性 + 反馈改进
     ↓
循环迭代直到满足要求

特点

  • Agent 之间迭代协作
  • LLM 规则 + 传统检测器融合
  • 可解释的检测规则

挑战

  • 设计/实现/维护复杂
  • 级联错误风险
  • 成本和延迟高

7. LLM 系统监控(反向应用)

核心思想:用异常检测监控 LLM Agent 系统本身。

案例:SentinelAgent

问题 解决方案
如何提取特征? 将 Agent 交互建模为执行图
如何检测异常? 规则分类 + LLM 语义推理

检测内容

  • Prompt 注入传播
  • 未授权工具使用
  • 多 Agent 串通攻击

挑战

  • 监控 LLM 的显著成本问题
  • 监控系统本身可能被攻击
  • 攻击者可能让监控系统失效

解决方向

  • 标准化遥测格式
  • 开发数值特征工程方法
  • 使用传统异常检测算法

工作流全景

异常检测工作流:
特征工程 → 异常检测 → 异常解释
     ↑            ↑            ↑
     │            │            │
  LLM 表示学习  直接检测    LLM 解释
     │            │            │
  模式 #4      模式 #1     模式 #3

辅助环节:
- 数据增强(模式 #2)
- 模型选择(模式 #5)
- 多智能体协作(模式 #6)
- 系统监控(模式 #7)

Embedding + 异常检测实战(Gemini API 教程)

核心流程

文本数据 → Gemini Embedding (768D) → t-SNE 降维 (2D) → 质心距离 → 异常判断

技术要点

1. Embedding 模型

Gemini embedding-001 支持多种任务类型:

任务类型 说明
RETRIEVAL_QUERY 查询文本
RETRIEVAL_DOCUMENT 文档文本
SEMANTIC_SIMILARITY 语义相似度
CLASSIFICATION 分类
CLUSTERING 聚类(本教程使用)

2. 数据集

20 Newsgroups 数据集:18,000 篇新闻组帖子,涵盖 20 个主题

本教程选取的科学类别:

  • sci.crypt(密码学)
  • sci.electronics(电子学)
  • sci.med(医学)
  • sci.space(太空)

3. 核心算法

t-SNE(t-Distributed Stochastic Neighbor Embedding)

将高维数据(768维)降至 2D 可视化,保持簇结构。

参数 说明
n_components 2 输出维度
n_iter 1000 迭代次数
random_state 0 保证可复现
质心距离法
import numpy as np

# 计算欧几里得距离
def calculate_euclidean_distance(p1, p2):
    return np.sqrt(np.sum(np.square(p1 - p2)))

# 检测异常:距离质心超过阈值则为异常
def detect_outlier(df, emb_centroids, radius):
    for idx, row in df.iterrows():
        class_name = row['Class Name']
        dist = calculate_euclidean_distance(
            row['Embeddings'],
            emb_centroids[class_name]
        )
        df.at[idx, 'Outlier'] = dist > radius
    return len(df[df['Outlier'] == True])

4. 完整流程代码

# Step 1: 导入库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import google.generativeai as genai
from sklearn.datasets import fetch_20newsgroups
from sklearn.manifold import TSNE
from tqdm.auto import tqdm

# Step 2: 配置 API
API_KEY = userdata.get('API_KEY')
genai.configure(api_key=API_KEY)

# Step 3: 加载数据
newsgroups_train = fetch_20newsgroups(subset='train')
df_train = pd.DataFrame(newsgroups_train.data, columns=['Text'])
df_train['Label'] = newsgroups_train.target
df_train['Class Name'] = df_train['Label'].map(newsgroups_train.target_names.__getitem__)

# 采样 + 筛选科学类别
SAMPLE_SIZE = 150
df_train = df_train.groupby('Label', as_index=False).apply(lambda x: x.sample(SAMPLE_SIZE))
df_train = df_train[df_train['Class Name'].str.contains('sci')]
df_train = df_train.reset_index()

# Step 4: 数据预处理
def preprocess_text(data):
    data = re.sub(r'[\w\.-]+@[\w\.-]+', '', data)  # 移除邮箱
    data = re.sub(r"\([^()]*\)", "", data)  # 移除名称
    data = data.replace("From: ", "").replace("\nSubject: ", "")
    return data[0:5000] if len(data) > 5000 else data  # 截断

df_train['Text'] = df_train['Text'].apply(preprocess_text)

# Step 5: 生成 Embedding
def make_embed_text_fn(model):
    def embed_fn(text: str) -> list[float]:
        return genai.embed_content(
            model=model,
            content=text,
            task_type="clustering"
        )['embedding']
    return embed_fn

model = 'models/embedding-001'
df_train['Embeddings'] = df_train['Text'].progress_apply(make_embed_text_fn(model))

# Step 6: t-SNE 降维
X = np.array(df_train['Embeddings'].to_list(), dtype=np.float32)
tsne = TSNE(random_state=0, n_iter=1000)
tsne_results = tsne.fit_transform(X)

# Step 7: 计算质心
def get_embedding_centroids(df):
    emb_centroids = dict()
    grouped = df.groupby('Class Name')
    for c in grouped.groups:
        sub_df = grouped.get_group(c)
        emb_centroids[c] = np.mean(sub_df['Embeddings'], axis=0)
    return emb_centroids

emb_centroids = get_embedding_centroids(df_train)

# Step 8: 异常检测
RADIUS = 0.62  # 可调整阈值
detect_outlier(df_train, emb_centroids, RADIUS)
df_outliers = df_train[df_train['Outlier'] == True]

关键参数

参数 说明
SAMPLE_SIZE 150 每个类别采样数
embedding dimension 768 Gemini embedding-001 输出维度
RADIUS 0.62 异常判断阈值(可调整,越大越严格)

典型异常类型

通过质心距离法检测出的异常通常是:

  • 内容主题偏离所属类别的文档
  • 跨类别讨论的混合内容
  • 格式/风格异常的文本

典型算法对比

传统方法

算法 说明 适用场景
KNN 基于距离判断 低维数据
PCA 基于主成分重构误差 高维数据
Isolation Forest 基于随机树隔离 通用
DBSCAN 基于密度聚类 簇形状不规则
LOF 局部离群因子 局部异常

Embedding + 传统算法

方法 优势 局限
Embedding + t-SNE + 质心距离 可视化友好,语义清晰 依赖 Embedding 质量
Embedding + PCA + 聚类 保留全局结构 计算成本高
Embedding + Autoencoder 端到端 需要训练

典型应用场景

1. 欺诈检测

  • 信用卡异常交易
  • 保险欺诈
  • 电商刷单

2. 网络安全

  • 入侵检测
  • 恶意软件识别
  • 异常流量监控

3. 工业检测

  • 设备故障预警
  • 产品质量异常
  • 生产过程监控

4. 日志分析

  • 系统故障检测
  • 用户行为异常
  • 安全事件识别

关键术语

  • Anomaly Detection (异常检测):识别数据中异常点的技术
  • Outlier/Anomaly (异常点):不符合正常模式的数据点
  • Point Anomaly (点异常):单个数据点异常
  • Contextual Anomaly (上下文异常):在特定上下文中才异常的
  • Collective Anomaly (集体异常):整体序列异常
  • Cold Start (冷启动):缺乏标注异常样本的问题
  • Embedding (嵌入):将数据转换为向量表示
  • t-SNE (t-分布随机邻域嵌入):降维可视化算法
  • Centroid (质心):聚类的中心点
  • Euclidean Distance (欧几里得距离):两点之间的直线距离
  • Hallucination (幻觉):LLM 生成看似合理但错误的内容
  • pyOD:Python 异常检测库

知识关联

纵向关联:从基础到应用的层次关系

Embedding 向量化
      ↓
向量数据库
      ↓
异常检测
      │
      ├── 直接检测(模式 #1)
      ├── 数据增强(模式 #2)
      ├── 异常解释(模式 #3)
      ├── 表示学习(模式 #4)
      ├── 模型选择(模式 #5)
      ├── 多智能体(模式 #6)
      └── 系统监控(模式 #7)

横向关联:同层次技术的对比

方法 数据依赖 冷启动 可解释性 计算成本
传统方法 (KNN/IF) 少量数据
LLM 直接检测 不需要 可生成
Embedding + 聚类 需要 Embedding
多智能体 很高

📚 相关资源

  • [[wiki/sources/tds-anomaly-detection-llm]] — TDS LLM 异常检测:7 大应用模式详解
  • [[wiki/sources/gemini-anomaly-detection-embeddings]] — Google Gemini 官方教程:Embedding + t-SNE + 质心距离
  • [[wiki/concepts/Anomaly-Detection异常检测]] — 异常检测基础:定义、异常类型、典型算法
  • [[wiki/concepts/LLM-Applications-in-Anomaly-Detection]] — LLM 在异常检测中的 7 大应用模式
  • [[wiki/concepts/t-SNE降维可视化]] — t-SNE 降维算法原理、参数、与 PCA/UMAP 对比

Embedding Models

Embedding Model 类型总览

类型 输入 典型任务
Word Embeddings 单词 情感分析、关键词聚类、语言翻译
Sentence Embeddings 句子/段落 问答系统、文档相似度、文本摘要
Graph Embeddings 图结构数据 社交网络分析、欺诈检测、推荐系统
Item Embeddings 产品/用户 协同过滤、用户细分、行为预测
Multimodal Embeddings 多模态数据 自动驾驶、医疗影像、多媒体搜索

Embedding 与 RAG

Embedding 模型 → 向量表示 → 存储到向量数据库
                              ↓
用户查询 → Embedding 编码 → ANN 相似度检索 → 上下文注入 → LLM 生成

核心价值:Embedding 解决了 LLM 无法访问训练数据之外知识的问题,是 RAG 架构中检索组件的核心。

训练方法对比

方法 说明 适用场景
监督学习 基于标注数据学习 有大量标签的垂直领域
无监督学习 自动发现数据模式 大规模通用语料
自监督学习 通过数据自身结构生成监督信号 预训练阶段(如 Word2Vec 预测上下文词)

Cohere embed-v4.0 核心特性

input_type 参数

# 不同任务使用不同 input_type
co.embed(texts=query, input_type="search_query")      # 用户查询
co.embed(texts=docs, input_type="search_document")   # 被检索文档
co.embed(texts=texts, input_type="classification")    # 分类任务
co.embed(texts=texts, input_type="clustering")       # 聚类任务

Matryoshka 表征学习

一次训练,多种精度:

# 支持输出维度:[256, 512, 1024, 1536]
response = co.embed(
    model="embed-v4.0",
    texts=texts,
    output_dimension=512  # 可选:快但粗 or 慢但精
)

权衡:大向量更精确但更慢;小向量更快但可能丢失语义信息。

压缩格式

类型 压缩率 适用场景
float 1x(32位) 精度优先
int8 4x 存储优先
binary 8x 超大规模检索

多模态支持

# 混合图像和文本
example_doc = [
    {"type": "text", "text": "This is a Scottish Fold Cat"},
    {"type": "image_url", "image_url": {"url": data_url}}
]
res = co.embed(inputs=[{"content": example_doc}], ...)

行业应用场景

金融风控

  • 欺诈检测:发现隐藏的交易关联(如多个账户短期内频繁转账)
  • 信用评估:Embedding 客户行为模式,评估还款能力和产品偏好

医疗健康

  • 药物发现:ChemBERTa 将化学分子编码为向量,预测分子属性和相互作用
  • EHR 分析:从电子病历中识别疾病模式、推荐治疗方案

电商推荐

  • 用户历史行为 Embedding → 个性化推荐
  • 产品向量 → 发现潜在兴趣(协同过滤)

核心挑战与应对

挑战 应对方案
高计算成本 预训练模型 + 微调替代从头训练
扩展性能瓶颈 ANN 搜索、向量索引、量化
数据偏见 偏见检测和纠正算法
可解释性差 向量空间可视化工具
领域术语 领域特定数据微调
隐私合规 数据匿名化和加密

相似度计算

import numpy as np

def cosine_similarity(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

# 示例
"i love soup" vs "soup is my favorite" → 高相似度
"i love soup" vs "london is far away" → 低相似度

最佳实践

  1. 任务定制:根据下游任务选择合适的 input_type
  2. 数据质量:Garbage in, garbage out — 高质量输入才有高质量输出
  3. 持续监控:定期评估 Embedding 质量,必要时微调
  4. 基础设施:确保足够的计算资源处理向量生成和检索
  5. 维度选择:根据精度/速度权衡选择 output_dimension

📚 相关资源

  • [[wiki/sources/cohere-introduction-to-embeddings]] — Cohere Embeddings API 详解:input_type、Matryoshka、多语言
  • [[wiki/sources/cohere-what-are-embedding-models]] — Embedding Models 类型、训练方法、挑战与应对、行业应用
  • [[wiki/concepts/Embedding向量化]] — Embedding 向量化核心原理
  • [[wiki/concepts/RAG检索增强生成]] — Embedding 在 RAG 中的应用
  • [[wiki/concepts/向量数据库]] — Embedding 的存储和检索系统

Sentence Transformers

核心概念

Sentence Transformers(SBERT)是基于 BERT 架构的句子 embedding 库,通过 Siamese Network 结构生成固定长度的句子向量,使语义相似的句子在向量空间中距离相近。

发展历史

Word2Vec (2013) → BERT (2018) → Sentence-BERT (2019) → SBERT v5 (2024)
  单词级别        双向 Transformer   句子级别 Embedding    多模态支持

关键论文

  • Sentence-BERT (2019): 使用 Siamese BERT Networks 生成句子 embedding
  • Multilingual SBERT (2020): 知识蒸馏实现多语言支持
  • Augmented SBERT (2020): 数据增强改进 pairwise 评分任务

架构对比

BERT 的问题

原始 BERT 用于句子对分类任务需要将两个句子同时输入网络,时间复杂度 O(N²),无法用于语义搜索等需要大量候选的场景。

Bi-Encoder (Sentence Transformer)

Sentence A → BERT Encoder → Vector A
Sentence B → BERT Encoder → Vector B
         ↓
    Cosine Similarity(V1, V2)

优点

  • 预计算所有 passage 的 embedding
  • 查询时只需计算 query 的 embedding
  • 速度快,适合大规模检索

缺点

  • 独立的编码器,无法充分交互

Cross-Encoder

[CLS] Sentence A [SEP] Sentence B [SEP] → BERT Encoder → Score

优点

  • query 和 passage 充分交互
  • 精度更高

缺点

  • 无法预计算,每次查询需重新编码
  • 速度慢,适合小规模精排

Bi-Encoder vs Cross-Encoder

特性 Bi-Encoder (SBERT) Cross-Encoder
编码方式 分别独立编码 拼接后联合编码
计算速度 快(可预计算) 慢(实时计算)
精度 中等
适用场景 语义搜索(大规模候选) 重排序(小规模精排)
存储需求 需存储向量 无需存储向量

三大模块(SBERT v5.4+)

1. Sentence Transformer(稠密 Embedding)

from sentence_transformers import SentenceTransformer

model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
sentences = ["The weather is lovely today.", "It's so sunny outside!"]
embeddings = model.encode(sentences)
# Shape: [2, 384]

similarities = model.similarity(embeddings, embeddings)
# tensor([[1.0000, 0.6660], [0.6660, 1.0000]])

常见模型

模型 维度 特点
all-MiniLM-L6-v2 384 轻量快速
all-mpnet-base-v2 768 高精度
multi-qa-MiniLM-L6-cos-v1 384 专为问答优化

2. CrossEncoder(Reranker)

from sentence_transformers import CrossEncoder

model = CrossEncoder("cross-encoder/ms-marco-MiniLM-L6-v2")
query = "How many people live in Berlin?"
passages = ["Berlin had 3,520,031 inhabitants...", "Berlin has yearly 135 million visitors..."]

scores = model.predict([(query, p) for p in passages])
ranks = model.rank(query, passages, return_documents=True)

3. Sparse Encoder(稀疏 Embedding)

与稠密向量不同,稀疏 embedding 维度等于词表大小(30522),99%+ 为零:

from sentence_transformers import SparseEncoder

model = SparseEncoder("naver/splade-cocondenser-ensembledistil")
embeddings = model.encode(sentences)
# Shape: [3, 30522] - 99.84% sparsity

similarities = model.similarity(embeddings, embeddings)

优势:可解释性强(直接看到哪些词贡献最大),适合法律/医疗等需要可解释性的场景。

多模态支持(v5.4+)

model = SentenceTransformer("Qwen/Qwen3-VL-Embedding-2B")

# 图像 embedding
img_embeddings = model.encode(["https://.../car.jpg", "https://.../bee.jpg"])

# 文本 embedding
text_embeddings = model.encode(["A green car parked in front of a yellow building"])

# 跨模态相似度计算
similarities = model.similarity(text_embeddings, img_embeddings)

语义搜索实战

Pipeline

文档 → Split → Embedding → Vector Database
                              ↓
用户查询 → Embedding → ANN 检索 → Top-K → Reranker 精排 → 结果

代码示例

from sentence_transformers import SentenceTransformer, util

model = SentenceTransformer('multi-qa-MiniLM-L6-cos-v1')

# 构建文档库
passages = [
    "London has 9,787,426 inhabitants at the 2011 census",
    "London is known for its financial district",
    "Paris is the capital of France"
]
passage_embeddings = model.encode(passages)

# 查询
query = "How big is London"
query_embedding = model.encode(query)

# 检索
scores = util.dot_score(query_embedding, passage_embeddings)
top_k = util.semantic_search(query_embedding, passage_embeddings, top_k=2)

BERT:SBERT 的基础

为什么需要 BERT

  • Word2Vec 问题:同一词在不同上下文生成相同向量
    • “bank” 在 “river bank” 和 “bank account” 中向量相同
    • 无法区分多义词
  • BERT 解决:通过双向上下文理解,同一词在不同上下文生成不同向量

BERT vs GPT

特性 BERT GPT
方向性 双向 单向(自回归)
架构 Transformer Encoder Transformer Decoder
预训练任务 MLM + NSP 语言建模
典型应用 理解任务 生成任务
词向量维度 768 (BERT-base) 768-12288

BERT vs RoBERTa

特性 BERT RoBERTa
Masking 静态 动态
NSP 任务
训练数据 16GB 160GB

Hugging Face Hub 生态

  • 10,000+ 预训练模型可选
  • 支持 100+ 语言的 multilingual models
  • MTEB (Massive Text Embedding Benchmark) 排行榜

使用方式

# 加载
model = SentenceTransformer('model_name')

# 一键分享到 Hub
model.save_to_hub("my_new_model")

Hub 提供:

  1. 自动生成 Model Card
  2. 交互式 Widget 可直接试用
  3. Inference Providers 集成

最佳实践

  1. 模型选择

    • 通用场景:all-MiniLM-L6-v2(快速)
    • 高精度:all-mpnet-base-v2
    • 多语言:paraphrase-multilingual-mpnet-base-v2
  2. 检索 + 重排架构

    • Bi-Encoder 快速召回 Top-K
    • Cross-Encoder 精排排序
  3. 混合检索:稠密向量 + 稀疏向量结合使用

  4. 微调:使用领域数据微调 sentence transformer


📚 相关资源

  • [[wiki/sources/huggingface-sentence-transformers]] — HuggingFace Sentence Transformers 使用指南
  • [[wiki/sources/sentence-transformers-documentation]] — SBERT 官方文档:三大模块详解
  • [[wiki/sources/what-is-bert]] — BERT 双向编码器详解:vs Word2Vec/GPT/RoBERTa
  • [[wiki/concepts/BERT双向编码器]] — BERT 核心原理与预训练任务
  • [[wiki/concepts/Transformer架构]] — BERT 基于的 Transformer 架构
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐