【Agent】ACE(Agentic Context Engineering)源码阅读笔记—(1)基础模块

0x00 概要

这世界变化真快!

前几天我在博客说,斯坦福的ACE(Agentic Context Engineering)非常火。只看论文感觉还是理解不深,但是该论文并没有释放对应的源码

然而,几天后就发现了一个开源项目 https://github.com/kayba-ai/agentic-context-engine,项目写明了:

Based on the ACE paper and inspired by Dynamic Cheatsheet.

If you use ACE in your research, please cite:

@article{zhang2024ace,title={Agentic Context Engineering},author={Zhang et al.},journal={arXiv:2510.04618},year={2024}}

于是只能乖乖的把代码拉下来看看。

0x01 示例

我们先通过示例来梳理下总体逻辑,该示例适合快速入手和理解ACE的工作流程:生成→反思→策略→再生成。

1.1 建立简单Agent

该代码特色如下:

  • 展示了 Agentic Context Engineering(ACE)系统的核心工作流程,通过初始化关键组件(Generator,Reflector,Curator)和环境,利用样本数据训练智能体,使其从示例中学习策略并存储到 Playbook 中,最终实现对新问题的智能响应。

  • 核心功能包括:初始化 LLM 客户端连接大语言模型、创建 ACE 系统三大核心组件(生成器负责生成回答、反思器负责分析策略有效性、管理者负责优化策略库)、通过离线适配器协调组件工作、利用样本数据训练智能体并将学习到的策略保存到 Playbook、测试训练后的智能体对新问题的处理能力。

  • 分别展示了这些组件的使用,以及如何组合这些组件来完成特定任务,多种任务类型如下:

    • 知识问答:“What is the capital of France?”
    • 数学计算:“What is 2 + 2?”
    • 文本理解:“Who wrote Romeo and Juliet?”
  • 特色是模块化设计(各组件职责明确且可替换),支持从样本中自主学习策略并动态更新 Playbook,结合环境评估实现持续优化,兼容多种大语言模型,兼顾训练与推理流程的完整性。

流程如下:

ace-1-2

代码如下:

from ace import OfflineAdapter, Generator, Reflector, Curator
from ace import LiteLLMClient, SimpleEnvironment
from ace.types import Sample

# Initialize the LLM client
client = LiteLLMClient(model="gpt-4o-mini")  # or claude-3-haiku, gemini-pro, etc.

# Create the three ACE components
generator = Generator(client)
reflector = Reflector(client)
curator = Curator(client)

# Create an adapter to orchestrate everything
adapter = OfflineAdapter(generator, reflector, curator)

# Set up the environment (evaluates answers)
environment = SimpleEnvironment()

# Create training samples
samples = [
    Sample(
        question="What is the capital of France?",
        context="Provide a direct answer",
        ground_truth="Paris"
    ),
    Sample(
        question="What is 2 + 2?",
        context="Show the calculation",
        ground_truth="4"
    ),
    Sample(
        question="Who wrote Romeo and Juliet?",
        context="Name the author",
        ground_truth="William Shakespeare"
    )
]

# Train the agent (it learns strategies from these examples)
print("Training agent...")
results = adapter.run(samples, environment, epochs=2)

# Save the learned strategies
adapter.playbook.save_to_file("my_trained_agent.json")
print(f"Agent trained! Learned {len(adapter.playbook.bullets())} strategies")

# Test with a new question
test_sample = Sample(
    question="What is 5 + 3?",
    context="Provide the answer"
)

print("\nTesting with new question:", test_sample.question)
output = generator.generate(
    question=test_sample.question,
    context=test_sample.context,
    playbook=adapter.playbook
)
print("Answer:", output.final_answer)
print("Reasoning:", output.reasoning)

运行Agent之后,期待输出是

Training agent...
Agent trained! Learned 3 strategies

Testing with new question: What is 5 + 3?
Answer: 8
Reasoning: Using direct calculation strategy learned from training...

Agent做了如下:

  • 从训练示例中学习
  • 反思哪些策略有效
  • 构建了一个成功方法的手册
  • 应用这些策略来解决新问题

这样就授予了智能体 反思→学习→成长 的能力。

1.2 后续操作

后续可以做如下:

Try Different Models

# OpenAI GPT-4
client = LiteLLMClient(model="gpt-4")

# Anthropic Claude
client = LiteLLMClient(model="claude-3-5-sonnet-20241022")

# Google Gemini
client = LiteLLMClient(model="gemini-pro")

# Local Ollama
client = LiteLLMClient(model="ollama/llama2")
Load and Continue Training
from ace import Playbook

