<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>AI编程 on Yison's Blog</title><link>https://blog.7ys.top/tags/ai%E7%BC%96%E7%A8%8B/</link><description>Recent content in AI编程 on Yison's Blog</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><lastBuildDate>Tue, 12 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.7ys.top/tags/ai%E7%BC%96%E7%A8%8B/index.xml" rel="self" type="application/rss+xml"/><item><title>Claude Code 的记忆系统是怎么工作的？源码级拆解</title><link>https://blog.7ys.top/posts/claude-code-%E7%9A%84%E8%AE%B0%E5%BF%86%E7%B3%BB%E7%BB%9F%E6%98%AF%E6%80%8E%E4%B9%88%E5%B7%A5%E4%BD%9C%E7%9A%84%E6%BA%90%E7%A0%81%E7%BA%A7%E6%8B%86%E8%A7%A3/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://blog.7ys.top/posts/claude-code-%E7%9A%84%E8%AE%B0%E5%BF%86%E7%B3%BB%E7%BB%9F%E6%98%AF%E6%80%8E%E4%B9%88%E5%B7%A5%E4%BD%9C%E7%9A%84%E6%BA%90%E7%A0%81%E7%BA%A7%E6%8B%86%E8%A7%A3/</guid><description>&lt;img src="https://blog.7ys.top/" alt="Featured image of post Claude Code 的记忆系统是怎么工作的？源码级拆解" /&gt;&lt;h1 id="claude-code-的记忆系统是怎么工作的源码级拆解"&gt;Claude Code 的记忆系统是怎么工作的？源码级拆解
&lt;/h1&gt;
 &lt;blockquote&gt;
 &lt;p&gt;你周五用 Claude Code 调 bug 到凌晨两点，周一打开新会话，它张嘴就说：&amp;ldquo;上次那个 auth 模块的 bug 修好了吗？测试记得起 Redis。&amp;ldquo;你愣住了——你没告诉过它这些。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="一一个细思极恐的瞬间"&gt;一、一个细思极恐的瞬间
&lt;/h2&gt;&lt;p&gt;用过 Claude Code 的开发者大概都经历过这个瞬间：&lt;/p&gt;
&lt;p&gt;你关掉终端，第二天重新打开，开始一个新对话。Claude 什么都没问，直接开始干活。它知道你的项目用 pnpm 而不是 npm，知道测试需要本地 Redis，知道你讨厌 verbose 的输出。&lt;/p&gt;
&lt;p&gt;你仔细回想：&lt;strong&gt;我什么时候告诉它这些的？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;答案是：你没有直接告诉它。是它自己&amp;quot;记住&amp;quot;的。&lt;/p&gt;
&lt;p&gt;Claude Code 每次启动都是一个全新的上下文窗口，不携带任何历史对话。所有它&amp;quot;知道&amp;quot;的东西，都必须在第一轮对话之前从磁盘加载。&lt;/p&gt;
&lt;p&gt;我花了一周时间读 Claude Code 的 TypeScript 源码（是的，它是开源的），发现它的记忆系统比官方文档描述的复杂得多。今天来拆解一下。&lt;/p&gt;
&lt;h2 id="二两套记忆系统你写的-vs-ai-写的"&gt;二、两套记忆系统：你写的 vs AI 写的
&lt;/h2&gt;&lt;p&gt;Claude Code 有两套完全独立的记忆系统，各司其职：&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TB
 subgraph "Claude Code 记忆全景"
 subgraph "CLAUDE.md（你写的）"
 A1[手动维护]
 A2[指令/规则/偏好]
 A3[通过 git 同步]
 A4[加载后不变化]
 end
 
 subgraph "Auto Memory（AI 写的）"
 B1[自动提取]
 B2[用户画像/行为纠正]
 B3[项目状态/外部引用]
 B4[每轮对话可能更新]
 end
 
 A1 --&gt; C[启动时加载到上下文]
 B1 --&gt; C
 end
 
 style A1 fill:#0f3460,stroke:#e94560,color:#fff
 style A2 fill:#0f3460,stroke:#e94560,color:#fff
 style A3 fill:#0f3460,stroke:#e94560,color:#fff
 style A4 fill:#0f3460,stroke:#e94560,color:#fff
 style B1 fill:#533483,stroke:#e94560,color:#fff
 style B2 fill:#533483,stroke:#e94560,color:#fff
 style B3 fill:#533483,stroke:#e94560,color:#fff
 style B4 fill:#533483,stroke:#e94560,color:#fff
 style C fill:#e94560,stroke:#fff,color:#fff&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;关键区别：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;维度&lt;/th&gt;
 &lt;th&gt;CLAUDE.md&lt;/th&gt;
 &lt;th&gt;Auto Memory&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;谁写的&lt;/td&gt;
 &lt;td&gt;你手动写&lt;/td&gt;
 &lt;td&gt;Claude 自动写&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;存储位置&lt;/td&gt;
 &lt;td&gt;项目目录 / 用户目录&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;~/.claude/projects/&lt;/code&gt; 下&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;同步方式&lt;/td&gt;
 &lt;td&gt;Git（可提交）&lt;/td&gt;
 &lt;td&gt;本地（不同步）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;更新频率&lt;/td&gt;
 &lt;td&gt;你改才变&lt;/td&gt;
 &lt;td&gt;每轮对话可能更新&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;大小限制&lt;/td&gt;
 &lt;td&gt;40KB（建议）&lt;/td&gt;
 &lt;td&gt;索引 200 行 / 25KB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;加载方式&lt;/td&gt;
 &lt;td&gt;启动时全部加载&lt;/td&gt;
 &lt;td&gt;索引全加载，topic 按需&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="21-claudemd-的加载链"&gt;2.1 CLAUDE.md 的加载链
