普通人如何理解大模型
大模型,尤其是像OpenAI这样的语言模型,对于普通人来说可能显得有些神秘。但其实,我们可以将其视为一个黑盒,主要关注其输入和输出。本文将通过OpenAI的API为例,带你了解大模型的工作原理,并通过一些有趣的例子和图表,帮助你更好地理解这一过程。
先来看看模型的输入
以 openAI 的API为例,接口名chat/completions
这里的chat代表聊天,是一个有上下文和历史记录的会话。在这个会话中,存在以下几个角色:
- System:系统角色,定义机器人的人设和遵守的规则。
- User:用户角色,用户对机器人的回复。
- Assistant:机器人对用户提问的回答。
- Tool:模型调用插件工具的角色。
为什么机器人能记住我们的聊天内容?
对话内容被保存在一个数组中,记录了所有的交互信息。
我们输入的message在模型内部怎么处理呢?
chat/completions 中的 completions (自动补全)
文本转换成模型可理解的符号(tokenization:文本 -> token -> token IDs),再对符号进行补全
token与文本的关系
-
token不等于字符或单词
- 不是按单词拆分:happy unhappy; unhappy就是两个token; happy就是一个token;
- 不同上下文中拆分不一样:This is my backpack : backpack
-
不同语言token表达效率不同
英文:The weather is good today => 5个token, 25字符
中文:今天天气真好 => 5个token, 6字符
日文:今日の天気はいいです => 7个token, 10字符
西班牙语:El tiempo está bueno hoy => 5个token, 24字符
启示:使用用更少token表达同样意思的语言
-
不同模型使用的分词器不同:
- 通义千问分词器: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的补全受哪些参数影响,认识这些参数即可:
-
Temperature:调整概率分布的差异。
- 低温:强化高概率选项,减少选择多样性。
- 高温:使概率分布更平缓,增加选择多样性。
-
Top_p:设定累积概率阈值,从高到低概率依次选择token,直到总和达到设定值。
-
Frequency Penalty:降低已出现token的再次出现概率,迫使模型选择新的表达方式。
-
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_p: 0.75
});
定义
通过不断优化输入,提升模型输出(Assistant Prompt)的质量,包括三个纬度:
- 质量维度:输出内容的专业、完整和有价值(让人感觉说到点子上)
- 稳定性维度:在不同场景和时间下产生可预期的一致表现(让人感觉靠得住)
- 正确性维度:信息的准确度和可信度,不产生虚假或误导性内容(让人感觉说的对)
以辅助编码场景举例,三个维度可以概括为:
- 质量维度:代码的可读性、可维护性和专业性
- 稳定性维度:代码在各种情况下的可预测性和一致性
- 正确性维度:代码的语法正确性和逻辑正确性
受众
谁才是提示词工程的受众:
- 使用AI工具的人?
- 制造AI工具的人?
答案是制造AI工具的人,从两个角度考虑:
- 从AI应用角度:模型响应用户输入(User Prompt)后,在系统设定(System Prompt)的约束下生成回复(Assistant Prompt)
- 从产品角度:优秀的产品应该降低用户上手门槛
提示词工程的流程
对于制造AI工具的人来说,提示词工程是一个有向无环图:
- 用专业知识明确需求
- 选择合适的模型
- 运用提示词技巧表达需求
- (按需)拆分提示词
提示词工程与AI框架
如何将提示词工程的完整流程用代码表示出来?
以Langchain.js举例,Langchain的开发语言LCEL(LangChain Expression Language)的理念是:
❝
通过组合简单、类型安全的可运行组件(Runnable),声明式构建 AI 应用
观察有向无环图,有三点启示:
- 图中每个模块就是一个Runnable
- Runnable之间的组合构成链(Chain),完整的链构成有向无环图
- Chain可能并行或串行执行