Java对接AI大模型

随着AI大模型技术的升起,人们越来越感觉到生活上的便捷以及人机对话照进现实.什么是大模型呢?

大模型(Large Model),通常是指参数量非常庞大的深度学习模型,特别是在自然语言处理(NLP)、计算机视觉(CV)等领域中,模型参数数量达到数十亿甚至数千亿的规模。

为了弥补Java在AI领域的工具短板,现在市面上出现了几款针对Java的AI开发工具.

一. AI开发工具

1.1 LangChain4J

  • 提供标准化API,支持超过15个主流大模型提供商和嵌入存储,
  • 提供工具箱,从低级提示词模板到高级AI服务,适合构建聊天机器人和检索增强生成(RAG)管道。
  • 社区支持活跃,能够快速整合最新的AI技术,便于Java开发者将AI功能集成到现有项目中

1.2 Spring Al

  • 深度集成到Spring框架中,Java开发者可以轻松将AI功能嵌入到现有Spring项目中。
  • 尽管Spring Al仍处于发展阶段,尚未发布正式版本,但其凭借Spring生态系统,具备了极强的扩展 性和集成能力。

1.3 Spring AI Alibaba

  • 提供多种大模型服务对接能力,包括主流开源与阿里云通义大模型服务(百炼)等 支持的模型类型包括聊天、文生图、音频转录、文生语音等

本文详解Langchain4j的使用.

二. 基本使用

由于现在Java开发都是基于SpringBoot整合开发,所以langchain4j也提供了对应的依赖包.除此我们也需要引入web的依赖

<dependencies><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-open-ai-spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>

版本管理

<properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><spring-boot.version>3.3.4</spring-boot.version>
</properties><dependencyManagement><dependencies><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-bom</artifactId><version>0.35.0</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

接下来我们需要注入对话服务的模型,这列我们以阿里百炼的模型作为基础模型.

2.1 环境准备

在引入百炼的大模型前,我们需要配置一些环境.访问百炼大模型的官网.

阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

我们需要获取一个API-KEY

然后这里可能需要你去充值,不用充值多了,几块就够啦.然后我们去到模型广场

点击查看详情.获取到model-name和baseUrl

获取到,去SpringBoot的application.yml配置文件配置

langchain4j:open-ai:chat-model:api-key: 你的api-keymodel-name: qwen-maxbase-url: 对应的url

LangChain4j本身提供了一个语言模型(ChatLanguageModel),我们注入使用即可,创建一个Controller类测试

@RestController
public class ChatController {ChatLanguageModel chatLanguageModel;public ChatController(ChatLanguageModel chatLanguageModel) {this.chatLanguageModel = chatLanguageModel;}@GetMapping("/chat")public String model(@RequestParam(value = "message", defaultValue = "Hello") String message) {return chatLanguageModel.generate(message);}
}

调用Postman或者其他测试工具测试

完成基本的模型对接使用.

三.常规使用

3.1 配置类配置

刚刚我们是基于yml配置文件配置的,实际上我们还可以通过配置类来完成配置.

@Configuration
public class LLMConfig {/*** 构建 LLM 模型* @return*/@Beanpublic ChatLanguageModel chatLanguageModel(){return OpenAiChatModel.builder().apiKey("").modelName("qwen-max").baseUrl("").build();}
}

3.2 AI-Service

之前这种自动注入LangChain4j给我们提供的类来完成模型调用,不太灵活,我们若想不同的服务使用不同的大模型,这种方式就不太可取,实际上他还提供了AI-Service的工具类来帮助我们可以灵活更换大模型.

编写一个接口

public interface IChatAssistant {String chat(String message);
}

我们修改一下我们的配置类

@Configuration
public class LLMConfig {/*** 构建 LLM 模型* @return*/@Beanpublic ChatLanguageModel chatLanguageModel(){return OpenAiChatModel.builder().apiKey("").modelName("qwen-max").baseUrl("").build();}/*** 构建 LLM 服务,AI助手,基于配置的大模型来使用* @return*/@Beanpublic IChatAssistant chatAssistant(){return AiServices.builder(IChatAssistant.class).chatLanguageModel(chatLanguageModel()).build();}
}

测试,依旧能够访问

3.3 日志打印

去执行上述测试的小伙伴应该发现了,控制台没有任何的日志输出,我们不知道用户具体输入了什么,对于排查问题来讲肯定是不友好的.Langchain4j为我们提供了日志的开关,让我们可以查看到日志的打印.

修改yml配置文件

logging:level:dev:langchain4j: DEBUGai4j:openai4j: DEBUG

修改配置类

/*** 构建 LLM 模型* @return*/
@Bean
public ChatLanguageModel chatLanguageModel(){return OpenAiChatModel.builder().apiKey("").modelName("qwen-max")// 是否打印请求日志.logRequests(true)// 是否打印响应日志.logResponses(true).baseUrl("").build();
}

