Spring AI Framework
一、SpringAI前言
Spring AI 是一个用于AI工程的应用框架。其目标是将Spring生态系统设计原则应用于AI领域,如可移植性和模块化设计,并推广将POJO作为应用构建模块到人工智能领域的应用。
Spring AI 的核心是解决人工智能集成的根本挑战:将企业数据(微调、RAG方式、 Tool Calling)和API与 AI 模型连接起来。
二、Spring AI 提供功能
-
支持所有主要的人工智能模型提供商和模型类型(Chat Completion 聊天完成、Embedding 嵌入...)
-
结构化输出:将 AI模型输出映射到 POJO
-
支持所有主要的向量数据库提供商:如Milvus、Oracle、PostgreSQL/PGVector。
-
工具/函数调用:允许模型执行客户端工具和函数,根据需要访问必要的实时信息。
-
ChatClient API:提供AI聊天模型API,类似于WebClient 和 RestClient API。
-
Advisors API :封装反复出现的生成式人工智能模式,转换与语言模型(LLM)之间的数据转换,并提供跨多种模型和用例的可移植性。
-
可观察性:提供关于AI相关操作的洞察。
-
AI 模型评估:帮助评估生成内容并防止幻觉反应的实用工具。
-
Spring Boot自动配置及所有AI模型和向量存储的起始程序:使用start.spring.io 选择的模型或向量存储。
三、Spring AI架构

核心(模型)抽象层(基础能力层)
支持不同类型的模型(聊天、嵌入、各种文本和音频转换),通过统一编程模型屏蔽不同AI服务商(OpenAI、通义、DeepSeek等)的技术差异。

基础设施
启动自动装配(通义千问、DeepSeek):
示例: 1) spring-ai-alibaba-autoconfigure-dashscope-1.x.jar:自动配置 -> ChatClient -> DashScopeChatModel(spring-ai-alibaba-dashscope-1.x.jar:核心模型类)
- auto-configurations模块.models.spring-ai-autoconfigure-model-deepseek.DeepSeekChatAutoConfiguration:自动配置 -> ChatClient -> models模块.spring-ai-deepseek.DeepSeekChatModel(核心模型类)
核心组件抽象层(基础能力层)
该层提供AI应用开发的核心基础能力。
1.Chat Model API 聊天模型API:通过分层抽象,将通用的模型调用逻辑与特定于聊天场景的业务逻辑分离。

AssistantMessage:多轮对话中承载 AI 的响应内容(文本、工具调用或媒体)或调用请求内容,标识消息由AI(助手)生成,对应对话历史中的'assistant'角色。
**2.提示词模板引擎:**核心类PromptTemplate,通过 TemplateRenderer 接口来实现对模板字符串中变量的替换。
示例用法:
Java
String userText = """
给我讲讲海盗黄金时代的三位著名海盗,以及他们为何成为海盗。
每位海盗至少写一句话。
""";
//user角色消息
Message userMessage = new UserMessage(userText);
String systemText = """
你是一个乐于助人的AI助手,帮助人们查找信息。
你的名字是 {name}
你应该用你的名字并以 {voice} 的风格回复用户的请求。
""";
//System提示词模板定义与创建系统消息systemMessage
SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemText);
Message systemMessage = systemPromptTemplate.createMessage(Map.of("name", name, "voice", voice));
//带有角色user的消息与带有角色system的消息相结合,形成完整的提示
Prompt prompt = new Prompt(List.of(userMessage, systemMessage));
//LLM基于prompt进行调用与响应
List<Generation> response = chatModel.call(prompt).getResults();
3.Tool Calling 工具调用
大语言模型(LLMs)在训练后会被冻结,导致知识陈旧,无法访问或修改外部数据。而工具调用可让AI模型在回答过程中,发现需要外部实时信息或执行操作时,能够自动调用外部工具来获取数据或执行动作,将大型语言模型连接到外部系统。模型只能请求工具调用并提供输入参数,由应用程序负责执行工具的实际逻辑。