&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;优先级（高→低）：

1. 管理级 /etc/claude-code/CLAUDE.md ← IT 管理员写的，无法覆盖
2. 用户级 ~/.claude/CLAUDE.md ← 你的个人偏好
3. 项目级 ./CLAUDE.md 或 ./.claude/CLAUDE.md ← 团队共享（git 提交）
4. 本地级 ./CLAUDE.local.md ← 你的个人覆盖（不提交）

加载顺序：
 工作目录 → 向上遍历目录树 → 加载沿途所有 CLAUDE.md
 离工作目录近的优先级高
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;一个细节：&lt;/strong&gt; &lt;code&gt;CLAUDE.local.md&lt;/code&gt; 不在官方文档里，但源码中存在。它在项目 CLAUDE.md 之后、Auto Memory 之前加载。适合放个人的数据库密码、调试开关之类的——不提交到 git，但本地有效。&lt;/p&gt;
&lt;h3 id="22-auto-memory-的四种类型"&gt;2.2 Auto Memory 的四种类型
&lt;/h3&gt;&lt;p&gt;Auto Memory 不是随意的笔记，而是有严格的分类：&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TB
 subgraph "四种记忆类型"
 subgraph "user（用户画像）"
 U1[角色/偏好/知识水平]
 U2[始终私有]
 end
 
 subgraph "feedback（行为纠正）"
 F1[验证过的模式]
 F2[默认私有]
 end
 
 subgraph "project（项目状态）"
 P1[工作进展/决策]
 P2[倾向团队共享]
 end
 
 subgraph "reference（外部引用）"
 R1[系统指针]
 R2[通常团队共享]
 end
 end
 
 style U1 fill:#0f3460,stroke:#e94560,color:#fff
 style U2 fill:#0f3460,stroke:#e94560,color:#fff
 style F1 fill:#533483,stroke:#e94560,color:#fff
 style F2 fill:#533483,stroke:#e94560,color:#fff
 style P1 fill:#16213e,stroke:#e94560,color:#fff
 style P2 fill:#16213e,stroke:#e94560,color:#fff
 style R1 fill:#1a1a2e,stroke:#e94560,color:#fff
 style R2 fill:#1a1a2e,stroke:#e94560,color:#fff&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;为什么这样分？&lt;/strong&gt; 因为团队协作时，你的编码偏好（user）不应该泄露给队友，但项目进度（project）应该共享。这种分类直接影响记忆的加载和同步策略。&lt;/p&gt;
&lt;h2 id="三三个时间尺度实时--会话--梦境"&gt;三、三个时间尺度：实时 / 会话 / 梦境
&lt;/h2&gt;&lt;p&gt;这是整套系统最精妙的部分。Auto Memory 不是&amp;quot;Claude 注意到什么就随手记下来&amp;rdquo;，而是有三个独立的后台进程，在不同时间尺度上提取信息：&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph LR
 subgraph "时间轴"
 A[Per-Turn&lt;br/&gt;实时提取] --&gt;|每轮对话| B[Per-Session&lt;br/&gt;会话记忆]
 B --&gt;|每个会话| C[autoDream&lt;br/&gt;梦境整合]
 end
 
 subgraph "成本"
 D[极低&lt;br/&gt;共享cache] 
 E[低&lt;br/&gt;偶尔触发]
 F[中&lt;br/&gt;24h+5会话门槛]
 end
 
 A --- D
 B --- E
 C --- F
 
 style A fill:#e94560,stroke:#fff,color:#fff
 style B fill:#533483,stroke:#fff,color:#fff
 style C fill:#0f3460,stroke:#fff,color:#fff
 style D fill:transparent,stroke:#e94560,color:#e94560
 style E fill:transparent,stroke:#533483,color:#533483
 style F fill:transparent,stroke:#0f3460,color:#0f3460&lt;/pre&gt;&lt;h3 id="31-per-turn实时提取每轮对话后"&gt;3.1 Per-Turn：实时提取（每轮对话后）
