spring ai Alibaba(SAA)学习(二)

AI工具实战测评 8.6w人浏览 77人参与

提示词

什么是提示词?

Prompt 是引导 AI 模型生成特定输出的输入格式,Prompt 的设计和措辞会显著影响模型的响应。

Prompt 最开始只是简单的字符串,随着时间的推移,prompt 逐渐开始包含特定的占位符,例如 AI 模型可以识别的 “USER:”、“SYSTEM:” 等。阿里云通义模型可通过将多个消息字符串分类为不同的角色,然后再由 AI 模型处理,为 prompt 引入了更多结构。每条消息都分配有特定的角色,这些角色对消息进行分类,明确 AI 模型提示的每个部分的上下文和目的。这种结构化方法增强了与 AI 沟通的细微差别和有效性,因为 prompt 的每个部分在交互中都扮演着独特且明确的角色。

提示词样例库

网址:Prompt Library | DeepSeek API Docshttps://api-docs.deepseek.com/zh-cn/prompt-library/

三种传入方式

在 Spring AI Alibaba中,call() 方法是调用大模型的核心入口,其参数中涉及的 Message、String、Prompt 是三种不同层级的输入封装形式,对应不同的使用场景和灵活性。下面从定义含义核心区别应用场景代码示例四个维度详细拆解:

SpringAI Alibaba 中的 call() 方法参数解析

在 Spring AI Alibaba(主要对接阿里云百炼 / 通义千问等大模型)中,call() 方法是与大模型交互的核心入口,而 messageStringprompt 是传入 call() 的三种核心参数形式,其本质是不同抽象层级的请求载体,适配不同的开发场景。下面从「定义含义」「核心区别」「应用场景」「代码示例」四个维度详细拆解:

一、先明确核心概念前提

Spring AI 对大模型交互做了标准化抽象,核心逻辑是:用户输入 → 封装为 Prompt → Prompt 拆分为 Message 列表 → 序列化为模型能识别的格式 → 调用模型 APIString 是最简化的输入,Message 是对话的最小单元,Prompt 是包含上下文 / 参数的完整请求体。

二、三种参数的详细解析

1. String 类型参数
(1)含义

最基础、最简化的输入形式,本质是「纯文本用户指令」,底层会被 Spring AI 自动封装为:SystemMessage(默认空) + UserMessage(传入的 String 内容) 的 Prompt,再调用模型。

(2)核心特点
  • 极简:无需手动封装,一行文本即可调用;
  • 无上下文:无法传递多轮对话历史、系统指令;
  • 无参数配置:无法设置温度、topP 等模型参数;
  • 适配单轮、无复杂需求的简单问答。
(3)应用场景
  • 快速测试:验证模型连通性、简单问答(如 “你好”“1+1 等于几”);
  • 无上下文的单次查询:如 “查询今天的天气”“解释什么是 Spring AI”;
  • 原型开发:快速搭建 demo,无需关注对话结构。
(4)代码示例
@Autowired
private ChatClient chatClient;

// 直接传入 String 调用
public String simpleCall() {
    // 底层自动封装为 UserMessage,再封装为 Prompt
    String response = chatClient.call("解释一下 Spring AI 的核心功能");
    return response;
}
2. Message 类型参数(通常是 List<Message>)
(1)含义

Message 是 Spring AI 定义的「对话最小单元」,代表一次单方向的消息传递(用户→模型 / 模型→用户 / 系统→模型),核心实现类:

MessageType 枚举值 类型 作用 场景
user UserMessage 用户输入的指令 / 问题 核心交互输入
system SystemMessage 系统指令(定义模型角色 / 规则) 约束模型行为(如 “作为 Java 讲师”)
assistant AssistantMessage 模型的历史回复 多轮对话上下文
tool

ToolMessage

工具调用的返回结果 工具调用场景

传入 Message(或列表)时,底层会封装为包含这些 Message 的 Prompt,支持多轮对话上下文。

(2)核心特点
  • 支持上下文:可拼接多轮对话的 UserMessage + AssistantMessage;
  • 支持系统指令:通过 SystemMessage 定义模型角色;
  • 轻量灵活:比 Prompt 更底层,可手动控制对话序列;
  • 仍无法直接配置模型参数(需结合 PromptTemplate 或 PromptOptions)。
