使用spring-ai快速对接ChatGpt

什么是spring-ai

Spring AI 是一个与 Spring 生态系统紧密集成的项目,旨在简化在基于 Spring 的应用程序中使用人工智能(AI)技术的过程。
简化集成:Spring AI 为开发者提供了方便的工具和接口,使得在 Spring 应用中集成 AI 功能变得更加容易,避免了手动处理底层细节的复杂性。

spring-ai具备什么功能

下面是spring官方文档介绍
Spring AI API 涵盖了广泛的功能。 每个主要功能都在其单独的部分中进行了详细说明。 为了提供概述,提供了以下关键功能:

  • 跨 AI 提供商的可移植 API,用于聊天、文本到图像和嵌入模型。支持同步和流 API 选项。还支持下拉以访问特定于模型的功能。我们支持来自OpenAI,Microsoft,Amazon,Google,Huggingface等的AI模型。
  • 跨 Vector Store 提供程序的可移植 API,包括新颖的类似 SQL 的元数据过滤器 API,该 API 也是可移植的。支持 8 个向量数据库。
  • 函数调用。Spring AI 可以轻松地让 AI 模型调用您的 POJO java.util.Function 对象。
  • AI 模型和矢量存储的 Spring Boot 自动配置和启动器。
  • 用于数据工程的 ETL 框架。这为将数据加载到向量数据库提供了基础,有助于实现检索增强生成模式,使您能够将数据引入 AI 模型以合并到其响应中。

** 总结来说。通过spring-ai的提供的api功能,可以方便的实现大模型相关的相关功能。例如对话,提示,文生图等功能。**
image.png

接入chatGpt

spring-ai官方提供了一个demo
ai-openai-helloworld
这个demo中,可以通过简单的配置实现会话功能,但是没有提供设置代理的功能,国内使用的话会请求超市,无法访问社区也有相关的反馈
image.png
因此我稍微改写了这个demo,提供了设置代理的功能。完善了相关配置

项目介绍

在ai-openai-helloworld基础上进行了一些修改,完善可一些配置文件,增加了代理的配置。国内可以通过配置代理访问openAI。
项目地址spring-ai-chatgpt
实现了3个demo
1、简单回话(全部生成完毕返回)

curl --location 'http://localhost:8080/ai/simple?message=Tell me a joke'

返回完整的生成回话
image.png
2、流式回话

curl --location 'http://localhost:8080/ai/stream?message=Tell me a joke'

image.png
3、消息的模板提示和对gpt相应的结果自动映射到java类

curl --location 'http://localhost:8080/ai/template?author=李白'

例如这个例子中我们像gpt提问请列出关于李白相关的诗词题目,spring-ai可以自动帮我们解析成java对象
image.png

启动项目

需要修改application.yml文件
填写正确的apiKey。与代理服务器的配置,即可启动项目

spring:ai:proxy:host: 127.0.0.1port: 1080openai:api-key: xxxxchat:options:model: gpt-3.5-turbo

