什么是嵌入模型?
嵌入模型就是将文本,图像,音频这些非结构化数据转换成向量(Vectors)的浮点数数组的技术。我们想啊,机器并没有像人一样的大脑可以灵活的辨别文本,图像,音频之间差异与联系,但是机器的强大之处就是可以快速计算两个数之间的差异,我们学过欧几里得空间,在向量空间里可以计算两个点之间的距离,距离越近表示相似度越高,那我们就可以用把文字映射成向量,通过向量之间的距离来类别文字之间的相似性,将高纬度的数据转换成低维度的向量表示。
Spring AI Alibaba中的嵌入模型
Spring AI Alibaba提供了多种嵌入模型的实现,包括预训练模型和自定义模型。这些模型可以用于各种任务,如文本分类、情感分析、图像识别等。Spring AI的嵌入模型接口设计得非常灵活,使得开发者可以轻松地集成和使用这些模型。
在撸代码之前我们先学习一下Spring AI 中嵌入模型一些核心API
EmbeddingModel
表示嵌入模型,定义了如何将输入数据转换成浮点数组,其常用方法如下:
public interface EmbeddingModel extends Model<EmbeddingRequest, EmbeddingResponse> {
EmbeddingResponse call(EmbeddingRequest request);
default float[] embed(String text) {
Assert.notNull(text, "Text must not be null");
List<float[]> response = this.embed(List.of(text));
return (float[])response.iterator().next();
}
float[] embed(Document document);
default List<float[]> embed(List<String> texts) {
Assert.notNull(texts, "Texts must not be null");
return this.call(new EmbeddingRequest(texts, EmbeddingOptionsBuilder.builder().build())).getResults().stream().map(Embedding::getOutput).toList();
}
default List<float[]> embed(List<Document> documents, EmbeddingOptions options, BatchingStrategy batchingStrategy) {
Assert.notNull(documents, "Documents must not be null");
List<float[]> embeddings = new ArrayList(documents.size());
List<List<Document>> batch = batchingStrategy.batch(documents);
Iterator var6 = batch.iterator();
while(var6.hasNext()) {
List<Document> subBatch = (List)var6.next();
List<String> texts = subBatch.stream().map(Document::getText).toList();
EmbeddingRequest request = new EmbeddingRequest(texts, options);
EmbeddingResponse response = this.call(request);
for(int i = 0; i < subBatch.size(); ++i) {
embeddings.add(((Embedding)response.getResults().get(i)).getOutput());
}
}
Assert.isTrue(embeddings.size() == documents.size(), "Embeddings must have the same number as that of the documents");
return embeddings;
}
default EmbeddingResponse embedForResponse(List<String> texts) {
Assert.notNull(texts, "Texts must not be null");
return this.call(new EmbeddingRequest(texts, EmbeddingOptionsBuilder.builder().build()));
}
default int dimensions() {
return this.embed("Test String").length;
}
}
embed()方法接收单个文本,文本列表,单个文件,文件列表对应返回浮点数组或浮点数组列表
dimensions()方法:返回 Embedding 向量大小
EmbeddingRequest
包含一个或多个输入文本,用于生成嵌入向量。

EmbeddingResponse
包含生成的嵌入向量

Embedding
Embedding表示一个 Embedding 向量。

接下来我们通过简单的demo来进一步的学习一下
引入依赖:
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter</artifactId>
<version>1.0.0-M5.1</version>
</dependency>
配置api-key,这里不多说,前面的文章已经提到过。
单个文本形式:
@RequestMapping("/embedding/text")
public float[] text(String input) {
return embeddingModel.embed(input);
}
响应结果:

EmbeddingRequest形式:
@RequestMapping("/embedding/request")
public Embedding embedding(String input) {
EmbeddingOptions embeddingOptions = EmbeddingOptionsBuilder.builder()
.withModel("text-embedding-v2")
.build();
EmbeddingRequest embeddingRequest = new EmbeddingRequest(List.of( input),embeddingOptions);
EmbeddingResponse response = embeddingModel.call(embeddingRequest);
return response.getResult();
}
响应结果:
注意同一个输入使用不同的嵌入模型,得到的向量不一样。
495

被折叠的 条评论
为什么被折叠?



