Spring AI Chat 简单示例

news/2024/5/20 8:08:20 标签: spring, 人工智能, java, openai, spring ai

官方文档地址: https://docs.spring.io/spring-ai/reference/index.html

Spring AI 可以方便 Java 开发者在代码中集成 AI 的功能,通过 Spring 提供的抽象,可以方便的切换不同的AI提供商,Spring AI 是对 AI 的使用,并不涉及 AI 的训练。

特别注意: Spring AI 目前还很不稳定,官方文档还有大量错误,API 也会变动导致不兼容,当前文章示例使用的 0.8.1 版本。

创建初始项目

可以通过 https://start.spring.io/ 创建一个包含 Spring AI 的初始项目:
在这里插入图片描述

上图所示,我们添加最常见的 OpenAI 依赖,Spring AI 主要添加了下面的 BOM:

<dependency>
	<groupId>org.springframework.ai</groupId>
	<artifactId>spring-ai-bom</artifactId>
	<version>0.8.1</version>
	<type>pom</type>
	<scope>import</scope>
</dependency>

还有我们选择的 OpenAI:

<dependency>
	<groupId>org.springframework.ai</groupId>
	<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>

示例代码

为了更清楚的了解 Spring AI,本文使用更底层的代码来演示 Spring AI 的功能。

由于可能无法直接访问 OpenAI,在Java中进行调用时,可以通过下面的方式设置代理:

java">System.setProperty("https.proxyHost", "localhost");
System.setProperty("https.proxyPort", "7890");

除了上面方式外,如果你部署过 ChatGPT-Next-Web ,还可以通过间接的方式调用 OpenAI,可以使用类似下面形式的URL和TOKEN:

  • URL:https://你的域名/api/openai/
  • TOKEN: nk-你的CODE

我们可以通过下面的方式创建 OpenAiApi:

java">var openAiApi = new OpenAiApi("token");
//为了避免泄漏token,还可以配置环境变量后使用下面方式
//注意使用IDEA时,配置环境变量后需要完全关闭IDEA重启才能生效
var openAiApi = new OpenAiApi(System.getenv("OPENAI_API_KEY"));

如果使用 ChatGPT-Next-Web 代理的接口,可以使用带有 baseUrl 构造参数的方法。

java">var openAiApi = new OpenAiApi("https://你的域名/api/openai/", "nk-你的CODE");
//为了避免泄漏token,还可以配置环境变量后使用下面方式
//注意使用IDEA时,配置环境变量后需要完全关闭IDEA重启才能生效
var openAiApi = new OpenAiApi(
		System.getenv("OPENAI_BASE_URL"), 
		System.getenv("OPENAI_API_KEY"));

上面代码使用了具体的 OpenAiApi,这一层是具体的实现,一般通过 starter 的配置来动态创建,接下来是更通用的 ChatClient 接口(这里特地指定了类型,没有使用 var):

java">ChatClient chatClient = new OpenAiChatClient(openAiApi, OpenAiChatOptions.builder()
		.withModel("gpt-3.5-turbo")
		.withTemperature(0.4F)
		.withMaxTokens(200)
		.withFunctionCallbacks(List.of(
				FunctionCallbackWrapper.builder(new MockWeatherService())
				.withName("CurrentWeather")
				.withDescription("Get the weather in location").build()
		))
		.build());

在上面的客户端中指定了 openAiApi,指定了模型名和其他参数,还特地增加了一个函数回调,增加了一个函数 CurrentWeather,通过这个函数提供的实现 MockWeatherService 可以让 ChatGPT 拥有获取实时温度的功能,这里只是演示,所以没有对接真实的 API,直接返回的随机数:

java">public static class MockWeatherService
	implements Function<MockWeatherService.Request, MockWeatherService.Response> {
	public enum Unit { C, F }
	public record Request(String location, Unit unit) {}
	public record Response(double temp, Unit unit) {}

	public Response apply(Request request) {
		return new Response(Math.random() * 40, Unit.C);
	}
}

