我用Claude Code跑完一个真å®é¡¹ç›®ï¼š3次contextæ–­æ‰ï¼Œ3æ¬¡æ•‘å›æ¥

第二次断æ‰çš„æ—¶å€™ï¼Œæˆ‘们差点放弃。

䏿˜¯å› ä¸ºä»£ç å†™ä¸ä¸‹å»ï¼Œè€Œæ˜¯å› ä¸ºClaudeçªç„¶å¼€å§‹"失忆"——它忘记了我们三天å‰çº¦å®šå¥½çš„APIæ¥å£è§„范,开始用一套完全ä¸åŒçš„命忖¹å¼ç”Ÿæˆä»£ç ã€‚那一刻,å±å¹•上全是它自信满写出æ¥çš„"错误答案",而我们甚至ä¸ç¡®å®šï¼Œä¹‹å‰é‚£äº›å¯¹è¯é‡Œåˆ°åº•æœ‰å¤šå°‘ä¸œè¥¿å·²ç»æ‚„丢失了。

你在网上能找到的Claude Code教程,大多数是demo级别的:一个å°å·¥å…·ï¼Œå‡ ç™¾è¡Œä»£ç ï¼Œå¯¹è¯åå‡ è½®ï¼Œå®Œç¾æ”¶å°¾ã€‚但真å®é¡¹ç›®ä¸æ˜¯è¿™æ ·çš„。真å®é¡¹ç›®æœ‰ç”¨æˆ·ç³»ç»Ÿã€æœ‰ç¬¬ä¸‰æ–¹API对æ¥ã€æœ‰å‰å端è”è°ƒã€æœ‰ä½ åœ¨å‡Œæ™¨æ”¹äº†ä¸‰æ¬¡è¿˜æ˜¯ä¸å¯¹çš„bug。

这篇文章åªè®²çœŸå®å‘生的事。包括那些让人抓狂的时刻。

---

一ã€è¿™æ¬¡åšçš„æ˜¯ä»€ä¹ˆé¡¹ç›®

