2024版本idea集成SpringBoot + Ai 手写一个chatgpt 【推荐】

题目:SpringBoot + OpenAi

在这里获取key和url:获取免费key
在这里插入图片描述
base-url为这两个:
在这里插入图片描述

在这里插入图片描述
话不多说直接来!

一、简介

Spring AI 是 AI 工程的应用框架。其目标是将 Spring 生态系统设计原则(如可移植性和模块化设计)应用于 AI,并推广使用 POJO 作为 AI 领域应用程序的构建块。

跨 AI 提供商的可移植 API 支持,适用于聊天、文本到图像和嵌入模型。支持同步和流 API 选项。还支持下拉以访问特定于模型的功能

二、Ai聊天程序代码

1、 创建项目工程

  • 在父工程下面创建新的模块

在这里插入图片描述

  • 勾选上依赖然后创建

在这里插入图片描述

  • 具体的依赖如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.4</version><relativePath/> <!-- lookup parent from repository --></parent><!-- Generated by https://start.springboot.io --><!-- 优质的 spring/boot/data/security/cloud 框架中文文档尽在 => https://springdoc.cn --><groupId>com.ysl</groupId><artifactId>SpringAi</artifactId><version>0.0.1-SNAPSHOT</version><packaging>pom</packaging><name>SpringAi</name><description>SpringAi</description><modules><module>spring-ai-01-chat</module></modules><properties><java.version>17</java.version>
<!--        快照版本--><spring-ai.version>1.0.0-SNAPSHOT</spring-ai.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>
<!--    相当于继承一个父项目:spring-ai-bom--><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><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><image><builder>paketobuildpacks/builder-jammy-base:latest</builder></image><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build><!--~配置本项目的仓库:因maven中心仓库还设有更新spring ai的jar包--><repositories><repository>
<!--            里程碑版本releases的仓库,改成快照版本的snapshot--><id>spring-snapshot</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>false</enabled></releases></repository></repositories></project>
  • 编写yml配置

在这里插入图片描述

  • openai有自动配置类OpenAiAutoConfiguration
    在这里插入图片描述
    其中有聊天客户端,图片客户端…等(看下面源码)
//聊天客户端
@Bean@ConditionalOnMissingBean@ConditionalOnProperty(prefix = OpenAiChatProperties.CONFIG_PREFIX, name = "enabled", havingValue = "true",matchIfMissing = true)public OpenAiChatClient openAiChatClient(OpenAiConnectionProperties commonProperties,OpenAiChatProperties chatProperties, RestClient.Builder restClientBuilder,List<FunctionCallback> toolFunctionCallbacks, FunctionCallbackContext functionCallbackContext,RetryTemplate retryTemplate, ResponseErrorHandler responseErrorHandler) {var openAiApi = openAiApi(chatProperties.getBaseUrl(), commonProperties.getBaseUrl(),chatProperties.getApiKey(), commonProperties.getApiKey(), restClientBuilder, responseErrorHandler);if (!CollectionUtils.isEmpty(toolFunctionCallbacks)) {chatProperties.getOptions().getFunctionCallbacks().addAll(toolFunctionCallbacks);}return new OpenAiChatClient(openAiApi, chatProperties.getOptions(), functionCallbackContext, retryTemplate);}
//图片客户端
@Bean@ConditionalOnMissingBean@ConditionalOnProperty(prefix = OpenAiImageProperties.CONFIG_PREFIX, name = "enabled", havingValue = "true",matchIfMissing = true)public OpenAiImageClient openAiImageClient(OpenAiConnectionProperties commonProperties,OpenAiImageProperties imageProperties, RestClient.Builder restClientBuilder, RetryTemplate retryTemplate,ResponseErrorHandler responseErrorHandler) {String apiKey = StringUtils.hasText(imageProperties.getApiKey()) ? imageProperties.getApiKey(): commonProperties.getApiKey();String baseUrl = StringUtils.hasText(imageProperties.getBaseUrl()) ? imageProperties.getBaseUrl(): commonProperties.getBaseUrl();Assert.hasText(apiKey, "OpenAI API key must be set");Assert.hasText(baseUrl, "OpenAI base URL must be set");var openAiImageApi = new OpenAiImageApi(baseUrl, apiKey, restClientBuilder, responseErrorHandler);return new OpenAiImageClient(openAiImageApi, imageProperties.getOptions(), retryTemplate);}

