0


AI - 人工智能;Java之SpringAI(一)

一、人工智能(Artificial Intelligence,缩写为AI)

人工智能(Artificial Intelligence,缩写为AI)是一门新的技术科学,旨在开发、研究用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统,它结合了数学、计算机科学、心理学等多学科的理论,通过让计算机模拟人类的思考和行为过程,实现人机交互,提高计算机的智能水平,以更好地服务于人类社会

A system is ability to correctly interpret external data, to learn from such data, and to use those learnings to achieve specific goals and tasks through flexible adaptation.

系统正确解释外部数据的能力,从这些数据中学习的能力,以及通过灵活的适应利用这些学习来实现特定目标和任务的能力

(一)人工智能AI历史背景可追溯至工业革命

1、第一次工业革命(18世纪60年代~19世纪中期,大约是1760年到1860年): 也称为蒸汽时代,发源于英格兰中部地区,是资本主义工业化的早期阶段; 蒸汽机的发明及运用成为了这个时代的标志,因此历史学家称这个时代为“蒸汽时代”; 蒸汽时代的显著特征是机械化生产和大规模生产,推动了生产力的飞跃,带来了极大的经济增长; 这一时期也出现了第一批大型企业和跨国公司

2、第二次工业革命(19世纪下半叶~20世纪初,大约1851年到1910年): 也称电气时代,电力、化学、石油等工业得以大发展; 这一时期的标志是从机械化向自动化的转变,由于电力的应用和化学工业的发展,生产效率得到了进一步提高,加速了工业化的进程

3、第三次工业革命(20世纪后半期,大约1945年到2000年): 也称为信息时代,以原子能、电子计算机、空间技术和生物工程的发明和应用为主要标志,涉及信息技术、新能源技术、新材料技术、生物技术、空间技术和海洋技术等诸多领域的一场信息控制技术革命; 这一时期的特点是信息技术和数字技术的广泛应用,推动了社会生产力的又一次飞跃

4、第四次工业革命(21世纪初至今,大约2000年开始直到现在的这段时间): 也称工业4.0时代或智能化时代,这个时代以互联网产业化,工业智能化,工业一体化为代表,以人工智能,清洁能源,无人控制技术,量子信息技术,虚拟现实以及生物技术为主的全新技术革命; 这一阶段主要依赖于互联网、物联网、大数据、人工智能等新兴技术的深度融合和创新应用,旨在实现更高效、更智能、更可持续的生产和生活方式

(二)人工智能AI发展趋势

1、起步发展期:1943年—20世纪60年代 (1943 - 1969年) 1943年,提出神经元的数学模型,这是现代人工智能学科的奠基石之一; 1950年,艾伦·麦席森·图灵(Alan Mathison Turing)提出“图灵测试”(测试机器是否能表现出与人无法区分的智能),让机器产生智能这一想法开始进入人们的视野; 1956年,正式使用了人工智能(artificial intelligence,AI)这一术语

2、反思发展期:20世纪70年代(1970 - 1979年) 计算力及理论等的匮乏使得不切实际目标的落空,人工智能的发展走入低谷

3、应用发展期:20世纪80年代 (1980 - 1989年) 人工智能走入应用发展的新阶段,专家系统模拟人类专家的知识和经验解决特定领域的问题,实现了人工智能从理论研究走向实际应用、从一般推理策略探讨转向运用专门知识的重大突破,而机器学习(特别是神经网络)探索不同的学习策略和各种学习方法,在大量的实际应用中也开始慢慢复苏

4、平稳发展期:20世纪90年代—2010年(1990 - 2010年) 由于互联网技术的迅速发展,加速了人工智能的创新研究,促使人工智能技术进一步走向实用化,人工智能相关的各个领域都取得长足进步

5、蓬勃发展期:

2011年至今 随着大数据、云计算、互联网、物联网等信息技术的发展,泛在感知数据和图形处理器等计算平台推动以深度神经网络为代表的人工智能技术飞速发展,大幅跨越了科学与应用之间的技术鸿沟,诸如图像分类、语音识别、知识问答、人机对弈、无人驾驶等人工智能技术实现了重大的技术突破,迎来爆发式增长的新高潮;

