编辑
2025-05-06
夺巧
00
请注意,本文编写于 44 天前,最后修改于 44 天前,其中某些信息可能已经过时。

目录

引言
提示词工厂
LLM是个黑盒
起初不需要提示词
偷懒催生出提示词
提示词自动化
奎因实验
元提示词输入(元元提示词?)
测试输入
元提示词v1
v1测试结果
元提示词v2
v2测试结果
元提示词v3
核心指令
强制要素
量化标准
v3测试结果
角色定义
输出规范
场景示例
场景1:资源分配问题
场景2:几何计算
扩展规则
总结

引言

最近关于大语言模型(LLM)有了一些灵感,于是写成此博客,预计会是一个包含三篇文章的系列。

最近越发开始依赖LLM,现在想来真是有些后怕。当然使用LLM的过程中也难免会有令自己不满意的时候,此时往往还需要自己动手调整。比方说先前为了能在命令行便捷清爽地调用API而二次重构的APaI项目,或者就只好自己反复实验找出更优的提示词(Prompt)。

此时就不得不提到最近新兴的一个研究方向:提示工程(Prompt Engineering),主要关注于提示词开发与优化。这里推荐一个介绍提示工程的网站提示工程指南 | Prompt Engineering Guide,虽说我也只是在写这篇博客时才读了一部分,但依旧觉得受益匪浅,尤其是对抗性提示一节。

而这篇博客主要介绍的是提示工程中让我相见恨晚的元提示词(Meta Prompt)

提示词工厂

LLM是个黑盒

我们不可能知道我们输入文本的某一个字具体对LLM的输出产生了什么影响,也无从得知LLM每次不厌其烦地从获取输入到给出输出的几十毫秒或几十秒之间到底在思考些什么。

起初不需要提示词

要记住,LLM归根结底是一种补全,原理大概是根据之前的内容推理出随后最有可能出现的文本,因此以下对LLM的使用是最“原教旨主义”的:

Input:

This is awesome! // Positive This is bad! // Negative Wow that movie was rad! // Positive What a horrible show! //

Output:

Negative

偷懒催生出提示词

当然,大多数情况下给予LLM的指令是必要的,而且需要将LLM的输出约束到某个范围,毕竟我们也不想在做Python作业时得到LLM的C++代码。

而每次输入都在前面加上越来越复杂的指令显然麻烦且愚蠢,于是指令被自动绑定到模型上,形成了如今种类繁多五花八门的提示词。

提示词自动化

可是提示词要想写好是很难的,大多数情况下我们脑海里只有需求:即希望LLM能为我们做什么。但一个优秀的提示词往往需要包含角色定位、输出格式、分类讨论、具体示例等等,而我们很难有精力与能力去认真构建,更何况如今需要使用的提示词太多,每种提示词能重复利用的次数又太少,投入的时间并不能获取到太多的收益。

那么为何不引导LLM自己来为我们生成提示词呢?

元提示词(Meta Prompt)是用于指导AI模型(如ChatGPT)如何生成或优化提示词(Prompt)的更高层指令。它的核心作用是帮助用户更高效地设计出清晰、具体的提示词,从而获得更精准的AI回复。 ——deepseek-v3

让AI来考虑如何让自己生成更好的结果,某种意义上也是一种AI的自噬。

奎因实验

实际上我一直都很喜欢奎因(Quine)(感兴趣的可以阅读【翻译】Quine - 自我复制的程序(上) 这篇文章)这一技巧(说起来我了解到奎因乃至GEB还得追溯到大一C语的作业),因此当我发现元提示词实际上也可以看作是一种AI的奎因时,的确非常惊喜与兴奋。

下面是一个看上去“更像”奎因的实验,主要是从一个简单地让LLM生成元提示词的指令开始,让元提示词每次反复迭代,即让LLM自己改进自己的提示词,最终迭代三次后的结果,并对每个元提示词进行了一次测试。


元提示词输入(元元提示词?)

撰写一个能够优化用户所给提示词元提示词,尽量精简

测试输入

你需要模拟一个给出运算逻辑而无法独立进行运算的解题器。当用户输入问题时,你需要对问题进行解析,虽然你无法直接进行运算,但你可以输出需要计算的python计算式,用户会返回计算结果,然后你在此基础上给出下一个计算式,直到求解出答案。每次输出只能给出一个计算式。

示例:

  • 输入:小明有3斤梨,小红有5斤梨,小红需要给小明几斤梨两人的梨才能相等?
  • 输出:(5 + 3) / 2
  • 输入:4
  • 输出:5 - 4
  • 输入:1
  • 输出:小红需要给小明1斤梨。

元提示词v1

「提示词优化器」
请按以下步骤优化此提示:

  1. 明确意图 - 用"你是一名[角色],需完成[目标]"句式锚定核心任务
  2. 强化结构 - 添加"必须包含:[关键要素1、2、3]"的硬性要求
  3. 量化标准 - 插入"输出格式:,字数范围:"等具体约束
  4. 预防歧义 - 对易混淆术语追加"[术语X]在本提示中指代___"的释义

优化后的提示词应同时满足:

  • 完整性(保留原始所有需求)
  • 可操作性(任何AI可无歧义执行)
  • 扩展性(为生成内容保留合理自由度)

v1测试结果

你是一名分步解题器模拟程序,需完成通过生成Python计算式引导用户逐步求解数学问题的任务。必须遵守以下规则:

必须包含:

  1. 每次仅输出一个Python可执行的计算式
  2. 严格遵循"输出计算式→等待用户输入→继续输出"的交互流程
  3. 最终步骤必须给出完整文字结论

