Skip to main content
版权归属于 LangChat Team
官网:https://langchat.cn

07 - EmbeddingModel 和向量

版本说明

本文档基于 LangChain4j 1.10.0 版本编写。

学习目标

通过本章节学习,你将能够:
  • 理解什么是 Embedding(嵌入)
  • 掌握 EmbeddingModel 的使用方法
  • 了解向量表示的含义
  • 学会计算文本之间的相似度
  • 理解不同 Embedding 模型的区别

前置知识

  • 完成《01 - LangChain4j 简介》章节
  • 完成《02 - 你的第一个 Chat 应用》章节
  • 了解基本的线性代数概念(可选)

核心概念

什么是 Embedding?

**Embedding(嵌入)**是将文本、图像或其他数据转换为数值向量(Vector)的过程。 为什么需要 Embedding?
  1. 语义理解 - 计算机可以理解词语之间的语义关系
  2. 相似度计算 - 可以计算两个文本的相似程度
  3. 搜索和检索 - 可以快速找到最相似的文档
  4. 机器学习输入 - 向量可以作为机器学习模型的输入
类比理解: 如果把文本比作一个复杂的地址(如”北京市海淀区中关村”),那么 Embedding 就像是将其转换为经纬度坐标(39.98°N, 116.31°E)。有了坐标,就可以轻松计算两个地址的距离(即文本的相似度)。 示例:

向量的维度

Embedding 生成的向量通常有固定的维度(Dimension): 维度的意义:
  • 更高维度通常能表示更多信息
  • 但也意味着更多的计算和存储成本
  • 需要根据应用场景选择合适的模型

Embedding 应用场景

  1. 语义搜索 - 找到与查询最相似的文档
  2. 推荐系统 - 根据用户喜好推荐相似内容
  3. 聚类分析 - 将相似的文档分组
  4. 去重 - 识别重复或相似的内容
  5. 知识库检索 - RAG(检索增强生成)的基础

EmbeddingModel 接口

接口定义

基本使用

常见 Embedding 模型提供商

OpenAI Embeddings

Hugging Face Embeddings

Ollama Embeddings(本地)

Cohere Embeddings

向量相似度计算

余弦相似度(Cosine Similarity)

余弦相似度是最常用的向量相似度计算方法:

完整示例:文本相似度计算

运行示例

批量 Embedding

为什么需要批量 Embedding?

  1. 性能优化 - 批量处理比单独处理更快
  2. 成本降低 - 减少 API 调用次数
  3. 效率提升 - 减少网络开销

批量 Embedding 示例

实际应用场景

场景一:语义搜索

场景二:文本聚类

场景三:文本去重

测试代码示例

实践练习

练习 1:实现语义搜索引擎

创建一个简单的语义搜索引擎:

练习 2:实现推荐系统

创建一个基于协同过滤的推荐系统:

练习 3:Embedding 性能对比

对比不同 Embedding 模型的性能:

总结

本章要点

  1. Embedding 概念
    • 将文本转换为数值向量
    • 用于计算相似度和语义理解
    • 是 RAG 和语义搜索的基础
  2. EmbeddingModel
    • 提供文本到向量的转换
    • 支持单个和批量嵌入
    • 多种提供商选择(OpenAI、Hugging Face 等)
  3. 向量相似度
    • 余弦相似度是最常用的方法
    • 欧几里得距离等也是可选方法
    • 相似度范围通常是 0-1 之间
  4. 应用场景
    • 语义搜索
    • 推荐系统
    • 文本聚类
    • 文本去重
  5. 性能优化
    • 使用批量嵌入提高性能
    • 选择合适的模型平衡质量和速度
    • 缓存 Embedding 结果避免重复计算

下一步

在下一章节中,我们将学习:
  • EmbeddingStore 向量存储
  • 如何持久化向量数据
  • 向量检索和搜索
  • 搭建完整的 RAG 系统

常见问题

Q1:Embedding 向量的维度越高越好吗? A:不一定。更高维度可以表示更多信息,但也会增加计算和存储成本。需要根据应用场景选择合适的模型。 Q2:余弦相似度和欧几里得距离有什么区别? A:
  • 余弦相似度:衡量向量方向的一致性(-1 到 1),1 表示完全相同
  • 欧几里得距离:衡量向量的绝对距离(0 到无穷大),0 表示完全相同
  • 余弦相似度对向量长度不敏感,更常用
Q3:为什么需要批量 Embedding? A:
  • 性能优化:批量处理比单独处理更快
  • 成本降低:减少 API 调用次数
  • 网络效率:减少网络开销
Q4:Embedding 模型和 LLM 有什么区别? A:
  • Embedding 模型:专门用于生成向量表示,用于相似度计算
  • LLM:用于生成文本、对话等,通过概率预测下一个词
  • Embedding 输出是固定维度的数值向量,LLM 输出是文本序列
Q5:如何选择合适的 Embedding 模型? A:考虑以下因素:
  • 语言(中文、英文、多语言)
  • 应用场景(通用、特定领域)
  • 性能要求(速度 vs 质量)
  • 成本预算
  • 支持的模型大小和维度

参考资料


版权归属于 LangChat Team
官网:https://langchat.cn