2015年,马斯克等人共同创建OpenAI,它是一个非营利的研究组织,使命是确保通用人工智能 (即一种高度自主且在大多数具有经济价值的工作上超越人类的系统)将为全人类带来福祉,其发布热门产品的如:OpenAI Gym,GPT等;

2016年,AlphaGo与围棋世界冠军、职业九段棋手李世石进行围棋人机大战,以4比1的总比分获胜;

2022年11月30日,OpenAI研发的一款聊天机器人程序ChatGPT对外发布,引发AI的大爆发;

2023年3月15日,OpenAI发布ChatGPT 4.0,引爆了AI;

2023年3月16日,百度发布文心一言,文心一言(ERNIE Bot)是基于文心大模型技术推出的生成式对话产品,文心大模型是百度自主研发的产业级知识增强大模型,文心一言能够与人对话互动,回答问题,协助创作,高效便捷地帮助人们获取信息、知识和灵感; 国内还有:科大讯飞认知智能大模型、阿里巴巴通义千问、华为盘古大模型、360智脑、京东言犀大模型等等

(三)大模型

大模型,是指具有大规模参数和复杂计算结构的机器学习模型。这些模型通常由深度神经网络构建而成,拥有数十亿甚至数千亿个参数。其设计目的在于提高模型的表达能力和预测性能,以应对更加复杂的任务和数据; 大模型,简单来说,就是一个特别聪明、特别能干的“大脑”,这个“大脑”由很多个小小的“神经元”组成,每个“神经元”都能处理一部分信息,当这些“神经元”一起工作时,大模型就能理解并回答各种问题,或者完成各种复杂的任务。就像你有一个超级聪明的助手,它能帮你写邮件、写PPT、回答你的各种问题等等,它就像是一个上知天文,下知地理,无所不知的人;

要训练一个大模型不容易,需要给它提供很多学习材料,就像我们小时候读书学习一样。而且为了让这个“大脑”更聪明,还需要很多高级的计算机设备来帮助它学习;

训练大模型:

1、高性能的CPU和GPU,多核心和高主频的CPU以及支持CUDA的GPU加速训练过程;

2、大容量存储设备,训练大模型需要存储大量的数据集、模型参数和中间结果;

3、高速网络连接,通过网络连接将训练任务分配到多个计算节点上;

4、深度学习框架,如TensorFlow、PyTorch等,这些框架提供了构建和训练模型的工具和库;

5、分布式训练框架,为了加速大模型的训练,可以使用分布式训练框架,如Horovod、Ray等;

6、编程语言和工具,Python是深度学习领域最常用的编程语言,还有(如Git)来管理代码和版本迭代;

7、训练大模型非常耗电,高性能计算机和GPU进行长时间的工作,需要消耗大量的电力

二、SpringAI

官网:Spring | Home

Spring AI

Spring AI is an application framework for AI engineering. Its goal is to apply to the AI domain Spring ecosystem design principles such as portability and modular design and promote using POJOs as the building blocks of an application to the AI domain.

Spring AI是一个AI工程领域的应用程序框架; 它的目标是将Spring生态系统的设计原则应用于人工智能领域,比如Spring生态系统的可移植性和模块化设计,并推广使用POJO来构建人工智能领域应用程序;

Spring AI并不是要构建一个自己的AI大模型,而是让你对接各种AI大模型

(一)SpringAI特点

Spring AI提供的API支持跨人工智能提供商的 聊天,文本到图像,和嵌入模型等,同时支持同步和流API选项

1、Chat Models 聊天模型:

OpenAI

Azure Open AI

Amazon Bedrock

Cohere's Command

AI21 Labs' Jurassic-2

Meta's LLama 2

Amazon's Titan

Google Vertex AI Palm

Google Gemini

HuggingFace - access thousands of models, including those from Meta such as Llama2

Ollama - run AI models on your local machine

MistralAI

2、Text-to-image Models 文本到图像模型:

OpenAI with DALL-E

StabilityAI

3、Transcription (audio to text) Models 转录(音频到文本)模型 OpenAI

4、Embedding Models 嵌入模型

OpenAI

