Spring AI 增加混元 embedding 向量功能

news/2025/4/2 3:08:19/文章来源:https://www.cnblogs.com/guoxiaoyu/p/18790285

上次我们讨论了如何将自己的开源项目发布到 Maven 中央仓库,确保其能够方便地被其他开发者使用和集成。而我们的项目 spring-ai-hunyuan 已经具备了正常的聊天对话功能,包括文本聊天和图片理解等基础功能。今天,我们进一步优化和扩展了该项目,新增了一个向量化功能。如图所示:

image

好的,首先就是对接API接口。我们开始。

向量功能

接口调用

腾讯的所有接口共享同一个域名,并且接口之间并没有按照请求路径进行细分。主要依赖请求头中的action字段来区分不同的接口调用。通过这种方式,接口能够在同一个域名下通过不同的请求头信息进行区分和处理,如下图所示:

image

所以,我们以前写的HunYuanAPI类就需要改一下,否则他默认走的全是聊天接口。修改如下:

ResponseEntity<EmbeddingResponse> embeddingResponseResponseEntity = this.restClient.post().uri("/").header("X-TC-Action", HunYuanConstants.DEFAULT_EMBED_ACTION).body(embeddingRequest).retrieve().toEntity(EmbeddingResponse.class);

在正常调用过程中,header字段用于区分不同的接口请求。这是因为在我使用的restClient加密方式中,采用了拦截器的形式。通过这种方式,每次请求发起时,拦截器都会被触发,从而使我能够轻松地读取到请求头中的相关信息。

这样一来,我可以在请求的整个生命周期内获取和处理这些信息。具体实现细节如下所示:

@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {String action = request.getHeaders().getFirst("X-TC-Action");MultiValueMap<String, String> httpHeadersConsumer = hunYuanAuthApi.getHttpHeadersConsumer(action, body);.......
}

通过这种方式,我们不再依赖于写死的固定值来传递参数,而是能够动态地处理每次请求时的不同值。完成接口调用的处理后,接下来需要关注的是输入参数的管理与传递。

输入参数

这里的输入参数有两个可选值,如图所示:

image

为了简化对接过程,我们选择直接使用数组类型的输入形式。这种方式不仅使得数据传递更加直观和高效,而且与Spring AI的内部处理机制高度契合。Spring AI在处理数据时,本身也会将输入数据自动转化为数组形式进行处理,具体的实现方式如下所示:

default float[] embed(String text) {Assert.notNull(text, "Text must not be null");List<float[]> response = this.embed(List.of(text));return response.iterator().next();
}

输出参数

处理完了输入参数,那么紧接着就是输出参数了。如图所示:

image

但是,腾讯接口有一个共同特点,就是所有输出参数都被Response字段包围着。所以我们还需要单独处理一下,如下所示:

ResponseEntity<EmbeddingResponse> embeddingResponseResponseEntity = this.restClient.post().uri("/").header("X-TC-Action", HunYuanConstants.DEFAULT_EMBED_ACTION).body(embeddingRequest).retrieve().toEntity(EmbeddingResponse.class);return embeddingResponseResponseEntity.getBody().response();

EmbeddingResponse的结构如下:

@JsonInclude(Include.NON_NULL)
public record EmbeddingResponse(// @formatter:off@JsonProperty("Response") EmbeddingList response
) {// @formatter:on
}
@JsonInclude(Include.NON_NULL)
public record EmbeddingList(// @formatter:off@JsonProperty("RequestId") String object,@JsonProperty("Data") List<Embedding> data,@JsonProperty("Usage") Usage usage) { // @formatter:on
}

自动配置

在正常完成接口调用的编写之后,接下来我们需要着手进行Spring Boot的自动配置编写。

HunYuanEmbeddingProperties

首先一个配置类解析,将配置文件中的配置信息读取到类中,如下所示:

@ConfigurationProperties(HunYuanEmbeddingProperties.CONFIG_PREFIX)
public class HunYuanEmbeddingProperties extends HunYuanParentProperties {public static final String CONFIG_PREFIX = "spring.ai.hunyuan.embedding";public static final String DEFAULT_EMBEDDING_MODEL = "hunyuan-embedding";.......
}

