文章目录
- 一.Spring Ai介绍
- 1.0 认识Spring Ai
- 1.1 特征
- 1.1 大模型专业名字介绍
- 1.1.1 RAG(检索增强生成)
- RAG 的基本原理
- RAG 的关键技术
- RAG 的优势
- RAG 的应用场景
- 1.1.2 fine-tuning(微调)
- 1.1.3 function-call(函数调用)
- 1.2 创建简单的Spring Ai项目
- 二.Spring Ai简单的智能应用
- 2.1 智能提问实现
- 2.2 角色预设
- 2.3 流式响应
- 2.4 ChatClient和ChatMode区别
- 2.5 文生图(gpt-4模型和deepseek-r1模型)
- 2.6 文生语音
- 2.7 语音翻译
- 2.8 多模态
- 2.9 function-call请求
- 持续待更新...........
一.Spring Ai介绍
Spring Ai 官方:https://spring.io/projects/spring-ai
1.0 认识Spring Ai
Spring AI 是一个用于 AI 工程的应用程序框架。 其目标是将 Spring 生态系统设计原则(如可移植性和模块化设计)应用于 AI 领域,并将使用 POJO 作为应用程序的构建块推广到 AI 领域。
Spring AI 的核心是解决了 AI 集成的根本挑战:将您的企业数据和 API 与 AI 模型连接起来。
1.1 特征
Spring AI 提供以下功能:
- 支持所有主要的 AI 模型提供商,例如 Anthropic、OpenAI、Microsoft、Amazon、Google 和 Ollama。支持的模型类型包括:
- 聊天完成
- 嵌入
- 文本到图像
- 音频转录
- 文本到语音
- 适度
- 支持跨 AI 提供商对同步和流式处理 API 选项的可移植 API 支持。此外,还可以访问特定于模型的特征。
- 结构化输出 - AI 模型输出到 POJO 的映射。
- 支持所有主要的矢量数据库提供商,例如 Apache Cassandra、Azure Vector Search、Chroma、Milvus、MongoDB Atlas、Neo4j、Oracle、PostgreSQL/PGVector、PineCone、Qdrant、Redis 和 Weaviate。
- 跨 Vector Store 提供商的可移植 API,包括一种新颖的类似 SQL 的元数据过滤器 API。
- 工具/函数调用 - 允许模型请求执行客户端工具和函数,从而根据需要访问必要的实时信息。
- 可观察性 - 提供对 AI 相关作的见解。
- 用于数据工程的文档注入 ETL 框架。
- AI 模型评估 - 帮助评估生成的内容并防止幻觉响应的实用程序。
- ChatClient API - 用于与 AI 聊天模型通信的 Fluent API,惯用性类似于 WebClient 和 RestClient API。
- Advisors API - 封装重复的生成式 AI 模式,转换发送到和传出语言模型 (LLM) 的数据,并提供跨各种模型和用例的可移植性。
- 支持 Chat Conversation Memory and Retrieval Augmented Generation (RAG)。
- Spring Boot 所有 AI 模型和向量存储的自动配置和启动器 - 使用 start.spring.io 选择所需的模型或向量存储。
上述内容摘自:Spring Ai 官网。
1.1 大模型专业名字介绍
1.1.1 RAG(检索增强生成)
大致思路:假如有个智能客服,它会优先去查询向量数据中数据,将查到的相关数据给 prompt对象 ,然后通过大模型响应给应用程序。
RAG 的基本原理
RAG 主要由 两个阶段 组成:
-
检索阶段(Retrieval):
- 在生成文本之前,模型会从一个 外部知识库(如向量数据库、文档集合等)检索出相关的信息。
- 这种检索通常使用 向量搜索(如 FAISS、Milvus)或基于搜索引擎(如 Elasticsearch)。
-
生成阶段(Generation):
- 结合检索到的内容,大语言模型(如 GPT、LLaMA)使用这些外部信息来生成更准确、符合事实的回答。
- 这种方式可以减少幻觉(hallucination),让生成的内容更加可信。
RAG 的关键技术
向量数据库
- 用于存储和检索文本嵌入(text embeddings)。
- 常见的向量数据库:
- FAISS(Facebook AI Similarity Search)
- Milvus
- Pinecone
- Weaviate
文本嵌入(Embedding)
- 使用模型(如 OpenAI Embeddings、BERT、Sentence-BERT)将文本转换为向量,便于相似度搜索。
检索策略
- 稠密检索(Dense Retrieval):基于神经网络(如 DPR、ColBERT),效果更优,但计算成本较高。
- 稀疏检索(Sparse Retrieval):如 BM25,传统的基于关键词的检索方法。
RAG 的优势
- 减少幻觉:模型基于真实检索到的内容生成回答,降低胡编乱造的概率。
- 增强知识:即使预训练数据缺乏某些信息,模型仍可动态检索外部知识库。
- 实时更新:相比 LLM 需要重新训练,RAG 只需更新知识库,适用于动态领域(如法律、医学等)。
- 更精准回答:相比纯 LLM,RAG 结合检索数据,可提供更精确的参考来源。
RAG 的应用场景
- 智能问答系统(如企业知识库问答、金融/法律咨询)
- 代码自动补全(检索 GitHub 代码库,提高准确性)
- 医疗辅助诊断(结合医学文献,提高生成答案的专业性)
- 法律法规检索(查询法律条文,生成更符合规范的解读)
- 客服机器人(实时检索 FAQ,提升客服效率)
1.1.2 fine-tuning(微调)
1.1.3 function-call(函数调用)
1.2 创建简单的Spring Ai项目
- 官方提示:Spring AI 支持 Spring Boot 3.2.x 和 3.3.x
- jdk17+
(☞本地安装多个JDK版本自由切换)
二.Spring Ai简单的智能应用
(延续使用1.2中创建的Spring Ai 应用。)
2.1 智能提问实现
【yml配置】
spring:
ai:
openai:
api-key: you_api_key
base-url: 你的api_key的请求路径
chat:
options:
model: gpt-3.5-turbo # 调用的哪个模型名称
由于调用 的是国外的open ai 大模型,需要“魔法”,所以我这里搞了中转站,请求中转站的 api-key和base-url,具体的做法 淘宝 搜 open api key
【controller】
package com.hz.controller;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author: weiyi
* @Description:
* @Date 2025/2/28 21:24
* @ClassName AiController
* @Version 1.0
*/
@RestController
@RequestMapping("/ai")
public class AiController {
//智能对话的客户端
private final ChatClient chatClient;
public AiController(ChatClient.Builder chatClientBuilder) {
this.chatClient = chatClientBuilder.build();
}
@GetMapping("/ai01")
public String generation(
@RequestParam(value = "message",
defaultValue = "给我讲个笑话")
String message) {
return this.chatClient.prompt() // prompt:提示词
.user(message) // message:用户输入的信息
.call() // 调用大模型 远程请求大模型
.content(); // 获取大模型的返回结果
}
}
上述代码是 参考的spring Ai 官方文档
【测试】
http://localhost:8080/ai/ai01?message=列出spring中的重点概念
这个场景模拟的是在大模型如deepseek等对话窗口的提问。
2.2 角色预设
假如你希望是一个特定场景下的智能体对话,可以进行角色预设。
在项目中的config包中创建AiConfig配置类
/**
* @Author: weiyi
* @Description:
* @Date 2025/2/28 21:40
* @ClassName AiConfig
* @Version 1.0
*/
@Configuration
public class AiConfig {
@Bean
ChatClient chatClient(ChatClient.Builder builder) {
return builder
.defaultSystem("你现在不是 chat gpt 了," +
"你是一个精通古代诗人的智能助手,有个诗人叫维一,知识渊博")
.build();
}
}
【修改controller】
/**
* @Author: weiyi
* @Description:
* @Date 2025/2/28 21:24
* @ClassName AiController
* @Version 1.0
*/
@RestController
@RequestMapping("/ai")
public class AiController {
//智能对话的客户端
@Autowired
private ChatClient chatClient;
// public AiController(ChatClient.Builder chatClientBuilder) {
// this.chatClient = chatClientBuilder.build();
// }
@GetMapping("/ai01")
public String generation(
@RequestParam(value = "message", defaultValue = "给我讲个笑话")
String message) {
// prompt:提示词
return this.chatClient.prompt()
.user(message) // message:用户输入的信息
.call() // 调用大模型 远程请求大模型
.content(); // 获取大模型的返回结果
}
}
测试
2.3 流式响应
通俗点说流式响应就是将生成的文本内容一个字一个字的显示出来。
/**
* @description: 流式响应
* @author: weiyi
* @date: 2025/3/1 19:08
* @param: [message]
* @return: reactor.core.publisher.Flux<java.lang.String>
**/
@GetMapping(value = "/ai02",
produces = "text/html;charset=utf-8")
public Flux<String> generation02(String message){
Flux<String> output = chatClient.prompt()
.user(message)
.stream()
.content();
return output;
}
如果不设置 produces = “text/html;charset=utf-8” 输出内容会出现中文乱码。
2.4 ChatClient和ChatMode区别
ChatClient Api 里是大模型通用的功能。
ChatMode Api 是大模型特有功能。假如用deepseek特有的模型功能需要用ChatMode Api
如:用open ai 下模型:
@Autowired
private ChatModel chatModel;
@GetMapping(value = "/ai03",
produces = "text/html;charset=utf-8")
public String generation03(
@RequestParam(value = "message",
defaultValue = "给我讲个笑话") String message){
ChatResponse response = chatModel.call(
new Prompt(
message, // new UserMessage(message)
OpenAiChatOptions.builder()
.model("gpt-3.5-turbo")
.temperature(0.4)//让生成文字更有温度
.build()
));
//等同于 .content
return response.getResult().getOutput().getText();
}
2.5 文生图(gpt-4模型和deepseek-r1模型)
spring:
ai:
openai:
api-key: xxxxx
base-url: xxxxxx
chat:
options:
model: gpt-4-32k
@GetMapping(value = "/ai05")
public String generation05(
@RequestParam(value = "message",
defaultValue = "画个龙") String message) {
ImageResponse response = openaiImageModel.call(
new ImagePrompt(message, // 图片提示词
OpenAiImageOptions.builder()
.quality("hd") // 图片质量
.withModel(OpenAiImageApi.DEFAULT_IMAGE_MODEL) // 图片模型
.N(1) // 生成图片数量
.height(1024)
.width(1024).build())
);
return response.getResult().getOutput().getUrl();
}
会生成图片的url地址:
将生成的图片地址粘贴浏览器地址栏:
(这是调用gpt4模型生成的)
【换成deepseek-r1模型】
☞deepseek官网文档
这是调用deepseek-r1模型生成。
2.6 文生语音
持续待更新…
2.7 语音翻译
持续待更新…
2.8 多模态
持续待更新…
2.9 function-call请求
持续待更新…