什么是提示技术?
提示技术是实现提示工程目标的具体技术手段,是提示工程中的“工具库”。
什么又是提示工程?
提示工程是指通过设计、优化和迭代输入到大语言模型(LLM)的提示(Prompt),系统性提升模型输出质量(如相关性、准确性、可控性)的实践领域。它是一个覆盖全流程的方法论,包括:
- 明确目标任务(如生成教学内容、问答、翻译);
- 设计提示结构(如指令、上下文、示例);
- 选择模型与参数(如温度、top_p);
- 验证与迭代(根据输出调整提示)。
其核心是“通过工程化方法控制大语言模型(LLM)的行为”。
概念
少样本提示,是一种通过提供少量示例(通常1-5个)引导大语言模型(LLM)完成新任务的技术。也就是在零样本提示的基础上,加上引导性示例,我们想要LLM回复的内容更加准确,风格更像我们要的等。
零样本与少样本的定义与原理对比
维度 | 零样本提示 | 少样本提示 |
定义 | 完全不提供目标任务的输入-输出示例,仅通过自然语言指令引导模型完成任务。 | 提供少量(通常1-5个)目标任务的输入-输出示例,通过示例示范引导模型学习任务模式。 |
核心原理 | 依赖模型预训练阶段积累的通用知识(如语言理解、常识推理),直接建立“输入描述→输出目标”的语义关联。 | 通过示例提取任务的具体模式(如格式、逻辑、术语),将模型的“通用能力”适配到目标任务的具体要求。 |
知识来源 | 模型内置的预训练知识(如大规模文本语料中的统计规律)。 | 示例提供的领域知识或任务逻辑(如法律术语、代码语法等领域专业知识或术语、教学结构)。 |
零样本提示与少样本提示的本质区别在于:是否依赖示例引导:
- 零样本依赖模型预训练的通用知识,适合通用、动态的任务,但受限于模型知识边界;
- 少样本通过示例注入领域知识或任务逻辑,适合专业、复杂的任务,但依赖示例质量。
概念图解
应用场景
- 文本生成与风格模仿;
- 翻译与专业文本生成;
- 代码生成;
- 教育与培训场景;
- ……
案例实操
使用工具:扣子。
文本生成与风格模仿
prompt:
请生成3条快乐星球茶饮品牌的社交媒体推广文案(要求:年轻化、活泼语气,突出“清爽”“果香”卖点)。
示例1:
输入(产品):青提柠檬茶
输出:「青提+柠檬的神仙组合!咬一口青提爆汁,喝一口柠檬清冽,夏天闷热全跑掉~这杯‘夏日元气弹’,你准备好接招了吗?」示例2:
输入(产品):白桃乌龙奶盖
输出:「白桃香+乌龙茶底,奶盖上撒着脆波波~吸一口,桃子的甜、茶的香、奶的醇,在嘴里转圈圈!今天的快乐,从这杯‘桃气满满’开始~」请生成3条类似风格的文案(产品:西瓜椰椰冰红茶、荔枝龙井冰萃查、芒果黑茶)。
运行结果如下:
翻译与专业文本生成
prompt:
请将以下英文租赁合同翻译为中文(要求:准确翻译法律术语,保持正式语气)。
示例1:
输入(英文):
"This Lease Agreement is made between Landlord (Party A) and Tenant (Party B). The lease term is 12 months, commencing on January 1, 2024. Tenant shall pay a security deposit of $2,000, which shall be refunded within 30 days after the termination of this Agreement."输出(中文):
“本租赁合同由出租方(甲方)与承租方(乙方)签订。租赁期限为12个月,自2024年1月1日起算。承租方应支付押金2000美元,该押金将于本合同终止后30日内退还。”示例2:
输入(英文):
"Either party may terminate this Agreement by giving 30 days' written notice to the other party. In case of breach of contract, the defaulting party shall bear the liability for damages."输出(中文):
“任何一方均可提前30日书面通知对方解除本合同。若一方违约,违约方应承担赔偿责任。”请翻译以下英文合同条款:
"The Tenant agrees to keep the premises clean and in good repair. Any damage caused by the Tenant shall be repaired at his/her own expense. The Landlord shall provide necessary utilities such as water and electricity during the lease term."
运行结果如下:
代码生成
prompt:
# 示例1:计算阶乘的函数
def factorial(n):
if n == 0 or n == 1:
return 1
else:
return n * factorial(n - 1)# 示例2:计算平方和的函数
def sum_of_squares(numbers):
total = 0
for num in numbers:
total += num ** 2
return total
请实现一个计算斐波那契数列的函数
运行结果如下:
案例生成的代码:
1. 递归实现(简单但效率低)
def fibonacci_recursive(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fibonacci_recursive(n-1) + fibonacci_recursive(n-2)
2. 迭代实现(高效)
def fibonacci_iterative(n):
if n == 0:
return 0
a, b = 0, 1
for _ in range(2, n+1):
a, b = b, a + b
return b
3. 带缓存的递归实现(记忆化)
from functools import lru_cache
@lru_cache(maxsize=None)
def fibonacci_memoization(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fibonacci_memoization(n-1) + fibonacci_memoization(n-2)
4. 生成器实现(生成序列)
def fibonacci_sequence(n):
a, b = 0, 1
for _ in range(n+1):
yield a
a, b = b, a + b
这四个代码案例都可运行,但是只要方法4:生成器实现(生成序列)实现了“请实现一个计算斐波那契数列的函数”,而其他实现的是这个悲波那契数列的求和。
教育与培训场景
小学数学题生成(难度匹配)
prompt:
请生成 4 道适合小学三年级学生的 “两位数乘法” 练习题(要求:包含进位计算,高难度)。
示例 1:
输入(难度要求):三年级上册(掌握两位数乘一位数进位)
输出:
1. 23×4=?(进位:3×4=12,需向十位进 1)
2. 45×3=?(进位:5×3=15,需向十位进 1)
3. 17×6=?(进位:7×6=42,需向十位进 4)
示例 2:
输入(难度要求):三年级下册(掌握两位数乘两位数进位)
输出:
1. 28×15=?(个位:8×5=40,进 4;十位:2×5+8×1+4=22,进 2;百位:2×1+2=4)
2. 36×24=?(个位:6×4=24,进 2;十位:3×4+6×2+2=26,进 2;百位:3×2+2=8)
请生成 4 道 “两位数乘两位数” 练习题(要求:包含连续进位,结果不超过 1000)。
运行结果如下:
编程教学方案设计(结构引导)
prompt:
请设计一份“Python循环语句”的教学方案(要求:包含知识点讲解、示例代码、课堂练习)。
示例1:
输入(教学目标):掌握for循环的基本用法(遍历列表)
输出:
一、知识点讲解:
for循环用于重复执行代码块,语法:for 变量 in 可迭代对象: 代码块二、示例代码:
fruits = ["苹果", "香蕉", "橙子"]
for fruit in fruits:
print(f"我爱吃{fruit}")三、课堂练习:
用for循环打印1-10的整数。示例2:
输入(教学目标):掌握while循环的条件控制
输出:
一、知识点讲解:
while循环根据条件真假重复执行代码块,语法:while 条件: 代码块二、示例代码:
count = 0
while count < 10:
print(f"当前计数:{count}")
count = count + 1三、课堂练习:
用while循环打印“Hello Python”10次。请设计一份“Python循环语句”的教学方案(教学目标:掌握for循环嵌套和break语句)。
运行结果如下:
生成的《Python 循环语句教学方案》内容如下:
Python循环语句教学方案
教学目标:掌握for循环嵌套和break语句
一、知识点讲解
for循环嵌套
- 在一个for循环内部可以包含另一个for循环,用于处理多维数据或复杂逻辑
- 语法:
for 变量1 in 可迭代对象1: for 变量2 in 可迭代对象2: 代码块
- break语句
- 用于立即终止当前循环(包括for和while循环)
- 通常与条件判断结合使用
- 语法:
if 条件: break
二、示例代码
示例1:for循环嵌套(打印乘法表)
for i in range(1, 4): # 外层循环控制行 for j in range(1, 4): # 内层循环控制列 print(f"{i}×{j}={i*j}", end="\t") print() # 换行
示例2:break语句(搜索数字)
numbers = [3, 7, 2, 9, 5] target = 2 for num in numbers: print(f"正在检查:{num}") if num == target: print("找到目标!") break print("搜索结束")
三、课堂练习
- 基础练习
- 使用嵌套for循环打印以下图案:
* ** ***
- 进阶练习
- 创建一个包含10个随机数的列表(1-100),使用for循环和break找出第一个大于50的数字
- 挑战练习
- 用嵌套循环实现:当两个循环变量的乘积大于10时立即终止所有循环(提示:可使用标志变量)
四、参考答案(供教师参考)
基础练习答案
for i in range(1, 4): for j in range(i): print("*", end="") print()
进阶练习答案
import random numbers = [random.randint(1, 100) for _ in range(10)] for num in numbers: if num > 50: print(f"第一个大于50的数字是:{num}") break
挑战练习答案
stop_flag = False for i in range(1, 5): for j in range(1, 5): if i * j > 10: stop_flag = True break print(f"{i}×{j}={i*j}") if stop_flag: break
总结与思考
少样本提示,是在零样本提示的基础上,加上示例引导,从而更好地满足我们的需求。在实际应用中,可结合两者优势:先用零样本生成初稿,再用少样本优化细节(如教育内容生成)。这也符合我们编程实现的一种良好习惯:先实现后优化。
同样地,少样本提示也存在:模型知识边界限制:无法超越训练数据范围,尽管我们已经提供了示例,但对于复杂问题来说,也无法弥补此问题。
复杂任务处理能力不足:多步推理与逻辑链断裂,理由同样如此,示例不足以弥补。
那么,我们有什么解决办法吗?对于复杂问题来说,我们往往会根据实际不同的需求任务来判断,并综合使用多种提示技术。
路漫漫其修远兮……让我们一起在理论学习与项目实战中,不断试错、总结,从而实现螺旋式成长吧。
有兴趣的朋友,可多多实践,亦或者在评论区留下你的问题或是见解等,当然我也不介意你私聊骚扰 ^..^
提示技术系列,接下来分享:链式思考(CoT)提示;自我一致性;生成知识提示;链式提示(Prompt Chaining);思维树(ToT);自动提示工程师(APE);主动提示(Active-Prompt);方向性刺激提示等等
为了方便大家学习,这里给出专栏链接:提示技术_AIGC包拥它的博客-优快云博客
希望能和大家一起学习与交流……