PageSourceSearch

https://weiruyi.github.io/assets/effective-harnesses-for-long-running-agents.html-tZRpTLWA.js

js weiruyi.github.io collected 2026-10-03 10:10:03 UTC 24,564 bytes, 55 lines download raw bytes

1import{_ as n}from"./plugin-vue_export-helper-DlAUqK2U.js";import{c as t,a as i,d as e,o as a}from"./app-CpE2Mp5p.js";const s={},l=e('<h1 id="长运行-agent-工程实践-anthropic-有效框架设计" tabindex="-1"><a class="header-anchor" href="#长运行-agent-工程实践-anthropic-有效框架设计"><span>长运行 Agent 工程实践:Anthropic 有效框架设计</span></a></h1><h2 id="一、引言" tabindex="-1"><a class="header-anchor" href="#一、引言"><span>一、引言</span></a></h2><div class="hint-container tip"><p class="hint-container-title">背景</p><p>2025 年 11 月 26 日,Anthropic 工程师 Justin Young 发表了一篇题为 &quot;Effective harnesses for long-running agents&quot; 的重要文章。这篇文章探讨了如何构建能够在多个上下文窗口中持续工作数小时甚至数天的智能体框架,并通过构建 claude.ai 克隆项目的实际案例展示了完整的解决方案。</p></div><p>在 AI 辅助编程日益普及的今天,我们经常会遇到这样的场景:一个复杂的项目需要 AI 持续工作数天,涉及多个功能模块的开发、测试和集成。然而,传统的单会话 AI 助手面临着根本性的限制——上下文窗口是有限的,每次新会话都要从零开始。</p><p>这篇文章正是针对这一核心问题,提出了一套完整的工程化解决方案。</p>',5),r=e(`<hr><h2 id="二、长运行-agent-的核心挑战" tabindex="-1"><a class="header-anchor" href="#二、长运行-agent-的核心挑战"><span>二、长运行 Agent 的核心挑战</span></a></h2><h3 id="_1、离散会话问题" tabindex="-1"><a class="header-anchor" href="#_1、离散会话问题"><span>1、离散会话问题</span></a></h3><p>长运行 Agent 面临的最根本挑战是<strong>会话的离散性</strong>:</p><ul><li>每个会话都是独立的,没有之前工作的记忆</li><li>上下文窗口限制了单次能处理的信息量</li><li>复杂项目往往需要数小时甚至数天才能完成</li></ul><div class="hint-container warning"><p class="hint-container-title">现实场景</p><p>想象一下让 AI 帮你构建一个完整的 Web 应用:</p><ul><li>第一天:搭建项目结构和基础组件</li><li>第二天:实现用户认证和数据库</li><li>第三天:开发前端界面和 API 集成</li></ul><p>传统方式下,第二天开始时 AI 已经忘记了第一天做了什么。</p></div><h3 id="_2、记忆连续性缺失" tabindex="-1"><a class="header-anchor" href="#_2、记忆连续性缺失"><span>2、记忆连续性缺失</span></a></h3><p>没有有效的状态持久化机制,Agent 无法:</p><ul><li>回顾之前的决策和实现</li><li>了解当前项目的进度</li><li>避免重复工作或冲突</li><li>保持一致的代码风格和架构</li></ul><hr><h2 id="三、解决方案-双层-agent-架构" tabindex="-1"><a class="header-anchor" href="#三、解决方案-双层-agent-架构"><span>三、解决方案:双层 Agent 架构</span></a></h2><p>Anthropic 的解决方案采用了<strong>双层智能体架构</strong>,每个智能体有不同的职责和提示词。</p><h3 id="_1、initializer-agent-环境初始化" tabindex="-1"><a class="header-anchor" href="#_1、initializer-agent-环境初始化"><span>1、Initializer Agent:环境初始化</span></a></h3><p><strong>Initializer Agent</strong> 负责在首次运行时设置完整的开发环境:</p><table><thead><tr><th>产物</th><th>作用</th></tr></thead><tbody><tr><td><code>init.sh</code></td><td>环境初始化脚本</td></tr><tr><td><code>claude-progress.txt</code></td><td>进度跟踪文件</td></tr><tr><td>初始 git commit</td><td>版本控制起点</td></tr><tr><td><code>features.json</code></td><td>功能清单(&gt;200 个功能)</td></tr></tbody></table><div class="hint-container info"><p class="hint-container-title">功能清单设计</p><p>所有功能初始状态都标记为 <code>&quot;passes&quot;: false</code>,随着开发进展逐个更新为 <code>true</code>。</p></div><h3 id="_2、coding-agent-渐进式开发" tabindex="-1"><a class="header-anchor" href="#_2、coding-agent-渐进式开发"><span>2、Coding Agent:渐进式开发</span></a></h3><p><strong>Coding Agent</strong> 在每个会话中负责实际的开发工作,遵循以下原则:</p><ul><li><strong>一次只处理一个功能</strong> - 避免贪多嚼不烂</li><li><strong>留下干净的状态</strong> - 每个会话结束时项目处于可运行状态</li><li><strong>
1提交到 git</strong> - 每次变更都有版本记录</li><li><strong>更新进度文件</strong> - 明确标记已完成的工作</li></ul><div class="hint-container tip"><p class="hint-container-title">核心思想</p><p>就像人类工程师一样:每次开始工作时先查看 git 日志和进度,了解当前状态,然后专注于下一个任务,完成后提交并更新记录。</p></div><hr><h2 id="四、三大关键设计要素" tabindex="-1"><a class="header-anchor" href="#四、三大关键设计要素"><span>四、三大关键设计要素</span></a></h2><h3 id="_1、feature-list-功能清单管理" tabindex="-1"><a class="header-anchor" href="#_1、feature-list-功能清单管理"><span>1、Feature List:功能清单管理</span></a></h3><p><strong>功能清单</strong>是整个系统的核心,采用 JSON 格式定义:</p><div class="language-json line-numbers-mode" data-ext="json" data-title="json"><pre class="language-json"><code><span class="token punctuation">{</span>
2  <span class="token property">&quot;features&quot;</span><span class="token operator">:</span> <span class="token punctuation">[</span>
3    <span class="token punctuation">{</span>
4      <span class="token property">&quot;name&quot;</span><span class="token operator">:</span> <span class="token string">&quot;New chat button creates a fresh conversation&quot;</span><span class="token punctuation">,</span>
5      <span class="token property">&quot;steps&quot;</span><span class="token operator">:</span> <span class="token punctuation">[</span>
6        <span class="token string">&quot;Click &#39;New Chat&#39; button&quot;</span><span class="token punctuation">,</span>
7        <span class="token string">&quot;Verify conversation area is cleared&quot;</span><span class="token punctuation">,</span>
8        <span class="token string">&quot;Confirm new messages go to fresh conversation&quot;</span>
9      <span class="token punctuation">]</span><span class="token punctuation">,</span>
10      <span class="token property">&quot;passes&quot;</span><span class="token operator">:</span> <span class="token boolean">false</span>
11    <span class="token punctuation">}</span>
12  <span class="token punctuation">]</span>
13<span class="token punctuation">}</span>
14</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><details class="hint-container details"><summary>为什么需要功能清单?</summary><ol><li><strong>明确范围</strong> - 知道需要做什么,不需要做什么</li><li><strong>进度跟踪</strong> - 一目了然地看到已完成和待完成的工作</li><li><strong>避免遗漏</strong> - 确保所有功能都被实现和测试</li><li><strong>自动化验证</strong> - 可以编写脚本自动验证功能是否正常</li></ol></details><h3 id="_2、incremental-progress-状态持久化" tabindex="-1"><a class="header-anchor" href="#_2、incremental-progress-状态持久化"><span>2、Incremental Progress:状态持久化</span></a></h3><p>状态持久化通过两种机制实现:</p><p><strong>Git 版本控制:</strong></p><ul><li>每个功能完成后创建独立的 commit</li><li>commit message 清晰描述完成的工作</li><li>可以随时回滚到之前的状态</li></ul><p><strong>进度文件:</strong></p><div class="language-text line-numbers-mode" data-ext="text" data-title="text"><pre class="language-text"><code># claude-progress.txt
15Project: claude.ai Clone
16Started: 2025-11-20
17Last Updated: 2025-11-22
18
19Completed Features:
20- [x] Project setup and basic structure
21- [x] Chat interface layout
22- [x] Message sending functionality
23- [x] ...
24
25Next Up:
26- [ ] User authentication
27- [ ] Chat history persistence
28</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="hint-container tip"><p class="hint-container-title">人类工程师的类比</p><p>这就像我们每天下班前会:</p><ol><li>提交当天的代码</li><li>更新项目管理工具(Jira/Trello)</li><li>写工作日志记录进度</li></ol><p>第二天上班时:</p><ol><li>看 git log 了解最近的变更</li><li>看项目管理工具了解当前状态</li><li>继续下一个任务</li></ol></div><h3 id="_3、automated-testing-自动化验证" tabindex="-1"><a class="header-anchor" href="#_3、automated-testing-自动化验证"><span>3、Automated Testing:自动化验证</span></a></h3><p>文章中使用 <strong>Puppeteer MCP</strong> 进行端到端测试:</p><ul><li>
28自动打开浏览器</li><li>模拟用户操作</li><li>截图验证界面</li><li>验证功能是否正常工作</li></ul><div class="hint-container info"><p class="hint-container-title">测试的重要性</p><p>没有自动化测试,Agent 很容易:</p><ul><li>过早宣告胜利(看起来工作了,其实有 bug)</li><li>破坏已有的功能(回归问题)</li><li>遗漏边界条件</li></ul></div><hr><h2 id="五、典型工作流解析" tabindex="-1"><a class="header-anchor" href="#五、典型工作流解析"><span>五、典型工作流解析</span></a></h2><p>让我们看看一次完整的会话流程是什么样的:</p><h3 id="会话开始时" tabindex="-1"><a class="header-anchor" href="#会话开始时"><span>会话开始时:</span></a></h3><div class="language-text line-numbers-mode" data-ext="text" data-title="text"><pre class="language-text"><code># 1. 检查当前目录
29!pwd
30!ls -la
31
32# 2. 阅读进度文件
33@claude-progress.txt
34
35# 3. 查看 git 历史
36!git log --oneline -10
37
38# 4. 阅读功能清单
39@features.json
40
41# 5. 启动开发服务器
42!npm run dev
43
44# 6. 测试基础功能是否正常
45(使用 Puppeteer MCP 打开页面并验证)
46</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="开发过程中" tabindex="-1"><a class="header-anchor" href="#开发过程中"><span>开发过程中:</span></a></h3><div class="language-text line-numbers-mode" data-ext="text" data-title="text"><pre class="language-text"><code># 7. 选择下一个未完成的功能
47# 8. 实现功能
48# 9. 运行测试验证
49# 10. 提交代码
50!git add .
51!git commit -m &quot;Implement: New chat button creates fresh conversation&quot;
52
53# 11. 更新功能清单(标记 passes: true)
54# 12. 更新进度文件
55</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="会话结束时" tabindex="-1"><a class="header-anchor" href="#会话结束时"><span>会话结束时:</span></a></h3><p>项目处于<strong>干净、可运行</strong>的状态,下一个会话可以从这里继续。</p><hr><h2 id="六、四种失败模式与避坑指南" tabindex="-1"><a class="header-anchor" href="#六、四种失败模式与避坑指南"><span>六、四种失败模式与避坑指南</span></a></h2><p>文章总结了四种常见的失败模式及其解决方案:</p><table><thead><tr><th>失败模式</th><th>现象</th><th>解决方案</th></tr></thead><tbody><tr><td><strong>Premature Victory</strong><br>过早宣告胜利</td><td>Agent 声称完成了,但实际功能有问题</td><td>自动化测试验证,不要只看表面</td></tr><tr><td><strong>Leaving Bugs</strong><br>遗留 Bug</td><td>新功能工作了,但破坏了旧功能</td><td>完整的测试套件,每次都回归测试</td></tr><tr><td><strong>Premature Feature Completion</strong><br>功能过早完成</td><td>标记功能为完成,但只实现了部分</td><td>功能清单逐项验证,确保所有步骤都通过</td></tr><tr><td><strong>Wasting Time on Setup</strong><br>浪费时间在配置</td><td>每次会话都花大量时间重新配置环境</td><td>初始化脚本 + 状态持久化,站在之前的肩膀上</td></tr></tbody></table><div class="hint-container warning"><p class="hint-container-title">真实案例</p><p>在 claude.ai 克隆项目的早期尝试中:</p><ul><li>Agent 经常&quot;完成&quot;一个功能,但实际上只处理了 happy path</li><li>没有测试,导致后续变更经常破坏已有功能</li><li>没有状态持久化,每次都要重新理解项目</li></ul></div><hr><h2 id="七、未来展望" tabindex="-1"><a class="header-anchor" href="#七、未来展望"><span>七、未来展望</span></a></h2><h3 id="_1、单智能体-vs-多智能体" tabindex="-1"><a class="header-anchor" href="#_1、单智能体-vs-多智能体"><span>1、单智能体 vs 多智能体</span></a></h3><p>文章提出了一个开放问题:<strong>是使用单个智能体还是多个智能体更好?</strong></p><div class="hint-container info"><p class="hint-container-title">两种思路</p><p><strong>单智能体:</strong></p><ul><li>优点:简单,协调成本低</li><li>缺点:单个上下文窗口限制,任务串行</li></ul><p><strong>多智能体:</strong></p><ul><li>优点:可以并行工作,专业分工</li><li>缺点:需要协调机制,通信成本高</li></ul></div><p>这个问题目前还没有明确答案,需要更多探索。</p><h3 id="_2、跨领域推广" tabindex="-1"><a class="header-anchor" href="#_2、跨领域推广"><span>2、跨领域推广</span></a></h3><p>目前的方案主要针对 <strong>Web 应用开发</strong>,未来可以推广到:</p><ul><li><strong>科学研究</strong> - 设计实验、分析数据、撰写论文</li><li><strong>金融建模</strong> - 构建预测模型、回测策略</li><li><strong>内容创作</strong> - 写作长文、制作视频、设计图形</li><li><strong>更多领域</strong> - 任何需要长期持续工作的任务</li></ul><hr><h2 id="八、总结" tabindex="-1"><a class="header-anchor" href="#八、总结"><span>八、总结</span></a></h2><p>这篇文章为我们展示了一套完整的长运行 Agent 工程实践:</p><h3 id="核心要点回顾" tabindex="-1"><a class="header-anchor" href="#核心要点回顾"><span>核心要点回顾:</span></a></h3><ol><li><strong>双层架构</strong> - Initializer + Coding 各司其职</li><li><strong>功能清单</strong> - 明确范围,跟踪进度</li><li><strong>状态持久化</strong> - Git + 进度文件,记住之前的工作</li><li><strong>自动化测试</strong> - 避免过早宣告胜利</li><li><strong>渐进式开发</strong> - 一次一个功能,保持干净状态</li></ol><h3 id="对我们的启示" tabindex="-1"><a class="header-anchor" href="#对我们的启示"><span>对我们的启示:</span></a></h3><div class="hint-container tip"><p class="hint-container-title">关键洞察</p><p>构建有效的长运行 Agent,本质上是在<strong>模仿人类工程师的工作方式</strong>:</p><ul><li>我们用 git 管理代码版本</li><li>我们用项目管理工具跟踪进度</li><li>我们写测试确保质量</li><li>我们每天下班前整理好状态</li></ul><p>让 Agent 也遵循这些工程实践,它们就能持续工作数天甚至数周。</p></div><h3 id="行动建议" tabindex="-1"><a class="header-anchor" href="#行动建议"><span>行动建议:</span></a></h3><p>如果你正在构建自己的长运行 Agent,可以尝试:</p><ol><li>从功能清单开始,明确要做什么</li><li>设计状态持久化机制,记住之前的工作</li><li>添加自动化测试,验证每一步</li><li>保持渐进式,不要试图一次做太多</li></ol><hr><h2 id="参考链接" tabindex="-1"><a class="header-anchor" href="#参考链接"><span>参考链接</span></a></h2><ul><li><a href="https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents" target="_blank" rel="noopener noreferrer">原文:Effective harnesses for long-running agents</a> - Anthropic Engineering Blog, Nov 26, 2025</li></ul><hr><p><em>本文基于 Anthropic 官方文章整理和解读,希望对构建长运行 Agent 的实践者有所启发。</em></p>`,75);function o(d,c){return a(),t("div",null,[l,i(" more "),r])}const h=n(s,[["render",o],["__file","effective-harnesses-for-long-running-agents.html.vue"]]),u=JSON.parse('{"path":"/posts/blog/effective-harnesses-for-long-running-agents.html","title":"持久运行Agent的高效管控方案","lang":"zh-CN","frontmatter":{"title":"持久运行Agent的高效管控方案","date":"2026-03-24T00:00:00.000Z","tags":["AI","Agent","Claude","工程实践"],"category":"AI","order":4,"description":"深入解析 Anthropic 2025 年 11 月发布的长运行 Agent 框架设计,从 claude.ai 克隆项目看如何构建可持续工作数天的智能体","head":[["meta",{"property":"og:url","content":"https://mister-hope.github.io/posts/blog/effective-harnesses-for-long-running-agents.html"}],["meta",{"property":"og:site_name","content":"Lance"}],["meta",{"property":"og:title","content":"持久运行Agent的高效管控方案"}],["meta",{"property":"og:description","content":"深入解析 Anthropic 2025 年 11 月发布的长运行 Agent 框架设计,从 claude.ai 克隆项目看如何构建可持续工作数天的智能体"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}
55],["meta",{"property":"og:updated_time","content":"2026-03-25T07:23:07.000Z"}],["meta",{"property":"article:author","content":"RuyiWei"}],["meta",{"property":"article:tag","content":"AI"}],["meta",{"property":"article:tag","content":"Agent"}],["meta",{"property":"article:tag","content":"Claude"}],["meta",{"property":"article:tag","content":"工程实践"}],["meta",{"property":"article:published_time","content":"2026-03-24T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2026-03-25T07:23:07.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"持久运行Agent的高效管控方案\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2026-03-24T00:00:00.000Z\\",\\"dateModified\\":\\"2026-03-25T07:23:07.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"RuyiWei\\"}]}"]]},"headers":[{"level":2,"title":"一、引言","slug":"一、引言","link":"#一、引言","children":[]},{"level":2,"title":"二、长运行 Agent 的核心挑战","slug":"二、长运行-agent-的核心挑战","link":"#二、长运行-agent-的核心挑战","children":[{"level":3,"title":"1、离散会话问题","slug":"_1、离散会话问题","link":"#_1、离散会话问题","children":[]},{"level":3,"title":"2、记忆连续性缺失","slug":"_2、记忆连续性缺失","link":"#_2、记忆连续性缺失","children":[]}]},{"level":2,"title":"三、解决方案:双层 Agent 架构","slug":"三、解决方案-双层-agent-架构","link":"#三、解决方案-双层-agent-架构","children":[{"level":3,"title":"1、Initializer Agent:环境初始化","slug":"_1、initializer-agent-环境初始化","link":"#_1、initializer-agent-环境初始化","children":[]},{"level":3,"title":"2、Coding Agent:渐进式开发","slug":"_2、coding-agent-渐进式开发","link":"#_2、coding-agent-渐进式开发","children":[]}]},{"level":2,"title":"四、三大关键设计要素","slug":"四、三大关键设计要素","link":"#四、三大关键设计要素","children":[{"level":3,"title":"1、Feature List:功能清单管理","slug":"_1、feature-list-功能清单管理","link":"#_1、feature-list-功能清单管理","children":[]},{"level":3,"title":"2、Incremental Progress:状态持久化","slug":"_2、incremental-progress-状态持久化","link":"#_2、incremental-progress-状态持久化","children":[]},{"level":3,"title":"3、Automated Testing:自动化验证","slug":"_3、automated-testing-自动化验证","link":"#_3、automated-testing-自动化验证","children":[]}]},{"level":2,"title":"五、典型工作流解析","slug":"五、典型工作流解析","link":"#五、典型工作流解析","children":[{"level":3,"title":"会话开始时:","slug":"会话开始时","link":"#会话开始时","children":[]},{"level":3,"title":"开发过程中:","slug":"开发过程中","link":"#开发过程中","children":[]},{"level":3,"title":"会话结束时:","slug":"会话结束时","link":"#会话结束时","children":[]}]},{"level":2,"title":"六、四种失败模式与避坑指南","slug":"六、四种失败模式与避坑指南","link":"#六、四种失败模式与避坑指南","children":[]},{"level":2,"title":"七、未来展望","slug":"七、未来展望","link":"#七、未来展望","children":[{"level":3,"title":"1、单智能体 vs 多智能体","slug":"_1、单智能体-vs-多智能体","link":"#_1、单智能体-vs-多智能体","children":[]},{"level":3,"title":"2、跨领域推广","slug":"_2、跨领域推广","link":"#_2、跨领域推广","children":[]}]},{"level":2,"title":"八、总结","slug":"八、总结","link":"#八、总结","children":[{"level":3,"title":"核心要点回顾:","slug":"核心要点回顾","link":"#核心要点回顾","children":[]},{"level":3,"title":"对我们的启示:","slug":"对我们的启示","link":"#对我们的启示","children":[]},{"level":3,"title":"行动建议:","slug":"行动建议","link":"#行动建议","children":[]}]},{"level":2,"title":"参考链接","slug":"参考链接","link":"#参考链接","children":[]}
55],"git":{"createdTime":1774359719000,"updatedTime":1774423387000,"contributors":[{"name":"weiruyi","email":"[email protected]","commits":3}]},"readingTime":{"minutes":7.76,"words":2328},"filePathRelative":"posts/blog/effective-harnesses-for-long-running-agents.md","localizedDate":"2026å¹´3月24日","excerpt":"\\n<h2>一、引言</h2>\\n<div class=\\"hint-container tip\\">\\n<p class=\\"hint-container-title\\">背景</p>\\n<p>2025 å¹´ 11 月 26 日,Anthropic 工程师 Justin Young 发表了一篇题为 \\"Effective harnesses for long-running agents\\" 的重要文章。这篇文章探讨了如何构建能够在多个上下文窗口中持续工作数小时甚至数天的智能体框架,并通过构建 claude.ai 克隆项目的实际案例展示了完整的解决方案。</p>\\n</div>\\n<p>在 AI 辅助编程日益普及的今天,我们经常会遇到这样的场景:一个复杂的项目需要 AI 持续工作数天,涉及多个功能模块的开发、测试和集成。然而,传统的单会话 AI 助手面临着根本性的限制——上下文窗口是有限的,每次新会话都要从零开始。</p>\\n<p>这篇文章正是针对这一核心问题,提出了一套完整的工程化解决方案。</p>\\n"}');export{h as comp,u as data};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.