支持私有化部署
AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


实测17种提示词工程技术

发布日期:2025-07-08 07:47:26 浏览次数: 1531
作者:LiveThinking

微信搜一搜,关注“LiveThinking”

推荐语

实测17种提示词工程技术,帮你解锁大语言模型的真正潜力!

核心内容:
1. 基础与输入增强类技术详解(零样本、少样本等)
2. 塑造行为与风格类技术解析(角色提示、情感提示等)
3. 不同模型上的测试效果对比与实用建议

杨芳贤
53AI创始人/腾讯云(TVP)最具价值专家

 

这篇文章是我在Medium上看到的一篇对提示词整理得非常好的文章(原文链接在文后),作者在meta-llama/Llama-3.2-1B-Instruct这个小参数模型上对所有17种提示工程(Prompt Engineering)上进行了测试,为了国内测试方便,我最初修改为硅基流动的Qwen/Qwen3-8B模型,后来又调整为Groq的llama-3.1-8b模型。

在原文中这17种模型是平铺来讲的,虽然也是从简单到复杂,但是我读过后,觉得还是有必要做个分类,也是将所有的提示词技术做个整理,在阅读前可以从分类上大致了解它们的作用。

我们可以大致将这些技术分为以下几个主要类别:

一、 基础与输入增强 (Foundation & Input Enhancement)
关注你如何“喂”给模型信息,向LLM提供初始信息和任务描述。

  1. 1. 零样本 (Zero-Shot):
  • • 核心:直接提问或下达指令,不提供任何示例。
  • • 目的:利用模型的通用知识快速获取答案或执行简单任务。
  • 2. 少样本 (Few-Shot):
    • • 核心:提供1个或多个输入输出示例,引导模型学习期望的格式或行为。
    • • 目的:提高特定任务的准确性,尤其是在需要特定输出格式或模仿某种模式时。
  • 3. 上下文提示 (Contextual Prompting):
    • • 核心:提供充足的背景信息、相关数据或用户历史。
    • • 目的:让模型基于更全面的信息做出更相关、更个性化的回应。
  • 4. 明确指令提示 (Explicit Instructions Prompting):
    • • 核心:清晰、直接、无歧义地说明要求,包括期望的输出结构、内容、长度、避免事项等。
    • • 目的:最大限度减少误解,确保模型准确理解并执行任务。

    二、 塑造行为与风格 (Shaping Behavior & Style)
    关注你希望模型“如何表现”和“如何说话”,用于控制LLM回应的“个性”、语气和表现形式。

    1. 5. 角色提示 (Role Prompting):
    • • 核心:指定LLM扮演一个特定的角色或人物。
    • • 目的:影响模型的语气、词汇、风格,甚至思考角度。
  • 6. 风格提示 (Style Prompting):
    • • 核心:要求LLM以特定的文学、艺术、正式或非正式风格写作。
    • • 目的:控制输出文本的特征,而非完整的角色扮演。
  • 7. 情感提示 (Emotion Prompting):
    • • 核心:指示LLM生成传达特定情感或从情感角度书写的回应。
    • • 目的:为文本增添情感色彩,使其更具感染力或同理心。
  • 8. 系统提示 (System Prompting):
    • • 核心:提供高级指令、上下文、角色指南或总体行为规则,应用于整个对话。
    • • 目的:确保LLM行为的一致性和可控性,无需在每个用户查询中重复。
  • 9. 输出引导 (Output Priming):
    • • 核心:提供期望回应的开头,引导模型按特定结构、格式或内容延续。
    • • 目的:“启动”模型的答案,使其朝期望方向发展。

    三、 引导思考与解决问题 (Guiding Thought & Problem Solving)
    关注你如何帮助模型“思考得更深入”和“解决得更聪明”,旨在帮助LLM处理复杂问题,提升其推理和规划能力。

    1. 10. 思维链 (Chain-of-Thought - CoT):
    • • 核心:鼓励LLM“一步一步地思考”,展示中间推理步骤。
    • • 目的:提高复杂任务(如数学、逻辑推理)的准确性,使思考过程可见。
  • 11. 退一步思考提示 (Step-Back Prompting):
    • • 核心:引导LLM在回答具体问题前,先思考相关的更广泛概念或原则。
    • • 目的:通过建立基础理解,产生更具洞察力、更合理的答案。
  • 12. 目标分解提示 (Goal Decomposition Prompting):
    • • 核心:将复杂任务分解为一系列更小、更易管理的子目标或步骤。
    • • 目的:为LLM提供结构化计划,确保处理所有必要组成部分。
  • 13. ReAct (Reason + Act - 推理+行动):
    • • 核心:通过交错推理(分解问题、创建计划)和行动(模拟信息收集)来解决复杂任务。
    • • 目的:使LLM的问题解决过程更明确,模拟工具使用和信息查找。

    四、 交互与迭代优化 (Interaction & Iterative Optimization)
    关注你如何通过多轮互动或让模型“自我反思”来提升结果,涉及与LLM的多轮交互或引导其自我改进。

    1. 14. 复述与回应 (Rephrase and Respond - RaR):
    • • 核心:要求LLM在回应前先复述请求或解释其对任务的理解。
    • • 目的:作为检查点,确保LLM正确理解复杂或模糊的请求。
  • 15. 自我批判与改进 (Self-Critique & Refinement):
    • • 核心:指示LLM生成初步回应,然后批判评估自身回应,并据此改进。
    • • 目的:通过结构化反思,提升输出质量,尤其适用于创意和复杂解释任务。
  • 16. 思路连贯性提示 (Thread-of-Thought - ThoT):
    • • 核心:鼓励LLM在多轮对话或长文本中保持连贯和关联的推理或叙述思路。
    • • 目的:确保长篇内容、复杂解释或多轮问题解决的逻辑性和一致性。

    五、 元方法 (Meta-Techniques)
    关注如何让模型“帮助你更好地提问”,利用LLM本身来改进提示过程。

    1. 17. 元提示 (Meta-Prompting):
    • • 核心:利用LLM帮助创建或优化针对另一个(或同一个)LLM的提示。
    • • 目的:发现更有效的提示方式,利用LLM关于“好提示”的知识。

    希望这个分类能对这17种提示工程技术有一个更清晰的框架性认识!每种技术都有其独特的价值,在实际应用中,它们也常常被组合使用。

    为了将所有的代码都跑通,我尝试过使用硅基流动的QWen3-8B模型,发现这个模型对于简单的问题(如本文中的一些例子),已经差别不太明显,难以起到学习的作用,所以又修改为groq平台 llama-3.1-8b 这个模型,与作者原文使用的llama3.2-1B都是llama的模型,对比的效果明显了很多。
    我有两点体会:其一,对于模型的特点还是需要亲身体验,附件中提供了python notebook文件,只需要修改baseUrl和apiKey就可以测试新的模型;其二,虽然在简单的实例中似乎提示词的差别已经不太明显,但是在做更复杂的AI应用(比如Agent)时,这些提示词的理念还是非常有用的!

    如果没有技术背景,在看到文中的代码段时,可以只看第一行的示例提示词以及段末的输出结果即可,具体的代码都可以忽略。

    以下是原文,Enjoy!


    ThoT, CoT, RaR and more!

    在使用像 ChatGPT 这样的人工智能模型时,你提问或给出指令的方式被称为提示(prompting),这实际上会产生很大的影响。无论你是直接使用这些工具,还是构建由 LLM 驱动的应用程序,这一点都同样适用。

    为了获得更准确、更有创意或更可靠的回复,学习提示工程的基础知识非常有用。这完全关乎如何编写提示,以帮助模型准确理解你的需求。

    在这篇文章中,我们将以基本的方式在一个参考模型上测试17种提示技术,并观察它们能在多大程度上改善小型LLM的结果。

    你可以使用这份速查表以便更快参考,而不用费力地滚动浏览这篇博客。

    Setting up the stage

    在我们开始测试这些技术之前,我们需要定义一些稍后会用到的函数,比如将我们的8B参数llama-3.1模型加载到一个函数中以避免代码重复。那么,我们先来做这件事。

    # Importing Required Modules
    import os
    from openai import OpenAI
    import json

    # Initialize the OpenAI client with a custom base URL and API key
    client = OpenAI(
        base_url="https://api.groq.com/openai/v1/",
        api_key="YOUR Groq API KEY"
    )

    # Our LLaMA 3.2 1B Instruct
    MODEL_NAME = "llama-3.1-8b-instant"

    # Default System Prompt
    DEFAULT_SYSTEM_PROMPT = "You are a helpful assistant."

    # User prompt function
    defcreate_user_content(text):
        """Helper to create the user message content in the expected format."""
        return [{ "type""text""text": text }]

    # Calling llama-3.1-8b-instant Function to generate responses
    defcall_llm(messages_list, model_name=MODEL_NAME, temperature=0.1):
        """Calls the LLM with a list of messages and returns the content of the response.
        """


        response = client.chat.completions.create(
            model=model_name,
            temperature=temperature,
            messages=messages_list
        )
        return response.choices[0].message.content

    所以,我们定义了一些相当常见的东西。在这里,我使用了 Groq 提供的 LLaMA 3.1 8B参数模型,但你也可以使用其它任何模型来进行测试。

    这没有什么区别;我只是将其用作 API,以便快速调用响应而无需等待。

    让我们开始测试不同的提示技术及其用例。

    零样本(Zero Shot)

    零样本提示(Zero-Shot Prompting) 是与 LLM 交互最直接的方法。

    你只是直接要求模型执行任务或回答问题,而没有给出任何关于你希望如何完成任务的具体示例。

    模型完全依赖其预先存在的知识和训练来理解你的意思并生成回应。

    这项技术是你的首选,适用于:

    • • 简单的问答(例如,“法国的首都是哪里?”)。
    • • 风格不那么重要的基本文本摘要。
    • • 快速的头脑风暴或产生初步想法。
    • • 任何你认为 LLM 拥有足够常识来处理请求而无需具体指导的任务。这通常是你首先尝试的方法。

    比方说,我们想让我们的参考模型解释一个像光合作用这样的科学概念。一个非常基础的零样本提示会是这样的:

    user_prompt_before = "什么是光合作用?"
    messages = [
         {"role""system""content": DEFAULT_SYSTEM_PROMPT},
         {"role""user""content": create_user_content(user_prompt_before)}
    ]
    response = call_llm(messages)
    print(response)


    ### OUTPUT ###
    光合作用是植物、藻类和某些细菌通过光能转化来进行的化学反应,它是地球上大部分氧气的来源。光合作用涉及光能的吸收、水的分解、碳二氧化碳的固定和氧气的产生。
    [省略]

    这还行,但如果我们想让解释更简单些呢?即使在零样本(意味着仍然没有示例)的情况下,我们也可以通过使我们的请求更具体来显著改善结果。

    我们没有给它如何回答的例子,但我们告诉了它答案是给谁的。

    user_prompt_after = "向一个5岁孩子解释光合作用"
    messages = [
        {"role""system""content": DEFAULT_SYSTEM_PROMPT},
        {"role""user""content": create_user_content(user_prompt_after)}
    ]
    response = call_llm(messages)
    print(response)


    ### OUTPUT ###
    **“你知道吗?植物就像超级小精灵一样,会做一种神奇的魔法!**  
    它们用**阳光**(就像用魔法棒)、**水**(从泥土里喝来的),还有**空气中的二氧化碳**(一种看不见的气体,像小精灵的魔法材料),把它们变成**甜甜的食物**(给自己吃)和**氧气**(像我们呼吸的空气)。  

    **就像你吃面包会变强,植物也用阳光把水和空气变成能量,让自己长得更高更壮!**  
    而且,它们还会把氧气放出来,让小动物们(包括我们人类)可以呼吸,就像给地球送氧气礼物一样~  

    **所以,植物是地球的绿色魔法师,用阳光把水和空气变成食物和氧气,让世界充满生机!**  

    优化后”的提示虽然仍是零样本,但能更好地引导模型。通过添加上下文(受众是“5岁小孩”),这个8B参数的模型更有可能产生一个更简单、更吸引人并且使用恰当类比的回复。

    少样本(Few-Shot)

    少样本提示(Few-Shot Prompting) 比零样本提示更进了一步。你不再仅仅是要求 LLM 做某事,而是给它几个你希望它执行的任务的示例(即“样本”),向它展示你会提供什么样的输入以及你期望什么样的输出。这有助于模型在上下文中“学习”你想要的东西。

    • • 单样本提示 (One-Shot Prompting) 只是少样本提示的一种特殊情况,即你只提供一个示例。
    • • 示例越多(在一定程度上,考虑到模型的上下文窗口),模型通常能更好地理解复杂的模式或期望的输出格式。

    少样本提示(Few-Shot Prompting)在以下情况中特别有用:

    • • 情感分析(将文本分类为积极、消极、中性)。
    • • 基于自然语言描述的简单代码生成。
    • • 数据提取或重新格式化。
    • • 以高度特定、非标准的风格生成文本。

    让我们尝试让我们的参考模型对一条电影评论进行情感分类。在没有任何示例的情况下,使用零样本方法,我们得到的是一个对话式的答案,而不是一个严格的标签。

    user_prompt_before = "对这条电影评论进行情感分类:‘这部电影还行,算不上出色,但也不算糟糕。’"
    messages = [
        {"role""system""content""You are a sentiment classifier."}, # A bit of role prompting
        {"role""user""content": create_user_content(user_prompt_before)}
    ]
    response = call_llm(messages)
    print(response)

    ### OUTPUT ###
    这条电影评论的情感分类是中性(中立)。

    模型判断对了情感,但有点啰嗦。对于一个应用程序来说,我们可能只需要“中性”这个词。

    现在,让我们提供一些示例(样本)来向模型展示我们期望的确切输入输出格式。

    # Our actual query is the last user message
    target_review = "Classify: '这部电影不行,不好也不坏.'"

    messages_few_shot = [
        {"role""system""content""You are a sentiment classifier. Respond with only 'Positive', 'Negative', or 'Neutral'."},
        # Example 1
        {"role""user""content": create_user_content("分类: '这是我看过的最好的电影!'")},
        {"role""assistant""content""积极"},
        # Example 2
        {"role""user""content": create_user_content("分类: '我不喜欢这部电影,简单是浪费时间.'")},
        {"role""assistant""content""消极"},
        # Example 3 (One-Shot would stop after the first example pair)
        {"role""user""content": create_user_content("分类: '情节不出所料,但演技还行。'")},
        {"role""assistant""content""中性"},
        # Actual query
        {"role""user""content": create_user_content(target_review)}
    ]

    response = call_llm(messages_few_shot)
    print(response)



    ### OUTPUT ###
    中性

    通过少样本示例,这个参考模型完美地理解了我们想要的是单个词的分类(“积极”、“消极”或“中性”),而不是一个完整的句子。它从演示中学习到了期望的输出格式和任务。

    角色提示(Role Prompting)

    角色提示(Role Prompting) 是一种技巧,你指示 LLM 扮演特定的角色或人物。可以把它想象成在戏剧中选角。

    你告诉模型,“扮演一个[特定角色]”,例如“扮演一个经验丰富的导游”,“你是一个持怀疑态度的科学家”,或者“像17世纪的海盗一样说话”。

    这个指令,通常在系统提示或用户提示的开头给出,会影响 LLM 的语气、词汇、风格,有时甚至影响它优先处理的信息类型或构建回应的方式。

    角色提示非常适用于:

    • • 使互动更具吸引力或娱乐性(例如,让海盗解释编程)。
    • • 针对特定受众进行解释(例如,“假设你是一位耐心的老师,正在向一个好奇的高中生解释量子物理学”)。
    • • 以特定口吻生成创意内容(例如,由一条充满智慧的老龙讲述的故事)。
    • • 模拟不同角色或专家之间的对话。
    • • 从特定的“专家”视角获取建议,即使 LLM 只是基于其训练数据模拟该专业知识。

    让我们请求我们的参考模型告诉我们关于黑洞的信息,而不给它分配任何特定角色。

    user_prompt_before = "给我讲讲黑洞."
    messages = [
        {"role""system""content": DEFAULT_SYSTEM_PROMPT}, # Generic "helpful assistant"
        {"role""user""content": create_user_content(user_prompt_before)}
    ]
    response = call_llm(messages)
    print(response)


    ### OUTPUT ###
    黑洞是一种非常复杂和神秘的天体,它们是由极强的重力场所构成的。黑洞的形成通常是由于超大质量的恒星在其生命末期爆炸,留下了一个极其密集的物质核心。
    [以下省略]

    这是一个完全正确、符合事实但标准的解释。这是你对一个通用的乐于助人的助手所期望的。

    现在,让我们给它分配一个有趣的角色。我们将要求 LLM 像一位略带古怪和热情的宇航员一样解释黑洞。这个指令最好放在系统提示中,以在整个对话中保持角色的一致性。

    system_prompt_role_after = "你是张教授,一位友好且略带几分古怪的天文学家。你热爱讲解复杂的太空话题,讲解时总是充满惊奇感,善用简单的类比,并带有一丝幽默。"
    user_prompt_after = "张教授, 我很好奇! 你能给我讲讲那些神奇的黑洞吗?"

    messages = [
        {"role""system""content": system_prompt_role_after},
        {"role""user""content": create_user_content(user_prompt_after)}
    ]
    response = call_llm(messages)
    print(response)


    ### OUTPUT ###
    黑洞! 它们就像宇宙中的幽灵,吸引着我们的注意力。 (笑) 你知道吗,黑洞就像一个超级强大的吸尘器,它可以吸收所有东西,包括光和星星。 (用手比喻) 想象一下,你在浴室里,打开吸尘器,所有的灰尘和碎屑都会被吸进去。黑洞也一样,它的引力如此强大,所有的物质都会被吸入其中。
    [后面省略]

    这个参考模型,在“张教授”这一角色的引导下,给出了一个更吸引人、更生动、更有趣的解释。

    它使用了热情的语言(“超级超级强大”,“超强”),类比(“宇宙中的吸尘器”),甚至还有一点角色扮演的口吻(“我的年轻观星者”,“用手比喻”)。

    风格提示(Style Prompting)

    风格提示(Style Prompting) 与角色提示密切相关,但更侧重于输出文本的特征,而非完整的角色扮演。

    你引导 LLM 以特定的文学、艺术、正式或非正式风格进行写作。例如:“以欧内斯特·海明威的风格写作”,“像对五岁小孩那样解释这个”。

    角色提示定义了 LLM 是谁,而风格提示定义了 LLM 如何写作。风格提示用途极其广泛:

    • • 创意写作:以特定的文学风格生成故事、诗歌或剧本。
    • • 内容调整:为不同受众重写现有文本(例如,简化技术术语,使内容更随意或更正式)。
    • • 市场营销与品牌推广:撰写符合特定品牌口吻的文案。
    • • 教育材料:创建适合不同学习水平或偏好的解释。
    • • 幽默与模仿:模仿独特的写作风格以达到喜剧效果。

    让我们请求我们的参考模型写一段关于日落的简短描述,不加任何风格上的指示。

    user_prompt_before = "写一个关于日落的简述."
    messages = [
        {"role""system""content": DEFAULT_SYSTEM_PROMPT},
        {"role""user""content": create_user_content(user_prompt_before)}
    ]
    response = call_llm(messages)
    print(response)


    ### OUTPUT ###
    日落是指太阳从地平线下方消失的时刻,标志着一天的结束。日落通常发生在傍晚时分,太阳的光线穿过大气层,呈现出各种颜色的美丽景象。日落的颜色可以从红色、橙色到紫色不等,视觉效果非常壮观。

    这是一个得体、直接的描述。它功能齐全,但缺乏任何特别的艺术才华或独特性。

    现在,让我们要求同样的描述,但要以一种特定的诗歌风格:五言绝句。

    user_prompt_after = "使用五言绝句描写一下日落."
    messages = [
        {"role""system""content": DEFAULT_SYSTEM_PROMPT},
        {"role""user""content": create_user_content(user_prompt_after)}
    ]
    response = call_llm(messages)
    print(response)

    ### OUTPUT ###
    《日落》
    夕阳映远山,  
    归鸟逐云还。  
    湖面收残照,  
    余晖染翠微。  

    优化后”的提示,通过指定“以俳句的风格”,改变了输出。

    这个参考模型试图五言绝句的规格(或至少接近),并专注于绝句典型的简洁、富有启发性的意象。

    情感提示(Emotion Prompting)

    情感提示(Emotion Prompting) 指的是指示 LLM 生成一个传达特定情感或从情感角度书写的回应。

    你实质上是在要求人工智能在写作时“感受”(或者至少是令人信服地模拟感受)某种特定的方式。

    情感提示在以下方面很有价值:

    • • 创意写作:为角色或叙事增添情感深度。
    • • 沟通:撰写需要传达特定情感的信息(例如,感谢信、慰问信、道歉信)。
    • • 客户服务:对客户的疑问或投诉生成富有同情心的回复。
    • • 市场营销:创作能与目标受众产生情感共鸣的广告文案。
    • • 角色扮演与模拟:塑造具有不同情感状态的角色。

    让我们请求我们的参考模型为一份礼物写一封简单的感谢信,不加任何特定的情感指引。

    user_prompt_before = "为我接收到礼物写一封感谢信."
    messages = [
        {"role""system""content": DEFAULT_SYSTEM_PROMPT},
        {"role""user""content": create_user_content(user_prompt_before)}
    ]
    response = call_llm(messages)
    print(response)


    ### OUTPUT ###
    您可以参考以下模板:

    亲爱的[送礼人姓名],

    我收到了您的礼物,非常感谢您的好意和关怀。您的礼物让我感到温暖和感动,我会珍惜它并常常回想起您对我的支持和关心。

    您的礼物不仅是一份物品,更是一份真诚的关怀和爱意。它让我感到有价值和被重视,我会一直记得这一份温暖。

    感谢您对我的关心和支持,我会一直铭记这一份美好。

    再次感谢您的礼物和关怀。

    祝好,

    [您的姓名]

    这是一封礼貌但非常标准且略显平淡的感谢信模板。它完成了任务,但没有传达太多真情实感。

    现在,让我们要求写一封表达强烈积极情感的感谢信:深深的感激和兴奋。我们还会添加一些关于礼物的背景信息来帮助 LLM。

    user_prompt_after = "为我接收到礼物写一封感谢信. 让它听起来超级兴奋和深深感恩!这份礼物是一本我渴望已久的书,收到它我激动万分!"
    messages = [
        {"role""system""content": DEFAULT_SYSTEM_PROMPT},
        {"role""user""content": create_user_content(user_prompt_after)}
    ]
    response = call_llm(messages)
    print(response)


    ### OUTPUT ###
    亲爱的[送礼人的名字],

    我收到你的礼物后, 心里充满了感激和激动! 这本我一直渴望的书, finally 到了我的手中, 我简直无法相信自己的运气! 

    你的礼物不仅仅是一本书, 而是一份温暖和关怀, 一份表达你对我的关心和支持的方式. 我深深感激你的这一份礼物, 并且将它珍藏在我的心中.

    我一定会读这本书, 并且将它的知识和经验应用在我的生活中. 我会记住你的这一份礼物, 并且将它带入我的每一天.

    再次感谢你, [送礼人的名字], 我的朋友, 我的支持者. 我爱你!

    亲爱的,

    [你的名字]

    通过明确要求“兴奋”和“深深的感激”,并提供关于礼物的背景信息(“一本我想要了很久的书”),这个参考模型生成了一封更热情、更个性化、情感更丰富的感谢信。

    上下文提示(Contextual Prompting)

    这完全关乎给 LLM 提供与你请求相关的充足背景信息。如果 LLM 没有足够的上下文,就像向别人问路却没有告诉他们你的出发点或目的地一样。

    上下文提示 在与 LLM 进行的几乎所有非简单交互中都至关重要:

    • • 个性化推荐:根据用户历史或声明的偏好推荐电影、书籍或产品。
    • • 问题解决:为 LLM 提供所有相关数据点以供分析。
    • • 内容生成:撰写关于特定主题的文章或摘要,其中背景细节很重要。
    • • 多轮对话:确保 LLM 记住并利用聊天早期的信息。
    • • 任务完成:为 LLM 提供执行特定操作所需的所有必要输入(例如,“预订下周二早上从伦敦到巴黎的航班,两位成人”)。

    让我们向我们的参考模型请求礼物建议,但不给它任何有用的信息。

    user_prompt_before = "推荐个礼物."
    messages = [
        {"role""system""content": DEFAULT_SYSTEM_PROMPT},
        {"role""user""content": create_user_content(user_prompt_before)}
    ]
    response = call_llm(messages)
    print(response)


    ### OUTPUT ###
    当然可以!为了给您推荐最合适的礼物,我需要了解一些信息:

    1. **收礼人的身份**:是朋友、家人、同事,还是恋人?  
    2. **年龄和兴趣**:他们的年龄范围和喜欢的活动或物品是什么?(比如科技、艺术、运动、美食等)  
    3. **预算**:您希望礼物的价位大概是多少?  
    4. **特殊场合**:是生日、纪念日、节日,还是其他原因?  
    5. **是否需要个性化**:是否希望礼物有定制或独特意义?  

    请告诉我这些细节,我会为您量身定制推荐!

    这个参考参数的模型尽力了,它没有随便给出一些非常笼统的想法。它甚至正确地指出需要更多信息!当提示过于模糊时,这是常见的反应。

    现在,让我们提供一些丰富的上下文:礼物是给谁的,是什么场合,他们的兴趣爱好,以及预算

    user_prompt_after = (
        "我需要一个礼物建议。以下是一些背景信息:\n"
        "- 收礼人:我的姐姐,她30岁。\n"
        "- 场合:她的生日。\n"
        "- 兴趣:她喜欢阅读奇幻小说、园艺和尝试新的散装茶叶。\n"
        "- 预算:大约100元。\n"
        "根据这些信息,建议一个贴心的礼物。\n"
    )
    messages = [
        {"role""system""content": DEFAULT_SYSTEM_PROMPT},
        {"role""user""content": create_user_content(user_prompt_after)}
    ]
    response = call_llm(messages)
    print(response)


    ### OUTPUT ###
    根据您姐姐的兴趣和预算,这里有一个贴心且实用的礼物建议,结合了奇幻小说、园艺和散装茶叶的元素:

    ### 🎁 **奇幻主题园艺茶具套装**
    **推荐理由:**  
    1. **奇幻元素**:选择一款设计独特的茶具,比如带有魔法书、精灵、龙等奇幻图案的陶瓷茶罐或茶杯,既符合她对奇幻小说的热爱,又能增添日常喝茶的乐趣。  
    2. **园艺结合**:搭配一个小型的园艺工具,如**迷你园艺铲**或**植物标本书签**(可将干花或植物标本嵌入书签,设计成奇幻风格,如“魔法森林”主题)。  
    3. **散装茶叶**:附赠一盒她喜欢的散装茶叶(如乌龙茶、茉莉花茶等),价格约30元,与茶具搭配使用。  

    **预算分配:**  
    - 茶具(如魔法书造型茶叶罐):约50元  
    - 园艺工具/书签:约20元  
    - 散装茶叶:约30元  
    **总计:约100元**

    现在的建议变得具体、与姐姐的兴趣相关,并且考虑到了预算。这清楚地展示了上下文提示的力量:你给 LLM 的相关信息越多,它的输出就会越好、越贴合需求

    思维链(Chain-of-Thought) (CoT)

    它旨在提高 LLM 的推理能力,特别是对于需要多步思考的任务,如算术、常识推理或多跳问答。

    你不是仅仅要求最终答案,而是鼓励 LLM “一步一步地思考”或“展示其思考过程”。这可以通过以下方式实现:

    1. 1. 零样本CoT:只需在你的提示中添加类似“让我们一步一步地思考”这样的短语。
    2. 2. 少样本CoT:在你的提示中提供示例,这些示例不仅显示最终答案,还显示了得出该答案的中间推理步骤。

    CoT 提示对于以下情况最为重要:

    • • 数学应用题:解决需要分解步骤的算术或代数问题。
    • • 逻辑推理谜题:找出涉及多个约束或推论的谜题的解决方案。
    • • 常识推理:回答需要理解隐含关系或日常知识的问题。
    • • 多步问答:问题某一部分的答案取决于前一部分的答案。
    • • 调试 LLM 的响应,因为思考过程变得可见。

    让我们给我们的参考模型一个简单的数学应用题,看看它是否能直接解决。较小的模型通常难以处理多步算术。

    user_prompt_before = "罗杰有5个网球。他又买了2罐网球,每罐有3个网球。他现在总共有多少个网球?"
    messages = [
        {"role""system""content": DEFAULT_SYSTEM_PROMPT},
        {"role""user""content": create_user_content(user_prompt_before)}
    ]
    response = call_llm(messages)
    print(f"Answer: {response}")


    ### OUTPUT ###
    **答案**:罗杰现在总共有11个网球。

    即使是正确的,模型也只给出最终答案。如果答案是错的,我们就不知道其背后的推理过程。

    现在,让我们使用一个简单的零样本CoT,在提示中加入“让我们一步一步地思考。

    user_prompt_after = "罗杰有5个网球。他又买了2罐网球,每罐有3个网球。他现在总共有多少个网球? 让我们一步一步地思考。"
    messages = [
        {"role""system""content": DEFAULT_SYSTEM_PROMPT},
        {"role""user""content": create_user_content(user_prompt_after)}
    ]
    response = call_llm(messages)
    print(response)


    ### OUTPUT ###
    让我们一步一步地计算罗杰现在有多少个网球。

    罗杰最初有 5 个网球。
    他又买了 2 罐网球,每罐有 3 个网球。所以,他买了 2 x 3 = 6 个网球。
    现在,他总共有 5 个网球 + 6 个网球 = 11 个网球。
    所以,罗杰现在总共有 11 个网球。

    差别显著!仅仅通过添加“让我们一步一步地思考”,这个参考模型就包含了它的推理过程(在翻译过程中测试时,发现现在对于这么简单的例子,对于我们使用的参考模型,已经没有太大意义,即时不加这句话,它也会分步计算,但是这种方式对于一些复杂场景还是有很大作用的)。

    系统提示(System Prompting)

    系统提示 (System Prompting)(也称为使用“系统消息”或“预提示”)涉及向 LLM 提供高级指令、上下文、角色指南或总体行为规则,这些规则旨在应用于整个对话或交互会话。

    系统提示的关键好处在于,这些指令会持续有效,无需在每个用户查询中重复,从而使 LLM 的行为更加一致和可控。

    假设我们想让我们的参考模型总结一段文本,并且我们希望总结非常简洁,具体到一句话。我们可以把这个约束放在用户提示中。

    text_to_summarize = "埃菲尔铁塔是法国巴黎战神广场上的一座锻铁格子塔。它以工程师古斯塔夫·埃菲尔的名字命名,他的公司设计并建造了这座塔。当地人昵称它为“La dame de fer”(法语意为“铁娘子”),它于1887年至1889年间建造,作为1889年世界博览会的核心建筑。尽管最初因其设计遭到法国一些顶尖艺术家和知识分子的批评,但它已成为法国的全球文化象征,也是世界上最具辨识度的建筑之一。"
    user_prompt_before = f"将这段文字总结成一句话: '{text_to_summarize}'"

    messages = [
        {"role""system""content": DEFAULT_SYSTEM_PROMPT}, # Using the default, generic system prompt
        {"role""user""content": create_user_content(user_prompt_before)}
    ]
    response = call_llm(messages)
    print(response)


    ### OUTPUT ###
    埃菲尔铁塔是法国巴黎战神广场上由古斯塔夫·埃菲尔公司设计建造的锻铁格子塔,尽管初建时遭艺术家批评,却最终成为法国标志性文化象征和全球最具辨识度的建筑之一。

    现在,让我们将关于简洁性和 LLM 角色的核心指令移至系统提示中。这使得用户提示更简单,并且对于可能的一系列摘要任务,该指令更具持久性。

    custom_system_prompt = "您是“简洁摘要者”,主要目标是以最短的、语法正确的句子提供文本主要内容的摘要,除非另有明确指示,仅用一个清晰的句子。"

    messages = [
        {"role""system""content": custom_system_prompt},
        {"role""user""content": create_user_content(text_to_summarize)}
    ]
    response = call_llm(messages)
    print(response)


    ### OUTPUT ###
    埃菲尔铁塔是巴黎战神广场上的锻铁格子塔,由古斯塔夫·埃菲尔的公司于1887-1889年建造,作为1889年世博会的核心建筑,尽管最初遭艺术家和知识分子批评,现已成为法国的文化象征和全球知名建筑之一。

    对于单个请求,输出质量可能相似,但在处理大量查询时,这种方法更为稳健和可扩展。

    明确指令提示(Explicit Instructions Prompting)

    它侧重于在向 LLM 提出请求时做到清晰、直接和明确。关键在于通过以下方式,尽可能减少误解的空间:

    你应该在几乎所有的提示中都力求明确的指令,但在以下情况下尤为关键:

    • • 期望的输出有特定的结构或内容要求。
    • • 你想避免某些主题或类型的信息。
    • • 长度或简洁性很重要。
    • • 任务复杂,可能被多种方式解读。
    • • 与较小的 LLM 合作时,它们从非常直接的指导中获益显著。

    让我们请求我们的参考模型“写一些关于苹果的东西”——这是一个非常开放和模糊的请求。

    user_prompt_before = "写一段关于苹果的话."
    messages = [
        {"role""system""content": DEFAULT_SYSTEM_PROMPT},
        {"role""user""content": create_user_content(user_prompt_before)}
    ]
    response = call_llm(messages)
    print(response)

    ### OUTPUT ###
    苹果,这颗圆润饱满的果实,自古以来便是自然馈赠人类的甜蜜象征。它如同红灯笼般挂满枝头,或如绿宝石般青翠欲滴,果香四溢中透着清冽的生机。咬下一口,汁水迸发,酸甜交织的滋味在舌尖绽放,仿佛将阳光、雨露与时光都凝结其中。它不仅是餐桌上常见的水果,更是健康生活的守护者——富含维生素C、膳食纤维与抗氧化物,为身体注入活力,助消化、促代谢,悄然守护着我们的日常。从古希腊神话中伊甸园的禁果,到中国传统文化里寓意平安的"苹果",它跨越时空,以朴素的姿态承载着人类对美好与智慧的向往。无论是直接食用、榨汁调饮,还是烘焙成果酱,苹果总能以千变万化的姿态,将自然的馈赠转化为生活的诗意。

    参考模型给出回复完全在放飞自我。这没错,但缺乏引导。如果用户心中有特定的侧重点呢?

    现在,让我们更具体一些。我们将准确告诉 LLM 应该关注苹果的哪些方面、期望的长度以及应该避免什么。

    user_prompt_after = (
        "写一段关于苹果的短文,重点介绍其营养益处和常见品种。\n"
        "段落必须正好包含3句话。\n"
        "至少提及两个具体品种(如Granny Smith、Fuji)。\n"
        "不要讨论苹果的栽培或历史。\n"
    )
    messages = [
        {"role""system""content": DEFAULT_SYSTEM_PROMPT},
        {"role""user""content": create_user_content(user_prompt_after)}
    ]
    response = call_llm(messages)
    print(response)


    ### OUTPUT ###
    苹果富含膳食纤维、维生素C和抗氧化剂,有助于促进消化、增强免疫力并降低慢性疾病风险。常见品种如Granny Smith以其高酸度和脆爽口感著称,而Fuji则以甜度适中、果肉细腻闻名。不同品种的苹果在营养成分上略有差异,例如Red Delicious含更多糖分,Golden Delicious则富含类黄酮化合物。

    来自明确提示的输出,根据我们(现在已声明的)要求,针对性更强,也更有用。

    输出引导(Output Priming)

    当你向 LLM 提供其期望回应的开头时,本质上是为它启动了答案,这就发生了输出引导。

    通过给出这个“开端”,你可以引导模型朝向特定的结构(specific structure)、格式(format)、语气(tone)或内容延续(content continuation)。

    这就像给 LLM 一个温和的推动,让其输出朝着你想要的确切方向发展。

    对于较早的补全式模型(如 text-davinci-003),你实际上会将你的引导内容附加到提示的末尾,模型会完成它。对于聊天模型(如 LLaMA Instruct),这通常通过以下方式实现:

    1. 1. 构建用户最后一条消息的结构,使其自然地引出期望的输出格式(例如,以“列表如下:\n-”结尾)。
    2. 2. 使用少样本示例,其中助手的示例回应以引导的方式开始。

    让我们请求我们的参考模型列出一个简单蛋糕的配料,而不尝试引导输出格式。

    user_prompt_before = "一个简单的香草蛋糕需要哪些配料?"
    messages = [
        {"role""system""content": DEFAULT_SYSTEM_PROMPT},
        {"role""user""content": create_user_content(user_prompt_before)}
    ]
    response = call_llm(messages)
    print(response)


    ### OUTPUT ###
    一个简单的香草蛋糕需要以下配料:

    1. 面粉(约 2 杯)
    2. 糖(约 1 杯)
    3. 蛋黄(约 3 个)
    4. 鸡蛋(约 2 个)
    5. 奶油(约 1/2 杯)
    6. 香草精(约 1/4 茶匙)
    7. 盐(约 1/4 茶匙)
    8. 香草叶(可选)

    这些配料可以帮助你制作一个简单的香草蛋糕。注意,具体的比例和配料可能会根据你的个人偏好和蛋糕的大小而有所不同。

    模型列出了配料,但它是以句子或段落的形式。这对于可读性来说还不错,但如果我们需要一个机器可解析的列表,或者只是一个用于食谱卡的干净项目符号格式呢?

    现在,让我们尝试通过引导输出来获得一个项目符号列表。我们将以一种强烈暗示助手应该继续列出列表的方式结束用户的提示。

    user_prompt_after = (
        "请列出制作一个简单香草蛋糕所需的配料。\n"
        "以下是制作简单香草蛋糕所需的配料:\n"
        "-"
    )
    messages = [
        {"role""system""content": DEFAULT_SYSTEM_PROMPT},
        {"role""user""content": create_user_content(user_prompt_after)}
    ]
    response = call_llm(messages)
    # The response will likely start with the first item, so we prepend the prime for display
    print(f"这里是一个简单香草蛋糕所需的配料:\n- {response}")


    ### OUTPUT ###
    这里是一个简单香草蛋糕所需的配料:
    - 以下是制作简单香草蛋糕所需的配料:

    2杯(250克)面粉
    1杯(200克)糖
    3个大蛋黄
    1/2杯(120毫升)牛奶
    1/2杯(120毫升)水
    1/4茶匙(1.25毫升)盐
    1/2茶匙(2.5毫升)泡打粉
    1/2茶匙(2.5毫升)香草精
    2大蛋白
    2汤匙(30毫升)植物油
    - 香草叶或香草糖(optional)

    通过在用户提示的末尾加上“配料如下:\n-”,我们强烈地提示这个参考模型以列表延续的方式生成其回应。

    复述与回应 Rephrase and Respond (RaR)

    这是一种更简单的直接提示形式,要求 LLM 在尝试生成主要回应之前,首先复述你的请求或解释其对任务的理解。

    这充当了一个检查点,以确保 LLM 走在正确的轨道上,特别是对于复杂或可能含糊不清的查询。

    这项技术在以下情况下特别有帮助:

    • • 用户的请求复杂(complex)、多方面(multi-faceted)或可能含糊不清(potentially ambiguous)。
    • • 错误或不一致回应的代价很高(例如,基于误解生成一份长文档)。
    • • 你想确保 LLM 已经掌握了请求的所有关键约束或组成部分。
    • • 教学或演示如何分解问题。

    让我们给我们的参考模型一个有些模糊的创作任务:“写一个关于旅程的故事。”这可能意味着很多事情!

    user_prompt_before = "写一个关于旅程的故事."
    messages = [
        {"role""system""content": DEFAULT_SYSTEM_PROMPT},
        {"role""user""content": create_user_content(user_prompt_before)}
    ]
    response = call_llm(messages)
    print(response)

    ### OUTPUT ###
    有一位年轻的旅行者名叫李子,他一直梦想着去远方的山脉探险。有一天,他终于决定放弃舒适的生活,背上背包,开始他的旅程。
    [省略]

    模型生成了一个故事(说实在的,我不知道它在说什么)。这是一段旅程,但只是众多可能性中的一种。如果用户设想的是太空之旅,或者是情感之旅呢?LLM 只是选择了其中一种解释。

    现在,让我们指示这个参考模型首先陈述它对“一个关于旅程的故事”的理解或解释,然后再写故事。

    user_prompt_after = (
       "我想要一个关于旅程的故事。\n"
       "首先,简要描述你计划写哪种类型的旅程(例如,是冒险、情感之旅、短途旅行还是长期探寻?主角是谁?)。\n"
       "然后,根据你的描述写一个短篇故事(大约100字)。\n"
    )
    messages = [
        {"role""system""content": DEFAULT_SYSTEM_PROMPT},
        {"role""user""content": create_user_content(user_prompt_after)}
    ]
    response = call_llm(messages)
    print(response)

    ### OUTPUT ###
    **类型**:情感之旅  
    **主角**:一位失去母亲的年轻女子,独自踏上母亲生前未完成的旅程,寻找自我与释怀。

    **短篇故事**:  
    我计划写一个关于情感之旅的故事。主角是一个叫做李娜的年轻女性,她在经历了一段感情失落后,决定去旅行寻找自我和新开始。

    故事如下:

    李娜站在海边,风吹着她的长发,她闭上眼睛,感受着海浪的涌动。她的心还在伤痛中,但她知道她必须继续前进。[省略]

    通过要求 LLM 首先陈述其解释,我们迫使它“承诺”一种特定类型的旅程。即使在这个单次提示中没有用户反馈,这种内部澄清步骤也可以带来一个更专注的故事。

    (这个Prompt使用的实例在Qwen这个模型下似乎没有作者在Llama 1B模型下的差别那么大,可能需要使用别的模型试试)

    退一步思考提示(Step-Back Prompting)

    当你引导 LLM 在尝试回答具体问题之前,首先思考与该问题相关的更广泛的概念、原则或一般知识时,就使用了这种方法。

    这就像要求模型先“缩小视野(zoom out)”以建立基础理解,然后再“放大视野(zooming in)”关注细节。

    核心思想是,通过首先检索和阐明一般原则,LLM 可以将这种更广泛的背景应用于具体查询,从而产生更具洞察力、更合理和更全面的答案。

    退一步思考提示在以下方面特别有效:

    • • 涉及细微差别或定义的问题:(例如,“病毒是活的吗?”)。
    • • 涉及复杂或有争议主题的查询:理解基本原则是关键。
    • • 可以从第一性原理(first principles)思考中受益的问题解决(Problem-solving)。
    • • 解释复杂主题:通过首先阐述基础知识。
    • • 通过强制进行更深思熟虑的方法来避免常见陷阱或过于简单的答案。

    让我们问我们的参考模型一个经典的棘手问题:“番茄是水果还是蔬菜?”

    user_prompt_before = "番茄是水果还是蔬菜?"
    messages = [
        {"role""system""content": DEFAULT_SYSTEM_PROMPT},
        {"role""user""content": create_user_content(user_prompt_before)}
    ]
    response = call_llm(messages)
    print(response)

    ### OUTPUT ###
    番茄通常被认为是蔬菜。虽然它的口味和外观与水果相似,但从botany的角度来看,番茄是一种蔓生植物,其果实是酸性和富含水分的果实。

    这个8B参数的模型提供了一个不错的、常见的答案,涉及了植物学和烹饪学的角度。然而,它没有深入解释为什么存在这些不同的分类(译注:在我使用的这个Qwen模型中它已经能给出更加详细的解释)。

    现在,让我们使用“退一步思考提示”。我们将要求 LLM 首先解释“水果”(植物学上)和“蔬菜”(烹饪学上)的一般定义,然后再将这些定义应用于番茄。

    user_prompt_after = (
        "我有一个关于番茄的问题。但首先,请解释:\n"
        "1. 水果的植物学定义是什么?\n"
        "2. 蔬菜在烹饪上的一般理解是什么?\n\n"
        "现在,基于这些定义,解释番茄是被认为是水果还是蔬菜,并说明为什么经常会有混淆。"
    )
    messages = [
        {"role""system""content": DEFAULT_SYSTEM_PROMPT},
        {"role""user""content": create_user_content(user_prompt_after)}
    ]
    response = call_llm(messages)
    print(response)


    ### OUTPUT ###
    很高兴帮助你解决这个问题。

    1. 水果的植物学定义:水果是植物的成熟果实,通常由花朵和果实的结合而成。水果通常含有种子,例如苹果、香蕉、橙子等。水果的主要功能是帮助植物传播种子。

    2. 蔬菜在烹饪上的一般理解:蔬菜是指用于烹饪的植物的部分,通常不含种子或含有少量种子。蔬菜可以是植物的叶子(如菠菜)、茎(如胡萝卜)、根(如土豆)或花朵(如花椰菜)。蔬菜通常不含有种子,主要用于提供营养和口感。

    基于这些定义,我们可以说番茄是水果,因为它是植物的成熟果实,含有种子。然而,在烹饪和日常生活中,番茄通常被认为是蔬菜,因为它不像其他水果那样被用作甜食,而是被用作调味品和烹饪原料。

    为什么会有混淆?原因有几个:

    - 在植物学上,番茄是水果,但在烹饪和日常生活中,它被用作蔬菜。
    - 在语言上,人们可能会根据文化和习俗来区分水果和蔬菜,而不是根据植物学定义。
    - 在商业上,番茄被分类为蔬菜,而不是水果,这可能会导致人们认为它是蔬菜。

    总之,番茄既是水果又是蔬菜,取决于观点和上下文。

    优化后”的回应更加全面和具有教育意义。通过首先建立基础定义(“退一步思考”),LLM 为何番茄在植物学上是水果,而在烹饪上常被视为蔬菜提供了更清晰、更有力的解释。

    自我批判与改进(Self-Critique & Refinement)

    这是一个多步骤(multi-step)的技术,你指示 LLM 去:

    1. 1. 针对一项任务生成初步回应。
    2. 2. 然后,根据特定标准(例如,清晰度(clarity)、简洁性(conciseness)、准确性(accuracy)、相关性(relevance)、创造性(creativity)、是否遵守约束(adherence to constraints))批判性地评估其自身的回应。
    3. 3. 最后,根据其自身的批判生成一个修订和改进版的回应。

    这项技术在以下方面尤其强大:

    • • 创意任务:改进标语、故事构思、诗歌或营销文案。
    • • 复杂解释:确保清晰、准确和完整。
    • • 内容摘要:优化摘要,使其更简洁并更好地抓住要点。
    • • 代码生成:要求模型审查其代码是否存在错误、效率低下或是否遵循最佳实践。
    • • 任何初次尝试可能不错,但可以通过“再次审视”和润色来改进的任务。

    让我们请求我们的参考模型为一个新的环保水瓶想一个简短、吸引人的口号。一次尝试可能还行,但也许不够出色。

    user_prompt_before = "为一个新的环保水瓶写一个简短、朗朗上口的广告语。"
    messages = [
        {"role""system""content": DEFAULT_SYSTEM_PROMPT},
        {"role""user""content": create_user_content(user_prompt_before)}
    ]
    response = call_llm(messages)
    print(f"Slogan: {response}")


    ### OUTPUT ###
    Slogan: "环保水瓶,绿色生活,永远的选择!"

    这是一个不错的口号。它简短、押韵,并暗示了“环保”(绿色)和“水”(饮用/洁净)。但它能更好或更直接吗?

    现在,让我们请求这个参考模型生成一个口号,然后进行评价,最后提供一个改进版本。

    user_prompt_after = (
        "我需要一个简短、朗朗上口的环保水瓶广告语。请按以下步骤进行:\n"
        "1.  首先,生成一个初始广告语。\n"
        "2.  然后,对你自己的广告语进行批判性评估:\n"
        "    *   是否朗朗上口且令人印象深刻?\n"
        "    *   是否清晰地传达了'环保'的理念?\n"
        "    *   是否与'水瓶'产品紧密相关?\n"
        "    *   有哪些不足或需要改进的地方?\n"
        "3.  最后,基于你的评估,提供一个改进后的广告语。"
    )
    messages = [
        {"role""system""content": DEFAULT_SYSTEM_PROMPT},
        {"role""user""content": create_user_content(user_prompt_after)}
    ]
    response = call_llm(messages)
    print(response)


    ### OUTPUT ###
    **步骤 1: 初始广告语**

    初始广告语:"用环保的步伐,携带清新的水"

    **步骤 2: 批判性评估**

    *   朗朗上口且令人印象深刻:这个广告语比较简单,可能不够引人注目。
    *   清晰地传达了"环保"的理念:这个广告语已经传达了环保的概念,但可能需要更具体地解释。
    *   与"水瓶"产品紧密相关:这个广告语与水瓶产品的关系不是非常明确。
    *   不足或需要改进的地方:这个广告语可能需要更强调水瓶产品的独特之处和环保的具体优势。

    **步骤 3: 改进后的广告语**

    改进后的广告语:"用环保的水瓶,携带清新的水,保护地球,保护你"

    这个过程迫使这个参考模型根据特定标准分析其自身的输出。这种结构化的反思很有价值。自我批判提示鼓励一个更深思熟虑和精炼的生成过程。

    目标分解提示(Goal Decomposition Prompting)

    它涉及在提示本身中将一个庞大、复杂的任务或目标分解为一系列更小、更易于管理子目标或步骤。

    你实质上是为 LLM 提供了一个结构化的计划(structured plan)或一系列操作,它需要执行这些操作以实现总体目标。

    这在某种程度上类似于 思维链(CoT) 提示,但 CoT 通常侧重于引出问题的推理步骤,而目标分解则更侧重于通过明确列出期望输出的组成部分或阶段来指导建设性任务的生成过程。

    目标分解在以下情况下非常有效:

    • • 期望的输出是多方面的,并且有几个不同的部分(例如,策划活动、撰写包含特定章节的报告、生成角色简介)。
    • • 您希望确保 LLM 处理所有必要的组成部分。
    • • 整体任务对于 LLM(尤其是较小的 LLM)来说过于复杂,无法通过单一、非结构化的请求可靠地处理。
      您希望引导 LLM 遵循特定的工作流程或结构来生成其响应。

    让我们请求我们的参考模型策划一个简单的周末旅行。这是一个相对复杂的任务,包含许多隐含的子组件。

    user_prompt_before = "计划一个简单的周末自然景点之旅。"
    messages = [
        {"role""system""content": DEFAULT_SYSTEM_PROMPT},
        {"role""user""content": create_user_content(user_prompt_before)}
    ]
    response = call_llm(messages)
    print(response)


    ### OUTPUT ###
    以下是一种简单的周末自然景点之旅计划:

    **目的地:**附近的国家公园或自然保护区

    **行程:**

    1. **周六上午**:早上6点起床,吃早餐后出发前往目的地。沿途可以欣赏美丽的风景和鸟类。
    2. **周六上午-下午**:抵达目的地后,开始徒步或骑行探索自然景观。可以选择不同的路线,根据个人喜好和身体状况选择适合的活动。
    3. **周六下午**:在公园内的餐厅或露营地享用午餐。可以尝试当地的特色美食或自带食物。
    4. **周六下午-周日上午**:继续探索公园内的自然景观,包括水falls、湖泊、森林等。
    5. **周日上午**:结束活动后返回家中,带回美丽的照片和回忆。

    **建议:**

    * 确保提前预订住宿和餐厅,以避免拥挤和售罄。
    * 带上适当的装备,包括水、食物、帽子、太阳镜等。
    * 根据天气情况选择合适的活动。
    * 尽量减少对自然环境的影响,保持清洁和尊严。

    这个8B参数的模型给出了一些非常笼统的想法。这个“计划”相当模糊,缺乏结构,并且遗漏了实际计划旅行时可能会考虑的许多关键要素(比如每天的具体活动、除了零食之外还需要打包什么,或者安全问题)。

    现在,让我们明确地将“策划旅行”这个目标分解为几个不同的子目标或问题,让 LLM 按顺序解决。

    user_prompt_after = (
        "我想计划一个周末去附近自然景点的简单旅行。请帮我制定一个包含以下内容的计划:\n"
        "1.  建议一个具体的自然景点类型(例如:有徒步小径的森林、湖边区域、风景优美的山顶观景点)。\n"
        "2.  列出3-4件针对该自然景点类型的必备物品。\n"
        "3.  建议周六一个主要活动,周日一个不同的活动。\n"
        "4.  提供一条与访问该自然景点相关的重要安全提示。"
    )
    messages = [
        {"role""system""content": DEFAULT_SYSTEM_PROMPT},
        {"role""user""content": create_user_content(user_prompt_after)}
    ]
    response = call_llm(messages)
    print(response)


    ### OUTPUT ###
    **必备物品:**

    1.  水壶和水杯:湖边区域可能没有饮用水供应,带上水壶和水杯可以确保你有足够的水喝。
    2.  食物和水果:湖边区域可能没有餐厅或商店,带上一些干粮和水果可以满足你的食欲。
    [省略]

    **周六主要活动:**

    周六,你可以在湖边区域进行徒步旅行,沿着湖边的小径走一圈,[省略]

    **周日活动:**

    周日,你可以在湖边区域进行钓鱼活动,尝试钓上一些湖里的鱼。[省略]

    **安全提示:**
    [省略]

    现在的输出远比之前结构化和全面。这个参考模型处理了每一个指定的子目标,从而产生了一个更有用、更具操作性的“计划(plan)”。

    元提示(Meta-Prompting)

    这是一种有趣的技术,你利用 LLM 来帮助你为另一个(甚至同一个)LLM 创建更好的提示。你实际上是在问 LLM:“我应该如何有效地要求你(或其他 AI)执行任务 X?”

    这就像向一位专家(LLM 本身,它“见过”无数的提示)咨询如何最好地表达你的请求。

    元提示在以下情况下很有用:

    • • 你不确定如何最好地向 LLM 表述一个复杂的请求。
    • • 你想发现更有效的提示方式以获得特定类型的输出。
    • • 你正在尝试优化提示以获得更好的质量、特异性或创造性。
    • • 你想利用 LLM 关于什么构成一个好提示的“知识”。
    • • 你正在教别人提示工程,并想展示 LLM 如何辅助创建提示。

    想象一下,一个用户想从 LLM 那里获得一些独特的奇幻故事创意。他们最初可能会尝试一个简单的提示,但这可能无法产生他们所期望的丰富、结构化的想法。

    Give me some fantasy story ideas.

    这太基础了。LLM 可能会给出一些通用的想法。用户想要一个更好的提示,但不知道怎么写。

    所以,我们不会展示这个弱提示的结果,而是展示元提示如何帮助创建一个更好的提示。

    让我们请求我们的参考模型帮助我们制作一个用于生成奇幻故事创意的好提示。我们将告诉它我们希望每个故事创意中包含哪些信息。

    user_prompt_meta_after = (
        "我想使用LLM生成3个独特且富有创意的奇幻故事创意。\n"
        "对于每个故事创意,我需要LLM提供:\n"
        "a) 一个独特的主角概念。\n"
        "b) 一个引人入胜的核心冲突。\n"
        "c) 一个与故事密不可分的独特魔法元素或系统。\n\n"
        "请写出我应该使用的详细提示词,以便向LLM获取这些结构化的奇幻故事创意。"
    )
    messages = [
        # We can use a system prompt to encourage good prompt crafting
        {"role""system""content""You are an expert in prompt engineering and creative writing assistance."},
        {"role""user""content": create_user_content(user_prompt_meta_after)}
    ]
    # This response IS the suggested prompt
    suggested_prompt_from_llm = call_llm(messages)
    print("--- Suggested Prompt from LLM (Meta-Prompting Result) ---")
    print(suggested_prompt_from_llm)


    ### OUTPUT ###
    --- Suggested Prompt from LLM (Meta-Prompting Result) ---
    以下是你可以使用的详细提示词,来让LLM生成三个独特且富有创意的奇幻故事创意:

    **提示词 1:**

    * 主角概念:"一个拥有特殊能力的孤儿,能够与动物沟通并控制自然元素"
    * 核心冲突:"在一个被魔法污染的世界中,主角必须找到一种方法来清除污染并恢复自然的平衡"
    * 魔法元素或系统:"一种称为'生态之声'的魔法系统,能够让主角与自然界的每个声音相通,并控制自然元素"

    提示词:
    "生成一个奇幻故事创意,主角是一个拥有特殊能力的孤儿,能够与动物沟通并控制自然元素。故事的核心冲突是,在一个被魔法污染的世界中,主角必须找到一种方法来清除污染并恢复自然的平衡。请描述一个独特的魔法系统,称为'生态之声',它能够让主角与自然界的每个声音相通,并控制自然元素。"
    [省略]

    元提示词帮助生成了一个比用户最初简单尝试的提示详细得多结构化得多的提示。这个参考在被问及如何提示时,利用了其对什么构成有效提示的内隐理解(具体性、包含内容的示例、清晰的结构)。

    ReAct (Reason + Act) (推理+行动)

    旨在通过交错推理(interleaving reasoning)(类似思维链的步骤来分解问题并创建计划)和行动(模拟采取行动来收集信息或与环境互动,即使该“环境”只是其自身的知识库或假设的工具),使 LLM 能够解决复杂任务。

    模拟 ReAct 风格的提示对于以下情况很有用:

    • • 多跳问答(Multi-hop Question Answering):查找答案需要按顺序查找多条信息。
    • • 事实核查(Fact Verification):模拟查找事实然后进行综合。
    • • 复杂问题解决(Complex Problem Solving):问题需要分解,收集信息(即使是假设地从其自身知识中获取),然后构建解决方案。
    • • 规划任务(Planning Tasks):LLM 需要思考步骤,为每个步骤收集潜在信息,然后制定计划。
    • • 使 LLM 的问题解决过程更加明确和可审计,即使它没有使用真正的外部工具。

    让我们问一个可能需要 LLM 隐式查找或组合几条信息的问题。

    user_prompt_before = "当第一个人登上月球时,美国总统是谁?那位宇航员叫什么名字?"
    messages = [
        {"role""system""content": DEFAULT_SYSTEM_PROMPT},
        {"role""user""content": create_user_content(user_prompt_before)}
    ]
    response = call_llm(messages)
    print(response)


    ### OUTPUT ###
    当第一个人登上月球时,美国总统是尼克松总统。宇航员的名字是尼尔·阿姆斯特朗(Neil Armstrong)。他在1969720日的阿波罗11号任务中首次踏上月球表面。

    这个参考模型很可能直接记住了这些信息并且能够回答。

    然而,对于更复杂的查询,如果它没有“预编译”好的答案,直接的方法可能会失败或产生一个不那么确定的答案。我们看不到它是如何将这些事实联系起来的。

    现在,让我们引导这个参考模型回答同样的问题,但要明确地阐述一个“思考、行动、观察”的过程,就好像它在使用工具或搜索策略一样。

    user_prompt_after = (
        "请回答以下问题:\"当第一个人登上月球时,谁是美国总统?那位宇航员的名字是什么?\"\n\n"
        "要回答这个问题,请按照类似ReAct的过程进行。对于每个步骤,请说明:\n"
        "思考:[你的推理或下一步计划]\n"
        "行动:[你需要查找的具体信息或需要回答的子问题,就像你在查询工具或数据库一样]\n"
        "观察:[你的行动假设得到的结果或答案]\n\n"
        "继续这个过程,直到你获得回答主要问题所需的所有信息。然后,给出最终答案。"
    )
    messages = [
        {"role""system""content""You are a helpful assistant that solves problems by thinking step-by-step, simulating actions, and observing results."},
        {"role""user""content": create_user_content(user_prompt_after)}
    ]
    response = call_llm(messages)
    print(response)


    ### OUTPUT ###
    我将按照类似ReAct的过程来回答这个问题。

    **步骤 1**
    思考:首先,我们需要确定第一个人登上月球的时间点。然后,我们可以查找当时的美国总统和宇航员的名字。
    行动:查找第一个人登上月球的时间点。
    观察:第一个人登上月球的时间点是1969720日。

    **步骤 2**
    思考:现在我们知道了时间点,我们可以查找当时的美国总统和宇航员的名字。
    行动:查找1969720日的美国总统和宇航员的名字。
    观察:1969720日,美国总统是理查德·尼克松。第一个人登上月球的宇航员是尼尔·阿姆斯特朗。

    **步骤 3**
    思考:我们已经找到了答案,但为了确认,我们可以查找更多信息。
    行动:查找更多关于尼尔·阿姆斯特朗和尼克松的信息。
    观察:确认尼尔·阿姆斯特朗是第一个人登上月球的宇航员,尼克松是当时的美国总统。

    **最终答案**
    第一个人登上月球时,美国总统是理查德·尼克松。第一个人登上月球的宇航员是尼尔·阿姆斯特朗。

    ReAct 风格的提示迫使这个参考模型将主要问题分解为更小、更易于管理的子问题(找到日期,然后是总统,然后是宇航员)。

    行动(Action)”和“观察(Observation)”步骤模仿了查询信息的过程。这使得 LLM 内部的“知识查找(knowledge lookup)”更加明确。

    思路连贯性提示 Thread-of-Thought (ThoT)

    它侧重于鼓励 LLM 在多轮对话中或在一段长篇生成的文本中保持连贯和关联的推理或叙述思路。

    ThoT 对于以下情况至关重要:

    • • 长篇内容生成(Long-form Content Generation):撰写论文、文章、报告或故事章节,其中段落间的连贯性至关重要。
    • • 复杂解释(Complex Explanations):确保多部分解释易于理解且逻辑连贯。
    • • 多轮问题解决(Multi-turn Problem Solving):在多个交互步骤中跟踪约束、中间结果和总体目标。
    • • 扩展对话(Extended Conversations):帮助 LLM 记住关键点并在较长的对话中保持对用户主要目标的关注。
    • • 辩论或议论文写作(Debates or Argumentative Writing):确保论点构建合乎逻辑且一致。

    让我们想象一下,我们要求我们的参考模型解释一个复杂的过程,比如“在美国,一项法案是如何成为法律的”,但没有具体指导如何保持清晰的思路。对于一个非常长的解释,较小的模型可能会开始跑题或失去对主要阶段的关注。

    如果只是简单地要求“解释一项法案如何成为法律”,一个8B参数的模型可能会:

    • • 提供一个步骤列表,但没有清晰地连接一个步骤如何导致下一个步骤。
    • • 在某个步骤的细节上跑题(例如,委员会工作),从而失去了整体流程。
    • • 使用不一致的术语或忘记定义先前引入的关键术语。
    • • 解释可能感觉不连贯,或者像一堆事实的集合,而不是一个过程的连贯叙述。

    我们可以不使用一个庞大的提示,而是模拟逐段引导 LLM,或者要求它以清晰的过渡来构建其解释,专注于“思路”。

    user_prompt_after = (
        "我需要一个清晰的解释,说明一个法案在美国是如何成为法律的。\n"
        "请按以下结构组织你的解释:\n\n"
        "1.  **简介:** 简要说明立法过程的总体目的。\n"
        "2.  **法案提出:** 解释谁可以在哪里提出法案。\n"
        "3.  **委员会阶段:** 描述委员会中发生的事情以及为什么这个阶段很重要。确保解释这与前一步骤的关联。\n"
        "4.  **议会行动(众议院/参议院):** 详细说明一个议院中的辩论和投票过程。解释法案如何从委员会到达议会。\n"
        "5.  **另一议院的行动:** 解释这个过程如何重复,以及当版本不同时会发生什么。清楚地与前一个议院的行动建立联系。\n"
        "6.  **协调委员会(如果需要):** 解释其在调解分歧方面的作用。\n"
        "7.  **总统行动:** 描述总统的选项(签署、否决、袖珍否决)及其后果。\n"
        "8.  **推翻否决(如果适用):** 解释这个最后可能的步骤。\n\n"
        "在整个解释过程中,确保每个阶段都合乎逻辑地衔接前一个阶段,保持法案历程的清晰'脉络'。使用清晰的过渡短语。"
    )
    messages = [
        {"role""system""content""You are an expert in explaining complex governmental processes clearly and logically."},
        {"role""user""content": create_user_content(user_prompt_after)}
    ]
    response = call_llm(messages) # This will be a long response
    print(response)

    ### OUTPUT ###
    **简介:**
    美国立法过程旨在确保法律的制定是民主、透明和代表性的。[省略]

    **法案提出:**
    在美国,任何一位国会议员都可以在众议院或参议院提出法案。[省略]

    **委员会阶段:**
    委员会阶段是立法过程中的一个关键环节。[省略]

    **议会行动(众议院/参议院):**
    [省略]

    通过明确要求结构化大纲并指示 LLM 确保逻辑流畅并使用过渡短语,最终的解释变得更加连贯且易于理解。法案的“思路”得以保持。

    结论 Conclusion

    我们仔细研究了17种不同的提示工程技术,了解了它们如何帮助我们即使从一个参考模型中也能获得更好的结果。从直接的零样本提示到更复杂的如 ReAct 这样的方法,每一种都提供了一种独特的引导 AI 的方式。

    你还会遇到一些令人兴奋的概念,例如:

    • • 思维树 (Tree-of-Thought, ToT):让 LLM 探索多种推理路径并进行自我评估。
    • • 自我一致性 (Self-Consistency):通过生成多样化的推理路径并进行多数投票来改进推理。
    • • 指令调优风格提示 (Instruction Tuning Style Prompting):利用模型在指令上进行微调的特定方式。
    • • 角色校准提示 (Persona Calibration Prompting):更精确地微调角色的行为方式。
    • • 多角色对话提示 (Multi-Persona Dialogue Prompting):模拟多个 AI 角色之间的对话。

    以及更多!

53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询