&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;触发：每次完整查询循环结束
方式：fork 一个子 Agent 在后台运行
成本：极低（共享父 Agent 的 prompt cache）
权限：只读项目文件，只写记忆目录
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;一个细节：&lt;/strong&gt; 如果主 Agent 在本轮已经写过记忆（你明确说&amp;quot;记住这个&amp;rdquo;），提取步骤会跳过那个范围，避免重复。&lt;/p&gt;
&lt;h3 id="32-per-session会话记忆上下文增长时"&gt;3.2 Per-Session：会话记忆（上下文增长时）
&lt;/h3&gt;&lt;p&gt;这是一个独立于 Auto Memory 的系统，目的是让当前会话的上下文&lt;strong&gt;在压缩后还能保留&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;触发条件（三个同时满足）：&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;✅ 总上下文 ≥ 10,000 tokens
✅ 上下文增长 ≥ 5,000 tokens（自上次提取后）
✅ 工具调用 ≥ 3 次
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;提取的结构化笔记：&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌─────────────────────────────────────────┐
│ Session Memory 模板 │
├─────────────────────────────────────────┤
│ ## Current State │
│ 当前正在做什么，进展到哪一步 │
│ （上限 ~2000 tokens） │
├─────────────────────────────────────────┤
│ ## Files and Functions │
│ 涉及的文件、函数、关键代码位置 │
│ （上限 ~2000 tokens） │
├─────────────────────────────────────────┤
│ ## Errors &amp;amp; Corrections │
│ 遇到的错误、尝试过的方案、最终解决方案 │
│ （上限 ~2000 tokens） │
├─────────────────────────────────────────┤
│ ## Worklog │
│ 工作日志：做了什么、还剩什么 │
│ （上限 ~2000 tokens） │
└─────────────────────────────────────────┘
总计上限 ~12,000 tokens
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;为什么需要这个？&lt;/strong&gt; 当对话太长需要压缩时，有这些结构化笔记，auto-compact 可以复用它们，而不是从头重新摘要整个对话。效果好很多——因为笔记是增量提取的，上下文还完整时就记录了关键信息。&lt;/p&gt;
&lt;h3 id="33-autodream梦境整合每天每几天"&gt;3.3 autoDream：梦境整合（每天/每几天）
&lt;/h3&gt;&lt;p&gt;这是最让人惊讶的部分。源码中明确把这叫做 &lt;strong&gt;&amp;ldquo;DreamTask&amp;rdquo;&lt;/strong&gt;，UI 中会显示进度条。&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TB
 subgraph "autoDream 触发条件"
 G1[Gate 1: 时间检查&lt;br/&gt;≥ 24小时] --&gt;|✅| G2[Gate 2: 会话检查&lt;br/&gt;≥ 5个会话修改]
 G2 --&gt;|✅| G3[Gate 3: 锁检查&lt;br/&gt;.consolidate-lock 未占用]
 G3 --&gt;|✅| EXEC[执行整合]
 
 G1 --&gt;|❌| SKIP[跳过]
 G2 --&gt;|❌| SKIP
 G3 --&gt;|❌| SKIP
 end
 
 style G1 fill:#0f3460,stroke:#e94560,color:#fff
 style G2 fill:#0f3460,stroke:#e94560,color:#fff
 style G3 fill:#0f3460,stroke:#e94560,color:#fff
 style EXEC fill:#e94560,stroke:#fff,color:#fff
 style SKIP fill:#1a1a2e,stroke:#533483,color:#533483&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;整合流程（四阶段）：&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Phase 1: 定向
 ├── 读取 MEMORY.md 索引
 └── 浏览现有 topic 文件
 目的：了解当前记忆状态

Phase 2: 发现
 └── 搜索日志和会话记录中的新知识
 目的：找到需要整合的信息

Phase 3: 写入
 ├── 写入/更新 topic 文件
 ├── 合并新信号到现有文件
 └── 相对日期 → 绝对日期（&amp;#34;昨天&amp;#34; → &amp;#34;2026-05-11&amp;#34;）
 目的：持久化新知识

