互动式提示词工程教程 (Interactive Prompt Engineering Tutorial)

引言 (Introduction)

欢迎来到互动式提示词工程教程!当我们与大语言模型 (Large Language Models, LLM) 交互时,输入的文本(有时伴随图像等多模态输入)被称为提示词 (Prompt)。模型利用这个提示词来预测并生成特定的输出。

核心理念

不需要是数据科学家或机器学习工程师——任何人都可以编写提示词。然而,设计出最有效的提示词可能颇具挑战性。模型的选择、训练数据、配置参数、措辞、风格、结构和上下文都会影响最终效果。

提示词工程 (Prompt Engineering) 是一个迭代优化的过程。不恰当的提示词可能导致模糊、不准确的响应,阻碍模型生成有意义的输出。本教程将深入探讨提示词工程的各种技术和最佳实践,助你成为提示词专家。

本教程侧重于直接通过API或Vertex AI等平台与Gemini模型交互,因为这样可以访问如Temperature等关键配置参数。

LLM基础与配置 (LLM Basics & Config)

理解LLM的工作原理至关重要:它们本质上是预测引擎。模型接收顺序文本作为输入,并基于其训练数据预测下一个最可能的词元 (Token)

LLM 如何生成文本? (模拟)

想象一下LLM逐步生成句子的过程:

模拟的生成结果将显示在这里...

这是一个简化的模拟,实际LLM过程更复杂,涉及概率分布。

关键配置参数

除了提示词本身,调整模型的配置参数对输出结果有显著影响。

输出长度 (Output Length)

控制模型生成的最大词元数量。更多的词元意味着更高的计算成本和潜在的延迟。但这不会让模型变得更简洁,只是在达到限制时停止生成。

采样控制 (Sampling Controls)

LLM预测的是下一个词元的概率分布,采样控制决定如何从这个分布中选择最终的词元。

参数调整 (Parameter Tuning)

精调采样控制参数,可以塑造模型输出的创造性和确定性。

Temperature (温度) - 互动演示

Temperature 控制词元选择的随机性程度。较低值(接近0)使输出更具确定性、更集中;较高值则增加多样性和创造性(也可能更随机)。

0.7

低 Temperature (e.g., 0.1):

倾向于最常见、最安全的词语,结果更可预测。

中 Temperature (e.g., 0.7):

平衡创造性与连贯性,适合大多数通用任务。

高 Temperature (e.g., 1.0):

更冒险、更有创意,但也可能产生不连贯或奇怪的文本。

当前 0.7 Temperature 模拟输出:

模型会根据当前温度值,在保守和创新之间找到一个平衡点来生成文本。

注意:Temperature 为 0 是确定性的(贪婪解码),总是选择最高概率的词元。

Top-K

限制模型仅从概率最高的 K 个词元中进行选择。较小的 K 使输出更保守,较大的 K 增加多样性。K=1 等同于 Temperature=0。

例如,Top-K=3 表示只考虑概率前三的词元。

Top-P (Nucleus Sampling)

选择累积概率达到阈值 P 的最小词元集合。这是一种更动态的方法,候选词元的数量会变化。P=1 考虑所有词元,P 接近 0 则接近贪婪解码。

例如,Top-P=0.9 表示选择概率总和达到 90% 的词元。

如何组合使用?

这些参数通常可以组合使用。Vertex AI 等平台通常会先应用 Top-K 和 Top-P 过滤候选词元,然后应用 Temperature 从剩余的候选词元中进行采样。

经验法则起点:

  • 平衡: Temp=0.7, Top-P=0.95, Top-K=40
  • 创意: Temp=0.9, Top-P=0.99, Top-K=40 (或更高)
  • 保守/事实: Temp=0.2, Top-P=0.9, Top-K=20
  • 精确答案 (如数学): Temp=0

需要注意的是,极端设置会使其他参数失效(例如 Temp=0 或 Top-K=1)。最佳组合需要实验来确定。