二、一个简单的示例

1、直接写一个Controller层就可以

package com.ysl.controller;import jakarta.annotation.Resource;
import org.springframework.ai.chat.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.openai.OpenAiChatClient;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;/**
* @Author Ysl
* @Date 2024/5/11
* @name SpringAi
**/
@RestController
public class ChatController {/*** OpenAi自动装配,可以直接注入使用*/@Resourceprivate OpenAiChatClient openAiChatClient;/*** 调用OpenAi的接口,call方法为同步的api* @param msg 你要问的问题* @return*/@RequestMapping ("/ai/chat")public String chat(@RequestParam("msg") String msg) {String call = openAiChatClient.call(msg);return call;}/*** 调用OpenAi的接口* @param msg 你要问的问题* @return  Object--json对象*/@RequestMapping ("/ai/chat1")public Object chat1(@RequestParam("msg") String msg) {ChatResponse response = openAiChatClient.call(new Prompt(msg));return response;
//        return response.getResult().getOutput().getContent();//只拿到内容}/*** 调用OpenAi的接口* @param msg 你要问的问题* @return*/@RequestMapping ("/ai/chat3")public String chat3(@RequestParam("msg") String msg) {//可选参数在yml配置,同时在代码中也配置,那么会以代码为准ChatResponse response = openAiChatClient.call(new Prompt(msg, OpenAiChatOptions.builder()
//                .withModel("gpt-4")//使用的模型.withTemperature(0.3F)//温度越高回答越慢,温度越低回答越快.build()));return response.getResult().getOutput().getContent();}/*** 调用OpenAi的接口 stream是流式的api* @param msg 你要问的问题* @return*/@RequestMapping ("/ai/chat4")public Object chat4(@RequestParam("msg") String msg) {//可选参数在yml配置,同时在代码中也配置,那么会以代码为准Flux<ChatResponse> flux = openAiChatClient.stream(new Prompt(msg, OpenAiChatOptions.builder()
//                .withModel("gpt-3.5")//使用的模型.withTemperature(0.3F)//温度越高回答越慢,温度越低回答越快.build()));flux.toStream().forEach(chatResponse ->{System.out.println(chatResponse.getResult().getOutput().getContent());});return flux.collectList();//数据的序列}
}

2、直接在浏览器访问

