第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;
    }
相关推荐
魔镜前的帅比2 小时前
Prompt 模板化设计(PromptTemplate)
人工智能·chatgpt·prompt
maray2 小时前
在 MacOS 场景下体验 seekdb embeded
数据库·人工智能·seekdb
WWZZ20252 小时前
快速上手大模型:深度学习11(数据增强、微调、目标检测)
人工智能·深度学习·算法·目标检测·计算机视觉·大模型·具身智能
大白IT2 小时前
第四部分:决策规划篇——汽车的“大脑”(第8章:行为决策——车辆的“驾驶策略师”)
人工智能·算法·机器学习
2501_941148153 小时前
人工智能赋能智慧城市互联网应用:智能交通、环境监测与公共服务优化实践探索》
人工智能
大白IT3 小时前
第二部分:感知篇——汽车的“眼睛”与“耳朵”(第5章:环境感知与理解——从“看见”到“看懂”)
人工智能·目标跟踪·自动驾驶·汽车
不知更鸟3 小时前
本地文档问答系统RAG全流程详解
人工智能
边缘计算社区3 小时前
谷歌正式跟进苹果PCC,华为OPPO同步入局:边缘AI隐私战打响
人工智能·华为
IT_陈寒3 小时前
SpringBoot 3.2 性能优化全攻略:7个让你的应用提速50%的关键技巧
前端·人工智能·后端