Spring AI Alibaba基础应用之提示词(Prompt)的基础理解及使用

Spring AI Alibaba 提示词(Prompt)

Spring AI Alibaba 提供了强大的提示词功能,允许开发者通过编程方式与大型语言模型(LLM)交互。提示词是与 LLM 沟通的核心,它定义了模型的输入指令和上下文,直接影响模型生成输出的质量和相关性。

一、核心概念、环境准备与作用

在Spring AI中,提示词(Prompt) 是连接用户需求与AI模型的核心载体,用于向大模型传递任务指令、上下文信息或约束条件。结合Alibaba的大模型(如通义千问),Prompt的设计直接影响模型输出的准确性和相关性。

Prompt的核心构成

1.1 提示词(Prompt)

提示词是提供给大模型的文本指令,用于明确告诉模型需要解决的问题或完成的任务4。它是大语言模型理解用户需求并生成准确答案的基础。

1.2 提示词模板(Prompt Template)

允许开发者定义可复用且参数化的提示模板,通过占位符动态替换内容1。例如"我想知道消息id: {id}"中的{id}就是参数占位符。

1.3 系统提示词(System Prompt)

设定模型的角色、行为和响应格式,为模型提供上下文背景和约束条件。

二、Spring AI中Prompt相关核心类与方法

Spring AI提供了一系列工具类简化Prompt的构建与管理,结合Alibaba大模型集成后可直接复用。

1. 核心类介绍

类名 作用 核心属性/方法
Prompt 封装完整的提示信息(含消息列表) messages:消息列表(用户/系统/历史)
PromptTemplate 基于模板动态生成Prompt(支持变量替换) create(String template, Map<String, Object> variables):创建模板;render():渲染模板为文本
Message 抽象消息接口,定义消息类型和内容 getRole():获取角色(USER/SYSTEM/ASSISTANT);getContent():获取内容
UserMessage 用户角色消息实现 构造方法:UserMessage(String content)
SystemMessage 系统角色消息实现 构造方法:SystemMessage(String content)
AssistantMessage 模型回复消息实现(用于历史记录) 构造方法:AssistantMessage(String content)

2. 常用方法详解

(1)Prompt
  • 构造方法Prompt(List<Message> messages)
    作用:通过消息列表创建完整Prompt(支持多轮对话上下文)。
(2)PromptTemplate
  • create(String template, Map<String, Object> variables)
    作用:创建带变量的模板(模板中用{``{变量名}}占位),变量通过Map动态填充。
  • render()
    作用:将模板与变量结合,生成最终的提示文本。
(3)Message 子类
  • 用于区分消息角色,模型会根据角色识别上下文逻辑(如系统消息优先级高于用户消息)。

Spring AI Alibaba 是一个基于 Spring AI 构建的 Java AI 应用开发框架,它专门用于接入阿里云的通义大模型系列。下面我将为你详细讲解 Spring AI Alibaba 中提示词(Prompt)的核心知识点,包括常用方法、属性、应用场景,并提供完整的案例代码。

(4)获取阿里云API Key
  1. 访问阿里云百炼页面并登录您的阿里云账号。
  2. 开通"百炼大模型推理"服务,等待开通成功的短信通知。
  3. 在控制台创建新的API Key并妥善保存。
(5) Maven配置与依赖
pom.xml 配置
xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>spring-ai-alibaba-demo</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>
    
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.4</version>
        <relativePath/>
    </parent>
    
    <repositories>
        <repository>
            <id>sonatype-snapshots</id>
            <url>https://oss.sonatype.org/content/repositories/snapshots</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <releases>
                <enabled>false</enabled>
            </releases>
        </repository>
    </repositories>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud.ai</groupId>
            <artifactId>spring-ai-alibaba-starter</artifactId>
            <version>1.0.0-M6.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
application.yml 配置
yaml 复制代码
# 应用服务端口
server:
  port: 8080

# Spring AI Alibaba 配置
spring:
  ai:
    dashscope:
      api-key: ${AI_DASHSCOPE_API_KEY}  # 从环境变量获取API密钥
      chat:
        options:
          model: qwen-turbo  # 使用通义千问Turbo模型
          temperature: 0.7   # 控制生成结果的随机性,值越高越随机
          top-p: 0.9         # 核采样概率,控制生成多样性

# 日志配置
logging:
  level:
    com.example: DEBUG
    org.springframework.ai: INFO
环境变量设置

在Windows系统中设置环境变量:

cmd 复制代码
setx AI_DASHSCOPE_API_KEY "your-api-key-here"

需要重启IDE或命令行窗口使环境变量生效。

3. 常用方法与功能

Spring AI Alibaba 提供了多种灵活的方式来创建和使用提示词。

3.1 简单提示词使用

最基本的使用方式,直接设置固定的系统提示词和用户提示词。

java 复制代码
// 简单提示词使用示例
// 更多提示词用法参见
@RequestMapping("/chat/simple")
public String simpleChat(String msg) {
    String result = chatClient.prompt()
            .system("你是一个问答助手") // 设置系统提示词
            .user(msg)                 // 设置用户提示词
            .call().content();
    System.out.println("结果:" + result);
    return result;
}
3.2 动态提示词(PromptTemplate)

