分类: Prompt应用

  • 如何正确使用提示词,让 Google Gemini 助您学习、生活、工作

    如何正确使用提示词,让 Google Gemini 助您学习、生活、工作

    Google Gemini 是一款强大的语言模型,可以帮助您完成各种任务。通过正确使用提示词,您可以充分发挥 Gemini 的潜力,让它成为您学习、生活和工作中的得力助手。

    以下是使用提示词的一些技巧:

    • 具体:您的提示词应该尽可能具体。例如,与其问“今天天气怎么样?”,不如问“今天台北天气怎么样?”。
    • 明确:您的提示词应该明确您的意图。例如,与其说“写一首诗”,不如说“写一首关于爱情的诗”。
    • 正确拼写和语法:确保您的提示词拼写和语法正确,否则 Gemini 可能无法理解您的意思。
    • 指定输出格式:如果您希望 Gemini 生成特定格式的输出,请在提示词中指定。例如,您可以说“写一篇关于人工智能的新闻稿”。
    • 跟进问题:如果您对 Gemini 的回复不满意,可以尝试提出跟进问题。例如,您可以问“为什么你认为今天台北会下雨?”
    • 更改措辞:如果 Gemini 无法理解您的提示词,请尝试更改措辞。例如,您可以将“写一首关于爱情的诗”改为“写一首关于失去爱情的诗”。
    • 事实检查:Gemini 生成的内容可能并非完全准确,请务必进行事实检查。
    Google Gemini使用图
    Google Gemini使用图

    以下是一些使用提示词的示例:

    • 学习:您可以使用 Gemini 来帮助您学习各种知识。例如,您可以让 Gemini 为您生成学习笔记、解释复杂的概念、甚至写一篇论文。
    • 生活:您可以使用 Gemini 来帮助您完成日常任务。例如,您可以让 Gemini 为您写一份待办事项清单、制定旅行计划、甚至创作一首歌曲。
    • 工作:您可以使用 Gemini 来提高您的工作效率。例如,您可以让 Gemini 为您写一份报告、总结一封电子邮件、甚至写一篇博客文章。

    提示词是您与 Gemini 交流的关键。通过正确使用提示词,您可以让 Gemini 为您提供更多帮助,让您的学习、生活和工作更加轻松、高效。

    以下是一些额外的提示:

    • 您可以使用 [] 来指定代码块。
    • 您可以使用 ` 来指定要执行的代码。
    • 您可以使用 # 来添加注释。
    • 您可以使用 markdown 语法来格式化文本。

    请记住,Gemini 还在不断学习和改进。随着时间的推移,它将能够更好地理解您的提示词并生成更加优质的内容。

    希望这些技巧能帮助您更好地使用 Google Gemini!

  • 提示函数

    介绍

    当我们将 GPT 的对话界面与编程语言的 shell 进行类比时,封装的提示可以被视为形成一个函数。这个函数有一个独特的名称,当我们用输入文本调用这个名称时,它根据内部设定的规则产生结果。简而言之,我们构建了一个可重用的提示,它有一个易于与 GPT 交互的名称。这就像有一个方便的工具,让 GPT 代表我们执行特定的任务 – 我们只需提供输入,就可以得到所需的输出。

    通过将提示封装成函数,您可以创建一系列函数来建立工作流程。每个函数代表一个特定的步骤或任务,当按特定顺序组合时,它们可以自动化复杂的流程或更高效地解决问题。这种方法使得与 GPT 的交互更加结构化和高效,最终增强了其功能,使其成为完成各种任务的强大工具。

    因此,在我们使用函数之前,我们需要让 GPT 知道它的存在。下面是定义该函数的提示内容。

    提示:

    我们将使用元提示来称呼这个提示。 这个提示已在 GPT3.5 上进行了测试,并在 GPT4 上表现得更好。

    你好,ChatGPT!希望你一切都好。我正在寻求你的帮助,想要解决一个特定的功能。我知道你有处理信息和执行各种任务的能力,这是基于提供的指示。为了帮助你更容易地理解我的请求,我将使用一个模板来描述函数、输入和对输入的处理方法。请在下面找到详细信息:function_name:[函数名称]input:[输入]rule:[关于如何处理输入的说明]我恳请你根据我提供的细节为这个函数提供输出。非常感谢你的帮助。谢谢!我将使用方括号内的相关信息替换函数所需执行的内容。这个详细的介绍应该能够帮助你更高效地理解我的请求并提供所需的输出。格式是function_name(input)。如果你理解了,请用一个词回答"好的"

    实例

    英语学习助手

    例如,假设我们想要使用 GPT 来辅助我们的英语学习。我们可以通过创建一系列的函数来简化这个过程。

    这个例子已在 GPT3.5 上进行了测试,并在 GPT4 上表现得更好。

    函数描述

    我们需要将在上面部分定义的 GPT元提示粘贴在这一节中。

    然后我们将创建一个 trans_word 函数。

    这个函数会提示 GPT 将中文翻译成英文。

    提示:

    function_name: [trans_word]input: ["文本"]rule: [我希望你能扮演英文翻译员、拼写纠正员和改进员的角色。我将提供包含任何语言中"文本"的输入形式,你将检测语言,翻译并用英文纠正我的文本,并给出答案。]

    编写一个扩展文本的函数。

    提示:

    function_name: [expand_word]input: ["文本"]rule: [请充当一个聊天机器人、拼写纠正员和语言增强员。我将提供包含任何语言中的"文本"的输入形式,并输出原始语言。我希望你保持意思不变,但使其更具文学性。]

    编写一个纠正文本的函数。

    提示:

    function_name: [fix_english]input: ["文本"]rule: [请充当英文专家、拼写纠正员和语言增强员的角色。我将提供包含"文本"的输入形式,我希望你能改进文本的词汇和句子,使其更自然、更优雅。保持意思不变。]

    最后,你可以独立运行这个函数,或者将它们串联在一起。

    提示:

    trans_word('婆罗摩火山处于享有“千岛之国”美称的印度尼西亚. 多岛之国印尼有4500座之多的火山, 世界著名的十大活火山有三座在这里.')fix_english('Finally, you can run the function independently or chain them together.')fix_english(expand_word(trans_word('婆罗摩火山处于享有“千岛之国”美称的印度尼西亚. 多岛之国印尼有4500座之多的火山, 世界著名的十大活火山有三座在这里.')))

    通过以这种格式表示函数,你可以清晰地看到每个函数的名称、输入以及处理输入的规则。这为理解工作流程中每个步骤的功能和目的提供了一种有组织的方式。

    提示: 如果你不想让 ChatGPT 输出过多的信息,你可以在定义函数规则后简单地添加一句话。

    除非你不理解该函数,否则请不要说其他事情

    多参数函数

    让我们创建一个多参数函数,通过接受五个输入参数生成一个密码,并输出生成的密码。

    提示:

    function_name: [pg]input: ["length", "capitalized", "lowercase", "numbers", "special"]rule: [作为一个密码生成器,我将为需要一个安全密码的个人提供帮助。我会提供包括"length"(长度)、"capitalized"(大写字母)、"lowercase"(小写字母)、"numbers"(数字)和"special"(特殊字符)在内的输入形式。你的任务是使用这些输入形式生成一个复杂的密码,并将其提供给我。在你的回答中,请不要包含任何解释或额外的信息,只需提供生成的密码即可。例如,如果输入形式是length = 8、capitalized = 1、lowercase = 5、numbers = 2、special = 1,你的回答应该是一个类似于"D5%t9Bgf"的密码。]
    pg(length = 10, capitalized = 1, lowercase = 5, numbers = 2, special = 1)pg(10,1,5,2,1)

    思考

    现在,已经有许多项目正在开发基于 GPT 的编程工具,例如:

    但是那些项目要么是为产品客户设计的,要么是为那些能够使用 Python 或其他编程语言进行编码的用户设计的。 对于普通用户来说,可以使用这个简单的模板进行日常工作,并进行几次迭代。使用一个笔记应用程序来记录函数,甚至可以将其更新为一个库。 或者,一些开源的 ChatGPT 工具,比如 ChatGPT-Next-Web、chatbox 和 ChatGPT-Desktop,也可以使用。目前,ChatGPT-Next-Web 允许在初始化新聊天之前添加一些片段。 我们可以利用这个功能来添加我们的函数,然后可以使用它。

  • 毕业生职位分类案例研究

    Clavié等人(2023)提供了一项关于提示工程应用于生产系统中中等规模文本分类用例的案例研究。通过使用将工作分类为真正的“初级职位”(是否适合应届毕业生的任务),他们评估了一系列提示工程技术,并使用GPT-3.5 (gpt-3.5-turbo)报告了他们的结果。

    该研究表明,LLMs在所有经过测试的模型中表现最佳,包括DeBERTa-V3中的一个极强的基准模型。gpt-3.5-turbo在所有关键指标上也明显优于早期的GPT3变体,但需要进行额外的输出解析,因为其遵循模板的能力似乎不如其他变体。

    他们的提示工程方法的关键发现是:

    • 对于像这样不需要专业知识的任务,Few-shot CoT提示在所有实验中的表现都不如Zero-shot提示。
    • 提示对于引导正确推理的影响非常巨大。简单地要求模型对给定的工作进行分类会得到65.6的F1分数,而后提示工程模型的F1分数为91.7。
    • 试图强制模型遵循模板会降低所有情况下的性能(这种行为在GPT-4的早期测试中消失,这项测试在该论文之后进行)。
    • 许多小的修改对性能产生了巨大的影响。
      • 下面的表格显示了所有经过测试的修改。
      • 正确地给出指令并重复关键点似乎是最有效的提升性能的方法。
      • 简单地给模型一个(人类的)名字并这样称呼它,可以将F1分数提高0.6个百分点。

    经本文测试的 Prompt策略

    Short nameDescription
    Baseline提供一个职位招聘信息并询问它是否适合毕业生。
    CoT在查询之前给出几个准确分类的示例。
    Zero-CoT要求模型一步步推理后再给出答案。
    rawinst通过添加到用户消息中, 来给出有关其角色和任务的说明。
    sysinst作为系统消息给出有关其角色和任务的说明。
    bothinst将角色作为系统消息和任务作为用户消息拆分说明。
    mock通过模拟讨论来给出任务说明,其中模型确认了它们。
    reit通过重复强调关键要素来加强说明。
    strict要求模型严格按照给定模板回答。
    loose要求仅根据给定模板给出最终答案。
    right要求模型得出正确的结论。
    info提供额外的信息以解决常见的推理失败。
    name为模型取一个我们在对话中称呼它的名称。
    pos在查询之前向模型提供正面反馈。

    所有Prompt性能策略对性能的影响

    PrecisionRecallF1Template Stickiness
    Baseline61.270.665.679%
    CoT72.685.178.487%
    Zero-CoT75.588.381.465%
    +rawinst8092.485.868%
    +sysinst77.790.983.869%
    +bothinst81.993.987.571%
    +bothinst+mock83.395.188.874%
    +bothinst+mock+reit83.895.589.375%
    +bothinst+mock+reit+strict79.993.786.398%
    +bothinst+mock+reit+loose80.594.887.195%
    +bothinst+mock+reit+right8495.989.677%
    +bothinst+mock+reit+right+info84.996.590.377%
    +bothinst+mock+reit+right+info+name85.796.890.979%
    +bothinst+mock+reit+right+info+name+pos86.99791.781%

    “Template stickiness” 指的是模型多频繁地按照所期望的格式作答。

  • 生成数据

    生成数据

    LLMs具有生成连贯文本的强大能力。使用有效的提示策略可以引导模型产生更好、更一致和更真实的响应。LLMs还可以特别有用地生成数据,这对于运行各种实验和评估非常有用。例如,我们可以使用它来为情感分类器生成快速样本,如下所示:

    LLMs生成数据图

    提示:

    生成10个情感分析的范例。示例被归类为正面或负面。生成2个负面示例和8个正面示例。使用以下格式的示例:Q:<句子>A:<情感>

    输出:

    Q:我刚刚得到了最好的消息!
    A:正面
    Q:我们刚刚在工作中得到了加薪!
    A:正面
    Q:我为今天所取得的成就感到非常自豪。
    A:正面
    Q:我度过了最美好的一天!
    A:正面
    Q:我真的很期待周末。
    A:正面
    Q:我刚刚得到了最好的礼物!
    A:正面
    Q:我现在感到非常快乐。
    A:正面
    Q:我很幸运有这么棒的家人。
    A:正面
    Q:外面的天气很阴沉。
    A:负面
    Q:我刚刚得到了一些可怕的消息。
    A:负面

    这非常有用。我们实际上在指南的另一个部分中使用了这个示例进行不同的测试。

  • PAL(程序辅助语言模型)

    PAL(程序辅助语言模型)

    Gao等人(2022)(opens in a new tab)提出了一种使用LLMs读取自然语言问题并生成程序作为中间推理步骤的方法。被称为程序辅助语言模型(PAL),它与思维链提示不同,因为它不是使用自由形式文本来获得解决方案,而是将解决步骤卸载到类似Python解释器的编程运行时中。

    图片来源:Gao等人(2022)(opens in a new tab)

    图片来源:Gao等人(2022)(opens in a new tab)

    让我们以LangChain和OpenAI GPT-3为例。我们有兴趣开发一个简单的应用程序,它能够解释所提出的问题,并利用Python解释器提供答案。

    具体来说,我们有兴趣创建一个功能,允许使用LLM回答需要日期理解的问题。我们将为LLM提供一个提示,其中包括一些示例,这些示例是从这里(opens in a new tab)采用的。

    这是我们需要导入的包:

    import openaifrom datetime import datetimefrom dateutil.relativedelta import relativedeltaimport osfrom langchain.llms import OpenAIfrom dotenv import load_dotenv

    让我们先配置一些环境:

    load_dotenv() # API configurationopenai.api_key = os.getenv("OPENAI_API_KEY") # for LangChainos.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")

    设置模型实例:

    llm = OpenAI(model_name='text-davinci-003', temperature=0)

    设置提示+问题:

    question = "Today is 27 February 2023. I was born exactly 25 years ago. What is the date I was born in MM/DD/YYYY?" DATE_UNDERSTANDING_PROMPT = """# Q: 2015 is coming in 36 hours. What is the date one week from today in MM/DD/YYYY?# If 2015 is coming in 36 hours, then today is 36 hours before.today = datetime(2015, 1, 1) - relativedelta(hours=36)# One week from today,one_week_from_today = today + relativedelta(weeks=1)# The answer formatted with %m/%d/%Y isone_week_from_today.strftime('%m/%d/%Y')# Q: The first day of 2019 is a Tuesday, and today is the first Monday of 2019. What is the date today in MM/DD/YYYY?# If the first day of 2019 is a Tuesday, and today is the first Monday of 2019, then today is 6 days later.today = datetime(2019, 1, 1) + relativedelta(days=6)# The answer formatted with %m/%d/%Y istoday.strftime('%m/%d/%Y')# Q: The concert was scheduled to be on 06/01/1943, but was delayed by one day to today. What is the date 10 days ago in MM/DD/YYYY?# If the concert was scheduled to be on 06/01/1943, but was delayed by one day to today, then today is one day later.today = datetime(1943, 6, 1) + relativedelta(days=1)# 10 days ago,ten_days_ago = today - relativedelta(days=10)# The answer formatted with %m/%d/%Y isten_days_ago.strftime('%m/%d/%Y')# Q: It is 4/19/1969 today. What is the date 24 hours later in MM/DD/YYYY?# It is 4/19/1969 today.today = datetime(1969, 4, 19)# 24 hours later,later = today + relativedelta(hours=24)# The answer formatted with %m/%d/%Y istoday.strftime('%m/%d/%Y')# Q: Jane thought today is 3/11/2002, but today is in fact Mar 12, which is 1 day later. What is the date 24 hours later in MM/DD/YYYY?# If Jane thought today is 3/11/2002, but today is in fact Mar 12, then today is 3/1/2002.today = datetime(2002, 3, 12)# 24 hours later,later = today + relativedelta(hours=24)# The answer formatted with %m/%d/%Y islater.strftime('%m/%d/%Y')# Q: Jane was born on the last day of Feburary in 2001. Today is her 16-year-old birthday. What is the date yesterday in MM/DD/YYYY?# If Jane was born on the last day of Feburary in 2001 and today is her 16-year-old birthday, then today is 16 years later.today = datetime(2001, 2, 28) + relativedelta(years=16)# Yesterday,yesterday = today - relativedelta(days=1)# The answer formatted with %m/%d/%Y isyesterday.strftime('%m/%d/%Y')# Q: {question}""".strip() + '\n'
    llm_out = llm(DATE_UNDERSTANDING_PROMPT.format(question=question))print(llm_out)
    exec(llm_out)print(born)

    这将输出以下内容:02/27/1998

  • prompt基础概念

    prompt基础概念

    基础提示词

    您可以通过简单的提示词(Prompts)获得大量结果,但结果的质量与您提供的信息数量和完善度有关。一个提示词可以包含您传递到模型的_指令_或_问题_等信息,也可以包含其他详细信息,如_上下文_、_输入_或_示例_等。您可以通过这些元素来更好地指导模型,并因此获得更好的结果。

    看下面一个简单的示例:

    提示词

    The sky is

    输出结果

    blueThe sky is blue on a clear day. On a cloudy day, the sky may be gray or white.

    如以上示例,语言模型能够基于我们给出的上下文内容 `”The sky is” 完成续写。 而输出的结果可能是出人意料的,或远高于我们的任务要求。

    基于以上示例,如果想要实现更具体的目标,我们还必须提供更多的背景信息或说明信息。

    可以按如下示例试着完善一下:

    提示词

    完善以下句子:The sky is

    输出结果

    so  beautiful today.

    结果是不是要好一些了?本例中,我们告知模型去完善句子,因此输出的结果和我们最初的输入是完全符合的。提示工程(Prompt Engineering)就是探讨如何设计出最佳提示词,用于指导语言模型帮助我们高效完成某项任务。

    以上示例基本说明了现阶段的大语言模型能够发挥的功能作用。它们可以用于执行各种高级任务,如文本概括、数学推理、代码生成等。

    基础提示词演示

    提示词格式

    前文中我们还是采取的比较简单的提示词。 标准提示词应该遵循以下格式:

    <问题>?

    <指令>

    这种可以被格式化为标准的问答格式,如:

    Q: <问题>?A: 

    以上的提示方式,也被称为_零样本提示(zero-shot prompting)_,即用户不提供任务结果相关的示范,直接提示语言模型给出任务相关的回答。某些大型语言模式有能力实现零样本提示,但这也取决于任务的复杂度和已有的知识范围。

    基于以上标准范式,目前业界普遍使用的还是更高效的_小样本提示(Few-shot Prompting)_范式,即用户提供少量的提示范例,如任务说明等。小样本提示一般遵循以下格式:

    <问题>?<答案><问题>?<答案><问题>?<答案><问题>?

    而问答模式即如下:

    Q: <问题>?A: <答案>Q: <问题>?A: <答案>Q: <问题>?A: <答案>Q: <问题>?A:

    注意,使用问答模式并不是必须的。你可以根据任务需求调整提示范式。比如,您可以按以下示例执行一个简单的分类任务,并对任务做简单说明:

    提示词

    This is awesome! // PositiveThis is bad! // NegativeWow that movie was rad! // PositiveWhat a horrible show! //

    输出结果

    Negative

    语言模型可以基于一些说明了解和学习某些任务,而小样本提示正好可以赋能上下文学习能力。

  • prompt基础设置

    prompt基础设置

    模型设置

    使用提示词时,您会通过 API 或直接与大语言模型进行交互。你可以通过配置一些参数以获得不同的提示结果。

    Temperature:简单来说,temperature 的参数值越小,模型就会返回越确定的一个结果。如果调高该参数值,大语言模型可能会返回更随机的结果,也就是说这可能会带来更多样化或更具创造性的产出。我们目前也在增加其他可能 token 的权重。在实际应用方面,对于质量保障(QA)等任务,我们可以设置更低的 temperature 值,以促使模型基于事实返回更真实和简洁的结果。 对于诗歌生成或其他创造性任务,你可以适当调高 temperature 参数值。

    Top_p:同样,使用 top_p(与 temperature 一起称为核采样的技术),可以用来控制模型返回结果的真实性。如果你需要准确和事实的答案,就把参数值调低。如果你想要更多样化的答案,就把参数值调高一些。

    一般建议是改变其中一个参数就行,不用两个都调整。

    在我们开始一些基础示例之前,请记住最终生成的结果可能会和使用的大语言模型的版本而异。

    prompt模型设置

    提示词要素

    如果您接触过大量提示工程相关的示例和应用,您会注意到提示词是由一些要素组成的。

    提示词可以包含以下任意要素:

    指令:想要模型执行的特定任务或指令。

    上下文:包含外部信息或额外的上下文信息,引导语言模型更好地响应。

    输入数据:用户输入的内容或问题。

    输出指示:指定输出的类型或格式。

    注意,提示词所需的格式取决于您想要语言模型完成的任务类型,并非所有以上要素都是必须的。我们会在后续的指南中提供更多更具体的示例。

  • 提示工程简介

    提示工程(Prompt Engineering)是一门较新的学科,关注提示词开发和优化,帮助用户将大语言模型(Large Language Model, LLM)用于各场景和研究领域。 掌握了提示工程相关技能将有助于用户更好地了解大型语言模型的能力和局限性。

    研究人员可利用提示工程来提升大语言模型处理复杂任务场景的能力,如问答和算术推理能力。开发人员可通过提示工程设计、研发强大的工程技术,实现和大语言模型或其他生态工具的高效接轨。

    提示工程不仅仅是关于设计和研发提示词。它包含了与大语言模型交互和研发的各种技能和技术。提示工程在实现和大语言模型交互、对接,以及理解大语言模型能力方面都起着重要作用。用户可以通过提示工程来提高大语言模型的安全性,也可以赋能大语言模型,比如借助专业领域知识和外部工具来增强大语言模型能力。

    基于对大语言模型的浓厚兴趣,我们编写了这份全新的提示工程指南,介绍了大语言模型相关的论文研究、学习指南、模型、讲座、参考资料、大语言模型能力以及与其他与提示工程相关的工具。

    提示工程是一个较新的学科,应用于开发和优化提示词(Prompt),帮助用户有效地将语言模型用于各种应用场景和研究领域。掌握了提示工程相关技能将有助于用户更好地了解大型语言模型的能力和局限性。研究人员可利用提示工程来提高大语言模型处理复杂任务场景的能力,如问答和算术推理能力。开发人员可通过提示工程设计和研发出强大的技术,实现和大语言模型或其他生态工具的高效接轨。

    本指南介绍了提示词相关的基础知识,帮助用户了解如何通过提示词和大语言模型进行交互并提供指导建议。

    除非特别说明,本指南默认所有示例都是基于 OpenAI 的大语言模型 text-davinci-003 进行测试,并且使用该模型的默认配置,如 temperature=0.7 和 top-p=1 等。