HunYuanAutoConfiguration

这里就是单独配置一下我们需要的embedding模型的接口配置了。如图所示,先将配置类添加到注解中。

image

然后我们需要注入一下HunYuanEmbeddingModel模型。代码如下:

@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = HunYuanEmbeddingProperties.CONFIG_PREFIX, name = "enabled", havingValue = "true",matchIfMissing = true)
public HunYuanEmbeddingModel hunYuanEmbeddingModel(HunYuanCommonProperties commonProperties,HunYuanEmbeddingProperties embeddingProperties, ObjectProvider<RestClient.Builder> restClientBuilderProvider,ObjectProvider<WebClient.Builder> webClientBuilderProvider, RetryTemplate retryTemplate,ResponseErrorHandler responseErrorHandler, ObjectProvider<ObservationRegistry> observationRegistry,ObjectProvider<EmbeddingModelObservationConvention> observationConvention) {var hunyuanApi = hunyuanApi(embeddingProperties.getSecretId(), commonProperties.getSecretId(),embeddingProperties.getSecretKey(), commonProperties.getSecretKey(), embeddingProperties.getBaseUrl(),commonProperties.getBaseUrl(),restClientBuilderProvider.getIfAvailable(RestClient::builder),responseErrorHandler);var embeddingModel = new HunYuanEmbeddingModel(embeddingProperties.getOptions(), retryTemplate,hunyuanApi, embeddingProperties.getMetadataMode(),observationRegistry.getIfUnique(() -> ObservationRegistry.NOOP));observationConvention.ifAvailable(embeddingModel::setObservationConvention);return embeddingModel;
}

这样一来,我们基本上已经完成了Spring-AI-Hunyuan中向量化功能的集成和配置工作,确保了系统能够顺利进行向量化处理,并与其他模块良好协作。接下来的步骤便是编写单元测试,由于单元测试的编写较为标准且常见,这部分内容就不再详细赘述。

小结

在本次更新中,我们进一步优化了spring-ai-hunyuan项目,新增了向量化功能。首先,我们对接了腾讯API,通过修改HunYuanAPI类来支持不同接口的调用,确保请求头能够正确区分接口类型。接着,我们处理了输入输出参数的管理,将数据以数组形式传递,并适应Spring AI的处理机制。同时,完成了Spring Boot自动配置,确保向量化功能能够顺利运行并与其他模块协同工作。


我是努力的小雨,一个正经的 Java 东北服务端开发,整天琢磨着 AI 技术这块儿的奥秘。特爱跟人交流技术,喜欢把自己的心得和大家分享。还当上了腾讯云创作之星,阿里云专家博主,华为云云享专家,掘金优秀作者。各种征文、开源比赛的牌子也拿了。

💡 想把我在技术路上走过的弯路和经验全都分享出来,给你们的学习和成长带来点启发,帮一把。

🌟 欢迎关注努力的小雨,咱一块儿进步!🌟

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/908484.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何选择合适的数据同步软件,提升企业业务效率和数据管理能力?

数据同步软件对企业提升决策效率、优化客户体验、保障运营稳定性等诸多方面都有显著好处,可以实时洞察业务状况,及时发现问题与机会,提升风险控制能力,保障数据一致性,优化资源配置,促进团队协作。一、应用场景 通常金融、电商、医疗、制造等行业的企业会有数据同步的需求…

2. RabbitMQ 的详细安装步骤(两种方式,第一种:yum 安装;第二种:docker 容器安装)

2. RabbitMQ 的详细安装步骤(两种方式,第一种:yum 安装;第二种:docker 容器安装) @目录2. RabbitMQ 的详细安装步骤(两种方式,第一种:yum 安装;第二种:docker 容器安装)1. 第一种方式:yum 安装 RabbitMQ 的详细步骤:1.1 安装 RabbitMQ web 管理插件1.2 在 RabbitMQ …

20244221李留斌《python程序设计》实验报告

