一、为什么上下文管理如此重要?
使用AI时,你一定遇到过这些问题:聊到第10轮,AI"忘记"了前面说的内容;长文档分析时,AI截断了关键信息;多轮对话后,AI的回答开始"跑偏"。
这些问题的根源都是上下文管理不当。大模型的上下文窗口有限(4K-200K tokens),如何高效利用这个窗口,直接决定了AI应用的质量和成本。
主流模型的上下文窗口对比
| 模型 | 上下文窗口 | 约等于 | 输入价格(/百万token) |
|---|---|---|---|
| GPT-4o | 128K tokens | 约25万字 | $2.50 |
| Claude 3.5 Sonnet | 200K tokens | 约40万字 | $3.00 |
| Gemini 1.5 Pro | 1M tokens | 约200万字 | $3.50 |
| DeepSeek V3 | 128K tokens | 约25万字 | ¥1.00 |
| Qwen 2.5 | 128K tokens | 约25万字 | ¥2.00 |
二、3种核心上下文管理策略
策略1:滑动窗口(Sliding Window)
最简单的方法——只保留最近N轮对话,适合聊天机器人等场景:
class SlidingWindowMemory:
def __init__(self, max_turns=10):
self.max_turns = max_turns
self.messages = []
def add(self, role, content):
self.messages.append({"role": role, "content": content})
if len(self.messages) > self.max_turns * 2:
self.messages = self.messages[2:] # 删除最早1轮
def get_context(self):
return self.messages
# 使用示例
memory = SlidingWindowMemory(max_turns=10)
memory.add("user", "帮我写一个Python爬虫")
memory.add("assistant", "好的,我来帮你...")
context = memory.get_context() # 只返回最近10轮
优点:实现简单,Token成本可控。缺点:会丢失早期重要信息。
策略2:摘要压缩(Summary Compression)
定期将旧对话压缩成摘要,释放Token空间:
import openai
class SummaryMemory:
def __init__(self, summary_threshold=8):
self.messages = []
self.summary = ""
self.threshold = summary_threshold
def add(self, role, content):
self.messages.append({"role": role, "content": content})
if len(self.messages) >= self.threshold * 2:
self._compress()
def _compress(self):
old = self.messages[:-4] # 保留最近2轮
prompt = f"将以下对话压缩为简洁摘要,保留关键信息:\n{old}"
resp = openai.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}]
)
self.summary = resp.choices[0].message.content
self.messages = self.messages[-4:]
def get_context(self):
ctx = []
if self.summary:
ctx.append({"role": "system",
"content": f"之前的对话摘要:{self.summary}"})
ctx.extend(self.messages)
return ctx
策略3:向量记忆(Vector Memory)
将所有对话存入向量数据库,按相关性检索:
from chromadb import Client
from openai import OpenAI
class VectorMemory:
def __init__(self):
self.client = Client()
self.col = self.client.create_collection("chat_memory")
self.openai = OpenAI()
self.idx = 0
def _embed(self, text):
resp = self.openai.embeddings.create(
model="text-embedding-3-small", input=text
)
return resp.data[0].embedding
def add(self, role, content):
self.col.add(
ids=[str(self.idx)],
embeddings=[self._embed(content)],
documents=[content],
metadatas=[{"role": role}]
)
self.idx += 1
def recall(self, query, k=5):
results = self.col.query(
query_embeddings=[self._embed(query)], n_results=k
)
return results["documents"][0]
# 使用:100轮对话后仍能精准回忆
memory = VectorMemory()
memory.add("user", "我的项目用的是FastAPI + PostgreSQL")
relevant = memory.recall("数据库选型建议") # 返回相关历史
三、7个实用上下文管理技巧
技巧1:System Prompt预设关键信息
system_prompt = """
用户背景:
- 技术栈:Python + FastAPI + PostgreSQL
- 部署环境:Docker + 阿里云ECS
- 项目阶段:MVP开发中
- 团队规模:3人
回答技术问题时请基于以上背景。
"""
技巧2:关键信息显式重复
# 每隔3轮注入关键上下文
if turn_count % 3 == 0:
user_msg = f"[提醒:项目用FastAPI+PostgreSQL,正在开发用户模块] {user_msg}"
技巧3:Function Calling存储结构化信息
functions = [{
"name": "save_user_preference",
"description": "保存用户的偏好或关键信息",
"parameters": {
"type": "object",
"properties": {
"key": {"type": "string"},
"value": {"type": "string"}
}
}
}]
# AI自动调用保存重要信息,下次注入
技巧4:分层上下文架构
context = {
"L0_system": system_prompt, # 永久有效
"L1_project": project_context, # 项目级,很少变
"L2_session": session_summary, # 会话级,每轮更新
"L3_recent": recent_messages, # 最近N轮原始对话
"L4_relevant": vector_recall(query) # 按需检索
}
技巧5:Token计数与自动裁剪
import tiktoken
def count_tokens(messages, model="gpt-4o"):
enc = tiktoken.encoding_for_model(model)
return sum(len(enc.encode(m["content"])) for m in messages)
def trim_context(messages, max_tokens=100000):
while count_tokens(messages) > max_tokens:
messages.pop(1) # 保留system prompt
return messages
技巧6:对话分段与主题追踪
class TopicTracker:
def __init__(self):
self.topics = [] # [{topic, summary, messages}]
self.current = None
def detect_change(self, msg):
# 用AI判断是否切换话题
# 切换时保存当前话题摘要
pass
def get_topic_context(self, topic):
# 返回特定话题的历史上下文
pass
技巧7:用户画像动态更新
user_profile = {
"tech_level": "intermediate", # 通过对话动态判断
"preferred_style": "code_first", # 喜欢先看代码
"common_errors": ["忘记异常处理", "变量命名不规范"],
"project_context": {} # 动态更新
}
四、不同场景的策略推荐
| 场景 | 推荐策略 | Token预算 | 关键点 |
|---|---|---|---|
| 客服机器人 | 滑动窗口 + 用户画像 | 4K-8K | 保留用户基本信息和当前问题 |
| 代码助手 | 向量记忆 + 代码上下文 | 32K-64K | 相关代码片段 + 项目结构 |
| 写作助手 | 摘要压缩 + 大纲注入 | 16K-32K | 文章大纲 + 最近几段 |
| 数据分析 | 分层上下文 | 64K-128K | 数据Schema + 分析目标 |
| AI Agent | 向量记忆 + 任务状态 | 32K-128K | 任务规划 + 执行历史 + 工具结果 |
💡 核心原则:上下文管理的本质是"在有限的Token窗口里,放入最有价值的信息"。不同场景需要不同的策略组合,没有银弹。掌握这7种方法,你的AI应用质量将大幅提升。