我们选了一个"ä¸­ç­‰å¤æ‚度"的工具站作为测试对象:一个AIæç¤ºè¯èšåˆå¹³å°ï¼ŒåŠŸèƒ½åŒ…æ‹¬ï¼š

  • 用户注册/登录系统(JWT鉴æƒï¼‰
  • æç¤ºè¯çš„å¢åˆ æ”¹æŸ¥ + 标签分类
  • 对æ¥ç¬¬ä¸‰æ–¹AI API(调用Claudeåšæç¤ºè¯è´¨é‡è¯„分)
  • å‰ç«¯å±•示页(React + Tailwind)
  • 基础的æœç´¢å’Œæ”¶è—功能

ä¸ç®—夿‚,但也ç»å¯¹ä¸æ˜¯ç©å…·ã€‚一个普通å‰ç«¯ç‹¬ç«‹å¼€å‘者,ä»é›¶å¼€å§‹å¤§æ¦‚需è¦ä¸¤åˆ°ä¸‰å‘¨ã€‚

为什么选Claude Codeï¼Œè€Œä¸æ˜¯Cursor或Copilot?

Cursoræ›´åƒæ˜¯"å¢å¼ºç‰ˆç¼–辑器",它帮你补全ã€å¸®ä½ æ”¹ï¼Œä½†é¡¹ç›®çš„æ•´ä½“结æ„å’Œæ¨è¿›èŠ‚å¥è¿˜æ˜¯ä½ åœ¨ä¸»å¯¼ã€‚Copilotæ›´åƒæ˜¯"智能输入法"。

我们想测试的问题更æç«¯ï¼šClaude Code能ä¸èƒ½ç‹¬ç«‹æ‰›ä¸‹ä¸€ä¸ªçœŸå®é¡¹ç›®çš„完整æµç¨‹ï¼Ÿ ä»éœ€æ±‚拆解到最终上线,它能走多远,在哪里会æ‰é“¾å­ã€‚

---

二ã€é¡ºåˆ©æ¨è¿›çš„å‰åŠæ®µ

开始的两天,说å®è¯ï¼Œæœ‰ç‚¹éœ‡æ’¼ã€‚

把项目需求用自然语言æè¿°ç»™Claude Code之å,它åšçš„ç¬¬ä¸€ä»¶äº‹ä¸æ˜¯ç›´æ¥å†™ä»£ç â€”—它开始主动问题:

"ç”¨æˆ·ç³»ç»Ÿéœ€è¦æ”¯æŒç¬¬ä¸‰æ–¹ç™»å½•å—?æç¤ºè¯è¯„åˆ†æ˜¯å®æ—¶çš„还是异步的?å‰ç«¯æ¡†æ¶æœ‰å好å—?"

这个细节很é‡è¦ã€‚它在帮你åšéœ€æ±‚æ¾„æ¸…ï¼Œè€Œä¸æ˜¯ç›´æ¥å¼€å¹²ç„¶å让你收拾烂摊å­ã€‚

确认需求之å,它给出了一个完整的文件结æ„规划:

prompt-hub/

├── backend/

│ ├── src/

│ │ ├── controllers/

│ │ │ ├── auth.controller.ts

│ │ │ ├── prompt.controller.ts

│ │ └── score.controller.ts

│ │ ├── middleware/

│ │ │ └── auth.middleware.ts

│ │ ├── models/

│ │ │ ├── user.model.ts

│ │ │ └── prompt.model.ts

│ │ ├── routes/

│ │ │ └── index.ts

│ │ └── services/

│ │ └── ai.service.ts

│ ├── package.json

│ └── tsconfig.json

├── frontend/

│ ├── src/

│ │ ├── components/

│ │ ├── pages/

│ │ ├── hooks/

│ │ └── api/

│ └── package.json

└── README.md

ç„¶åå®ƒå¼€å§‹é€æ¨¡å—生æˆä»£ç ï¼Œæ¯å†™å®Œä¸€ä¸ªæ¨¡å—,会主动说"这里我用了XX方案,如æœä½ æƒ³æ¢æˆY,告诉我"。

䏋颿˜¯å®ƒç”Ÿæˆçš„JWT鉴æƒä¸­é—´ä»¶ï¼Œé€»è¾‘清晰,错误处ç†ä¹Ÿåˆ°ä½ï¼š

// auth.middleware.ts

import { Request, Response, NextFunction } from 'express';

import jwt from 'jsonwebtoken';

export interface AuthRequest extends Request {

userId?: string;

}

export const authMiddleware = (

req: AuthRequest,

res: Response,

next: NextFunction

) => {

const token = req.headers.authorization?.split(' ')[1];

if (!token) {

return res.status(401).json({ error: '未æä¾›è®¤è¯ä»¤ç‰Œ' });

}

try {

const decoded = jwt.verify(token, process.env.JWT_SECRET!) as {

userId: string;

};

req.userId = decoded.userId;

next();

} catch (err) {

return res.status(401).json({ error: '令牌无效或已过期' });

}

};

这个阶段的节å¥å¾ˆå¥½ï¼šæéœ€æ±‚→它生æˆâ†’我测试→å馈问题→它修改。大概跑了40轮对è¯ï¼Œå端核心功能基本æˆå‹ã€‚

---

三ã€ç¬¬ä¸€æ¬¡æ–­æ‰â€”—ç°åœºè¿˜åŸ

项目第三天,下åˆä¸¤ç‚¹å·¦å³ã€‚

我在让Claude Code处ç†å‰ç«¯å’Œå端的æ¥å£è”调。它之å‰å·²ç»å¸®æˆ‘定义好了一套æ¥å£è§„范,所有APIè¿”å›æ ¼å¼ç»Ÿä¸€æ˜¯ï¼š

{

"success": true,

"data": { ... },

"message": "æ“作æˆåŠŸ"

}

但这一轮,它生æˆçš„å‰ç«¯è¯·æ±‚代ç å¼€å§‹ç›´æ¥è¯» response.resultï¼Œè€Œä¸æ˜¯ response.data。

我问它为什么,它的å›ç­”是:"æ ¹æ®æˆ‘们之å‰çº¦å®šçš„æ¥å£è§„范,返å›å­—段是 result。"

它记错了。或者说,它根本ä¸è®°å¾—了。

这就是context window耗尽的典å‹ç—‡çŠ¶ï¼šä¸æ˜¯çªç„¶æŠ¥é”™ï¼Œä¸æ˜¯æ‹’ç»å›ç­”,而是开始用一ç§è‡ªä¿¡çš„语气说错误的事情。这比直æ¥å´©æºƒæ›´å±é™©ï¼Œå› ä¸ºä½ å¯èƒ½ä¸ä¼šç«‹åˆ»å‘ç°ã€‚

---

什么是context window,为什么长项目必然é‡åˆ°è¿™ä¸ªé—®é¢˜

用一个类比:想象你雇了一个记忆力æå¥½çš„工程师,但他有一个特点——他åªèƒ½è®°ä½æœ€è¿‘这段时间的对è¯å†…容。时间一长,早期的约定ã€å†³ç­–ã€è§„范,就会ä»ä»–çš„"工作记忆"里慢慢挤出å»ã€‚

代ç è¿˜åœ¨ï¼Œæ–‡ä»¶è¿˜åœ¨ï¼Œä½†ä»–è„‘å­é‡Œçš„"项目全貌"å·²ç»æ®‹ç¼ºäº†ã€‚

Claudeçš„context window是有上é™çš„(具体上é™å› ç‰ˆæœ¬è€Œå¼‚,但长项目必然会触碰到)。当你的对è¯è½®æ¬¡è¶³å¤Ÿå¤šï¼Œæ—©æœŸçš„ç³»ç»Ÿè®¾è®¡ã€æ¥å£çº¦å®šã€å‘½å规范,就会被"挤出"有效上下文,模å‹å¼€å§‹åªèƒ½çœ‹åˆ°æœ€è¿‘的对è¯ç‰‡æ®µã€‚

è¿™ä¸æ˜¯bug,这是ç°é˜¶æ®µæ‰€æœ‰å¤§æ¨¡å‹çš„物ç†é™åˆ¶ã€‚

---

å››ã€ä¸‰æ¬¡æ–­æ‰ï¼Œä¸‰ç§æ•‘法——contextå‹ç¼©å®æˆ˜æ‰‹å†Œ

这是这篇文章最核心的部分。我们把三次断点的场景和对应的解法完整还åŸï¼Œæ¯ç§æ–¹æ³•都给出å¯ä»¥ç›´æ¥å¤ç”¨çš„æ¨¡æ¿ã€‚

---

第一次断点:用"é¡¹ç›®çŠ¶æ€æ‘˜è¦æ–‡ä»¶"釿–°å–‚å…¥

场景:æ¥å£è§„范被é—忘,命å约定混乱。 解法:新开一个对è¯ï¼Œç¬¬ä¸€æ¡æ¶ˆæ¯ä¸æ˜¯ç»§ç»­å†™ä»£ç ï¼Œè€Œæ˜¯å–‚å…¥ä¸€ä»½é¡¹ç›®çŠ¶æ€æ‘˜è¦ã€‚
📋 模æ¿ä¸€ï¼šé¡¹ç›®çŠ¶æ€æ‘˜è¦å¡ï¼ˆProject State Card)
# é¡¹ç›®çŠ¶æ€æ‘˜è¦ — [项目å] — [日期]