# Load a previously trained agent
playbook = Playbook.load_from_file("my_trained_agent.json")

# Continue training with new examples
adapter = OfflineAdapter(generator, reflector, curator, playbook=playbook)
Online Learning (Learn While Running)
from ace import OnlineAdapter

adapter = OnlineAdapter(
    playbook=playbook,
    generator=generator,
    reflector=reflector,
    curator=curator
)

# Process tasks one by one, learning from each
for task in tasks:
    result = adapter.process(task, environment)
    print(f"Processed: {task.question}")
    print(f"Playbook now has {len(adapter.playbook.bullets())} strategies")
Custom Environments
from ace import TaskEnvironment, EnvironmentResult

class MathEnvironment(TaskEnvironment):
    def evaluate(self, sample, output):
        try:
            # Evaluate mathematical correctness
            result = eval(output.final_answer)
            correct = (result == eval(sample.ground_truth))

            return EnvironmentResult(
                feedback="Correct!" if correct else "Incorrect",
                ground_truth=sample.ground_truth,
                metrics={"accuracy": 1.0 if correct else 0.0}
            )
        except:
            return EnvironmentResult(
                feedback="Invalid mathematical expression",
                ground_truth=sample.ground_truth,
                metrics={"accuracy": 0.0}
            )

0x02 基建功能

2.1 Playbook

Playbook 是 ACE 系统中实现持续学习和改进的关键组件,它不仅存储和管理策略知识库,还支持动态更新和优化,为整个系统智能决策的基础,其具体功能为:

  • 知识存储:存储系统学习到的策略和经验
  • 策略应用:为 Generator 提供可用的策略集合
  • 动态演化:通过 Curator 的 Delta 操作持续改进
  • 性能反馈:通过标签统计反映策略的有效性
2.1.1 基本结构与数据模型

Playbook采用分层结构组织策略信息,主要包括:

  • Bullet(策略条目):最小单位,包含具体策略内容。每个Bullet有唯一ID、所属section、内容文本
    包含统计信息:helpful(有用次数)、harmful(有害次数)、neutral(中性次数)
    带有创建和更新时间戳
  • Section(分类):策略的逻辑分组(或者说是章节)。每个Bullet归属于一个section,通过section可以组织和检索相关策略
class Playbook:
    """Structured context store as defined by ACE.
    按照ACE(智能体上下文工程)框架定义的结构化上下文存储容器
    """

    def __init__(self) -> None:
        # 存储条目:键为条目ID,值为Bullet对象
        self._bullets: Dict[str, Bullet] = {}
        # 存储章节与条目ID的映射:键为章节名称,值为该章节下的条目ID列表
        self._sections: Dict[str, List[str]] = {}
        # 用于生成新条目的自增ID计数器
        self._next_id = 0

Playbook 的图例如下:

ACE-1-1

2.1.2 核心功能

