Spring AI 入门到实战:我如何用它让系统具备“理解能力”

我向来对“整合大模型进 Java 应用”这件事持谨慎态度。在 GPT 火了之后,我们团队最初是用 HTTP 手动调 OpenAI 接口,把它当成一个 JSON API 用。但随着业务交互变复杂,我意识到:我们需要的是一个语义系统,而不是一个封装 prompt 的 util 类。

这时,Spring AI 出现了。

它不是框架革命,而是语义层和 Spring 编程模型之间的桥梁。你可以像写 Spring Boot Controller 那样调用大模型,像写 Bean 那样组织提示词和语义模板

以下是我亲身踩过的坑与总结。


Spring AI 是什么?一句话版本

Spring AI 是 Spring 推出的 AI 集成框架,它封装了与 OpenAI、Azure、HuggingFace、Anthropic 等主流 LLM 提供商的连接逻辑,并基于 Spring 编程模型提供统一的:

  • Prompt 模板机制
  • Function 调用能力(Function calling)
  • Embedding 向量搜索整合(如与 Redis、PGVector、Milvus 等)
  • ChatMemory 管理
  • RAG(检索增强生成)支持

第一步:快速跑通 OpenAI 接入

引入依赖(当前主流版本建议使用 0.8.1 或以上):

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId><version>0.8.1</version>
</dependency>

application.yml 配置如下:

spring:ai:openai:api-key: ${OPENAI_API_KEY}base-url: https://api.openai.com/v1chat:model: gpt-4

然后写个最基础的服务类:

@Service
public class AiAssistant {private final OpenAiChatClient chatClient;public AiAssistant(OpenAiChatClient chatClient) {this.chatClient = chatClient;}public String ask(String question) {ChatResponse response = chatClient.call(question);return response.getResult().getOutput().getContent();}
}

你会惊讶于它的“Spring 味儿”有多重 —— ChatClient 就像 RestTemplate,但背后驱动的是 LLM。


第二步:PromptTemplate 的强大之处

Spring AI 真正让我惊艳的,是 PromptTemplatePromptTemplateModel

举个例子,我们想做一个发票解析助手:

String template = """
你是一个发票专家,请从以下文本中提取字段:
{{text}}返回格式:
{"invoiceCode": "","invoiceNumber": "","amount": "","date": ""
}
""";PromptTemplate promptTemplate = new PromptTemplate(template);
promptTemplate.add("text", ocrResult);Prompt prompt = promptTemplate.create();
ChatResponse response = chatClient.call(prompt);

为什么说它强大?因为它把 prompt 当作模板文件处理,变量和代码解耦,可调试、可重构、可测试 —— 这比我们以前把 prompt 字符串硬编码在 Java 里强太多。


第三步:函数调用(Function Call)集成

Spring AI 支持大模型的函数调用(Function Calling)能力。你可以像注册 Spring Bean 一样注册 AI 能“调用”的 Java 方法:

@Component
public class InvoiceFunction {@AiFunctionpublic String parseInvoice(@AiFunctionParameter(name = "text") String text) {// 实际是把这个方法暴露给大模型,让它决定是否调用return someService.extractInvoiceJson(text);}
}

这意味着你可以让 LLM 成为业务流程中的“指挥员”,它不再只是吐字,而是能决定调用哪个函数、传什么参数。


第四步:向量检索 + Embedding(RAG 模式)

Spring AI 原生支持嵌入向量生成和搜索。以下是一个 Redis + Embedding 的组合示例:

