java脚手架系列16-AI大模型集成

news/2024/11/26 10:09:29/
aidu_pl">

之所以想写这一系列,是因为之前工作过程中有几次项目是从零开始搭建的,而且项目涉及的内容还不少。在这过程中,遇到了很多棘手的非业务问题,在不断实践过程中慢慢积累出一些基本的实践经验,认为这些与业务无关的基本的实践经验其实可以复刻到其它项目上,在行业内可能称为脚手架,因此决定将此java基础脚手架的搭建总结下来,分享给大家使用。

注意由于框架不同版本改造会有些使用的不同,因此本次系列中主要使用基本框架是 spring-boo-2.3.12.RELEASE和spring-cloud.-Hoxton.SR12,所有代码都在commonFramework项目上:https://github.com/forever1986/commonFramework/tree/master

目录

  • 1 AI 集成
    • 1.1 代码演示
      • 1.1.1 新建ai-biz子模块,引入以下依赖
      • 1.1.2 配置通义千问的配置
      • 1.1.3 定义读取配置的QwenConfigProperties
      • 1.1.4 定义controller接口
      • 1.1.5 测试访问

1 AI 集成

目前的大模型已经具备很好的通用能力,基于大模型的落地应用也接连变成可行性,因此在java后端集成大模型能力也是必不可少。市面上的大模型有很多,其实能力差不多,如果直接使用作为应用可能还达不到商业需求,那么一般我们会做prompt、微调、RAG(可参考我的写的博客《检索增强生成RAG系列》)、KAG等不同手段增强实际场景的准确率,从而达到可应用级。
而在java后端中,一般通过调用其提供的生成能力集成。大模型一般提供2种方式集成,一个是通过API接口,一个是通过SDK。其中SDK每个厂家都会发布,而spring-AI有一个统一规范。基于spring-AI这个规范,厂家也会制定一个starter方式使得开发者很方便。spring-AI对环境(JDK17及以上)和框架(springboot3.2及以上)要求比较高,由于我们的commonFramework是基于jdb1.8以及springboot2.x,因此本次演示使用厂家发布的SDK。

1.1 代码演示

这里访问通义千问大模型,使用其发布的SDK :dashscope-sdk-java
先决条件:在阿里云的百炼平台申请API-KEY

参考ai-biz子模块

aibiz_12">1.1.1 新建ai-biz子模块,引入以下依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>dashscope-sdk-java</artifactId><version>2.14.4</version></dependency>
</dependencies>

1.1.2 配置通义千问的配置

在yaml文件中配置senders

server:port: 9986
spring:application:name: ai-biz-serviceai:qwen:api-key : 你的API-KEY(在阿里云的百炼平台申请一个)chat:options:systeMessage : 你是一个问答小助手!model : qwen-turbotemperature : 0.7

1.1.3 定义读取配置的QwenConfigProperties

java">@ConfigurationProperties(prefix = "spring.ai.qwen.chat.options"
)
@Data
@NoArgsConstructor
public class QwenConfigProperties {private String systeMessage = "";private String model = "";private Float temperature = 0.9f;}

1.1.4 定义controller接口

java">@EnableConfigurationProperties(QwenConfigProperties.class)
@RestController
public class AIController {@Value("${spring.ai.qwen.api-key}")private String apiKey = "";@Autowiredprivate QwenConfigProperties qwenConfigProperties;@GetMapping("/ai/generate")public String generate(@RequestParam(value = "message", defaultValue = "你是谁?") String message) throws NoApiKeyException, InputRequiredException {Generation gen = new Generation();Message systemMsg = Message.builder().role(Role.SYSTEM.getValue()).content(qwenConfigProperties.getSysteMessage()).build();Message userMsg = Message.builder().role(Role.USER.getValue()).content(message).build();GenerationParam param = GenerationParam.builder().apiKey(apiKey).model(qwenConfigProperties.getModel()).temperature(qwenConfigProperties.getTemperature()).messages(Arrays.asList(systemMsg, userMsg)).resultFormat(GenerationParam.ResultFormat.MESSAGE).build();GenerationResult result = gen.call(param);GenerationOutput output = result.getOutput();return output.getChoices().get(0).getMessage().getContent();}}

1.1.5 测试访问

访问测试


http://www.ppmy.cn/news/1550031.html

相关文章

优化Docker镜像:提升部署效率与降低资源消耗

目录 1. 最小化镜像层 2. 使用轻量级基础镜像 3. 多阶段构建 4. 清理不必要的文件和依赖 5. 使用.dockerignore文件 6. 压缩和优化文件系统 7. 外部化配置和数据 8. 限制容器资源 9. 定期清理未使用的镜像和容器 结论 在云计算和微服务架构的浪潮中&#xff0c;Docke…

Spire.PDF for .NET【页面设置】演示:打开 PDF 时自动显示书签或缩略图

用户打开 PDF 文档时&#xff0c;他们会看到 PDF 的初始视图。默认情况下&#xff0c;打开 PDF 时不会显示书签面板或缩略图面板。在本文中&#xff0c;我们将演示如何设置文档属性&#xff0c;以便每次启动文件时都会打开书签面板或缩略图面板。 Spire.PDF for .NET 是一款独…

QT简易项目 数据库可视化界面 数据库编程SQLITE QT5.12.3环境 C++实现

案例需求&#xff1a; 完成数据库插入&#xff0c;删除&#xff0c;修改&#xff0c;查看操作。 分为 插入&#xff0c;删除&#xff0c;修改&#xff0c;查看&#xff0c;查询 几个模块。 代码&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget…

最小生成树——Prim和Kruskal算法

这个算法和Prim用法是一致的&#xff0c;但是得到的方式却大不相同&#xff0c;Prim是找任意一个结点连着的最小的边&#xff0c;从而不断更新到达各个结点的最小花费。时间复杂度是&#xff1a;O(n*n)&#xff0c;更适合稠密图; 而Kruskal算法是找到最小的边&#xff0c;看这…

算法编程题-寻找最近的回文数

算法编程题-寻找最近的回文数 原题描述思路简述代码实现复杂度分析参考 摘要&#xff1a;本文将对LeetCode 原题 564 寻找最近的回文数进行讲解&#xff0c;并且给出golang语言的实现&#xff0c;该实现通过了所有测试用例且执行用时超过100%的提交&#xff0c;最后给出相关的复…

非递归遍历二叉树(数据结构)

我的博客主页 非递归遍历二叉树 前序遍历&#xff08;迭代&#xff09;中序遍历&#xff08;迭代&#xff09;后续遍历&#xff08;迭代&#xff09; 二叉树的遍历方式有&#xff1a;前序遍历、中序遍历、后续遍历&#xff0c;层序遍历&#xff0c;而树的大部分情况下都是通过递…

YOLO 从标注到模型训练与检测

本篇文章将带你从数据标注开始&#xff0c;经过数据集转换和划分&#xff0c;最后训练 YOLO 模型并进行检测。包括必要的代码示例&#xff0c;以及路径和文件的详细说明&#xff0c;以帮助你完成整个流程。 1. 数据标注 首先&#xff0c;我们需要对目标检测的数据进行标注。这…

lvgl学习复选框部件和进度条部件(基于正点原子)

复选框部件&#xff08;lv_checkbox&#xff09; 复选框部件常用于选择某个内容的开启和关闭&#xff0c;可以理解为自带标签的开关。 复选框部件组成部分&#xff1a; 主体(LV_PART_MAIN) 勾选框(LV PART INDICATOR) 知识点1&#xff1a;创建复选框部件 lv_obj_t *check…