嵌入模型 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、Ollie 等)实施嵌入模型。
下图说明了嵌入 API 及其与 Spring AI 模型 API 和嵌入模型的关系:
EmbeddingModel
本节提供了EmbeddingModel
interface 和关联的类。
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
方法,这是调用嵌入模型的主要方法。
通常,嵌入向量会返回一个浮点数列表,以数字向量格式表示嵌入向量。
这embedForResponse
method 提供更全面的输出,可能包括有关嵌入的其他信息。
dimensions 方法是开发人员快速确定嵌入向量大小的便捷工具,这对于理解嵌入空间和后续处理步骤非常重要。
嵌入请求
这EmbeddingRequest
是一个ModelRequest
它接受文本对象列表和可选的嵌入请求选项。
下面的清单显示了 EmbeddingRequest 类的截断版本,不包括构造函数和其他 Util 方法:
public class EmbeddingRequest implements ModelRequest<List<String>> {
private final List<String> inputs;
private final EmbeddingOptions options;
// other methods omitted
}
EmbeddingResponse
的结构EmbeddingResponse
class 的 API 如下所示:
public class EmbeddingResponse implements ModelResponse<Embedding> {
private List<Embedding> embeddings;
private EmbeddingResponseMetadata metadata = new EmbeddingResponseMetadata();
// other methods omitted
}
这EmbeddingResponse
class 保存 AI 模型的输出,每个Embedding
实例,其中包含来自单个文本输入的结果向量数据。
这EmbeddingResponse
类还带有一个EmbeddingResponseMetadata
有关 AI 模型响应的元数据。