  1. 首先配置 Redis 向量存储(需使用 Redis Stack):
spring:ai:vectorstore:redis:host: localhostport: 6379
  1. 注入向量存储和 embedding 模型:
@Autowired
private VectorStore vectorStore;@Autowired
private EmbeddingClient embeddingClient;
  1. 索引知识库:
EmbeddingResponse embedding = embeddingClient.embed("这是发票的开票代码含义说明…");
vectorStore.add(List.of(new Vector("invoice-001", embedding.getEmbedding(), metadata)));
  1. 在对话中执行 RAG 检索:
List<Document> docs = vectorStore.similaritySearch("什么是发票代码", 3);
String context = docs.stream().map(Document::getContent).collect(Collectors.joining("\n"));
  1. 拼接到 Prompt 中:
String prompt = "基于以下知识回答问题:\n" + context + "\n问题:什么是发票代码?";

这样你就完成了一个端到端的 RAG 系统,模型可以“读”你自己喂的文档。


项目实战技巧总结

  1. Prompt 模板一定要版本管理:我们用 YAML + Git 存储每个 PromptTemplate,避免代码污染和可追踪。
  2. 用注解暴露函数给大模型,是一种未来的编排模式:特别适合 Workflow 逻辑。
  3. LLM 的不可控性,需要用 ChatMemory 管住上下文:Spring AI 提供了 MemoryChatClient 封装 chat history,避免上下文漂移。
  4. 别忽视异常处理:OpenAI 接口 rate limit、timeout 经常发生,Spring AI 建议用 RetryTemplate 或自定义 fallback。

写在最后:Spring AI 更像一个“语言中间件”

Spring AI 不是大模型的封装器,而是让 Spring 应用具备“语言交互能力”的中间件

它就像当年的 Spring Data,让我们用接口操作数据库;现在我们也可以用 Spring 风格操作语义接口。


你不再需要理解 token、role、chat-completion payload,只需要关注一件事:

“业务中哪块逻辑,可以更好地用语言来处理?”

从接口设计、代码结构,到 Prompt 管理和知识检索,Spring AI 都在逐渐成为一种“主流选型”。

推荐阅读文章

  • 由 Spring 静态注入引发的一个线上T0级别事故(真的以后得避坑)

  • 如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系

  • HTTP、HTTPS、Cookie 和 Session 之间的关系

  • 什么是 Cookie?简单介绍与使用方法

  • 什么是 Session?如何应用?

  • 使用 Spring 框架构建 MVC 应用程序:初学者教程

  • 有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误

  • 如何理解应用 Java 多线程与并发编程?

  • 把握Java泛型的艺术:协变、逆变与不可变性一网打尽

  • Java Spring 中常用的 @PostConstruct 注解使用总结

  • 如何理解线程安全这个概念?

  • 理解 Java 桥接方法

  • Spring 整合嵌入式 Tomcat 容器

  • Tomcat 如何加载 SpringMVC 组件

  • “在什么情况下类需要实现 Serializable,什么情况下又不需要(一)?”

  • “避免序列化灾难:掌握实现 Serializable 的真相!(二)”

  • 如何自定义一个自己的 Spring Boot Starter 组件(从入门到实践)

  • 解密 Redis:如何通过 IO 多路复用征服高并发挑战!

  • 线程 vs 虚拟线程:深入理解及区别

  • 深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别

  • 10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!

  • “打破重复代码的魔咒:使用 Function 接口在 Java 8 中实现优雅重构!”

  • Java 中消除 If-else 技巧总结

  • 线程池的核心参数配置(仅供参考)

  • 【人工智能】聊聊Transformer,深度学习的一股清流(13)

  • Java 枚举的几个常用技巧,你可以试着用用

  • 由 Spring 静态注入引发的一个线上T0级别事故(真的以后得避坑)

  • 如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系

  • HTTP、HTTPS、Cookie 和 Session 之间的关系

  • 使用 Spring 框架构建 MVC 应用程序:初学者教程

  • 有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误

  • Java Spring 中常用的 @PostConstruct 注解使用总结

  • 线程 vs 虚拟线程:深入理解及区别

  • 深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别

  • 10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!

  • 探索 Lombok 的 @Builder 和 @SuperBuilder:避坑指南(一)

