📖 定义
Context Window(上下文窗口)是指AI模型在单次交互中能够处理的最大Token数量。它决定了模型能够"记住"多少对话历史和输入内容。
例如:一个32K上下文的模型,一次对话最多可以处理约32,000个Token(约24,000个英文单词或16,000个中文字)。
⚙️ 原理
工作方式
- 输入文本被转换为Token序列
- 模型使用注意力机制处理整个Token序列
- 超出窗口的Token会被截断,无法被模型访问
技术挑战
- 计算复杂度:Attention机制复杂度为O(n²),窗口越大计算量越大
- 显存限制:长上下文需要大量GPU显存
- 位置编码:需要特殊的位置编码处理长序列
💡 主流模型上下文窗口
| 模型 | 上下文窗口 | 备注 |
|---|---|---|
| GPT-4 | 8K / 32K / 128K | 128K版本为GPT-4 Turbo |
| Claude 3 | 200K | 目前最长之一 |
| Gemini 1.5 | 1M / 2M | 支持超长上下文 |
| LLaMA 3 | 8K | 开源模型 |
| Mistral 8x7B | 32K | 开源支持较长上下文 |
💡 应用场景
- 长文档分析:总结长篇文章、报告
- 代码库理解:分析整个代码文件
- 多轮对话:保持长时间对话上下文
- 知识库问答:检索增强生成(RAG)
💻 代码示例
# 计算是否超出上下文窗口
import tiktoken
def count_tokens(text, model="gpt-4"):
enc = tiktoken.get_encoding("cl100k_base")
return len(enc.encode(text))
def truncate_to_context(messages, max_tokens, model="gpt-4"):
"""将消息列表截断到指定上下文限制"""
enc = tiktoken.get_encoding("cl100k_base")
# 计算总token数
total = 0
truncated = []
for msg in reversed(messages):
content = msg["content"]
tokens = len(enc.encode(content))
if total + tokens <= max_tokens:
truncated.insert(0, msg)
total += tokens
else:
# 截断内容
remaining = max_tokens - total
if remaining > 0:
truncated_content = enc.decode(enc.encode(content)[:remaining])
truncated.insert(0, {**msg, "content": truncated_content})
break
return truncated
# 使用示例
messages = [
{"role": "system", "content": "你是一个AI助手"},
{"role": "user", "content": "请分析这段代码..." * 1000}, # 假设很长
{"role": "assistant", "content": "好的,我来帮你分析..."},
{"role": "user", "content": "继续"}
]
truncated = truncate_to_context(messages, max_tokens=8000)
print(f"截断后保留 {len(truncated)} 条消息")