超实用!Prompt程序员使用指南,大模型各角色代码实战案例分享
提示词(Prompt)是输入给大模型(LLM)的文本指令,用于明确地告诉大模型你想要解决的问题或完成的任务,也是大语言模型理解用户需求并生成准确答案的基础。因此 prompt 使用的好坏,直接决定了大模型生成结果的质量(是否符合预期)。
Prompt 基本使用
为了让大模型生成更符合预期的结果,我们在使用 Prompt 时,可以使用以下模版。
其内容组成为:
- 背景: 介绍与任务紧密相关的背景信息。这一环节有助于 LLM 深入理解讨论的具体环境,从而保证其生成内容与话题高度相关。
- 目的: 明确指出您期望 LLM 完成的具体任务。通过设定清晰、精确的目标指令,可引导 LLM 聚焦于实现既定任务,提升输出的有效性。
- 风格: 指定您希望 LLM 输出的写作风格,可以是某个具体名人、具体流派或者某类专家的写作风格。
- 语气: 定义输出内容应有的语气,比如正式、诙谐、温馨、关怀等,以便适应不同的使用场景和使用目的。
- 受众: 明确指出内容面向的读者群体,无论是专业人士、入门学习者还是儿童等,这样 LLM 就能调整语言和内容深度,使之更加贴合受众需求。
- 输出: 规定输出内容的具体形式,确保 LLM 提供的成果能直接满足后续应用的需求,比如列表、JSON 数据格式、专业分析报告等形式。
以下为阿里云提供的 Prompt 案例:
在未使用 Prompt 模版时,LLM 输出虽表现尚可,但显得过于泛化,缺乏必要的细节和针对特定群体的吸引力。而在使用 Prompt 框架时,框架不仅提醒您考虑需求的其它方面,特别是一般 Prompt 中缺少的风格、语气和受众,还帮助 LLM 生成更针对年轻群体、细节更多、语言表达更加富有张力的输出。
Prompt 优化工具
当然,我们也可以使用一些工具来进行 Prompt 优化,例如阿里云百炼平台 Prompt 优化工具扩写等,如下图所示:
Prompt 发展演化
从程序的角度来看 Prompt 的发展演化经过了以下几个阶段:
- 简单字符串:最初的 Prompt 只是简单的文本字符串。
- 占位符:引入占位符(如 {USER})以动态插入内容。
- 多角色消息:将消息分为不同角色(如用户、助手、系统等),增强交互的复杂性和上下文感知能力。
Spring AI Prompt 组成
以 Spring AI 中的 Prompt 来看,它的实现源码如下:
public class Prompt implements ModelRequest<List<Message>> {
private final List<Message> messages;
private ChatOptions chatOptions;
}
Prompt 实现了 ModelRequest 接口,并且包含了 messages 和 chatOptions 属性,其中:
- messages:包含多个 Message 对象,每个消息代表对话中的一个部分。
- chatOptions:配置选项,用于设置模型的某些属性。
Message API 关系图
Message 对象是 Content 的子类,Spring AI Message API 关系如下图所示:
Prompt 角色分类
Prompt 中的主要角色(Role)包括以下几个:
- 系统角色(System Role) :设定 AI 行为边界。指导 AI 的行为和响应方式,设置 AI 如何解释和回复输入的参数或规则。
- 用户角色(User Role) :接收用户原始输入。代表用户的输入他们向 AI 提出的问题、命令或陈述。这个角色至关重要,因为它构成了 AI 响应的基础。
- 助手角色(Assistant Role) :AI 返回的响应信息,定义为“助手角色”消息。用它可以确保上下文能够连贯的交互。
- 工具/功能角色(Tool/Function Role) :桥接外部服务,可以进行函数调用如,支付/数据查询等操作。
角色在 Spring AI 枚举中被定义,如下源码所示:
public enum MessageType {
USER("user"),
ASSISTANT("assistant"),
SYSTEM("system"),
TOOL("tool");
// .....
}
系统和用户角色使用
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/prompt")
public class PromptController {
private final ChatClient chatClient;
public PromptController(ChatClient.Builder builder) {
this.chatClient = builder.build();
}
@RequestMapping("/system")
public String system(@RequestParam String city) {
String result = chatClient.prompt()
.system("你是一个旅行规划助手")
.user(city)
.call()
.content();
System.out.println(result);
return result;
}
}
以上程序执行结果如下:
助手角色使用
AssistantMessage 助手消息类型可用于接收上次执行结果,并实现上下文连续对话,实现代码如下:
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping("/prompt")
public class PromptController {
private final ChatClient chatClient;
//使用集合记录消息历史
List<Message> messages = new ArrayList<>();
public PromptController(ChatClient.Builder builder) {
this.chatClient = builder.build();
}
@RequestMapping("/assistant")
public String assistant(@RequestParam String msg) {
messages.add(new UserMessage(msg));
// 助手消息
AssistantMessage response = chatClient.prompt()
.messages(messages)
.call()
.chatResponse()
.getResult()
.getOutput();
messages.add(response);
return response.getText();
}
}
程序执行结果如下:
从结果可以看出,第二次交互是在第一次交互的基础上执行的。
获取完整案例加V:vipStone【备注:prompt】
小结
除了 Prompt 以上内容之外,还有 PromptTemplate 以及 Prompt 使用技巧,例如为模型提供输出样例、设定完成任务步骤、使用思维链(Chain of Thought,COT)引导模型“思考”等具体技巧,咱们后期文章再慢慢聊,关注我学习更多 AI 和 Java 的干货知识。
本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:场景题、并发编程、MySQL、Redis、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、JVM、设计模式、消息队列等模块。
超实用!Prompt程序员使用指南,大模型各角色代码实战案例分享的更多相关文章
- java 书籍推荐 JavaEE程序员必读图书大推荐
java 书籍推荐 JavaEE程序员必读图书大推荐 转自:http://www.cnblogs.com/xlwmin/articles/2192775.html 下面是我根据多年的阅读和实践经验,给 ...
- 程序员延寿指南「GitHub 热点速览 v.22.17」
很多人对程序员的固有印象之一便是常加班.易"猝死"!近几年的许多报道似乎也进一步加深了这种印象.应该如何更好地健康地活着.敲喜欢的代码呢?HowToLiveLonger 教你如何从 ...
- 程序员面试京东前端,现场JavaScript代码写出魔方特效
程序员面试京东前端,现场JS代码写出魔方特效,成功搞定20K月薪 今天小编我逛论坛,看到了一位程序员小伙子,因为是有了两年工作经验,然后去京东面试前端岗,一面二面轻松就过了,到了技术面这一块,小伙干脆 ...
- JavaEE程序员必读图书大推荐
下面是我根据多年的阅读和实践经验,给您推荐的一些图书: 第一部分: Java语言篇 1 <Java编程规范> 星级: 适合对象:初级,中级 介绍:作者James Gosling(Java之 ...
- 程序员买房指南——LZ的三次买房和一次卖房经历
引言 买房,一直是程序员群体绕不开的一个话题,尤其是到了一定年纪和人生阶段以后,买房这件事会变得越来越迫切. 为什么LZ一上来就说,买房是程序员绕不开的一个话题? 其实原因很简单,由于程序员这个职业的 ...
- 国内程序员的十大疑问之一:为什么老外不愿意用MyBatis?
老外用MyBatis吗 昨天我在我在知乎看到了一张比较Hibernate和MyBatis使用情况的图,顺手发了条朋友圈: Hibernate vs MyBatis ,谁能告诉我什么样的国情导致了这么大 ...
- [转]成为优秀Java程序员的10大技巧
转自:http://www.codeceo.com/article/10-good-java-programmer-tips.html Java程序员有许多应遵循的守则或最佳实践方式.本文概述了每个开 ...
- 一个.net程序员的安卓之旅-Eclipse设置代码智能提示功能
一个.net程序员的安卓之旅-代码智能提示功能 过完年回来就决心开始学安卓开发,就网上买了个内存条加在笔记本上(因为笔记本原来2G内存太卡了,装了vs2010.SQL Server 2008.orac ...
- 从程序员到CTO的Java技术路线图(我爱分享)
在技术方面无论我们怎么学习,总感觉需要提升自已不知道自己处于什么水平了.但如果有清晰的指示图供参考还是非常不错的,这样我们清楚的知道我们大概处于那个阶段和水平. Java程序员 高级特性 反射.泛型. ...
- 程序员笔记|如何编写高性能的Java代码
一.并发 Unable to create new native thread …… 问题1:Java中创建一个线程消耗多少内存? 每个线程有独自的栈内存,共享堆内存 问题2:一台机器可以创建多少线程 ...
随机推荐
- C# Moq - Non-overridable members may not be used in setup / verification expressions
测试: public class UnitTest1 { [TestMethod] public void TestMethod1() { Mock<TestClass> moc = ne ...
- 《Linux shell 脚本攻略》第1章——读书笔记
目录 文件描述符及重定向 函数和参数 迭代器 算术比较 文件系统相关测试 字符串进行比较 文件描述符及重定向 echo "This is a sample text 1" > ...
- java中的集合ArrayList
创建集合对象有3种形式 1,不需要传递构造参数,直接new就可以,此时底层数组为空数组. 2,构造参数需要传递一个int类型的值, 用于设置底层数组的长度 3,构造参数需要传递一个Collection ...
- springboot logger 的配置
1.dev(开发环境)中logger配置详解 <!-- 文件输出格式 --> <property name="PATTERN" value="% ...
- 同步工具-SeaTunnel使用
一.介绍 SeaTunnel 是一个非常好用.超高性能的分布式数据集成平台,架构于 Apache Spark 和 Apache Flink 之上,实现了海量数据的实时同步与转换.每天可以稳定高效地同步 ...
- FLink写入Clickhouse优化
一.背景 ck因为有合并文件操作,适合批量写入.如单条插入则速度太慢 二.Flink写入ck优化 改为分批插入,代码如下 DataStream<Row> stream = ... stre ...
- Vue3 基础概念与环境搭建
前言 首先需要提醒大家的是,Vue2 已经在2023年停止维护,为了能更好地适应前端开发的发展趋势以及获得更好的性能和功能,我们将从这篇文章开始进入Vue3的阶段.如果对Vue2有想了解的小伙伴可以自 ...
- MOS管的寄生电容
我们经常看到,在电源电路中,功率MOS管的G极经常会串联一个小电阻,几欧姆到几十欧姆不等,那么这个电阻用什么作用呢? 这个电阻的作用有2个作用:限制G极电流,抑制振荡. 限制G极电流MOS管是由电压驱 ...
- 关于Convert.ToUInt16(string? value, int fromBase);
例子: static void Main(string[] args) { string x = "17"; ushort hex = Convert.ToUInt16(x, 16 ...
- MySQL - [08] 存储过程
题记部分 一.什么是存储过程 存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效 ...