零样本提示 (Zero-shot Prompting)

最简单的提示类型,只提供任务描述和输入文本,不包含任何示例

示例提示 (Zero-shot):

将以下电影评论分类为 正面 (POSITIVE)、中性 (NEUTRAL) 或 负面 (NEGATIVE)。

评论: "这部电影《她》(Her) 是一项令人不安的研究,揭示了如果允许人工智能不受约束地持续进化,人类将走向何方。我希望有更多像这部杰作一样的电影。"

情感:

模拟 AI 响应:

POSITIVE

尽管提到了 "disturbing"(令人不安),但 "masterpiece"(杰作)和希望有更多类似电影的表述主导了整体的正面情感。

动手尝试:零样本分类

模拟的分类结果 (POSITIVE/NEGATIVE/NEUTRAL) 将显示在这里...

当零样本提示效果不佳时,可以引入示例,这就引出了“单样本”和“少样本”提示。

少样本提示 (Few-shot Prompting)

通过在提示中提供一个或多个示例,指导模型理解任务要求和期望的输出格式或模式。

  • 单样本 (One-shot): 提供一个示例。
  • 少样本 (Few-shot): 提供多个(通常 3-5 个或更多,取决于任务复杂度)示例。

示例提示 (Few-shot): 解析披萨订单

将顾客的披萨订单解析为有效的 JSON 格式:

示例 1:
我想要一个小号披萨,配料有奶酪、番茄酱和意大利辣香肠。
JSON 响应:
{
  "size": "small",
  "type": "normal",
  "ingredients": [["cheese", "tomato sauce", "pepperoni"]]
}

示例 2:
我可以要一个大号披萨,配料有番茄酱、罗勒和马苏里拉奶酪吗?
JSON 响应:
{
  "size": "large",
  "type": "normal",
  "ingredients": [["tomato sauce", "basil", "mozzarella"]]
}

现在,我想要一个大号披萨,一半是奶酪和马苏里拉奶酪,另一半是番茄酱、火腿和菠萝。
JSON 响应:

模拟 AI 响应:

{
  "size": "large",
  "type": "half-half",
  "ingredients": [
    ["cheese", "mozzarella"],
    ["tomato sauce", "ham", "pineapple"]
  ]
}

动手尝试:少样本信息提取

示例将根据所选模板显示...

模拟的提取结果将显示在这里...

选择的示例应与任务相关、多样化、高质量且书写正确。包含边缘案例有助于提高模型的鲁棒性。

系统/上下文/角色提示

这些技术通过不同方式指导 LLM 的行为和输出风格:

系统提示 (System Prompting)

设定模型的整体任务、能力或输出规则。例如,指定输出格式(如JSON)、安全要求或基本行为准则。

例子: "将以下文本翻译成法语。只返回翻译结果。"

上下文提示 (Contextual Prompting)

提供与当前任务或对话相关的具体背景信息。帮助模型理解细微差别,定制响应。

例子: "背景:你正在为一个关于复古街机游戏的博客写作。请建议3个文章主题。"

角色提示 (Role Prompting)

为模型分配一个特定的角色、身份或个性。影响输出的语气、风格和知识侧重。

例子: "扮演一位经验丰富的旅行向导。为我推荐罗马的三个必游景点。"

这三者经常结合使用。例如,一个角色提示(扮演莎士比亚)可以包含系统指令(以十四行诗格式回应)和上下文(关于春天的话题)。

示例:系统提示 (指定格式)

将电影评论分类为正面、中性或负面。仅以大写形式返回标签。

评论: "《她》是一项令人不安的研究...太令人不安了,我看不下去。"

情感:

模拟 AI 响应:

NEGATIVE

示例:角色与上下文提示

扮演一位风趣幽默的旅行向导。我将告诉你我的位置,请用幽默的风格为我推荐3个附近的游玩地点。

我的建议: "我在曼哈顿。"

旅行建议:

模拟 AI 响应:

  1. 帝国大厦之巅,感受君临天下的快感!准备好感觉自己像金刚一样,不过手里没香蕉。
  2. 去 MoMA 装装文艺青年。盯着那些让你怀疑自己简笔画价值的大师杰作。
  3. 在第五大道血拼到破产!准备好钱包哭泣,window-shopping(或者真shopping)那些设计师精品店吧!

系统提示对于强制输出结构(如JSON)、控制安全性和毒性(例如,添加“回答应保持尊重”)非常有用。

后退提示法 (Step-back Prompting)

一种提高推理能力的技术。它首先提示LLM思考与具体任务相关的更一般性或抽象性的问题,然后将这个通用答案融入到解决具体任务的最终提示中。

这种“后退一步”可以帮助模型激活相关的背景知识和推理过程,从而生成更准确、更有洞察力的响应。

第一步:提出一般性问题

一般性提示:

基于流行的第一人称射击游戏,哪些虚构的关键设定有助于构建一个具有挑战性和吸引力的关卡故事情节?列出5个。

模拟 AI 响应 (抽象概念):

  1. 废弃军事基地:充满变异士兵和流氓机器人的末日后综合体。
  2. 赛博朋克城市:霓虹灯闪烁的未来都市,高楼林立,小巷密集。
  3. 外星飞船:搁浅在地球上的巨大外星舰船,怪异走廊,零重力区域。
  4. 丧尸小镇:被丧尸占领的荒凉小镇,近距离战斗激烈。
  5. 水下研究设施:深海实验室,充满变异水生生物,需要潜行和探索。

第二步:结合通用答案解决具体问题

结合后的具体提示:

背景 (来自第一步):
5个引人入胜的第一人称射击游戏主题:1. 废弃军事基地... 2. 赛博朋克城市... 3. 外星飞船... 4. 丧尸小镇... 5. 水下研究设施...

选择其中一个主题,为新的第一人称射击游戏关卡编写一段具有挑战性和吸引力的单段故事情节。

模拟 AI 响应 (更具体的故事情节):

在浑浊深渊的中心,坐落着一座破败的水下研究设施... 玩家,一名装备先进潜水装备和实验性武器的精英陆战队员,被派往这个恐怖的水域... 必须穿越危险的走廊,解决神秘的谜题,并对抗潜伏在深处的恐怖海洋怪物...

动手尝试:Step-back 问题解决

模拟的抽象/通用问题:

...

模拟的通用问题回答:

...

模拟的结合后具体回答:

...

思维链 (Chain of Thought, CoT)

通过提示模型生成中间推理步骤来提高其复杂推理任务(尤其是数学、逻辑问题)的能力。

核心思想:不直接跳到答案,而是让模型“思考”过程。

无 CoT 的提示 (可能出错):

我 3 岁时,我的伴侣年龄是我的 3 倍。现在我 20 岁了。我的伴侣多大了?

模拟 AI 响应 (错误):

63 岁

使用 CoT 的提示 (Zero-shot CoT):

我 3 岁时,我的伴侣年龄是我的 3 倍。现在我 20 岁了。我的伴侣多大了?请一步一步思考。

模拟 AI 响应 (正确并含步骤):

  1. 当我 3 岁时,我的年龄是 3 岁。
  2. 那时我伴侣的年龄是 3 * 3 = 9 岁。
  3. 我现在 20 岁,从 3 岁到现在,我的年龄增加了 20 - 3 = 17 年。
  4. 因为年龄增长是同步的,我伴侣的年龄也增加了 17 年。
  5. 所以,我伴侣现在的年龄是 9 + 17 = 26 岁。
  6. 答案是 26 岁。

CoT 可以与 Few-shot 结合使用,通过提供包含推理步骤的示例来进一步引导模型。

示例提示 (Few-shot CoT) - 点击查看响应