Phase 4: 清理
 ├── 修剪 MEMORY.md 至 200 行以下
 ├── 移除过期指针
 └── 解决新旧事实矛盾
 目的：保证记忆质量
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;一个有趣的细节：&lt;/strong&gt; 如果你杀掉整合进程，锁的修改时间会回滚，让下一个会话可以重试。这个错误处理很体贴。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;它什么时候运行？&lt;/strong&gt; 不是等你关掉电脑或睡觉，而是在一次对话结束时——只要满足那三个 Gate。只是因为 24 小时和 5 个会话的门槛，大多数时候不会触发。&lt;/p&gt;
&lt;h2 id="四记忆召回sonnet-替你选"&gt;四、记忆召回：Sonnet 替你选
&lt;/h2&gt;&lt;p&gt;记忆存下来了，但怎么在需要的时候找到正确的记忆？&lt;/p&gt;
&lt;p&gt;Claude Code 的方案是：&lt;strong&gt;让 Sonnet 替你选，不是关键词匹配。&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TB
 subgraph "记忆召回流程"
 START[启动时] --&gt; A[读取 MEMORY.md 索引&lt;br/&gt;前 200 行]
 A --&gt; B[扫描 topic 文件 frontmatter]
 B --&gt; C[构建 manifest&lt;br/&gt;filename + description]
 
 C --&gt; D[每轮对话]
 D --&gt; E[用户输入 + 工具结果]
 E --&gt; F[调用 Sonnet 选择相关文件&lt;br/&gt;最多 5 个]
 F --&gt; G[读取选中文件&lt;br/&gt;每文件 4KB 限制]
 G --&gt; H[注入到 prompt]
 end
 
 subgraph "限制"
 L1[每轮最多 5 个文件]
 L2[每文件 4KB]
 L3[每轮预算 20KB]
 L4[会话累计 60KB]
 end
 
 style START fill:#e94560,stroke:#fff,color:#fff
 style A fill:#0f3460,stroke:#e94560,color:#fff
 style B fill:#0f3460,stroke:#e94560,color:#fff
 style C fill:#0f3460,stroke:#e94560,color:#fff
 style D fill:#533483,stroke:#fff,color:#fff
 style E fill:#533483,stroke:#fff,color:#fff
 style F fill:#533483,stroke:#fff,color:#fff
 style G fill:#533483,stroke:#fff,color:#fff
 style H fill:#e94560,stroke:#fff,color:#fff
 style L1 fill:transparent,stroke:#e94560,color:#e94560
 style L2 fill:transparent,stroke:#e94560,color:#e94560
 style L3 fill:transparent,stroke:#e94560,color:#e94560
 style L4 fill:transparent,stroke:#e94560,color:#e94560&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;为什么用 Sonnet 而不是关键词？&lt;/strong&gt; 因为语义理解更好。比如用户问&amp;quot;怎么跑测试&amp;quot;，关键词匹配可能找不到 &lt;code&gt;feedback_testing.md&lt;/code&gt;，但 Sonnet 能理解这个意图。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;但这里有一个结构性缺陷：&lt;/strong&gt; 没有向量搜索，没有语义索引。如果 MEMORY.md 中的描述写得不好，或者 topic 文件太多（最多扫描 200 个，按修改时间排序），记忆就可能被&amp;quot;遗忘&amp;quot;。&lt;/p&gt;
&lt;h2 id="五什么能活过压缩"&gt;五、什么能活过压缩？
&lt;/h2&gt;&lt;p&gt;长对话会被压缩。压缩后，什么能保留？&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TB
 subgraph "压缩后存活分析"
 subgraph "✅ 能活过的（从磁盘重新加载）"
 A1[CLAUDE.md 文件]
 A2[Auto Memory 文件]
 A3[Session Memory 文件]
 end
 
 subgraph "❌ 活不过的"
 B1[只在对话中说过&lt;br/&gt;没有保存到记忆系统的内容]
 end
 end
 
 style A1 fill:#0f3460,stroke:#e94560,color:#fff
 style A2 fill:#0f3460,stroke:#e94560,color:#fff
 style A3 fill:#0f3460,stroke:#e94560,color:#fff
 style B1 fill:#1a1a2e,stroke:#e94560,color:#e94560&lt;/pre&gt;&lt;p&gt;源码中的清理代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 压缩时，强制清除所有缓存，从磁盘重新加载
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;getUserContext&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;cache&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;clear&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;resetGetMemoryFilesCache&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;compact&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;clearSystemPromptSections&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;教训：&lt;/strong&gt; 如果你在对话中告诉 Claude 什么重要的东西，确保它写入了记忆。否则压缩后就没了。&lt;/p&gt;
&lt;h2 id="六与其他工具的对比"&gt;六、与其他工具的对比
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;维度&lt;/th&gt;
 &lt;th&gt;Claude Code&lt;/th&gt;
 &lt;th&gt;Aider&lt;/th&gt;
 &lt;th&gt;Cursor&lt;/th&gt;
 &lt;th&gt;DeepSeek-TUI&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;记忆系统&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;✅ 三层架构&lt;/td&gt;
 &lt;td&gt;❌ 无&lt;/td&gt;
 &lt;td&gt;⚠️ 简单 rules&lt;/td&gt;
 &lt;td&gt;✅ 基础记忆&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;自动提取&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;✅ per-turn&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;⚠️ 手动&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;梦境整合&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;✅ autoDream&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;记忆分类&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;✅ 4 种类型&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;模型辅助召回&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;✅ Sonnet 选择&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;团队同步&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;⚠️ feature flag&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;记忆持久化&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;✅ 文件系统&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;⚠️ 配置文件&lt;/td&gt;
 &lt;td&gt;✅ 文件系统&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;结论：&lt;/strong&gt; Claude Code 的记忆系统是目前 AI 编程工具中最完善的。Aider 完全没有记忆，Cursor 只有简单的 rules 文件，DeepSeek-TUI 有基础记忆但没有自动提取和整合。&lt;/p&gt;
