AI大模型常见概念极速讲解和SpringAI特性
AI大模型(AI Models):
- AI模型是设计用于处理和生成信息的算法,通常模拟人类的认知功能。
- SpringAI支持多种类的AI模型:聊天模型(用于对话和文本生成) ;嵌入模型(用于文本向量化);图像生成模型(用于文本到图像的转换),语言模型(用户与语言转换文本和文本转换语音)。
提示词(Prompt):
- 提示词是基于语言的输入的基础,它引导AI模型产生特定的输出。
- 使用StringTemplate等模版引擎创建提示,通过填充占位符适配用户的输入。
- 在SpringAI中,提示词不仅仅是简单的字符串:系统消息(告诉模型如何行为设置交互的上下文),用户消息(来自用户的直接输入),助手消息(AI模型的响应消息)。
令牌(Tokens):
- 令牌是AI模型处理的语言的基本单位,使用情况直接与AI服务的成本相关。
- 模型处理的基本单位,输入是将单词转换为token,输出是转回。
- 令牌计算:包含输入和输出的所以文本。
嵌入(Embeddings):
- 嵌入使数据能够标识为语义空间中的点,这类似于欧几里得几何的2D空间,但在更高维度中。
- 将文本,图像,视频转换为浮点数组(向量),捕捉输入的语义关系,向量长度称为维度。
- 嵌入在RAG模式中特别相关能够:将文本转换为数值向量;支持语义相似搜索;实现上下文感知检查。
Structured Output:
- 问题:AI输出传统为java.lang.String(即使是JSON也需要转换为可用结构)。
- 解决;通过精心设计提示及多轮交互,将输出转换为结构化数据。
Retrieval Augmented Generation(RAG):
- 流程:基于ETL管道,提取非结构化数据->转换->加载到向量数据库。
- 转换步骤:拆分文档是保留语义边界(如不拆分段落,代码方法)。进一步拆分,确保片段大小为模型token限制的一小部分。
- 应用:用户提问式,检索向量数据库中相似的文档片段,与问题一同传入模型以增强响应准确性。
Tool Calling/Function Call:
- 机制:注册工具使用LLM连接外部系统API,获取实时数据或执行操作。
- 流程:定义工具(包含名称,描述,输入参数schema)。模型决定调用工具,返回工具名及参数。应用执行工具并返回结果。模型基于结果生成最终响应。
- 简化:SpringAI通过@Tool注解等简化工具调试代码。