(3)应用场景
  • 多轮对话:如 “先问‘什么是 Spring AI’,再问‘它和 OpenAI SDK 的区别’”;
  • 定制模型角色:通过 SystemMessage 约束模型(如 “作为电商客服,语气友好,只回答商品相关问题”);
  • 精准控制对话结构:需手动管理每一轮的消息顺序。
(4)代码示例
@Autowired
private ChatClient chatClient;

public String multiRoundCall() {
    // 1. 系统指令:定义模型角色
    Message systemMessage = new SystemMessage("作为Java技术专家,用简洁的语言回答问题");
    // 2. 第一轮用户问题
    Message userMsg1 = new UserMessage("Spring AI 是什么?");
    // 3. 模型历史回复(模拟多轮)
    Message assistantMsg1 = new AssistantMessage("Spring AI 是Spring生态下的AI开发框架,简化大模型集成");
    // 4. 第二轮用户问题
    Message userMsg2 = new UserMessage("它支持阿里云通义千问吗?");

    // 拼接消息列表(上下文顺序:系统→第一轮用户→第一轮助手→第二轮用户)
    List<Message> messages = Arrays.asList(systemMessage, userMsg1, assistantMsg1, userMsg2);
    
    // 传入 Message 列表调用
    ChatResponse response = chatClient.call(messages);
    return response.getResult().getOutput().getContent();
}
3. Prompt 类型参数
(1)含义

Prompt 是 Spring AI 定义的「完整请求体」,是比 Message 更高层级的抽象,包含:

  • messages:核心对话列表(同上述 Message 列表);
  • options:模型参数配置(温度、topP、最大生成长度、超时时间等);
  • metadata:元数据(如请求 ID、自定义标签)。

简单说:Prompt = Message列表 + 模型参数 + 元数据

(2)核心特点
  • 完整可控:既包含对话上下文,又能配置模型行为参数;
  • 支持模板化:结合 PromptTemplate 实现动态参数替换(如 “查询 {城市} 的天气”);
  • 适配生产级场景:满足复杂的参数配置、动态模板需求。
(3)应用场景
  • 生产级多轮对话:需配置模型参数(如温度 = 0.1 保证回答稳定);
  • 动态模板生成:如电商场景中 “生成 {商品名称} 的营销文案”;
  • 定制化模型行为:如设置最大生成长度、禁止模型调用工具、配置超时时间;
  • 批量请求:结合 Prompt 模板批量生成不同参数的请求。
(4)代码示例
@Autowired
private ChatClient chatClient;

public String promptCall() {
    // 1. 定义动态模板(参数化)
    PromptTemplate promptTemplate = new PromptTemplate("作为电商运营,为{product}生成一段不超过50字的营销文案,风格{style}");
    // 2. 填充模板参数
    Map<String, Object> params = new HashMap<>();
    params.put("product", "新款无线耳机");
    params.put("style", "活泼、年轻化");
    Prompt promptFromTemplate = promptTemplate.create(params);

    // 3. 自定义模型参数(温度、最大长度等)
    AlibabaChatOptions options = AlibabaChatOptions.builder()
            .temperature(0.8) // 创造性:0(严谨)~1(灵活)
            .topP(0.9)
            .maxTokens(100) // 最大生成长度
            .timeout(3000) // 超时时间
            .build();

    // 4. 构建完整 Prompt(模板消息 + 自定义参数)
    Prompt prompt = new Prompt(promptFromTemplate.getMessages(), options);

    // 5. 传入 Prompt 调用
    ChatResponse response = chatClient.call(prompt);
    return response.getResult().getOutput().getContent();
}

三、核心区别总结表

维度 String Message(List) Prompt
抽象层级 最低(纯文本) 中等(对话单元) 最高(完整请求)
上下文支持 ❌ 不支持 ✅ 支持多轮上下文 ✅ 支持(包含 Message)
模型参数配置 ❌ 无法配置(用默认) ❌ 无法配置 ✅ 可自定义(温度 / 长度等)
动态模板 ❌ 不支持 ❌ 需手动拼接 ✅ 结合 PromptTemplate 支持
核心场景 简单单轮问答、测试 多轮对话、角色定制 生产级复杂场景、模板化
灵活性 最低 中等 最高

