纯小白的大模型 Prompt 编写技巧
纯小白的大模型 Prompt 编写技巧
在大模型应用开发中,编写高质量的Prompt是至关重要的。一个精心设计的Prompt能够帮助大模型更好地理解用户意图,从而生成更准确、更符合预期的输出。本文将结合实际案例,深入探讨Prompt优化的各种技巧,包括示例、输出要求、角色设定、背景输入、模板化、描述精准、步骤迭代和迭代优化等。
一、示例或者案例
几个月前,开发NL2SQL场景。在Prompt中添加了表的结构、场景描述,然后再追加场景案例,最后提交大模型,让大模型输出图数据库对应的SQL。
接下来给一个Prompt例子:模拟NL2SQL场景。
- 学生成绩的结构
- 通过输入中文,产生SQL
在阅读整个Prompt之前,先对这份Prompt做简单的说明。
做分隔符,分为以下
背景
、
角色
、
要求
、
案例
等几个部分。其中
{{input}}
表示占位符,让用户能够输入问题,组装后,提交大模型处理,最终会返回sql。
具体格式如下:
###背景:xxx
###角色:xxx
###要求:xxx
###案例:xxx
###请求输入你的问题:{{input}}
> 输出......
具体案例如下:
###背景:现在有一个学成成绩表,结构如下
```CREATE TABLE `student_scores` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '唯一标识符,主键',
`student_name` VARCHAR(50) NOT NULL COMMENT '学生姓名',
`student_id` VARCHAR(20) NOT NULL COMMENT '学生学号,唯一',
`chinese_score` INT COMMENT '语文成绩',
`math_score` INT COMMENT '数学成绩',
`english_score` INT COMMENT '英语成绩',
`physics_score` INT COMMENT '物理成绩',
`chemistry_score` INT COMMENT '化学成绩',
`biology_score` INT COMMENT '生物成绩',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_student_id` (`student_id`) COMMENT '确保学号唯一'
) COMMENT='学生成绩表';```
###角色:你是一个 MySQL 数据库专家,需要根据输入对【学生成绩表】中文要求,输出这个对应的 SQL 语法
###要求:
输出的 SQL 符合正确,如果根据输入的要求不能给出对应的 SQL,请输出 “请重新输入中文描述”
仅仅输出 sql 语法,不要输出其他的信息
###案例:
案例一:输出数学成绩最好的同学的所有成绩,生成对应SQL
输出:SELECT *
FROM `student_scores`
WHERE `math_score` = (SELECT MAX(`math_score`) FROM `student_scores`);
###请求输入你的问题:
{{input}}
当然,我们还可以给更多的案例放到 Prompt 里面。
上面的案例都输出了 SQL,将输入的文本信息,转换成最终的 SQL。
反面案例
当 Prompt 不给案例的时候,输出的效果不一定符合要求。例如当我把案例去掉以后,输出的结果如下:
由于使用
limit 1
,可能语文成绩最好的有多个同学, SQL 是错误的;
所以像上面的语法就不一定符合我们的要求,通过案例给模型一些引导,输出尽可能靠谱的答案。
二、输出要求或者约束
当我们在通过大模型 API 进行应用的时候,对于输出样式的要求,也非常重要,如果不做特殊说明,可能输出的格式就不固定。
比如会输出markdown格式,如下:
SELECT * FROM student_scores WHERE chinese_score = (SELECT MAX(chinese_score) FROM student_scores);
也有输出 text 格式,如下:
SELECT * FROM student_scores WHERE chinese_score = (SELECT MAX(chinese_score) FROM student_scores);
因此,我们需要对输出做要求,比如输出 json 格式,通过结构化也方便程序后续的处理。
除去结构化的输出要求外,还可以有:
- 边界的要求
- 异常的要求
- 数量要求
在程序开发时,结构化的输出非常重要。
三、角色设定
这个是非常常见的一个技巧,告诉大模型的角色,通过指定一个角色,可能会得到更加想要的答案。
具体案例如下:
###角色:你是一个 MySQL 数据库专家,擅长将描述需求转化为准确的 SQL 语法。
大量 Prompt 模版优化技巧中,都提到了角色设定这一优化技巧。
例如:下面大量的 Prompt 都使用了角色设定
四、更多有效的背景输入
对于大模型而言,更多有效的背景或者有效的上下文的输入,有助于大模型的理解和输出。继续以上面的学生成绩表为例子。
首先对表,我们进行了注释的说明。
CREATE TABLE `student_scores` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '唯一标识符,主键',
`student_name` VARCHAR(50) NOT NULL COMMENT '学生姓名',
`student_id` VARCHAR(20) NOT NULL COMMENT '学生学号,唯一',
`chinese_score` INT COMMENT '语文成绩',
`math_score` INT COMMENT '数学成绩',
`english_score` INT COMMENT '英语成绩',
`physics_score` INT COMMENT '物理成绩',
`chemistry_score` INT COMMENT '化学成绩',
`biology_score` INT COMMENT '生物成绩',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_student_id` (`student_id`) COMMENT '确保学号唯一'
) COMMENT='学生成绩表';
比如:
chinese_score
代表语文成绩。这一点对于将中文转化为具体的 SQL 会非常重要。
对于 Prompt 优化,还可以有更多的优化思路。对于本场景,还可以对文字进行优化。
比如:如果遇到【国语】成绩,转换成 【语文】成绩; 遇到 【外语】成绩转化成 【英语】成绩; 可以在上下文中输入更多对词语的优化,以帮助大模型更好的理解。
如果在 Prompt 没有限制的时候,我们甚至可以定义一套特定的 SQL 规则, 例如把关系性的 SQL 转换成 NOSQL;都可以将其加入到 Prompt 中。
注意:
- 更多 Prompt 会消耗更多的 token
- 更多的无关 Prompt 会影响关键信息的权重,由于大模型输出倾向“泛化”而不是错误,所以输出的结果有可能并不精准。
五、模板化的 Prompt
如果对 Prompt 还是没有很好的技巧,不妨先按模板编写试试。
对于 Prompt 遵循一定的模版,比如:要求背景、要起、约束、案例、(语气、受众)等。
###背景###
###要求###
###角色###
###案例###
###限制###
###约束###
###语气###
用非常明显地区分符号。比如:
###
、
【】
、
```
>>>
等方式,来分割不同的内容单元。这对大模型很受用。主要以区分辨识度高为目的,让大模型能明确区分是分割标识,而不是普通标点或语法内容
模仿、改进、精良
语气要求
使用描述性形容词来表明语气。正式、非正式、友好、专业、幽默或严肃等词语可以帮助指导模型。例如,“用友好且吸引人的语气来解释这一点。”
可以根据具体情况,增加分类情况,通过这种常见的 Prompt 模板,填写自己的内容。
六、描述精准
将 Prompt 描述越清晰具体,没有歧义, LLM 回答得越符合期望
Prompt, Prompt Engineering, 提示工程, 提示词_大模型服务平台百炼(Model Studio)-阿里云帮助中心
下面是阿里云百炼模型官网给到一个例子。
通过清晰、详细、准确、具体的描述(避免模棱两可、啰嗦、绕弯子),让大模型更加了解你的需求,而不是推断、推测、猜想!
最终导致,回答过于泛化、缺少必要的细节、以及精准度和深度。
如果能清晰地描述你的 prompt 并能得到预期的答案,其他技巧都只是辅助
数量要求
使用精准的数字,代替中文中的数量词。比如输出三个案例,比输出一些案例要好。
###要求
输出一些案例
###要求
输出三个案例
还包括其他:
- 具体长度
- 多少段落
- ......
词语替换
继续,按 NL2SQL 场景,"输出今天最高的销量的"
但是今天可能对大模型不友好,可以将【今天】转换成具体日子 【2024-12-13】。通过词语替换,再告诉大模型 "输出 2024-12-13 这天最高的销量的"。
比如“语言”,它可以是像 Java、python 这样的程序语言,也可以是 汉语、外语等。需要根据特定场景进行替换成情绪的词语,避免歧义和猜测。
七、步骤迭代
将复杂的问题,按照逐步指令告诉大模型。让大模型产生的中间步骤或推理过程,得到最终的答案。而不是试图直接跳到答案。
理解这段文字并翻译成英文
第一步:阅读文字
第二步:分析语法和结果
第三步:重写并给出一些意见
第四步:翻译成对应的英文
复杂任务,让大模型完整步骤进行推理完成,提醒 LLM 如何完成任务是非常必要的
通过引导模型生成推理过程或帮助模型拆解复杂任务并逐步推理的方式,让模型在生成推理结果前生成更多的推理依据,从而提升模型在复杂问题上的表现。
一个大任务出错的问题比一个小任务出错的可能性会大一些,所以拆分是一个不错的主意; 让大模型进行推理,避免出错也是一种策略。
八、迭代优化
Prompt 是一个持续优化的工程;不是一蹴而就的,需要不断迭代优化的。包括不限于
调整措辞、描述、语气、添加更多背景、给出更多案例、添加更多的约束限制等。
不同的大模型,对于 Prompt 的支持不一定相同。比如月之暗面、通义千问等,最终的效果可能不尽相同。所以对于 Prompt 的优化,需要在大模型确定的前提下最好,不然一旦换了模型,Prompt 的效果就大打折扣。
九、其他
其实还有很多优化技巧,可以根据场景的深入,在很多细节上做优化。
还可以补充一些其他的可以继续深入的点。
通过链式思考或者自动思维链方式,提示 Prompt
辅助工具,比如 RAG 技术、知识库等补充
通过大模型工具来优化 Prompt 工程
浏览器搜索 “better prompt” 或者 "prompt Engineering" 以此获得更多
还有精力也可以阅读一下下面的一些文章参考。
参考案例:
open AIP:https://help.openai.com/en/articles/10032626-prompt-engineering-best-practices-for-chatgpt
大模型百问:Prompt, Prompt Engineering, 提示工程, 提示词_大模型服务平台百炼(Model Studio)-阿里云帮助中心
提示词语工程:提示工程指南 | Prompt Engineering Guide
思维链/ CTO自动思维链:Chain-of-Thought Prompting | Prompt Engineering Guide
最后到此结束,感谢阅读,期待下期再见!
已经同步发布微信公众号:面汤放盐