当然还有一步,Langchain4j是基于SLF4j的日志框架,所以我们需要引入logback日志框架

<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.5.8</version>
</dependency>

测试,控制台打印

3.4 流式响应

测试过后的同学应该发现了,我们需要等待很久,最后才把输出的结果给到我们.这样对用户的体验肯定是不友好的.我们平常使用的一些ai大模型,是可以感受到他是慢慢的打印出来回复你的答案,而不是一口气讲所有的文本返回回来.

Langchain4j也为我们提供了这样的流式响应的功能.我们需要引入新的依赖

<dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-reactor</artifactId><version>0.35.0</version>
</dependency>

然后需要引入新的配置,Langchain4j提供了流式大模型.我们什么都不用改,只需要修改注入的类就行,其他的配置与原来的相同.以及再配置一个AI-Service.

@Bean
public StreamingChatLanguageModel streamingChatLanguageModel(){return OpenAiStreamingChatModel.builder().apiKey("").modelName("qwen-max")// 是否打印请求日志.logRequests(true)// 是否打印响应日志.logResponses(true).baseUrl("").build();
}
@Bean
public IChatStreamAssistant chatStreamAssistant(){return  AiServices.builder(IChatStreamAssistant.class).streamingChatLanguageModel(streamingChatLanguageModel()).build();
}

对接的AI-Service需要修改其的返回类型.

package org.kuchen.service;import reactor.core.publisher.Flux;/*** @author kuchen*/
public interface IChatStreamAssistant {Flux<String> chat(String message);
}

controller层编写

我们可以去浏览器直观的感受,流式响应的效果

流式响应

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

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

相关文章

Java开发网络安全常见问题

1、敏感信息明文传输 用户敏感信息如手机号、银行卡号、验证码等涉及个人隐私的敏感信息不通过任何加密直接明文传输。 如下图中小红书APP 的手机短信验证码登录接口&#xff0c;此处没有对用户手机号和验证码等信息进行加密传输&#xff0c;可以很简单的截取并开展一些合法的…

【CSS in Depth 2 精译_063】10.2 深入理解 CSS 容器查询中的容器

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第十章 CSS 容器查询】 ✔️ 10.1 容器查询的一个简单示例 10.1.1 容器尺寸查询的用法 10.2 深入理解容器 ✔️ 10.2.1 容器的类型 ✔️10.2.2 容器的名称 ✔️10.2.3 容器与模块化 CSS ✔️ 10.3…

基于Springboot开发的时光兼职网

一、功能介绍 时光兼职网包含管理员、用户、商家三个角色以及前后台系统。 前台系统功能 首页、兼职信息推荐、查看更多等 职位申请、申请日期、上传简历、点击下载简历、留言反馈等 个人中心、上传图片、更新信息等 后台系统功能 用户登录&#xff1a; 个人中心、修改密码…

计算机的错误计算(一百七十一)

摘要 探讨 MATLAB 中秦九韶&#xff08;Horner&#xff09;多项式的错误计算。 例1. 用秦九韶&#xff08;Horner&#xff09;算法计算&#xff08;一百零七&#xff09;例1中多项式 直接贴图吧&#xff1a; 这样&#xff0c;MATLAB 给出的仍然是错误结果&#xff0c;因为准…

代码美学3:RGB转化+MATLAB制作渐变色

RGB颜色转化器&#xff08;转换成matlab可以读取的形式&#xff09; n input(请输入 n&#xff1a;); color_matrix cell(1, n); for i 1:nR input(请输入 R 值&#xff1a;);G input(请输入 G 值&#xff1a;);B input(请输入 B 值&#xff1a;);color_matrix{i} [R/2…

kafka数据在服务端时怎么写入的

学习背景 接着上篇&#xff0c;我们来聊聊kafka数据在服务端怎么写入的 服务端写入 在介绍服务端的写流程之前&#xff0c;我们先要理解服务端的几个角色之间的关系。 假设我们有一个由3个broker组成的kafka集群&#xff0c;我们在这个集群上创建一个topic叫做shitu-topic&…

rabbitmq原理及命令

目录 一、RabbitMQ原理1、交换机&#xff08;Exchange&#xff09;fanoutdirecttopicheaders&#xff08;很少用到&#xff09; 2、队列Queue3、Virtual Hosts4、基础对象 二、RabbitMQ的一些基本操作:1、用户管理2、用户角色3、vhost4、开启web管理接口5、批量删除队列 一、Ra…

Kali Linux怎么开python虚拟环境

相信很多朋友再学习的过程中都会遇到一些pip失效&#xff0c;或者报错的时候&#xff0c;他们要求我们要使用虚拟环境&#xff0c;但是不知道怎么搭建&#xff0c;下面这篇文章就来告诉你如何搭建虚拟环境&#xff0c;这个方法在所有Linux的服务器都通用&#xff0c;就两行命令…

