<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Agent on BiribiriBird</title><link>https://biribiribird.top/series/agent/</link><description>Recent content in Agent on BiribiriBird</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sat, 23 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://biribiribird.top/series/agent/index.xml" rel="self" type="application/rss+xml"/><item><title>转生为Agent高手(三) Multi-agent research system. How and Avoid</title><link>https://biribiribird.top/posts/agentnote-3-multi-agent-research-system/</link><pubDate>Sat, 23 May 2026 00:00:00 +0000</pubDate><guid>https://biribiribird.top/posts/agentnote-3-multi-agent-research-system/</guid><description>&lt;p&gt;&lt;a href="https://www.anthropic.com/engineering/multi-agent-research-system"&gt;Anthropic &amp;mdash; How we built our multi-agent research system&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://cognition.ai/blog/dont-build-multi-agents"&gt;Don’t Build Multi-Agents | Cognition&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这次我们同时看两篇文章，进行对照&lt;/p&gt;
&lt;h1 id="intro"&gt;Intro&lt;/h1&gt;
&lt;p&gt;reseach型任务的特点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;很难提前预测所需的步骤&lt;/li&gt;
&lt;li&gt;无法有既定的路线，在探索过程中的思路涌现会带来新的&lt;strong&gt;分支&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这类任务需要从海量的信息中搜索出关键内容（本质是压缩）&lt;/p&gt;</description><content:encoded><![CDATA[<p><a href="https://www.anthropic.com/engineering/multi-agent-research-system">Anthropic &mdash; How we built our multi-agent research system</a></p>
<p><a href="https://cognition.ai/blog/dont-build-multi-agents">Don’t Build Multi-Agents | Cognition</a></p>
<p>这次我们同时看两篇文章，进行对照</p>
<h1 id="intro">Intro</h1>
<p>reseach型任务的特点：</p>
<ul>
<li>很难提前预测所需的步骤</li>
<li>无法有既定的路线，在探索过程中的思路涌现会带来新的<strong>分支</strong></li>
</ul>
<p>这类任务需要从海量的信息中搜索出关键内容（本质是压缩）</p>
<ul>
<li>串行的单Agent的上下文与工具调用很难支持完成整个任务</li>
<li>多Agent系统支持单个Agent用更干净、更充分的上下文窗口去处理分支任务</li>
</ul>
<p>因此多Agent系统在此类任务中能够呈现惊人的性能提升</p>
<p><strong>缺点是：消耗了更加大量的token、进行了更多轮次的工具调用</strong></p>
<p>但这也是性能提升的核心原因</p>
<p>总结：</p>
<ul>
<li>需要高度并行</li>
<li>信息量超过单次上下文窗口</li>
<li>需要对接大量复杂工具</li>
<li>所有Agent涉及的上下文重叠较小、无复杂依赖关系</li>
</ul>
<p>这个时候推荐使用多Agent</p>
<h1 id="architecture">Architecture</h1>
<blockquote>
<p>设计一个Research Agent System</p>
</blockquote>
<p>采用<code>orchestrator-worker</code>模式</p>
<ul>
<li>主导Agent协调整个流程</li>
<li>任务运作交由专门子智能体</li>
</ul>
<p><img alt="system" loading="lazy" src="/posts/agentnote-3-multi-agent-research-system/assets/image-20260523210456915.png"></p>
<p>用户需求：调研100家2025年美国的AI Agent公司，给出列表</p>
<ul>
<li>Lead Agent分析查询、制定策略，生成subagents探索</li>
<li>subagents迭代使用搜索工具收集信息，并且完成过滤，返回lead agent</li>
</ul>
<p><img loading="lazy" src="/posts/agentnote-3-multi-agent-research-system/assets/image-20260524165128688.png"></p>
<ul>
<li>User-&gt;System：创建一个Lead Reseacher，进行迭代Process</li>
<li><strong>Iterative Research Process</strong></li>
<li>think进行planing，将plan保存到memory中（创建or修改）</li>
<li>检索memory，避免plan丢失</li>
<li>创建subagents，内部进行独立的搜索与评估</li>
<li>返回压缩后的结果</li>
<li>Lead评估是否足够，否则继续调研</li>
</ul>
<h1 id="prompt">Prompt</h1>
<p>多agent相对于单Agent的<strong>协调</strong>复杂度急剧增加</p>
<p>每个Agent都是由Prompt驱动的，因此需要注意Prompt的一些原则</p>
<ul>
<li><strong>为每一个Agent构建完全相同的提示词+工具做模拟环境测试，理解工作过程</strong></li>
<li><strong>Lead需要为每个subagent清晰分配任务，防止重复劳动与遗漏</strong>
<ul>
<li>提供明确目标、输出格式、工具、资源使用指南、<u>清晰任务边界</u></li>
</ul>
</li>
<li><strong>根据问题难度自动控制投入的资源（多少个Agent、多少次工具调用）</strong>
<ul>
<li>直接在Lead Agent中的Prompt写明资源分配规则</li>
<li>例如
<ul>
<li>简单事实查询（xxx家CEO是谁）：1个Agent3-10次Tool Calls</li>
<li>直接对比类任务（比较 Claude 和 Gemini 的企业功能差异）：2-4个Agent，每个Agent负责一个维度，每个Agent需要10-15次Tool Call</li>
<li>复杂研究问题（分析 AI 编程助手市场格局、主要玩家、商业模式、技术趋势和未来机会）：超过10个</li>
</ul>
</li>
</ul>
</li>
<li><strong>在Prompt中添加启发式的工具使用原则</strong>
<ul>
<li>正确的工具选择非常重要，MCP带来了海量工具，造成了困难</li>
<li>启发式规则
<ul>
<li>首先检查所有可用工具</li>
<li>根据用户意图匹配工具</li>
<li>广泛的外部探索搜索网络or优先使用专用工具而非通用工具</li>
</ul>
</li>
<li>优先确保工具描述质量</li>
</ul>
</li>
<li><strong>Agent本身建议参与优化过程</strong>
<ul>
<li>Agent改自己的Prompt、测试工具问题、分析失败案例都很擅长</li>
<li>用Agent来改进Agent的工作环境</li>
</ul>
</li>
<li><strong>先广泛搜索再逐步聚焦</strong>
<ul>
<li>通过提示词要求Agent先从简短的、宽泛的查询开始</li>
<li>评估可用信息，缩小范围</li>
<li>抵抗Agent偏好冗长、具体的查询</li>
</ul>
</li>
<li><strong>显式引导Agent怎么思考，高效利用thinking token</strong>
<ul>
<li>Lead Agent主要思考如何管理任务，subagent主要思考工具怎么交替使用</li>
<li>结构化思考流程
<ul>
<li>先规划，再调用工具</li>
<li>看完工具结果后再评估、补缺、调整下一步</li>
</ul>
</li>
</ul>
</li>
<li><strong>并行工具调用</strong>
<ul>
<li>主智能体并行启动 3-5 个子智能体，而非串行执行</li>
<li>子智能体同时使用 3 个以上工具</li>
</ul>
</li>
</ul>
<h1 id="评估">评估</h1>
<p>Agent达成目的路线完全不确定</p>
<h2 id="早期--小样本">早期 · 小样本</h2>
<blockquote>
<p>早期上升空间巨大，一个提示词调整可能30%到80%</p>
</blockquote>
<p>早期构建的时候准备20个真实查询进行测试即可</p>
<p>不要为了构建完整评估体系才开始行动</p>
<h2 id="llm-as-judge">LLM-AS-JUDGE</h2>
<ul>
<li>事实准确性（主张是否与来源一致？）</li>
<li>引用准确性（引用的来源是否支持主张？）</li>
<li>完整性（是否涵盖所有要求方面？）</li>
<li>来源质量（是否优先使用一手资料而非低质量的二手资料？）</li>
<li>工具效率（是否以合理次数使用正确工具？）</li>
</ul>
<blockquote>
<p>Antropic发现单一提示词输出0.0-1.0分数or正负分类</p>
<p>与人工判断的一致性最高</p>
</blockquote>
<p>当存在明确答案的时候，使用LLM评测非常有效</p>
<p>只需要判断与答案是否一致即可</p>
<h2 id="human-eval">Human Eval</h2>
<p>人工测试能够帮助发现一些偏差，因此必不可少</p>
<blockquote>
<p>人类似乎更喜欢SEO优化得到的内容，而不是一些个人博客</p>
<p>因此可以通过这个偏好去调整提示词</p>
</blockquote>
<h1 id="production-reliability">Production reliability</h1>
<ul>
<li>
<p>Agent错误</p>
<ul>
<li>需要做持续化执行，存到本地，防止错误重新开始</li>
<li>中断点恢复，根据持续化的存储结果继续工作</li>
<li>Agent参与错误处理：告诉错误信息，让模型更换路线</li>
<li>确定性的保护措施：失败后自动retry、定期做check</li>
</ul>
</li>
<li>
<p>调试：Agent中间路径不确定</p>
<ul>
<li>full production tracing（完整的生产追踪）
<ul>
<li>传统指标：延迟、错误率、CPU、内存</li>
<li>结构化信息：决策记录、工具记录、任务分派记录、失败记录、重试记录</li>
</ul>
</li>
</ul>
</li>
<li>
<p>部署</p>
<ul>
<li>新版本代码部署的时候很难逐步替换旧版本代码（智能体可能正在运行）</li>
<li>rainbow deployments：新旧版本同时运行，但是新来的流量导入到新版本，直到旧版本Agent没有调用</li>
</ul>
</li>
<li>
<p>同步</p>
<ul>
<li>Lead Agent需要等待所有subagent完成任务</li>
<li>asynchronous execution
<ul>
<li>Lead边接受边调整方向，必要时动态创建</li>
</ul>
</li>
<li>但确实会更难协调、容易冲突</li>
</ul>
</li>
</ul>
<hr>
<h1 id="avoid">Avoid</h1>
<p>基于cognition.ai这一篇文章</p>
<p><img loading="lazy" src="/posts/agentnote-3-multi-agent-research-system/assets/image-20260524182306312.png"></p>
<p>常见的多Agent范式如图，但是这种架构非常脆弱</p>
<blockquote>
<p>任务：抄袭一个《Flappy Bird》</p>
<ul>
<li>子任务1：构建一个带有绿色管道和碰撞箱的动态游戏背景</li>
<li>子任务2：构建一只可以上下移动的小鸟</li>
</ul>
<p>结果</p>
<ul>
<li>子任务1：建一个看起来像《超级马里奥兄弟》的背景</li>
<li>子任务2：构建了不像游戏素材的鸟</li>
</ul>
<p>最终Lead Agent将错误内容完成合并</p>
</blockquote>
<p>这个问题并不能通过简单的将原始任务中的上下文完全塞给subagent解决</p>
<p>注意，对话是多轮的，subagent需要自己去调用工具</p>
<p>任何细节差异都可能带来对任务不同的理解</p>
<h2 id="principle">Principle</h2>
<ul>
<li>Principle1：完整的上下文轨迹必须共享</li>
</ul>
<p><img loading="lazy" src="/posts/agentnote-3-multi-agent-research-system/assets/image-20260525164648348.png"></p>
<ul>
<li>Principle2：行动隐含决策</li>
</ul>
<p>Agent的所有行动中自然包含了丰富的信息，若造成丢失则很有可能带来错误积累</p>
<hr>
<p>MultiAgent并不能保证上述两个原则</p>
<p>最简单的方式只有：单线程的线性智能体</p>
<p>但是上一篇文章也提到了，单智能体会受限于上下文窗口的限制，性能也会触碰瓶颈</p>
<p>但我们显然可以通过压缩，尽量去保证<strong>上下文连续性</strong></p>
<p><img loading="lazy" src="/posts/agentnote-3-multi-agent-research-system/assets/image-20260525170123877.png"></p>
<ul>
<li>引入一个专门用来压缩上下文的LLM</li>
</ul>
<p>因此：<strong>能不使用MultiAgent，就不要使用</strong></p>
<blockquote>
<p>需要衡量场景的可靠性是否大于并行性</p>
</blockquote>
<h2 id="applying-the-principles">Applying the Principles</h2>
<p>如果无法完成两个原则的落实，则必须要考虑：</p>
<ul>
<li>谨慎地决定哪些工作可以拆出去，哪些不能拆</li>
</ul>
<p>例如：</p>
<ul>
<li>Claude Code设计的subagent只用来回答问题
<ul>
<li>暗示：<strong>调查型任务</strong>可以拆出去，<strong>决策型/执行型任务</strong>要谨慎拆出去</li>
</ul>
</li>
<li>Edit Apply Models：大模型负责“决定怎么改”，小模型负责“实际应用修改”
<ul>
<li>这种架构实际上非常高危：只要解释里有轻微歧义，小模型就可能误解并改错</li>
<li>建议：<strong>同一模型先决定怎么改，然后顺着上下文直接完成修改</strong></li>
<li>暗示：<strong>不要把一个高度依赖上下文的决策链切成两个互相误解的环节</strong></li>
<li>除非提供非常详细的指导</li>
</ul>
</li>
<li>Multi-Agents：如果仍然需要并行性，则需要解决Agent之间及时<strong>沟通</strong>的问题
<ul>
<li>cross-agent context-passing（跨Agent上下文传递）目前能力一般</li>
<li>建议：<strong>长期看好，短期不建议作为生产级默认架构</strong></li>
</ul>
</li>
</ul>
<p>但是这些建议是跟随时代变化的</p>
]]></content:encoded></item><item><title>转生为Agent高手(二) Anthropic - Effective context engineering for AI agents</title><link>https://biribiribird.top/posts/agentnote-2-effective-context-engineering-for-ai-agents/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://biribiribird.top/posts/agentnote-2-effective-context-engineering-for-ai-agents/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;context engineering&lt;/strong&gt;：系统性地设计、构建和优化提供给语言模型的所有上下文信息，目的是引导模型产生更准确、更可控的输出&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;人话：什么样的上下文最有可能让我们的模型产生期望的行为&lt;/p&gt;</description><content:encoded><![CDATA[<blockquote>
<p><strong>context engineering</strong>：系统性地设计、构建和优化提供给语言模型的所有上下文信息，目的是引导模型产生更准确、更可控的输出</p>
</blockquote>
<p>人话：什么样的上下文最有可能让我们的模型产生期望的行为</p>
<p><a href="https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents">Anthropic &mdash; Effective context engineering for AI agents</a></p>
<h1 id="context-engineering-vs-prompt-engineering">Context Engineering vs. Prompt Engineering</h1>
<ul>
<li>提示词工程：为LLM编写和组织指令文本</li>
<li>上下文工程：在LLM推理过程中，迭代优化Prompt（或是信息）的策略集合</li>
</ul>
<p>由于LLM工程的复杂化，静态的提示词编写显然不能满足需求</p>
<p>Agent在循环过程中必然会不断产生对下一轮有用的信息，这些信息需要被及时优化</p>
<p>上下文工程贯穿了整个推理过程，<strong>动态维护</strong>了人类指令、历史对话、工具返回结果、外部检索，筛选出最能<strong>提升当前任务成功率</strong>的<strong>最优信息组合</strong></p>
<p><img alt="Prompt engineering vs. context engineering" loading="lazy" src="/posts/agentnote-2-effective-context-engineering-for-ai-agents/assets/Snipaste_2026-05-22_17-45-29.jpg"></p>
<h1 id="why-context-engineering-is-important-to-building-capable-agents">Why context engineering is important to building capable agents</h1>
<ul>
<li>上下文衰减：大海捞针benchmark已经证明，上下文窗口中token越多，模型从上下文中准确回忆信息的能力确实会下降
<ul>
<li>不同模型会有不同表现，但都客观存在衰减</li>
<li>以及节省上下文能够节省成本</li>
</ul>
</li>
</ul>
<blockquote>
<p>Transformer的Attention架构决定了注意力是平方级别</p>
<p>配对关系在长上下文自然会被稀释</p>
<p>训练数据中短序列也会比长序列更常见。尽管有RoPE（将32K放缩到4K），但是带来了位置模糊感</p>
<p>上下文衰减是渐变的而非断崖的</p>
</blockquote>
<h1 id="the-anatomy-of-effective-context">The anatomy of effective context</h1>
<p>如何找到最优上下文的构成要素？</p>
<h2 id="system-prompts">System Prompts</h2>
<p>系统提示词既不能特别细致，也不能特别抽象，需要找到<strong>刚好能稳定引导智能体行为</strong>的高度</p>
<p><img alt="prompts" loading="lazy" src="/posts/agentnote-2-effective-context-engineering-for-ai-agents/assets/image-20260522184443360.png"></p>
<ul>
<li>Too Specific：在提示词中硬编码复杂脆弱的逻辑</li>
<li>Too Vague：提供模糊笼统的高层指令</li>
</ul>
<p>希望提示词是：既要足够具体以有效<strong>引导行为</strong>，又要足够<strong>灵活</strong>，为模型提供强有力的<strong>启发式指导</strong></p>
<blockquote>
<ul>
<li>如果用户意图是 A，就问 3 个问题；如果是 B，就不要问；如果满足 5/7 个条件，就调用某工具……
<ul>
<li>提示词中含有过于复杂的逻辑、业务流程</li>
<li>真实场景一旦略有偏离，模型就容易误判</li>
</ul>
</li>
<li>你是客服助手，要友好地解决客户问题，必要时升级给人工</li>
</ul>
</blockquote>
<p>核心原则：<strong>不要把 Agent 当成处理流程的程序，也不要把它当成充分理解业务的人。</strong></p>
<p>好的提示词应该是一份清晰的<strong>岗位说明书</strong>+<strong>操作原则</strong></p>
<ul>
<li>身份</li>
<li>目标</li>
<li>边界</li>
<li>可用资源</li>
<li>决策标准</li>
<li>输出格式</li>
<li>少量例子</li>
</ul>
<br>
<p>过于具体：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="ln">1</span><span class="cl">如果用户问订单状态，先调用 A 工具。
</span></span><span class="line"><span class="ln">2</span><span class="cl">如果 A 工具失败，调用 B 工具。
</span></span><span class="line"><span class="ln">3</span><span class="cl">如果用户说“没收到”，判断是否超过 3 天。
</span></span><span class="line"><span class="ln">4</span><span class="cl">如果超过 3 天并且地区是美国，执行流程 X。
</span></span><span class="line"><span class="ln">5</span><span class="cl">如果地区是加拿大，执行流程 Y。
</span></span><span class="line"><span class="ln">6</span><span class="cl">……
</span></span></code></pre></div><p>过于模糊：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="ln">1</span><span class="cl">你是一个客服助手。请友好、专业地帮助用户解决问题。
</span></span></code></pre></div><p>Just Right：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="ln"> 1</span><span class="cl">你是电商客服助手，负责帮助用户处理订单状态、配送、退款和商品咨询。
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">目标：
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">尽快理解用户问题，使用可用工具核实事实，并给出清晰、可执行的下一步。
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">工作原则：
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">- 在给出结论前，先确认订单、配送或政策信息。
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">- 如果信息不足，最多提出 1-2 个必要问题。
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">- 多个方案都可行时，优先选择对用户成本最低、成功率最高的方案。
</span></span><span class="line"><span class="ln">10</span><span class="cl">- 遇到政策例外、支付争议或安全风险时，升级给人工。
</span></span><span class="line"><span class="ln">11</span><span class="cl">- 回复应简洁、明确，避免暴露内部流程。
</span></span></code></pre></div><br>
<br>
<p>提示词可以组成不同的部分<code>&lt;background_information&gt;</code> 、 <code>&lt;instructions&gt;</code> 、 <code>## Tool guidance</code> 、 <code>## Output description</code></p>
<ul>
<li>
<p>追求用最少的信息完整勾勒出预期的行为模式（但不代表简短）</p>
</li>
<li>
<p>先用一个精简提示测试最优模型，根据失败模式继续优化</p>
</li>
</ul>
<blockquote>
<p>其实这里的意思就是不要希望穷尽所有可能分支</p>
<p>留一部分<strong>判断力</strong>给模型即可</p>
<p>你需要充分考虑实际业务需求，对于确定的内容可以写明应该先……再……</p>
</blockquote>
<h2 id="tools">Tools</h2>
<p>工具必须通过返回 <strong>token 高效的信息</strong>以及<strong>鼓励高效的智能体行为</strong></p>
<p>确保人类也看得懂，明确在什么情况应该使用什么工具</p>
<p>建议为工具提供示例，但<strong>不要塞入大量边缘案例（试图穷尽规则）</strong></p>
<p>应该精心挑选一组多样化、具有代表性的示例，<strong>有效展现智能体的预期行为</strong></p>
<blockquote>
<p>示例用于为模型补充说明工具可以达到什么样的效果</p>
<p>而不是告诉模型什么情况应该用什么</p>
</blockquote>
<h1 id="context-retrieval-and-agentic-search">Context retrieval and agentic search</h1>
<p>如何在运行时动态检索上下文</p>
<p><a href="https://biribiribird.top/posts/anthropic-building-effective-agents/">转生为Agent高手(一)Anthropic - Building Effective Agents | BiribiriBird</a></p>
<p>这篇文章以及探讨了workflow和agent，其中将agent定义为：LLM能够在循环中自主使用工具</p>
<p>随着LLM性能上升，业界趋近于这一范式</p>
<p>对于检索，之前基本是基于嵌入方法做推理前的检索</p>
<p>由于逐渐开始关注agent的自主性，越来越多团队通过<strong>即时上下文策略</strong>来增强这些检索</p>
<ul>
<li>不再像嵌入方法一样对整个相关数据做预处理，维护轻量级的标识符
<ul>
<li>文件路径、URL……agent只需要知道数据在哪</li>
</ul>
</li>
<li>模型通过工具动态加载、引用数据到上下文
<ul>
<li>head、tail</li>
</ul>
</li>
</ul>
<blockquote>
<p>与人类认知相符：不会记忆整个信息库，而是根据外部组织、索引方式进行检索</p>
<p>文件夹层级结构、命名约定和时间戳，能够帮助人类和智能体理解如何以及何时利用信息</p>
<ul>
<li>test/test_xxx.py和src/xxx.py本身就暗示了用途</li>
</ul>
</blockquote>
<br>
<p>Agent应该自主进行检索，<strong>渐进式揭示上下文</strong></p>
<ul>
<li>Agent探索发现上下文，每次交互产生影响下一步的上下文
<ul>
<li>文件大小：暗示复杂度</li>
<li>命名约定：暗示用途</li>
<li>时间戳：暗示相关性</li>
</ul>
</li>
<li>Agent逐层理解，保留必要信息，利用笔记策略持久化信息</li>
</ul>
<p>减少上下文浪费、动态适应环境，渐进式加载上下文好处确实很多</p>
<br>
<p>代价是探索带来的<strong>时延</strong>，需要多轮工具调用：查看目录、搜索、打开文件、筛选、再搜索……</p>
<p>非常依赖工程设计，需要对工具文档进行良好的设计与规范</p>
<p>因此设计的核心是：设计一个能让 Agent <strong>有效探索的信息环境</strong></p>
<br>
<p>为了平衡效率</p>
<ul>
<li>一部分信息可以提前放入上下文，用来提高启动速度。</li>
<li>一部分信息动态加载披露</li>
</ul>
<blockquote>
<p>CLAUDE.MD会预先放入上下文，提供项目规则、约定、重要说明</p>
<p><code>glob</code>、<code>grep</code> 等工具让模型可以在运行时搜索文件、定位代码、按需读取内容</p>
</blockquote>
<p>这种组合方式更加平衡</p>
<ul>
<li>内容变化慢（法律、金融……）：材料相对稳定，适合混合策略</li>
<li>内容变化快（代码、实验日志）：材料变化多，适合更多的自主探索</li>
</ul>
<p>自主探索的设计同样基于最小可行原则：</p>
<ul>
<li>根据必要信息、少量高价值工具先做</li>
<li>根据失败补充规则增加、索引、缓存、自动化流程</li>
</ul>
<p>总结：</p>
<ul>
<li>好的Agent<strong>按需</strong>探索环境</li>
<li>纯自主探索成本高、容易跑偏，更好的方案是混合模式：<strong>关键上下文预加载 + 工具驱动的实时探索</strong></li>
</ul>
<h2 id="long-horizon-tasks">long-horizon tasks</h2>
<p>对于长周期的任务，我们需要保证token数量不能超过最大的上下文窗口</p>
<p>并且上下文需要保持连贯性、上下文感知和目标导向行为</p>
<blockquote>
<p>虽然可以等待技术更新，上下文窗口变得更大</p>
</blockquote>
<p>但是追求性能的条件下，上下文污染和信息相关性问题的困扰必须要解决</p>
<p>提供了以下几种方案</p>
<h3 id="compaction">Compaction</h3>
<p>压缩是最首要的手段：在接近上限时，对当前内容进行总结</p>
<p>以总结内容为基础，重新启动新的窗口</p>
<blockquote>
<p>Claude Code通过接受消息历史记录，总结提取最关键的信息：</p>
<ul>
<li>架构决策</li>
<li>未解决的bug</li>
<li>实现细节</li>
</ul>
<p>需要丢弃冗余的工具输出、消息</p>
<p>新窗口只保留压缩后的上下文+最近访问的一些文件</p>
</blockquote>
<p><strong>压缩的艺术在于取舍</strong>。过度压缩会丢失一些细节（但可能到后期才能显示关键）</p>
<p>因此有一个常用的指标：<strong>召回率</strong></p>
<p>确保压缩提示能捕捉到追踪数据中的每一条相关信息，然后通过消除冗余内容来迭代提升精确度</p>
<p>比较简单的做法就是：<strong>清空掉工具调用与结果</strong></p>
<p>如果模型已经看过结果并且利用过了，那其实就不需要再看一遍。</p>
<h3 id="structured-note-taking"><strong>Structured note-taking</strong></h3>
<p>结构化笔记（或称为记忆），定期将笔记<strong>持久化存储</strong>到上下文窗口之外的技术</p>
<p>一些信息被压缩时，不如直接丢到文件里，后续如果要使用再加载回来就好</p>
<blockquote>
<p>对于长期的任务计划、进度，最好是保存到文件里，这样非常可控</p>
<p>记录当前计划走到哪一步了，也能明确知道下一步要做什么，目标是什么</p>
</blockquote>
<p>在上下文压缩后，读取永久化记忆确保了上下文的连续性</p>
<h3 id="sub-agent-architectures">Sub-agent architectures</h3>
<p>子Agent是一个独立、干净的新Agent，不受到之前上下文的影响</p>
<p>与其让单个Agent吃掉一堆上下文，不如就新开一个Agent深入工作，想用多少就用多少</p>
<p>并且只返回最后的结果摘要，完全不会污染上下文</p>
<blockquote>
<ul>
<li>
<p>详细的搜索上下文被隔离在子代理内部</p>
</li>
<li>
<p>主代理则专注于综合和分析结果</p>
</li>
</ul>
</blockquote>
]]></content:encoded></item><item><title>转生为Agent高手(一) Anthropic - Building Effective Agents</title><link>https://biribiribird.top/posts/agentnote-1-building-effective-agents/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>https://biribiribird.top/posts/agentnote-1-building-effective-agents/</guid><description>&lt;p&gt;&lt;a href="https://www.anthropic.com/engineering/building-effective-agents"&gt;Building Effective AI Agents &amp;mdash; Anthropic&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="what"&gt;What&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;Workflow&lt;/code&gt;和&lt;code&gt;Agent&lt;/code&gt;的差异还是很大的&lt;/p&gt;
&lt;p&gt;Antropic将其都归纳为一个&lt;code&gt;Agentic Systems&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Workflow：由代码决定每一步应该做什么，LLM只是其中的一环&lt;/li&gt;
&lt;li&gt;Agent：LLM自主决定每一步应该做什么&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="when-and-when-not"&gt;When and When Not&lt;/h1&gt;
&lt;h2 id="timing"&gt;Timing&lt;/h2&gt;
&lt;p&gt;Antropic并不建议什么情况下都去做一个复杂的&lt;code&gt;Agentic System&lt;/code&gt;&lt;/p&gt;</description><content:encoded><![CDATA[<p><a href="https://www.anthropic.com/engineering/building-effective-agents">Building Effective AI Agents &mdash; Anthropic</a></p>
<h1 id="what">What</h1>
<p><code>Workflow</code>和<code>Agent</code>的差异还是很大的</p>
<p>Antropic将其都归纳为一个<code>Agentic Systems</code></p>
<ul>
<li>Workflow：由代码决定每一步应该做什么，LLM只是其中的一环</li>
<li>Agent：LLM自主决定每一步应该做什么</li>
</ul>
<h1 id="when-and-when-not">When and When Not</h1>
<h2 id="timing">Timing</h2>
<p>Antropic并不建议什么情况下都去做一个复杂的<code>Agentic System</code></p>
<p>应该先尝试最简单的方案，再逐渐增加复杂度</p>
<ul>
<li>质量上升的同时，成本、延迟也会逐渐上升</li>
</ul>
<p>决策顺序</p>
<ul>
<li>第一层：单次LLM调用
<ul>
<li>多数应用 retrieval and in-context examples就足够了</li>
</ul>
</li>
<li>第二层：Workflow
<ul>
<li>任务步骤多、且明确、可预期</li>
</ul>
</li>
<li>第三层：Agents
<ul>
<li>任务需要灵活决策</li>
<li>任务没有固定路径，需要动态决定每一步</li>
<li>成本上升、难以预测、响应慢</li>
</ul>
</li>
</ul>
<blockquote>
<p>帮我调研某个市场，找出潜在客户，比较竞品，并输出进入策略。</p>
</blockquote>
<p>复杂度是需要有收益的</p>
<h2 id="frameworks">Frameworks</h2>
<p>当简单的方案足够解决问题时，复杂的框架可能会带来不必要的复杂性</p>
<p>能够通过LLM API直接实现，就尽量不要做太多事情</p>
<p>使用框架应该确保能够理解底层代码</p>
<h1 id="building-blocks-workflows-and-agents">Building Blocks, Workflows, and Agents</h1>
<p>从简单的组合工作流到自主智能体</p>
<h2 id="block">Block</h2>
<p>定义为<strong>一个能够调用外部能力的最小单元</strong></p>
<p>augmented LLM = LLM + 增强能力</p>
<ul>
<li>检索能力</li>
<li>工具调用</li>
<li>记忆读写</li>
</ul>
<p>或者说是一个增强的LLM，<code>The Augmented LLM</code></p>
<p>不管是workflow还是agent，都需要其作为最小单元进行组成</p>
<p><img alt="Block:The augmented LLM" loading="lazy" src="/posts/agentnote-1-building-effective-agents/assets/image-20260521174411267.png"></p>
<blockquote>
<p>Block并不等于Agent。取决于外层组织方式</p>
</blockquote>
<ul>
<li>总结这篇文章：系统让LLM检索文章内容并且总结（Block）</li>
<li>完成调研：LLM需要先决定要查询资料、整理资料、总结分析，在这个基础上开始决定查什么资料、调用什么、多轮分析给出完整报告（Agent）</li>
</ul>
<p>总结一下：</p>
<ul>
<li><strong>裸 LLM</strong>：只根据 prompt 输出文本</li>
<li><strong>增强型 LLM</strong>：可以检索、调用工具、使用记忆</li>
<li><strong>Workflow</strong>：把多个增强型 LLM 调用按固定结构组织起来</li>
<li><strong>Agent</strong>：让增强型 LLM 在循环中自主规划、调用工具、根据反馈调整</li>
</ul>
<blockquote>
<ul>
<li>增强LLM：针对当前任务，自己决定需要检索什么、调用什么……完成单次任务</li>
<li>Agent：具备任务流程基本的控制权，能够决定整个任务如何继续推进</li>
</ul>
</blockquote>
<br>
<br>
<p>构建这样的LLM需要：</p>
<ul>
<li>明确LLM工具集，应该接近任务本身，不要给无关的工具</li>
<li>LLM工具接口简要、清晰、文档明确</li>
</ul>
<blockquote>
<p>例如：MCP</p>
</blockquote>
<br>
<br>
<p>后文提到的所有workflow和agent，每次LLM调用都默认是带有检索、工具、记忆能力的augmented LLM</p>
<h2 id="workflow">Workflow</h2>
<p>workflow并不是简单地多次调用模型</p>
<p>每次模型调用都应该有清晰的输入、职责、可用能力</p>
<p>提供五种workflow设计模式</p>
<h3 id="workflow1-prompt-chaining">Workflow1: Prompt Chaining</h3>
<p>最简单的workflow，数据沿着链条通过每一个LLM的prompt</p>
<p><img alt="Prompt Chain" loading="lazy" src="/posts/agentnote-1-building-effective-agents/assets/image-20260521202901846.png"></p>
<p>任务能够被切分为顺序的一系列步骤</p>
<p>每个LLM处理前一个LLM的输出</p>
<p>可以在任意步骤之间添加一个Gate，保证任务正常流动</p>
<p>具备以下特点的任务常使用此workflow</p>
<ul>
<li>任务可以轻松且清晰地分解为固定子任务</li>
<li>能够通过让LLM每次处理更简单的子任务，以延迟换取更高的准确性</li>
</ul>
<blockquote>
<p>任务示例</p>
<ul>
<li>生成营销文案，然后将其翻译成另一种语言。</li>
<li>撰写文档大纲，检查大纲是否符合特定标准，然后基于大纲撰写文档。</li>
</ul>
</blockquote>
<br>
<h3 id="workflow2-routing">Workflow2: Routing</h3>
<p>在纯Chain的基础上增加了一些分支结构</p>
<p>显然有时候单份提示词并不能充分完成一个任务</p>
<p>或许我们可以对任务进行分类，不同类型任务使用不同提示词完成</p>
<p><img alt="Routing" loading="lazy" src="/posts/agentnote-1-building-effective-agents/assets/image-20260521203919488.png"></p>
<ul>
<li>按任务类型进行分类：使用不同提示词</li>
<li>按任务难度进行分类：使用不同模型节约成本</li>
</ul>
<br>
<h3 id="workflow3-parallelization">Workflow3: Parallelization</h3>
<ul>
<li>如果能将任务拆分成<strong>独立的子任务</strong></li>
<li>希望获取同一任务的<strong>多样化输出结果（投票）</strong></li>
</ul>
<p>那么我们可以并行化</p>
<p><img alt="Parallelization" loading="lazy" src="/posts/agentnote-1-building-effective-agents/assets/image-20260521205400113.png"></p>
<blockquote>
<ul>
<li>独立子任务
<ul>
<li>一个LLM处理查询</li>
<li>一个LLM处理安全审核与防护</li>
</ul>
</li>
<li>Voting
<ul>
<li>使用多个不同提示进行code review</li>
<li>多个提示词不同方面or不同阈值做评估</li>
</ul>
</li>
</ul>
</blockquote>
<br>
<h3 id="workflow4-orchestrator-workers">Workflow4: Orchestrator-workers</h3>
<p>似乎就是<strong>Planner</strong></p>
<p>当子任务无法预先定义的时候，我们可以考虑设置一个<code>Orchestrator</code>做分工</p>
<blockquote>
<p>Orchestrator：管弦乐演奏家；管弦乐编曲家</p>
<p>可以理解为编排器、指挥、协调器</p>
</blockquote>
<p><img alt="Orchestrator-workers" loading="lazy" src="/posts/agentnote-1-building-effective-agents/assets/image-20260521205906617.png"></p>
<p>与并行化最大的区别：子任务由协调器根据具体输入动态确定</p>
<blockquote>
<ul>
<li>对多个文件进行复杂修改
<ul>
<li>需要分工出不同线路对不同文件单独做不同修改</li>
</ul>
</li>
<li>从多个来源做信息搜集</li>
</ul>
</blockquote>
<p>这里会觉得像Agent？</p>
<p>但是仍然是定死了先编排，再分工</p>
<p>Agent可以自己决定使用哪一套workflow与任务安排</p>
<br>
<h3 id="workflow5-evaluator-optimizer">Workflow5: Evaluator-optimizer</h3>
<p>似乎就是<strong>Reflection</strong></p>
<p>一个 LLM 调用生成响应，而另一个则在循环中提供评估和反馈</p>
<p><img alt="Evaluator-optimizer" loading="lazy" src="/posts/agentnote-1-building-effective-agents/assets/image-20260521210236279.png"></p>
<ul>
<li>拥有明确的评估标准，迭代可以带来价值优化
<ul>
<li>人类能为LLM输出提供反馈</li>
<li>LLM能通过人类反馈进行打磨提升</li>
</ul>
</li>
</ul>
<p>满足这两个条件，就可以考虑让模型做评估优化</p>
<blockquote>
<ul>
<li>文学翻译：LLM不断发现细微之处进行改进</li>
<li>多轮搜索：LLM决定是否继续搜索</li>
</ul>
</blockquote>
<h2 id="agent">Agent</h2>
<ul>
<li>Step1：根据人类指令或互动讨论开始工作</li>
<li>Step2：<strong>自主规划</strong>，开始运作（必要时返回给人类）</li>
<li>Step3：执行过程中，必须从<strong>每个步骤处</strong>获取真实情况（工具调用结果or代码执行结果），评估进展
<ul>
<li>在检查点or障碍处进行暂停，询问人类</li>
</ul>
</li>
<li>任务完后终止，或设置停止条件（例如最大迭代次数）</li>
</ul>
<p><img alt="Agent" loading="lazy" src="/posts/agentnote-1-building-effective-agents/assets/image-20260521212205507.png"></p>
<p>何时使用：</p>
<ul>
<li>难以预测步骤数量</li>
<li>无法硬编码固定路径</li>
<li>开放问题</li>
</ul>
<p>同时：Agent高度自主，因此最好在沙盒中，设置防护措施</p>
<p>防止错误累积</p>
<blockquote>
<p>核心：基于<strong>环境反馈</strong>循环使用<strong>工具</strong></p>
</blockquote>
<p>因此工具集和文档的设计至关重要</p>
<hr>
<h1 id="summary">Summary</h1>
<h2 id="combining-and-customizing">Combining and Customizing</h2>
<p>其实不需要过度在意所谓的规范，应该根据实际场景使用具体范式</p>
<p>关键：衡量性能与实现</p>
<p>只有能切实改善结果时，才会增加系统复杂性</p>
<h2 id="principles">Principles</h2>
<p>从简单的提示词开始，通过全面评估进行优化</p>
<p>遵守三项原则</p>
<ul>
<li>简洁性</li>
<li>透明度：展示智能体的规划步骤</li>
<li>把工具设计成模型容易理解、容易正确使用、容易从错误中恢复的形式
<ul>
<li>一定要方便调试</li>
</ul>
</li>
</ul>
<h1 id="appendix">Appendix</h1>
<h2 id="customer-support">Customer support</h2>
<p>与客户交互天然适合使用Agent，非常推荐从chatbot升级到agent</p>
<ul>
<li>客服：天然是聊天界面</li>
<li>agent 比普通 chatbot 多了工具能力</li>
</ul>
<p>同时agent通过与客户交互过程中了解用户需求，明确动作</p>
<ul>
<li>对于客户数据、订单历史记录和知识库文章
<ul>
<li>可以通过工具调用进行获取，获取信息后作为上下文</li>
<li>但这里的操作比较松弛</li>
</ul>
</li>
<li>对于退款、更新工单等<strong>写操作</strong>
<ul>
<li>非常危险，需要由业务代码进行校验</li>
<li>应当设计一个代码接口（内部需要进行非常严格的参数校验，必须由程序化代码来保证权限、规则、确定性和审计）</li>
<li>最后暴露给模型的一般是一个函数接口</li>
</ul>
</li>
</ul>
<p>并且该类任务容易获取是否成功：通过客户反馈</p>
<h2 id="coding-agent">Coding Agent</h2>
<ul>
<li>代码方案可以设计测试代码检验</li>
<li>通过测试结果反馈迭代</li>
<li>问题定义明确</li>
<li>输出指令可以客观衡量</li>
</ul>
<h2 id="tool">Tool</h2>
<p>对于工具集文档的书写非常重要，甚至比任务提示词更重要</p>
<p>这里可以称为：Agent-Computer Interface</p>
<ul>
<li>降低认知负荷
<ul>
<li>让模型在输出格式化结果前，有足够的token进行思考</li>
<li>避免复杂格式限制
<ul>
<li>json里写代码需要对换行、双引号进行痛苦转义</li>
</ul>
</li>
</ul>
</li>
<li>ACI接口要让人类都能看得懂
<ul>
<li>清晰的边界、对待初级程序员</li>
</ul>
</li>
<li>防呆设计（例如CPU的防呆卡槽会让你无法装反CPU）
<ul>
<li>从<strong>工具的底层逻辑和参数设计</strong>上，让模型“根本没有犯错的机会”</li>
<li>例如：模型不擅长相对路径，那就要求模型全部输出绝对路径</li>
</ul>
</li>
</ul>
]]></content:encoded></item></channel></rss>