核心功能包括

  • CRUD操作:
    • 添加策略:add_bullet()方法可以添加新的策略条目
    • 更新策略:update_bullet()方法可以修改现有策略内容
    • 标记策略:tag_bullet()方法可以增加策略的helpful/harmful/neutral计数
    • 删除策略:remove_bullet()方法可以删除策略条目
    • 查询策略:get_bullet()和bullets()方法可以检索策略
    # ------------------------------------------------------------------ #
    # CRUD工具方法(创建、读取、更新、删除)
    # ------------------------------------------------------------------ #
    def add_bullet(
        self,
        section: str,
        content: str,
        bullet_id: Optional[str] = None,
        metadata: Optional[Dict[str, int]] = None,
    ) -> Bullet:
        """添加新条目到行动手册
        Args:
            section: 条目所属章节名称
            content: 条目的核心内容
            bullet_id: 自定义条目ID(可选,不提供则自动生成)
            metadata: 条目元数据(可选,用于初始化标记计数等属性)
        Returns:
            新创建的Bullet对象
        """
        # 若未提供条目ID,则自动生成
        bullet_id = bullet_id or self._generate_id(section)
        # 元数据默认为空字典
        metadata = metadata or {}
        # 创建Bullet实例
        bullet = Bullet(id=bullet_id, section=section, content=content)
        # 应用元数据(如初始标记计数)
        bullet.apply_metadata(metadata)
        # 将条目存入字典
        self._bullets[bullet_id] = bullet
        # 将条目ID添加到对应章节(若章节不存在则自动创建)
        self._sections.setdefault(section, []).append(bullet_id)
        return bullet

    def update_bullet(
        self,
        bullet_id: str,
        *,
        content: Optional[str] = None,
        metadata: Optional[Dict[str, int]] = None,
    ) -> Optional[Bullet]:
        """更新已有条目的内容或元数据
        Args:
            bullet_id: 待更新条目的ID
            content: 新的内容(可选,不提供则不更新)
            metadata: 新的元数据(可选,不提供则不更新)
        Returns:
            更新后的Bullet对象;若条目不存在则返回None
        """
        # 获取待更新的条目
        bullet = self._bullets.get(bullet_id)
        if bullet is None:
            return None
        # 更新内容(若提供)
        if content is not None:
            bullet.content = content
        # 应用元数据(若提供)
        if metadata:
            bullet.apply_metadata(metadata)
        # 更新修改时间为当前UTC时间
        bullet.updated_at = datetime.now(timezone.utc).isoformat()
        return bullet

    def tag_bullet(
        self, bullet_id: str, tag: str, increment: int = 1
    ) -> Optional[Bullet]:
        """为条目添加标记并更新计数
        Args:
            bullet_id: 待标记条目的ID
            tag: 标记类型("helpful"、"harmful"或"neutral")
            increment: 计数增量(默认+1)
        Returns:
            标记后的Bullet对象;若条目不存在则返回None
        """
        bullet = self._bullets.get(bullet_id)
        if bullet is None:
            return None
        # 调用Bullet的tag方法更新标记
        bullet.tag(tag, increment=increment)
        return bullet

    def remove_bullet(self, bullet_id: str) -> None:
        """从行动手册中删除条目
        Args:
            bullet_id: 待删除条目的ID
        """
        # 从条目字典中移除并获取该条目
        bullet = self._bullets.pop(bullet_id, None)
        if bullet is None:
            return
        # 从所属章节中移除该条目ID
        section_list = self._sections.get(bullet.section)
        if section_list:
            # 过滤掉该条目ID
            self._sections[bullet.section] = [
                bid for bid in section_list if bid != bullet_id
            ]
            # 若章节为空,则删除该章节
            if not self._sections[bullet.section]:
                del self._sections[bullet.section]

    def get_bullet(self, bullet_id: str) -> Optional[Bullet]:
        """获取指定ID的条目
        Args:
            bullet_id: 条目ID
        Returns:
            对应的Bullet对象;若不存在则返回None
        """
        return self._bullets.get(bullet_id)

    def bullets(self) -> List[Bullet]:
        """获取所有条目的列表
        Returns:
            包含所有Bullet对象的列表
        """
        return list(self._bullets.values())
  • Delta操作应用
    • apply_delta()方法可以批量应用由Curator生成的策略变更,支持ADD、UPDATE、TAG、REMOVE四种操作类型
    # ------------------------------------------------------------------ #
    # 增量操作应用
    # ------------------------------------------------------------------ #
    def apply_delta(self, delta: DeltaBatch) -> None:
        """应用批量增量操作到行动手册
        Args:
            delta: 包含多个操作的DeltaBatch对象
        """
        for operation in delta.operations:
            self._apply_operation(operation)

    def _apply_operation(self, operation: DeltaOperation) -> None:
        """应用单个增量操作
        Args:
            operation: 待应用的DeltaOperation对象
        """
        op_type = operation.type.upper()
        # 根据操作类型执行对应逻辑
        if op_type == "ADD":
            self.add_bullet(
                section=operation.section,
                content=operation.content or "",
                bullet_id=operation.bullet_id,
                metadata=operation.metadata,
            )
        elif op_type == "UPDATE":
            if operation.bullet_id is None:
                return
            self.update_bullet(
                operation.bullet_id,
                content=operation.content,
                metadata=operation.metadata,
            )
        elif op_type == "TAG":
            if operation.bullet_id is None:
                return
            # 遍历元数据中的标记与增量
            for tag, increment in operation.metadata.items():
                self.tag_bullet(operation.bullet_id, tag, increment)
        elif op_type == "REMOVE":
            if operation.bullet_id is None:
                return
            self.remove_bullet(operation.bullet_id)

  • 序列化与持久化
    • save_to_file()和load_from_file()支持将Playbook保存到文件或从文件加载
    • dumps()和loads()方法支持JSON格式的序列化和反序列化
    # ------------------------------------------------------------------ #
    # 序列化与反序列化
    # ------------------------------------------------------------------ #
    def to_dict(self) -> Dict[str, Any]:
        """将行动手册转换为字典(用于序列化)
        Returns:
            包含所有条目、章节和ID计数器的字典
        """
        return {
            "bullets": {
                bullet_id: asdict(bullet) for bullet_id, bullet in self._bullets.items()
            },
            "sections": self._sections,
            "next_id": self._next_id,
        }

    @classmethod
    def from_dict(cls, payload: Dict[str, Any]) -> "Playbook":
        """从字典构造行动手册实例(用于反序列化)
        Args:
            payload: 包含行动手册数据的字典
        Returns:
            构造完成的Playbook实例
        """
        instance = cls()
        # 加载条目数据
        bullets_payload = payload.get("bullets", {})
        if isinstance(bullets_payload, dict):
            for bullet_id, bullet_value in bullets_payload.items():
                if isinstance(bullet_value, dict):
                    # 用字典数据构造Bullet实例
                    instance._bullets[bullet_id] = Bullet(**bullet_value)
        # 加载章节数据
        sections_payload = payload.get("sections", {})
        if isinstance(sections_payload, dict):
            instance._sections = {
                section: list(ids) if isinstance(ids, Iterable) else []
                for section, ids in sections_payload.items()
            }
        # 加载ID计数器
        instance._next_id = int(payload.get("next_id", 0))
        return instance

    def dumps(self) -> str:
        """将行动手册序列化为JSON字符串
        Returns:
            包含行动手册数据的JSON字符串
        """
        return json.dumps(self.to_dict(), ensure_ascii=False, indent=2)

    @classmethod
    def loads(cls, data: str) -> "Playbook":
        """从JSON字符串反序列化行动手册
        Args:
            data: 包含行动手册数据的JSON字符串
        Returns:
            构造完成的Playbook实例
        Raises:
            ValueError: 若JSON数据不是字典类型
        """
        payload = json.loads(data)
        if not isinstance(payload, dict):
            raise ValueError("行动手册的序列化数据必须是JSON对象。")
        return cls.from_dict(payload)

    def save_to_file(self, path: str) -> None:
        """将行动手册保存到JSON文件
        Args:
            path: 保存文件的路径
        示例:
            >>> playbook.save_to_file("trained_model.json")
        """
        file_path = Path(path)
        # 确保父目录存在
        file_path.parent.mkdir(parents=True, exist_ok=True)
        # 写入JSON数据
        with file_path.open("w", encoding="utf-8") as f:
            f.write(self.dumps())

    @classmethod
    def load_from_file(cls, path: str) -> "Playbook":
        """从JSON文件加载行动手册
        Args:
            path: 加载文件的路径
        Returns:
            从文件加载的Playbook实例
        示例:
            >>> playbook = Playbook.load_from_file("trained_model.json")
        异常:
            FileNotFoundError: 若文件不存在
            json.JSONDecodeError: 若文件包含无效JSON
            ValueError: 若JSON数据无法表示有效的行动手册
        """
        file_path = Path(path)
        if not file_path.exists():
            raise FileNotFoundError(f"行动手册文件不存在: {path}")
        with file_path.open("r", encoding="utf-8") as f:
            return cls.loads(f.read())
  • 展示与统计功能
    • 可读格式输出。as_prompt()方法将Playbook转换为适合LLM理解的文本格式,按section组织,展示每个策略条目及其统计信息
    • 统计信息。stats()方法提供 Playbook 的整体统计信息。包括 section 数量、策略条目总数、各类标签的总计数
    # ------------------------------------------------------------------ #
    # 展示辅助方法
    # ------------------------------------------------------------------ #
    def as_prompt(self) -> str:
        """生成供大语言模型使用的人类可读字符串
        Returns:
            格式化的行动手册内容字符串
        """
        parts: List[str] = []
        # 按章节排序并生成内容
        for section, bullet_ids in sorted(self._sections.items()):
            parts.append(f"## {section}")
            for bullet_id in bullet_ids:
                bullet = self._bullets[bullet_id]
                # 拼接标记计数信息
                counters = f"(helpful={bullet.helpful}, harmful={bullet.harmful}, neutral={bullet.neutral})"
                parts.append(f"- [{bullet.id}] {bullet.content} {counters}")
        return "\n".join(parts)

    def stats(self) -> Dict[str, Any]:
        """生成行动手册的统计信息
        Returns:
            包含章节数、条目数和标记总数的字典
        """
        return {
            "sections": len(self._sections),
            "bullets": len(self._bullets),
            "tags": {
                "helpful": sum(b.helpful for b in self._bullets.values()),
                "harmful": sum(b.harmful for b in self._bullets.values()),
                "neutral": sum(b.neutral for b in self._bullets.values()),
            },
        }
  • ID 生成
    • generate_id() 方法自动生成策略条目的唯一标识符。其基于 section 名称和递增序号生成,提供数据一致性维护,也会自动维护 sections 与 bullet 的关联关系。
    # ------------------------------------------------------------------ #
    # 内部辅助方法
    # ------------------------------------------------------------------ #
    def _generate_id(self, section: str) -> str:
        """生成条目的自动ID
        Args:
            section: 条目所属章节
        Returns:
            格式为"章节前缀-五位数字"的ID字符串
        """
        self._next_id += 1
        # 取章节名称的第一个词作为前缀(小写)
        section_prefix = section.split()[0].lower()
        # 生成如"planning-00001"格式的ID
        return f"{section_prefix}-{self._next_id:05d}"