  • 为什么用了 @Builder 反而报错?深入理解 Lombok 的“暗坑”与解决方案(二)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912007.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912007.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++链表的虚拟头节点

C链表虚拟头节点&#xff08;Dummy Head&#xff09; 虚拟头节点是链表操作中极为实用的设计技巧&#xff0c;它通过在链表真实头部前添加一个特殊节点&#xff0c;有效简化边界条件处理。 一、虚拟头节点的本质与核心作用 1. 定义 虚拟头节点是一个不存储真实数据的特殊节…

使用vllm部署 Nanonets-OCR-s

使用vLLM部署Nanonets-OCR-s模型的完整指南 Nanonets-OCR-s作为基于Qwen2.5-VL-3B的多模态OCR模型,结合vLLM的高效推理引擎可显著提升部署性能。 一、环境准备与依赖安装 1. 安装vLLM与多模态依赖 # 安装vLLM(含CUDA加速) pip install vllm==0.3.21 # 建议使用稳定版本…

大数据在UI前端的应用深化研究:用户行为模式的挖掘与分析

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在数字化用户体验竞争白热化的时代&#xff0c;用户行为数据已成为产品迭代的核心资产。据 Ad…

解决“Belkin USB-C LAN”有一个自分配的IP地址,将无法接入互联网。

MacBookPro使用belkin转换器连接网线&#xff0c;网络不能正常连通&#xff0c;已确定网线、交换机均正常&#xff0c;可以按照如下操作尝试。我自己的情况是通过下面的方式成功解决。如有其他情况后续继续补充。 1. 打开“设置”-“网络”&#xff0c;点击名字为“Belkin USB…

Python 爬虫初学者教程

一、爬虫基础概念 什么是爬虫&#xff1f; 爬虫是模拟浏览器行为&#xff0c;自动获取网页数据的程序&#xff0c;常用于数据采集、信息监控等场景。 爬虫的基本流程&#xff1a; 1. 发送请求获取网页内容 2. 解析内容提取数据 3. 存储数据 二、环境准备 1. 安装 Python&…

windows下 tomcat的安装部署

Tomcat是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP程序的首选。 本文将详细介绍在Windows环境下搭建Tomcat服务器&#xff0c;来搭建小型应用。 要…

ASIO 避坑指南:高效、安全与稳健的异步网络编程

ASIO 避坑指南&#xff1a;高效、安全与稳健的异步网络编程 引言 ASIO是很强大的一个异步io库&#xff0c;但服务器除了高效以外&#xff0c;稳定也是关键&#xff0c;这篇文章主要总结了ASIO使用遇到的典型问题和坑&#xff1a; 如何榨干io_context的性能&#xff0c;让CPU…

鲸孪生中三维模型的常见问题~

鲸孪生是山海鲸中专门负责3D 场景搭建和渲染的组件&#xff0c;可以双击进入编辑&#xff0c;进入编辑之后组件栏也会跟着变化&#xff0c;可以插入更多的 3D 内部的组件。 搭建三维场景经常会使用到模型&#xff0c;包括人物模型、建筑物模型、汽车模型等&#xff0c;这些都可…

PyTorch中实现开立方

技术背景 在PyTorch中&#xff0c;没有直接实现cbrt这一算子。这个算子是用于计算一个数的开立方&#xff0c;例如&#xff0c;最简单的-8开立方就是-2。但这里有个问题是&#xff0c;在PyTorch中&#xff0c;因为没有cbrt算子&#xff0c;如果直接用幂次计算去操作数字&#x…

关于如何在 Git 中切换到之前创建的分支的方法

文章目录 关于如何在 Git 中切换到之前创建的分支的方法一、确保你在项目目录中二、查看所有分支&#xff08;可选&#xff09;三、切换到目标分支四、如果分支仅在远程存在五、验证是否切换成功六、常见问题处理七、总结命令流程 PS:下次进入分支时&#xff0c;只需完成步骤1 …

基于深度学习的智能图像语义分割系统:技术与实践

前言 图像语义分割是计算机视觉领域中的一个重要任务&#xff0c;其目标是将图像中的每个像素分配到预定义的语义类别中。这一技术在自动驾驶、医学影像分析、机器人视觉等多个领域有着广泛的应用。近年来&#xff0c;深度学习技术&#xff0c;尤其是卷积神经网络&#xff08;C…

历史轨迹组件性能优化方案

针对历史轨迹组件的性能优化&#xff0c;可从数据处理、渲染策略、内存管理和交互优化四个方面入手。以下是具体的优化方向和实现方案&#xff1a; 一、数据处理优化 1. 轨迹数据抽稀算法 原理&#xff1a;在不影响轨迹整体形状的前提下&#xff0c;减少轨迹点数量实现方案&…

【论文阅读36】- Graph Attention Network(2025)

这篇论文主要介绍了一种基于改进型图注意力网络&#xff08;Graph Attention Network, GAT&#xff09;的滑坡变形异质性监测方法。该方法通过融合多尺度时间嵌入和自适应图学习&#xff0c;能够同时捕捉监测点之间复杂的时空依赖关系&#xff0c;有效反映滑坡的局部与整体变形…

CSS基础3

动画-animation 动画-animation与 transition过渡动画的区别 transition过渡动画&#xff1a;实现两个状态间的变化过程动画animation&#xff1a;实现多个状态间的变化过程&#xff0c;动画过程可控&#xff08;重复播放、最终画面、是否暂停&#xff09; 走马灯-使用transiti…

Java 程序设计试题​

​考试时间&#xff1a;120 分钟​ ​总分&#xff1a;100 分​ 一、选择题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 1.以下哪个不是 Java 的关键字&#xff1f; A. final B. sizeof C. static D. void 2.以下代码输出结果是&#xff1f; System.out.printl…

Elasticsearch(ES)与 OpenSearch(OS)

Elasticsearch&#xff08;ES&#xff09;与 OpenSearch&#xff08;OS&#xff09;本质上是同源分叉、独立演进的技术&#xff0c;两者关系可概括为“起源相同、目标分化”。以下是关键要点解析&#xff1a; &#x1f50d; 一、核心关系&#xff1a;分叉与独立演进 起源相同 O…

Python爬虫实战:研究Ghost.py相关技术

1 引言 1.1 研究背景与意义 随着互联网技术的不断发展,现代网页越来越多地采用 JavaScript 动态生成内容,传统的静态爬虫技术已难以满足需求。例如,许多新闻网站的评论区、电商平台的商品列表以及社交网站的动态内容均通过 AJAX 异步加载,普通爬虫无法获取这些内容。Ghos…

PostgreSQL(知识片):查询/计算Selectivity(可选性)

一、视图pg_ststs查询可选性 1、当可选性较小时&#xff0c;可以用视图pg_ststs来查询 表的每一列的MVC&#xff08;most Common Value&#xff09;作为一对most_common_vals和most_common_freqs的列存储在pg_ststs视图中。 &#xff08;1&#xff09;most_common_vals&#x…

Android Studio 打 APK 包报错 Invalid keystore format 的解决方法

提示&#xff1a;“奔跑吧邓邓子” 的必备核心技能专栏聚焦计算机技术与职场场景&#xff0c;拆解程序员、产品经理等技术从业者的核心能力图谱。内容涵盖编程思维、算法实战、项目管理、技术架构等硬核技能&#xff0c;结合案例解析代码优化、跨团队协作等落地方法论。定期更新…

通义灵码2.5智能体模式实战———集成高德MCP 10分钟生成周边服务地图应用

1 引言 在当今快节奏的开发环境中&#xff0c;智能编程助手正成为开发者生产力的倍增器。通义灵码2.5的智能体模式通过任务分解、多轮对话和上下文感知&#xff0c;将传统代码补全提升为完整的解决方案生成能力。本文将以实战案例展示如何利用通义灵码2.5集成高德地图MCP服务&…