Java程序员学从0学AI(四)
一、前言
在上一篇文章中,我们学习了SpringAI种的Advisor组件,这个是一个类似AOP的,用于增强大模型调用的组件。今天我们继续学习新的组件提示词:Prompts
二、Prompts
1、简介
提示词是我们和大模型交互的入口,我们通过提示词和大模型进行沟通。简单的来说提示词就是告诉大模型我们需要做什么。通过提示词可以非常直观地影响大模型的输出。举例,我们想让大模型给我们生成一篇美食推荐。
首先我们直接输入“帮我生成一篇介绍美食的文章”,大模型的输出如下
之后我们优化一下提示词:使用小红书风格返回
很明显,输出的内容有了很大的改变,这就是提示词的作用。一个好的提示词可以让大模型更好的理解我们所需要的内容是什么。
2、优秀的提示词模板
一个优秀的提示词需要包含以下几个方
(1)角色设定(Role)
明确AI的角色(如专家、助手、创作者等),例如:“你是一位资深营养师”。
(2)任务目标(Task)
清晰描述需要AI完成的具体任务,例如:“为我制定一份一周的健康饮食计划”。
(3)背景/上下文(Context)
提供必要的背景信息,例如:“用户是30岁的办公室职员,有轻度肥胖问题”。
(4)具体要求(Requirements)
列出细节要求(格式、风格、限制等),例如:“需包含早餐、午餐、晚餐,标注卡路里,避免海鲜过敏食材”。
(5)输出格式(Format)
指定回答的格式(如列表、表格、分步骤等),例如:“用Markdown表格呈现,并附上简要说明”。
3、案例
你是一位资深健身教练,擅长为忙碌的职场人士设计高效训练方案。请根据以下信息为我制定一份【两周的家庭健身计划】:
背景:
- 用户:32岁,男性,长期久坐,目标是减脂和改善腰背酸痛。
- 设备:仅有一对哑铃和瑜伽垫。
- 时间:每天30分钟。
要求:
- 包含热身、核心训练、力量训练和拉伸。
- 标注每项动作的组数、次数和注意事项。
- 用中文分步骤说明,动作名称附带英文对照(如“深蹲 Squat”)。
输出格式:
- 按天数排列,Markdown表格展示,每周休息2天。
- 最后附上饮食建议(每日热量控制在1800大卡左右)。
三、SpringAI+Promps
1、简介
SpringAI中也对提示词做了封装,提供了Promp类,用于封装提示词。
可以看到Prompt中包含一系列的Message,这个Message是一个接口,用于定义不同类型的Message(区分角色),UML如下图。
这里需要关注的是MessageType,分为 SYSTEM、USER、ASSISTANT、TOOL,我们挨个介绍一下
2、角色
消息角色(Message Roles)在AI交互中的重要性,通过给提示词(Prompt)中的不同部分分配特定角色,可以更清晰、高效地与AI模型沟通。
1、SYSTEM
系统角色,用于指导AI的行为以及响应的格式,例如 “你是一个专业的健身教练”。
2、USER
用户角色:代表着用户的输入,例如 “帮我制定一份减肥计划”
3、ASSISTANT
是AI交互中的核心枢纽,它远不止是对用户提问的简单回复,而是承担着三重关键角色:首先,作为对话引擎,通过记录自身的历史回复(Assistant Role消息)来维持上下文连贯性,确保多轮对话逻辑一致;其次,作为功能执行器,当需要超越纯文本交互时(如计算、数据查询等),它能主动发起工具调用(Tool Calls),将外部API或功能整合到回复中,实现任务自动化;最后,作为上下文粘合剂,它在System消息(系统规则)、User消息(用户输入)和Tool响应(外部结果)之间建立动态桥梁,形成完整的任务闭环。 (这一部分有点难,可以先大致了解)
4、Tool
工具,这个和FunctionCall有关系(后文会讲),简单的来说就是告诉大模型有哪些工具可以让他调用。例如当用户问询大模型明天天气的时候,如果不借助外部工具,大模型是没办法指导。此时我们就可以告诉大模型工具信息,让大模型调用相对应的工具然后获取结果。
3、提示词模板
SpringAI为我们提供了提示词模板类,PromptTempalte,使用起来也很简单,下面是一个Demo
public class PromptTemplateDemo {public static void main(String[] args) {PromptTemplate promptTemplate = PromptTemplate.builder().renderer(StTemplateRenderer.builder().startDelimiterToken('<').endDelimiterToken('>').build()).template("""Tell me the names of 5 movies whose soundtrack was composed by <composer>.""").build();String prompt = promptTemplate.render(Map.of("composer", "John Williams"));System.out.println(prompt);}
}
� 这段代码就是把<> 替换成对应的参数
再来一个稍微复杂一些的例子,包含系统提示词、用户提示词
ChatModel chatModel = DeepSeekChatModel.builder().build();
String userText = """
Tell me about three famous pirates from the Golden Age of Piracy and why they did.
Write at least a sentence for each pirate.
""";
//用户提示词
Message userMessage = new UserMessage(userText);
String systemText = """
You are a helpful AI assistant that helps people find information.
Your name is {name}
You should reply to the user's request with your name and also in the style of a {voice}.
""";
//系统提示词
SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemText);
Message systemMessage = systemPromptTemplate.createMessage(Map.of("name", "hardy", "voice", "voice"));
Prompt prompt = new Prompt(List.of(userMessage, systemMessage));
List<Generation> response = chatModel.call(prompt).getResults();
�
四、结束语
本章内容相对简单,介绍了提示词相关的知识。这个在技术上难度不是特别大,难的是如何写好一个提示词,让大模型能够充分理解我们要做的事情,希望对你有所帮助。