Skip to content

上下文工程(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 总结早期对话,节省 Token

LangChain - 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)
文档分析分章节处理,不要一次传整本书

相关资源