‌Spring AI

‌传送门

PyCharm无法识别LangChain库的问题

序言

最近在B站看AI相关视频,发现都是用的Python,几乎没有用JAVA来写代码的。在Spring做为JAVA应用事实标准的情况下,不可能对这种情况视而不见,或者说是这种挑战的应对。所以推出了springAI:Spring AI 解决了 AI 集成的根本挑战:Connecting your enterprise Data and APIs with AI Models.(将您的企业数据与 API 同 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该项目旨在简化包含人工智能功能的应用程序的开发,而不会产生不必要的复杂性。

该项目从著名的 Python 项目(如 LangChain 和 LlamaIndex)中汲取灵感,但 Spring AI 并不是这些项目的直接移植。 该项目的成立理念是,下一波生成式 AI 应用程序将不仅适用于 Python 开发人员,而且将在许多编程语言中无处不在。

-------------------------------出于Spring AI介绍

使用springAI

官方地址

spring的官方地址:Spring AI

中文地址:Spring AI

入门指南

由于是要快速通过代码来跑一个例子,所以不去纠结它的背景、架构、原理及源码,所以先体验一把springAI的"Hello World"!具体可以参考:入门指南

环境依赖

根据spring的要求,使用springAI有明确的支持版本,可以看官方的说明:

Spring AI supports Spring Boot 3.4.x and 3.5.x.

所以得到的版本依赖如下:

  • Spring Boot的版本要3.4.x and 3.5.x
  • 所以对应的JDK版本要求:Spring Boot 3.x 系列统一要求 JDK 17 为最低运行版本
  • 因为用的maven管理,所以对应的版本为3.6

Spring Boot 初始化

首先要初始化一个Java项目,这里有几种方式。

方式一

是直接使用spring的工具,前往 start.spring.io 并选择您希望在新应用中使用的 AI 模型和向量存储:

方式二

可以直接在idea里面创建Spring Boot项目,这个需要安装Spring Initializr插件:

安装之后就可以创建SpringAI项目了

项目名称为ai-learn-demo1,JDK为17。 并添加对应的依赖,SpringBoot的版本为3.5.14,Web依赖、AI模型为DeepSeek。

依赖管理

XML 复制代码
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-bom</artifactId>
            <version>1.0.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

聊天模型API

聊天模型是最常用也是使用最广泛的模型,所以这里就以聊天模型为例子来演示。

springAI为聊天模型定义了统一的接口,这里是ChatModel接口定义:

java 复制代码
public interface ChatModel extends Model<Prompt, ChatResponse>, StreamingChatModel {

	default String call(String message) {...}

    @Override
	ChatResponse call(Prompt prompt);
}

call() 方法带有一个 String 参数,简化了初步使用,避免了更复杂的 PromptChatResponse 类所带来的复杂性。 在实际应用中,更常见的是使用接受 Prompt 实例并返回 ChatResponsecall() 方法。

现在更流行的方式是流式响应,这个springAI也有支持。这里是StreamingChatModel接口定义:

java 复制代码
public interface StreamingChatModel extends StreamingModel<Prompt, ChatResponse> {

    default Flux<String> stream(String message) {...}

    @Override
	Flux<ChatResponse> stream(Prompt prompt);
}

stream() 方法接受一个类似于 ChatModel 但使用响应式 Flux API 流式传输响应的 StringPrompt 参数。

聊天模型对比

springAI几乎支持全部的模型,这里直接引用官方的数据:聊天模型对比

本表比较了Spring AI支持的多种聊天模型,并详细列出了它们的功能:

  • 多模态: 模型能够处理的输入类型(例如,文本、图像、音频、视频)。

  • 工具/函数调用: 模型是否支持函数调用或工具使用。

  • 流式处理:如果模型支持提供流式响应。

  • 重试:支持重试机制。

  • 可观察性: 监控和调试功能。

  • 内置JSON: 原生支持JSON输出。

  • 本地部署:模型是否可以在本地运行。

  • OpenAI API 兼容性:如果模型与OpenAI的API兼容。

提供者 多模态 Tools/Functions 流处理 重试 可观测性 内置JSON 本地 OpenAI API 兼容
Anthropic Claude 文本、PDF、图像
Azure OpenAI 文本, 图片
深度求索(OpenAI代理) 文本
谷歌GenAI 文本,PDF文件,图片,音频,视频
Google Vertex AI Gemini 文本,PDF文件,图片,音频,视频
Groq (OpenAI-proxy) 文本, 图片
HuggingFace 文本
Ollama 文本, 图片

DeepSeek

| 提供者 | 多模态 | Tools/Functions | 流处理 | 重试 | 可观测性 | 内置JSON | 本地 | OpenAI API 兼容 |

深度求索(OpenAI代理) 文本

从上表中可以看到DeepSeek模型的的相关特性(也就是深度求索)。所以这里以DeepSeek为例来进行调用:深度搜索聊天

前提条件

使用DeepSeek的API调用,需要在DeepSeek进行注册以及创建API-KEY:API keys

依赖管理

在pom文件中添加对DeepSeek模型的依赖:

XML 复制代码
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-model-deepseek</artifactId>
</dependency>
聊天属性

DeepSeek提供了很多属性来控制对应的模型功能,这里主要需要3个基本属性application.properties:

java 复制代码
spring.application.name=ai-learn-demo1
server.port=8080

spring.ai.deepseek.base-url=https://api.deepseek.com
# 将api-key替换为您的DeepSeek凭据。
spring.ai.deepseek.api-key=YOUR_API_KEY
spring.ai.deepseek.chat.options.model=deepseek-chat

具体的配置含义可以参考DeepSeek的官方地址:首次调用 API

示例控制器
java 复制代码
@RestController
public class ChatController {

    private final DeepSeekChatModel chatModel;

    @Autowired
    public ChatController(DeepSeekChatModel chatModel) {
        this.chatModel = chatModel;
    }

    @GetMapping("/ai/generate")
    public Map generate(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
        return Map.of("generation", chatModel.call(message));
    }

    @GetMapping("/ai/generateStream")
	public Flux<ChatResponse> generateStream(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
        var prompt = new Prompt(new UserMessage(message));
        return chatModel.stream(prompt);
    }
}

测试DeepSeek模型

把项目启动起来,发起一个请求:http://localhost:8080/ai/generate?message=你是谁呀

写在最后

至此就可以通过springAI实现了调用DeepSeek模型了。不过DeepSeek模型需要充值(最少1块),所以下一节会通过Ollama来部署本地模型,并通过springAI来调用!

相关推荐
骄马之死2 小时前
Spring 核心知识点(IOC + AOP + 事务)
java·后端·spring
学计算机的计算基2 小时前
2026 年 AI 助手三国杀:Claude Code vs 腾讯马维斯 vs MiniMax Mavis,我同时用了三周,结论很意外
java·人工智能·python·算法·langchain
_Aaron___2 小时前
Spring AI 应用上线前,先把大模型调用变成可观测链路
java·人工智能·spring
小糯米6012 小时前
C语言 自定义类型:联合和枚举
java·c语言·开发语言
weixin_523185322 小时前
Java基础知识总结(二):JVM内存结构与变量生命周期
java·开发语言·jvm
我是大猴子2 小时前
连接池+虚拟线程
java
技术小结-李爽2 小时前
【工具】如何认识Maven
java·maven
小碗羊肉2 小时前
【RabbitMQ高级】如何保证消息的可靠性?
java·rabbitmq·java-rabbitmq
xiaoshuaishuai83 小时前
C# 多线程之间对比
java·开发语言·c#