SpringAI之ChatClient和ChatModel案例实战
ChatClient核心案例
@RestController
@RequestMapping("/ai")
public class ChatClientController {
private final ChatClient chatClient;
/**
* 构造器注入ChatClient
*
* @param chatClientBuilder
*/
public ChatClientController(ChatClient.Builder chatClientBuilder) {
this.chatClient = chatClientBuilder.build();
}
/**
* 获取结果
*
* @param message
* @return
*/
@GetMapping("/chatClient")
public String generation(@RequestParam(value = "message", defaultValue = "你好,你是谁") String message) {
String content = this.chatClient
.prompt()//创建一个prompt
.user(message)//设置用户输入
.call()//调用
.content();//获取结果
return content;
}
}
ChatModel和ChatClient这两个在SpringAI高配接口有什么关系么?
ChatModel:
- 是SprinAI中对底层AI聊天模型的抽象接口,直接对应具体的AI模型实现。
- 是与模型交互的底层入口。它更加贴近AI模型的原生能力,暴露了模型的核心调用方法。
- 其功能相当基础,需要开发者自行处理消息构建,参数配置等细节。
- 与模型的关系:
-
- 与具体的AI模型绑定更紧密,不同的AI模型。
- 有各种的ChatModel实现。
- 使用场景:
-
- 底层定制开发:当需要对模型调用进行深度定制时,如调用模型的参数(温度,TOP -P值等)。
- 多模型兼容开发:在需要同时对接多个不同类型的AI模型是,通过操作不同的ChatModel实现类。
- 性能优化场景:对高性能要求的场景,直接使用ChatModel能减少上层封装带来的微小性能损耗,提升调用效率。
ChatClient:
- 是基于ChatModel封装的高层抽象,面向开发者提供更简洁,易用的API。
- 它是整合了提示词处理,响应解析等功能,屏蔽了底层模型的细节差异。
- 在ChatModel的基础上扩展了更多编辑功能,支持直接传入UserMessage或Prompt进行交互。
- 与模型的关系:
-
- 通过依赖注入与ChatModel关联,对开发者屏蔽了具体模型的实现差异。
- 开发者无需修改代码,只需要更换ChatModel的配置,就能切换不同的AI模型。
- 使用场景:
-
- 快速集成开发:在常规业务开发中,开发者希望快速实现AI聊天功能,无需关注底层模型细节。
- 与Spring生态结合:当需要与PromptTemplate,SpringAI组件配合使用时,提供了更加自然的集成方式。
- 标准化交互流程:在团队协作或大型项目中,使用ChatClient可统一AI交互的代码风格。
SpringAI默认系统配置和流失响应
什么是默认系统配置?
- 在实际开发中,我们往往希望AI模型在整个对话过程中保持特定的行为风格或者遵循固定的规律。
- 如:让AI以老师的口吻回答问题。
- 如果每次发送请求都手动添加这些系统指令,会增加代码冗余度。
- 此时,通过配置默认系统消息,能让ChatClient在所以对化中自动携带这些指令,简化运行时代码。
案例:
新增配置类
@Configuration
public class Config {
@Bean
ChatClient chatClient(ChatClient.Builder builder){
return builder
.defaultSystem("你是guslegend团队的智能学习助手,你可以回答各种各样关于it的问题")
.build();
}
}
通过 @Bean 注解将 ChatClient 实例交由 Spring 容器管理,传入预设的系统消息字符串
后续使用该 ChatClient 进行对话时,无需再额外添加该系统消息,AI 模型会自动按照预设的风格响应。
开发接口
@RestController
@RequestMapping("/ai")
public class DefaultChatClientController {
@Resource
private ChatClient chatClient;
@GetMapping("default_client")
public String generation(@RequestParam(value = "msg",defaultValue = "你好,你是谁")String msg){
return this.chatClient
.prompt()//创建一个prompt
.user(msg)//设置用户输入
.call()//调用
.content();//获取结果
}
}
什么是流失响应?
-
在一些交互场景中,AI模型生成响应可能需要一定的时间,尤其是对应较长的回答。
-
如果等待模型生成完整后再响应给用户,会导致用户体验感不好,产生等待感。
-
流失响应能够让AI模型边生成内容边返回,用户可以实时看到结果。
-
就像人类对话一样逐句输出一样,极大提升了交互的流畅性。
@GetMapping(value = "/stream_client",produces = "text/html;charset=UTF-8") public Flux<String> stream(@RequestParam(value = "msg",defaultValue = "你好,你是谁")String msg){ return chatClient .prompt()//创建一个prompt .user(msg)//设置用户输入 .stream()//调用 .content(); }
stream 方法开启流式响应模式,最后通过 content 方法获取流式的响应内容,返回类型为 Flux。
这是 Reactor 库中的响应式类型,用于处理流式数据,支持异步、非阻塞地处理流式数据,适合高并发场景的需求。
AI 模型生成的内容会被分割成多个片段逐次返回,content () 方法会将这些片段以字符串的形式通过 Flux 发射出去。
AI大模型提示词工程
什么是Prompt提示词?
- 核心定义Prompt是用户输入给AI模型的指令或问题,是引导人工智能输出符合预期输出的提升文本。
- 它本质上是人机交互的桥梁,通过结构化语言定义任务目标,约束条件和输出格式,直接影响AI响应质量。
- 通俗来说:AI大模型是你的员工,Prompt就是你发号的内容。
核心作用:明确任务边界,注入领域知识,约束输出形态。
Prompt的核心组成部分:
- 系统提示词
- 用户提示词
- 输出格式约束
Prompt工程的核心原则:
- 精准比冗长更重要
- 具体比抽象更有效
- 格式比内容先确定
- 模式适配
Chat 对话模型的 Role 角色说明
系统角色(System):隐形导演
- 定义:预设的 "幕后规则",不直接对话。
- 作用:定 AI 人设(如 "幽默科普博主")、立交互规矩(如 "只答编程题")、给背景信息(如 "用户是高中生")。
用户角色(User):指令发起者
- 定义:代表真实用户,是需求来源。
- 作用:提需求(如 "车启动异响咋回事")、给上下文、反馈修正。
助手角色(Assistant):响应生成者
- 定义:代表 AI 自己,负责输出回应。
- 作用:执行指令、接话延续对话、反馈结果。
工具角色(Tool):能力扩展者
- 定义:AI 调用外部工具(API / 数据库等)的中间角色。
- 作用:转指令为工具参数、返回工具结果。
SpringAI整合Prompt
核心组件:
- Prompt:封装了原始文档或者结构化消息(
List<Message>)。 - PromptTemplate:动态生成Prompt的模版引擎,支持变量替换和条件渲染。
- ChatOptions:模型调用参数(如
temperature,maxTokens)。
多模态支持:支持文本,图像,音频混合输入(如ImageContent类)。适配不同模型格式(如OpenAI的messages数组,Ollama的纯文本)。
案例:
@GetMapping("/prompt")
public String prompt() {
// 方式1:直接构造
Prompt prompt = new Prompt("你是名称是");
// 方式2:结构化角色消息
List<Message> messages = List.of(
new SystemMessage("你是Java讲师,名称叫大当家"),
new UserMessage("你是名称是")
);
Prompt structuredPrompt = new Prompt(messages);
ChatClient chatClient = ChatClient.builder(chatModel).build();
String content = chatClient.prompt(structuredPrompt).call().content();
return content;
}

@GetMapping("/role")
public String role() {
ChatClient chatClient = ChatClient.builder(chatModel).build();
String content = chatClient.prompt()
.system("你是Java讲师,名称叫大当家")
.user("你是名称是")
.call()
.content();
return content;
}

@GetMapping("/template")
public String template() {
PromptTemplate template = new PromptTemplate("请以{theme}为主题写一首诗");
ChatClient chatClient = ChatClient.builder(chatModel).build();
Prompt poemPrompt = template.create(Map.of("theme", "春天"));
chatClient = ChatClient.builder(chatModel).build();
String content = chatClient.prompt(poemPrompt).call().content();
return content;
}
