mcpField
C
cognitive-scaffolding

cognitive-scaffolding

github.com/itallstartedwithaideaAgent 工作流4479 次安装28 周前更新
代码仓库

关于 cognitive-scaffolding

cognitive-scaffolding 是一份 Agent Skills 指南,依据首因、近因和分块等注意力规律组织 Agent 上下文。它帮助开发者将规则、当前任务和参考资料安排到不同区域。

主要功能

  1. 01按注意力划分上下文区域
  2. 02将关键信息置于首尾
  3. 03使用分隔符分块内容
  4. 04按重要性安排信息位置

适用场景

  1. 01提升长上下文中的指令关注度
  2. 02组织多文档推理所需资料
  3. 03调整 Agent 对参考数据的利用

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/itallstartedwithaidea/agent-skills --skill cognitive-scaffolding

安装后在 Claude Code 中输入/cognitive-scaffolding确认已加载。

详细介绍

认知脚手架

Agent Skills™ 项目的一部分,由 googleadsagent.ai™ 提供

描述

认知脚手架运用认知科学原理——首因效应、近因偏差、分块和注意力分配——来组织 Agent 的上下文窗口。语言模型和人类的工作记忆一样,并非均匀处理信息。放在上下文开头和结尾的信息会获得不成比例的关注(首因效应和近因效应),而位于中间的内容可能实际上难以被注意到。认知脚手架利用这些特性,确保最关键信息获得模型的最大关注。

这项技能是在 googleadsagent.ai™ 的 Buddy™ Agent 上经过大量实验开发的。实验发现,仅仅重新组织上下文窗口中的信息,就能让分析准确率得到可衡量的提升。将广告系列表现数据放在提示词中的策略性位置,比随意放置相同数据能产生显著更好的建议。同样的原则也适用于代码上下文、文档,以及 Agent 必须推理的任何其他信息。

认知脚手架框架将上下文划分为四个区域:锚点区(上下文的前 5%——关注度最高,用于身份信息和不可更改的规则)、前景区(最后 20%——关注度高,用于当前任务和近期上下文)、结构化中间区(60%——关注度适中,划分为清晰界定的内容块)和背景区(15%——关注度最低,用于参考资料和备用信息)。每个区域都有特定的内容组织策略,以最大限度地提升模型利用其中信息的能力。

适用场景

  • 即使使用相同的信息,Agent 的准确率仍不稳定
  • 与较短的交互相比,较长的上下文窗口会降低性能
  • Agent 偶尔会忽略关键指令或约束
  • 需要提供大量参考数据,但又不想让 Agent 应接不暇
  • 多文档推理需要 Agent 关注特定章节
  • 正在针对特定模型架构优化 Agent 行为

工作原理

graph LR
    subgraph "Context Window"
        A[Anchor Zone<br/>5% - Highest Attention<br/>Identity, Rules] --> B[Structured Middle<br/>60% - Chunked Data<br/>Delimited Sections]
        B --> C[Background Zone<br/>15% - Reference<br/>Fallback Material]
        C --> D[Foreground Zone<br/>20% - Current Task<br/>Recent Messages]
    end
    
    E[Primacy Effect] -.-> A
    F[Chunking Theory] -.-> B
    G[Low Attention Region] -.-> C
    H[Recency Effect] -.-> D

该脚手架利用了 Transformer 架构中有充分记录的注意力模式。锚点区利用首因效应——模型会高度关注最早的 Token,因此这里最适合放置身份声明和不可协商的规则。前景区利用近因效应——模型会高度关注最近的 Token,因此这里最适合放置当前任务和近期对话。结构化中间区使用明确的分隔符和标题,创建便于浏览的内容块,以弥补“中间遗失”效应。背景区存放模型可以参考、但无需主动关注的材料。

实现

认知区域构建器:

interface CognitiveZone {
  name: string;
  position: "anchor" | "middle" | "background" | "foreground";
  budgetPercent: number;
  content: string;
  delimiter: string;
}

class CognitiveScaffold {
  private totalBudget: number;
  private zones: Map<string, CognitiveZone> = new Map();

  constructor(totalTokenBudget: number) {
    this.totalBudget = totalTokenBudget;
  }

  setAnchor(content: string): void {
    this.zones.set("anchor", {
      name: "Identity & Rules",
      position: "anchor",
      budgetPercent: 5,
      content,
      delimiter: "",
    });
  }

  addMiddleChunk(name: string, content: string): void {
    const key = `middle_${this.zones.size}`;
    this.zones.set(key, {
      name,
      position: "middle",
      budgetPercent: 0,
      content,
      delimiter: `\n<section name="${name}">\n`,
    });
  }

  setForeground(content: string): void {
    this.zones.set("foreground", {
      name: "Current Task",
      position: "foreground",
      budgetPercent: 20,
      content,
      delimiter: "\n<current_task>\n",
    });
  }

