Spring Boot 整合 Spring AI 实现项目接入ChatGPT(OpenAl的调用)

news2024/11/15 9:47:07

        当前各种AI项目层出不穷,但绝大多数都是用python写的,现在Spring开源了Spring AI项目,让Java开发者也可以轻松给自己的springboot项目集成AI能力。目前spring AI正式版本为0.8.1,支持接入openAI、Ollama、Azure openAI、Huggingface等,可实现聊天、embedding、图片生成、语音转文字、向量数据库、function calling、prompt模板、outputparser、RAG等功能,就像Java版本的langchain,本文通过一些示例简要介绍部分功能。

一、OpenAI简介

OpenAI是一家致力于推动人工智能发展的研究公司,其目标是确保人工智能的益处广泛而均匀地分布。为了实现这一目标,OpenAI开发了一系列强大的API,供开发者在自己的应用中集成AI功能。

OpenAI的API涵盖了自然语言处理、图像识别、机器翻译等多个领域,其中最为著名的可能是GPT系列模型,它们在文本生成、文本理解等方面表现出色。

二、Spring Boot与OpenAI的无缝对接

Spring Boot是一个流行的Java框架,用于快速开发企业级应用。其简洁的配置和丰富的生态使得Spring Boot成为许多开发者的首选。将Spring Boot与OpenAI对接,可以让你的Java应用轻松拥有AI能力。
 

Spring AI API 涵盖了广泛的功能。每个主要功能都在其专门的部分中进行了详细介绍。为了提供概述,可以使用以下关键功能:

  • 跨 AI 提供商的可移植 API,用于聊天、文本到图像和嵌入模型。支持同步和流 API 选项。还支持下拉访问模型特定功能。我们支持 OpenAI、Microsoft、Amazon、Google、Huggingface 等公司的 AI 模型。

  • 跨 Vector Store 提供商的可移植 API,包括同样可移植的新颖的类似 SQL 的元数据过滤器 API。支持 8 个矢量数据库。

  • 函数调用。Spring AI 使 AI 模型可以轻松调用 POJO java.util.Function 对象。

  • AI 模型和向量存储的 Spring Boot 自动配置和启动器。

  • 数据工程的 ETL 框架。这为将数据加载到矢量数据库提供了基础,有助于实现检索增强生成模式,使您能够将数据引入 AI 模型以纳入其响应中。

第一步:建项目:创建一个Spring Boot项目(JDK17起步);


第二步:加依赖

2.1 加入spring-ai-openai-spring-boot-starter依赖; 
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
2.2 继承父项目:

<dependencyManagement>
    <dependencies>
    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-bom</artifactId>
        <version>${spring-ai.version}</version>
        <type>pom</type>
        <scope>import</scope>
     </dependency>
    </dependencies>
</dependencyManagement>
2.3 配置项目依赖下载的仓库:(因为spring ai在中心仓库还没有依赖,所以需要去网站下载)
<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>


 第三步:配文件(这个的api -key就是你自己的) 

  1. 注册OpenAI账号并获取API密钥

    要使用OpenAI的API,首先需要注册一个OpenAI账号,并在Dashboard中获取你的API密钥。这个密钥将用于后续的API调用中,以验证你的身份。

13k star! 获取免费ChatGPT API Key的开源项目,亲测可用!

spring:
  ai:
    openai:
      api-key:  (换成你的api-key)
      base-url: https://api.openai.com(分为代理地址和直连地址)


第四步: 聊天功能写具体的代码实现

  4.1 因为所有的接口的父接口都继承与Model,可以看到聊天方式的实现就是注入OpenAiChatModel 因为这个springboot自动装配的功能,只需要注入即可

 第一种: 聊天的第一种实现方式(调用call方法,直接传入msg,这个叫做同步API)
public class ChatController {
    @Resource
    private OpenAiChatModel openAiChatModel;
    /**
     * 聊天的方法。底层调用的openAi的方法
     * RequestParam 接受参数
     * msg 就是我们提的问题
     * @return
     */
    @RequestMapping("/ai/chat")
    public String chat(@RequestParam("msg") String msg){
        String called = openAiChatModel.call(msg);
        return called;
    }

   5.1 运行程序结果

 

2. 聊天与prompt template

如果使用openai,就注入openAiChatClient,如果使用ollama,就注入ollamaChatClient,然后调用call方法就可以了。

@Autowired
private ChatClient openAiChatClient;
@Autowired
private ChatClient ollamaChatClient;

@GetMapping("/ai/simple")
public Map<String, String> completion(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
    return Map.of("generation", openAiChatClient.call(message));
}

 