  • http://localhost:8080/ai/chat?msg=24年经济形势
    在这里插入图片描述
  • http://localhost:8080/ai/chat1?msg=24年经济形势
  • http://localhost:8080/ai/chat3?msg=java怎么学
    在这里插入图片描述
    OpenAi聊天客户端就写到这里,接下来是图片客户端。

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

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

相关文章

软件工程基础知识,软考选择题的重点

本篇知识来自&#xff1a;软件设计师考试同步辅导 ---考点。。。。。&#xff0c;钟彩华 博伟玉 清华出版社&#xff0c;那本书。仅供学习。以下理解都是本人自己认为的。仅供参考。 本书的第132页&#xff0c;第五章知识。 目录 软件工程叙述 软件的生命周期 软件过程 软…

共用nacos造成的开发问题记录

目录 1.需求提出 2.系统架构 3.问题抛出 4.解决办法 1.配置私有命名空间 2.给服务加后缀 1.需求提出 本地调试用到哪个服务启动哪个服务&#xff0c;其他支持服务调用测试环境上的&#xff0c;目的是避免本地启动多个服务&#xff0c;消耗电脑配置。 2.系统架构 项目是…

TCP的延时应答和捎带应答详解

一、延时应答 延时应答是指TCP接收方在接收到数据包后&#xff0c;并不立即发送确认&#xff08;ACK&#xff09;消息&#xff0c;而是等待一段时间&#xff0c;以期望在该时间段内收到更多的数据包&#xff0c;从而实现合并多个ACK消息为一个&#xff0c;减少网络中的确认消息…

PACS医学影像系统全套源码 适应对象:综合医院、军医院中医院、妇幼保健院、专科医院

技术栈 开发语言 : C语言 数据库 : MSSQL 开发工具 : VC 源码类型 : WinForm 适应对象 综合医院 军医院 中医院 妇幼保健院 专科医院 系统框架 云架构、云计算、云存储 平台采用先进的云架构设计&#xff0c;通过云计算、云存储技术让平台低成本、高安全、速度快。 标…

多功能投票小程序基于ThinkPHP+FastAdmin+Uniapp(源码搭建/上线/运营/售后/维护更新)

基于ThinkPHPFastAdminUniapp开发的多功能系统&#xff0c;支持图文投票、自定义选手报名内容、自定义主题色、礼物功能(高级授权)、弹幕功能(高级授权)、会员发布、支持数据库私有化部署&#xff0c;Uniapp提供全部无加密源码。 功能特性

Linux —— 信号(4)

Linux —— 信号&#xff08;4&#xff09; 信号的处理用户态和内核态 信号的捕捉sigaction sa_mask字段volatileSIGCHLD信号 我们今天接着来看信号&#xff1a; 信号的处理 信号的处理简单一句话就是在内核态处理的。 用户态和内核态 用户态和内核态是操作系统和计组中的概…

Python快速入门-零基础也能掌握的编程技巧,基础方法和API整理

目录 前言 数据结构 数字 数学运算 随机数 字符串 列表 元组 字典 面向对象 JSON 文件操作 扩展 制作一个简易时钟 前言 环境什么就不在赘述&#xff0c;可以参考其他文章&#xff0c;也可以在线运行 CSDN在线运行地址&#xff1a;InsCode - 让你的灵感立刻落地…

优化资源利用,用C++内存池点亮编程之路

内存池介绍(Memory Pool): 它是一种内存分配方式&#xff0c;通过预先分配和复用内存块。 在真正使用内存之前&#xff0c;先申请一大块内存备用。当有新的内存需求时&#xff0c;就从内存池中分出一部分内存块&#xff0c; 若内存块不够再继续申请新的内存。如果我们不需要…

Linux学习笔记7---仿STM32自建寄存器库

为了开发方便&#xff0c;ST 官方为 STM32F103 编写了一个叫做 stm32f10x.h 的文件&#xff0c;在这个文件里面定义了 STM32F103 所有外设寄存器。而有些芯片是没有这种寄存器库的&#xff0c;在没有的情况下要学会自己建立一个寄存器库。NXP 官方并没有为 I.MX6UL 编写类似 st…

大模型微调之 在亚马逊AWS上实战LlaMA案例(十)

大模型微调之 在亚马逊AWS上实战LlaMA案例&#xff08;十&#xff09; 训练数据集格式 SageMaker JumpStart 目前支持域适应格式和指令调整格式的数据集。在本节中&#xff0c;我们指定两种格式的示例数据集。有关更多详细信息&#xff0c;请参阅附录中的数据集格式化部分。 …

嵌入式 - GPIO编程简介

An Introduction to GPIO Programming By Jeff Tranter Wednesday, June 12, 2019 编者按&#xff1a;本 2019 年博客系列是 ICS 最受欢迎的系列之一&#xff0c;现已更新&#xff08;2022 年 12 月&#xff09;&#xff0c;以确保内容仍然准确、相关和有用。 本博客是 Integr…

VBA_MF系列技术资料1-605

MF系列VBA技术资料1-605 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-0…