20244104 2024-2025-2 《Python程序设计》实验x报告 课程:《Python程序设计》 班级:2442 姓名:李留斌 学号:20244221 实验教师:王志强 实验日期:2025年3月23日 必修/选修: 公选课 一、实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能; 3.编写程序,练习…

【分享】Ftrans内外网文件摆渡系统:让数据传输更安全更可靠!

随着大数据时代的到来,数据的重要性日渐得到重视,数据作为数字经济时代下的基础性资源和战略性资源,是决定国家经济发展水平和竞争力的核心驱动力。以行业为维度来看,数据泄露已发生在并影响了各个行业,全球范围内,各行业发生数据泄露的数量和损失都在增加。很多企业为了…

地球无法承受 AI,是时候踩刹车了

作者:Kollibri terre Sonnenblume公有领域艺术作品,作者提供,来自公共领域元素。**前言: **如果你不想阅读完整篇,这里是本篇的作者的核心观点:人工智能(AI)虽然在技术上有巨大的潜力,但它对环境的负面影响极其严重,可能加剧当前面临的多重危机,如气候变化、资源枯竭…

VMware ESXi 8.0U3d macOS Unlocker OEM BIOS 集成驱动版,新增 12 款 I219 网卡驱动

VMware ESXi 8.0U3d macOS Unlocker & OEM BIOS 集成驱动版,新增 12 款 I219 网卡驱动VMware ESXi 8.0U3d macOS Unlocker & OEM BIOS 集成驱动版,新增 12 款 I219 网卡驱动 VMware ESXi 8.0U3d macOS Unlocker & OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版…

Gitea Enterprise 23.6.0 (Linux, macOS, Windows) - 本地部署的企业级 Gti 服务

Gitea Enterprise 23.6.0 (Linux, macOS, Windows) - 本地部署的企业级 Gti 服务Gitea Enterprise 23.6.0 (Linux, macOS, Windows) - 本地部署的企业级 Gti 服务 The Premier Enterprise Solution for Self-Hosted Git Service 请访问原文链接:https://sysin.org/blog/gitea/…

Autodesk Maya 2026 Multilanguage (macOS, Windows) - 三维动画和视觉特效软件

Autodesk Maya 2026 Multilanguage (macOS, Windows) - 三维动画和视觉特效软件Autodesk Maya 2026 Multilanguage (macOS, Windows) - 三维动画和视觉特效软件 三维计算机动画、建模、仿真和渲染软件 请访问原文链接:https://sysin.org/blog/autodesk-maya/ 查看最新版。原创…

Autodesk AutoCAD 2026 (macOS, Windows) - 自动计算机辅助设计软件

Autodesk AutoCAD 2026 (macOS, Windows) - 自动计算机辅助设计软件Autodesk AutoCAD 2026 (macOS, Windows) - 自动计算机辅助设计软件 计算机辅助设计 (CAD) 软件 请访问原文链接:https://sysin.org/blog/autodesk-autocad/ 查看最新版。原创作品,转载请保留出处。 作者主页…

VMware Aria Operations for Logs 8.18.3 新增功能简介

VMware Aria Operations for Logs 8.18.3 新增功能简介VMware Aria Operations for Logs 8.18.3 - 集中式日志管理 请访问原文链接:https://sysin.org/blog/vmware-aria-operations-for-logs/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org集中式日志管理 VMwa…

在 VS Code 中,一键安装 MCP Server!

大家好!我是韩老师。 本文是 MCP 系列文章的第三篇。之前的两篇文章是: Code Runner MCP Server,来了! 从零开始开发一个 MCP Server!经过之前两篇文章的介绍,相信不少童鞋已经用上甚至开发起了第一个 MCP Server。 不过呢,还是遇到一些童鞋在安装/配置 MCP Server 的时…

读DAMA数据管理知识体系指南36元数据管理概念(上)

读DAMA数据管理知识体系指南36元数据管理概念(上)1. 业务驱动因素 1.1. 可靠且良好管理元数据有助于1.1.1. 通过提供上下文语境和执行数据质量检查提高数据的可信度1.1.2. 通过扩展用途增加战略信息(如主数据)的价值1.1.3. 通过识别冗余数据和流程提高运营效率1.1.4. 防止使…