 第二种 聊天的程序的第二种实现方式(调用call方法,new一个Prompt对象再传入msg)
/**
     * 聊天的方法。底层调用的openAi的方法
     * RequestParam 接受参数
     * msg 就是我们提的问题
     * ChatResponse 返回的是一个josn串
     * chatResponse.getResult().getOutput().getContent();只获取文本
     * @return
     */
    @RequestMapping("/ai/chat2")
    public Object chat2(@RequestParam("msg") String msg){
        ChatResponse chatResponse = openAiChatModel.call(new Prompt(msg));
        return chatResponse.getResult().getOutput().getContent();
    }


  6.1  运行程序结果

第三种:聊天的程序的第三种实现方式(比上一个方法多了一个关于gpt参数的设置)
/**
     *OpenAiChatOptions.builder() 传入的一个参数,可以控制大模型的设置
     * @param msg
     * @return
     */
    @RequestMapping("/ai/chat3")
    public Object chat3(@RequestParam("msg") String msg){
        ChatResponse chatResponse = openAiChatModel.call(new Prompt(msg, OpenAiChatOptions.builder()
                //.withModel("gpt-4-32k")  //gpt的版本 ,32K是参数,参数越高,回答问题越准确
                .withTemperature(0.4F)  //温度值,温度越高,回答的准确率越低,温度越低,回答的准确率越高
                .build()));
        return chatResponse.getResult().getOutput().getContent();
    }


7.1 运行程序结果

当然上述的可选参数不仅可以在代码中配置,也可以在配置文件中配置

注意:如果代码中写了关于gpt的参数,配置文件中也配置了参数,那么以代码中为主

第四种:聊天的程序的第三种实现方式(调用stream方法,用法和call一样,只不过返回值不一样,Stream返回的是Fiux,叫做数据的序列一序列的数据,一个一个的数据返回,调用Stream叫做流式API)

/**
     *OpenAiChatOptions.builder() gpt的可选参数
     * @param msg
     * @return
     */
    @RequestMapping("/ai/chat4")
    public Object chat4(@RequestParam("msg") String msg){
        Flux<ChatResponse> flux = openAiChatModel.stream(new Prompt(msg, OpenAiChatOptions.builder()
                //.withModel("gpt-4-32k")  //gpt的版本 ,32K是参数,参数越高,回答问题越准确
                .withTemperature(0.4F)  //温度值,温度越高,回答的准确率越低,温度越低,回答的准确率越高
                .build()));
        return flux.collectList();
    }


上述就是关于Spring Boot 整合 Spring AI 实现项目接入ChatGPT,本文仅介绍了关于聊天方面的实现方式,接下来的文章介绍关于如何生成图片以及语言的转换。

 

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

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

相关文章

流媒体服务器二:2.RTMP协议学习

一 RTMP协议详解 1.总体介绍 RTMP协议是应⽤层协议&#xff0c;是要靠底层可靠的传输层协议&#xff08;通常是TCP&#xff09;来保证信息传输的可靠性的。在 基于传输层协议的链接建⽴完成后&#xff0c;RTMP协议也要客户端和服务器通过“握⼿”来建⽴基于传输层链接之 上的…

ES6之Promise对象

【图书介绍】《Node.jsMongoDBVue.js全栈开发实战》-CSDN博客 《Node.jsMongoDBVue.js全栈开发实战&#xff08;Web前端技术丛书&#xff09;》(邹琼俊)【摘要 书评 试读】- 京东图书 (jd.com) Promise是ES 6中新增的一种异步编程的解决方案&#xff0c;它可以将异步操作队列…

【电路笔记】-无源衰减器总结

无源衰减器总结 文章目录 无源衰减器总结1、概述2、L-型无源衰减器设计3、T-型无源衰减器设计4、桥接 T 型衰减器设计5、π型无源衰减器设计无源衰减器是一个纯电阻网络,可用于控制输出信号的电平。 1、概述 无源衰减器是一种纯电阻网络,用于削弱或“衰减”传输线的信号电平…

基于ssm+vue+uniapp的二手物品交易平台小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

银河麒麟V10早期版本安装deb包解决方案

银河麒麟V10早期版本安装deb包解决方案 1、安装kylin-installer2、注意 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在银河麒麟V10&#xff08;0710版本前&#xff09;&#xff0c;双击.deb包无法直接安装。但只需简单几步&#xff0c;你…

PyTorch深度学习实战(23)—— 用高级索引实现卷积

在深度学习中,最常用的操作是卷积操作。除了调用PyTorch封装好的函数,读者也可以自行编写一个函数实现卷积功能。根据卷积的定义,只需要遍历整个图像,依次获取与卷积核相乘的子块,相乘求和后就可以得到卷积的结果。为了进一步简化计算,可以采用img2col的思路,将整张图像…

基于web的物流管理系统--论文pf

TOC springboot473基于web的物流管理系统--论文pf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人们思想上不可…

k8s基础概念以及部署

kubernetes基础概念 来历 kubernetes以谷歌borg为前身&#xff0c;基于谷歌15年生产环境经验开源的一个项目。k8s是一个开源&#xff0c;的分布式的容器编排技术。 k8s的优势 对比对象 裸容器 例如docker&#xff0c;直接将容器部署在宿主机的方式被称为裸容器。 缺点 纯粹的裸…

性能测试之中间件:什么是 kafka 和 MQ ?

在如今这个数据驱动的时代&#xff0c;中间件在性能测试中扮演着至关重要的角色。你是否曾听说过Kafka和MQ&#xff0c;却不清楚它们在实际应用中具体的作用是什么&#xff1f;让我们一起来揭开它们的神秘面纱。 Kafka和MQ究竟是什么&#xff1f;它们在性能测试中如何发挥作用…

C#基于SkiaSharp实现印章管理(6)

除了文本&#xff0c;印章设计模块的绘图功能已经差不多了。在实现文本绘制之前&#xff08;主要是文本绘制相对比较麻烦&#xff09;&#xff0c;本文先实现将印章导出为pdf或图片的功能。   不论是在控件中绘制&#xff0c;还是在图片或pdf文件中绘制印章&#xff0c;对Ski…

基于web网上村委会业务办理系统pf

TOC springboot472基于web网上村委会业务办理系统pf 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&…

电话机器人解决销售难题

电销机器人简单理解就是替电销人员打电话的机器人&#xff0c;都说是机器人了&#xff0c;全天保持无休状态肯定是不在话下的。智能外呼电话机器人每日通话量大概在800-1000通&#xff0c;一个AI电话机器人就能顶3个销售人员的日通话量了&#xff0c;电话营销机器人能在批量上传…

高校中的电能消耗管理

2013年1月&#xff0c;住建部发布《绿色建筑行动方案》&#xff08;国办发「2013」1号&#xff09;。要求学校、医院等大型公共建筑全面执行绿色建筑标准。安全耐久、生活便利不再是绿色建筑的评价唯一指标&#xff0c;资源节约、环境宜居和健康舒适同样也是绿色建筑的评价指标…

5G+工业互联网产教融合创新实训室解决方案

一、建设背景 随着第五代移动通信技术&#xff08;5G&#xff09;的快速普及和工业互联网的迅猛发展&#xff0c;全球制造业正面临着前所未有的深刻变革。5G技术凭借其超高的传输速率、极低的延迟以及大规模的连接能力&#xff0c;为工业自动化、智能制造等领域带来了革命性的…

【NXP-MCXA153】PWM驱动移植

介绍 ‌PWM&#xff08;‌Pulse Width Modulation&#xff09;‌&#xff0c;‌脉冲宽度调制&#xff0c;‌是一种数字量控制模拟量的技术&#xff0c;‌常用于电机驱动、显示屏背光控制、逆变控制等&#xff1b;NXP-MCXA153开发板上有多路CTimer定时器&#xff0c;可以用来生…

6. 数据结构—串的匹配算法

1.BF算法(暴力算法) //模式匹配(暴力算法) int Index(SString S,SString T){int i1,j1;while(i<S.length&&j<T.length){if(S[i]T[i]){i;j;}else{ii-j2; //最开始匹配的位置的后一个j1; //从头匹配 }}if(j>T.length)return i-T.length;return return 0…

【Vue3】配置路由规则props

【Vue3】配置路由规则props 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的…

Ubuntu启用root用户

1.1 命令行的组成 在启用 root 用户之前&#xff0c;先来了解一下&#xff0c;ubuntu 命令的组成。 打开 ubuntu 的终端&#xff0c;可以看到命令行是由 topeetubuntu:~$ 这几个字母组成&#xff0c;如下图所示&#xff1a; 对应的说明框图如下&#xff1a; 1.2 由普通用户切…

基于机器视觉的智能图像处理与分析系统(MATLAB图片处理,GUI界面)

灰度&#xff0c;二值&#xff0c;去噪&#xff0c;均衡&#xff0c;锐化&#xff0c;截取&#xff0c;边缘检测&#xff0c;都可做。 ☆图像灰度化&#xff0c;二值化 ☆图像相加&#xff0c;相减等 ☆图像旋转&#xff0c;图像裁剪 ☆图像灰度变换&#xff0c;gamma变换&…

Github 2024-08-19 开源项目周报Top15

根据Github Trendings的统计,本周(2024-08-19统计)共有15个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目7JavaScript项目3TypeScript项目3Dart项目2HTML项目1PowerShell项目1Clojure项目1C++项目1Rust项目1Bootstrap 5: Web上开发响应式、…