ChatClient 最简单的接口是 default String call(String message) 方法,输入提示词返回结果,我们这里为了演示函数功能,使用复杂的接口方法 ChatResponse call(Prompt prompt)

java">ChatResponse response = chatClient.call(
	new Prompt("北京、石家庄的天气怎么样,适合穿什么衣服?温度保留1位小数。", 
	OpenAiChatOptions.builder().withFunction("CurrentWeather").build()));

System.out.println(response.getResult().getOutput().getContent());

目前使用的 Function 功能只有 OpenAI 支持,这里只能使用 OpenAiChatOptions 指定要使用什么函数,这里要注意,前面定义的时候是在注册函数,在提示词中需要指定要使用的函数,如果不指定函数就不会生效。上面示例执行的结果如下:

北京目前气温为28.8°C,石家庄目前气温为11.8°C。
根据当前天气情况,建议穿着清凉舒适的夏季衣服在北京,而在石家庄则建议穿着春秋过渡季节的衣服。

目前的 Spring AI 还不适合用于生产,接口变化比较大,而且提供者无关的抽象还不够完善,官方文档中示例代码落后,有很多都无法执行。希望 Spring AI 越来越强大,成为 Java 开发中的 LangChain 和 LlamaIndex。


http://www.niftyadmin.cn/n/5431491.html

相关文章

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Menu)

以垂直列表形式显示的菜单。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 Menu组件需和bindMenu或bindContextMenu方法配合使用&#xff0c;不支持作为普通组件单独使用。 子组件 包含MenuIt…

字符串的排列(LeetCode 567)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路4.1 滑动窗口4.2 双指针 参考文献 1.问题描述 给你两个字符串 s1 和 s2 &#xff0c;写一个函数来判断 s2 是否包含 s1 的排列。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 换句话说&#xf…

【数据库】数据库介绍

文章目录 一、数据库介绍二、SQL分类 一、数据库介绍 什么是数据库 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库? 文件保存数据有以下几个缺点&#xff1a; 文件的安全性问题 文件不利于数据查询和管理 文件不利于存储海量数据 文件在程序中控制不方便 数据库存…

Unity中的网格创建和曲线变形

Unity中的网格创建和曲线变形 3D贝塞尔曲线变形贝塞尔曲线基础线性公式二次方公式三次方公式 Unity 实现3D贝塞尔曲线变形准备工作脚本概述变量定义 变量解析函数解析 获取所有子节点GetAllChildren 获取所有子节点UpdateBezierBend 控制点更新CalculateBezier Bezier 曲线公式…

电商推广秘籍:解读十大邮件营销专业术语(上)的实战应用

如果您是一个电商人&#xff0c;特别是做跨境电商的&#xff0c;避免不了使用邮件营销。那对于刚入门的新手小白来讲&#xff0c;了解邮件营销专业术语是第一步。充分地了解相关术语能够帮助小白更好地开展邮件营销业务。今天&#xff0c;小编就和大家讲解一下有哪些电商人必须…

GatewayProperties:深入探索Spring Cloud Gateway的核心配置属性

在Spring Cloud微服务架构中&#xff0c;Spring Cloud Gateway作为API网关&#xff0c;扮演着至关重要的角色。它提供了路由、安全、监控和弹性等一系列功能&#xff0c;帮助开发者构建安全、高效、可维护的微服务应用。而在Spring Cloud Gateway中&#xff0c;GatewayProperti…

Linux_socket编程

套接字通信 socket 接口 守护进程 一.套接字通信 端口号&#xff1a; 端口号是一个2字节16位的整数;端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理; 一台主机可以根据ip地址定位另一台主机&#xff0c;而两台主机之间的通信本质是进程在通信。…

点的基本操作

点的基本操作 要求 提供空间点数据文本文件&#xff0c;包含ID、name、X、Y四个字段信息&#xff0c; 1&#xff09;读取数据&#xff0c;并且在窗口中显示点的具体位置&#xff0c;用实心圆绘制。 2&#xff09;鼠标任意点击三个点&#xff0c;将点连线&#xff0c;用黑色笔…