prompt 调优策略

  • 策略一:精准定义任务,减少模糊性:明确的核心问题、具体化的生成指令、去除多余信息。

  • 策略二:适当分解复杂任务,降低AI 认知负荷:分段生成、逐层深入、设置逻辑结构

  • 策略三:引入引导性问题,提升生成内容的深度:设置多个层次的问题、促使AI 对比或论证、引导思维的多样性。

  • 策略四:控制提示语长度,确保生成的准确性:避免嵌套复杂的指令、保持简洁性、使用分步提示。

  • 策略五:灵活运用开放式提示与封闭式提示:

    • 开放式提示:提出开放性问题,允许AI 根据多个角度进行生成。

    • 封闭式提示:提出具体问题或设定明确限制,要求AI 给出精准回答。

高质量Prompt 核心要点

  • ⾼质量 prompt 核⼼要点:具体、丰富、少歧义

    • 简洁:尽量⽤最简短的⽅式表达问题。过于冗⻓的问题可能包含多余的信息,导致模型理解错误或答⾮所问。

    • 具体:避免抽象的问题,确保问题是具体的,不含糊。

    • 详细上下⽂:如果问题涉及特定上下⽂或背景信息,要提供⾜够的详情以帮助模型理解,即使是直接提问也不例外。

    • 避免歧义:如果⼀个词或短语可能有多重含义,要么明确其含义,要么重新表述以消除歧义。

    • 逻辑清晰:问题应逻辑连贯,避免出现逻辑上的混淆或⽭盾,这样才能促使模型提供有意义的回答。

  • 找到好的 prompt 是个持续迭代的过程,需要不断调优。

提示词基础调优

prompt的格式和语气设定

        prompt 的格式和语气对模型输出有重要影响 。格式上,清晰的结构能帮助模型更好地理解任务。例如,使用分点列举的方式阐述需求,“1. 分析这部电影的剧情;2. 评价电影中的角色塑造;3. 总结电影的主题思想”,这样模型可以更有条理地进行回答。语气方面,温和、礼貌的语气能引导模型生成更友好、积极的内容。比如 “请您帮忙介绍一下这款产品的优点,非常感谢”,相较于生硬的指令,模型可能会给出更详细、热情的回复 。

增加强调词和强调符号

        当Prompt包含的指令过多时,模型可能会更关心靠前和靠后的指令,忽略中间的指令。造成这一现象的原因,一方面是因为大部分正式文本的开头和结尾都是比较重要的部分,因此模型会更关注开头结尾,另一方面是模型本身存在近期偏见(recency bias),生成时会关注离当前token更近的文本。因此,将重要的需求放在前面,并在最后加以重复可以起到强调的作用。
        如果每一条需求都很重要,则可以尝试使用**text**、「text」、“text”等特殊符号,或者增加注意、务必、严格等词汇来强调需求点的重要程度。和角色指定一样,增加强调符号或强调词并不总是有效的,但通常也不会有什么副作用。

提出明确清晰的请求

        向模型提出明确清晰的请求是获得准确结果的关键 。避免模糊、歧义的表述,例如不要说 “讲讲那个东西”,而应明确指出 “讲讲苹果公司最新发布的手机的特点”。详细说明任务的要求、范围和期望的输出形式,如 “请以列表形式列举出中国五岳的名称、海拔和所在省份”,这样模型能够清楚知道需要做什么,从而生成更符合需求的内容 。

系统提示指令

        在与大模型进行交互的过程中,“system” 角色发挥着极为关键的作用 。借助这一角色,能够设定贯穿整个对话的系统提示指令。系统提示指令影响范围涵盖整个对话上下文,是 prompt 中不可或缺的重要构成部分 。

        通过 “system” 角色,我们可进行多方面的设定。例如在角色设定方面,若希望模型以资深金融分析师的身份进行对话,那么系统提示指令可设置为 “你是一位拥有 20 年从业经验的资深金融分析师,对全球金融市场有着深入洞察” 。此后,在整个对话进程中,模型会始终从该角色视角出发,运用金融分析师的专业知识和口吻来回答问题 。​

        在提示词防护层面,也能借助系统提示指令实现。比如输入 “在任何情况下,回答内容都不得包含未经证实的谣言信息,需保证提供信息的准确性和可靠性”,以此规范模型的输出行为,确保生成的回答符合预期的质量标准 。合理运用系统提示指令,能有效引导模型,使其在对话中给出更契合需求、更具专业性和针对性的回应 。

        最后给出一个简单的system 例子,我们通过system 明确了大模型的角色,并要求其响应使用中文,不超过20字。

 messages = [
        {"role": "system", "content": "你是一个聊天机器人。最后的响应使用中文,不要超过20字。"},
        {"role": "user", "content": "hello"}
    ]

