用JAVA实现人工智能:采用框架Spring AI Java

Spring AI 集成人工智能,为Java项目添加AI功能指南

本文主旨是用实际的可操作的代码,介绍Java怎么通过spring ai 接入大模型。

例子使用spring ai alibaba QWen千问api完成,你可以跑通以后换自己的实现。QWen目前有100万免费Token额度,可以快速实现需求。同时,因为qwen也是个开源的模型,我们可以自己搭建模型来实现免费使用。

目录

?编辑

[Spring AI 集成人工智能,为Java项目添加AI功能指南](#Spring AI 集成人工智能,为Java项目添加AI功能指南)

[Spring AI 介绍:为Java引入统一的AI开发框架](#Spring AI 介绍:为Java引入统一的AI开发框架)

[Spring AI的主要功能介绍](#Spring AI的主要功能介绍)

[模型 Model](#模型 Model)

[提示 Prompt](#提示 Prompt)

[提示词模板 Prompt Template](#提示词模板 Prompt Template)

[嵌入 Embedding](#嵌入 Embedding)

[结构化输出 Structured Output](#结构化输出 Structured Output)

[检索增强生成 RAG](#检索增强生成 RAG)

[智能体 Agent](#智能体 Agent)

[函数调用 Function Calling](#函数调用 Function Calling)

[向量存储 Vector Store](#向量存储 Vector Store)

[Spring AI Alibaba 介绍 :接入阿里云百炼大模型的开发工具](#Spring AI Alibaba 介绍 :接入阿里云百炼大模型的开发工具)

阿里云通义千问介绍

[使用Spring AI Alibaba构建聊天API的详细指南](#使用Spring AI Alibaba构建聊天API的详细指南)

[1. 环境准备](#1. 环境准备)

[2. 获取API Key](#2. 获取API Key)

[3. 配置API Key](#3. 配置API Key)

[4. Maven仓库与依赖配置](#4. Maven仓库与依赖配置)

[5. ChatClient的初始化与控制器实现](#5. ChatClient的初始化与控制器实现)

[6. 测试](#6. 测试)


Spring AI 介绍:为Java引入统一的AI开发框架

过去,Java在AI应用框架方面存在不足,缺乏一个能够良好支持AI开发的统一框架。Spring AI应运而生,它是一个专为AI工程设计的应用框架,旨在将Spring生态系统的设计原则如可移植性和模块化引入AI领域。Spring AI的核心优势在于它提供了一套标准化接口,使得开发者可以轻松地切换不同的AI服务提供商,仅需修改配置即可。此外,Spring AI与现有的Spring生态兼容性极好,同时也完美地融入了Java面向对象编程的特点。这不仅简化了开发流程,还极大地减少了迁移和维护的成本。

Spring AI的主要功能介绍

模型 Model

一句话说明:提供与阿里云通义大模型交互的能力。

输入:用户查询或指令。

输出:基于大模型生成的响应。

举例:通过ChatClient调用通义千问,实现聊天对话。

提示 Prompt

一句话说明:作为有组织的一系列消息和请求选项的容器。

输入:一系列消息及请求选项。

输出:AI模型的响应结果。

举例:使用ChatModel的call()方法传递Prompt实例,获取AI回复。

提示词模板 Prompt Template

一句话说明:用于构建动态提示内容的模板机制。

输入:占位符参数值。

输出:完整的提示字符串。

举例:从文件加载模板并替换参数后发送给AI模型,如生成笑话。

嵌入 Embedding

一句话说明:将文本转换为向量表示,便于相似度计算等操作。

输入:原始文本。

输出:对应的向量形式。

举例:将用户输入转换成向量,用于后续处理如检索增强生成。

结构化输出 Structured Output

一句话说明:将AI模型的非结构化输出转换为结构化的Java对象。

输入:AI模型生成的非结构化文本。

输出:映射到指定Java Bean的数据。

举例:将描述演员及其电影列表的文字自动转换为ActorsFilms类的对象。

检索增强生成 RAG

一句话说明:结合外部数据源提高生成内容的质量和准确性。

输入:用户查询及相关背景信息。

输出:基于检索结果生成的更准确回答。

举例:利用阿里巴巴财报PDF中的信息回答关于财报的问题。

智能体 Agent

一句话说明:代表执行特定任务的逻辑实体。

输入:任务相关的参数。

输出:任务执行的结果。

举例:定义一个数学工具函数供LLM在需要时调用进行计算。

函数调用 Function Calling

一句话说明:允许大型语言模型调用开发者定义的功能。

输入:函数名及所需参数。

输出:函数执行后的结果。

举例:通过定义MessageStatusService查询消息状态,并由LLM决定何时调用。

向量存储 Vector Store

一句话说明:管理和查询文档向量数据库。

输入:文档及其元数据。

输出:按相似度排序的匹配文档列表。

举例:上传PDF文件至知识库,随后基于查询向量检索相关片段。

Spring AI Alibaba 介绍 :接入阿里云百炼大模型的开发工具

Spring AI Alibaba 是基于 Spring AI 的实现,它专为接入阿里云百炼系列大模型而设计。通过 Spring AI Alibaba,开发者能够轻松使用阿里云通义提供的聊天、图片生成或语音生成等AI应用。

Spring AI Alibaba 提供了包括对话、文生图、文生语音等功能在内的多种生成式模型适配,并支持OutputParser、Prompt Template以及让AI模型接入外部数据的能力。

这使得开发者可以快速构建具备智能对话和其他AI功能的应用程序。

其核心优势在于标准化了不同AI提供者的接口实现,允许一次编写代码后只需更改配置即可切换不同的AI服务提供商。此外,它直接兼容Flux流输出,简化了与市场上多数基于流的机器人模型的集成过程。

阿里云通义千问介绍

通义千问是由阿里集团提供的开源大模型服务,支持全尺寸、多模态的大规模模型。在中文开源模型领域中,通义千问展现了卓越的能力,在多项客观评测指标上超越了Llama 3 70B,并在国内的思南大模型竞技场排名中名列前茅。

通义千问的核心优势包括:1)能力排名靠前;2)可访问性和合规性;3)完全开源;4)价格合适。其中,Qwen和Qwen vl两个模态的模型在开源榜单上均位居国内第一。调用API的成本较低,且有100万免费token可以使用,甚至可以选择自己构建以实现免费使用。

对于大模型的客观测评方法,通常采用基准测试和人类评估两种方式。基准测试通过设置考题和答案来评分,常见的基准测试包括GSM-8K、MMLU、TheoremQA和GPQA等。而人类评估或竞技场模式则是由人根据偏好选择更优的答案,这种模式更加贴近实际应用场景,但可能存在主观性偏差。结合使用这两种方法可以获得更为全面的大模型性能评价。

参考链接:

使用Spring AI Alibaba构建聊天API的详细指南

为了实现基于Spring AI Alibaba的聊天API,允许用户输入信息并通过流式返回结果,我们需遵循以下步骤。这个过程包括了环境配置、依赖管理、API Key设置、ChatClient的注入以及具体的Controller实现等环节。以下是详细的执行步骤:

1. 环境准备

确保你的开发环境满足如下要求:

  • JDK版本:JDK 17 或更高。

  • Spring Boot版本:3.3.x 或更高。

2. 获取API Key

访问阿里云百炼页面,登录后开通"百炼大模型推理"服务,并创建一个新的API Key。请妥善保存此Key,后续需要在项目中使用。

3. 配置API Key

在启动你的应用程序前,请确保已在环境中设置了AI_DASHSCOPE_API_KEY环境变量,其值为上一步获取到的API Key。例如,在Unix-like系统中可通过命令行设置:

export AI_DASHSCOPE_API_KEY=your_api_key_here

同时,在application.properties文件里添加以下内容以供Spring Boot应用读取:

spring.ai.dashscope.api-key=${AI_DASHSCOPE_API_KEY}
4. Maven仓库与依赖配置

由于Spring AI Alibaba相关组件尚未发布到Maven中心仓库,因此你需要将Spring官方的里程碑和快照仓库添加至项目的pom.xml文件中。此外还需添加Spring AI Alibaba的starter依赖和其他必要的Spring Boot依赖项。

<repositories>
    <repository>
        <id>sonatype-snapshots</id>

        <url>https://oss.sonatype.org/content/repositories/snapshots</url>

        <snapshots>
            <enabled>true</enabled>

        </snapshots>

    </repository>

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

<dependencies>
    <!-- Spring Boot parent project -->
    <parent>
        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-parent</artifactId>

        <version>3.3.4</version>

        <relativePath/>
    </parent>

    <dependency>
        <groupId>com.alibaba.cloud.ai</groupId>

        <artifactId>spring-ai-alibaba-starter</artifactId>

        <version>1.0.0-M3.1</version>

    </dependency>

    <!-- Other dependencies as needed -->
</dependencies>
5. ChatClient的初始化与控制器实现

接下来,我们需要在Controller中注入ChatClient实例,并通过它来处理来自用户的请求。这里展示了一个简单的示例,该示例接收用户输入并利用Flux流式返回AI生成的回答。

@RestController
@RequestMapping("/ai")
@CrossOrigin(origins = "*")
public class ChatController {

    private final ChatClient chatClient;
    
    @Value("classpath:correct-and-expand.st")
    Resource resource;

    public ChatController(ChatClient.Builder builder) {
        this.chatClient = builder.build();
    }

    @GetMapping("/chat")
    public String chat(String input) {
        return this.chatClient.prompt()
                .user(input)
                .call()
                .content();
    }

    @GetMapping(value = "/chatStream")
    public Flux<String> chatSteam(@RequestParam String input, HttpServletResponse response) {
        // 如果遇到乱码问题,可增加编码设置
        response.setCharacterEncoding("UTF-8");
        
        PromptTemplate promptTemplate = new PromptTemplate(resource);
        Prompt prompt = promptTemplate.create(Map.of("input", input));
        return chatClient.prompt(prompt).stream().content();
    }
}

以上代码展示了如何构建一个简单的聊天API端点,其中/chat用于非流式响应,而/chatStream则支持基于Reactor的流式响应。

6. 测试

完成上述步骤后,你可以通过向http://localhost:8080/ai/chat?input=你好发送GET请求来测试聊天功能是否正常工作。对于流式响应,尝试访问http://localhost:8080/ai/chatStream?input=你好查看效果。

通过按照上述步骤操作,你就能成功集成Spring AI Alibaba框架,搭建起一个基本但功能完整的聊天API服务。

相关推荐
rgrgrwfe18 分钟前
【Tomcat】
java·tomcat
易雪寒18 分钟前
Java大厂面试题之10种分布式ID的生成方案
java·开发语言·分布式
Karen19823 分钟前
汉服文化管理系统|Java|SSM|VUE| 前后端分离
java·数据库·mysql·毕业设计·课程设计
程序猿阿伟36 分钟前
《鸿蒙微内核与人工智能算法协同,开启智能系统新时代》
人工智能·计算机视觉
明天不吃。43 分钟前
【JMM】Java 内存模型
java·开发语言
成为大佬先秃头1 小时前
Springboot整合Shiro使用yml文件管理Urls
java·spring boot·后端·shiro
鹿屿二向箔1 小时前
基于Spring Boot的紧急物资管理系统
java·spring boot·后端
Anlici1 小时前
魔搭 AI 框架开发与 LangChain 的结合
人工智能·python·开源
智能汽车人1 小时前
Robot---奇思妙想轮足机器人
人工智能·机器人·自动驾驶
山山而川粤1 小时前
共享充电宝系统|Java|SSM|VUE| 前后端分离
java·开发语言·后端·学习·mysql