&lt;h2 id="七这套系统的局限"&gt;七、这套系统的局限
&lt;/h2&gt;&lt;p&gt;读完源码，我认为有几个结构性局限：&lt;/p&gt;
&lt;h3 id="71-记忆是-per-repo-的"&gt;7.1 记忆是 per-repo 的
&lt;/h3&gt;&lt;p&gt;你在项目 A 教 Claude 的偏好，不会自动带到项目 B。用户级的 &lt;code&gt;~/.claude/CLAUDE.md&lt;/code&gt; 可以处理一部分，但它是静态的——Claude 不能在会话中自动更新它。&lt;/p&gt;
&lt;h3 id="72-记忆是-machine-local-的"&gt;7.2 记忆是 machine-local 的
&lt;/h3&gt;&lt;p&gt;项目目录名经过 sanitize（非字母数字替换为连字符），但不同机器、不同用户名、不同挂载点会产生不同的目录名。同一项目，不同机器，不同记忆。&lt;/p&gt;
&lt;h3 id="73-没有记忆衰减"&gt;7.3 没有记忆衰减
&lt;/h3&gt;&lt;p&gt;所有记忆都是平等的。一个月前的偏好和今天的偏好权重一样。没有&amp;quot;热度&amp;quot;概念，没有自动遗忘机制。&lt;/p&gt;
&lt;h3 id="74-依赖-sonnet-的选择能力"&gt;7.4 依赖 Sonnet 的选择能力
&lt;/h3&gt;&lt;p&gt;如果 Sonnet 选错了记忆文件，或者描述写得不好，记忆就&amp;quot;丢了&amp;quot;。没有 fallback 机制。&lt;/p&gt;
&lt;h2 id="八对我们的启示"&gt;八、对我们的启示
&lt;/h2&gt;&lt;p&gt;这套系统给我们什么启发？&lt;/p&gt;
&lt;h3 id="81-记忆是-ai-工具的核心差异化"&gt;8.1 记忆是 AI 工具的核心差异化
&lt;/h3&gt;&lt;p&gt;目前市面上的开源 AI 编程工具（Aider、OpenCode、Continue），没有一个有真正意义上的记忆系统。这是差异化机会。&lt;/p&gt;
&lt;h3 id="82-梦境整合是一个优雅的设计"&gt;8.2 梦境整合是一个优雅的设计
&lt;/h3&gt;&lt;p&gt;不是每次对话都提取记忆（太频繁，噪音多），也不是完全不提取（会丢失）。三个时间尺度的设计——实时、会话、梦境——是一个很好的平衡。&lt;/p&gt;
&lt;h3 id="83-模型辅助召回比关键词匹配更好"&gt;8.3 模型辅助召回比关键词匹配更好
&lt;/h3&gt;&lt;p&gt;让 Sonnet 选择相关的记忆文件，而不是 grep 关键词。这在语义理解上好很多，但成本也更高。&lt;/p&gt;
&lt;p&gt;对于开源工具，可以考虑一个折中方案：先用关键词过滤缩小范围，再用小模型选择。&lt;/p&gt;
&lt;h3 id="84-记忆质量--记忆数量"&gt;8.4 记忆质量 &amp;gt; 记忆数量
&lt;/h3&gt;&lt;p&gt;Claude Code 严格限制记忆的大小（200 行索引、4KB 单文件、60KB 会话累计）。这不是偷懒，而是有意为之——太多记忆反而会干扰。&lt;/p&gt;
&lt;h2 id="九写在最后"&gt;九、写在最后
&lt;/h2&gt;&lt;p&gt;读完 Claude Code 的记忆系统源码，我最大的感受是：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;好的 AI 工具不是模型能力的比拼，而是工程设计的比拼。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;同样的 Claude 模型，有记忆系统和没有记忆系统，用户体验天差地别。记忆系统本身不需要更强大的模型，它需要的是精心的工程设计——什么时候提取、怎么存储、如何召回、何时整合。&lt;/p&gt;
&lt;p&gt;这些工程细节，才是真正的壁垒。&lt;/p&gt;
&lt;hr&gt;

 &lt;blockquote&gt;
 &lt;p&gt;本文基于 Claude Code TypeScript 源码分析。
