主题
上下文工程(Context Engineering)
上下文工程是研究如何高效利用 LLM 的上下文窗口(Context Window),让模型获得最相关的信息并给出最佳回答的技术。
什么是上下文窗口
上下文窗口 = LLM 一次能处理的最大 Token 数
GPT-4o:128K tokens ≈ 约 10 万字
Claude 3.5:200K tokens ≈ 约 15 万字
Gemini 1.5 Pro:1M tokens ≈ 约 75 万字上下文窗口里的所有内容都会参与计算,因此:
- 内容越多,成本越高,速度越慢
- 无关内容会干扰模型,降低回答质量
- 关键信息可能被"稀释"
上下文工程的核心问题
问题 1:上下文太长(超窗口)→ 截断开头,丢失信息
问题 2:上下文太短(信息不足)→ 模型回答质量差
问题 3:上下文有噪声(无关信息)→ 模型分心,效果差核心技巧
1. 信息密度优化
去掉上下文中无关的内容:
差(啰嗦):
"你好,我是一名前端开发者,最近在学习 React,
遇到了一个问题,就是..."
好(简洁):
"React useEffect 清理函数不执行,代码如下:..."2. 关键信息前置(Lost in the Middle)
研究发现,LLM 对上下文的开头和结尾内容记忆最好,中间内容容易"丢失":
重要信息放开头或结尾,不要在中间埋没python
# 优化前(重要指令在中间)
context = f"""
对话历史:{history}
请只用中文回答
用户问题:{question}
不要超过 200 字
"""
# 优化后(指令放开头和结尾)
context = f"""
[指令] 请只用中文回答,不超过 200 字
对话历史:{history}
用户问题:{question}
[指令] 记住:只用中文,不超过 200 字
"""3. Few-Shot 示例放最后
让 LLM 模仿示例,把示例放在问题前面(最近原则):
[系统提示]
[少量示例 1]
[少量示例 2]
[少量示例 3]
[当前问题] ← LLM 会优先参考最近的示例4. 上下文压缩(Context Compression)
当上下文太长时,用 LLM 自己来压缩:
python
# 用 LLM 总结对话历史,再作为上下文
summary_prompt = f"总结以下对话的关键信息:\n{history}"
summary = llm(summary_prompt)
# 用压缩后的 summary 代替完整 history
context = f"历史摘要:{summary}\n当前问题:{question}"5. 分块检索(RAG)
不要一次性把所有资料都塞进上下文,先检索最相关的:
python
# 差:把所有文档都放进上下文
context = "\n".join(all_docs) # 可能超长
# 好:先检索最相关的 5 段
relevant_docs = vector_db.search(query, k=5)
context = "\n".join(relevant_docs)长上下文模型的使用技巧
即使模型支持长上下文(如 Claude 200K),也不意味着你应该填满它:
上下文长度 → 成本 → 速度 → 效果
填满 200K:
- 成本高(按 Token 计费)
- 速度慢(推理时间长)
- 效果可能反而差(Lost in the Middle)
建议:只放必要信息,控制在 32K 以内上下文管理工具
LangChain - Memory 模块
python
from langchain.memory import ConversationBufferMemory
from langchain.memory import ConversationSummaryMemory
# 方式 1:保留完整历史(短对话)
buffer_memory = ConversationBufferMemory()
# 方式 2:总结历史(长对话)
summary_memory = ConversationSummaryMemory(llm=llm)
# 自动用 LLM 总结早期对话,节省 TokenLangChain - Contextual Compression
python
from langchain.retrievers import ContextualCompressionRetriever
from langchain_cohere import CohereRerank
# 检索后,用 Rerank 模型重新排序,只保留最相关的
compressor = CohereRerank()
compression_retriever = ContextualCompressionRetriever(
base_retriever=vectorstore.as_retriever(),
base_compressor=compressor
)不同场景的上下文策略
| 场景 | 策略 |
|---|---|
| 短对话(< 10 轮) | BufferMemory(保留全部) |
| 长对话(> 10 轮) | SummaryMemory(总结早期) |
| RAG 问答 | 只检索 Top 5 相关片段 |
| 代码生成 | 只引用相关文件和函数(@File) |
| 文档分析 | 分章节处理,不要一次传整本书 |