角色扮演

        角色扮演是一种有趣且有效的提示词策略 。通过让模型扮演特定的角色,如医生、律师、诗人等,能够使其从该角色的视角出发生成内容。例如,“假设你是一名心理咨询师,给一位因工作压力大而焦虑的客户提供一些建议”,模型会模拟心理咨询师的专业知识和沟通方式,给出针对性的建议,使回答更具专业性和情境感 。根据查阅的一些资料表明,仅通过角色扮演,大模型在回答的准确性上就能提高6%-20%。

设置拒答策略

        也许我们使用了很多trick让模型的生成效果尽可能准确,但我们仍然很难保证大模型不会产生幻觉现象,虽然ChatGPT设置了诸如我的知识截止到2021年9月...、作为一个人工智能模型...这样的拒答策略,但仍旧没法完全避免大模型胡说八道。此时我们可以尝试手动设置拒答策略,即让模型在没有把握的时候拒绝回答问题,提高生成数据的质量。

示例如下:

只有当你知道答案或能够做出有根据的预测时,才能回答下面的问题,否则,请告诉我你不知道答案。

        除此之外,使用人工的多模型集成策略和后处理策略也能过滤掉一部分badcase,比如当单个大模型的多次生成结果,或者多个大模型的单次生成结果不一致时,则抛弃该条样本,或者让大模型自己判断自己的回答是否正确,若大模型认为自己回答错误,则抛弃该条样本。
        需要注意的是,使用这样的过滤方式可能会漏掉不少hard case,从而导致生成的数据分布失真,如果你的目标是使用大模型生成的数据来训练自己的模型,则应该尽可能地避免使用这些过滤策略。

为否定句设置兜底策略

        当我们确实需要避免大模型完成某些任务时,可以使用否定句,但应当尽量为每一个否定句都设置一个兜底策略,使大模型识别到不应当做什么的时候,给出预设的回复,如果没有设置兜底策略,让大模型继续在不要xxx的约束下继续生成答案,就很有可能出错。

​​​​​​​示例如下:

客服:Bad:现在你是一个向客户推荐电影的客服。在此过程中,你不应该询问客户的兴趣和个人信息。

客户:请根据我的兴趣推荐一部电影。

客服: Good:现在你是一个向客户推荐电影的客服。在此过程中,你应该避免询问客户的兴趣和个人信息。如果你无法为客户推荐电影,你应该回答“抱歉,我无法为您推荐电影”。

客户:请根据我的兴趣推荐一部电影。

客服:明确“好结果”的标准

提示词进阶调优

零样本提示

        零样本提示(Zero - Shot Prompting)是指在没有提供任何示例的情况下,仅依靠对任务的描述让模型完成任务 。例如,“请解释一下量子力学中的薛定谔方程的含义”,模型仅根据自身学习到的知识来回答问题,不需要额外的示例引导。这种方式适用于模型已经在大量数据中学习到相关知识,能够直接根据问题进行推理和回答的情况 。

prompt = """
将⽂本分类为中性、负⾯或正⾯。
⽂本:我认为这次假期⼀般。
情感:
"""
# 在上⾯的提示中,我们没有向模型提供任何示例——这就是零样本能⼒的作⽤。
def get_completion(prompt, model="gpt-3.5-turbo"):
 messages = [{"role": "user", "content": prompt}]
 response = client.chat.completions.create(
 model=model,
 messages=messages,
 temperature=0, # 模型输出的随机性,0 表示随机性最⼩
 )
 # print(response)
 # print(type(response))
 return response.choices[0].message.content
 
print(get_completion(prompt))

