嵌入模型 API
嵌入是文本、图像或视频的数值表示,用于捕获输入之间的关系。
嵌入的工作原理是将文本、图像和视频转换为浮点数数组,称为向量。这些向量旨在捕获文本、图像和视频的含义。嵌入数组的长度称为向量的维度。
通过计算两个文本向量表示之间的数值距离,应用程序可以确定用于生成嵌入向量的对象之间的相似性。
EmbeddingModel
接口旨在轻松集成 AI 和机器学习中的嵌入模型。其主要功能是将文本转换为数值向量,通常称为嵌入。这些嵌入对于各种任务至关重要,例如语义分析和文本分类。
EmbeddingModel 接口的设计围绕两个主要目标:
-
可移植性:此接口确保了在各种嵌入模型之间的轻松适应性。它允许开发人员在不同的嵌入技术或模型之间切换,只需最少的代码更改。此设计与 Spring 的模块化和可互换性理念一致。
-
简单性:EmbeddingModel 简化了将文本转换为嵌入的过程。通过提供如
embed(String text)
和embed(Document document)
等简单明了的方法,它消除了处理原始文本数据和嵌入算法的复杂性。这种设计选择使得开发人员,特别是 AI 新手,更容易在他们的应用程序中使用嵌入,而无需深入了解底层机制。
API 概览
嵌入模型 API 构建在通用的 Spring AI 模型 API 之上,它是 Spring AI 库的一部分。因此,EmbeddingModel
接口扩展了 Model
接口,后者提供了一套标准方法用于与 AI 模型交互。EmbeddingRequest
和 EmbeddingResponse
类扩展自 ModelRequest
和 ModelResponse
,用于分别封装嵌入模型的输入和输出。
嵌入 API 又被更高级别的组件用于为特定的嵌入模型实现嵌入模型,例如 OpenAI、Titan、Azure OpenAI、Ollama 等。
下图展示了嵌入 API 以及它与 Spring AI 模型 API 和嵌入模型的关系
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();
}
}
embed 方法提供了将文本转换为嵌入的各种选项,可处理单个字符串、结构化的 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
类还携带关于 AI 模型响应的 EmbeddingResponseMetadata
元数据。