Azure OpenAI

Ollama

ONNX

PostgresML

Bedrock Cohere

Bedrock Titan

Google VertexAI

Mistal AI

5、Vector Store API提供了跨不同提供商的可移植性,其特点是提供了一种新颖的类似SQL的元数据过滤API,以保持可移植性; 矢量数据库:

Azure Vector Search

Chroma

Milvus

Neo4j

PostgreSQL/PGVector

PineCone

Redis

Weaviate

Qdrant

6、用于AI模型和矢量存储的Spring Boot自动配置和启动器;(xxxx-spring-ai-starter)

7、函数调用,您可以声明java.util.Function的OpenAI模型的函数实现,用于其提示响应。如果在应用程序上下文中注册为@Bean,则可以直接将这些函数作为对象提供,或者引用它们的名称。这一功能最大限度地减少了不必要的代码,并使人工智能模型能够要求更多信息来完成其响应; 支持的模型有:

OpenAI

Azure OpenAI

VertexAI

Mistral AI

8、用于数据工程的ETL框架 ETL框架的核心功能是使用Vector Store促进文档向模型提供者的传输。ETL框架基于Java函数式编程概念,可帮助您将多个步骤链接在一起; 支持阅读各种格式的文档,包括PDF、JSON等; 该框架允许数据操作以满足您的需求。这通常包括拆分文档以遵守上下文窗口限制,并使用关键字增强它们以提高文档检索效率; 最后,处理后的文档存储在矢量数据库中,以便将来检索

9、广泛的参考文档、示例应用程序和研讨会/课程材料; 未来的版本将在此基础上提供对其他人工智能模型的访问,例如,谷歌刚刚发布的Gemini多模式模态,一个评估人工智能应用程序有效性的框架,更方便的API,以及帮助解决“查询/汇总我的文档”用例的功能。有关即将发布的版本的详细信息,请查看GitHub

(二)SpringAI-Chat 属性(Chat Properties)

重试属性

属性前缀为spring.ai.retry,用于配置 OpenAI 聊天客户端的重试机制
属性描述默认值spring.ai.retry.max-attempts最大重试次数。10spring.ai.retry.backoff.initial-interval指数退避策略的初始睡眠持续时间。2 sec.spring.ai.retry.backoff.multiplier退避策略间隔倍数。5spring.ai.retry.backoff.max-interval最大退避持续时间。3 min.spring.ai.retry.on-client-errors如果为 false,则引发 NonTransientAiException,并且对4xx客户端错误代码不尝试重试falsespring.ai.retry.exclude-on-http-codes不触发重试的 HTTP 状态代码列表(例如,抛出 NonTransientAiException)。empty

连接属性(Connection Properties)

属性前缀为 spring.ai.openai
属性描述默认值spring.ai.openai.base-url要连接到的 openai URLapi.openai.comspring.ai.openai.api-key访问 api 的 key,在 OpenAI 的秘钥管理里获取-

配置属性