源码地址：&lt;a class="link" href="https://github.com/anthropics/claude-code" target="_blank" rel="noopener"
 &gt;github.com/anthropics/claude-code&lt;/a&gt;
参考文章：&lt;a class="link" href="https://db0.ai/blog/how-claude-code-memory-works" target="_blank" rel="noopener"
 &gt;How Claude Code memory actually works&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;</description></item><item><title>当 AI 能写 80% 的代码，剩下 20% 是什么？</title><link>https://blog.7ys.top/posts/%E5%BD%93-ai-%E8%83%BD%E5%86%99-80-%E7%9A%84%E4%BB%A3%E7%A0%81%E5%89%A9%E4%B8%8B-20-%E6%98%AF%E4%BB%80%E4%B9%88/</link><pubDate>Thu, 07 May 2026 00:00:00 +0000</pubDate><guid>https://blog.7ys.top/posts/%E5%BD%93-ai-%E8%83%BD%E5%86%99-80-%E7%9A%84%E4%BB%A3%E7%A0%81%E5%89%A9%E4%B8%8B-20-%E6%98%AF%E4%BB%80%E4%B9%88/</guid><description>&lt;img src="https://blog.7ys.top/" alt="Featured image of post 当 AI 能写 80% 的代码，剩下 20% 是什么？" /&gt;&lt;h1 id="当-ai-能写-80-的代码剩下-20-是什么"&gt;当 AI 能写 80% 的代码，剩下 20% 是什么？
&lt;/h1&gt;
 &lt;blockquote&gt;
 &lt;p&gt;当 AI 能写 80% 的代码，剩下 20% 决定你值多少钱。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="一一个让人愣住的瞬间"&gt;一、一个让人愣住的瞬间
