源文件:chapter2/context-compression/README.md 上下文压缩策略实验 本项目演示并对比 LLM Agent 的不同上下文压缩策略,以"研究 OpenAI 联合创始人当前去向"这一任务作为测试用例。 概览 随着 LLM 上下文窗口越来越大(128K+ token),高效地管理上下文对以下方面变得至关重要: 成本优化 — 减少 token 用量 性能 — 更快的响应速度 可靠性 — 避免上下文溢出错误 相关性 — 聚焦重要信息 本实验实现并对比了 6 种上下文压缩策略,以理解它们各自的取舍。
源文件:chapter2/context-compression/README.md
本项目演示并对比 LLM Agent 的不同上下文压缩策略,以"研究 OpenAI 联合创始人当前去向"这一任务作为测试用例。
随着 LLM 上下文窗口越来越大(128K+ token),高效地管理上下文对以下方面变得至关重要:
本实验实现并对比了 6 种上下文压缩策略,以理解它们各自的取舍。
cd chapter2/context-compression
pip install -r requirements.txt
cp env.example .env # Edit .env with your API keys
所需 API Key:
MOONSHOT_API_KEY:用于 Kimi(Moonshot)模型(必需)。书中实验 2-9 使用 Kimi K3(一款推理CONTEXT_WINDOW_SIZE 把上下文预算刻意限制在.env 中的 MODEL_NAME 或 -m/--model CLI 参数kimi-k2.5、kimi-k3、moonshot-v1-128k)。OPENROUTER_API_KEY:通用回退。未设置 MOONSHOT_API_KEY 时,只要配置了OPENROUTER_API_KEY,实验会自动改走 OpenRouter(kimi-* 映射为moonshotai/kimi-k2)。设置了 MOONSHOT_API_KEY 时行为完全不变。SERPER_API_KEY:用于网络搜索(可选,未提供时会使用模拟数据)获取 API Key:
| 脚本 | 用途 | 产出 |
|---|---|---|
main.py |
交互式 demo / 单策略运行器 | 控制台输出 |
experiment.py |
自动化策略对比(token / 压缩率 / 成功率表) | 结果写入 results/ |
run_all_strategies.py |
带详细逐轮日志运行策略 | 日志写入 logs/ |
quickstart.py |
检查环境并启动上述脚本的菜单封装 | 控制台输出 |
三个主入口都提供 argparse CLI(中文 --help)。用 -h 运行任一脚本可查看完整选项列表。以下三个最常用的参数是共用的:
-s/--strategy — 选择要运行的一种或多种策略(默认全部 6 种);取值见下方"Compression Strategies"或运行 --list-strategies-m/--model — 覆盖模型名(默认读取环境变量 MODEL_NAME)-n/--max-iterations — 每个策略允许的最大工具调用轮数--strategy 接受的策略别名:no_compression、individual、combined、context_aware、citations、windowed。
对比全部 6 种策略(默认),或其中一部分:
python experiment.py # 运行全部 6 种策略并生成对比表 python experiment.py -s context_aware # 只运行"上下文感知压缩" python experiment.py -s individual combined # 只对比两种非任务感知策略 python experiment.py -m moonshot-v1-128k -o results/run.json # 换模型 + 指定输出路径 python experiment.py --list-strategies # 查看可选策略名
这会:
results/experiment_TIMESTAMP.json(或 -o/--output 指定的路径)关键参数:-s/--strategy、-m/--model、-o/--output、-n/--max-iterations、--streaming、--list-strategies。
带详细日志和压缩输出运行策略:
python run_all_strategies.py # 全部 6 种策略 python run_all_strategies.py -s windowed # 只跑自适应窗口化 python run_all_strategies.py --log-dir logs/k2 -m kimi-k2.5
特性:
<log-dir>/strategy_run_TIMESTAMP.log<log-dir>/strategy_results_TIMESTAMP.json关键参数:-s/--strategy、-m/--model、--log-dir、-n/--max-iterations、--list-strategies。
带流式输出测试单个策略:
python main.py # Interactive: choose a strategy at the prompt python main.py -s citations # Run a specific strategy non-interactively python main.py -s windowed --no-streaming # Disable streaming output
特性:
-s/--strategy)--no-streaming 可关闭)from agent import ResearchAgent from compression_strategies import CompressionStrategy # Create agent with specific strategy agent = ResearchAgent( api_key="your_api_key", compression_strategy=CompressionStrategy.CONTEXT_AWARE_CITATIONS, enable_streaming=True ) # Execute research result = agent.execute_research() # Access results if result['success']: print(result['final_answer']) print(f"Tool calls: {len(result['trajectory'].tool_calls)}")
context-compression/ ├── config.py # Configuration management ├── web_tools.py # Web search and fetch tools ├── compression_strategies.py # Compression strategy implementations ├── agent.py # Main research agent with streaming ├── experiment.py # Experiment runner for comparisons (CLI) ├── run_all_strategies.py # Detailed per-round logging runner (CLI) ├── main.py # Interactive demo / single strategy runner (CLI) ├── quickstart.py # Menu wrapper (env check + launcher) ├── requirements.txt # Python dependencies ├── env.example # Environment variables template ├── logs/ # Detailed logs (created by run_all_strategies.py) └── results/ # Experiment results (created on run)
web_tools.py)compression_strategies.py)agent.py)experiment.py)基于各压缩策略:
以下数字来自一次真实的端到端运行——没有模拟数据。每种策略都使用了
实时 Serper 网络搜索(抓取并爬取真实的 2026 年网页)以及当前的
Moonshot 推理模型。
kimi-k3(Moonshot 推理模型;真实窗口约 1M token,但 demo 把CONTEXT_WINDOW_SIZE = 128000)google.serper.dev)网络搜索 + 页面爬取MAX_ITERATIONS=15 · 原始 JSON:results/kimi_k3_real_20260718.json各列含义:Tokens = 累计 Kimi API token 用量(所有迭代的 prompt + completion);
Compress = 压缩后字符数 / 原始字符数(越小 = 压得越狠);
Overflows = 128K 预算被接近/超出的次数。
| # | Strategy | Success | Iterations | Tokens | Compress | Overflows | Time |
|---|---|---|---|---|---|---|---|
| 1 | no_compression |
❌ (overflow at 165,227 tok > 128K) | 5 | 166,043 | 102.1% | 1 | 107s |
| 2 | non_context_aware_individual_summary |
✅ | 12 | 276,608 | 10.9% | 4 | 2980s |
| 3 | non_context_aware_combined_summary |
✅ | 10 | 93,449 | 4.3% | 0 | 1189s |
| 4 | context_aware_summary |
✅ | 7 | 40,157 | 3.0% | 0 | 967s |
| 5 | context_aware_with_citations |
✅ | 10 | 222,992 | 4.1% | 3 | 1235s |
| 6 | windowed_context |
✅ | 7 | 174,601 | 102.4% | 4 | 867s |
说明:
编辑 .env 或 config.py:
MODEL_NAME:使用的 LLM 模型(默认:kimi-k3)MODEL_TEMPERATURE:响应随机性(默认:0.3)MAX_ITERATIONS:最大工具调用次数(默认:50)MAX_WEBPAGE_LENGTH:每页最大字符数(默认:50000)SUMMARY_MAX_TOKENS:摘要最大 token 数(默认:500)CONTEXT_WINDOW_SIZE:demo 用于触发溢出/压缩的上下文预算(默认:128000;注意 Kimi K3 真实窗口约 1M token——这里故意用更小的预算以触发压缩)若未设置 SERPER_API_KEY,系统会使用模拟数据,让你无需网络搜索即可测试压缩策略。
若在使用"不压缩"以外的策略时遇到上下文溢出,可尝试:
MAX_WEBPAGE_LENGTHSUMMARY_MAX_TOKENSnum_results 限制搜索结果数MAX_ITERATIONS 以加快实验实验使用了一个具体的研究任务:
"Find the current affiliations of all OpenAI co-founders"
这个任务很理想,因为它:
新增压缩策略:
CompressionStrategy 枚举中添加策略ContextCompressor 类中实现compress_search_results() 中添加处理更换研究任务:
agent.py 中的系统提示web_tools.py 中的模拟数据本项目是 AI Agent 实战训练课程的一部分,用于教学目的。