【AI&游戏】专栏-直达
Token与上下文窗口
Token 是大语言模型处理信息的基本单位,上下文窗口是指模型能够"记住"的最大Token数量。理解Token和上下文窗口对于高效使用AI模型、控制成本和优化性能至关重要。
在大模型应用中,Token是计费的基础单位,上下文窗口决定了模型一次能处理的信息量。掌握这两个概念,可以帮助开发者更好地设计AI应用,优化资源使用。
一、Token的核心概念
1. ⭐ 什么是Token
定义 :
Token是大语言模型处理文本的最小单位。在模型眼中,文本不是字符或单词的序列,而是Token的序列。
Token与字符、单词的区别:
- 字符:最小的文本单位(如H, e, l, l, o)
- 单词:由空格分隔的文本(如Hello, world)
- Token:模型处理的基本单位(如Hello, wo, rld)
示例:
原文:"I don't like flying."
Token化后:"I" | "don" | "'t" | "like" "flying" | "."
Token数量:6个
字符数量:20个
2. ⭐ Token的计算方式
英文Token:
- 1个token ≈ 4个字符
- 1个token ≈ 0.75个单词
中文Token:
- 1个token ≈ 1-2个汉字
- 中文分词更复杂,token数量可能更多
示例计算:
英文:"The quick brown fox"
字符数:19
Token数:约5个
中文:"快速的棕色狐狸"
汉字数:6
Token数:约4-6个
3. ⭐ 分词算法
BPE(Byte Pair Encoding):
- 基于频率的合并算法
- GPT系列模型使用
- 优点:处理未知词能力强
WordPiece:
- 基于概率的分词
- BERT模型使用
- 优点:平衡词汇表大小
SentencePiece:
- 无监督分词
- 支持多种语言
- 优点:跨语言一致性
分词示例:
输入:"unhappiness"
BPE: "un" + "happi" + "ness"
WordPiece: "un" + "##happi" + "##ness"
SentencePiece: "unhappi" + "ness"
4. ⭐ Token的用途
模型输入:
- 用户提问的文本
- 上下文信息
- 系统指令
模型输出:
- 生成的回答
- 推理过程
- 结构化数据
计费单位:
- 输入token计费
- 输出token计费
- 总token计费
二、上下文窗口的核心概念
1. ⭐ 什么是上下文窗口
定义 :
上下文窗口是指模型能够"记住"的最大Token数量,即模型在生成下一个词时能够参考的前面多少个词。
类比理解 :
想象一个阅读框,一次只能罩住半页纸,只能基于框里的内容理解故事。如果想理解后面的内容,必须移动阅读框,但会忘记前面的内容。这个框的大小就是上下文窗口。
重要性:
- 决定模型一次能处理的信息量
- 影响对话连贯性
- 影响长文档处理能力
2. ⭐ 主流模型的上下文窗口
OpenAI模型:
- GPT-3.5:4K token
- GPT-4:8K/32K token
- GPT-4 Turbo:128K token
- GPT-4o:128K token
Anthropic模型:
- Claude 2:100K token
- Claude 3 Haiku:200K token
- Claude 3 Sonnet:200K token
- Claude 3 Opus:200K token
Google模型:
- Gemini Pro:128K token
- Gemini Ultra:1M token
开源模型:
- Llama 2:4K/8K token
- Llama 3:8K/128K token
- Mistral:8K token
3. ⭐ 上下文窗口的限制
技术限制:
- 计算复杂度:O(n²)的注意力机制
- 内存占用:需要存储KV缓存
- 推理速度:长上下文导致延迟增加
实际限制:
- 价格成本:长上下文更昂贵
- 准确性:长上下文可能降低准确性
- 实用性:过长上下文未必有用
4. ⭐ 上下文窗口的优化
RoPE(旋转位置编码):
- 支持外推到更长上下文
- 保持位置信息的连续性
- 主流模型使用的技术
ALiBi(Attention with Linear Biases):
- 线性偏置的注意力机制
- 支持长上下文推理
- 高效的内存使用
滑动窗口:
- 分段处理长文本
- 保留关键信息
- 降低内存占用
三、Token和上下文窗口的使用
1. ⭐ Token计数方法
OpenAI Token计数:
import tiktoken
encoder = tiktoken.encoding_for_model("gpt-4")
tokens = encoder.encode("Hello, world!")
print(f"Token数量: {len(tokens)}")
Claude Token计数:
# 使用Claude官方Tokenizer
import anthropic
client = anthropic.Anthropic()
# Token计数通过API获取
Hugging Face Token计数:
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2")
tokens = tokenizer.encode("Hello, world!")
print(f"Token数量: {len(tokens)}")
2. ⭐ 成本计算
OpenAI定价(示例):
- GPT-4 Turbo输入:$0.01/1K token
- GPT-4 Turbo输出:$0.03/1K token
- GPT-3.5 Turbo输入:$0.001/1K token
- GPT-3.5 Turbo输出:$0.002/1K token
计算示例:
场景:处理3000字的英文文档
Token数量:约4000 token
成本:4000 × $0.01/1000 = $0.04
场景:处理3000字的中文文档
Token数量:约6000 token
成本:6000 × $0.01/1000 = $0.06
3. ⭐ 上下文窗口管理
策略:
- 压缩:使用摘要技术减少上下文
- 选择:只保留相关上下文
- 分段:分段处理长文档
- 缓存:缓存频繁使用的上下文
示例代码:
def manage_context(messages, max_tokens=8000):
"""管理对话上下文"""
total_tokens = 0
filtered_messages = []
for msg in reversed(messages):
msg_tokens = count_tokens(msg["content"])
if total_tokens + msg_tokens <= max_tokens:
filtered_messages.insert(0, msg)
total_tokens += msg_tokens
else:
break
return filtered_messages
4. ⭐ 优化策略
Prompt优化:
- 精简指令:使用简洁明确的指令
- 避免重复:去除冗余信息
- 结构化输出:使用JSON等结构化格式
对话管理:
- 定期总结:对话过长时进行总结
- 选择性记忆:只记住关键信息
- 上下文轮换:动态调整上下文内容
文档处理:
- 分块处理:将长文档分块处理
- 检索增强:使用RAG技术
- 摘要生成:生成文档摘要
四、游戏开发中的Token和上下文窗口
1. ⭐ NPC对话管理
应用描述 :
通过Token和上下文窗口管理NPC对话历史。
核心功能:
- 对话历史存储:记录玩家与NPC的对话
- 上下文压缩:对话过长时进行总结
- 记忆管理:记住关键对话内容
优化策略:
- 摘要对话:定期生成对话摘要
- 选择性记忆:只记住重要信息
- 上下文轮换:动态调整对话上下文
2. ⭐ 游戏状态管理
应用描述 :
通过Token管理游戏状态信息。
核心功能:
- 状态编码:将游戏状态编码为Token
- 状态存储:存储历史状态
- 状态检索:快速检索相关状态
优化策略:
- 状态压缩:减少状态表示的Token数量
- 状态索引:建立状态索引便于检索
- 状态清理:清理过期状态
3. ⭐ 游戏文档处理
应用描述 :
通过上下文窗口处理游戏文档。
核心功能:
- 文档分块:将长文档分块处理
- 检索增强:使用RAG技术
- 摘要生成:生成文档摘要
优化策略:
- 分块策略:按章节或主题分块
- 向量检索:快速找到相关文档
- 摘要优化:生成高质量摘要
4. ⭐ 游戏AI推理
应用描述 :
通过上下文窗口进行游戏AI推理。
核心功能:
- 局势分析:分析当前游戏局势
- 策略生成:生成游戏策略
- 决策推理:基于上下文进行决策
优化策略:
- 上下文选择:选择相关上下文
- 推理压缩:减少推理过程的Token消耗
- 结果优化:优化推理结果的表示
五、Token和上下文窗口的最佳实践
1. ⭐ 成本控制
原则:
- 精简Prompt:使用简洁明确的指令
- 避免长上下文:只提供必要信息
- 使用缓存:缓存频繁使用的内容
示例:
❌ 冗长的Prompt:
"请帮我写一篇关于人工智能在游戏开发中应用的详细文章,包含历史背景、技术原理、实际案例、未来展望等各个方面,字数要求3000字以上..."
❌ 精简的Prompt:
"写一篇3000字文章,主题:AI在游戏开发中的应用,要求包含3个实际案例。"
2. ⭐ 上下文管理
原则:
- 定期总结:对话过长时进行总结
- 选择性保留:只保留关键信息
- 动态调整:根据需求调整上下文
策略:
- 摘要机制:自动生成对话摘要
- 重要性评分:为信息打分保留重要信息
- 时间衰减:旧信息权重降低
3. ⭐ 性能优化
原则:
- 批量处理:批量处理多个请求
- 流式输出:使用流式输出减少等待时间
- 并发控制:控制并发请求数量
技术:
- 连接池:复用API连接
- 缓存机制:缓存常用结果
- 异步处理:异步处理长任务
4. ⭐ 错误处理
原则:
- Token超限:处理上下文窗口超限
- 响应超时:处理API响应超时
- 费用超支:监控和控制费用
策略:
- 预警机制:设置Token使用预警
- 降级方案:超限时使用简化版本
- 日志记录:记录Token使用情况
六、Token和上下文窗口的未来趋势
1. ⭐ 更大的上下文窗口
模型上下文窗口持续增长,从几K到百万Token。
2. ⭐ 更高效的Token化
新的分词算法,更高效的Token表示。
3. ⭐ 动态上下文管理
AI自动管理上下文,优化资源使用。
4. ⭐ 多模态Token
支持文本、图像、音频的统一Token表示。
总结
- 核心概念:Token是模型处理的基本单位,上下文窗口是模型能处理的最大Token数量
- 计算方式:Token计数、成本计算、上下文管理
- 游戏应用:NPC对话、游戏状态、文档处理、AI推理
- 最佳实践:成本控制、上下文管理、性能优化、错误处理
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)