项目概述

一å¥è¯æè¿°ï¼š[项目是什么,解决什么问题]

技术栈

  • å端:Node.js + Express + TypeScript + MongoDB
  • å‰ç«¯ï¼šReact 18 + Tailwind CSS + Axios
  • 鉴æƒï¼šJWT(access token 有效期2h,refresh token 7天)

å·²å®Œæˆæ¨¡å—

  • [x] 用户注册/登录(JWT鉴æƒï¼‰
  • [x] æç¤ºè¯CRUDæ¥å£
  • [x] 标签系统
  • [ ] AI评分æœåŠ¡ï¼ˆè¿›è¡Œä¸­ï¼‰
  • [ ] å‰ç«¯æœç´¢åŠŸèƒ½ï¼ˆæœªå¼€å§‹ï¼‰

æ¥å£è§„范(必读)

所有APIç»Ÿä¸€è¿”å›æ ¼å¼ï¼š

{ "success": boolean, "data": any, "message": string }

错误时:{ "success": false, "error": string, "code": number }

命å约定

  • æ•°æ®åº“字段:snake_case(user_id, created_at)
  • TypeScriptå˜é‡ï¼šcamelCase(userId, createdAt)
  • API路由:kebab-case(/api/user-prompts)

当å‰é—®é¢˜

[æè¿°ä½ ç°åœ¨å¡åœ¨å“ªé‡Œï¼Œéœ€è¦ç»§ç»­åšä»€ä¹ˆ]

效æœï¼šæŠŠè¿™ä»½æ‘˜è¦ä½œä¸ºæ–°å¯¹è¯çš„ç¬¬ä¸€æ¡æ¶ˆæ¯ï¼ŒClaude能在几ä¹é›¶æŸè€—的情况下"æ¥ç®¡"项目状æ€ï¼Œç»§ç»­æ¨è¿›ã€‚

---

第二次断点:用"当å‰ä»»åŠ¡å¡ç‰‡"åšæœ€å°ä¸Šä¸‹æ–‡æ³¨å…¥

场景:项目第五天,正在处ç†ä¸€ä¸ªå¤æ‚çš„æœç´¢åŠŸèƒ½ã€‚è¿™æ¬¡æ–­æ‰æ›´æ£˜æ‰‹â€”â€”ä¸æ˜¯å…¨å±€é—忘,而是当å‰è¿™ä¸ªåŠŸèƒ½çš„å®ç°æ€è·¯æ–­äº†ã€‚Claude开始给出一个和之å‰è®¨è®ºæ–¹å‘完全ä¸åŒçš„æ–¹æ¡ˆã€‚ 解法:ä¸éœ€è¦é‡æ–°å–‚入整个项目摘è¦ï¼Œåªéœ€è¦ä¸€å¼ æœ€å°åŒ–的任务å¡ç‰‡ï¼Œèšç„¦åœ¨å½“å‰è¿™ä¸ªåŠŸèƒ½ä¸Šã€‚
📋 模æ¿äºŒï¼šå½“å‰ä»»åŠ¡å¡ç‰‡ï¼ˆCurrent Task Card)
# 当å‰ä»»åŠ¡ï¼š[功能åç§°]

