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

JAVA实现人工智能,采用框架SpringAI

文章目录

  • JAVA实现人工智能,采用框架SpringAI
        • Spring AI介绍
        • 使用介绍
        • 项目前提
        • 项目结构
          • 第一种方式采用openai
            • 1. pom文件:
          • 2. application.yml 配置
          • 3.controller 实现层
        • 项目测试

JAVA实现人工智能,采用框架SpringAI

Spring AI介绍

Spring
AI是AI工程师的一个应用框架,它提供了一个友好的API和开发AI应用的抽象,旨在简化AI应用的开发工序,例如开发一款基于ChatGPT的对话应用程序。

目前该项目已经集成了OpenAI、Azure OpenAI、Hugging
Face、Ollama等API。不过,对于集成了OpenAI接口的项目,只要再搭配One-API项目,就可以调用目前主流的大语言模型了。

使用介绍

在介绍如何使用Spring AI开发一个对话接口之前,我先介绍下ChatGPT应用的开发原理。

首先,ChatGPT是OpenAI推出的一款生成式人工智能大语言模型,OpenAI为了ChatGPT能够得到广泛应用,向开发者提供了ChatGPT的使用接口,开发者只需使用OpenAI为开发者提供的Key,向OpenAI提供的接口地址发起各种形式的请求就可以使用ChatGPT。因此,开发一款ChatGPT应用并不是让你使用人工智能那套技术进行训练和开发,而是作为搬运工,通过向OpenAI提供的ChatGPT接口发起请求来获取ChatGPT响应,基于这一流程来开发的。

项目前提

本人已经本地部署chatglm3-6b+oneapi 项目环境

项目结构

在这里插入图片描述

第一种方式采用openai
1. pom文件:

SpringAI 官网 新版本,由于我本地chatglm3-6b openai 接口实现暂不支持请求体解析,所以使用0.8.1-SNAPSHOT 版本进行集成

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>1.0.0-SNAPSHOT</version><type>pom</type><scope>import</scope>
</dependency>
<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 http://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><groupId>com.lvyuanj.core</groupId><artifactId>micro-open-ai</artifactId><version>1.0-SNAPSHOT</version><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>0.8.1-SNAPSHOT</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-ollama-spring-boot-starter</artifactId></dependency></dependencies><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>false</enabled></releases></repository></repositories><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>
2. application.yml 配置
spring:ai:openai:api-key: XXXXXXXXXXXXXXXXXXXXXXbase-url: XXXXXXXXXXXXXXXXXXXXXXXchat:enabled: trueoptions:model: chatglm3-6btemperature: 0.3F  # 温度越高,回答得比较有创新性,但是准确率会下降,温度越低,回答的准确率会更好#ollama模型ollama:api-key: XXXXXXXXXXXXXXXXXXXXbase-url: XXXXXXXXXXXXXXXXXXXXXXXXXchat:enabled: falseoptions:model: chatglm3-6b
3.controller 实现层
package com.lvyuanj.core.ai.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.GetMapping;
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;@RestController
@RequestMapping("open-ai")
class OpenAiController {@Resourceprivate OpenAiChatClient openAiChatClient;/*** 调用OpenAI的接口-默认参数* @param msg* @return*/@GetMapping("/chat")public String completion(@RequestParam("msg") String msg) {return openAiChatClient.call(msg);}/*** 调用OpenAI的接口-默认参数* @param msg-输入的文本* @return*/@RequestMapping(value = "/chat2")public Object chat2(@RequestParam(value = "msg") String msg) {ChatResponse chatResponse = openAiChatClient.call(new Prompt(msg));return chatResponse.getResult().getOutput().getContent();}/*** 调用OpenAI的接口-自定义参数* @param msg-输入的文本* @return*/@RequestMapping(value = "/chat3")public Object chat3(@RequestParam(value = "msg") String msg) {//可选参数在配置文件中配置了,在代码中也配置了,那么以代码的配置为准,也就是代码的配置会覆盖掉配置文件中的配置ChatResponse chatResponse = openAiChatClient.call(new Prompt(msg, OpenAiChatOptions.builder()//.withModel("gpt-4-32k") //gpt的版本,32k是参数量.withTemperature(0.4F) //温度越高,回答得比较有创新性,但是准确率会下降,温度越低,回答的准确率会更好.build()));return chatResponse.getResult().getOutput().getContent();}/*** 调用OpenAI的接口-流式接口* @param msg-输入的文本* @return*/@RequestMapping(value = "/chat4")public Object chat4(@RequestParam(value = "msg") String msg) {//可选参数在配置文件中配置了,在代码中也配置了,那么以代码的配置为准,也就是代码的配置会覆盖掉配置文件中的配置Flux<ChatResponse> flux = openAiChatClient.stream(new Prompt(msg, OpenAiChatOptions.builder()//.withModel("gpt-4-32k") //gpt的版本,32k是参数量.withTemperature(0.4F) //温度越高,回答得比较有创新性,但是准确率会下降,温度越低,回答的准确率会更好.build()));flux.toStream().forEach(chatResponse -> {System.out.println(chatResponse.getResult().getOutput().getContent());});return flux.collectList(); //数据的序列,一序列的数据,一个一个的数据返回}/*** 字转向量进行数据查询**/@PostMapping("/embedding")public void pgQuery(@RequestBody List<String> wordList) {EmbeddingRequest embeddingRequest = new EmbeddingRequest(wordList, OpenAiEmbeddingOptions.builder().build());EmbeddingResponse response = openAiEmbeddingClient.call(embeddingRequest);List<Double> wordVectors = response.getResult().getOutput();List<Float> vectors = wordVectors.stream().map(o -> o.floatValue()).collect(Collectors.toList());Object[] neighborParams = new Object[] { new PGvector(vectors) };List<Map<String, Object>> rows = jdbcTemplate.queryForList("SELECT * FROM modeldata ORDER BY embedding <-> ? LIMIT 5", neighborParams);if (Objects.nonNull(rows) && rows.size() > 0) {for (Map<String, Object> row : rows) {for (Map.Entry<String, Object> entry : row.entrySet()) {String key = entry.getKey();Object value = entry.getValue();System.out.println("key:"+key + ",value:" + value);}}}}}
项目测试

在这里插入图片描述
接下来继续接入文字、图片、视频对接实现

http://www.lryc.cn/news/359521.html

相关文章:

