第2章:AI大模型知识和SpringAI核心案例实战

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;
    }

}

ChatModelChatClient这两个在SpringAI高配接口有什么关系么?

ChatModel:

  • 是SprinAI中对底层AI聊天模型的抽象接口,直接对应具体的AI模型实现。
  • 是与模型交互的底层入口。它更加贴近AI模型的原生能力,暴露了模型的核心调用方法。
  • 其功能相当基础,需要开发者自行处理消息构建,参数配置等细节。
  • 与模型的关系:
    1. 与具体的AI模型绑定更紧密,不同的AI模型。
    2. 有各种的ChatModel实现。
  • 使用场景:
    1. 底层定制开发:当需要对模型调用进行深度定制时,如调用模型的参数(温度,TOP -P值等)。
    2. 多模型兼容开发:在需要同时对接多个不同类型的AI模型是,通过操作不同的ChatModel实现类。
    3. 性能优化场景:对高性能要求的场景,直接使用ChatModel能减少上层封装带来的微小性能损耗,提升调用效率。

ChatClient:

  • 是基于ChatModel封装的高层抽象,面向开发者提供更简洁,易用的API。
  • 它是整合了提示词处理,响应解析等功能,屏蔽了底层模型的细节差异。
  • 在ChatModel的基础上扩展了更多编辑功能,支持直接传入UserMessage或Prompt进行交互。
  • 与模型的关系:
    1. 通过依赖注入与ChatModel关联,对开发者屏蔽了具体模型的实现差异。
    2. 开发者无需修改代码,只需要更换ChatModel的配置,就能切换不同的AI模型。
  • 使用场景:
    1. 快速集成开发:在常规业务开发中,开发者希望快速实现AI聊天功能,无需关注底层模型细节。
    2. 与Spring生态结合:当需要与PromptTemplate,SpringAI组件配合使用时,提供了更加自然的集成方式。
    3. 标准化交互流程:在团队协作或大型项目中,使用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的核心组成部分:

  1. 系统提示词
  2. 用户提示词
  3. 输出格式约束

Prompt工程的核心原则:

  1. 精准比冗长更重要
  2. 具体比抽象更有效
  3. 格式比内容先确定
  4. 模式适配

Chat 对话模型的 Role 角色说明

系统角色(System):隐形导演

  • 定义:预设的 "幕后规则",不直接对话。
  • 作用:定 AI 人设(如 "幽默科普博主")、立交互规矩(如 "只答编程题")、给背景信息(如 "用户是高中生")。

用户角色(User):指令发起者

  • 定义:代表真实用户,是需求来源。
  • 作用:提需求(如 "车启动异响咋回事")、给上下文、反馈修正。

助手角色(Assistant):响应生成者

  • 定义:代表 AI 自己,负责输出回应。
  • 作用:执行指令、接话延续对话、反馈结果。

工具角色(Tool):能力扩展者

  • 定义:AI 调用外部工具(API / 数据库等)的中间角色。
  • 作用:转指令为工具参数、返回工具结果。

SpringAI整合Prompt

核心组件:

  1. Prompt:封装了原始文档或者结构化消息(List<Message>)。
  2. PromptTemplate:动态生成Prompt的模版引擎,支持变量替换和条件渲染。
  3. ChatOptions:模型调用参数(如temperaturemaxTokens)。

多模态支持:支持文本,图像,音频混合输入(如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;
    }
相关推荐
是Yu欸13 小时前
AI跨模态鉴伪技术实测
人工智能·安全·ai作画·aigc·合合信息·ai-native·waic
声网13 小时前
Vercel 发布 AI SDK 5,引入语音 API;Ollama 新版本支持多模态交互 丨日报
人工智能
蓝速科技13 小时前
蓝速科技 AI 双屏翻译机:私模工艺与 AB 麦算法实测解析
人工智能·科技
声网13 小时前
阿里小号停止续费,10 月底下架 App;音频技术公司 Bragi 联合 OpenAI 为第三方耳机引入 GPT 语音助手丨日报
人工智能
人民新视野13 小时前
AI数字人公司厂商让数字人导览讲解对话成为智慧展厅展馆标配
人工智能
liguojun202513 小时前
智慧文体旅系统选哪家?豆米跳跳十年技术沉淀支持源码交付
java·大数据·人工智能·物联网·1024程序员节
超自然祈祷13 小时前
科技在发展,我们所做工作的范式也在变——Software1.0、2.0、3.0...
人工智能·科技
大强同学14 小时前
Kimi Code CLI
人工智能·agent·claude·skill·kimi code cli
深度研习笔记14 小时前
OpenCV工业视觉实战10|违规语音播报+弹窗告警+重复告警过滤,打造智能声光预警系统(项目加分必备)
人工智能·opencv·计算机视觉
湘美书院--湘美谈教育14 小时前
湘美书院主理人:AI世代武侠小说的基本特征与蕴意
大数据·人工智能·深度学习·机器学习·生活