什么是提示词
提示词(Prompt)在大模型应用中扮演着关键角色,它是用户输入给模型的一段文本指令 。简单来说,就是我们向大模型提出问题、请求或描述任务时所使用的文字内容。例如,当我们想让模型写一篇关于春天的散文,输入的 “请创作一篇描绘春天景色的优美散文” 就是提示词。提示词的质量直接影响模型输出结果的质量和相关性,精准、清晰且富有引导性的提示词能够让模型更准确地理解我们的意图,从而生成符合期望的回答 。
什么是提示工程
提示工程(Prompt Engineering)是一门新兴的技术领域,专注于研究如何设计、构建和优化提示词,以充分发挥大模型的潜力 。它涉及到对语言结构、任务需求、模型特性等多方面因素的综合考量。提示工程的目标是通过精心构造提示词,引导模型生成高质量、准确且有用的输出。例如,在信息检索任务中,通过设计特定结构和内容的提示词,让模型能够从海量知识中筛选出最相关的信息;在文本生成任务里,利用提示工程使模型生成逻辑连贯、风格统一的文本。它不仅仅是简单地输入问题,而是运用各种技巧和策略对提示词进行精细雕琢,以实现与大模型的高效交互 。
提示词策略
获得更好结果的六种策略:
-
write clear instructions 编写清晰的说明
-
provide reference text 提供参考文本
-
split complex tasks into simpler substasks将复杂任务拆分为更简单的子任务
-
give the model time to think 给模型时间思考
-
use external tools 使用外部工具
-
test changes systematically 系统地测试更改
推理模型
-
提示语更简洁,只需明确任务⽬标和需求(因其已内化推理逻辑)
-
⽆需逐步指导,模型⾃动⽣成结构化推理过程(若强⾏拆解步骤,反⽽可能限制其能⼒)
推理模型在处理提示词时,侧重于根据给定的信息进行逻辑推导和分析 。例如,当提示词为 “已知三角形的两条边分别为 3 和 4,且这两条边夹角为 90 度,求第三条边的长度”,推理模型会运用勾股定理等数学知识进行推理计算,给出答案。这类模型能够理解问题中的逻辑关系,按照既定的推理规则得出结论,常用于解决数学问题、逻辑谜题、代码编写等需要理性分析和推导的任务 。
通用模型
-
需显式引导推理步骤(如通过CoT提示),否则可能跳过关键逻辑
-
依赖提示语补偿能⼒短板(如要求分步思考、提供示例)
通用模型具有更广泛的适用性,能处理多种类型的提示词并生成多样化的输出 。比如输入 “介绍一下中国的传统文化”,通用模型可以从多个角度,如传统节日、民间艺术、哲学思想等方面进行阐述。它不局限于特定领域的规则或逻辑,而是凭借对大量文本数据的学习,具备对各种一般性问题进行理解和回答的能力,适用于日常对话、知识科普、创意写作等场景 。
选择原则
-
优先根据需求类型选择模型(如数学任务选择推理模型,创意任务选择通用模型)
-
提示语设计
-
推理模型:简洁,聚焦目标,信任内化能力
-
通用模型:结构化、补偿性引导
-
-
避免误区
-
不要对推理模型使用“启发式“提示词,如角色扮演,可能干扰其逻辑主线
-
不要对通用模型“过度信任“,如直接问复杂推理问题,需分步验证结果
-
提示词基础设定
prompt的格式和语气设定
prompt 的格式和语气对模型输出有重要影响 。格式上,清晰的结构能帮助模型更好地理解任务。例如,使用分点列举的方式阐述需求,“1. 分析这部电影的剧情;2. 评价电影中的角色塑造;3. 总结电影的主题思想”,这样模型可以更有条理地进行回答。语气方面,温和、礼貌的语气能引导模型生成更友好、积极的内容。比如 “请您帮忙介绍一下这款产品的优点,非常感谢”,相较于生硬的指令,模型可能会给出更详细、热情的回复 。
提出明确清晰的请求
向模型提出明确清晰的请求是获得准确结果的关键 。避免模糊、歧义的表述,例如不要说 “讲讲那个东西”,而应明确指出 “讲讲苹果公司最新发布的手机的特点”。详细说明任务的要求、范围和期望的输出形式,如 “请以列表形式列举出中国五岳的名称、海拔和所在省份”,这样模型能够清楚知道需要做什么,从而生成更符合需求的内容 。
系统提示指令
在与大模型进行交互的过程中,“system” 角色发挥着极为关键的作用 。借助这一角色,能够设定贯穿整个对话的系统提示指令。系统提示指令影响范围涵盖整个对话上下文,是 prompt 中不可或缺的重要构成部分 。
通过 “system” 角色,我们可进行多方面的设定。例如在角色设定方面,若希望模型以资深金融分析师的身份进行对话,那么系统提示指令可设置为 “你是一位拥有 20 年从业经验的资深金融分析师,对全球金融市场有着深入洞察” 。此后,在整个对话进程中,模型会始终从该角色视角出发,运用金融分析师的专业知识和口吻来回答问题 。
在提示词防护层面,也能借助系统提示指令实现。比如输入 “在任何情况下,回答内容都不得包含未经证实的谣言信息,需保证提供信息的准确性和可靠性”,以此规范模型的输出行为,确保生成的回答符合预期的质量标准 。合理运用系统提示指令,能有效引导模型,使其在对话中给出更契合需求、更具专业性和针对性的回应 。
最后给出一个简单的system 例子,我们通过system 明确了大模型的角色,并要求其响应使用中文,不超过20字。
messages = [{"role": "system", "content": "你是一个聊天机器人。最后的响应使用中文,不要超过20字。"},{"role": "user", "content": "hello"}]
角色扮演
角色扮演是一种有趣且有效的提示词策略 。通过让模型扮演特定的角色,如医生、律师、诗人等,能够使其从该角色的视角出发生成内容。例如,“假设你是一名心理咨询师,给一位因工作压力大而焦虑的客户提供一些建议”,模型会模拟心理咨询师的专业知识和沟通方式,给出针对性的建议,使回答更具专业性和情境感 。根据查阅的一些资料表明,仅通过角色扮演,大模型在回答的准确性上就能提高6%-20%。
提示词进阶设定
零样本提示
零样本提示(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.contentprint(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 jsondef 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.contentprompt = """
小明100米跑成绩:10.5秒,1500米跑成绩:3分20秒,铅球成绩:12米。他适合参加哪些搏击运动训练?请根据以上成绩,分析候选人在速度、耐力、力量三方面素质的分档。分档包括:强(3),中(2),弱(1)三档需要速度强的运动有哪些。给出10个例子,需要耐力强的运动有哪些。给出10个例子,需要力量强的运动有哪些。给出10个例子分别分析上面给的10个运动对速度、耐力、力量方面素质的要求: 强(3),中(2),弱(1)根据上面的分析:生成一篇小明适合那种运动训练的分析报告
"""print(get_completion(prompt))
自洽性
-
一种对抗大模型幻觉的手段。就像我们做数学题一样,在回答的基础上进行多次验算。
-
实现方式
-
同样的prompt 跑多次
-
通过投票选出最终结果
-
CO-STAR 框架
-
Context(语境):这是创作的起点,也是引导AI生成内容的基础。在构建提示词时,需要为大型语言模型(LLM)描绘一个清晰的背景环境或场景,以便AI能够理解并生成与语境相符的内容。
-
Objective(目标):明确的目标设定是确保AI生成内容符合用户期望的关键。在构建提示词时,应简单直白地告诉LLM期望它创作出什么样的输出,以便AI能够准确地满足用户需求。
-
Style(风格):作品的基调与格调对于传达信息和吸引受众至关重要。在构建提示词时,需要指导LLM采用什么样的风格,如正式、幽默、亲切等,以确保生成的内容符合用户期望的风格。
-
Tone(语气):语气是作品情感色彩的体现,能够增强内容的吸引力和感染力。在构建提示词时,可以引导LLM采用特定的语气,如热情、冷静、讽刺等,以丰富内容的情感表达。
-
Audience(受众):了解并描述目标受众是确保内容有效传达的关键。在构建提示词时,需要为LLM勾勒出预期的受众人群,包括他们的年龄、性别、兴趣爱好等特征,以便AI能够生成更符合受众需求的内容。
-
Response Format(回应格式):指明想要的回应格式是确保AI生成内容符合用户期望的最后一步。在构建提示词时,应明确告知LLM期望的回应格式,如文本、图片、视频等,以便AI能够按照用户要求生成相应的内容。
CO-STAR框架因其强大的实用性和灵活性而被广泛应用于各种场景,如社交媒体文案撰写、商业报告生成等。通过运用CO-STAR框架,用户可以更加轻松地创建清晰、精确且有效的提示词,从而指导AI生成符合期望的内容。此外,CO-STAR框架还在新加坡首届GPT-4提示工程大赛中获得冠军,进一步证明了其在即时工程领域的重要地位和价值。
提示词逆向工程
提示词逆向工程是指通过分析模型的输出结果,反推其背后使用的提示词或模型的训练方式 。例如,当我们看到模型生成了一段高质量的关于某产品的营销文案时,尝试分析它是基于怎样的提示词生成的,是强调了产品的哪些特点,采用了何种语言风格等。这有助于我们学习优秀的提示词设计方法,同时也能深入了解模型的行为模式和偏好,从而更好地优化自己的提示词,提高与模型交互的效果 。
请对下列{{⽂本}}进⾏逆向提示词⼯程,⽣成⼀个可以仿写这段⽂章的提示词。
要求:
1.需提炼⽂章的语⽓,写作⻛格,⽤词,句式等各种写作⽅⾯的要素,你可以根据写作领域的专业知
识,进⾏更多写作要素的分析。
2.逆向提示词⼯程⽣成的提示词,是要发送给ChatGPT,让它能以任意主题,写出与{{{⽂本}}}⻛
格类似的⽂章。
⽂本 =
{{{your text}}}
大模型自生成提示词
提示词模板
-
模板设计:构建基础提示词模板,例如 “请围绕 [主题],从 [角度 1]、[角度 2] 方面生成用于 [具体任务,如创作故事、撰写报告等] 的提示词”。比如,“请围绕‘人工智能在医疗领域的应用’,从临床诊断、药物研发两个角度生成用于撰写科普文章的提示词”。
-
模型输入:将设计好的模板输入大模型,模型基于对各类任务和语言结构的学习,依据模板要求生成相关提示词。例如,模型可能生成 “简述人工智能如何助力临床诊断流程优化,以撰写科普文章”“阐述药物研发中人工智能的关键作用,创作科普内容” 等提示词。
详细描述
-
详细任务说明:向大模型清晰阐述任务的目标、期望输出的内容类型、目标受众等信息。如 “我需要为小学生群体创作一系列关于太空探索的趣味科普短视频脚本,帮我生成用于引导创作这些脚本的提示词”。
-
模型响应:大模型根据任务描述,从适合小学生理解的角度出发,生成提示词,如 “设计一个有趣的太空飞船角色,创作关于它带领小朋友探索太空的短视频脚本提示词”“以太阳系八大行星为主题,生成引导制作科普短视频脚本的提示词,突出每个行星的独特之处”。
少样本描述
-
提供示例:给大模型展示一些已有的优质提示词及其对应的任务成果,例如提供几个关于美食推荐的提示词 “列举本地最具特色的街头小吃,写一篇美食推荐文章”“从食材搭配角度,为一道经典菜肴创作美食推荐文案的提示词”,以及相应生成的美食推荐内容。
-
要求仿写:接着让大模型参考这些示例,针对新的主题生成提示词。如 “请参考上述示例,为旅游景点推荐生成提示词,主题是‘海边度假胜地’”,模型可能生成 “描述海边度假胜地的独特景观,创作旅游景点推荐文案的提示词”“结合海边活动,生成用于推荐海边度假胜地的提示词”。
利用思维链
-
引导思考过程:使用类似思维链的提示方式,让模型逐步推导提示词。例如 “我要举办一场户外音乐节,目标是吸引不同年龄段的人群。首先思考不同年龄段人群对音乐节的兴趣点,然后基于这些兴趣点生成用于宣传文案创作的提示词”。
-
模型推导生成:模型先分析不同年龄段兴趣点,如年轻人喜欢潮流音乐、互动环节,老年人可能偏好经典音乐等,进而生成提示词,像 “突出音乐节上潮流音乐表演,为吸引年轻人创作宣传文案的提示词”“结合经典音乐元素,生成吸引老年人群体参加户外音乐节宣传文案的提示词”。
代码示例
question_prompt_system ="""你是一位大模型提示词生成专家,请根据用户的需求编写一个智能助手的提示词,来指导大模型进行内容生成,要求:
1. 以 Markdown 格式输出
2. 贴合用户需求,描述智能助手的定位、能力、知识储备
3. 提示词应清晰、精确、易于理解,在保持质量的同时,尽可能简洁
4. 只输出提示词,不要输出多余解释"""
question_prompt_user ="""请帮我生成一个“英语教学老师”的提示词"""
prompt 调优策略
-
找到好的 prompt 是个持续迭代的过程,需要不断调优。
-
⾼质量 prompt 核⼼要点:具体、丰富、少歧义
-
简洁:尽量⽤最简短的⽅式表达问题。过于冗⻓的问题可能包含多余的信息,导致模型理解错误或答⾮所问。
-
具体:避免抽象的问题,确保问题是具体的,不含糊。
-
详细上下⽂:如果问题涉及特定上下⽂或背景信息,要提供⾜够的详情以帮助模型理解,即使是直接提问也不例外。
-
避免歧义:如果⼀个词或短语可能有多重含义,要么明确其含义,要么重新表述以消除歧义。
-
逻辑清晰:问题应逻辑连贯,避免出现逻辑上的混淆或⽭盾,这样才能促使模型提供有意义的回答。
-
参考文献
https://github.com/PartnerDAO/Prompt-Engineering-Guide-zh?tab=readme-ov-file
大模型面试实战!Prompt 调优
大模型 prompt 提示词如何调优?