当前位置: 首页 > wzjs >正文

县级部门和乡镇不能建网站建设杭州百度快照优化排名推广

县级部门和乡镇不能建网站建设,杭州百度快照优化排名推广,怎样创建网站吉洋大鼓,wordpress如何开启ssl使用AI4J快速接入OpenAI大模型 本博文给大家介绍一下如何使用AI4J快速接入OpenAI大模型,并且如何实现流式与非流式的输出,以及对函数调用的使用。 介绍 由于SpringAI需要使用JDK17和Spring Boot3,但是目前很多应用依旧使用的JDK8版本&…

使用AI4J快速接入OpenAI大模型

本博文给大家介绍一下如何使用AI4J快速接入OpenAI大模型,并且如何实现流式与非流式的输出,以及对函数调用的使用。

介绍

由于SpringAI需要使用JDK17和Spring Boot3,但是目前很多应用依旧使用的JDK8版本,所以使用可以支持JDK8的AI4J来接入OpenAI大模型。

AI4J是一款JavaSDK用于快速接入AI大模型应用,整合多平台大模型,如OpenAi、智谱Zhipu(ChatGLM)、深度求索DeepSeek、月之暗面Moonshot(Kimi)、腾讯混元Hunyuan、零一万物(01)等等,提供统一的输入输出(对齐OpenAi)消除差异化,优化函数调用(Tool Call),优化RAG调用、支持向量数据库(Pinecone),并且支持JDK1.8,为用户提供快速整合AI的能力。

AI4J-GitHub

快速使用

目前较多的应用场景为Spring应用,而AI4J接入SpringBoot应用也是非常简单的,本篇博文先带着大家为SpringBoot应用集成OpenAI服务,后续会介绍如何再非Spring项目中搭建。

创建SpringBoot项目

20240911230410
20240911230511
这里以JDK1.8为例创建SpringBoot2项目,当然你也可以创建JDK17、SpringBoot3。

引入AI4J依赖
<!-- Spring应用 -->
<dependency><groupId>io.github.lnyo-cly</groupId><artifactId>ai4j-spring-boot-stater</artifactId><version>0.5.2</version>
</dependency>

如果你使用阿里源无法引入,可能是阿里云镜像还没有同步。

配置application.yml

给大家两种配置方法

第一种:使用官网的url,自己有代理
20240911231540

第二种:使用中转代理地址(或第三方中转平台)

如:https://api.openai-proxy.com
20240911231920

上面任意配置一种即可。

搭建聊天服务Controller

下面是一个小的demo演示:

@RestController
public class OpenAiController {// 注入Ai服务@Autowiredprivate AiService aiService;@GetMapping("/chat")public String getChatMessage(@RequestParam String question) throws Exception {// 获取OpenAi的聊天服务IChatService chatService = aiService.getChatService(PlatformType.OPENAI);// 创建请求参数ChatCompletion chatCompletion = ChatCompletion.builder().model("gpt-4o-mini").message(ChatMessage.withUser(question)).build();System.out.println(chatCompletion);// 发送chat请求ChatCompletionResponse chatCompletionResponse = chatService.chatCompletion(chatCompletion);// 获取聊天内容和token消耗String content = chatCompletionResponse.getChoices().get(0).getMessage().getContent();long totalTokens = chatCompletionResponse.getUsage().getTotalTokens();System.out.println("总token消耗: " + totalTokens);return content;}
}

20240912131112

20240912094929

实现stream流式输出(打字机效果)

编写stream.html

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>Stream Example</title>
</head>
<body>
<input id="question" type="text" placeholder="输入需要提问的问题"/><button id="startButton">开始</button><div id="output"></div><script>const input = document.getElementById("question");const outputDiv = document.getElementById('output');const startButton = document.getElementById('startButton');async function getResponse(){const question = input.value;const resp = await fetch("/chatStream" + "?question=" + question,{method: 'GET'})const reader = resp.body.getReader();const textDecoder = new TextDecoder();while (1){const { done , value } = await reader.read()if(done) break;const str = textDecoder.decode(value);outputDiv.innerText += str;console.log(str)}}startButton.addEventListener("click", getResponse)
</script>
</body>
</html>