属性前缀为spring.ai.openai.chat,可用于配置 OpenAI 的聊天客户端属性
属性描述默认值spring.ai.openai.chat.enabled启用 OpenAI 聊天客户端。truespring.ai.openai.chat.base-url可选项,配置的情况下会在聊天的场景下覆盖 spring.ai.openai.base-url-spring.ai.openai.chat.api-key可选项,配置的情况下会在聊天的场景下覆盖 spring.ai.openai.api-key-spring.ai.openai.chat.options.model要使用的 OpenAI 聊天模型gpt-3.5-turbo (gpt-3.5-turbo gpt-4 和 gpt-4-32k 都是使用最新的版本)
spring.ai.openai.chat.options.temperature
要使用的模型温度,用于控制生成数据的创造力。较高的值将使输出更具随机性,而较低的值将使结果更具针对性和确定性。不建议对一个请求同时配置 temperature 和 top_p,因为这两个参数同时生效将导致结果难以预测。0.8spring.ai.openai.chat.options.frequencyPenalty介于 -2.0 和 2.0 之间的数字。到目前为止,正值会根据在文本中的出现频率来惩罚新令牌,从而降低模型重复同一行的可能性。0.0fspring.ai.openai.chat.options.logitBias修改特殊令牌在对话中出现的可能性。-spring.ai.openai.chat.options.maxTokens聊天对话返回的最大令牌数。输入令牌数和生成令牌数的总长度受模型上下文长度的限制。-spring.ai.openai.chat.options.n为每条输入消息生成多少个对话选项。请注意,将根据所有选项生成的令牌总数付费。将 n 保留为 1 以最大程度地降低成本。1spring.ai.openai.chat.options.presencePenalty介于 -2.0 和 2.0 之间的数字。正值会根据到目前为止的新令牌是否出现在文本中来惩罚它们,从而增加模型谈论新主题的可能性。-spring.ai.openai.chat.options.responseFormat一个对象,指定模型必须输出的格式。设置为 { “type”: “json_object” } 启用 JSON 模式,该模式可保证模型生成的消息是有效的 JSON。-spring.ai.openai.chat.options.seed此功能处于测试阶段。如果指定,我们的系统将尽最大努力确定性采样,以便具有相同seed和参数的重复请求返回相同的结果。-spring.ai.openai.chat.options.stop最多 4 个序列(sequences),API 将停止生成更多令牌。-spring.ai.openai.chat.options.topP温度采样的替代方法,称为核采样,其中模型考虑概率质量排序top_p的令牌的结果。因此,0.1 表示仅考虑包含前 10% 概率质量的令牌。我们通常建议改变这个或温度,但不要同时改变两者。-spring.ai.openai.chat.options.tools模型可以调用的工具列表。目前,仅支持将函数作为工具。这个参数可以把以JSON格式输入的函数列表提供给模型-
spring.ai.openai.chat.options.toolChoice
控制模型调用哪个(如果有)函数。none 表示模型不会调用函数,而是生成消息。auto 表示模型可以在生成消息或调用函数之间进行选择。通过 {“type: ”function“, ”function“: {”name“: ”my_function“}} 指定特定函数会强制模型调用该函数。当不存在任何函数时,none 是默认值。如果存在函数,则 auto 是默认值。 -spring.ai.openai.chat.options.user代表您的终端用户的唯一标识符,可以帮助 OpenAI 监控和检测滥用行为。-spring.ai.openai.chat.options.functions函数列表,由其名称标识,启用时单个提示词请求中会调用函数。具有这些名称的函数必须存在于 functionCallbacks 注册表中

三、开发SpringAI

(一)开发SpringAI准备

1、访问OpenAI权限和API Key

(1)本机电脑要可以访问OpenAI网站 https://openai.com/;(科学上网)

(2)要有OpenAI的API Key;(注册账号或者某宝上购买)

例:API-Key:sk-8sfKHJ03KJG3SDFfsdf283JSwsf23lkjkHDND32fmGJHF

在某宝上搜索 open ai api key,找到API key,购买之前请咨询清楚是直连还是转发地址?以及是否开发要用到的API key

2、开发SpringBoot和IDEA版本要求

Spring AI的发布时间是2024年3月1日‌‌

Spring AI是一个人工智能工程的应用框架,旨在为Java开发者提供一种更简洁的方式与AI交互,减轻在Java业务中接入LLM模型应用的学习成本。目前,Spring AI已经上架到Spring Initializr,开发者可以在https://start.spring.io/上使用并构建相关应用‌

‌使用SpringAI至少需要SpringBoot 3.2版本‌

SpringAI是Spring框架的一个新项目,旨在简化Java开发人员将AI功能集成到应用程序中的过程

使用SpringAI,需要确保开发环境满足以下2个要求:

1、JDK版本:JDK 17(含)以上‌

2、SpringBoot版本:3.2以上‌

3、IDEA2024版

此外,SpringAI支持接入多种AI服务,如OpenAI、Ollama、Azure OpenAI、Huggingface等,可以实现聊天、embedding、图片生成、语音转文字、向量数据库、function calling、prompt模板、outputparser、RAG等功能‌

1、创建SpringAI项目

选择Spring Boot 至少3.2版本;且勾选AI中的OpenAI选项(2024之前的老版本IDEA应该没有这个选项)