&lt;/h2&gt;&lt;p&gt;用 AI 写代码的人，大概都有过这样的时刻：&lt;/p&gt;
&lt;p&gt;一个功能模块，搁以前至少得写一天——定义接口、写解析逻辑、处理异常、补单元测试。现在呢？描述一下需求和数据格式，AI 噼里啪啦就生成了。review 一遍，改几个边界 case，提交。&lt;/p&gt;
&lt;p&gt;然后你愣住了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我刚才干了啥？我&amp;quot;编程&amp;quot;了吗？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;仔细回想，做的工作是：描述需求 → 审查代码 → 修修补补。写代码的主力是 AI，开发者更像是一个&amp;quot;代码质检员&amp;quot;。&lt;/p&gt;
&lt;p&gt;这个问题像一根刺一样扎在脑子里：&lt;strong&gt;当 AI 能写 80% 的代码，剩下 20% 是什么？我到底是开发者，还是 Prompt 工程师？&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="二vibe-coding-的狂欢与翻车"&gt;二、Vibe Coding 的狂欢与翻车
&lt;/h2&gt;&lt;p&gt;2025 年初，Andrej Karpathy（前 Tesla AI 总监）提出了一个概念叫 &lt;strong&gt;&amp;ldquo;Vibe Coding&amp;rdquo;&lt;/strong&gt;——不看代码细节，凭感觉让 AI 写，能跑就行。&lt;/p&gt;
&lt;p&gt;这个概念迅速流行。一时间，人人都可以用 AI 写 App，不会编程的人也能&amp;quot;做产品&amp;quot;了。社交媒体上到处是&amp;quot;我用 AI 一天做了个完整应用&amp;quot;的帖子。&lt;/p&gt;
&lt;p&gt;然后翻车开始来了。&lt;/p&gt;
&lt;p&gt;有数据显示，&lt;strong&gt;7% 的 vibe-coded 应用带着裸奔的数据库上线了&lt;/strong&gt;。不是 AI 写得不好，是使用者根本不知道什么叫&amp;quot;安全&amp;quot;。他们能描述功能，但描述不了约束。&lt;/p&gt;
&lt;p&gt;Karpathy 自己后来也修正了路线，提出了一个演进框架：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Vibe Coding → Context Engineering → Agentic Engineering
凭感觉写 → 精心设计上下文 → 让 AI 自主完成任务
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;大多数人还停留在第一阶段。而真正的价值，在第二阶段。&lt;/p&gt;
&lt;h2 id="三三个绕不开的场景"&gt;三、三个绕不开的场景
&lt;/h2&gt;&lt;h3 id="场景一代码风格没给规范怪谁"&gt;场景一：代码风格——没给规范，怪谁？
&lt;/h3&gt;&lt;p&gt;刚开始用 AI 写代码的时候，很多人都会犯同一个错误：直接开干。&lt;/p&gt;
&lt;p&gt;结果呢？生成的代码风格跟团队规范完全对不上——错误处理方式不对、日志格式不对、命名约定不对。第一反应是：这 AI 也不行啊。&lt;/p&gt;
&lt;p&gt;后来学乖了。把团队的 &lt;code&gt;.cursorrules&lt;/code&gt; 配好，把代码规范文档喂进去，再贴几段项目里现有的代码作为示例。&lt;/p&gt;
&lt;p&gt;输出立刻对味了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AI 不是不懂你的风格，是你没告诉它。&lt;/strong&gt; 这就像带新员工——你不培训就指望人家按你的规矩来，可能吗？&lt;/p&gt;
&lt;h3 id="场景二性能问题能搞定但费-token"&gt;场景二：性能问题——能搞定，但费 Token
&lt;/h3&gt;&lt;p&gt;代码跑起来了，但性能不达标。把日志、profiling 输出、相关代码一股脑丢给 AI。&lt;/p&gt;
&lt;p&gt;AI 确实能给出分析方向，但过程往往是这样的：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;给了一段日志 → AI 说可能是锁竞争&lt;/li&gt;
&lt;li&gt;补充了锁相关的代码 → AI 改口说可能是 GC 压力&lt;/li&gt;
&lt;li&gt;又给了 GC 日志 → AI 说可能是内存分配模式有问题&lt;/li&gt;
&lt;li&gt;来回好几轮……最后自己看了火焰图，一把定位到根源&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Token 烧了一堆，结论是：&lt;strong&gt;AI 有定位能力，但效率取决于上下文的完整度。给少了它猜，给多了它准。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;问题是，&amp;ldquo;给多少算够&amp;quot;这件事，本身就是个技术活。&lt;/p&gt;
&lt;h3 id="场景三业务理解代码里藏着的隐形逻辑"&gt;场景三：业务理解——代码里藏着的隐形逻辑
&lt;/h3&gt;&lt;p&gt;让 AI 写一段数据校验逻辑，它写得又快又漂亮。但一跑，业务方说不对。&lt;/p&gt;
&lt;p&gt;为什么？因为那段校验逻辑里藏着业务规则：某个字段在特定条件下才能为空、某个状态流转只能单向、某个阈值会随季节调整……这些规则不在技术文档里，在业务方的脑子里。&lt;/p&gt;
&lt;p&gt;AI 不知道这些潜规则，它只能按照你给的需求字面意思写。&lt;strong&gt;代码逻辑里暗藏业务逻辑，业务理解不到位，写出来的代码就是不能用。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;你得一条一条纠正。但有趣的是，纠正一次之后，它就能跟着对了——前提是上下文窗口还装得下。&lt;/p&gt;
&lt;h2 id="四一个新概念上下文工程"&gt;四、一个新概念：上下文工程
&lt;/h2&gt;&lt;p&gt;这三个场景有个共同点：&lt;strong&gt;AI 的输出质量，取决于你给它的输入质量。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这不是什么新道理——计算机科学早就有句话叫 &amp;ldquo;Garbage In, Garbage Out&amp;rdquo;。但在 AI 编程时代，这句话有了新的含义。&lt;/p&gt;
&lt;p&gt;Martin Fowler 的团队在 2026 年初写了一篇文章叫 &lt;strong&gt;&amp;ldquo;Context Engineering for Coding Agents&amp;rdquo;&lt;/strong&gt;，给出了一个精辟的定义：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;em&gt;&amp;ldquo;Context engineering is curating what the model sees so that you get a better result.&amp;rdquo;&lt;/em&gt;
（上下文工程就是精心策划模型看到的东西，以获得更好的结果）&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;他们把上下文分成了两类：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Instructions&lt;/strong&gt;：告诉 AI 做什么——&amp;ldquo;写一个 E2E 测试&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Guidance&lt;/strong&gt;：告诉 AI 遵循什么——&amp;ldquo;测试要相互独立，不要共享状态&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我之前代码风格不对，本质是缺了 Guidance。Bug 定位低效，是 Instructions 里的信息密度不够。业务理解差，是上下文窗口的物理限制。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;场景&lt;/th&gt;
 &lt;th&gt;问题根源&lt;/th&gt;
 &lt;th&gt;解法&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;代码风格不对&lt;/td&gt;
 &lt;td&gt;没给规范约束&lt;/td&gt;
 &lt;td&gt;喂 &lt;code&gt;.cursorrules&lt;/code&gt; + 代码示例&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Bug 定位低效&lt;/td&gt;
 &lt;td&gt;上下文不完整&lt;/td&gt;
 &lt;td&gt;一次性给足日志 + 代码 + 复现步骤&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;业务理解差&lt;/td&gt;
 &lt;td&gt;窗口装不下&lt;/td&gt;
 &lt;td&gt;分层喂知识，先给架构再给细节&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;核心观点：AI 的能力边界，本质上是你构建上下文的能力边界。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="五放大器效应为什么资深开发者用-ai-更香"&gt;五、放大器效应：为什么资深开发者用 AI 更香