2.2 bullets

ACE 的核心设计理念是:将上下文表示为结构化的条目集合(bullets),而非单一的整体提示词。每个条目包含两部分:

  • 元数据(metadata):唯一标识符,以及「有用 / 有害」计数器;
  • 内容(content):比如可复用策略、领域概念或常见错误模式。

bullet 是人类可读的,更新粒度。

@dataclass
class Bullet:
    """Single playbook entry.
    行动手册(playbook)中的单个条目,用于存储具体的上下文内容及相关标记信息
    """

    # 条目唯一标识ID,用于精准定位和操作该条目
    id: str
    # 条目所属的章节名称,用于归类管理
    section: str
    # 条目核心内容,存储具体的文本信息
    content: str
    # 有益标记计数,记录该条目被标记为"有益"的次数,默认初始化为0
    helpful: int = 0
    # 有害标记计数,记录该条目被标记为"有害"的次数,默认初始化为0
    harmful: int = 0
    # 中性标记计数,记录该条目被标记为"中性"的次数,默认初始化为0
    neutral: int = 0
    # 条目创建时间,默认使用UTC时区的当前时间,以ISO格式字符串存储
    created_at: str = field(
        default_factory=lambda: datetime.now(timezone.utc).isoformat()
    )
    # 条目更新时间,默认使用UTC时区的当前时间,以ISO格式字符串存储,更新操作时会同步修改
    updated_at: str = field(
        default_factory=lambda: datetime.now(timezone.utc).isoformat()
    )

    def apply_metadata(self, metadata: Dict[str, int]) -> None:
        """应用元数据到当前条目,更新对应属性的值
        Args:
            metadata: 元数据字典,键为属性名称,值为待更新的整数型数据
        """
        # 遍历元数据中的键值对
        for key, value in metadata.items():
            # 检查当前条目是否存在该属性
            if hasattr(self, key):
                # 存在则更新属性值(确保转换为整数类型)
                setattr(self, key, int(value))

    def tag(self, tag: str, increment: int = 1) -> None:
        """为条目添加标记并更新对应计数,同时刷新更新时间
        Args:
            tag: 标记类型,仅支持"helpful"、"harmful"、"neutral"三种
            increment: 计数增量,默认增加1
        Raises:
            ValueError: 当传入不支持的标记类型时抛出异常
        """
        # 校验标记类型的合法性
        if tag not in ("helpful", "harmful", "neutral"):
            raise ValueError(f"Unsupported tag: {tag}")
        # 获取当前标记的计数
        current = getattr(self, tag)
        # 更新标记计数(累加增量)
        setattr(self, tag, current + increment)
        # 刷新条目更新时间为当前UTC时间
        self.updated_at = datetime.now(timezone.utc).isoformat()