问:我哥哥 2 岁时,我的年龄是他的一倍。现在我 40 岁。我哥哥多大了?请一步一步思考。
答:当我哥哥 2 岁时,我是 2 * 2 = 4 岁。年龄差是 2 岁,我更大。我现在 40 岁,所以我哥哥是 40 - 2 = 38 岁。答案是 38。

问:我 3 岁时,我的伴侣年龄是我的 3 倍。现在我 20 岁了。我的伴侣多大了?请一步一步思考。
答:

模拟 AI 响应:

当我 3 岁时,我的伴侣是 3 * 3 = 9 岁。年龄差是 6 岁,我的伴侣更大。我现在 20 岁,所以我伴侣是 20 + 6 = 26 岁。答案是 26。

动手尝试:CoT 推理

模拟的 CoT 推理过程和答案将显示在这里...

CoT 对于需要分解任务的场景很有用,如代码生成、合成数据创建等。任何可以通过“逐步讲解”来解决的问题都适合尝试 CoT。

自我一致性 (Self-consistency)

改进 CoT 的一种方法。它通过多次生成(通常使用较高的 Temperature)不同的推理路径 (Chains of Thought),然后选择最常出现的最终答案(多数投票)。

这提高了复杂推理任务的准确性和鲁棒性,但计算成本更高。

自我一致性模拟流程

1

使用相同的 CoT 提示,设置较高 Temperature (e.g., 0.7+)。

2

多次运行该提示 (e.g., 3-5 次或更多),得到多个不同的推理路径和答案。

3

提取每次运行的最终答案。

4

统计哪个答案出现次数最多 (多数投票)。

将多数答案作为最终、更可靠的输出。

示例:对于一个模棱两可的邮件分类任务(判断是否重要),零样本 CoT 可能因邮件中的讽刺或微妙之处而在多次运行时给出不同答案 (IMPORTANT vs NOT IMPORTANT)。自我一致性通过多次采样并取多数,可以得到更稳定的结果。

(自我一致性的互动演示较复杂,此处省略。核心在于理解多次运行和多数投票的概念。)

思维树 (Tree of Thoughts, ToT)

CoT 的泛化,允许 LLM 同时探索多个不同的推理路径,形成一个“思维树”,而不仅仅是单一的线性链条。

模型可以在树的不同节点进行评估、回溯和扩展,使其特别适合需要广泛探索和规划的复杂问题(如下棋、创意写作)。

思维树 (ToT) vs 思维链 (CoT) - 概念图

思维链 (CoT)

输入
思考步骤 1
思考步骤 2
输出

思维树 (ToT)

输入
思考路径 A1
思考路径 B1
评估/放弃 A2
思考路径 B2
思考路径 B3
最终路径 -> 输出

这是一个高度简化的视觉表示。

(ToT 的实现通常涉及更复杂的算法来生成和评估不同的“思想”分支,模拟较为困难。)

ReAct 方法 (Reason & Act)

一种使 LLM 能够通过结合推理 (Reasoning)行动 (Acting) 来解决复杂任务的范式。模型不仅进行内部思考,还能与外部工具(如搜索引擎、计算器、API)交互以获取信息或执行操作。

这模拟了人类解决问题的方式:思考,然后采取行动收集更多信息,再根据新信息调整思考。

ReAct 循环模拟

任务:Metallica 乐队成员总共有多少个孩子?

思考 (Thought): 我需要找出 Metallica 有哪些成员,然后分别查每个成员有多少孩子,最后加起来。

行动 (Action): 使用搜索引擎 (Search)

输入 (Action Input): "Metallica 乐队成员"

观察 (Observation): (模拟搜索结果) James Hetfield, Lars Ulrich, Kirk Hammett, Robert Trujillo。

思考 (Thought): 好的,有4个成员。现在需要查第一个成员 James Hetfield 的孩子数量。

行动 (Action): Search

输入 (Action Input): "James Hetfield 有多少孩子?"

观察 (Observation): (模拟搜索结果) 3个孩子。

思考 (Thought): 第一个有3个。接下来查 Lars Ulrich...