与外部系统交互的核心流程:
前提:注册工具定义
@Tool注释方法向Spring AI注册工具定义。包含以下三个关键信息:
-
name:唯一标识该工具,例如
get_weather、query_order,位于WeatherToolProvider类 -
description:说明工具的作用,帮助LLM判断何时调用该工具,例如 "根据城市名称查询当前天气"
-
input schema(输入参数结构):定义调用工具所需的参数格式(如 JSON Schema),例如
{"city": "string"} -
调用:ChatClient.create.chatModel).prompt().user("根据城市名称查询当前天气")
.tools(new WeatherToolProvider()).call().content();
步骤1:发起聊天请求(Chat Request)
用户向 Spring AI 发送一个聊天请求。例如: "武汉今天天气怎么样?"
步骤2:模型决策与工具调用请求(AI Model)
Spring AI 将用户请求和已注册的工具定义一并发送给 AI Model。模型会进行判断:
-
若无需调用工具:模型直接生成答案并返回。
-
若需要调用工具:模型会返回一个工具调用请求,指明:
-
要调用的工具名称(如
get_weather) -
所需的参数值(如
{"city": "武汉"})
-
步骤3:Spring AI 分发调用请求(Dispatch Tool Call Requests)
Spring AI 接收到模型返回的工具调用请求后,负责实际调用对应的工具(外部服务API)。例如:调用天气查询接口,传入 city=武汉,获取实时天气数据。
步骤4:工具执行并返回结果
被调用的工具(外部服务)执行相应逻辑,并将结果返回给 Spring AI。例如:{"weather": "晴", "temperature": 28, "unit": "℃"}
步骤5、6:生成聊天响应(Chat Response)
Spring AI 将工具返回的结果再次发送给 AI Model。模型会结合原始用户问题、工具返回的实时数据
生成最终聊天响应,返回给用户。例如:"武汉今天天气晴朗,气温28℃。"
**动态工具发现(Dynamic Tool Discovery)😗*生产工具量很大(50+工具)
解决所有工具定义随每次请求发送一起调用,消耗大量的Token*50+,浪费成本。
初始只发送一个"工具搜索工具Tool Search Tool"给模型,只有当模型判断需要某个能力时,才动态搜索并加载相关工具的定义。
核心流程:

测试动态工具发现请求示例:
Java
* GET /discovery?msg=武汉今天天气怎么样? *WeatherTool*
* GET /discovery?msg=现在几点了? *TimeTool*
* GET /discovery?msg=查询订单ORD001的物流状态 *OrderTool *
*
* 原理:
* 1. 首次请求只发送 toolSearchTool
* 2. 模型调用 toolSearchTool("天气") 发现 WeatherTool
* 3. Advisor 将 WeatherTool 注入后续请求
* 4. 模型调用 WeatherTool 获取天气
* 5. 返回最终答案
4.结构化输出:
结构化输出转换器帮助将大型语言模型输出转换为结构化格式。快速将 AI 模型的结果转化为数据类型,如 JSON、XML 或 Java 类,并传递给其他应用方法。

可用的转换器(三种)

5.记忆管理:
聊天记忆使Chat时可以存储并检索与LLM多次交互时的信息。
ChatMemory抽象层支持多种内存管理策略; ChatMemoryRepository抽象层负责消息存储和检索,提供扩展接口,由具体存储实现来实现。
常见记忆策略:保留最近N条、保留特定时间段消息、控制消息数量。
聊天记忆-Chat Memory,是大型语言模型在对话过程中所保留的信息,这些信息有助于保持上下文意识。
聊天记录-Chat History,包括用户与模型之间交换的所有消息的完整对话记录。
记忆管理体系:

记忆策略:MessageWindowChatMemory(滑动窗口),核心是维护一个固定大小的消息窗口(默认20 条),当消息数量超过最大值时,自动删除较早的消息。
配置示例
Java
MessageWindowChatMemory memory = MessageWindowChatMemory.builder()
.chatMemoryRepository(repository) // 指定存储实现类
.maxMessages(10) // 滑动窗口大小:保留最近10条
.build();
记忆注入机制:消息聊天记忆顾问-MessageChatMemoryAdvisor,Spring AI 通过Advisor(顾问)机制自动将历史记忆注入到每次模型调用中,无需开发者手动拼接 Prompt。

conversationId(对话Id)用于唯一标识一次对话会话的编号,在AI对话场景中用来跟踪和管理多轮对话的上下文信息。
示例用法
TypeScript
@RestController
public class ChatController {
@Autowired
private ChatClient chatClient;
@GetMapping("/chat")
public String chat(
@RequestParam(required = false) String conversationId,
@RequestParam String message
) {
// 通过 advisors 参数传递 conversationId
String answer = chatClient.prompt()
.user(message)
.advisors(a -> a.param(ChatMemory.CONVERSATION_ID, conversationId))
.call()
.content();
return answer;
}
}
** gitee编码**