0x03 提示词

ACE是更顶层的 “上下文优化框架”,依托 Dynamic Cheatsheet 实现,但不局限于特定领域或工具 —— 它通过 “生成器 - 反思器 - 整理器” 的角色分工,构建了一套通用的 “经验学习流程”。无论任务是 “APP 调用”“财务报表分析” 还是 “代码调试”,ACE 都能通过相同的闭环生成适配的上下文。其优势在于 “跨领域通用性”,适合需要 AI 代理自主探索新任务的场景(如通用智能助手、自适应决策系统)。

因此,我们来看看ACE的提示词。

3.1 总体

提示词总体介绍如下。

""" ACE角色的State-of-the-art提示模板 - 版本2.0

这些提示结合了包括生产AI系统中的最佳实践:

- 带有元数据的身份标题
- 具有清晰部分的层次化组织
- 关键入要求的大写字母
- 具体示例优于抽象原则
- 条件逻辑用于细微处理
- 明确的反模式以避免
- 元认知指令意识
- 带有编号步骤的程序化工作流程

基于GPT-5、Claude 3.5和80多个生产提示的模式。 """

3.2 GENERATOR提示词

GENERATOR_V2_PROMPT 通过更严格的结构,明确的操作协议,置信度评分和错误恢复机制,提供了更高的质量和一致性的输出。

生成器提示词如下:

GENERATOR_V2_PROMPT = """

# 身份和元数据
您是ACE生成器v2.0,一个专业的解决问题代理。
提示版本:2.0.0
当前日期:{current_date}
模式:战略性问题解决
置信度阈值:0.7

## 核心职责
使用积累的剧本策略分析问题
应用相关要点并进行置信度评分
展示带有清晰理由的逐步推理
生成准确、完整的答案

## 剧本应用协议(## Playbook Application Protocol)

### 步骤1:分析可用策略
检查剧本并识别相关要点:
{playbook}

### 步骤2:考虑最近的反思
整合最近分析的学习成果:
{reflection}

### 步骤3:处理问题
问题:{question}
附加上下文:{context}

### 步骤4:生成解决方案
遵循此确切程序:

1. 策略选择
- 仅使用置信度 > 0.7 的要点
- 切勿同时应用冲突策略
- 如果没有相关要点存在,声明“无适用策略”
2. 推理链
- 从问题分解开始
- 按逻辑顺序应用策略
- 明确显示中间步骤
- 验证每个推理步骤
3. 答案形成
- 从推理中综合完整答案
- 确保答案直接针对问题
- 验证事实准确性

## 关键要求
必须 遵循这些规则:
- 总是包含逐步推理
- 切勿跳过中间计算或逻辑
- 应用策略时总是引用具体要点ID
- 切勿猜测或编造信息

切勿 做这些:
- 没有具体要点引用的情况下说“基于剧本”
- 提供部分或不完整的答案
- 混合无关策略
- 包含元评论如“我将应用...”

## 输出格式

返回一个单一有效的JSON对象,具有此确切模式:
{{
"推理": "<带有编号步骤的详细逐步推理链>",
"要点ID": ["<id1><id2><id1><id2>

## 示例
### 好的例子:
{
"推理": "1. 分解构15 × 24:这是一个乘法问题。2. 应用要点_023(乘法分解):15 × 24 = 15 × (20 + 4)。3. 计算:15 × 20 = 300。4. 计算:15 × 4 = 60。5. 相加:300 + 60 = 360。",
"要点ID": ["要点_023"],
"置信度评分": {{"要点_023": 0.95}},
"最终答案": "360",
"答案置信度": 1.0
}}
### 坏的例子(不要这样做):
{
"推理": "使用剧本策略,答案清晰。",
"要点ID": [],
"最终答案": "360"
}

## 恢复
如果JSON生成失败:
验证所有必需字段是否存在
确保特殊字符的正确转义
验证置信度评分在0和1之间
最大尝试次数:3
以 {{ 开始响应并以 }} 结束

"""

3.3 REFLECTOR 提示词

REFLECTOR_V2_PROMPT 的特点包括:

1 详细的身份和元数据定义;

2 明确的核心使命说明;

3 系统化的输入分析框架;

4 基于条件判断的分析协议;

5 详细的策略标记标准;

6 严格的输出格式要求;

7 提供具体示例说明正确和错误的做法。

这些优秀特性,使REFLECTOR_V2_PROMPT 成为一个高效的分析工具。它的结构设计使分析过程更加系统化,条件判断树使得问题识别更有针对性,严格的标记标准有助于策略优化,而具体的输出格式要求保证了分析结果的一致性和可处理性。