  assemble(): string {
    const sections: string[] = [];
    const anchor = this.zones.get("anchor");
    if (anchor) sections.push(anchor.content);

    const middle = [...this.zones.entries()]
      .filter(([_, z]) => z.position === "middle")
      .map(([_, z]) => `${z.delimiter}${z.content}\n</section>`);
    sections.push(...middle);

    const bg = [...this.zones.entries()]
      .filter(([_, z]) => z.position === "background");
    for (const [_, zone] of bg) {
      sections.push(`<reference name="${zone.name}">\n${zone.content}\n</reference>`);
    }

    const fg = this.zones.get("foreground");
    if (fg) sections.push(`${fg.delimiter}${fg.content}\n</current_task>`);

    return sections.join("\n\n");
  }
}

注意力感知型内容布局:

class AttentionOptimizer:
    """Place content based on importance and model attention patterns."""

    ATTENTION_CURVE = {
        "anchor": 0.95,
        "early_middle": 0.60,
        "deep_middle": 0.40,
        "late_middle": 0.55,
        "foreground": 0.90,
    }

    def optimize_placement(self, items: list[dict]) -> list[dict]:
        """Sort items into optimal positions based on importance score."""
        sorted_items = sorted(items, key=lambda x: x["importance"], reverse=True)
        zones = {zone: [] for zone in self.ATTENTION_CURVE}
        zone_order = sorted(self.ATTENTION_CURVE.keys(), key=lambda z: self.ATTENTION_CURVE[z], reverse=True)

        for item in sorted_items:
            best_zone = min(zone_order, key=lambda z: abs(self.ATTENTION_CURVE[z] - item["importance"]))
            zones[best_zone].append(item)

        placement = []
        for zone in ["anchor", "early_middle", "deep_middle", "late_middle", "foreground"]:
            for item in zones[zone]:
                placement.append({**item, "zone": zone, "expected_attention": self.ATTENTION_CURVE[zone]})
        return placement

结构化数据的分块策略:

def chunk_for_middle_zone(data: list[dict], chunk_size: int = 5) -> list[str]:
    """Break data into cognitively manageable chunks with clear boundaries."""
    chunks = []
    for i in range(0, len(data), chunk_size):
        batch = data[i:i + chunk_size]
        header = f"--- Chunk {i // chunk_size + 1} of {(len(data) + chunk_size - 1) // chunk_size} ---"
        body = "\n".join(format_item(item) for item in batch)
        summary = f"Summary: {len(batch)} items, key values: {extract_key_values(batch)}"
        chunks.append(f"{header}\n{body}\n{summary}")
    return chunks


def build_scaffolded_prompt(task, data, rules):
    scaffold = CognitiveScaffold(total_token_budget=150000)

    scaffold.set_anchor(f"""You are Buddy™, a Google Ads analysis agent.
RULES (always enforced):
{chr(10).join(f'- {r}' for r in rules)}""")

    for i, chunk in enumerate(chunk_for_middle_zone(data)):
        scaffold.add_middle_chunk(f"data_chunk_{i}", chunk)

    scaffold.set_foreground(f"""CURRENT TASK:
{task}

Analyze the data in the sections above and provide your recommendation.""")

    return scaffold.assemble()

最佳实践

  1. 将不可妥协的规则放在锚定区 — 系统身份、安全约束和输出格式规则应放在上下文的前 5% 中,此处首因效应最强。
  2. 让当前任务始终处于前景 — 用户的实际请求和最近的消息应作为模型生成内容前看到的最后一部分。
  3. 用明确的分隔符划分中间内容 — 使用 XML 标签、Markdown 标题或章节边界,在“中间遗失”区域创建便于浏览的结构。
  4. 为每个内容块添加摘要 — 在每个中间内容块末尾添加一行摘要,为模型提供检索线索,无需重新阅读整个内容块。
  5. 通过实证衡量注意力 — 将数据放在不同位置,用同一个问题进行测试,以量化特定模型的注意力曲线。
  6. 避免把关键信息只放在中间 — 如果信息对任务至关重要,就应放在锚定区或前景区,而不能只放在中间区域。
  7. 根据内容类型调整分块方式 — 代码文件按函数或类分块,数据表按行组分块,文档按章节分块;一刀切的分块方式并非最优。
  8. 通过重复强化指令 — 对于很长的上下文,应在锚定区和前景区的边界处都重复关键指令。

平台兼容性

特性Claude CodeCursorCodexGemini CLI
上下文结构化✅ 完全支持✅ 完全支持✅ 完全支持✅ 完全支持
XML 分隔符✅ 首选✅ 支持✅ 支持✅ 支持
Token 预算控制✅ 完全支持✅ 完全支持✅ 完全支持✅ 完全支持
注意力优化✅ 针对 Claude 调优✅ 取决于模型✅ 取决于模型✅ 针对 Gemini 调优
基于区域的组装✅ 完全支持✅ 完全支持✅ 完全支持✅ 完全支持

相关技能

  • 上下文工程 - Token 预算执行与压缩,适用于认知脚手架区域
  • 提示词架构 - 三层提示词设计,可直接映射到认知脚手架的锚定区和前景区
  • 会话考古 - 挖掘过往会话,通过实证校准注意力曲线和区域有效性

关键词

认知脚手架、首因效应、近因偏差、分块、注意力分配、工作记忆、上下文结构、中间遗失、信息放置、Agent 技能


© 2026 googleadsagent.ai™ | Agent Skills™ | MIT License

评论

支持 Markdown