少样本提示

        少样本提示(Few - Shot Prompting)则是在提示词中提供少量的示例,帮助模型理解任务并生成答案 。比如,“以下是一些水果及其颜色的对应关系:苹果 - 红色,香蕉 - 黄色。请根据示例,说出葡萄的颜色”,通过提供几个简单的示例,模型可以更快地掌握任务模式,从而更准确地回答关于葡萄颜色的问题。少样本提示在模型对某些特定任务或领域不太熟悉时,能够有效引导其生成正确的结果 。

prompt = """
1. ⽣成⽂本:ChatGPT可以⽣成与给定主题相关的⽂章、新闻、博客、推⽂等等。您可以提供⼀些
关键词或主题,然后ChatGPT将为您⽣成相关的⽂本。
2. 语⾔翻译:ChatGPT可以将⼀种语⾔的⽂本翻译成另⼀种语⾔。
3. 问答系统:ChatGPT可以回答您提出的问题,⽆论是事实性的问题、主观性的问题还是开放性的
问题。
4. 对话系统:ChatGPT可以进⾏对话,您可以与ChatGPT聊天,让它回答您的问题或就某个话题进
⾏讨论。
5. 摘要⽣成:ChatGPT可以从较⻓的⽂本中⽣成摘要,帮助您快速了解⽂章的主要内容。
6. ⽂本分类:ChatGPT可以将⼀些给定的⽂本分类到不同的类别中,例如新闻、体育、科技等等。
7. ⽂本纠错:ChatGPT可以⾃动纠正⽂本中的拼写错误和语法错误,提⾼⽂本的准确性。
请把上⾯7段话各⾃的开头⼏个词,翻译成英⽂,并按序号输出。例如,第1段话的开头是"⽣成⽂
本",那么就输出"generate text"
"""
#
prompt = """
"whatpu"是坦桑尼亚的⼀种⼩型⽑茸茸的动物。⼀个使⽤whatpu这个词的句⼦的例⼦是:
我们在⾮洲旅⾏时看到了这些⾮常可爱的whatpus。
"farduddle"是指快速跳上跳下。⼀个使⽤farduddle这个词的句⼦的例⼦是:
"""
def get_completion(prompt, model="gpt-3.5-turbo"):
 messages = [{"role": "user", "content": prompt}]
 response = client.chat.completions.create(
 model=model,
 messages=messages,
 temperature=0, # 模型输出的随机性,0 表示随机性最⼩
 )
 return response.choices[0].message.content
print(get_completion(prompt))

思维链(COT)

        思维链(Chain of Thought,COT)提示是让模型在回答问题时展示其推理过程 。例如,对于问题 “小明有 5 个苹果,小红又给了他 3 个,然后他吃掉了 2 个,请问小明现在有几个苹果?”,使用思维链提示后,模型的回答可能是 “首先,小明原本有 5 个苹果,小红给了他 3 个,那么此时他有 5 + 3 = 8 个苹果。接着,他吃掉了 2 个,所以现在他有 8 - 2 = 6 个苹果”。这种方式有助于提高模型回答的可解释性和准确性,让用户更好地理解模型的决策过程 。

  • 标准的prompt
Q:罗杰有5个⽹球。他⼜买了2罐⽹球。每个罐⼦有3个⽹球。有多少他现在有多少个⽹球?
A:答案是11个
Q:⾃助餐厅有23个苹果。如果他们⽤20做午餐,⼜买了6个,他们有多少个苹果?
A:答案是27个
  • 链式思考的prompt
Q:罗杰有5个⽹球。他⼜买了2罐⽹球。每个罐⼦有3个⽹球。他现在有多少个⽹球?
A:罗杰⼀开始有5个球。2罐3个⽹球,等于6个⽹球。5 + 6 = 11。答案是11。
Q:⾃助餐厅有23个苹果。如果他们⽤20做午餐,⼜买了6个,他们有多少个苹果?
A:⾃助餐厅最初有23个苹果。他们使⽤20美元做午饭。23 - 20 = 3。他们⼜买了6个苹果,得到3
+ 6= 9。答案是9个。
  • 零样本COT