四、选型建议

  1. 快速测试 / 简单问答 → 用 String
  2. 多轮对话 / 角色定制(无参数配置) → 用 Message 列表;
  3. 生产级场景(需参数配置 / 动态模板) → 用 Prompt
  4. 所有场景的底层最终都会封装为 Prompt 调用模型,区别仅在于手动封装还是自动封装。

Prompt四大角色

类型 value 值 作用 & 场景
SYSTEM "system" - 设定 AI 的边界、角色、定位- 指导 AI 的行为和响应方式- 决定 AI 如何理解、回复用户输入
USER "user" - 承载用户的原始提问 / 输入- 代表用户向 AI 发出的问题、命令或陈述
ASSISTANT "assistant" - 存储 AI 返回的响应信息(助手回复)- 用于多轮对话的上下文连贯交互- 实现 “记忆对话、积累回答” 的功能
TOOL "tool" - 桥接外部服务(如支付、数据查询)- 支持函数调用、调用第三方工具(后续章节会详细说明)

关键总结

这 4 种类型是 AI 对话的基础单元,典型的多轮对话流程会按以下顺序组合:SYSTEM(设定AI角色)→ USER(用户提问)→ ASSISTANT(AI回复)→ USER(下一轮提问)→ ASSISTANT(下一轮回复)TOOL则是扩展 AI 能力的模块,用于让 AI 调用外部工具完成更复杂的任务。

小试一手

新建Module
改pom
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--spring-ai-alibaba dashscope-->
        <dependency>
            <groupId>com.alibaba.cloud.ai</groupId>
            <artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.38</version>
        </dependency>
        <!--hutool-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.22</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

新增配置文件

server.port=8005

server.servlet.encoding.enabled=true
server.servlet.encoding.force=true
server.servlet.encoding.charset=UTF-8

spring.application.name=SAA-05prompt

spring.ai.dashscope.api-key=${aliQwen-api}
启动类
@SpringBootApplication
public class Saa05Prompt {
    public static void main(String[] args) {
        SpringApplication.run(Saa05Prompt.class,args);
    }
}
业务类
  • 配置类
@SpringBootConfiguration
public class Saa05Config {
    // ===================== 模型常量定义 =====================
    /**
     * DeepSeek-v3模型标识(阿里云百炼平台的模型名称)
     * 常量定义便于统一维护,避免硬编码散落在代码中
     */
    private static final String MODEL_DEEPSEEK = "deepseek-v3";

    /**
     * Qwen-plus(通义千问增强版)模型标识(阿里云百炼平台的模型名称)
     */
    private static final String MODEL_QWEN = "qwen-plus";

    @Bean
    public DashScopeApi dashScopeApi() {
        // 从系统环境变量中读取阿里云百炼API密钥(生产环境推荐此方式,避免密钥提交到代码仓库)
        String apiKey = System.getenv("aliQwen-api");

        // 校验API密钥有效性,为空则抛出异常,提前阻断无效配置
        if (apiKey == null || apiKey.trim().isEmpty()) {
            throw new IllegalArgumentException("Environment variable 'aliQwen-api' is not set or empty.");
        }

        // 构建并返回DashScopeApi实例,所有模型共享此实例
        return DashScopeApi.builder()
                .apiKey(apiKey) // 设置API密钥,用于阿里云百炼接口鉴权
                .build();
    }

    @Bean(name = "deepseek") // 指定Bean名称,解决多ChatModel冲突问题
    public ChatModel deepSeek(DashScopeApi dashScopeApi) {
        // 构建DashScopeChatModel(Spring AI封装的百炼模型适配类)
        return DashScopeChatModel.builder()
                .dashScopeApi(dashScopeApi) // 注入公共API客户端
                // 设置该模型的默认配置
                .defaultOptions(DashScopeChatOptions.builder()
                        .withModel(MODEL_DEEPSEEK) // 指定使用DeepSeek-v3模型
                        .bui
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值