... 这个循环继续,直到所有成员都查询完毕 ...

思考 (Thought): 我已经查询了所有4个成员的孩子数量 (3 + 3 + 2 + 2 = 10)。我现在可以给出最终答案了。

最终答案 (Final Answer): 10

实际的 ReAct 实现通常需要代码(如使用 LangChain 框架)来连接 LLM 和外部工具 (API)。

自动提示工程 (Automatic Prompt Engineering, APE)

鉴于手动设计高质量提示的复杂性,APE 提出了一种用 LLM 来生成和优化提示的方法。

基本流程:

1

提供少量输入/输出示例对给一个“提示生成”LLM

2

让该 LLM 生成多个候选的任务指令 (提示)

3

使用一个“目标”LLM,用每个候选提示来处理开发集数据。

4

根据某种评估指标(如准确率、BLEU、ROUGE分数)对每个候选提示的效果进行评分。

选择得分最高的提示作为最终使用的优化提示。

示例:用 LLM 生成购买 T 恤的多种表达方式 - 点击查看响应

我们有一个乐队 T 恤网店,为了训练聊天机器人,我们需要用户表达“一件 Metallica T 恤,S 码”的多种方式。请生成 10 种语义相同但表达不同的变体。

模拟 AI 响应 (生成的多种提示变体):

  1. 我想买一件 Metallica 的 T 恤,要小号的。
  2. 能给我来一件小号的 Metallica T 恤吗?
  3. 我要买一件 Metallica 的小号 T 恤。
  4. 一件 Metallica T 恤,小号,谢谢。
  5. 我想要一件 S 码的 Metallica T 恤。
  6. 我想下一单,要一件小号 Metallica T 恤。
  7. 小号 Metallica T 恤,来一件。
  8. 我在找一件小号的 Metallica T 恤。
  9. 能帮我拿一件小号 Metallica T 恤吗?
  10. 一件 Metallica 小号 T 恤,麻烦了。

这些生成的变体可以作为 APE 过程的候选提示进行评估。

APE 有助于减轻人工设计提示的负担,并可能发现比人类设计的更有效的提示。

代码提示 (Code Prompting)

LLM 在处理和生成代码方面也表现出色。你可以使用提示来完成各种编程任务。

生成代码

示例提示 (生成 Bash 脚本):

编写一个 Bash 代码片段,该片段首先询问用户输入一个文件夹名称。然后,它获取该文件夹的内容,并将其中所有文件重命名,在原始文件名前加上 "draft_" 前缀。

模拟 AI 响应:

#!/bin/bash

# Ask for the folder name
echo "Enter the folder name:"
read folder_name

# Check if the folder exists
if [ ! -d "$folder_name" ]; then
  echo "Folder does not exist."
  exit 1
fi