向controller中添加stream接口:

    @GetMapping("/chatStream")public void getChatMessageStream(@RequestParam String question, HttpServletResponse response) throws Exception {// 中文乱码问题response.setCharacterEncoding("UTF-8");// 获取OpenAi的聊天服务IChatService chatService = aiService.getChatService(PlatformType.OPENAI);// 创建请求参数ChatCompletion chatCompletion = ChatCompletion.builder().model("gpt-4o-mini").message(ChatMessage.withUser(question)).build();PrintWriter writer = response.getWriter();// 发送chat请求SseListener sseListener = new SseListener() {@Overrideprotected void send() {writer.write(this.getCurrStr());writer.flush();System.out.println(this.getCurrStr());}};chatService.chatCompletionStream(chatCompletion, sseListener);writer.close();System.out.println(sseListener.getOutput());}

20240912151012

注意:上面只是一个简单的示例,你也可以使用其它方法,比如:

    @GetMapping("/chatStream")public ResponseBodyEmitter getChatMessageStream(@RequestParam String question) {ResponseBodyEmitter emitter = new ResponseBodyEmitter();// 获取OpenAi的聊天服务IChatService chatService = aiService.getChatService(PlatformType.OPENAI);// 创建请求参数ChatCompletion chatCompletion = ChatCompletion.builder().model("gpt-4o-mini").message(ChatMessage.withUser(question)).build();Executors.newSingleThreadExecutor().submit(() -> {try {SseListener sseListener = new SseListener() {@Overrideprotected void send() {try {emitter.send(this.getCurrStr());System.out.println(this.getCurrStr());  // 打印当前发送的内容} catch (IOException e) {emitter.completeWithError(e);}}};// 发送流式数据chatService.chatCompletionStream(chatCompletion, sseListener);// 完成后关闭连接emitter.complete();} catch (Exception e) {emitter.completeWithError(e);}});return emitter;}
实现函数调用

首先我们需要编写一个函数,以天气预报为例子:

@FunctionCall(name = "queryWeather", description = "查询目标地点的天气预报")
public class QueryWeatherFunction implements Function<QueryWeatherFunction.Request, String> {@Overridepublic String apply(Request request) {final String key = "abcdefg";// https://api.seniverse.com/v3/weather/hourly.json?key=your_api_key&location=beijing&start=0&hours=24// https://api.seniverse.com/v3/weather/daily.json?key=your_api_key&location=beijing&start=0&days=5String url = String.format("https://api.seniverse.com/v3/weather/%s.json?key=%s&location=%s&days=%d",request.type.name(),key,request.location,request.days);OkHttpClient client = new OkHttpClient();okhttp3.Request http = new okhttp3.Request.Builder().url(url).get().build();try (Response response = client.newCall(http).execute()) {if (response.isSuccessful()) {// 解析响应体return response.body() != null ? response.body().string() : "";} else {return "获取天气失败 当前天气未知";}} catch (Exception e) {// 处理异常e.printStackTrace();return "获取天气失败 当前天气未知";}}@Data@FunctionRequestpublic static class Request{@FunctionParameter(description = "需要查询天气的目标位置, 可以是城市中文名、城市拼音/英文名、省市名称组合、IP 地址、经纬度")private String location;@FunctionParameter(description = "需要查询未来天气的天数, 最多15日")private int days = 15;@FunctionParameter(description = "预报的天气类型,daily表示预报多天天气、hourly表示预测当天24天气、now为当前天气实况")private Type type;}public enum Type{daily,hourly,now}
}

其中有三个核心注解:

  • @FunctionCall:标识这个类为一个函数
  • @FunctionRequest:标识为该类为函数的请求类
  • @FunctionParameter:标识为函数的具体参数

接下来稍微修改下刚刚编写的Stream实现函数:

    @GetMapping("/chatStream")public void getChatMessageStream(@RequestParam String question, HttpServletResponse response) throws Exception {// ......// 创建请求参数ChatCompletion chatCompletion = ChatCompletion.builder().model("gpt-4o-mini").message(ChatMessage.withUser(question)).functions("queryWeather") // 这里传入刚刚我们定义的函数名称即可.build();// ......}

20240912152155

如果想要知道函数调用的参数,只需要在刚刚的代码中,添加下面这一行即可:

sseListener.setShowToolArgs(true);

20240912152932

更换其它平台

细心的你可能已经发现,我们在创建chatService的时候传入了PlatformType.OPENAI,如果我们想要更换其它平台,只需要更换PlatformType即可。如果你不懂,那下篇博文再详细的说说

IChatService chatService = aiService.getChatService(PlatformType.OPENAI);
其它功能

篇幅有限,其它功能使用,下篇再讲

http://www.dtcms.com/wzjs/486409.html

相关文章:

  • 山西省建设主管部门网站长春网站制作设计
  • 九江网站建设优化公司福州短视频seo服务
  • 苏州吴中区做网站广告营销推广方案
  • 南平高速建设有限公司网站怎么做推广比较成功
  • 好用的小程序推荐做seo需要哪些知识
  • 营销型网站建设的公司今天时政新闻热点是什么
  • 做网站商机网络工程师培训班要多少钱
  • 微信网页版是什么济南网站优化公司排名
  • 南宁工程建设网站有哪些国内新闻最新
  • 太原汽车网站建设宁波seo外包快速推广
  • 凡科网站能在百度做推广吗公司网站建设价格
  • 站长工具的使用seo综合查询运营广州seo公司哪个比较好
  • 网站维护的协议网站seo排名培训
  • 网页设计模板素材库河北网站seo地址
  • 专题网站建设策划搜索引擎调价平台哪个好
  • 效果好的网站建设网站建立
  • 网站开发项目建设经验整站seo外包
  • 雨颜色网站建设百度官网下载电脑版
  • 运营招聘东莞seo靠谱
  • 鞍山人才网档案查询百度搜索seo优化技巧
  • 网站制作报价多少百度首页快速排名系统
  • 做网站网址怎么弄个人如何建立免费网站
  • 哪个网站可以做笔译兼职百度大数据中心
  • 下什么软件做网站中国seo排行榜
  • 怎么注册com网站免费的交易平台
  • 帝国cms做淘宝客网站北京网站优化快速排名
  • 做任务的兼职网站济南seo
  • 网站开发岗位名称百度推广账户优化
  • 网站内容 优化微信指数是搜索量吗
  • 天津手机网站建站培训搜索引擎的工作原理是什么?