2、添加依赖;加入spring-ai-openai-spring-boot-starter依赖

<?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>

    <groupId>com.demo</groupId>
    <artifactId>spring-ai</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-ai</name>
    <description>spring-ai</description>

    <properties>
        <java.version>17</java.version>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!-- SpringAI当前版本1.0.0-M3;快照版1.0.0-SNAPSHOT -->
        <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>

        <!--spring ai的starter依赖,启动依赖-->
        <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>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <!--配置本项目的仓库:因为maven中心仓库还没有更新spring ai的jar包-->
    <repositories>
        <repository>
            <!-- SpringAI快照版 -->
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <!-- 当前最新M3版 -->
<!--            <id>spring-milestones</id>-->
<!--            <name>Spring Milestones</name>-->
<!--            <url>https://repo.spring.io/milestone</url>-->
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

</project>

ai依赖:

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

继承父项目

<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>

配置项目依赖下载的AI仓库:

<!--配置本项目的仓库:因为maven中心仓库还没有更新spring ai的jar包-->
    <repositories>
        <repository>
            <!-- SpringAI快照版 -->
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <!-- 当前最新M3版 -->
<!--            <id>spring-milestones</id>-->
<!--            <name>Spring Milestones</name>-->
<!--            <url>https://repo.spring.io/milestone</url>-->
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

Maven中心仓库搜不到这个依赖

3、配置yml文件

spring:
  application:
    name: spring-ai
  ai:
    openai:
      api-key: sk-8sfKHJ03KJG3SDFfsdf283JSwsf23lkjkHDND32fmGJHF  # 换成你自己的api-key
      base-url: https://api.openai.com  #如果是购买的转发地址,这边换成转发的OpenAI地址

4、编写测试类测试

(1)注入OpenAiChatModel

@Resource private OpenAiChatModel openAiChatModel;

注:刚开始发布的版本,这里是 OpenAiChatClient

(2)调用call方法 openAiChatModel.call(message);

package com.demo.springai1chat.controller;

import jakarta.annotation.Resource;
import org.springframework.ai.openai.OpenAiChatModel;
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;

/**
 * @description:
 * @author: zm
 */
@RestController
@RequestMapping("/ai")
public class ChatController {

    /**
     * spring-ai自动装配的,可以直接注入使用
     */
    @Resource
    private OpenAiChatModel chatModel;

    /**
     * OpenAI接口调用
     * @param message   提问信息
     * @return  OpenAI相应信息
     */
    @GetMapping("/chat")
    public String aiChat(@RequestParam("msg")String message) {
        return chatModel.call(message);
    }
}

自动装配(Auto-configuration )

添加了 spring-ai-openai-spring-boot-starter 依赖;Spring AI 为 OpenAI Chat Client 提供了 Spring Boot 自动装配。

OpenAiAutoConfiguration配置类中自动注入了,我们只需要直接注入调用即可

刚开始发布的SpringAI版本中,叫OpenAiChatClient

而该依赖中针对各个大模型提供了一个对应的自动配置类,如OpenAiAutoConfiguration,在该自动配置类中定义了以下几个Bean:

OpenAiChatModel/OpenAiChatClient(老版本):文字聊天客户端
OpenAiEmbeddingModel/OpenAiEmbeddingClient(老版本):文本向量化客户端
OpenAiImageModel/OpenAiImageClient(老版本):文生图客户端
OpenAiAudioTranscriptionModel/OpenAiAudioTranscriptionClient(老版本):语音转文字客户端

这些Bean在创建时就会构造底层连接OpenAi的客户端OpenAiApi对象,其中会用到以下几种配置:

OpenAiConnectionProperties:连接配置
OpenAiChatProperties:聊天配置
OpenAiEmbeddingProperties:向量化配置
OpenAiImageProperties:文生图配置
OpenAiAudioTranscriptionProperties:语音转文字配置

连接OpenAi的地址就apiKey就在OpenAiConnectionProperties中,比如application.properties的配置为:

spring.ai.openai.base-url=http://localhost:3000
spring.ai.openai.api-key=sk-xxxxx

5、启动调用访问 localhost:8080/ci/chat?msg=为我写一首歌http://localhost:8080/ai/chat?msg=为我写一首歌