使用PromptTemplate创建参数化的提示词,支持动态内容替换。

java 复制代码
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.prompt.Prompt;
import java.util.Map;

// 动态提示词使用示例
// 提示词模板用法参见
//@GetMapping("/dynamicPrompt")
public String dynamicPrompt(String topic, String style) {
    // 创建提示词模板
    PromptTemplate promptTemplate = new PromptTemplate("请用{style}的风格,讲一个关于{topic}的故事");
    
    // 使用参数创建Prompt对象
    Prompt prompt = promptTemplate.create(Map.of(
        "style", style, //"幽默" 替换 style
        "topic", topic  // "神话"   替换  topic
    ));
    
    // 调用模型并返回结果
    return chatClient.prompt(prompt)
            .call()
            .content();
}
3.3 文件提示词模板

从外部文件加载提示词模板,实现提示词与代码分离,便于维护。

  1. 创建提示词文件 (src/main/resources/prompts/story-teller.st):

    你是一个专业的{role},擅长用{style}的风格讲述{genre}类型的故事。
    请根据用户提供的话题,创作一个引人入胜的故事。
    故事长度应该大约{length}字,并包含一个明确的道德启示。

  2. Java代码使用文件模板:

java 复制代码
import org.springframework.core.io.Resource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.ai.chat.prompt.SystemPromptTemplate;

public class StoryController {
    
    // 加载外部提示词文件
    @Value("classpath:prompts/story-teller.st")
    private Resource storyTellerPrompt;
    
    public String generateStory(String topic, String genre, String style, int length) {//参数需要全部入参
        // 创建系统提示词模板
        SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(storyTellerPrompt);
        Message systemMessage = systemPromptTemplate.createMessage(Map.of(
            "role", "故事大师",
            "style", style,
            "genre", genre,
            "length", Integer.toString(length)
        ));
        
        // 创建用户消息
        PromptTemplate userPromptTemplate = new PromptTemplate("请以'{topic}'为主题创作一个故事");
        Message userMessage = userPromptTemplate.createMessage(Map.of("topic", topic));
        
        // 构建完整的Prompt
        Prompt prompt = new Prompt(List.of(systemMessage, userMessage));
        
        // 调用模型
        return chatClient.prompt(prompt)
                .call()
                .content();
    }
}
3.4 Lambda表达式提示词

使用Lambda表达式创建动态提示词,适合简单的参数化场景。

java 复制代码
// Lambda表达式提示词示例
// 参见中的Lambda表达式用法
public String lambdaPrompt(String name, Integer age, String hobby) {
    return chatClient.prompt()
            .system("你是一个友好且信息丰富的助手")
            .user(userSpec -> userSpec
                .text("请为名为{name}、年龄{age}岁、爱好{hobby}的人创建个人简介。")
                .param("name", name)
                .param("age", age)
                .param("hobby", hobby)
            )
            .call()
            .content();
}
3.5 结构化输出(Structured Output)

将模型的自然语言响应解析为预定义的数据结构,便于程序处理。

java 复制代码
import org.springframework.ai.chat.model.Entity;

// 用户实体类
public class User {
    private String name;
    private int age;
    private String hobby;
    private String description;
    
    // 构造方法、getter和setter省略
}

// 结构化输出示例
public User getStructuredUserInfo(String name, int age, String hobby) {
    return chatClient.prompt()
            .user(userSpec -> userSpec
                .text("我叫{name},今年{age}岁,爱好{hobby}。请为我生成个人简介。")
                .param("name", name)
                .param("age", age)
                .param("hobby", hobby))
            .call()
            .entity(User.class); // 将响应解析为User对象
}
相关推荐
有味道的男人1 小时前
AI 大数据赋能电商,选品上架一键通全
大数据·人工智能
图导物联1 小时前
园区智慧导览系统定制方案(一),可直接落地技术方案(定制化需求拆解与技术架构设计)
人工智能·园区智慧导览系统
拉拉拉拉拉拉拉马1 小时前
如何写好一个 Skill:把一次性 Prompt 变成可复用工作流
prompt
天下财经热1 小时前
工业搬运机器人和AMR领域哪些品牌更值得关注?2026年工业物流自动化选型指南
人工智能·机器人·自动化
qq_411262421 小时前
四博 AI 智能音箱方案升级:ESP32-S3/C3 + HFP 耳机 + A2DP 外置音箱 + 开源二次开发
人工智能·开源·智能音箱
沫儿笙1 小时前
机器人氩弧焊保护气节气装置
人工智能·机器人
钓了猫的鱼儿1 小时前
基于深度学习+AI的玉米叶片病害目标检测与预警系统(Python源码+数据集+UI可视化界面+YOLOv11训练结果)
人工智能·深度学习·目标检测
小何code1 小时前
人工智能【第22篇】Seq2Seq模型与注意力机制:机器翻译的基石
人工智能·深度学习·自然语言处理·机器翻译·注意力机制·seq2seq
lvrongbao1 小时前
互联网大厂Java面试场景:从Spring到Redis的技术问答解析
java·redis·spring·微服务·分布式事务