AI应用开发 - What are Embeddings
Semantic Search
核心概念
语义搜索是一种搜索引擎技术,通过理解查询意图和上下文来返回结果,而非简单匹配字面词汇。
解决的问题
| 痛点 | 旧方案(关键词搜索) | 新方案(语义搜索) |
|---|---|---|
| 用户不知道精确词汇 | 同义词扩展 | 直接用自然语言描述 |
| 一词多义 | 无法区分 | 理解上下文区分含义 |
| 意图不明确 | 返回字面匹配 | 推断用户意图 |
| 概念相关但不匹配 | 搜不到 | 匹配相关概念 |
工作原理
核心流程
用户查询 → Embedding 编码 → 向量表示 → kNN 最近邻匹配 → 语义排序 → 返回结果
三步详解
- Query Encoding:用户查询被转换为向量(Embedding)
- Vector Matching:kNN 算法在向量数据库中寻找最相似的文档向量
- 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 检索增强生成
横向关联:同层次技术的对比
| 技术 | 特点 | 适用场景 |
|---|---|---|
| 关键词搜索 | 字面匹配,同义词扩展 | 精确词汇查询 |
| 语义搜索 | 概念匹配,意图理解 | 自然语言查询 |
| 向量搜索 | 相似度计算,高维空间 | 近似匹配,推荐系统 |
实际应用场景
- 电商搜索:用户输入"巧克力味道的牛奶"而不是"chocolate milk",语义搜索能理解意图返回正确产品
- 智能问答:用户用自然语言提问,语义搜索找到最相关的文档片段
- 推荐系统:通过用户历史行为和当前查询的语义匹配,推荐相关内容
典型案例: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)是根据数据的敏感度、重要性和预定义标准对数据进行组织和分类的过程,使组织能够有效地保护和管理数据资产。
解决的问题
| 痛点 | 旧方案 | 新方案(数据分类) |
|---|---|---|
| 敏感数据无法识别 | 统一保护,成本高效果差 | 按敏感度分级保护 |
| 合规要求不明确 | 事后补救,面临罚款 | 事前识别,主动合规 |
| 资源分配不合理 | 平均分配资源 | 优先保护高敏感数据 |
| 数据访问控制模糊 | 粗粒度权限管理 | 细粒度基于分类的访问控制 |
工作原理
核心流程
定义分类标准 → 识别数据资产 → 分配分类级别 → 应用安全控制 → 持续监控
步骤详解
- 定义分类模式:确定分类类别(Public、Internal、Restricted、Confidential)和标准
- 识别数据资产:识别结构化和非结构化数据,使用自动化工具扫描
- 分配分类级别:基于内容、元数据或属性匹配到预定义类别
- 应用安全控制:加密、基于角色的访问控制、数据保留策略
- 持续监控:自动化监控云环境中的数据资产,定期审核
分类级别
| 级别 | 敏感度 | 保护要求 | 示例 |
|---|---|---|---|
| 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 过滤:
- 计算目标用户与其他所有用户的相似度(余弦相似度/皮尔逊相关系数)
- 找到最相似的 k 个用户
- 根据这 k 个用户的评分预测目标用户的评分
项目-based 过滤:
- 通过用户行为计算项目之间的相似度
- 不是基于项目特征,而是基于用户如何与项目交互
- 适合用户数量远大于项目数量时
问题:矩阵稀疏性
- 大多数用户-项目矩阵非常稀疏(大多数评分为空)
- 导致难以找到高质量的相似用户或项目
基于模型的协同过滤
通过机器学习训练预测模型:
- 矩阵分解:SVD、SVD++、NMF
- 深度学习:神经网络学习复杂交互模式
- 聚类:K-means 聚类相似用户
- 贝叶斯分类器:概率模型预测
冷启动问题
| 问题场景 | 解决方案 |
|---|---|
| 新用户注册 | 引导填写偏好问卷 |
| 新产品上架 | 用特征匹配现有用户 |
| 用户数据不足 | popularity-based 推荐热门 |
2. 内容过滤(Content-Based Filtering)
核心思想:基于项目本身的特征进行推荐,假设用户喜欢某个项目,就会喜欢与该项目特征相似的其他项目。
向量空间模型
项目向量 = [特征1权重, 特征2权重, 特征3权重, ...]
用户向量 = [偏好特征1, 偏好特征2, 偏好特征3, ...]
相似度 = cos(用户向量, 项目向量)
推荐流程
- 收集用户历史行为:用户看过的/喜欢的项目
- 提取项目特征:从历史项目中提取特征(类型、颜色、价格、品牌…)
- 构建用户画像:根据特征构建用户向量
- 计算相似度:候选项目与用户画像的余弦相似度
- 排序推荐:按相似度排序返回 Top-K 推荐
局限性
- 洞察有限:只能推荐与正在查看/购买的产品相似的内容
- 无法跨类别推荐:如果用户只看科幻电影,系统永远不会推荐纪录片
- 新用户数据不足:需要积累一定的历史行为
3. 混合过滤(Hybrid)
结合协同过滤和内容过滤,Netflix 是典型案例。
混合推荐 = 协同过滤 + 内容过滤
│ │
▼ ▼
发现用户潜在兴趣 提供稳定推荐基础
混合策略:
- 加权混合:两种算法的结果加权求和
- 切换混合:根据情况切换使用不同算法
- 级联混合:先用一种筛选候选,再用另一种排序
典型应用场景
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" → 低相似度
最佳实践
- 任务定制:根据下游任务选择合适的 input_type
- 数据质量:Garbage in, garbage out — 高质量输入才有高质量输出
- 持续监控:定期评估 Embedding 质量,必要时微调
- 基础设施:确保足够的计算资源处理向量生成和检索
- 维度选择:根据精度/速度权衡选择 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 提供:
- 自动生成 Model Card
- 交互式 Widget 可直接试用
- Inference Providers 集成
最佳实践
-
模型选择:
- 通用场景:
all-MiniLM-L6-v2(快速) - 高精度:
all-mpnet-base-v2 - 多语言:
paraphrase-multilingual-mpnet-base-v2
- 通用场景:
-
检索 + 重排架构:
- Bi-Encoder 快速召回 Top-K
- Cross-Encoder 精排排序
-
混合检索:稠密向量 + 稀疏向量结合使用
-
微调:使用领域数据微调 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 架构
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)