(二)AI聊天

application.yml配置文件

spring:
  application:
    name: spring-ai-01-chat
  ai:
    openai:
      api-key: ${OPENAI_API_KEY} # 换成你自己的api-key
      #如果是购买的转发地址,这边换成转发的OpenAI地址
      base-url: ${OPENAI_BASE_URL}  
      # 可选参数在配置文件中配置了,在代码中也配置了,则以代码的配置为准(代码的配置会覆盖掉配置文件中的配置)
      chat:
        options:
          # 当前默认版本 gpt-4o
          model: gpt-4-32k
          temperature: 0.4

在OpenAIChatOptions类中打上断点可以看到当前默认的版本

package com.demo.springai1chat.controller;

import jakarta.annotation.Resource;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.openai.OpenAiChatModel;
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;

/**
 * @description:
 * @author: zm
 */
@RestController
@RequestMapping("/ai")
public class ChatController {

    /**
     * spring-ai自动装配的,可以直接注入使用
     */
    @Resource
    private OpenAiChatModel chatModel;

    /**
     * OpenAI接口调用
     * @param message   提问信息
     * @return  OpenAI相应信息
     */
    @GetMapping("/chat")
    public String aiChat(@RequestParam("msg")String message) {
        String msgResp = chatModel.call(message);
        return msgResp;
    }

    /**
     * OpenAI接口调用
     * @param message   提问信息
     * @return  OpenAI相应信息
     */
    @GetMapping("/chat/prompt")
    public ChatResponse aiChatPrompt(@RequestParam("msg")String message) {
        ChatResponse chatResp = chatModel.call(new Prompt(message));
        //chatResp.getResult().getOutput().getContent();
        return chatResp;
    }

    /**
     * OpenAI接口调用
     * @param message   提问信息
     * @return  OpenAI相应信息
     */
    @GetMapping("/chat/option")
    public ChatResponse aiChatOptions(@RequestParam("msg")String message) {
        //可选参数在配置文件中配置了,在代码中也配置了,则以代码的配置为准(代码的配置会覆盖掉配置文件中的配置)
        ChatResponse chatResp = chatModel.call(new Prompt(message, OpenAiChatOptions.builder()
                .withModel("gpt-4-32k") //gpt的版本,32k是参数量(参数量越大,回答的问题质量越好,准确率越高)
                .withTemperature(0.4) //温度越高,回答得比较有创新性,但是准确率会下降,温度越低,回答的准确率会更好
                .build()));
        // chatResponse.getResult().getOutput().getContent();
        return chatResp;
    }

    /**
     * OpenAI接口调用
     * @param message   提问信息
     * @return  OpenAI相应信息
     */
    @GetMapping("/chat/stream")
    public Object aiChatStream(@RequestParam("msg")String message) {
        //可选参数在配置文件中配置了,在代码中也配置了,则以代码的配置为准(代码的配置会覆盖掉配置文件中的配置)
        Flux<ChatResponse> chatRespFlux = chatModel.stream(new Prompt(message, OpenAiChatOptions.builder()
                .withModel("gpt-4-32k") //gpt的版本,32k是参数量(参数量越大,回答的问题质量越好,准确率越高)
                .withTemperature(0.4) //温度越高,回答得比较有创新性,但是准确率会下降,温度越低,回答的准确率会更好
                .build()));
        chatRespFlux.toStream().forEach(chatResp ->
                System.out.println(chatResp.getResult().getOutput().getContent())
        );
        return chatRespFlux.collectList();
    }
}

1、使用call参数‌:

call

方法用于同步获取模型响应

【1】创建Prompt 对象传入message参数

【2】使用 ChatOptionsBuilder#builder() 创建的可移植 ChatOptions 实例

2、使用stream参数‌:

stream

方法用于流式获取模型响应,适用于需要长时间处理或大量数据的场景


本文转载自: https://blog.csdn.net/MinggeQingchun/article/details/143193524
版权归原作者 MinggeQingchun 所有, 如有侵权,请联系我们删除。

“AI - 人工智能;Java之SpringAI(一)”的评论:

还没有评论