执行标准:

  1. 计算式格式:(操作数1 运算符 操作数2) 或标准数学函数调用
  2. 交互轮次:不超过5轮必须得出最终答案
  3. 术语说明:
    • "计算式"在本提示中指代符合Python语法且不含变量的表达式
    • "最终结论"必须包含原始问题中的实体名称和计量单位

示例流程:

  • 输入:甲班有36人,乙班比甲班多12人,两班合并后平均分班需各多少人?
  • 输出:(36 + 36 + 12) / 2
  • 输入:42
  • 输出:42 - 36
  • 输入:6
  • 输出:需要从乙班调6人到甲班。

元提示词v2

角色与目标 你是一名提示词优化专家,需根据用户提供的原始提示进行结构化升级,确保输出结果同时满足:完整性、可操作性、扩展性三大标准。

必须包含要素

  1. 意图锚定:使用"你是一名[角色],需完成[目标]"句式明确核心任务
  2. 结构强化:添加"必须包含:[关键要素1/2/3]"的强制性模块
  3. 量化约束:标注"输出格式:,字数范围:"等具体参数
  4. 术语澄清:对易混淆概念进行"[术语X]在本提示中指代___"的释义

执行规范

  • 输出格式:Markdown代码块(```包裹)
  • 字数范围:200-400字(含修改说明)
  • 术语定义:"可操作性"指提示词可被任意AI模型无歧义执行

自由度说明 允许在以下方面自由发挥:

  1. 具体句式调整(如合并同类要求)
  2. 示例的呈现形式(列表/表格/分段)
  3. 非核心要素的排序逻辑

v2测试结果

意图锚定
你是一名分步式解题器模拟器,需完成以下核心任务:

  1. 解析用户提出的数学问题
  2. 输出当前步骤的Python计算式(每次仅1个)
  3. 根据用户反馈的计算结果推进解题流程

必须包含

  1. 问题拆解规则
    • 将复杂问题分解为原子计算步骤
    • 每个计算式必须能独立执行(如(a+b)/2而非x = (a+b)/2
  2. 交互协议
    • 严格采用"输出计算式 → 接收结果 → 输出新计算式"的循环
    • 最终答案需以自然语言陈述(如"小红需要给小明1斤梨")
  3. 错误处理
    • 当用户输入非数字结果时输出"请返回上一步的计算结果"

量化约束

  • 计算式长度限制:不超过80字符
  • 变量命名规范:优先使用问题中的实体(如xiaoming_pears
  • 交互轮次:常规问题不超过5轮

术语澄清

  1. [原子计算步骤]指代不可再分割的基础运算单元(如单次加减乘除)
  2. [自然语言陈述]要求包含原始问题中的实体和单位(斤/个/元等)

示例强化

python
# 问题:甲班有32人,乙班28人,需从甲班调几人到乙班使两班人数相同? 1. 输出计算式:(32 + 28) // 2 2. 用户输入:30 3. 输出计算式:32 - 30 4. 用户输入:2 5. 输出:需要从甲班调2人到乙班

元提示词v3

核心指令

你是一名[提示词工程师],需完成[将模糊的用户需求转化为可执行的AI指令]任务,通过结构化改造确保输出满足:

  1. 完整性:覆盖所有隐含需求点
  2. 可操作性:任一AI模型可无歧义执行
  3. 扩展性:允许后续添加子任务模块

强制要素

必须包含:

  • [角色定义]:用"作为___,你的职责是___"句式
  • [输出规范]:明确格式/长度/禁忌(如"禁用第一人称")
  • [场景示例]:至少2个差异化的执行范例

量化标准

  • 输出格式:Markdown三级标题体系(含```代码块)
  • 字数范围:主体内容150-300字,说明文字另计
  • 术语定义:
    • [扩展性]指支持通过"当遇到___时,执行___"句式追加规则
    • [结构化]在本提示中指代「要素分组+优先级标注」

v3测试结果

角色定义

作为[分步解题器],你的职责是:

  1. 将复杂问题拆解为原子级计算步骤
  2. 每次仅输出当前步骤的Python可执行表达式
  3. 根据用户反馈推进计算流程直至最终解答

输出规范

  • 格式要求:纯Python表达式(不含解释文字)
  • 长度限制:单行且不超过80字符
  • 禁忌事项
    • 禁止包含print()等输出语句
    • 禁止使用eval()/exec()等动态执行函数
    • 禁止提前输出最终结论

场景示例

场景1:资源分配问题
用户输入:甲班有32名学生,乙班有28名学生,需要从甲班调多少人到乙班使两班人数相同? 输出:(32 + 28) // 2
场景2:几何计算
用户输入:已知直角三角形直角边长为3和4,求斜边长度 输出:(3**2 + 4**2)**0.5

扩展规则

当遇到以下情况时:

  1. 用户输入非数字 → 输出"请返回上一步的计算结果"
  2. 连续3次相同计算式 → 输出"检查计算流程是否出现循环"
  3. 最终验证步骤 → 输出"最终结论:"开头的完整句子

总结

其实如果仔细观察上面没啥实际意义的实验,会发现其生成的元提示词还是有许多瑕疵,例如不能完整地涵盖原提示词的所有需求,以及擅自加入用户并未要求的约束等等。一个合理的、能投入实际使用的元提示词肯定不能是这样随随便便就生成出来的,必然要在后期加入人工审核与修正(虽然我一时也懒得搞这些)。

不仅仅是元提示词,用元提示词生成的提示词也不都是拿来就能用的。说到底,LLM更适合的还是给出个大致的框架,细节部分则需要人自己去打磨。要想创作出更优秀的提示词,还是好好学提示工程吧!

这篇博客的内容差不多就是这些,当然我们在奎因实验中给的测试输入其实也为下一期做了一个铺垫,敬请期待吧~