背景(一å¥è¯ï¼‰

我们正在为æç¤ºè¯å¹³å°å®ç°å…¨æ–‡æœç´¢åŠŸèƒ½ã€‚

已确认的方案

使用 MongoDB çš„ $text 索引 + 相关度æ’åºï¼Œä¸å¼•å…¥ Elasticsearch。

åŸå› ï¼šé¡¹ç›®è§„模å°ï¼Œé¿å…å¢åŠ è¿ç»´å¤æ‚度。

已完æˆçš„部分

  • Prompt model已建立 text index(字段:title, content, tags)
  • æœç´¢æ¥å£è·¯ç”±å·²å®šä¹‰ï¼šGET /api/prompts/search?q=xxx

当å‰å¡ç‚¹

search controller çš„å®ç°ï¼Œéœ€è¦æ”¯æŒï¼š

1. å…³é”®è¯æœç´¢ï¼ˆå·²æœ‰ï¼‰

2. 按标签过滤(需è¦åŠ ï¼‰

3. 分页(需è¦åŠ ï¼Œæ¯é¡µ20æ¡ï¼‰

çº¦æŸæ¡ä»¶

  • 䏿”¹åŠ¨å·²æœ‰çš„ Prompt model 结æ„
  • è¿”å›æ ¼å¼éµå¾ªé¡¹ç›®ç»Ÿä¸€è§„范(è§ä¸Šæ–¹æ¥å£è§„范)

请继续

ä» search controller çš„å®ç°å¼€å§‹ï¼Œç»™å‡ºå®Œæ•´ä»£ç ã€‚

关键逻辑:这张å¡ç‰‡çš„ä¿¡æ¯å¯†åº¦æé«˜ï¼Œä½†å­—æ•°å¾ˆå°‘ã€‚å®ƒä¸æ˜¯åœ¨"å¤è¿°å†å²",而是在é‡å»ºå½“å‰å†³ç­–的最å°å¿…è¦ä¸Šä¸‹æ–‡ã€‚

---

ç¬¬ä¸‰æ¬¡æ–­ç‚¹ï¼šä»£ç æ³¨é‡Š + æ¥å£æ–‡æ¡£åšå†·å¯åЍ

场景:项目第七天,å‰å端è”调阶段。这次最麻烦——我们æ¢äº†ä¸€å°ç”µè„‘,之å‰çš„对è¯è®°å½•ä¸åœ¨æ‰‹è¾¹ï¼Œåªæœ‰ä»£ç æ–‡ä»¶ã€‚ 解法:直æ¥ä»ä»£ç æœ¬èº«æå–上下文,åšå†·å¯åŠ¨ã€‚
📋 模æ¿ä¸‰ï¼šå†·å¯åЍå¡ï¼ˆCold Start Card)
# 项目冷å¯åЍ — ä»ä»£ç æ¥ç®¡

我是è°

你是这个项目的主è¦å¼€å‘者,正在帮我继续开å‘。

代ç ç»“æ„(直æ¥ç²˜è´´ tree 输出)

[粘贴 tree -L 3 的输出结æœ]

核心文件速览

以下是几个关键文件的内容,请阅读å告诉我你ç†è§£äº†é¡¹ç›®ç»“æ„:

backend/src/models/prompt.model.ts

[粘贴文件内容]

backend/src/routes/index.ts

[粘贴文件内容]

当å‰ä»»åŠ¡

[æè¿°ä½ ç°åœ¨éœ€è¦åšä»€ä¹ˆ]

请先确认

在开始写代ç ä¹‹å‰ï¼Œå…ˆç”¨ä¸€æ®µè¯æ€»ç»“你对这个项目的ç†è§£ï¼Œ

ç‰¹åˆ«æ˜¯ï¼šæ•°æ®æ¨¡å‹ã€æ¥å£è§„范ã€å½“å‰è¿›åº¦ã€‚

最å一步很关键:让Claudeå…ˆ"å¤è¿°"它的ç†è§£ï¼Œä½ æ¥éªŒè¯å®ƒæ˜¯å¦çœŸçš„æ¥ç®¡äº†æ­£ç¡®çš„ä¸Šä¸‹æ–‡ï¼Œå†å¼€å§‹å†™ä»£ç ã€‚这能é¿å…它"å‡è£…ç†è§£"ç„¶åæ‚„æ‚„è·‘å。

---

ä¸‰ç§æ–¹æ³•的适用场景对比

| 场景 | æ¨è方法 | 核心逻辑 | | 全局规范被é—忘 | é¡¹ç›®çŠ¶æ€æ‘˜è¦å¡ | é‡å»ºé¡¹ç›®å…¨è²Œ | | å•个功能æ€è·¯æ–­äº† | 当å‰ä»»åŠ¡å¡ç‰‡ | 最å°ä¸Šä¸‹æ–‡æ³¨å…¥ | | 没有å†å²å¯¹è¯ï¼Œåªæœ‰ä»£ç  | 冷å¯åŠ¨å¡ | ä»ä»£ç åæ¨ä¸Šä¸‹æ–‡ |

---

æ–‡ä¸­è¿™å¥—ç©æ³•,用的是Claude的完整API能力。如æœä½ æƒ³è‡ªå·±è·‘一é,ä¸éœ€è¦æŠ˜è…¾è´¦å·â€”—848AIå¹³å°ï¼ˆapi.884819.xyzï¼‰ç›´æ¥æä¾›Claude APIæ¥å…¥ï¼ŒæŒ‰é‡è®¡è´¹ï¼Œå›½äº§æ¨¡å‹è¿˜å®Œå…¨å…费,注册å³é€ä½“验token,把文中的三套context模æ¿å¡«è¿›å»å°±èƒ½å¼€å§‹ã€‚下方评论区也欢è¿è´´ä½ çš„项目类å‹ï¼Œæˆ‘æ¥å¸®ä½ åˆ¤æ–­contextç­–ç•¥æ€ä¹ˆé€‰ã€‚

---

äº”ã€æœ€ç»ˆä¸Šçº¿ + å¤ç›˜

项目在第ä¹å¤©å®Œæˆä¸Šçº¿ã€‚

整体数æ®ï¼ˆä¼°ç®—,供å‚考): | 阶段 | 对è¯è½®æ¬¡ | 大致token消耗 | 主è¦äº§å‡º | | 需求拆解 + æ¶æ„设计 | 约15è½® | è¾ƒä½ | 文件结æ„ã€æŠ€æœ¯é€‰å‹ | | åç«¯æ ¸å¿ƒå¼€å‘ | 约40è½® | 中等 | 全部å端æ¥å£ | | å‰ç«¯å¼€å‘ | 约35è½® | 中等 | React页é¢å’Œç»„ä»¶ | | è”è°ƒ + bugä¿®å¤ | 约30è½® | 较高(代ç ç‰‡æ®µå¤šï¼‰| 稳定å¯ç”¨çš„版本 | | contextæ•‘æ´ï¼ˆ3次)| 约10è½® | ä½ï¼ˆæ‘˜è¦ä¸ºä¸»ï¼‰| é¡¹ç›®çŠ¶æ€æ¢å¤ |
âš ï¸ tokenæ¶ˆè€—å› é¡¹ç›®å¤æ‚度和代ç é‡å·®å¼‚较大,以上为é‡çº§å‚考,ä¸ä»£è¡¨ç²¾ç¡®æ•°å­—。
如æœé‡æ¥ä¸€é,我会这么åšï¼š

1. ä»ç¬¬ä¸€å¤©å°±ç»´æŠ¤é¡¹ç›®æ‘˜è¦æ–‡ä»¶ï¼Œæ¯å®Œæˆä¸€ä¸ªæ¨¡å—就更新一次,ä¸è¦ç­‰åˆ°æ–­æ‰äº†å†è¡¥

2. æ¥å£è§„范å•ç‹¬å­˜ä¸€ä¸ªæ–‡ä»¶ï¼Œæ¯æ¬¡æ–°å¼€å¯¹è¯éƒ½æŠŠå®ƒè´´è¿›å»ï¼Œæˆæœ¬æä½

3. æ¯éš”20-30轮对è¯ä¸»åЍåšä¸€æ¬¡"上下文检查",让Claudeå¤è¿°å½“å‰é¡¹ç›®çжæ€ï¼Œæå‰å‘ç°åç§»

4. 夿‚功能拆æˆç‹¬ç«‹å¯¹è¯ï¼Œä¸è¦æŠŠæ‰€æœ‰ä¸œè¥¿å †åœ¨ä¸€ä¸ªè¶…长对è¯é‡Œ

5. ä»£ç æ³¨é‡Šå†™å¾—更详细一点,这是最便宜的"æŒä¹…化上下文"

---

Claude Code的边界在哪里?

å®ƒä¸æ“…é•¿çš„äº‹æƒ…ä¹Ÿå¾ˆæ˜æ˜¾ï¼šéœ€è¦ä½ åšæœ€ç»ˆåˆ¤æ–­çš„æ¶æ„å†³ç­–ã€æ¶‰åŠä¸šåŠ¡é€»è¾‘çš„äº§å“å–èˆã€ä»¥åŠé‚£äº›"åªæœ‰ä½ çŸ¥é“为什么è¦è¿™ä¹ˆåš"çš„éšæ€§éœ€æ±‚。

ä½†æŒæ¡äº†context管ç†ä¹‹å,它能让一个人干出å°å›¢é˜Ÿçš„æ´»â€”â€”è¿™ä¸æ˜¯å¤¸å¼ ï¼Œæ˜¯è¿™ä¹å¤©é‡ŒçœŸå®å‘生的事。

---

这次是一个人用Claude Codeè·‘å®Œçš„ã€‚ä¸‹ä¸€ä¸ªé—®é¢˜æ›´æœ‰æ„æ€ï¼šå¦‚æœæ˜¯ä¸¤ä¸ªäººå作,一个写需求ã€ä¸€ä¸ªç›¯ä»£ç ï¼ŒClaude Code该æ€ä¹ˆåˆ†å·¥ï¼Ÿ 我们正在测试"人机混åˆå›¢é˜Ÿ"的工作æµâ€”—一个人负责和Claude对è¯ã€ä¸€ä¸ªäººè´Ÿè´£reviewå’Œæµ‹è¯•ï¼Œç»“æœæœ‰ç‚¹å‡ºä¹æ„料。下篇è§ã€‚

---

本文由848AIåŸåˆ›ï¼Œè½¬è½½è¯·æ³¨æ˜å‡ºå¤„。关注848AI,带你ä»é›¶å¼€å§‹å­¦AI。

#Claude Code #AI编程 #contextç®¡ç† #AIå¼€å‘工具 #ç‹¬ç«‹å¼€å‘ #8848AI #Prompt技巧 #AI宿ˆ˜