当前位置: 首页 > news >正文

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分钟。

要求

  1. 包含热身、核心训练、力量训练和拉伸。
  2. 标注每项动作的组数、次数和注意事项。
  3. 用中文分步骤说明,动作名称附带英文对照(如“深蹲 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();

四、结束语

本章内容相对简单,介绍了提示词相关的知识。这个在技术上难度不是特别大,难的是如何写好一个提示词,让大模型能够充分理解我们要做的事情,希望对你有所帮助。

未完待续

http://www.lqws.cn/news/107713.html

相关文章:

  • 【数据结构 -- B树】
  • JS手写代码篇---手写call函数
  • 【Harmony OS】作业五 数据存储
  • Python趣学篇:Pygame重现《黑客帝国》数字雨
  • Unity UI 性能优化--Sprite 篇
  • Rust 数据类型
  • 初始化已有项目仓库,推送远程(Git)
  • recipes中声明 DEPENDS += “virtual/kernel“ 的效果
  • SMART原则讲解
  • 物联网数据归档之数据存储方案选择分析
  • 大疆无人机的二次开发
  • 【结构型模式】装饰器模式
  • Matlab数值计算
  • [手写系列]从0到1开发并上线Edge浏览器插件
  • Qt 事件传递的完整流程
  • 无人机巡检智能边缘计算终端技术方案‌‌——基于EFISH-SCB-RK3588工控机/SAIL-RK3588核心板的国产化替代方案‌
  • QT实现动画翻转效果
  • 群晖 NAS 如何帮助培训学校解决文件管理难题
  • Windows下将Nginx设置注册安装为服务方法!
  • 工作服/反光衣检测算法AI智能分析网关V4安全作业风险预警方案:筑牢矿山/工地/工厂等多场景安全防线
  • 2024-2025-2-《移动机器人设计与实践》-复习资料-1-7
  • 当 AI 超越人类:从技术突破到文明拐点的 2025-2030 年全景展望
  • 累乘法求数列的通项公式
  • Python(十五)
  • 本人精通各种语言输出hello world
  • 逆向工程开篇(连载中)
  • 使用seaborn/matplotlib定制好看的confusion matrix
  • ssm学习笔记day04
  • Vue3 + Typescript:类型使用记录 / 类型注解 / 积累
  • PV操作的C++代码示例讲解