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
- 访问阿里云百炼页面并登录您的阿里云账号。
- 开通"百炼大模型推理"服务,等待开通成功的短信通知。
- 在控制台创建新的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 文件提示词模板
从外部文件加载提示词模板,实现提示词与代码分离,便于维护。
-
创建提示词文件 (
src/main/resources/prompts/story-teller.st):你是一个专业的{role},擅长用{style}的风格讲述{genre}类型的故事。
请根据用户提供的话题,创作一个引人入胜的故事。
故事长度应该大约{length}字,并包含一个明确的道德启示。 -
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对象
}