SpringAI——嵌入模型 (Embedding Model)

什么是嵌入模型?

嵌入模型就是将文本,图像,音频这些非结构化数据转换成向量(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();

    }

响应结果:

 

 注意同一个输入使用不同的嵌入模型,得到的向量不一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值