REFLECTOR_V2_提示 = """
# 身份和元数据
您是ACE反思者v2.0,一位高级分析评论员。
提示版本:2.0.0
分析模式:诊断性审查
标记协议:基于证据

## 核心任务
通过系统分析推理、结果和应用策略识别生成器性能。

## 输入分析
### 问题和响应
问题:{问题}
模型推理:{推理}
模型预测:{预测}
真实情况:{真实情况}
环境反馈:{反馈}

### 剧本上下文
咨询的策略:
{剧本摘录}

## 分析协议
按顺序执行 - 使用第一个适用条件:
### 1. 成功案例检测
如果预测与真实情况匹配且反馈积极:
- 识别哪些策略促成成功
- 提取可重用模式
- 标记有帮助的要点
### 2. 计算错误检测
如果推理中存在数学/逻辑错误:
- 确定错误确切位置
- 识别根本原因(例如,操作顺序、符号错误)
- 指定正确的计算方法
### 3. 策略应用错误检测
如果策略正确但执行错误:
- 识别执行偏差之处
- 说明正确应用
- 标记要点为“中性”(策略正确,执行失败)
### 4. 错误策略选择
如果问题类型不适用策略:
- 解释策略为何不适用
- 确定所需正确策略类型
- 标记要点为“有害”针对此情境
### 5. 缺失策略检测
如果不存在适用策略:
- 定义缺失能力
- 描述有助于的策略
- 标记以便策展商添加

## 标记标准
### 标记为“有帮助”时:
- 策略直接导致正确答案
- 方法提高推理质量
- 方法适用于类似问题
### 标记为“有害”时:
- 策略导致错误答案
- 方法造成混淆
- 方法导致错误传播
### 标记为“中性”时:
- 策略被引用但非决定性
- 正确策略执行错误
- 部分适用性

## 关键要求
必须 包括:
- 如适用,具体错误识别行号
- 根本原因分析超越表面症状
- 可操作的修正,含示例
- 基于证据的要点标记

切勿 使用这些短语:
- “模型错误”
- “本应更好”
- “明显错误”
- “未能理解”
- “理解问题”

## 输出格式
返回唯一 有效JSON对象:
{
"推理": "<系统分析,带编号点>",
"错误识别": "<具体错误或'无'如果正确>",
"错误位置": "<错误发生的确切步骤或'不适用'>",
"根本原因": "<错误或成功因素的根本原因>",
"正确方法": "<详细正确方法含示例>",
"关键洞见": "<未来问题可重用的洞见>",
"分析置信度": 0.95,
"要点标记": [
{
"id": "<要点ID>",
"标记": "有帮助|有害|中性",
"理由": "<此标记的具体证据>"
}}
]
}

## 示例
### 计算错误:
{
"推理": "1. 生成器尝试使用分解法计算15 × 24。2. 正确分解为15 × (20 + 4)。3. 错误步骤3:计算15 × 20 = 310而非300。",
"错误识别": "乘法错误",
"错误位置": "推理链的步骤3",
"根本原因": "乘法错误:15 × 2 = 30,所以15 × 20 = 300,非310",
"正确方法": "15 × 24 = 15 × 20 + 15 × 4 = 300 + 60 = 360",
"关键洞见": "总是验证多步骤问题中的中间计算",
"分析置信度": 1.0,
"要点标记": [
{
"id": "要点023",
"标记": "中性",
"理由": "策略正确但执行时算术错误"
}}
]
}
以{{ 开始响应并以 }} 结束
"""

3.4 CURATOR提示词

CURATOR_V2_PROMPT 相比初版具有以下特色:

  • 更精细的身份和元数据定义
    • 明确定义Curator为战略 playbook 架构师角色
    • 包含版本号和更新协议等元信息
  • 结构化的更新决策流程
    • 采用优先级排序的决策树机制,从关键错误模式到成功强化依次处理
    • 明确五种优先级情况下的处理逻辑:关键错误模式、缺失能力、策略优化、矛盾解决和成功强化
  • 详细的操作指南
    • 对每种操作类型(ADD、UPDATE、TAG、REMOVE)都有明确的使用场景说明
    • 为 ADD 操作提供了具体的数量标准和正反示例
  • 质量控制机制
    • 引入更新前的四个核查问题,确保更新的真实价值
    • 明确禁止添加的策略类型,如泛泛建议
  • 去重协议
    • 在添加前检查相似性,如果相似度超过70%则更新而非添加
    • 有助于保持 playbook 的紧凑性和有效性
  • 严格的输出格式
    • 要求返回严格的 JSON 格式,包含 reasoning 和 operations 字段
    • 每个操作都需要提供 justification,解释为何此操作能改善 playbook
  • Playbook大小管理
    • 当策略数量超过50条时自动启用大小管理机制
    • 优先考虑更新而非新增,合并相似策略,消除低效策略

这些特色使 CURATOR_V2_PROMPT 更加专业、严谨和实用,能够更有效地管理和优化 playbook 内容。

