前置知识: 大语言模型

上下文工程

00:00
3 min Intermediate

理解上下文工程的核心原则,包括上下文窗口管理、信息排序和检索策略

上下文工程

提示工程关注”怎么问”,上下文工程关注”给什么信息”。在有限的上下文窗口中放入最相关的信息,按最优顺序排列——这就是上下文工程。

类型 概念 前置条件 Phase 11 Lesson 01(提示工程预计时间 ~45 分钟

学习目标

  • 理解上下文窗口物理限制和利用策略
  • 掌握信息排序原则:最重要的放前
  • 理解上下文压缩和摘要技术
  • 掌握检索策略:何时检索、检索

上下文窗口

模型上下文窗口等于
GPT-4o128K tokens~96K / ~300 页
Claude Sonnet200K tokens~150K
Gemini 1.5 Pro1M tokens~750K

但更大的窗口不等于更好的效果研究表明,模型上下文中间信息注意力下降”——Lost in the Middle 效应。

信息排序原则

[系统提示]        ← 最高优先级,始终在开头
[工具定义]        ← 高优先级,结构化信息
[少样本示例]      ← 高优先级,行为引导
[检索到的文档]    ← 中优先级,按相关性排序
[对话历史]        ← 低优先级,可截断
[当前用户消息]    ← 必须在最后

关键原则 最重要的信息放在上下文的开和结尾,中间位置的信息最容易被忽略。

上下文压缩

def compress_context(documents, query, max_tokens=4000):
    """压缩上下文:保留最相关的部分"""
    compressed = []
    total_tokens = 0

    # 按相关性排序
    scored_docs = [(doc, relevance_score(doc, query)) for doc in documents]
    scored_docs.sort(key=lambda x: x[1], reverse=True)

    for doc, score in scored_docs:
        doc_tokens = estimate_tokens(doc)
        if total_tokens + doc_tokens > max_tokens:
            # 截断文档
            remaining = max_tokens - total_tokens
            if remaining > 100:
                truncated = doc[:remaining * 4]  # 粗略估计
                compressed.append(truncated)
            break
        compressed.append(doc)
        total_tokens += doc_tokens

    return compressed

对话历史管理

class ConversationManager:
    """对话历史管理器"""

    def __init__(self, max_history_tokens=8000):
        self.max_tokens = max_history_tokens
        self.messages = []

    def add(self, role, content):
        """添加消息"""
        self.messages.append({"role": role, "content": content})
        self._trim_if_needed()

    def _trim_if_needed(self):
        """如果超出限制,截断早期对话"""
        while self._estimate_total_tokens() > self.max_tokens and len(self.messages) > 2:
            # 保留系统消息和最近的对话
            self.messages.pop(1)  # 移除最早的用户消息
            if len(self.messages) > 1:
                self.messages.pop(1)  # 移除对应的助手消息

    def get_messages(self):
        """获取当前消息列表"""
        return self.messages.copy()

    def _estimate_total_tokens(self):
        return sum(len(m['content']) * 0.75 for m in self.messages)

关键术语

术语通俗说法实际含义
上下文工程”选什么信息给模型”管理优化输入给 LLM 的信息内容和顺序
Lost in the Middle中间遗忘”模型上下文中间位置信息注意力下降的现象
上下文压缩”精简信息在有限的 token 预算内保留相关信息

延伸阅读

知识检测

学习进度

-- 已学文档
--% 知识覆盖率

学习推荐

专注模式