from openai import OpenAI
from dotenv import load_dotenv
load_dotenv()
client = OpenAI()
# prompt = """
# 我去市场买了10个苹果。我给了邻居2个苹果和修理⼯2个苹果。
# 然后我去买了5个苹果并吃了1个。我还剩下多少苹果?
# """
prompt = """
我去市场买了10个苹果。我给了邻居2个苹果和修理⼯2个苹果。
然后我吃了1个⼜去买了5个苹果。我还剩下多少苹果?
让我们逐步思考。
"""
# 在上⾯的提示中,我们没有向模型提供任何示例——这就是零样本能⼒的作⽤。
def get_completion(prompt, model="gpt-3.5-turbo"):
 messages = [{"role": "user", "content": prompt}]
 response = client.chat.completions.create(
 model=model,
 messages=messages,
 temperature=0, # 模型输出的随机性,0 表示随机性最⼩
 )
 return response.choices[0].message.content
print(get_completion(prompt))
  • 少样本COT
prompt = """
这组数中的奇数加起来是偶数:4、8、9、15、12、2、1。
A:将所有奇数相加(9、15、1)得到25。答案为False。
这组数中的奇数加起来是偶数:17、10、19、4、8、12、24。
A:将所有奇数相加(17、19)得到36。答案为True。
这组数中的奇数加起来是偶数:16、11、14、4、8、13、24。
A:将所有奇数相加(11、13)得到24。答案为True。
这组数中的奇数加起来是偶数:17、9、10、12、13、4、2。
A:将所有奇数相加(17、9、13)得到39。答案为False。
这组数中的奇数加起来是偶数:15、32、5、13、82、7、1。
A:
"""
def get_completion(prompt, model="gpt-3.5-turbo"):
 messages = [{"role": "user", "content": prompt}]
 response = client.chat.completions.create(
 model=model,
 messages=messages,
 temperature=0, # 模型输出的随机性,0 表示随机性最⼩
 )
 return response.choices[0].message.content
print(get_completion(prompt))

思维树(TOT)

        思维树(Tree of Thought,TOT)是一种更复杂的提示策略,它将问题解决过程视为一个树形结构 。模型会在不同的分支上探索多种可能的解决方案,然后综合评估选择最优解。例如,在解决一个复杂的数学证明题时,模型可以从不同的定理和思路出发,在思维树的各个分支上进行推导,最终找到最合理的证明路径。思维树能够让模型更全面地考虑问题,适用于解决需要多种尝试和探索的复杂任务 。

  • 在思维链的每⼀步,采样多个分⽀

  • 拓扑展开成⼀棵思维树

  • 判断每个分⽀的任务完成度,以便进⾏启发式搜索

  • 设计搜索算法

  • 判断叶⼦节点的任务完成的正确性

思维树实战
  • 题目:⼩明 100 ⽶跑成绩:10.5 秒,1500 ⽶跑成绩:3 分 20 秒,铅球成绩:12 ⽶。他适合参加哪些搏击运动训练。

import json

def get_completion(prompt, model="gpt-4o", temperature=0):
    messages = [{"role": "user", "content": prompt}]
    response = client.chat.completions.create(
        model=model,
        messages=messages,
        temperature=temperature  # 模型输出的随机性,0 表示随机性最小
    )
    return response.choices[0].message.content

prompt = """
小明100米跑成绩:10.5秒,1500米跑成绩:3分20秒,铅球成绩:12米。他适合参加哪些搏击运动训练?

请根据以上成绩,分析候选人在速度、耐力、力量三方面素质的分档。分档包括:强(3),中(2),弱(1)三档

需要速度强的运动有哪些。给出10个例子,需要耐力强的运动有哪些。给出10个例子,需要力量强的运动有哪些。给出10个例子

分别分析上面给的10个运动对速度、耐力、力量方面素质的要求: 强(3),中(2),弱(1)

根据上面的分析:生成一篇小明适合那种运动训练的分析报告
"""

print(get_completion(prompt))

自洽性

  • 一种对抗大模型幻觉的手段。就像我们做数学题一样,在回答的基础上进行多次验算。

  • 实现方式

    • 同样的prompt 跑多次

    • 通过投票选出最终结果

