<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Lucas Lab</title>
    <link>https://lucas-blog.zhaiyx2020start.workers.dev</link>
    <description>记录思考，分享所学，留住当下。</description>
    <language>zh-CN</language>
    <atom:link href="https://lucas-blog.zhaiyx2020start.workers.dev/feed.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>真正让 AI 写好大项目代码的，不是模型，而是工程环境</title>
      <link>https://lucas-blog.zhaiyx2020start.workers.dev/2026-05-15-w0vzc9</link>
      <guid isPermaLink="true">https://lucas-blog.zhaiyx2020start.workers.dev/2026-05-15-w0vzc9</guid>
      <description>当所有人都在争论哪个 AI 模型写代码最强时，Anthropic 的 Claude Code 团队提出了一个反直觉的观点：在几十万行的大型项目中，模型从来不是真正的瓶颈，工程环境才是。</description>
      <content:encoded><![CDATA[<blockquote><p>从 Claude Code 的大型代码库实践，看 AI Coding 如何从“个人效率工具”走向“工程生产系统”</p><p>来源：<a target="_blank" rel="noopener noreferrer nofollow" href="https://claude.com/blog/how-claude-code-works-in-large-codebases-best-practices-and-where-to-start">https://claude.com/blog/how-claude-code-works-in-large-codebases-best-practices-and-where-to-start</a></p></blockquote><p>很多人使用 AI 编程工具时，关注点通常很直接：</p><p>这个模型够不够强？</p><p>它能不能一次写出正确代码？</p><p>它会不会理解我的项目？</p><p>这些问题当然重要，但它们只问到了表层。真正进入大型代码库之后，问题会变得完全不同。</p><p>在一个几十万行、几百万行，甚至跨多个仓库、多个团队、多个技术栈的系统里，AI 编程工具面临的核心问题不是“会不会写代码”，而是：</p><p>它怎么知道该看哪里？</p><p>它怎么区分新代码和旧代码？</p><p>它怎么理解团队约定？</p><p>它怎么知道哪些命令该执行？</p><p>它怎么避免把过期文档当成事实？</p><p>它怎么把一次成功经验沉淀成团队能力？</p><p>Anthropic 最近发布了一篇关于 Claude Code 在大型代码库中工作的文章。表面看，它讲的是 Claude Code 的最佳实践；但真正值得提取的，是它背后提出的一套更通用的 AI Coding 工程化思想。</p><p>这篇文章的核心可以压缩成一句话：</p><blockquote><p>AI Coding 的效果，不只取决于模型，而取决于模型所在的工程环境。</p></blockquote><p>换句话说，一个模型是否能在大项目里稳定产出，不是单看它的推理能力，而是要看它有没有足够清晰的上下文、可靠的工具链、自动化的验证机制，以及可持续维护的组织流程。</p><p>这也是很多团队使用 AI 编程工具时最容易忽略的地方。</p><hr><h1>一、AI 在大代码库里，真正缺的不是“全部上下文”</h1><p>很多人对 AI 编程有一个直觉：</p><p>既然模型不理解项目，那就把更多代码、更多文档、更多规则塞给它。</p><p>这个思路看似合理，但在大代码库里经常失效。</p><img src="/api/images/image/2026/05/48af76454dbfbb92-image.webp" alt="image.png" data-align="center" style="display: block; max-width: 100%; margin-left: auto; margin-right: auto;"><p>原因很简单：大项目的信息量太大，不可能一次性全部交给模型。即使上下文窗口变得更大，把所有代码、文档、配置和历史决策都塞进去，也会带来新的问题：噪音变多、重点变弱、</p><p>模型注意力被稀释。</p><p>对大代码库来说，更关键的问题不是“让 AI 看到所有东西”，而是“让 AI 知道从哪里开始找”。</p><p>Claude Code 的思路更接近一个真实工程师：<mark>它不是提前把整个代码库都索引好，再从索引里召回片段；而是在本地代码库中遍历文件、读取文件、使用 grep 搜索，并沿着引用关系追踪代码。</mark></p><p>这和传统 RAG 式代码检索有明显差别。</p><p>RAG 的问题在于，索引可能滞后。大型工程团队每天都有大量提交，函数可能被改名，模块可能被移动，接口可能被删除。如果索引更新不及时，AI 拿到的就可能是几小时、几天甚至几周前的代码。</p><p>在普通问答场景里，信息旧一点可能还可以接受；但在代码场景里，旧代码就是错误上下文。</p><p>所以，Claude Code 强调的是一种更接近实时工作区的方式：从开发者当前机器上的真实代码库出发，现场搜索，现场阅读，现场推断。</p><p>但这也带来一个新问题：</p><p>如果 AI 不知道入口在哪里，它就会在庞大的文件系统里盲目搜索。</p><p>这时候，大代码库是否“可导航”，就变成了 AI Coding 能否成功的前提。</p><hr><h1>二、让代码库变得“可导航”，比写神奇 Prompt 更重要</h1><p>很多人一提到 AI 编程，就会去找 Prompt 模板。</p><p>比如：</p><p>“你是一个资深 Java 架构师，请帮我分析……”</p><p>“请一步一步思考……”</p><p>“请严格遵循最佳实践……”</p><p>这些提示词不是完全没用，但它们解决不了大型代码库的核心问题。</p><p>因为模型真正需要的不是角色扮演，而是工程地图。</p><p>Claude Code 文章里反复强调 <code>CLAUDE.md</code> 的价值。这个文件本质上不是说明书，也不是文档仓库，而是给 AI 的项目上下文入口。</p><p>更准确地说，它像是代码库里的“导航标识”。</p><p>一个好的根目录 <code>CLAUDE.md</code> 不应该写成百科全书，而应该写成地图：</p><ul class="tight" data-tight="true"><li><p><code>auth-service：用户、角色、权限、菜单、资源管理</code></p></li><li><p><code>workflow-service：审批流、流程节点、任务流转</code></p></li><li><p><code>finance-service：报销、借款、还款、票据处理</code></p></li><li><p><code>frontend：管理端页面，基于 Vue / React</code></p></li><li><p><code>deploy：Jenkins、Docker、K8s、Nginx 部署文件</code></p></li></ul><h1><code>Global Conventions</code></h1><ul class="tight" data-tight="true"><li><p><code>Java 17</code></p></li><li><p><code>Spring Boot 3.x</code></p></li><li><p><code>Controller 不写业务逻辑</code></p></li><li><p><code>金额字段使用 BigDecimal</code></p></li><li><p><code>Long 返回前端时序列化为 String</code></p></li></ul><h1><code>Critical Gotchas</code></h1><ul class="tight" data-tight="true"><li><p><code>权限校验不能依赖前端传 permission_code</code></p></li><li><p><code>修改流程节点逻辑必须补充回归场景</code></p></li><li><p><code>Mapper XML 中新增 SQL 时必须检查索引和空值处理<br></code></p></li></ul><p>它不需要解释每个表、每个接口、每个业务分支。那些内容应该放在更靠近具体模块的位置。</p><p>更合理的结构是：</p><pre><code class="language-text">/CLAUDE.md
/auth-service/CLAUDE.md
/workflow-service/CLAUDE.md
/finance-service/CLAUDE.md
/frontend/CLAUDE.md
/deploy/CLAUDE.md</code></pre><p>根目录负责全局地图，子目录负责局部规则。</p><p>这背后的原则很重要：</p><blockquote><p>上下文要分层，而不是堆叠。</p></blockquote><p>如果把所有规则都塞进一个巨大文档里，AI 每次启动都要读取一大堆不相关信息，结果反而变差。</p><p>大项目里的上下文设计，应该像后端系统设计一样：分层、解耦、按需加载。</p><hr><h1>三、模型不是独立工作的，Harness 才是关键</h1><p>原文里有一个非常重要的概念：harness。</p><p>可以把它理解成模型外部的工程承载系统。</p><img src="/api/images/image/2026/05/96925a0f37db96f7-image.webp" alt="image.png" data-align="center" style="display: block; max-width: 100%; margin-left: auto; margin-right: auto;"><p>很多人以为 Claude Code 的能力主要由模型决定：模型强，它就能写好；模型弱，它就写不好。</p><p>但在真实工程环境里，模型只是其中一部分。真正决定结果的，是模型周围有没有一套完整的工作系统。</p><p>这套系统包括：</p><table class="tiptap-table" style="min-width: 75px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>组件</p></th><th colspan="1" rowspan="1"><p>作用</p></th><th colspan="1" rowspan="1"><p>可以理解成什么</p></th></tr><tr><td colspan="1" rowspan="1"><p><code>CLAUDE.md</code></p></td><td colspan="1" rowspan="1"><p>提供项目上下文</p></td><td colspan="1" rowspan="1"><p>项目地图</p></td></tr><tr><td colspan="1" rowspan="1"><p>Hooks</p></td><td colspan="1" rowspan="1"><p>在关键事件自动执行脚本</p></td><td colspan="1" rowspan="1"><p>自动化约束</p></td></tr><tr><td colspan="1" rowspan="1"><p>Skills</p></td><td colspan="1" rowspan="1"><p>按需加载专项知识</p></td><td colspan="1" rowspan="1"><p>任务手册</p></td></tr><tr><td colspan="1" rowspan="1"><p>Plugins</p></td><td colspan="1" rowspan="1"><p>分发成熟配置</p></td><td colspan="1" rowspan="1"><p>团队插件包</p></td></tr><tr><td colspan="1" rowspan="1"><p>MCP Servers</p></td><td colspan="1" rowspan="1"><p>连接外部系统</p></td><td colspan="1" rowspan="1"><p>工具接口</p></td></tr><tr><td colspan="1" rowspan="1"><p>LSP</p></td><td colspan="1" rowspan="1"><p>提供符号级代码导航</p></td><td colspan="1" rowspan="1"><p>IDE 级代码理解</p></td></tr><tr><td colspan="1" rowspan="1"><p>Subagents</p></td><td colspan="1" rowspan="1"><p>拆分探索和编辑任务</p></td><td colspan="1" rowspan="1"><p>分工协作</p></td></tr></tbody></table><p>这几个组件放在一起，才构成一个真正可用的 AI Coding 环境。</p><p>这里最值得注意的是：</p><p>Prompt 不是万能的。</p><p><mark>如果一个动作是确定性的，就不应该靠提示词要求模型“记住”，而应该交给工具自动完成。</mark></p><p>比如：</p><p>每次修改后执行测试。</p><p>每次保存后执行格式化。</p><p>每次改 SQL 后检查索引。</p><p>每次结束会话后生成修改摘要。</p><p>这些事情写在 Prompt 里，模型可能会忘；但做成 hooks，就变成了稳定流程。</p><p>这就是工程化和提示词工程的区别。</p><p>提示词是软约束。</p><p>工具链是硬机制。</p><hr><h1>四、Skills 的价值：不要让所有知识挤在同一个上下文里</h1><p>在复杂项目里，不同任务需要的知识完全不同。</p><p>做接口开发，需要知道 Controller、DTO、参数校验、异常处理。</p><p>改 SQL，需要知道索引、执行计划、空值处理、金额精度。</p><p>改权限模块，需要知道用户、角色、资源、菜单、按钮、API 之间的关系。</p><p>改工作流，需要知道节点状态、流转条件、回退逻辑、审批人规则。</p><p>如果把所有这些知识都写进 <code>CLAUDE.md</code>，它会迅速膨胀，最后变成一份谁都不想维护、AI 也不一定读得好的巨型文档。</p><p>Skills 的意义就在这里。</p><p>它不是项目背景，而是某一类任务的方法论。</p><p>比如一个 Java 企业项目可以准备这些 Skills：</p><pre><code class="language-text">spring-api-review.md
mybatis-sql-review.md
permission-model-change.md
workflow-node-change.md
frontend-vue-review.md
k8s-jenkins-deploy-check.md</code></pre><p>每个 Skill 只处理一种任务。</p><p>当 AI 修改接口时，加载 API Review Skill。</p><p>当 AI 修改 Mapper XML 时，加载 SQL Review Skill。</p><p>当 AI 改权限表结构时，加载 Permission Model Skill。</p><p>这样做的价值不是“文档更整齐”，而是让 AI 在正确的时刻获得正确的知识。</p><p>这也是大型系统设计里很常见的思想：</p><p>不要把所有能力做成全局单例。</p><p>要按领域、按场景、按边界组织能力。</p><p>AI Coding 也是一样。</p><hr><h1>五、LSP 的意义：让 AI 不只是 grep，而是理解符号</h1><p>在小项目里，grep 很好用。</p><p>但在大项目里，grep 很容易失效。</p><p>比如你搜索 <code>execute</code>、<code>submit</code>、<code>query</code>、<code>process</code> 这样的函数名，可能会返回几百甚至几千个结果。AI 需要不断打开文件，判断哪个才是相关代码，最后上下文很快被消耗掉。</p><p>这时候 LSP 的价值就出来了。</p><p>LSP，也就是 Language Server Protocol，是现代 IDE 实现“跳转定义”“查找引用”“类型推断”“错误提示”的基础。</p><p>如果 AI 能使用 LSP，它就不只是文本搜索，而是可以做符号级导航：</p><p>这个方法定义在哪里？</p><p>这个接口有哪些实现类？</p><p>这个字段在哪里被引用？</p><p>这个类的调用链是什么？</p><p>同名方法中，哪个才是当前类型真正绑定的那个？</p><p>对于 Java、C++、C# 这类强类型语言，LSP 的价值尤其明显。</p><p>因为很多关系无法只靠字符串判断。</p><p>Spring 项目里也一样。</p><p>你要理解一个接口，不能只看 Controller。你还要追踪 Service、Mapper、XML、Entity、DTO、VO、配置类、注解、事务边界，甚至还有 AOP、拦截器和权限注解。</p><p>如果 AI 只有 grep，它很容易看错。</p><p>如果 AI 有 LSP，它就更接近一个真正使用 IDE 的开发者。</p><p>这也说明一个问题：</p><p>AI Coding 的未来，不是让模型孤立地读文本，而是让模型接入开发者原本就依赖的工程工具。</p><hr><h1>六、MCP 很强，但不应该第一个做</h1><p>现在很多人一听到 MCP，就想马上接入各种系统。</p><p>接数据库。</p><p>接 Jenkins。</p><p>接 GitLab。</p><p>接 Jira。</p><p>接知识库。</p><p>接内部接口。</p><p>这些方向都没问题，但顺序很重要。</p><img src="/api/images/image/2026/05/3ed4c9b2ab26a12d-image.webp" alt="image.png" data-align="center" style="display: block; max-width: 100%; margin-left: auto; margin-right: auto;"><p>如果你的代码库本身没有整理好，<code>CLAUDE.md</code> 没有，模块边界不清，测试命令不明确，构建流程也不稳定，那一上来做 MCP，往往只是把混乱扩散到更多地方。</p><p>更合理的顺序应该是：</p><pre><code class="language-text">CLAUDE.md
→ Skills
→ Hooks
→ LSP
→ MCP</code></pre><p>先让 AI 看得懂当前项目。</p><p>再让 AI 掌握常见任务方法。</p><p>再让 AI 的关键动作自动化。</p><p>再让 AI 具备符号级代码导航能力。</p><p>最后才是接入外部系统。</p><p>MCP 的价值在于扩展 AI 的工作边界。比如：</p><p>读取需求单。</p><p>查询构建日志。</p><p>查看接口文档。</p><p>检索内部知识库。</p><p>分析线上错误日志。</p><p>查询数据库表结构。</p><p>但它不应该替代基础工程整理。</p><p>如果基础上下文是乱的，MCP 只会让 AI 更快地访问更多混乱信息。</p><hr><h1>七、AI Coding 的组织问题：个人能用，不等于团队能用</h1><p>个人使用 AI 编程工具，门槛很低。</p><p>装一个 CLI，打开项目，输入需求，很快就能看到效果。</p><p>但团队级使用完全不同。</p><p>团队需要解决的是：</p><p>谁维护 <code>CLAUDE.md</code>？</p><p>谁决定哪些 Skills 是标准的？</p><p>谁管理 hooks？</p><p>谁控制 MCP 权限？</p><p>谁负责插件分发？</p><p>AI 生成的代码走什么 review 流程？</p><p>哪些任务允许 AI 自动执行？</p><p>哪些操作必须人工确认？</p><p>如果没有统一治理，AI Coding 很容易变成“个人经验碎片”。</p><p>有的人写了一套很好用的配置，但只存在自己电脑里。</p><p>有的人调通了一个工作流，但没有沉淀成团队标准。</p><p>有的人踩过坑，但没有进入项目文档。</p><p>最后每个人都在重复搭环境、重复写提示词、重复踩坑。</p><p>这不是工具问题，而是组织问题。</p><p>Anthropic 原文里提到，在一些成熟组织里，已经出现了类似 agent manager 的角色。这个角色不只是工程师，也不只是产品经理，而是负责管理 AI Coding 生态：配置、权限、插件、规范、推广、治理。</p><p>即使没有专门团队，至少也需要一个明确负责人。</p><p>这和 DevOps、平台工程、研发效能的发展路径很像。</p><p>刚开始，每个人自己写脚本。</p><p>后来，团队发现脚本需要共享。</p><p>再后来，脚本变成平台能力。</p><p>AI Coding 也会走类似路径。</p><p>从个人工具，到团队规范，再到组织级开发基础设施。</p><img src="/api/images/image/2026/05/47e95a422e7432ac-image.webp" alt="image.png" data-align="center" style="display: block; max-width: 100%; margin-left: auto; margin-right: auto;"><hr><h1>八、这篇文章真正给开发者的启发</h1><p>如果只把这篇文章看成 Claude Code 的官方宣传，就会低估它的价值。</p><p>它真正提供的是一个判断框架：</p><blockquote><p>AI Coding 不是把模型放进代码编辑器，而是把模型放进工程系统。</p></blockquote><p>对个人开发者来说，最小可行版本可以很简单：</p><ol class="tight" data-tight="true"><li><p><code>写一个根目录 CLAUDE.md</code></p></li><li><p><code>为核心模块补充局部 CLAUDE.md</code></p></li><li><p><code>建一份 codebase-map.md</code></p></li><li><p><code>明确每个模块的构建和测试命令</code></p></li><li><p><code>整理常见坑和修改注意事项</code></p></li><li><p><code>为高频任务沉淀几个 Skill 文档<br></code></p></li></ol><p>这不需要大团队，也不需要复杂平台。</p><p>只要你愿意整理自己的项目，AI 的效果就会明显变好。</p><p>对团队来说，更成熟的版本是：</p><ol class="tight" data-tight="true"><li><p><code>标准化 CLAUDE.md 分层结构</code></p></li><li><p><code>建立团队级 Skills</code></p></li><li><p><code>用 hooks 固化测试、格式化、检查流程</code></p></li><li><p><code>接入 LSP 提升代码导航能力</code></p></li><li><p><code>谨慎接入 MCP，优先只读权限</code></p></li><li><p><code>建立 AI 生成代码的 review 规范</code></p></li><li><p><code>定期清理过时配置</code></p></li><li><p><code>指定负责人维护 AI Coding 工作流<br></code></p></li></ol><p>这里面最重要的不是技术复杂度，而是持续维护。</p><p>因为 AI 模型在进化，项目也在进化。</p><p>今天有效的提示和约束，三个月后可能变成负担。</p><p>比如早期模型可能不擅长跨文件重构，所以团队会要求它“一次只改一个文件”。但新模型可能已经能处理跨文件修改，这条规则反而会限制它。</p><p>所以 AI Coding 的配置也需要像代码一样维护。</p><p>它不是一次性文档。</p><p>它是工程资产。</p><hr><h1>九、我认为最值得带走的四个结论</h1><p>第一，AI 不需要知道所有代码，但必须知道从哪里开始。</p><p>大项目的关键不是喂更多上下文，而是建立清晰的导航结构。</p><p>第二，Prompt 解决不了工程流程问题。</p><p>能自动化的事情，不要靠模型记忆。测试、格式化、检查、摘要、权限限制，都应该尽量交给 hooks 和工具链。</p><p>第三，知识要按任务加载，而不是全局堆积。</p><p><code>CLAUDE.md</code> 放项目共识，Skills 放专项方法，MCP 负责外部系统，LSP 负责代码导航。每种东西都有自己的边界。</p><p>第四，AI Coding 最终会变成研发基础设施。</p><p>今天很多人还把它当个人助手，但在大型组织里，它会越来越像 DevOps、CI/CD、研发效能平台一样，成为团队工程系统的一部分。</p><hr><h1>真正的门槛，不是会不会用 AI，而是会不会整理工程环境</h1><p>AI 编程工具正在变强，这一点已经很明显。</p><p>但越往真实项目里走，越会发现：模型能力只是起点。</p><p>真正决定 AI 能否稳定工作的，是代码库本身是否清晰，文档是否分层，规则是否可执行，工具是否接通，验证是否自动化，团队是否有人维护这套系统。</p><p>所以，与其不断寻找一个“更强的模型”，不如先问一个更实际的问题：</p><p>我的项目，对 AI 来说，是不是一个可理解、可导航、可验证的工作环境？</p><p>如果答案是否定的，那么模型再强，也只是在混乱中猜测。</p><p>如果答案是肯定的，AI 就不只是一个代码补全工具，而会逐渐变成你工程体系中的协作者。</p><p>这也是 Claude Code 这篇文章最值得学习的地方：</p><p>它没有把 AI Coding 描述成魔法。</p><p>它把 AI Coding 放回了工程本身。</p>]]></content:encoded>
      <category>AI</category>
      <pubDate>Fri, 15 May 2026 02:13:05 GMT</pubDate>
    </item>
    <item>
      <title>如何将 AI 编码账单削减 80%：方法论整理版</title>
      <link>https://lucas-blog.zhaiyx2020start.workers.dev/cut-ai-coding-costs-80-percent</link>
      <guid isPermaLink="true">https://lucas-blog.zhaiyx2020start.workers.dev/cut-ai-coding-costs-80-percent</guid>
      <description>本文深入解析如何将 AI 编码账单削减 80%，系统整理了涵盖工具选型、提示词工程、使用策略优化、计费模式对比及自动化工作流设计等多个维度的完整方法论，为开发者和团队提供一套在享受 AI 编程效率红利的同时实现成本最优化的实用指南。</description>
      <content:encoded><![CDATA[<blockquote><p>来源：<a target="_blank" rel="noopener noreferrer nofollow" href="https://x.com/DeRonin_/status/2054255152555545079">https://x.com/DeRonin_/status/2054255152555545079</a><br>主题：通过上下文控制、模型路由、Prompt 缓存和工作流治理，降低 AI 编码成本。<br>适用对象：高频使用 Cursor、Claude Code、Aider、Windsurf 等 AI 编码工具的开发者。</p></blockquote><h2>1. 核心结论</h2><p>这篇文章的核心观点不是“换一个更便宜的模型”，而是：</p><blockquote><p><strong>AI 编码账单高，主要不是因为模型贵，而是因为上下文发送方式和工作流设计太浪费。</strong></p></blockquote><p>作者将自己的 AI 编码账单从：</p><ul class="tight" data-tight="true"><li><p><strong>$4,200 / 月</strong></p></li><li><p>降到 <strong>$312 / 月</strong></p></li></ul><p>主要依靠三类动作：</p><ol class="tight" data-tight="true"><li><p><strong>更聪明的模型路由</strong></p></li><li><p><strong>Prompt Caching</strong></p></li><li><p><strong>修复工作流中 5 类 token 泄漏点</strong></p></li></ol><p>最终目标是：</p><ul class="tight" data-tight="true"><li><p>不降低交付速度</p></li><li><p>不降低关键任务质量</p></li><li><p>将月度 AI 编码成本降低 <strong>50%–80%</strong></p></li></ul><hr><h2>2. 最重要的认知：你付费的不是 token，而是上下文</h2><p>很多人以为 AI 编码成本高，是因为模型本身贵。</p><p>但作者认为真正的问题是：</p><blockquote><p>你每一轮都在把大量无关上下文发给模型。</p></blockquote><p>典型场景：</p><ol class="tight" data-tight="true"><li><p>打开 Cursor / Claude Code</p></li><li><p>工具自动加载大量代码仓库上下文</p></li><li><p>用户只想修一个小 bug</p></li><li><p>模型却要阅读几十万字符的上下文</p></li><li><p>最后只改了 20–30 行代码</p></li></ol><p>问题不在输出，而在输入。</p><h3>关键判断</h3><table class="tiptap-table" style="min-width: 50px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>错误做法</p></th><th colspan="1" rowspan="1"><p>正确做法</p></th></tr><tr><td colspan="1" rowspan="1"><p>把整个仓库或大量文件直接丢给模型</p></td><td colspan="1" rowspan="1"><p>先搜索，再只提供相关代码块</p></td></tr><tr><td colspan="1" rowspan="1"><p>默认使用 <code>@codebase</code></p></td><td colspan="1" rowspan="1"><p>使用具体文件、函数、调用链</p></td></tr><tr><td colspan="1" rowspan="1"><p>每轮重复发送稳定上下文</p></td><td colspan="1" rowspan="1"><p>使用 Prompt Caching</p></td></tr><tr><td colspan="1" rowspan="1"><p>一个模型处理所有任务</p></td><td colspan="1" rowspan="1"><p>根据任务类型路由到不同模型</p></td></tr></tbody></table><hr><h2>3. Token 成本结构</h2><p>现代 AI 编码账单通常由 4 类 token 构成。</p><table class="tiptap-table" style="min-width: 75px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>类型</p></th><th colspan="1" rowspan="1"><p>含义</p></th><th colspan="1" rowspan="1"><p>成本特征</p></th></tr><tr><td colspan="1" rowspan="1"><p>Input Tokens</p></td><td colspan="1" rowspan="1"><p>发送给模型的内容，包括 prompt、文件、历史对话、系统提示</p></td><td colspan="1" rowspan="1"><p>通常按百万 token 计费</p></td></tr><tr><td colspan="1" rowspan="1"><p>Output Tokens</p></td><td colspan="1" rowspan="1"><p>模型返回的内容，包括代码、解释、推理结果</p></td><td colspan="1" rowspan="1"><p>通常比输入 token 贵 3–5 倍</p></td></tr><tr><td colspan="1" rowspan="1"><p>Cached Tokens</p></td><td colspan="1" rowspan="1"><p>被缓存的重复输入上下文</p></td><td colspan="1" rowspan="1"><p>价格通常只有普通输入 token 的约 10%</p></td></tr><tr><td colspan="1" rowspan="1"><p>Reasoning Tokens</p></td><td colspan="1" rowspan="1"><p>模型内部推理消耗的 token</p></td><td colspan="1" rowspan="1"><p>用户不可见，但仍会计费</p></td></tr></tbody></table><h3>重要结论</h3><ul class="tight" data-tight="true"><li><p>输出贵，但输入浪费更常见。</p></li><li><p>Prompt Caching 是很多人忽略的降本点。</p></li><li><p>高级模型的 reasoning tokens 可能在简单任务中造成隐性浪费。</p></li></ul><hr><h2>4. 五个常见 token 陷阱</h2><hr><h3>陷阱 1：每一轮都重新发送整个代码仓库</h3><p>问题</p><p>AI 编码工具可能会在每次请求中自动包含大量文件。</p><p>这些文件多数没有变化，但每次调用都会重新计费。</p><p>典型浪费</p><ul class="tight" data-tight="true"><li><p>50 个文件</p></li><li><p>约 80,000 input tokens</p></li><li><p>每天几十轮调用</p></li><li><p>每月可能浪费上千美元</p></li></ul><p>修复方式</p><ul class="tight" data-tight="true"><li><p>关闭不必要的自动上下文</p></li><li><p>日常任务避免默认使用 <code>@codebase</code></p></li><li><p>使用明确的 <code>@file</code></p></li><li><p>先用 <code>grep</code> / <code>ripgrep</code> 搜索相关代码</p></li><li><p>只发送函数、类、调用链、错误堆栈相关内容</p></li><li><p>稳定上下文放入可缓存区域</p></li></ul><p>预期效果</p><p>输入 token 可减少 <strong>60%–80%</strong>。</p><hr><h3>陷阱 2：Agent 工具调用循环失控</h3><p>问题</p><p>Agent 每调用一个工具，可能都会重新携带完整上下文。</p><p>例如：</p><ol class="tight" data-tight="true"><li><p>查文件</p></li><li><p>查引用</p></li><li><p>查日志</p></li><li><p>查测试</p></li><li><p>再查配置</p></li></ol><p>如果每一步都重复传入完整上下文，成本会快速放大。</p><p>修复方式</p><ul class="tight" data-tight="true"><li><p>让 Agent 先规划工具调用，再执行</p></li><li><p>将相关工具调用批量化</p></li><li><p>对工具输出做摘要，不要把完整原始结果回填上下文</p></li><li><p>对固定流程使用脚本替代 Agent 循环</p></li><li><p>记录工具调用 token 消耗，持续观察一周</p></li></ul><p>预期效果</p><p>Agent 工作流成本可降低 <strong>3–5 倍</strong>。</p><hr><h3>陷阱 3：用高级模型处理简单任务</h3><p>问题</p><p>很多人会让 Opus、GPT-5、Sonnet 处理所有任务，包括：</p><ul class="tight" data-tight="true"><li><p>修 typo</p></li><li><p>格式化 JSON</p></li><li><p>重命名变量</p></li><li><p>生成简单样板代码</p></li><li><p>修复 lint</p></li></ul><p>这些任务不需要高级推理。</p><p>修复方式</p><p>根据任务复杂度选择模型：</p><table class="tiptap-table" style="min-width: 50px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>任务类型</p></th><th colspan="1" rowspan="1"><p>推荐模型层级</p></th></tr><tr><td colspan="1" rowspan="1"><p>架构设计、安全审查、复杂决策</p></td><td colspan="1" rowspan="1"><p>Opus / GPT-5</p></td></tr><tr><td colspan="1" rowspan="1"><p>真实编码、调试、重构、代码审查</p></td><td colspan="1" rowspan="1"><p>Kimi 2.6</p></td></tr><tr><td colspan="1" rowspan="1"><p>lint、format、单行修改</p></td><td colspan="1" rowspan="1"><p>Haiku / mini 模型</p></td></tr><tr><td colspan="1" rowspan="1"><p>自动补全、样板代码</p></td><td colspan="1" rowspan="1"><p>本地模型</p></td></tr></tbody></table><p>预期效果</p><ul class="tight" data-tight="true"><li><p>简单任务成本可下降 <strong>90%+</strong></p></li><li><p>长 Agent 循环成本可下降 <strong>10–15 倍</strong></p></li></ul><hr><h3>陷阱 4：流式与批量模式使用不当</h3><p>问题</p><p>有些工作流中，流式响应会影响 Prompt Caching 的效果。</p><p>反过来，如果交互式编码场景完全使用批量响应，也会降低体验。</p><p>修复方式</p><table class="tiptap-table" style="min-width: 50px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>场景</p></th><th colspan="1" rowspan="1"><p>推荐方式</p></th></tr><tr><td colspan="1" rowspan="1"><p>用户正在交互式编码</p></td><td colspan="1" rowspan="1"><p>Streaming</p></td></tr><tr><td colspan="1" rowspan="1"><p>后台 Agent 执行任务</p></td><td colspan="1" rowspan="1"><p>Batch</p></td></tr><tr><td colspan="1" rowspan="1"><p>稳定上下文 + 可缓存前缀</p></td><td colspan="1" rowspan="1"><p>Batch</p></td></tr><tr><td colspan="1" rowspan="1"><p>需要快速看到中间结果</p></td><td colspan="1" rowspan="1"><p>Streaming</p></td></tr></tbody></table><p>预期效果</p><p>缓存前缀调用可节省 <strong>30%–50%</strong>。</p><hr><h3>陷阱 5：“以防万一”的上下文膨胀</h3><p>问题</p><p>开发者经常因为不确定模型是否需要某个文件，就把它也加入上下文。</p><p>结果是：</p><ul class="tight" data-tight="true"><li><p>一个小 bug 请求</p></li><li><p>变成了几十个文件</p></li><li><p>prompt 达到数万甚至十几万 token</p></li></ul><p>修复方式</p><ul class="tight" data-tight="true"><li><p>先搜索引用，再决定是否提供文件</p></li><li><p>让 Agent 自己请求需要的文件</p></li><li><p>长会话中定期总结旧上下文</p></li><li><p>总结后丢弃原始对话</p></li><li><p>使用 <code>CLAUDE.md</code> 或系统提示保存稳定背景信息</p></li></ul><p>预期效果</p><p>输入 token 可减少 <strong>70%+</strong>。</p><hr><h2>5. 推荐的模型路由架构</h2><p>文章建议停止“一个模型打天下”，改成模型分层。</p><h3>路由决策树</h3><pre><code class="language-text">任务是架构 / 规划 / 安全关键决策？
    -&gt; 使用 Premium Tier：Opus / GPT-5</code></pre><p><code>任务是实现 / 调试 / 重构 / 代码审查？<br>-&gt; 使用 Workhorse Tier：Kimi 2.6</code></p><p><code>任务是多轮 Agent 循环？<br>-&gt; 使用 Kimi 2.6</code></p><p><code>任务是 lint / format / typo / 单行修改？<br>-&gt; 使用 Utility Tier：Haiku / mini 模型</code></p><p><code>任务是样板代码 / 自动补全？<br>-&gt; 使用 Local Tier：Qwen / Llama via Ollama<br></code></p><hr><h2>6. 模型分层建议</h2><table class="tiptap-table" style="min-width: 100px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>层级</p></th><th colspan="1" rowspan="1"><p>推荐模型</p></th><th colspan="1" rowspan="1"><p>适合任务</p></th><th colspan="1" rowspan="1"><p>不适合任务</p></th></tr><tr><td colspan="1" rowspan="1"><p>Premium Tier</p></td><td colspan="1" rowspan="1"><p>Claude Opus / GPT-5</p></td><td colspan="1" rowspan="1"><p>架构设计、安全关键审查、复杂多文件重构、并发问题</p></td><td colspan="1" rowspan="1"><p>日常简单编码</p></td></tr><tr><td colspan="1" rowspan="1"><p>Workhorse Tier</p></td><td colspan="1" rowspan="1"><p>Kimi 2.6</p></td><td colspan="1" rowspan="1"><p>日常实现、重构、调试、代码审查、Agent 循环</p></td><td colspan="1" rowspan="1"><p>极高风险架构决策</p></td></tr><tr><td colspan="1" rowspan="1"><p>Utility Tier</p></td><td colspan="1" rowspan="1"><p>Haiku / GPT mini</p></td><td colspan="1" rowspan="1"><p>lint、format、变量重命名、简单修复</p></td><td colspan="1" rowspan="1"><p>多步骤复杂任务</p></td></tr><tr><td colspan="1" rowspan="1"><p>Local Tier</p></td><td colspan="1" rowspan="1"><p>Qwen / Llama via Ollama</p></td><td colspan="1" rowspan="1"><p>自动补全、样板代码、stub、语法修复</p></td><td colspan="1" rowspan="1"><p>复杂推理和高质量判断</p></td></tr></tbody></table><hr><h2>7. 七个实用降本技巧</h2><hr><h3>技巧 1：启用 Prompt Caching</h3><p>适用工具：</p><ul class="tight" data-tight="true"><li><p>Claude Code</p></li><li><p>Cursor</p></li><li><p>Aider</p></li><li><p>支持缓存的 API 工具链</p></li></ul><p>建议缓存内容：</p><ul class="tight" data-tight="true"><li><p>系统提示</p></li><li><p>项目约定</p></li><li><p><code>CLAUDE.md</code></p></li><li><p>代码库摘要</p></li><li><p>开发规范</p></li><li><p>稳定工具说明</p></li></ul><p>预期节省：</p><blockquote><p>稳定输入 token 降低 <strong>60%–90%</strong></p></blockquote><hr><h3>技巧 2：先 grep，再提问</h3><p>不要直接把文件丢给模型。</p><p>先搜索：</p><pre><code class="language-bash">rg "useUserAuth" --type ts -l
rg "useUserAuth" --type ts -B 5 -A 20</code></pre><p>推荐流程：</p><ol class="tight" data-tight="true"><li><p>搜索符号</p></li><li><p>找到调用链</p></li><li><p>截取相关函数</p></li><li><p>附上错误日志</p></li><li><p>再让模型分析</p></li></ol><hr><h3>技巧 3：分析工具调用</h3><p>建议记录：</p><ul class="tight" data-tight="true"><li><p>每次工具调用名称</p></li><li><p>输入 token</p></li><li><p>输出 token</p></li><li><p>是否重复查询</p></li><li><p>是否可以批量化</p></li><li><p>是否可以脚本化</p></li></ul><p>目标是找到最贵的 3 个循环。</p><hr><h3>技巧 4：把稳定流程写成 <code>SKILL.md</code></h3><p>重复性工作不要每次都让 Agent 重新摸索。</p><p>适合固化为 Skill 的流程：</p><ul class="tight" data-tight="true"><li><p>发布到测试环境</p></li><li><p>生成接口文档</p></li><li><p>跑测试并修复</p></li><li><p>检查日志</p></li><li><p>数据库迁移</p></li><li><p>前端构建发布</p></li><li><p>代码审查规范</p></li></ul><p>示例结构：</p><pre><code class="language-md"># Deploy to Staging Skill</code></pre><p></p><h2><code>Goal</code></h2><p><code>Deploy the current branch to staging safely.</code></p><h2><code>Steps</code></h2><ol class="tight" data-tight="true"><li><p><code>Check current branch</code></p></li><li><p><code>Run tests</code></p></li><li><p><code>Build project</code></p></li><li><p><code>Package artifact</code></p></li><li><p><code>Deploy to staging</code></p></li><li><p><code>Verify health check</code></p></li></ol><h2><code>Common Errors</code></h2><ul class="tight" data-tight="true"><li><p><code>Port occupied</code></p></li><li><p><code>Missing environment variable</code></p></li><li><p><code>Failed migration</code></p></li></ul><h2><code>Verification</code></h2><ul class="tight" data-tight="true"><li><p><code>Health check returns 200</code></p></li><li><p><code>Logs contain no startup errors<br></code></p></li></ul><hr><h3>技巧 5：本地模型处理样板代码</h3><p>使用 Ollama：</p><pre><code class="language-bash">brew install ollama
ollama pull qwen3:7b
ollama serve</code></pre><p>本地模型适合：</p><ul class="tight" data-tight="true"><li><p>自动补全</p></li><li><p>生成 DTO / VO / Entity</p></li><li><p>简单模板代码</p></li><li><p>基础注释</p></li><li><p>单文件小改动</p></li></ul><p>不适合：</p><ul class="tight" data-tight="true"><li><p>架构判断</p></li><li><p>跨模块重构</p></li><li><p>并发 bug</p></li><li><p>安全审查</p></li></ul><hr><h3>技巧 6：长会话定期总结</h3><p>每 10–15 轮对话后，让模型输出：</p><pre><code class="language-md">## 已完成</code></pre><ul class="tight" data-tight="true"><li><p><code>...</code></p></li></ul><h2><code>当前结论</code></h2><ul class="tight" data-tight="true"><li><p><code>...</code></p></li></ul><h2><code>关键文件</code></h2><ul class="tight" data-tight="true"><li><p><code>...</code></p></li></ul><h2><code>未解决问题</code></h2><ul class="tight" data-tight="true"><li><p><code>...</code></p></li></ul><h2><code>下一步</code></h2><ul class="tight" data-tight="true"><li><p><code>...<br></code></p></li></ul><p>然后开启新会话，把总结作为新上下文。</p><p>目标：</p><blockquote><p>用 5k token 的总结替代 200k token 的历史对话。</p></blockquote><hr><h3>技巧 7：批量处理小请求</h3><p>错误方式：</p><pre><code class="language-text">问 10 次，每次一个小问题。</code></pre><p>正确方式：</p><pre><code class="language-text">请一次性回答下面 10 个问题，按编号输出：</code></pre><ol class="tight" data-tight="true"><li><p><code>...</code></p></li><li><p><code>...</code></p></li><li><p><code>...<br></code></p></li></ol><p>适合批量处理的内容：</p><ul class="tight" data-tight="true"><li><p>代码解释</p></li><li><p>命名建议</p></li><li><p>小 bug 分析</p></li><li><p>SQL 优化点</p></li><li><p>文档润色</p></li><li><p>测试用例生成</p></li></ul><hr><h2>8. 示例路由配置</h2><pre><code class="language-yaml"># ~/.config/claude-router/config.yaml</code></pre><p><code>default: kimi-2.6-instruct</code></p><p><code>routes:<br>planning:<br>model: claude-opus-4-6<br>fallback: gpt-5<br>triggers:<br>- "plan"<br>- "architect"<br>- "design system"<br>- "refactor architecture"<br>- "security review"</code></p><p><code>implementation:<br>model: kimi-2.6-instruct<br>triggers:<br>- "review"<br>- "debug"<br>- "cross-file refactor"<br>- "implement"<br>- "build feature"</code></p><p><code>default_implementation:<br>model: kimi-2.6-instruct</code></p><p><code>cleanup:<br>model: claude-haiku-4-5<br>triggers:<br>- "lint"<br>- "format"<br>- "fix typo"<br>- "rename variable"</code></p><p><code>boilerplate:<br>model: ollama:qwen3:7b<br>triggers:<br>- "autocomplete"<br>- "stub"<br>- "generate boilerplate"</code></p><p><code>caching:<br>enabled: true<br>prefix_cache: true</code></p><p><code>context:<br>max_tokens: 50000<br>auto_summarize_after: 15<br>use_grep_first: true<br></code></p><hr><h2>9. 30 天落地计划</h2><hr><h3>第 1 周：先止血</h3><p>目标：减少明显浪费。</p><p>行动：</p><ul class="tight" data-tight="true"><li><p>启用 Prompt Caching</p></li><li><p>关闭不必要的自动上下文</p></li><li><p>安装并使用 ripgrep</p></li><li><p>不再默认使用 <code>@codebase</code></p></li><li><p>只发送相关代码片段</p></li></ul><p>预期节省：</p><blockquote><p>30%–40%</p></blockquote><hr><h3>第 2 周：切换默认模型</h3><p>目标：改变单位经济模型。</p><p>行动：</p><ul class="tight" data-tight="true"><li><p>配置自定义模型</p></li><li><p>将日常实现任务默认路由到 Kimi 2.6</p></li><li><p>将 lint / format 路由到 Haiku</p></li><li><p>将 Opus / GPT-5 保留给架构和安全任务</p></li></ul><p>预期额外节省：</p><blockquote><p>40%–55%</p></blockquote><hr><h3>第 3 周：治理 Agent 工具循环</h3><p>目标：减少重复调用和失控循环。</p><p>行动：</p><ul class="tight" data-tight="true"><li><p>开启工具调用日志</p></li><li><p>统计每类工具调用 token 消耗</p></li><li><p>找出最贵的 3 个循环</p></li><li><p>改成批量调用或脚本化流程</p></li></ul><p>预期额外节省：</p><blockquote><p>10%–20%</p></blockquote><hr><h3>第 4 周：沉淀 Skill + 本地模型</h3><p>目标：减少重复探索和低价值 token 消耗。</p><p>行动：</p><ul class="tight" data-tight="true"><li><p>找出 3 个高频工作流</p></li><li><p>每个写成 <code>SKILL.md</code></p></li><li><p>配置 Ollama + Qwen</p></li><li><p>将样板代码和自动补全交给本地模型</p></li></ul><p>预期额外节省：</p><blockquote><p>5%–10%</p></blockquote><hr><h2>10. 什么时候应该使用高级模型</h2><p>降本不能无脑降。</p><p>以下任务应该使用 Opus / GPT-5：</p><ul class="tight" data-tight="true"><li><p>系统架构设计</p></li><li><p>安全关键代码审查</p></li><li><p>涉及多个模块的复杂重构</p></li><li><p>并发问题 / 竞态条件排查</p></li><li><p>编译器 / 形式化验证</p></li><li><p>高风险生产问题</p></li></ul><h3>判断规则</h3><blockquote><p>如果一个错误答案的代价超过模型成本差异的 100 倍，就使用高级模型。</p></blockquote><p>示例：</p><table class="tiptap-table" style="min-width: 50px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>任务</p></th><th colspan="1" rowspan="1"><p>推荐模型</p></th></tr><tr><td colspan="1" rowspan="1"><p>改一个变量名</p></td><td colspan="1" rowspan="1"><p>Haiku / 本地</p></td></tr><tr><td colspan="1" rowspan="1"><p>生成 DTO</p></td><td colspan="1" rowspan="1"><p>本地 / Haiku</p></td></tr><tr><td colspan="1" rowspan="1"><p>实现普通 CRUD</p></td><td colspan="1" rowspan="1"><p>Kimi 2.6</p></td></tr><tr><td colspan="1" rowspan="1"><p>重构 500 行业务代码</p></td><td colspan="1" rowspan="1"><p>Kimi 2.6</p></td></tr><tr><td colspan="1" rowspan="1"><p>设计权限系统架构</p></td><td colspan="1" rowspan="1"><p>Opus / GPT-5</p></td></tr><tr><td colspan="1" rowspan="1"><p>审查支付链路安全问题</p></td><td colspan="1" rowspan="1"><p>Opus / GPT-5</p></td></tr><tr><td colspan="1" rowspan="1"><p>排查高并发数据一致性问题</p></td><td colspan="1" rowspan="1"><p>Opus / GPT-5</p></td></tr></tbody></table><hr><h2>11. 可执行检查清单</h2><h3>上下文控制</h3><ul class="tight" data-tight="true"><li><p>[ ] 是否默认关闭了不必要的自动上下文？</p></li><li><p>[ ] 是否避免无脑使用 <code>@codebase</code>？</p></li><li><p>[ ] 是否先 grep 再提问？</p></li><li><p>[ ] 是否只发送必要函数 / 类 / 日志？</p></li><li><p>[ ] 是否定期总结长会话？</p></li></ul><h3>模型路由</h3><ul class="tight" data-tight="true"><li><p>[ ] 是否区分架构、实现、清理、样板代码？</p></li><li><p>[ ] 是否避免高级模型处理简单任务？</p></li><li><p>[ ] 是否设置默认工作模型？</p></li><li><p>[ ] 是否为高风险任务保留高级模型？</p></li></ul><h3>Prompt Caching</h3><ul class="tight" data-tight="true"><li><p>[ ] 是否启用 Prompt Caching？</p></li><li><p>[ ] 是否将稳定上下文放入缓存前缀？</p></li><li><p>[ ] 是否复用项目规范和系统提示？</p></li></ul><h3>Agent 工作流</h3><ul class="tight" data-tight="true"><li><p>[ ] 是否记录工具调用？</p></li><li><p>[ ] 是否找出重复工具循环？</p></li><li><p>[ ] 是否将稳定流程写成 Skill？</p></li><li><p>[ ] 是否将固定流程脚本化？</p></li></ul><h3>本地模型</h3><ul class="tight" data-tight="true"><li><p>[ ] 是否安装 Ollama？</p></li><li><p>[ ] 是否配置 Qwen / Llama？</p></li><li><p>[ ] 是否将自动补全和样板代码交给本地模型？</p></li></ul><hr><h2>12. 对开发者的实际启发</h2><p>这篇文章真正值得借鉴的不是具体某个模型，而是它的工作方式：</p><ol class="tight" data-tight="true"><li><p><strong>不要把 AI 当聊天窗口，而要当可治理的工程系统。</strong></p></li><li><p><strong>不要只优化 prompt，要优化上下文、路由和流程。</strong></p></li><li><p><strong>不要把所有任务都交给最贵模型。</strong></p></li><li><p><strong>不要重复让 Agent 探索同一个流程。</strong></p></li><li><p><strong>不要忽略输入 token 的浪费。</strong></p></li></ol><p>最终目标不是少用 AI，而是：</p><blockquote><p>用更低成本，获得相同甚至更稳定的交付能力。</p></blockquote><hr><h2>13. 一句话总结</h2><blockquote><p>AI 编码降本的核心不是“少用模型”，而是“少传废上下文、按任务选模型、把重复流程沉淀成规则”。</p></blockquote><p></p>]]></content:encoded>
      <category>摘录</category>
      <pubDate>Thu, 14 May 2026 01:59:27 GMT</pubDate>
    </item>
  </channel>
</rss>