  • 基础—SQL—DQL(数据查询语言)分组查询
  • 从CSV到数据库(简易)
  • K210视觉识别模块学习笔记3:内存卡写入拍摄图片_LED三色灯的操作_按键操作_定时器的配置使用
  • 如何定义“智慧校园”这个概念
  • OpenSSL自签名证书
  • QtCreator调试运行工程报错,无法找到相关库的的解决方案
  • 【Python系列】Python 元组(Tuple)详解
  • 特征融合篇 | YOLOv8 引入动态上采样模块 | 超过了其他上采样器
  • ​​​​​​​Beyond Compare 3密钥被撤销的解决办法
  • 知识见闻 - 人和动物的主要区别
  • Javaweb基础之工程路径
  • 国际荐酒师(香港)协会受邀出席广州意大利国庆晚宴
  • 让驰骋BPM系统插上AI的翅膀
  • 排队论 | 基于排队机制实现智能仓储机器人巡逻及避碰
  • Node.js和npm常用命令
  • pytest +allure在测试中的应用
  • 004 CentOS 7.9 mongodb7.0.11安装及配置
  • Docker安装Redis(云服务器)
  • springboot中抽象类无法注入到ioc容器
  • Java关键字大冒险:深入浅出地理解Java的精髓
  • Android Kotlin 打开相册选择图片(多选)
  • java学习路径
  • [线程与网络] 网络编程与通信原理(四):深入理解传输层UDP与TCP协议
  • IEEE编程语言排行榜:深度解析编程语言的四大维度、五大趋势、六大热门与七大挑战
  • 【C++面试50题】
  • 外汇天眼:ESMA发布针对在投资服务中使用人工智能的公司的指导意见
  • 【前缀和 记忆化搜索】LeetCode1444. 切披萨的方案数
  • 异常处理1--5.31
  • AI免费插件 批量条码大师,支持100多种条码类型
  • 使用 Django 连接 MySQL 数据库