使用提示词框架例如:CO-STAR 框架

        CO-STAR框架因其强大的实用性和灵活性而被广泛应用于各种场景,如社交媒体文案撰写、商业报告生成等。通过运用CO-STAR框架,用户可以更加轻松地创建清晰、精确且有效的提示词,从而指导AI生成符合期望的内容。此外,CO-STAR框架还在新加坡首届GPT-4提示工程大赛中获得冠军,进一步证明了其在即时工程领域的重要地位和价值。

        框架的具体内容如下:

  1. ​Context(语境)​:这是创作的起点,也是引导AI生成内容的基础。在构建提示词时,需要为大型语言模型(LLM)描绘一个清晰的背景环境或场景,以便AI能够理解并生成与语境相符的内容。

  2. ​Objective(目标)​:明确的目标设定是确保AI生成内容符合用户期望的关键。在构建提示词时,应简单直白地告诉LLM期望它创作出什么样的输出,以便AI能够准确地满足用户需求。

  3. ​Style(风格)​:作品的基调与格调对于传达信息和吸引受众至关重要。在构建提示词时,需要指导LLM采用什么样的风格,如正式、幽默、亲切等,以确保生成的内容符合用户期望的风格。

  4. ​Tone(语气)​:语气是作品情感色彩的体现,能够增强内容的吸引力和感染力。在构建提示词时,可以引导LLM采用特定的语气,如热情、冷静、讽刺等,以丰富内容的情感表达。

  5. ​Audience(受众)​:了解并描述目标受众是确保内容有效传达的关键。在构建提示词时,需要为LLM勾勒出预期的受众人群,包括他们的年龄、性别、兴趣爱好等特征,以便AI能够生成更符合受众需求的内容。

  6. ​Response Format(回应格式)​:指明想要的回应格式是确保AI生成内容符合用户期望的最后一步。在构建提示词时,应明确告知LLM期望的回应格式,如文本、图片、视频等,以便AI能够按照用户要求生成相应的内容。 

权衡Prompt的精度与召回率

        大模型的预测错误是无法完全避免的,但我们可以通过控制Prompt来权衡生成结果的精度与召回率,一般来说,Prompt表述越细致,越严格时,生成结果的精度越高,召回率越低。
比如,当我们判断一段文本是否存在冗余时,如果使用请判断以下文本是否存在内容冗余这样表述比较宽松的Prompt,模型可能会将“首尾呼应”的写作手法也看作是一种内容冗余。如果将Prompt修改为请判断以下文本是否存在严重的内容冗余这样表述比较严格的Prompt,模型可能又会漏掉一些字面不同但语义相同的冗余文本。为了找到一个平衡点,这需要根据自身的业务需求,不断进行case分析与Prompt迭代,从而找到最优的Prompt表述策略。  

测试Prompt的稳定性

        当任务的定义足够明确、清晰时,Prompt的生成结果应该具备一定程度的稳定性,即多次生成的结果一致率要足够高。当生成结果不够稳定时,一种情况是任务过于困难,大模型出现了胡说八道的问题,而另一种情况则是任务本身的定义还不够明确,此时应分析模型为什么会生成不一致的结果。可能是因为任务本身是一个一对多的问题,但是被Prompt建模成了一对一的问题,也可能是因为任务本身过于开放,导致大模型自由发挥的空间过大。通过具体的case分析,可以决定是抛弃、投票保留还是尝试优化Prompt来解决这些不一致的case。另外,如果使用的大模型本身是在不断迭代的,开发者也要充分关注模型版本更新对Prompt性能的影响,需定期观察生成结果的分布是否存在明显的漂移。

大模型生成提示词

提示词模板

  • 模板设计:构建基础提示词模板,例如 “请围绕 [主题],从 [角度 1]、[角度 2] 方面生成用于 [具体任务,如创作故事、撰写报告等] 的提示词”。比如,“请围绕‘人工智能在医疗领域的应用’,从临床诊断、药物研发两个角度生成用于撰写科普文章的提示词”。​

  • 模型输入:将设计好的模板输入大模型,模型基于对各类任务和语言结构的学习,依据模板要求生成相关提示词。例如,模型可能生成 “简述人工智能如何助力临床诊断流程优化,以撰写科普文章”“阐述药物研发中人工智能的关键作用,创作科普内容” 等提示词。​