# Iterate over files in the folder
for file in "$folder_name"/*; do
  # Check if it's a file (and not a directory)
  if [ -f "$file" ]; then
    # Get the base filename
    filename=$(basename "$file")
    # Construct the new file path
    new_filepath="$folder_name/draft_$filename"
    # Rename the file
    mv "$file" "$new_filepath"
    echo "Renamed '$filename' to 'draft_$filename'"
   fi
done

echo "Files renamed successfully."

重要: LLM 生成的代码可能包含错误或安全漏洞。务必仔细审查和测试生成的代码!

解释代码

示例提示 (解释代码) - 点击查看响应

请解释以下 Bash 代码的作用:

#!/bin/bash
echo "Enter folder:"
read dir
if [ ! -d "$dir" ]; then exit 1; fi
for f in "$dir"/*; do
  if [ -f "$f" ]; then
    fn=$(basename "$f")
    mv "$f" "$dir/prefix_$fn"
  fi
done
echo "Done."

模拟 AI 响应:

这段 Bash 脚本执行以下操作:

  1. 提示用户输入一个文件夹名称,并将其存储在变量 `dir` 中。
  2. 检查输入的名称是否对应一个实际存在的目录。如果不存在,脚本退出。
  3. 遍历指定目录 (`$dir`) 下的所有项目 (`*`)。
  4. 对于每个项目,检查它是否是一个普通文件 (`-f`)。
  5. 如果是文件,提取其基本名称(不含路径)到变量 `fn`。
  6. 使用 `mv` 命令将原始文件重命名,在原文件名前加上 "prefix_" 前缀,并保留在同一目录下。
  7. 所有文件处理完毕后,输出 "Done."。

翻译代码

示例提示 (翻译代码: Bash to Python) - 点击查看响应

将以下 Bash 代码翻译成 Python 代码片段:

# (Bash code from previous example)
#!/bin/bash
echo "Enter folder:"
read dir
if [ ! -d "$dir" ]; then exit 1; fi
for f in "$dir"/*; do
  if [ -f "$f" ]; then
    fn=$(basename "$f")
    mv "$f" "$dir/prefix_$fn"
  fi
done
echo "Done."

模拟 AI 响应:

import os
import sys # For exit()

folder_name = input("Enter the folder name: ")

# Check if the folder exists and is a directory
if not os.path.isdir(folder_name):
    print("Folder does not exist.")
    sys.exit(1)

try:
    # List all entries in the directory
    for filename in os.listdir(folder_name):
        original_path = os.path.join(folder_name, filename)

        # Check if it's a file
        if os.path.isfile(original_path):
            new_filename = f"prefix_{filename}"
            new_path = os.path.join(folder_name, new_filename)

            # Rename the file
            os.rename(original_path, new_path)
            print(f"Renamed '{filename}' to '{new_filename}'")

    print("Done.")

except OSError as e:
    print(f"An error occurred: {e}")
    sys.exit(1)

调试和审查代码

示例提示 (调试 Python 代码) - 点击查看响应

以下 Python 代码出现错误。请调试问题所在,并解释如何改进代码。

# Code with bug
import os
folder = input("Folder: ")
pref = input("Prefix: ")
text = toUpperCase(pref) # Bug here!

if not os.path.isdir(folder): exit(1)

for f in os.listdir(folder):
    op = os.path.join(folder, f)
    if os.path.isfile(op):
        nf = f"{text}_{f}"
        np = os.path.join(folder, nf)
        os.rename(op, np)
print("OK")

# Error message:
# Traceback (most recent call last):
#   File "rename.py", line 5, in 
#     text = toUpperCase(pref)
# NameError: name 'toUpperCase' is not defined

模拟 AI 响应:

错误原因:

代码调用了 `toUpperCase(pref)` 函数,但 Python 中没有内置名为 `toUpperCase` 的函数。Python 中用于将字符串转换为大写的方法是字符串对象的 `.upper()` 方法。

修复:

将 `text = toUpperCase(pref)` 修改为 `text = pref.upper()`。

改进建议:

  • 使用 `sys.exit(1)` 代替 `exit(1)` 以更明确地表示错误退出。
  • 添加错误处理(例如 `try...except` 块)来捕获 `os.listdir` 或 `os.rename` 可能抛出的 `OSError`。
  • 代码目前会将 `prefix_` 添加到包括文件扩展名在内的整个文件名之前。可能需要先分离文件名和扩展名,再添加前缀,最后重新组合。例如使用 `os.path.splitext`。
  • 添加更友好的用户提示和错误消息。

修复和改进后的代码示例:

import os
import sys

folder_name = input("Enter the folder name: ")
prefix = input("Enter the prefix to prepend: ")

if not os.path.isdir(folder_name):
    print(f"Error: Folder '{folder_name}' does not exist or is not a directory.")
    sys.exit(1)

prefix_upper = prefix.upper() # Correctly convert prefix to uppercase

print(f"Processing files in '{folder_name}'...")
try:
    for filename in os.listdir(folder_name):
        original_path = os.path.join(folder_name, filename)

        if os.path.isfile(original_path):
            # Separate filename and extension
            name_part, ext_part = os.path.splitext(filename)
            # Create new filename
            new_filename = f"{prefix_upper}_{name_part}{ext_part}"
            new_path = os.path.join(folder_name, new_filename)

            try:
                os.rename(original_path, new_path)
                print(f"  Renamed '{filename}' to '{new_filename}'")
            except OSError as e:
                print(f"  Error renaming '{filename}': {e}")

    print("File renaming process completed.")

except OSError as e:
    print(f"Error accessing directory '{folder_name}': {e}")
    sys.exit(1)

最佳实践 (Best Practices)

掌握以下最佳实践,可以显著提高你的提示词工程效率和效果:

提供示例 (Few-shot)

这是最强大的技巧之一。示例清晰地展示了期望的输出格式、风格或模式,有效“教导”模型。

简洁明了 (Simplicity)

提示应该清晰、简洁、易于理解。避免复杂的语言和不必要的信息。如果对你来说都复杂,对模型可能更复杂。

具体说明输出 (Specificity)

明确指出你想要的输出格式、长度、风格等。例如,“生成一个三段的博客文章...”比“生成一篇博客文章...”效果更好。

优先使用指令而非约束

告诉模型要做什么通常比告诉它不要做什么更有效。指令更直接,约束可能限制创造性或相互冲突。仅在必要时(如安全、严格格式)使用约束。

例:(优)“只讨论主机、公司、年份和销量。” vs (劣)“不要列出游戏名称。”

控制输出长度

可以通过模型配置(Max Tokens)或在提示中明确要求(例如,“用一条推文的长度解释量子物理学”)。

使用变量

在提示中使用占位符(如 `{city}`),使提示可重用且动态化,便于集成到应用程序中。

实验不同格式/风格

尝试不同的提问方式(问题、陈述、指令)、措辞和提示类型(零样本、少样本、系统提示),观察结果差异。

混合分类任务示例

在 Few-shot 分类任务中,确保示例覆盖所有可能的类别,并打乱顺序,避免模型过度拟合特定顺序。

适应模型更新

模型会不断更新。关注模型变化,测试现有提示在新版本上的表现,并根据需要进行调整。

尝试结构化输出

对于提取、解析、排序等任务,尝试要求模型以 JSON 或 XML 等结构化格式返回结果,这有助于限制幻觉并方便后续处理。

与他人协作

多人尝试同一个任务,分享和比较不同的提示和结果,可以激发新的想法和发现最佳方法。

详细记录尝试

极其重要! 详细记录每次提示尝试(模型、版本、配置、提示全文、输出、评估结果),以便回顾、调试和学习。

使用表格(如 Google Sheet)或 Vertex AI Studio 等工具。

CoT 特定最佳实践

  • 先推理后答案: 确保推理步骤在最终答案之前生成。
  • 可提取答案: 设计提示,使最终答案易于从推理过程中分离出来(对 Self-consistency 很重要)。
  • Temperature = 0: CoT 通常用于需要精确推理的任务,因此建议将 Temperature 设置为 0 (贪婪解码)。

总结:提示词工程是一个迭代的过程。不断制作、测试、分析、记录和改进你的提示!

总结 (Summary)

本教程涵盖了提示词工程的核心概念和技术,包括:

  • LLM基础与配置 (温度, Top-K/P)
  • 零样本提示
  • 少样本提示
  • 系统、上下文与角色提示
  • 后退提示法 (Step-back)
  • 思维链 (CoT)
  • 自我一致性 (Self-consistency)
  • 思维树 (ToT)
  • ReAct (推理与行动)
  • 自动提示工程 (APE)
  • 代码提示 (生成、解释、翻译、调试)

我们还探讨了多项关键的最佳实践,强调了实验迭代详细记录的重要性。

希望这个互动式的教程能帮助你更好地理解和应用提示词工程,创造出更强大、更精确的 AI 应用!