[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,结合环境评估实现持续优化,兼容多种大语言模型,兼顾训练与推理流程的完整性。
流程如下:
![[Agent] ACE(Agentic Context Engineering)源码阅读笔记---(1)基础模块](https://img2024.cnblogs.com/blog/1850883/202511/1850883-20251104215805698-1546171114.png)
代码如下:
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 的图例如下:
![[Agent] ACE(Agentic Context Engineering)源码阅读笔记---(1)基础模块](https://img2024.cnblogs.com/blog/1850883/202511/1850883-20251104214715511-1733293332.png)
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) - 合并相似策略 - 移除表现最差的条目 - 注重质量而非数量 若无需执行任何更新,返回空的操作列表。响应需以{{开头,以}}结尾"""