接口说明

  /*** 对话接口,回话生成完毕返回* @param message* @return*/@GetMapping("/ai/simple")public Map<String, String> completion(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {return Map.of("generation", chatClient.call(message));}/*** 流式对话接口** @param message* @return*/@GetMapping("/ai/stream")public SseEmitter streamCompletion(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {SseEmitter emitter = new SseEmitter(5L * 60 * 1000);Flux<String> stream = chatClient.stream(message);stream.subscribe(it -> {try {System.out.println(it);emitter.send(it, MediaType.TEXT_EVENT_STREAM);} catch (IOException e) {System.out.println("sse发送消息失败");emitter.completeWithError(e);}});stream.doOnError(e -> {System.out.println("流式对话发生异常");emitter.completeWithError(e);});stream.doOnComplete(emitter::complete);return emitter;}/*** 模板对话接口,可以用于提示用户,也可以引导chatGpt的回答* 可以对chat的回答指定格式,轻松转换为java的实体类** @return*/@GetMapping("/ai/template")@ResponseBodypublic AuthorPoems templateCompletion(@RequestParam(value = "author", defaultValue = "李白") String author) {var outputParser = new BeanOutputParser<>(AuthorPoems.class);String message = """请列出关于{author}相关的诗词题目{format}""";PromptTemplate promptTemplate = new PromptTemplate(message, Map.of("author", author, "format", outputParser.getFormat()));Prompt prompt = promptTemplate.create();Generation generation = chatClient.call(prompt).getResult();AuthorPoems authorPoems = outputParser.parse(generation.getOutput().getContent());return authorPoems;}

项目结构

整个项目十分简单,代码很少。主要为了实现设置代理类重写了了openai一些接口
image.png

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

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

相关文章

GRE/MGRE详解

GRE GRE&#xff1a;通用路由封装&#xff0c;是标准的三层隧道技术&#xff0c;是一种点对点的隧道技术&#xff1b; 该技术可以实现不同的网络之间安全的访问&#xff1b; 如上&#xff1a;可以使用该技术搭建一条专线&#xff0c;实现公司A与分公司A1之间相互通信&#xf…

Vue3---基础7(Props)

props&#xff0c;用于给子组件传递父组件的值的方法 代码示例&#xff1a; 父组件 <template><Text1 :list"personList"/> </template><script lang"ts" setup namae"App">import Text1 from ./components/text2.vu…

AI Agent概念、能力初探

AI Agent无疑是大语言模型当前最热门且最具前景的方向&#xff0c;也是通往AGI的必经之路&#xff0c;下面我们从基本概念和系统能力层面来逐步揭开AI Agent的神秘面纱。 一、概念解析 1、什么是AI Agent&#xff1f; AI Agent&#xff08;人工智能代理&#xff09;是一种能够…

C++ 狼类(Wolf)、人类(Human)、狼人类(Werewolf)

C 实现 定义以下三个类; 狼类(Wolf):成员变量姓名:stringName&#xff0c;成员变量爪子锋利度:intShape&#xff0c;成员函数:voidPrintStateO&#xff0c;按照姓名、爪子锋利度格式输出两个成员变量的值。←人类(Human):成员变量姓名:stringName,成员变量智力:intIntell,成员函…

使用 ChatGPT-4 编码就像与一个醉酒的天才一起工作

我决定从头到尾使用 ChatGPT 来构建一个用于管理书签的 Chrome 扩展。在生成了 30,000 多行 JavaScript、HTML、CSS 和云后端后&#xff0c;我的收获是&#xff0c;使用 ChatGPT 进行编码就像与一个醉酒的编程天才一起工作&#xff1a;他很懒&#xff0c;患有记忆丧失&#xff…

[yotroy.cool]Haskell笔记二

个人博客https://www.yotroy.cool/&#xff0c;欢迎关注我哦&#xff5e; 类型 特性 强&#xff08;strong&#xff09;类型 静态&#xff08;static&#xff09; 可以通过自动推导&#xff08;automatically inferred&#xff09;得出 基本类型 Char Bool Int 常用 定长…

从零实现诗词GPT大模型:专栏内容规划

一、前情介绍 本系列文章将从头编写一个类GPT的深度学习模型&#xff0c;并在诗词数据集上进行训练&#xff0c;从而可以进行诗词创作。 本次实现的类GPT模型&#xff0c;可以在kaggle上使用免费GPU进行训练&#xff0c;并可以在自己的电脑上进行推理&#xff0c;整个学习过程…

洛谷刷题 深度优先搜索-[P1025]数的划分(C++)

题目描述 将整数 n 分成 k 份&#xff0c;且每份不能为空&#xff0c;任意两个方案不相同&#xff08;不考虑顺序&#xff09;。 例如&#xff1a;n7&#xff0c;k3&#xff0c;下面三种分法被认为是相同的。 1,1,5 1,5,1 5,1,1 问有多少种不同的分法。 输入格式 n,k &am…

三种定时任务:

三种定时任务&#xff1a; 1:Timer定时器 Timer定时器是Java内置的定时任务工具类&#xff0c;可以在指定的时间间隔内执行任务。 Timer中的任务是在Timer的任务线程中按照一定的时间间隔执行的&#xff0c;而TimerTask则是实际定时执行的任务。Timer和TimerTask都是线程安全…

《Java面试自救指南》(专题六)Java框架(含spring、Mybatis、Netty)

文章目录 力推的Java框架课程Spring的启动流程(IOC容器创建第一步)Spring IOC如何实现 (DefaultListAbleBeanFactory)Spring后置处理器怎么实现的?Spring AoP如何实现,有什么作用Spring监听器怎么实现的Spring事务传播机制有哪几种Spring Bean的注入方式Bean的生命周期和作…

mit MIT 6.S081 Operating System labs随记

lab 1 中 primes.c 写了一个递归&#xff0c;make qemu的时候会报error&#xff0c;error: infinite recursion detected [-Werrorinfinite-recursion]&#xff0c;导致编译无法通过。 解决办法&#xff1a; 在Makefile中&#xff0c;找到CFLAGS,找到 -Werror 选项并将其删除…

【App启动速度怎么做控制和优化】学习笔记

App的启动分为冷启动和热启动。以下讲述的是冷启动。 app启动时做了什么&#xff1f; main函数执行前 加载可执行文件&#xff08;.o文件集合&#xff09;加载动态连接库objc运行时初始化处理&#xff0c;包括objc相关类的注册、category的注册、selector唯一性检查等初始化&…

如何从零开始设计一套⌈中性策略回测系统⌋?

最近接到新任务&#xff0c;需要开发一套⌈中性策略回测系统⌋。 首先老实交待&#xff0c;策略方面&#xff0c;更多是投研部的工作&#xff0c;我不太懂。中性策略&#xff0c;平时工作中多多少少有些接触&#xff0c;全名为市场中性策略&#xff0c;我理解&#xff0c;凡是…

NAT技术

网络技术深似海呀&#xff0c;一段时间不用又忘。 是什么 NAT技术是网络防火墙技术的一部分&#xff0c;可以作用在linux防火墙或者设备防火墙&#xff0c;NAT技术可以实现地址和端口的转换&#xff0c;主要还是为了网络连通性。 作用 存在以下三个IP&#xff0c;A(10.234.…

cartographer代码学习-概率栅格地图(栅格地图的更新)

在cartographer中&#xff0c;地图的更新是很重要的一部分内容&#xff0c;如何将一帧一帧的激光点云转换成子图&#xff0c;则是其中的核心部分。 栅格地图的更新流程 根据前面所学&#xff0c;我们知道在local_trajectory_builder_2d中&#xff0c;函数在对点云预处理后调用…

LeetCode 热题 HOT 100(P31~P40)

系列文章&#xff1a; LeetCode 热题 HOT 100(P1~P10)-CSDN博客 LeetCode 热题 HOT 100(P11~P20)-CSDN博客 LeetCode 热题 HOT 100(P21~P30)-CSDN博客 LeetCode 热题 HOT 100(P31~P40)-CSDN博客 LC76minimum_window . - 力扣&#xff08;LeetCode&#xff09; 题目&…

自动化测试-web(PO:Page Object 模式)

一、PO模式 PO&#xff1a;Page Object&#xff08;页面对象&#xff09;&#xff0c;将自动化涉及的页面或模块封装成对象。 PO能解决什么问题&#xff1f; 代码复用性便于维护&#xff08;脚本层与业务分离&#xff09;--如果元素信息发生变化了&#xff0c;也不用去修改脚…

HOT100打卡—day12—【回溯】—最新24.4.14(剩好多题)

1 46. 全排列 46. 全排列 AC代码&#xff1a; class Solution { public:bool vis[22];vector<vector<int>> permute(vector<int>& nums) {vector<vector<int>> ans;vector<int> now;dfs(0,nums,now,ans);return ans;}void dfs(int …

leetcode经典困难题-接雨水

. - 力扣&#xff08;LeetCode&#xff09; 42. 接雨水 困难 相关标签 相关企业 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,…

c++的学习之路:22、多态(1)

摘要 本章主要是说一些多态的开头。 目录 摘要 一、多态的概念 二、多态的定义及实现 2.1、多态的构成条件 2.2、虚函数 2.3、虚函数的重写 2.4、C11 override 和 final 2.5、重载、覆盖(重写)、隐藏(重定义)的对比 三、思维导图 一、多态的概念 多态的概念&#…