什么是提示词工程?

468 阅读6分钟

普通人如何理解大模型

大模型,尤其是像OpenAI这样的语言模型,对于普通人来说可能显得有些神秘。但其实,我们可以将其视为一个黑盒,主要关注其输入和输出。本文将通过OpenAI的API为例,带你了解大模型的工作原理,并通过一些有趣的例子和图表,帮助你更好地理解这一过程。

先来看看模型的输入

以 openAI 的API为例,接口名chat/completions

chat-api.png

这里的chat代表聊天,是一个有上下文和历史记录的会话。在这个会话中,存在以下几个角色:

  1. System:系统角色,定义机器人的人设和遵守的规则。
  2. User:用户角色,用户对机器人的回复。
  3. Assistant:机器人对用户提问的回答。
  4. Tool:模型调用插件工具的角色。

为什么机器人能记住我们的聊天内容?

对话内容被保存在一个数组中,记录了所有的交互信息。

我们输入的message在模型内部怎么处理呢?

chat/completions 中的 completions (自动补全)

文本转换成模型可理解的符号(tokenization:文本 -> token -> token IDs),再对符号进行补全

openAI tokenizer

tokens-id.png

token与文本的关系

  1. token不等于字符或单词

    • 不是按单词拆分:happy unhappy; unhappy就是两个token; happy就是一个token;
    • 不同上下文中拆分不一样:This is my backpack : backpack
  2. 不同语言token表达效率不同

    英文:The weather is good today   => 5个token, 25字符

    中文:今天天气真好  => 5个token, 6字符

    日文:今日の天気はいいです  => 7个token, 10字符

    西班牙语:El tiempo está bueno hoy => 5个token, 24字符

    启示:使用用更少token表达同样意思的语言

  3. 不同模型使用的分词器不同:

    例如,通义千问分词器openAI分词器的处理结果不同:

    • 通义千问分词器:105个token
    • OpenAI分词器:124个token, 157字符
    流浪地球计划,共分为5步:
    第一步,用地球发动机使地球停止转动,将发动机喷口固定在地球运行的反方向;
    第二步,全功率开动行星发动机,使地球加速到逃逸速度,飞出太阳系;
    第三步,在外太空继续加速,飞向比邻星;
    第四步,在中途使地球重新自转,调转发动机方向,开始减速;
    第五步,地球泊入比邻星轨道,成为这颗恒星的卫星。
    

以openAI GPT为例,一般规律:

  • 1个token约等于4个英文字符,大概 3/4 个单词。100个token大约等于75个英文单词
  • 1个token接近0.7个中文字

对于Claude3.5-sonnet-200k ,200k的token:

  • 200k token = 150k单词
  • 标准短篇小说5000单词
  • 上下文极限情况可以容纳30篇短篇小说

符号(token)补全

对于这个黑盒,我们只需关注token的补全受哪些参数影响,认识这些参数即可:

  1. Temperature:调整概率分布的差异。

    • 低温:强化高概率选项,减少选择多样性。
    • 高温:使概率分布更平缓,增加选择多样性。
  2. Top_p:设定累积概率阈值,从高到低概率依次选择token,直到总和达到设定值。

  3. Frequency Penalty:降低已出现token的再次出现概率,迫使模型选择新的表达方式。

  4. Presence Penalty:降低已出现主题的相关token概率,促使模型转向新主题。

例如:"我喜欢吃" → 预测下一个token,可能的token及其概率:

  • "饭" (0.3)
  • "菜" (0.2)
  • "水果" (0.15)
  • "零食" (0.1)
  • ...其他选项

Temperature

0~2,调整概率分布的差异

  • 低温:强化高概率选项,减少选择多样性
  • 高温:使概率分布更平缓,增加选择多样性
Temperature = 0.2时:
"饭" (0.8)
"菜" (0.1)
"水果" (0.05)
...

Temperature = 1.5时:
"饭" (0.3)
"菜" (0.25)
"水果" (0.23)
...

Top_p 核采样

设定累积概率阈值,从高到低概率依次选择的token,直到总和达到设定值

Top_p = 0.75时:
选择:"饭"(0.3) + "菜"(0.2) + "水果"(0.15) + "零食"(0.1) = 0.75
其他选项被排除

Frequency Penalty 概率惩罚

-2 ~ 2,降低已出现token的再次出现概率,迫使模型选择新的表达方式

如果"喜欢"已经出现过:
原始概率:"喜欢"(0.3) → 惩罚后:(0.1)
我喜欢吃饭,我也爱吃烧烤

Presence Penalty 存在惩罚

-2 ~ 2,降低已出现主题的相关token概率

如果已经讨论过"食物"主题,相关token概率都会被降低,促使模型转向新主题

我喜欢吃饭, -> 我也喜欢吃烧烤
0.7:我喜欢吃放,周末常去夜市撸串 (引入周末和夜市场景)
1:我喜欢吃放,假期约上朋友去大排档,美食总能让生活充满乐趣(引入新场景、人物、情感)
-1:我喜欢吃饭吃面吃烧烤

代码示例

const llm = new Ollama({
  model: "qwen2.5:7b",
  temperature: 1.5, // 高温,降低概论,提高多样性
  frequency_penalty: 1, // 降低已出现token的再次出现概率,增加表达方式多样性
  verbose: true, // 打印模型输出
  presence_penalty: 1,
  top_p0.75
});

定义

通过不断优化输入,提升模型输出(Assistant Prompt)的质量,包括三个纬度:

  1. 质量维度:输出内容的专业、完整和有价值(让人感觉说到点子上
  2. 稳定性维度:在不同场景和时间下产生可预期的一致表现(让人感觉靠得住
  3. 正确性维度:信息的准确度和可信度,不产生虚假或误导性内容(让人感觉说的对

辅助编码场景举例,三个维度可以概括为:

  1. 质量维度:代码的可读性、可维护性和专业性
  2. 稳定性维度:代码在各种情况下的可预测性和一致性
  3. 正确性维度:代码的语法正确性和逻辑正确性

受众

谁才是提示词工程的受众:

  • 使用AI工具的人?
  • 制造AI工具的人?

答案是制造AI工具的人,从两个角度考虑:

  • 从AI应用角度:模型响应用户输入(User Prompt)后,在系统设定(System Prompt)的约束下生成回复(Assistant Prompt

cursor chat的例子

  • 从产品角度:优秀的产品应该降低用户上手门槛

提示词工程的流程

对于制造AI工具的人来说,提示词工程是一个有向无环图:

  1. 用专业知识明确需求
  2. 选择合适的模型
  3. 运用提示词技巧表达需求
  4. (按需)拆分提示词

image.png

提示词工程与AI框架

如何将提示词工程的完整流程用代码表示出来?

image.pngLangchain.js举例,Langchain的开发语言LCEL(LangChain Expression Language)的理念是:

通过组合简单、类型安全的可运行组件(Runnable),声明式构建 AI 应用

观察有向无环图,有三点启示:

  1. 图中每个模块就是一个Runnable
  2. Runnable之间的组合构成链(Chain),完整的链构成有向无环图
  3. Chain可能并行或串行执行