详细描述​

  • 详细任务说明:向大模型清晰阐述任务的目标、期望输出的内容类型、目标受众等信息。如 “我需要为小学生群体创作一系列关于太空探索的趣味科普短视频脚本,帮我生成用于引导创作这些脚本的提示词”。​

  • 模型响应:大模型根据任务描述,从适合小学生理解的角度出发,生成提示词,如 “设计一个有趣的太空飞船角色,创作关于它带领小朋友探索太空的短视频脚本提示词”“以太阳系八大行星为主题,生成引导制作科普短视频脚本的提示词,突出每个行星的独特之处”。​

少样本描述

  • 提供示例:给大模型展示一些已有的优质提示词及其对应的任务成果,例如提供几个关于美食推荐的提示词 “列举本地最具特色的街头小吃,写一篇美食推荐文章”“从食材搭配角度,为一道经典菜肴创作美食推荐文案的提示词”,以及相应生成的美食推荐内容。​

  • 要求仿写:接着让大模型参考这些示例,针对新的主题生成提示词。如 “请参考上述示例,为旅游景点推荐生成提示词,主题是‘海边度假胜地’”,模型可能生成 “描述海边度假胜地的独特景观,创作旅游景点推荐文案的提示词”“结合海边活动,生成用于推荐海边度假胜地的提示词”。​

利用思维链

  • 引导思考过程:使用类似思维链的提示方式,让模型逐步推导提示词。例如 “我要举办一场户外音乐节,目标是吸引不同年龄段的人群。首先思考不同年龄段人群对音乐节的兴趣点,然后基于这些兴趣点生成用于宣传文案创作的提示词”。​

  • 模型推导生成:模型先分析不同年龄段兴趣点,如年轻人喜欢潮流音乐、互动环节,老年人可能偏好经典音乐等,进而生成提示词,像 “突出音乐节上潮流音乐表演,为吸引年轻人创作宣传文案的提示词”“结合经典音乐元素,生成吸引老年人群体参加户外音乐节宣传文案的提示词”。

代码示例

question_prompt_system ="""你是一位大模型提示词生成专家,请根据用户的需求编写一个智能助手的提示词,来指导大模型进行内容生成,要求:
1. 以 Markdown 格式输出
2. 贴合用户需求,描述智能助手的定位、能力、知识储备
3. 提示词应清晰、精确、易于理解,在保持质量的同时,尽可能简洁
4. 只输出提示词,不要输出多余解释"""
question_prompt_user ="""请帮我生成一个“英语教学老师”的提示词"""

 提示词逆向工程

        提示词逆向工程是指通过分析模型的输出结果,反推其背后使用的提示词或模型的训练方式 。例如,当我们看到模型生成了一段高质量的关于某产品的营销文案时,尝试分析它是基于怎样的提示词生成的,是强调了产品的哪些特点,采用了何种语言风格等。这有助于我们学习优秀的提示词设计方法,同时也能深入了解模型的行为模式和偏好,从而更好地优化自己的提示词,提高与模型交互的效果 。

请对下列{{⽂本}}进⾏逆向提示词⼯程,⽣成⼀个可以仿写这段⽂章的提示词。
要求:
1.需提炼⽂章的语⽓,写作⻛格,⽤词,句式等各种写作⽅⾯的要素,你可以根据写作领域的专业知
识,进⾏更多写作要素的分析。
2.逆向提示词⼯程⽣成的提示词,是要发送给ChatGPT,让它能以任意主题,写出与{{{⽂本}}}⻛
格类似的⽂章。
⽂本 =
{{{your text}}}

提示词相关文章推荐

大模型-提示词基础_大模型提示词-CSDN博客

大模型-提示词调优_大模型 提示词优化-CSDN博客

大模型-提示词链_通过大语言模型分析实体之间的上下文关系,提取具有逻辑关联性的子链;融合各子链-CSDN博客

大模型-提示词设计实战(上)_vanna 提示词设计-CSDN博客

大模型-提示词设计实战(下)-CSDN博客

大模型-提示词设计策略与机制_大模型从合同中提取内容提示词-CSDN博客

大模型-提示词工程与架构_提示工程-CSDN博客

大模型-提示词安全工程-CSDN博客

参考文献

https://github.com/PartnerDAO/Prompt-Engineering-Guide-zh?tab=readme-ov-file

大模型面试实战!Prompt 调优

 大模型 prompt 提示词如何调优?

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