Spring AI Framework(二:模块分析)

Spring AI Framework

一、SpringAI前言

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

Spring AI 的核心是解决人工智能集成的根本挑战:将企业数据(微调、RAG方式、 Tool Calling)和API与 AI 模型连接起来。

二、Spring AI 提供功能

  • 支持所有主要的人工智能模型提供商和模型类型(Chat Completion 聊天完成、Embedding 嵌入...)

  • 结构化输出:将 AI模型输出映射到 POJO

  • 支持聊天对话、记忆检索增强生成(RAG)

  • 支持所有主要的向量数据库提供商:如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:核心模型类)

  1. 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_weatherquery_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编码**

gitee编码 SpringAIProject

相关推荐
专注VB编程开发20年2 小时前
通义灵码VS插件太垃圾,太难用了,优缺点
ai·通义
云烟成雨TD2 小时前
Spring AI 1.x 系列【52】可观测集成 SkyWalking
人工智能·spring·skywalking
云烟成雨TD2 小时前
Spring AI 1.x 系列【57】动态工具发现:Tool Search Tool
java·人工智能·spring
数据库小学妹3 小时前
AI时代数据库怎么选?多模融合、数据统一存储与选型实战指南
数据库·人工智能·经验分享·ai
装不满的克莱因瓶3 小时前
了解 LangChain 中的 LLM 与 ChatModel 的差异
人工智能·python·ai·langchain·llm·agent·chatmodel
逍遥德3 小时前
MQTT教程详解-05.SpringBoot集成mqtt client 性能分析
java·spring boot·spring·mt
云烟成雨TD3 小时前
Spring AI 1.x 系列【54】Retry 机制分析
java·人工智能·spring
点燃大海3 小时前
SpringAI构建智能体
java·spring boot·spring·springai智能体
xier_ran3 小时前
【infra之路】02_RadixAttention与KV_Cache管理
java·spring boot·spring