【博主推荐】C# Winform 拼图小游戏源码详解(附源码)

文章目录 前言摘要1.设计来源拼图小游戏讲解1.1 拼图主界面设计1.2 一般难度拼图效果1.3 普通难度拼图效果1.4 困难难度拼图效果1.5 地域难度拼图效果1.6 内置五种拼图效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载结束语 前言 在数字浪潮汹涌澎湃的时代&#xff0c;程序开…

React Native学习笔记(三)

一 组件简介 1.1 简介 RN中的核心组件&#xff0c;是对原生组件的封装 原生组件&#xff1a;Android或ios内的组件核心组件&#xff1a;RN中常用的&#xff0c;来自react-native的组件 原生组件 在 Android 开发中是使用 Kotlin 或 Java 来编写视图&#xff1b;在 iOS 开发…

视觉语言动作模型VLA的持续升级:从π0之参考基线Octo到OpenVLA、TinyVLA、DeeR-VLA、3D-VLA

第一部分 VLA模型π0之参考基线Octo 1.1 Octo的提出背景与其整体架构 1.1.1 Octo的提出背景与相关工作 许多研究使用从机器人收集的大量轨迹数据集来训练策略 从早期使用自主数据收集来扩展策略训练的工作[71,48,41,19-Robonet,27,30]到最近探索将现代基于transformer的策略…

C与指针。

目录 1_指针理解 1.1变量的值 1.2变量的地址 1.3指针 1.4取变量的地址 2_分析指针 2.1分析指针变量的要素 2.2根据需求定义指针变量 3_指针的使用 3.1指针对变量的读操作 3.2指针对变量的写操作 4_指针占用空间的大小与位移 4.1指针占用空间的大小 4.2指针的位移…

单片机学习笔记 15. 串口通信(理论)

更多单片机学习笔记&#xff1a;单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…

树莓派5+文心一言 -> 智能音箱

一、简介 效果&#xff1a;运行起来后&#xff0c;可以连续对话 硬件&#xff1a;树莓派5、麦克风、音箱&#xff0c;成本500-1000 软件&#xff1a;snowboy作为唤醒词、百度语音作为语音识别、brain作为指令匹配、百度文心一言作为对话模块、微软的edge-tts语音合成... 二…

SAP SD学习笔记17 - 投诉处理3 - Credit/Debit Memo依赖,Credit/Debit Memo

上一章讲了 请求书&#xff08;发票&#xff09;的取消。 SAP SD学习笔记16 - 请求书的取消 - VF11-CSDN博客 再往上几章&#xff0c;讲了下图里面的返品传票&#xff1a; SAP SD学习笔记14 - 投诉处理1 - 返品处理&#xff08;退货处理&#xff09;的流程以及系统实操&#…

Linux服务器使用JupyterLab

一、JupyterLab的配置 1. conda配置 自行搜索conda安装与配置。 2. 环境创建 &#xff08;1&#xff09;创建环境 conda create -n jupyter python3.10&#xff08;2&#xff09;激活环境 conda activate jupyter&#xff08;3&#xff09;安装jupyter包 pip install -i…

Flutter:页面滚动

1、单一页面&#xff0c;没有列表没分页的&#xff0c;推荐使用&#xff1a;SingleChildScrollView() return Scaffold(backgroundColor: Color(0xffF6F6F6),body: SingleChildScrollView(child: _buildView()) );2、列表没分页&#xff0c;如购物车页&#xff0c;每个item之间…

使用GitZip for github插件下载git仓库中的单个文件

背景&#xff1a;git仓库不知道抽什么疯&#xff0c;下载不了单个文件&#xff0c;点击下载没有反应&#xff0c;遂找寻其他方法&#xff0c;在这里简单记录下。 使用GitZip for github插件下载仓库中的单个文件 1、首先在浏览器安装插件&#xff0c;并确保为打开状态。 2、然…

Unet改进57:在不同位置添加SFHF

本文内容:在不同位置添加CBAM注意力机制 论文简介 由于恶劣的大气条件或独特的降解机制,自然图像会遭受各种退化现象。这种多样性使得为各种恢复任务设计一个通用框架具有挑战性。现有的图像恢复方法没有探索不同退化现象之间的共性,而是侧重于在有限的恢复先验下对网络结构…

数据结构(初阶7)---七大排序法(堆排序,快速排序,归并排序,希尔排序,冒泡排序,选择排序,插入排序)(详解)

排序 1.插入排序2.希尔排序3.冒泡排序4.选择排序(双头排序优化版)5.堆排序6.快速排序1). 双指针法2).前后指针法3).非递归法 7.归并排序1).递归版本(递归的回退就是归并)2).非递归版本(迭代版本) 计算机执行的最多的操作之一就有排序&#xff0c;排序是一项极其重要的技能 接下…