嵌入模型 API
Embeddings 是文本、图像或视频的数值表示,它们捕捉了输入之间的关系。
Embeddings 的工作原理是将文本、图像和视频转换为浮点数数组,称为向量。这些向量旨在捕捉文本、图像和视频的含义。Embedding 数组的长度称为向量的维度。
通过计算两段文本向量表示之间的数值距离,应用程序可以确定用于生成嵌入向量的对象之间的相似性。
EmbeddingModel
接口旨在简化与 AI 和机器学习中的嵌入模型的集成。其主要功能是将文本转换为数值向量,通常称为嵌入(embeddings)。这些嵌入在语义分析和文本分类等任务中至关重要。
EmbeddingModel
接口的设计围绕两个主要目标展开:
-
可移植性:该接口确保了在不同嵌入模型之间的轻松适应性。它允许开发者在最少的代码更改下切换不同的嵌入技术或模型。这种设计符合 Spring 的模块化和可互换性理念。
-
简洁性:
EmbeddingModel
简化了将文本转换为嵌入的过程。通过提供像embed(String text)
和embed(Document document)
这样直观的方法,它消除了处理原始文本数据和嵌入算法的复杂性。这种设计选择使得开发者,尤其是那些刚接触 AI 的开发者,能够更容易地在他们的应用程序中使用嵌入,而无需深入研究底层机制。
API 概览
Embedding Model API 构建在通用的 Spring AI Model API 之上,后者是 Spring AI 库的一部分。因此,EmbeddingModel
接口扩展了 Model
接口,该接口提供了一组标准方法用于与 AI 模型进行交互。EmbeddingRequest
和 EmbeddingResponse
类分别从 ModelRequest
和 ModelResponse
扩展而来,用于封装嵌入模型的输入和输出。
Embedding API 继而由更高层次的组件使用,以实现针对特定嵌入模型的 Embedding Models,例如 OpenAI、Titan、Azure OpenAI、Ollie 等。
下图展示了 Embedding API 及其与 Spring AI Model API 和 Embedding Models 的关系:
EmbeddingModel
本节提供了关于 EmbeddingModel
接口及相关类的指南。
public interface EmbeddingModel extends Model<EmbeddingRequest, EmbeddingResponse> {
@Override
EmbeddingResponse call(EmbeddingRequest request);
/**
* Embeds the given document's content into a vector.
* @param document the document to embed.
* @return the embedded vector.
*/
float[] embed(Document document);
/**
* Embeds the given text into a vector.
* @param text the text to embed.
* @return the embedded vector.
*/
default float[] embed(String text) {
Assert.notNull(text, "Text must not be null");
return this.embed(List.of(text)).iterator().next();
}
/**
* Embeds a batch of texts into vectors.
* @param texts list of texts to embed.
* @return list of list of embedded vectors.
*/
default List<float[]> embed(List<String> texts) {
Assert.notNull(texts, "Texts must not be null");
return this.call(new EmbeddingRequest(texts, EmbeddingOptions.EMPTY))
.getResults()
.stream()
.map(Embedding::getOutput)
.toList();
}
/**
* Embeds a batch of texts into vectors and returns the {@link EmbeddingResponse}.
* @param texts list of texts to embed.
* @return the embedding response.
*/
default EmbeddingResponse embedForResponse(List<String> texts) {
Assert.notNull(texts, "Texts must not be null");
return this.call(new EmbeddingRequest(texts, EmbeddingOptions.EMPTY));
}
/**
* @return the number of dimensions of the embedded vectors. It is generative
* specific.
*/
default int dimensions() {
return embed("Test String").size();
}
}
嵌入方法提供了多种选项,用于将文本转换为嵌入向量,适用于单个字符串、结构化的 Document
对象或批量文本。
提供了多种快捷方法来嵌入文本,包括 embed(String text)
方法,该方法接收单个字符串并返回相应的嵌入向量。所有的快捷方法都是围绕 call
方法实现的,call
方法是调用嵌入模型的主要方法。
通常,嵌入会返回一个浮点数列表,表示以数值向量格式表示的嵌入。
embedForResponse
方法提供了更全面的输出,可能包括有关嵌入的额外信息。
dimensions
方法是开发者用来快速确定嵌入向量大小的便捷工具,这对于理解嵌入空间以及后续处理步骤非常重要。
EmbeddingRequest
EmbeddingRequest
是一个 ModelRequest
,它接收一组文本对象和可选的嵌入请求选项。以下列表展示了 EmbeddingRequest
类的简化版本,排除了构造函数和其他实用方法:
public class EmbeddingRequest implements ModelRequest<List<String>> {
private final List<String> inputs;
private final EmbeddingOptions options;
// other methods omitted
}
EmbeddingResponse
EmbeddingResponse
类的结构如下:
public class EmbeddingResponse implements ModelResponse<Embedding> {
private List<Embedding> embeddings;
private EmbeddingResponseMetadata metadata = new EmbeddingResponseMetadata();
// other methods omitted
}
EmbeddingResponse
类保存了 AI 模型的输出,每个 Embedding
实例包含来自单个文本输入的结果向量数据。
EmbeddingResponse
类还携带了一个 EmbeddingResponseMetadata
元数据,用于描述 AI 模型的响应信息。
嵌入
Embedding
表示单个嵌入向量。
public class Embedding implements ModelResult<float[]> {
private float[] embedding;
private Integer index;
private EmbeddingResultMetadata metadata;
// other methods omitted
}
可用实现
在内部,各种 EmbeddingModel
实现使用不同的底层库和 API 来执行嵌入任务。以下是一些可用的 EmbeddingModel
实现:
章节摘要
🗃️ Amazon Bedrock
2 个项目
📄️ Azure OpenAI
Azure 的 OpenAI 扩展了 OpenAI 的能力,为各种任务提供安全的文本生成和 Embeddings 计算模型:
📄️ Mistral AI
Spring AI 支持 Mistral AI 的文本嵌入模型。嵌入是文本的向量表示,通过在高维向量空间中的位置捕捉段落的语义含义。Mistral AI Embeddings API 提供了最先进、最前沿的文本嵌入,可用于多种 NLP 任务。
📄️ MiniMax
Spring AI 支持来自 MiniMax 的各种 AI 语言模型。你可以与 MiniMax 语言模型进行交互,并基于 MiniMax 模型创建多语言对话助手。
📄️ OCI GenAI
OCI GenAI 服务提供按需模型或专用 AI 集群的文本嵌入功能。
📄️ Ollama
使用 Ollama 你可以在本地运行各种 AI 模型,并从中生成嵌入。嵌入是一个浮点数的向量(列表)。两个向量之间的距离衡量了它们的相关性。小的距离表示高度相关,而大的距离表示低相关性。
📄️ (ONNX) 转换器
TransformersEmbeddingModel 是一个 EmbeddingModel 实现,它使用选定的 sentence transformer 在本地计算句子嵌入。
📄️ OpenAI
Spring AI 支持 OpenAI 的文本嵌入模型。OpenAI 的文本嵌入用于衡量文本字符串之间的相关性。嵌入是一个浮点数组成的向量(列表)。两个向量之间的距离衡量了它们的相关性。距离较小表示相关性较高,距离较大则表示相关性较低。
📄️ PostgresML
Spring AI 支持 PostgresML 文本嵌入模型。
📄️ 千帆
Spring AI 支持来自 QianFan 的各种 AI 语言模型。你可以与 QianFan 的语言模型进行交互,并基于 QianFan 模型创建一个多语言对话助手。
🗃️ VertexAI
2 个项目
📄️ watsonx.AI
通过 Watsonx.ai,您可以运行各种大型语言模型(LLMs)并从中生成嵌入。Spring AI 通过 WatsonxAiEmbeddingModel 支持 Watsonx.ai 的文本嵌入功能。
📄️ 智谱 AI
Spring AI 支持智谱AI的文本嵌入模型。智谱AI的文本嵌入用于衡量文本字符串之间的相关性。嵌入是一个浮点数组成的向量(列表)。两个向量之间的距离衡量了它们的相关性。距离小表示相关性高,距离大表示相关性低。