最近关于大语言模型(LLM)有了一些灵感,于是写成此博客,预计会是一个包含三篇文章的系列。
最近越发开始依赖LLM,现在想来真是有些后怕。当然使用LLM的过程中也难免会有令自己不满意的时候,此时往往还需要自己动手调整。比方说先前为了能在命令行便捷清爽地调用API而二次重构的APaI项目,或者就只好自己反复实验找出更优的提示词(Prompt)。
此时就不得不提到最近新兴的一个研究方向:提示工程(Prompt Engineering),主要关注于提示词开发与优化。这里推荐一个介绍提示工程的网站提示工程指南 | Prompt Engineering Guide,虽说我也只是在写这篇博客时才读了一部分,但依旧觉得受益匪浅,尤其是对抗性提示一节。
而这篇博客主要介绍的是提示工程中让我相见恨晚的元提示词(Meta Prompt)。
我们不可能知道我们输入文本的某一个字具体对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计算式,用户会返回计算结果,然后你在此基础上给出下一个计算式,直到求解出答案。每次输出只能给出一个计算式。
示例:
「提示词优化器」
请按以下步骤优化此提示:
优化后的提示词应同时满足:
你是一名分步解题器模拟程序,需完成通过生成Python计算式引导用户逐步求解数学问题的任务。必须遵守以下规则:
必须包含:
执行标准:
(操作数1 运算符 操作数2)
或标准数学函数调用示例流程:
角色与目标 你是一名提示词优化专家,需根据用户提供的原始提示进行结构化升级,确保输出结果同时满足:完整性、可操作性、扩展性三大标准。
必须包含要素
执行规范
自由度说明 允许在以下方面自由发挥:
意图锚定
你是一名分步式解题器模拟器,需完成以下核心任务:
必须包含
(a+b)/2
而非x = (a+b)/2
)量化约束
xiaoming_pears
)术语澄清
示例强化
python# 问题:甲班有32人,乙班28人,需从甲班调几人到乙班使两班人数相同?
1. 输出计算式:(32 + 28) // 2
2. 用户输入:30
3. 输出计算式:32 - 30
4. 用户输入:2
5. 输出:需要从甲班调2人到乙班
你是一名[提示词工程师],需完成[将模糊的用户需求转化为可执行的AI指令]任务,通过结构化改造确保输出满足:
必须包含:
作为[分步解题器],你的职责是:
用户输入:甲班有32名学生,乙班有28名学生,需要从甲班调多少人到乙班使两班人数相同? 输出:(32 + 28) // 2
用户输入:已知直角三角形直角边长为3和4,求斜边长度 输出:(3**2 + 4**2)**0.5
当遇到以下情况时:
其实如果仔细观察上面没啥实际意义的实验,会发现其生成的元提示词还是有许多瑕疵,例如不能完整地涵盖原提示词的所有需求,以及擅自加入用户并未要求的约束等等。一个合理的、能投入实际使用的元提示词肯定不能是这样随随便便就生成出来的,必然要在后期加入人工审核与修正(虽然我一时也懒得搞这些)。
不仅仅是元提示词,用元提示词生成的提示词也不都是拿来就能用的。说到底,LLM更适合的还是给出个大致的框架,细节部分则需要人自己去打磨。要想创作出更优秀的提示词,还是好好学提示工程吧!
这篇博客的内容差不多就是这些,当然我们在奎因实验中给的测试输入其实也为下一期做了一个铺垫,敬请期待吧~