&lt;/h2&gt;&lt;p&gt;这里有一个很容易被忽视的点：&lt;strong&gt;AI 对不同水平的开发者，放大倍率是不一样的。&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;新手 + AI = 1 × 2 = 2
资深 + AI = 10 × 2 = 20
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;新手不知道该问什么、该检查什么、该约束什么。他们给 AI 的上下文是模糊的、不完整的，所以 AI 的输出也是平庸的。&lt;/p&gt;
&lt;p&gt;资深开发者知道：这个模块的边界条件是什么、这个并发场景的坑在哪里、这个客户的合规要求有哪些。他们给 AI 的上下文是精准的、结构化的，所以 AI 的输出也是高质量的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AI 是放大器，不是替代品。它放大你已有的能力，但没法凭空给你能力。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这也解释了一个现象：很多人用 AI 写代码，觉得&amp;quot;也没多厉害啊&amp;rdquo;。不是 AI 不厉害，是你给它的上下文不厉害。&lt;/p&gt;
&lt;h2 id="六一个前瞻ai-友好的代码库"&gt;六、一个前瞻：AI 友好的代码库
&lt;/h2&gt;&lt;p&gt;Martin Fowler 的文章里还提到了一个概念：&lt;strong&gt;AI-friendly codebase design&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;意思是：你的代码本身就是给 AI 的&amp;quot;文档&amp;quot;。命名清晰、模块化、有好的注释——这些本来就是好实践，现在多了一个理由：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;让 AI 更好地理解你的代码。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;想想看，当你把一段代码丢给 AI，如果这段代码命名模糊、逻辑混乱、没有注释，AI 能做的就是&amp;quot;猜&amp;quot;。但如果你的代码自解释、模块边界清晰、有完善的类型定义，AI 就能精准地理解你的意图。&lt;/p&gt;
&lt;p&gt;这是一个正向循环：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;好代码 → AI 理解更准 → AI 生成更高质量的代码 → 代码库更好
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;反过来也成立：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;烂代码 → AI 理解偏差 → AI 生成更烂的代码 → 代码库更烂
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;AI 会加速你的代码库演进方向——无论是向上还是向下。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="七所以我们到底是什么"&gt;七、所以，我们到底是什么？
&lt;/h2&gt;&lt;p&gt;回到开头的问题：我到底是开发者，还是 Prompt 工程师？&lt;/p&gt;
&lt;p&gt;我觉得这个问法本身就错了。正确的问法是：&lt;strong&gt;你是在写 Prompt，还是在做上下文工程？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Prompt 工程师&lt;/strong&gt;：琢磨怎么写提示词让 AI 听话&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;上下文工程师&lt;/strong&gt;：设计 AI 的认知环境，让它能精准输出&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;区别在于，Prompt 是一次性的，上下文是系统性的。&lt;/p&gt;
&lt;p&gt;一个好的上下文工程师，需要：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;架构能力&lt;/strong&gt;：知道系统该怎么拆，模块边界在哪&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;业务理解&lt;/strong&gt;：知道需求背后的真正意图&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码审美&lt;/strong&gt;：能看出 AI 生成的代码哪里不对劲&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;调试直觉&lt;/strong&gt;：AI 搞不定的 bug，你能搞定&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些恰恰是资深开发者的核心资产。AI 没有让这些资产贬值，反而让它们更值钱了。&lt;/p&gt;
&lt;p&gt;Andrej Karpathy 的演进路线还在继续：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Vibe Coding → Context Engineering → Agentic Engineering
凭感觉写 → 精心设计上下文 → 让 AI 自主完成任务
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;我们现在处在第二阶段。而能做好 Context Engineering 的人，才有资格进入第三阶段。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;写在最后：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;Prompt 工程师&amp;quot;不是贬义词，但只会写 Prompt 的开发者是。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;真正的技能不是写 Prompt，而是构建一个让 AI 能精准输出的&amp;quot;认知环境&amp;rdquo;。这需要架构能力、业务理解、代码审美——这些都是时间和经验换来的，AI 给不了你。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;所以下次有人问你是干嘛的，别说&amp;quot;我写 Prompt 的&amp;quot;。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;说&amp;quot;我是上下文工程师&amp;quot;。&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;参考：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://martinfowler.com/articles/exploring-gen-ai/context-engineering-coding-agents.html" target="_blank" rel="noopener"
 &gt;Context Engineering for Coding Agents - Martin Fowler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.youtube.com/watch?v=96jN2OCOfLs" target="_blank" rel="noopener"
 &gt;Andrej Karpathy: From Vibe Coding to Agentic Engineering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://news.ycombinator.com/item?id=47196746" target="_blank" rel="noopener"
 &gt;Garbage In, Garbage Out: The Degradation of Human Requirements in the LLM Era&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>