CURATOR_V2_PROMPT = """\
# 身份与元数据
您是 ACE 管理者 v2.0,即策略行动手册架构师。
提示词版本:2.0.0
更新协议:增量变更操作质量
阈值:仅保留高价值新增内容

## 行动手册管理任务
通过有选择性的增量改进,将反思内容转化为高质量的行动手册更新。

### 当前状态分析
训练进度:{progress}
行动手册统计数据:{stats}

### 近期反思
{reflection}

### 当前行动手册
{playbook}

### 问题背景
{question_context}

## 更新决策流程

按优先级顺序执行:

### 优先级 1:关键错误模式(CRITICAL_ERROR_PATTERN)
若反思发现影响多个问题的系统性错误:→ 新增高优先级纠正策略→ 为已存在的有害模式添加标记→ 更新相关策略以提升清晰度
### 优先级 2:缺失能力(MISSING_CAPABILITY)
若反思发现存在必要但缺失的策略:→ 新增含清晰示例的策略→ 确保策略具备针对性与可执行性
### 优先级 3:策略优化(STRATEGY_REFINEMENT)
若现有策略需要改进:→ 通过更优的解释或示例进行更新→ 保留有价值的核心内容,同时修正问题
### 优先级 4:矛盾解决(CONTRADICTION_RESOLUTION)
若策略间存在冲突:→ 移除或更新冲突策略→ 必要时新增用于澄清的元策略
### 优先级 5:成功强化(SUCCESS_REINFORCEMENT)
若某策略被证明效果显著:→ 标记为 “有帮助” 并提高权重→ 考虑为边缘场景创建该策略的变体

## 操作指南
### 新增操作(ADD)—— 适用于以下场景:
- 策略需应对新类型问题
- 反思发现存在缺失的能力
- 现有策略无法覆盖当前情况

新增操作要求:
- 必须具备真正的新颖性(不可是现有内容的改写)
- 必须包含具体示例或步骤
- 必须具备可执行性与针对性
- 严禁添加模糊的原则性内容

优质新增示例:{{"type": "ADD","section": "multiplication(乘法)","content": "计算两位数乘法(如 23×45):采用面积模型 —— 拆分为(20+3)×(40+5),计算四个部分的乘积后求和","metadata": {{"helpful": 1, "harmful": 0}}}}

劣质新增示例(禁止使用):{{"type": "ADD","content": "计算时要仔细" // 过于模糊}}

### 更新操作(UPDATE)—— 适用于以下场景:
- 策略需进一步澄清
- 需补充重要的例外情况或边缘场景
- 需优化示例内容

更新操作要求:
- 必须保留原有内容中的有价值部分
- 必须能切实提升策略效果
- 需引用具体的条目 ID(bullet_id)

标记操作(TAG)—— 适用于以下场景:
- 反思提供了策略有效性的相关证据
- 需调整 “有帮助”/“有害” 的权重

### 移除操作(REMOVE)—— 适用于以下场景:
- 策略持续引发错误
- 存在重复或冲突的策略
- 策略过于模糊,不具备实用价值

## 质量控制
执行任何操作前必须验证:
- 该内容是否为真正的新增 / 改进信息?
- 内容是否足够具体,可执行?
- 是否与现有策略存在冲突?
- 是否能提升未来的执行表现?

严禁添加包含以下内容的条目:
- “注意……”
- “务必反复检查……”
- “考虑所有方面……”
- “逐步思考……”(无具体步骤支撑)
- 具体方法的通用性建议

## 去重协议
执行新增操作前:
- 检索现有条目,排查是否存在相似策略
- 若相似度达 70%:选择更新(UPDATE)而非新增(ADD)
- 若针对同一问题但方法不同:新增时需添加区分说明

## 输出格式
仅返回有效的 JSON 对象:
{{"reasoning": "<分析需要执行哪些更新及原因>","operations": [{{"type": "ADD|UPDATE|TAG|REMOVE","section": "< 类别,如 'algebra(代数)'、'geometry(几何)'、'problem_solving(问题解决)'>","content": "< 具体、可执行的策略,含示例 >","bullet_id": "< 更新 / 标记 / 移除操作必填项 >","metadata": {{"helpful": < 计数 >,"harmful": < 计数 >,"confidence": 0.85}},"justification": "< 该操作如何提升行动手册质量的说明 >"}}]}}

## 操作示例

### 高质量新增操作:

{{"type": "ADD","section": "algebra(代数)","content": "求解一元二次方程 ax²+bx+c=0 时:首先尝试因式分解。若无法分解为整数因式,使用求根公式 x = (-b ± √(b²-4ac))/2a。示例:方程 x²-5x+6=0 可分解为 (x-2)(x-3)=0,因此解为 x=2 或 x=3","metadata": {{"helpful": 1, "harmful": 0, "confidence": 0.95}},"justification": "提供了完整的解题方法,包含决策依据与示例"}}

### 有效更新操作:
{{"type": "UPDATE","bullet_id": "bullet_045","section": "geometry(几何)","content": "勾股定理 a²+b²=c² 仅适用于直角三角形。对于非直角三角形,需使用余弦定理:c² = a²+b²-2ab・cos (C)。应用勾股定理前,需先确认三角形是否为直角(90°)三角形","metadata": {{"helpful": 3, "harmful": 0, "confidence": 0.90}},"justification": "补充了勾股定理的关键适用条件,并提供了非直角三角形的替代解法"}}

## 行动手册规模管理
若行动手册中的策略数量超过 50 条:
- 优先选择更新(UPDATE)而非新增(ADD)
- 合并相似策略
- 移除表现最差的条目
- 注重质量而非数量

若无需执行任何更新,返回空的操作列表。响应需以{{开头,以}}结尾"""
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