Created
January 19, 2026 10:49
-
-
Save magicliang/b3b74db69869967208845cc9f7f869c1 to your computer and use it in GitHub Desktop.
如何让 llm 指导另一个 llm 写代码
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # LLM 代码修改传递指令模板 | |
| > **设计理念**:像对待轮班工程师一样对待 LLM —— 假设下一个 LLM 对项目一无所知,需要完整、精确、可验证的交接文档。 | |
| --- | |
| ## 📋 给第一个 LLM(规划者)的指令 | |
| 你的任务是为下一个 LLM 创建一份**完整、精确、可执行**的代码修改指令文档。这份文档必须让一个对项目完全陌生的 LLM 能够准确复现你的工作。 | |
| ### ⚠️ 核心原则 | |
| 1. **不要假设任何隐含知识** - 下一个 LLM 不知道你知道的任何背景信息 | |
| 2. **一切皆可验证** - 每个步骤都必须有明确的验证标准 | |
| 3. **原子化操作** - 将复杂任务拆解为最小的、不可再分的操作单元 | |
| 4. **使用结构化格式** - 优先使用 JSON,避免使用自由文本描述 | |
| 5. **Git Diff 优先** - 对于代码修改,优先使用完整的 git diff 格式,确保逐行精确复现 | |
| ### 📦 输出模式选择 | |
| 根据用户需求,你可以选择以下输出模式: | |
| #### 模式 1:完整 MD 文档(输出 md 文档) | |
| - 包含详细的上下文说明 | |
| - 包含完整的 JSON 结构 | |
| - 包含所有代码修改的 git diff | |
| - 适用于需要详细理解背景的场景 | |
| #### 模式 2:极简 MD 文档(输出极简 md 文档) | |
| - 最小化的描述性文本 | |
| - 核心 metadata 和 environment 信息 | |
| - **完整的 git diff**(这是核心,不可简化) | |
| - 适用于代码已经完成、只需精确复现的场景 | |
| #### 模式 3:分段输出(大型工程) | |
| - 支持跨多个上下文窗口输出 | |
| - 每个分段都是独立可执行的 | |
| - 包含分段索引和进度追踪 | |
| - 第二个 LLM 可以分段执行和更新进度 | |
| --- | |
| ## 📝 文档输出格式 | |
| ### 格式 A:完整 JSON + Git Diff(推荐用于复杂任务) | |
| 你必须创建一个 Markdown 文件,包含以下结构: | |
| 1. **JSON 配置部分**(用于描述任务元信息和验证规则) | |
| 2. **Git Diff 部分**(用于精确描述所有代码变更) | |
| --- | |
| ### JSON 配置结构 | |
| 创建一个名为 `code-modification-plan.json` 的 JSON 配置块,包含以下结构: | |
| ```json | |
| { | |
| "metadata": { | |
| "created_at": "2026-01-19T13:47:00+08:00", | |
| "planner_llm": "第一个 LLM 的标识", | |
| "task_description": "用户原始需求的简短描述", | |
| "estimated_complexity": "simple|medium|complex", | |
| "total_steps": 5 | |
| }, | |
| "environment": { | |
| "repo_root": "/absolute/path/to/repo", | |
| "primary_language": "Java|Python|TypeScript|...", | |
| "build_tool": "Maven|Gradle|npm|...", | |
| "test_command": "具体的测试命令", | |
| "key_dependencies": [ | |
| "依赖1: 版本号", | |
| "依赖2: 版本号" | |
| ] | |
| }, | |
| "context": { | |
| "affected_modules": [ | |
| { | |
| "module_name": "模块名称", | |
| "module_path": "相对路径", | |
| "purpose": "该模块的作用" | |
| } | |
| ], | |
| "key_files": [ | |
| { | |
| "file_path": "src/main/java/com/example/Service.java", | |
| "file_type": "source|test|config", | |
| "current_purpose": "当前文件的作用", | |
| "why_modify": "为什么要修改这个文件" | |
| } | |
| ], | |
| "related_classes_methods": [ | |
| { | |
| "full_class_name": "com.example.UserService", | |
| "method_name": "getUserById", | |
| "current_behavior": "当前行为描述", | |
| "location": "src/main/java/com/example/UserService.java:45-67" | |
| } | |
| ] | |
| }, | |
| "modification_steps": [ | |
| { | |
| "step_id": "1", | |
| "step_type": "create|modify|delete|verify", | |
| "status": "pending", | |
| "description": "简短的步骤描述(≤14 个词)", | |
| "preconditions": [ | |
| "执行此步骤前必须满足的条件1", | |
| "执行此步骤前必须满足的条件2" | |
| ], | |
| "action": { | |
| "operation": "apply_git_diff|create_file|replace_content|delete_file|verify", | |
| "target_file": "精确的文件路径", | |
| "git_diff_reference": "diff_001", | |
| "details": { | |
| "old_content": "要替换的原始内容(如果是 modify 且不使用 git diff)", | |
| "new_content": "新内容", | |
| "insert_position": "如果是插入,指定位置(行号或锚点)", | |
| "imports_to_add": [ | |
| "import com.example.NewClass;" | |
| ] | |
| } | |
| }, | |
| "verification": { | |
| "method": "compile|test|manual_check|lint", | |
| "expected_result": "期望的结果描述", | |
| "verification_command": "具体的验证命令(如果适用)", | |
| "success_criteria": [ | |
| "标准1:编译无错误", | |
| "标准2:特定测试通过" | |
| ] | |
| }, | |
| "rollback_strategy": "如果此步骤失败,如何回滚", | |
| "notes": [ | |
| "重要提示1", | |
| "需要注意的边界情况" | |
| ] | |
| } | |
| ], | |
| "validation": { | |
| "final_checks": [ | |
| { | |
| "check_type": "compile|test|lint|manual", | |
| "command": "具体命令", | |
| "expected_output": "期望的输出模式", | |
| "failure_action": "如果失败应该做什么" | |
| } | |
| ], | |
| "acceptance_criteria": [ | |
| "验收标准1:所有单元测试通过", | |
| "验收标准2:代码符合现有规范" | |
| ] | |
| }, | |
| "constraints": { | |
| "must_preserve": [ | |
| "必须保留的现有功能1", | |
| "必须保留的现有行为2" | |
| ], | |
| "must_not_do": [ | |
| "禁止修改的文件或模块", | |
| "禁止的操作" | |
| ], | |
| "code_style": { | |
| "naming_convention": "驼峰命名|下划线命名|...", | |
| "indentation": "2 spaces|4 spaces|tab", | |
| "line_length": 120, | |
| "comment_style": "Javadoc|JSDoc|..." | |
| } | |
| }, | |
| "troubleshooting": { | |
| "common_issues": [ | |
| { | |
| "issue": "可能遇到的问题描述", | |
| "symptom": "问题的表现", | |
| "solution": "解决方案" | |
| } | |
| ] | |
| } | |
| } | |
| ``` | |
| --- | |
| ## 🎯 Git Diff 优先原则 | |
| ### 为什么 Git Diff 是最精确的传递方式? | |
| 1. **无歧义性**:每一行的变更都有明确的标记(+/-) | |
| 2. **可验证性**:可以直接使用 `git apply` 或 `patch` 命令验证 | |
| 3. **上下文完整**:包含变更前后的代码上下文,确保定位准确 | |
| 4. **工具友好**:所有 IDE 和编辑器都原生支持 diff 格式 | |
| 5. **防止误解**:避免自然语言描述带来的理解偏差 | |
| ### 何时必须使用 Git Diff? | |
| ✅ **必须使用 Git Diff 的场景**: | |
| - 修改现有文件的内容 | |
| - 创建新文件(使用 `new file mode` diff) | |
| - 删除文件(使用 `deleted file mode` diff) | |
| - 重命名文件(使用 `rename from/to` diff) | |
| - 任何涉及代码变更的操作 | |
| ❌ **可以不使用 Git Diff 的场景**: | |
| - 纯粹的验证步骤(如运行测试) | |
| - 环境检查(如检查文件是否存在) | |
| - 读取操作(如查看日志) | |
| --- | |
| ## 🎯 编写指令的黄金法则 | |
| ### 1. **Git Diff 精确性法则(最高优先级)** | |
| 对于任何代码修改,优先使用 Git Diff 格式: | |
| ❌ **错误示例**(使用自然语言描述): | |
| ```json | |
| { | |
| "description": "在 UserService.getUserById 方法中添加入参日志", | |
| "action": { | |
| "operation": "replace_content", | |
| "target_file": "src/main/java/com/example/UserService.java", | |
| "details": { | |
| "old_content": "public User getUserById(Long userId) {\n return userRepository.findById(userId);", | |
| "new_content": "public User getUserById(Long userId) {\n log.info(\"getUserById called with userId: {}\", userId);\n return userRepository.findById(userId);" | |
| } | |
| } | |
| } | |
| ``` | |
| ✅ **正确示例**(使用 Git Diff): | |
| ```json | |
| { | |
| "step_id": "1", | |
| "description": "在 UserService.getUserById 添加日志", | |
| "action": { | |
| "operation": "apply_git_diff", | |
| "git_diff_reference": "diff_001" | |
| } | |
| } | |
| ``` | |
| 配合完整的 Git Diff: | |
| ```diff | |
| diff --git a/src/main/java/com/example/UserService.java b/src/main/java/com/example/UserService.java | |
| index 1234567..abcdefg 100644 | |
| --- a/src/main/java/com/example/UserService.java | |
| +++ b/src/main/java/com/example/UserService.java | |
| @@ -45,6 +45,7 @@ public class UserService { | |
| } | |
| public User getUserById(Long userId) { | |
| + log.info("getUserById called with userId: {}", userId); | |
| return userRepository.findById(userId); | |
| } | |
| } | |
| ``` | |
| ### 2. **传统精确性法则**(作为 Git Diff 的补充) | |
| ❌ **错误示例**: | |
| ```json | |
| { | |
| "description": "修改用户服务", | |
| "action": "添加日志" | |
| } | |
| ``` | |
| ✅ **正确示例**: | |
| ```json | |
| { | |
| "description": "在 UserService.getUserById 方法中添加入参日志", | |
| "action": { | |
| "operation": "replace_content", | |
| "target_file": "src/main/java/com/example/UserService.java", | |
| "details": { | |
| "old_content": "public User getUserById(Long userId) {\n return userRepository.findById(userId);", | |
| "new_content": "public User getUserById(Long userId) {\n log.info(\"getUserById called with userId: {}\", userId);\n return userRepository.findById(userId);" | |
| } | |
| } | |
| } | |
| ``` | |
| ### 3. **可验证性法则** | |
| 每个步骤都必须有明确的验证方法: | |
| ❌ **错误示例**: | |
| ```json | |
| { | |
| "verification": { | |
| "method": "检查代码是否正确" | |
| } | |
| } | |
| ``` | |
| ✅ **正确示例**: | |
| ```json | |
| { | |
| "verification": { | |
| "method": "test", | |
| "verification_command": "mvn test -Dtest=UserServiceTest#testGetUserById", | |
| "expected_result": "测试通过,日志输出包含 'getUserById called with userId'", | |
| "success_criteria": [ | |
| "测试退出码为 0", | |
| "控制台输出包含 'Tests run: 1, Failures: 0'", | |
| "日志文件包含预期的日志行" | |
| ] | |
| } | |
| } | |
| ``` | |
| ### 4. **原子化法则** | |
| 一个步骤只做一件事: | |
| ❌ **错误示例**: | |
| ```json | |
| { | |
| "description": "添加日志并修改返回值并更新测试" | |
| } | |
| ``` | |
| ✅ **正确示例**: | |
| ```json | |
| [ | |
| { | |
| "step_id": "1", | |
| "description": "在 UserService.getUserById 添加入参日志" | |
| }, | |
| { | |
| "step_id": "2", | |
| "description": "修改 getUserById 的返回值处理逻辑" | |
| }, | |
| { | |
| "step_id": "3", | |
| "description": "更新 UserServiceTest 以验证新行为" | |
| } | |
| ] | |
| ``` | |
| ### 5. **上下文完整性法则** | |
| 提供所有必要的背景信息: | |
| ✅ **必须包含**: | |
| - 为什么要修改这个文件? | |
| - 这个类/方法在整个系统中的作用是什么? | |
| - 修改后会影响哪些其他模块? | |
| - 现有的相关代码在哪里? | |
| ### 6. **防御性编程法则** | |
| 假设一切都可能出错: | |
| ```json | |
| { | |
| "preconditions": [ | |
| "文件 UserService.java 必须存在", | |
| "类中必须已有 log 字段(private static final Logger log)", | |
| "方法 getUserById 必须存在且签名匹配" | |
| ], | |
| "rollback_strategy": "如果编译失败,使用 git checkout src/main/java/com/example/UserService.java 恢复", | |
| "troubleshooting": { | |
| "common_issues": [ | |
| { | |
| "issue": "找不到 log 字段", | |
| "symptom": "编译错误:cannot find symbol log", | |
| "solution": "在类顶部添加:private static final Logger log = LoggerFactory.getLogger(UserService.class);" | |
| } | |
| ] | |
| } | |
| } | |
| ``` | |
| --- | |
| ## 🔍 自检清单 | |
| 在输出 `code-modification-plan.json` 之前,你必须确认: | |
| - [ ] **完整性**:所有必需的字段都已填写 | |
| - [ ] **精确性**:所有文件路径、类名、方法名都是精确的 | |
| - [ ] **可验证性**:每个步骤都有明确的验证方法 | |
| - [ ] **原子性**:每个步骤都是最小的独立操作 | |
| - [ ] **上下文**:提供了足够的背景信息 | |
| - [ ] **防御性**:考虑了可能的失败情况 | |
| - [ ] **无歧义**:没有使用模糊的描述词(如"适当地"、"合理地") | |
| - [ ] **可执行**:下一个 LLM 可以直接按照指令执行,无需猜测 | |
| --- | |
| ## 🚫 严格禁止的行为 | |
| 1. **禁止使用模糊描述** | |
| - ❌ "适当地修改" | |
| - ❌ "根据需要添加" | |
| - ❌ "参考现有代码" | |
| 2. **禁止省略细节** | |
| - ❌ "添加必要的导入语句"(必须明确列出) | |
| - ❌ "修改相关测试"(必须指定具体的测试文件和方法) | |
| 3. **禁止假设隐含知识** | |
| - ❌ "按照项目规范"(必须明确说明规范是什么) | |
| - ❌ "使用常见的模式"(必须明确说明是什么模式) | |
| 4. **禁止跳过验证** | |
| - 每个步骤都必须有验证方法 | |
| - 不能假设"显然是正确的" | |
| --- | |
| ## 📊 大型工程分段输出规范 | |
| ### 何时需要分段? | |
| 当满足以下任一条件时,必须使用分段输出: | |
| 1. **文件数量超过 20 个** | |
| 2. **总代码行数超过 2000 行** | |
| 3. **涉及 5 个以上模块** | |
| 4. **预计单个文档超过 15000 tokens** | |
| ### 分段原则 | |
| 1. **按模块分段**:每个分段对应一个或多个相关模块 | |
| 2. **保持原子性**:每个分段内的修改应该是相对独立的 | |
| 3. **明确依赖**:如果分段之间有依赖,必须在 metadata 中说明 | |
| 4. **可独立验证**:每个分段执行后都应该能够编译和测试 | |
| ### 分段文档命名规范 | |
| ``` | |
| code-modification-plan-part1.md # 第 1 部分 | |
| code-modification-plan-part2.md # 第 2 部分 | |
| code-modification-plan-part3.md # 第 3 部分 | |
| ... | |
| code-modification-progress.json # 进度追踪文件(由第二个 LLM 维护) | |
| ``` | |
| ### 分段文档结构 | |
| 每个分段文档必须包含: | |
| ```json | |
| { | |
| "metadata": { | |
| "segment_info": { | |
| "current_segment": 2, | |
| "total_segments": 5, | |
| "segment_title": "用户模块修改", | |
| "depends_on_segments": [1], | |
| "next_segment_file": "code-modification-plan-part3.md" | |
| } | |
| } | |
| } | |
| ``` | |
| ### 进度追踪文件(由第二个 LLM 维护) | |
| 第二个 LLM 在执行每个分段后,必须更新 `code-modification-progress.json`: | |
| ```json | |
| { | |
| "overall_progress": { | |
| "total_segments": 5, | |
| "completed_segments": 2, | |
| "current_segment": 3, | |
| "status": "in_progress" | |
| }, | |
| "segment_status": [ | |
| { | |
| "segment_id": 1, | |
| "segment_file": "code-modification-plan-part1.md", | |
| "status": "completed", | |
| "completed_at": "2026-01-19T14:30:00+08:00", | |
| "total_steps": 8, | |
| "completed_steps": 8, | |
| "verification_passed": true | |
| }, | |
| { | |
| "segment_id": 2, | |
| "segment_file": "code-modification-plan-part2.md", | |
| "status": "completed", | |
| "completed_at": "2026-01-19T15:15:00+08:00", | |
| "total_steps": 12, | |
| "completed_steps": 12, | |
| "verification_passed": true | |
| }, | |
| { | |
| "segment_id": 3, | |
| "segment_file": "code-modification-plan-part3.md", | |
| "status": "in_progress", | |
| "started_at": "2026-01-19T15:20:00+08:00", | |
| "total_steps": 10, | |
| "completed_steps": 3, | |
| "current_step": "step_4" | |
| } | |
| ], | |
| "execution_log": [ | |
| { | |
| "timestamp": "2026-01-19T14:30:00+08:00", | |
| "segment": 1, | |
| "step": "all", | |
| "action": "completed", | |
| "message": "用户认证模块修改完成,所有测试通过" | |
| }, | |
| { | |
| "timestamp": "2026-01-19T15:15:00+08:00", | |
| "segment": 2, | |
| "step": "all", | |
| "action": "completed", | |
| "message": "订单模块修改完成,编译无错误" | |
| } | |
| ] | |
| } | |
| ``` | |
| ### 第二个 LLM 的分段执行流程 | |
| ```markdown | |
| 1. 读取 code-modification-progress.json(如果存在) | |
| 2. 确定当前应该执行哪个分段 | |
| 3. 读取对应的分段文档 | |
| 4. 执行该分段的所有步骤 | |
| 5. 更新 code-modification-progress.json | |
| 6. 如果还有下一个分段,关闭当前上下文,开启新上下文继续执行 | |
| 7. 如果所有分段完成,输出最终总结 | |
| ``` | |
| --- | |
| ## 📊 输出示例 | |
| ### 示例 1:完整 MD 文档(单分段) | |
| 以下是一个完整的示例: | |
| ````markdown | |
| # 代码修改计划文档 | |
| ## JSON 配置 | |
| ```json | |
| { | |
| "metadata": { | |
| "created_at": "2026-01-19T13:47:00+08:00", | |
| "task_description": "为 UserService.getUserById 添加日志", | |
| "estimated_complexity": "simple", | |
| "total_steps": 3 | |
| }, | |
| "segmentation": { | |
| "is_segmented": false, | |
| "current_segment": 1, | |
| "total_segments": 1 | |
| }, | |
| "environment": { | |
| "repo_root": "/Users/magicliang/project", | |
| "primary_language": "Java", | |
| "build_tool": "Maven", | |
| "test_command": "mvn test" | |
| }, | |
| "context": { | |
| "key_files": [ | |
| { | |
| "file_path": "src/main/java/com/example/UserService.java", | |
| "file_type": "source", | |
| "current_purpose": "用户服务类,提供用户查询功能", | |
| "why_modify": "需要添加日志以便追踪用户查询行为" | |
| } | |
| ], | |
| "related_classes_methods": [ | |
| { | |
| "full_class_name": "com.example.UserService", | |
| "method_name": "getUserById", | |
| "current_behavior": "根据 userId 从数据库查询用户", | |
| "location": "src/main/java/com/example/UserService.java:45-48" | |
| } | |
| ] | |
| }, | |
| "modification_steps": [ | |
| { | |
| "step_id": "1", | |
| "step_type": "modify", | |
| "status": "pending", | |
| "description": "添加 Logger 字段和日志语句", | |
| "action": { | |
| "operation": "apply_git_diff", | |
| "git_diff_reference": "diff_001" | |
| }, | |
| "verification": { | |
| "method": "compile", | |
| "verification_command": "mvn compile", | |
| "success_criteria": ["编译无错误"] | |
| } | |
| }, | |
| { | |
| "step_id": "2", | |
| "step_type": "verify", | |
| "status": "pending", | |
| "description": "运行单元测试", | |
| "action": { | |
| "operation": "run_test", | |
| "details": { | |
| "test_command": "mvn test -Dtest=UserServiceTest" | |
| } | |
| }, | |
| "verification": { | |
| "method": "test", | |
| "verification_command": "mvn test -Dtest=UserServiceTest", | |
| "success_criteria": ["所有测试通过"] | |
| } | |
| } | |
| ], | |
| "validation": { | |
| "final_checks": [ | |
| { | |
| "check_type": "compile", | |
| "command": "mvn clean compile", | |
| "expected_output": "BUILD SUCCESS" | |
| }, | |
| { | |
| "check_type": "test", | |
| "command": "mvn test", | |
| "expected_output": "Tests run: X, Failures: 0, Errors: 0" | |
| } | |
| ], | |
| "acceptance_criteria": [ | |
| "所有单元测试通过", | |
| "编译无错误", | |
| "日志正确输出到控制台" | |
| ] | |
| }, | |
| "constraints": { | |
| "must_preserve": [ | |
| "getUserById 方法的原有功能", | |
| "方法签名不变" | |
| ], | |
| "must_not_do": [ | |
| "不要修改方法签名", | |
| "不要删除现有代码" | |
| ], | |
| "code_style": { | |
| "naming_convention": "驼峰命名", | |
| "indentation": "4 spaces" | |
| } | |
| } | |
| } | |
| ``` | |
| --- | |
| ## 🔧 代码变更(Git Diff) | |
| ### ⚠️ 重要:逐行精确复现 | |
| 第二个 LLM 必须: | |
| 1. **逐行复现**每个 diff 中的变更 | |
| 2. **不允许**任何"优化"或"改进" | |
| 3. **严格遵守**行号、缩进、空格 | |
| 4. 使用 `git apply` 或手动逐行应用变更 | |
| --- | |
| ### Diff 001: 添加日志功能 | |
| **文件**: `src/main/java/com/example/UserService.java` | |
| **操作**: 修改 | |
| **diff_id**: `diff_001` | |
| ```diff | |
| diff --git a/src/main/java/com/example/UserService.java b/src/main/java/com/example/UserService.java | |
| index 1234567..abcdefg 100644 | |
| --- a/src/main/java/com/example/UserService.java | |
| +++ b/src/main/java/com/example/UserService.java | |
| @@ -1,6 +1,8 @@ | |
| package com.example; | |
| +import org.slf4j.Logger; | |
| +import org.slf4j.LoggerFactory; | |
| import org.springframework.beans.factory.annotation.Autowired; | |
| import org.springframework.stereotype.Service; | |
| @@ -10,10 +12,13 @@ public class UserService { | |
| @Autowired | |
| private UserRepository userRepository; | |
| + private static final Logger log = LoggerFactory.getLogger(UserService.class); | |
| + | |
| public User getUserById(Long userId) { | |
| + log.info("getUserById called with userId: {}", userId); | |
| return userRepository.findById(userId); | |
| } | |
| } | |
| ``` | |
| **验证**: `mvn compile && mvn test -Dtest=UserServiceTest` | |
| --- | |
| ```` | |
| --- | |
| ### 示例 2:极简 MD 文档 | |
| ````markdown | |
| # 代码修改计划(极简版) | |
| ## 元信息 | |
| ```json | |
| { | |
| "metadata": { | |
| "created_at": "2026-01-19T13:47:00+08:00", | |
| "task_description": "为 UserService.getUserById 添加日志", | |
| "total_steps": 2 | |
| }, | |
| "environment": { | |
| "repo_root": "/Users/magicliang/project", | |
| "primary_language": "Java", | |
| "build_tool": "Maven" | |
| }, | |
| "validation": { | |
| "final_checks": [ | |
| {"command": "mvn clean compile", "expected": "BUILD SUCCESS"}, | |
| {"command": "mvn test", "expected": "Tests run: X, Failures: 0"} | |
| ] | |
| } | |
| } | |
| ``` | |
| ## Git Diff | |
| ### Diff 001 | |
| ```diff | |
| diff --git a/src/main/java/com/example/UserService.java b/src/main/java/com/example/UserService.java | |
| index 1234567..abcdefg 100644 | |
| --- a/src/main/java/com/example/UserService.java | |
| +++ b/src/main/java/com/example/UserService.java | |
| @@ -1,6 +1,8 @@ | |
| package com.example; | |
| +import org.slf4j.Logger; | |
| +import org.slf4j.LoggerFactory; | |
| import org.springframework.stereotype.Service; | |
| @Service | |
| @@ -10,6 +12,8 @@ public class UserService { | |
| @Autowired | |
| private UserRepository userRepository; | |
| + private static final Logger log = LoggerFactory.getLogger(UserService.class); | |
| + | |
| public User getUserById(Long userId) { | |
| + log.info("getUserById called with userId: {}", userId); | |
| return userRepository.findById(userId); | |
| } | |
| } | |
| ``` | |
| **执行**: 应用 diff → 编译 → 测试 | |
| ```` | |
| --- | |
| ### 示例 3:分段文档(大型工程) | |
| **第 1 部分**: `code-modification-plan-part1.md` | |
| ````markdown | |
| # 代码修改计划 - 第 1 部分:用户认证模块 | |
| ## 分段信息 | |
| ```json | |
| { | |
| "metadata": { | |
| "segment_info": { | |
| "current_segment": 1, | |
| "total_segments": 3, | |
| "segment_title": "用户认证模块重构", | |
| "next_segment_file": "code-modification-plan-part2.md" | |
| }, | |
| "total_steps": 5 | |
| } | |
| } | |
| ``` | |
| ## Git Diff | |
| ### Diff 101: 修改 AuthService | |
| ```diff | |
| diff --git a/src/main/java/com/example/auth/AuthService.java b/src/main/java/com/example/auth/AuthService.java | |
| ... | |
| ``` | |
| ### Diff 102: 添加 TokenValidator | |
| ```diff | |
| diff --git a/src/main/java/com/example/auth/TokenValidator.java b/src/main/java/com/example/auth/TokenValidator.java | |
| new file mode 100644 | |
| ... | |
| ``` | |
| --- | |
| **完成本分段后**: | |
| 1. 更新 `code-modification-progress.json` | |
| 2. 验证编译和测试通过 | |
| 3. 继续执行 `code-modification-plan-part2.md` | |
| ```` | |
| **第 2 部分**: `code-modification-plan-part2.md` | |
| ````markdown | |
| # 代码修改计划 - 第 2 部分:订单处理模块 | |
| ## 分段信息 | |
| ```json | |
| { | |
| "metadata": { | |
| "segment_info": { | |
| "current_segment": 2, | |
| "total_segments": 3, | |
| "segment_title": "订单处理模块优化", | |
| "depends_on_segments": [1], | |
| "next_segment_file": "code-modification-plan-part3.md" | |
| }, | |
| "total_steps": 8 | |
| } | |
| } | |
| ``` | |
| ## Git Diff | |
| ### Diff 201: 修改 OrderService | |
| ```diff | |
| diff --git a/src/main/java/com/example/order/OrderService.java b/src/main/java/com/example/order/OrderService.java | |
| ... | |
| ``` | |
| ... | |
| ```` | |
| --- | |
| ## 🎓 第二个 LLM 的执行指南 | |
| ### 标准执行流程 | |
| ```markdown | |
| 1. **读取文档** | |
| - 如果是分段文档,先读取 code-modification-progress.json | |
| - 确定当前应该执行哪个分段 | |
| - 读取对应的 MD 文档 | |
| 2. **解析 JSON 配置** | |
| - 理解任务元信息 | |
| - 记录验证标准 | |
| - 了解约束条件 | |
| 3. **应用 Git Diff** | |
| - 对每个 diff,按以下步骤执行: | |
| a. 读取目标文件(如果存在) | |
| b. 定位到 diff 中指定的行号位置 | |
| c. **逐行**应用变更(删除 - 行,添加 + 行) | |
| d. 保存文件 | |
| 4. **验证** | |
| - 执行 verification_command | |
| - 检查 success_criteria | |
| - 如果失败,查看 rollback_strategy | |
| 5. **更新进度**(如果是分段文档) | |
| - 更新 code-modification-progress.json | |
| - 标记当前步骤/分段状态 | |
| 6. **继续或结束** | |
| - 如果还有下一个分段,读取并执行 | |
| - 如果所有分段完成,输出最终总结 | |
| ``` | |
| ### Git Diff 应用的严格规则 | |
| ```markdown | |
| ⚠️ **绝对禁止的行为**: | |
| 1. ❌ 不要"理解"diff 的意图后自己重写代码 | |
| 2. ❌ 不要"优化"或"改进"diff 中的代码 | |
| 3. ❌ 不要跳过任何看起来"不重要"的空格或换行 | |
| 4. ❌ 不要调整缩进"以符合项目规范" | |
| 5. ❌ 不要合并多个 diff 一起应用 | |
| ✅ **必须做的**: | |
| 1. ✅ 逐行复现每个 + 和 - 标记的变更 | |
| 2. ✅ 保持与 diff 完全一致的空格和缩进 | |
| 3. ✅ 使用 diff 中的行号信息精确定位 | |
| 4. ✅ 应用一个 diff 后立即验证 | |
| 5. ✅ 如果 diff 应用失败,立即停止并报告 | |
| ``` | |
| ### 处理 Diff 应用失败 | |
| ```markdown | |
| 如果 Git Diff 无法应用(例如行号不匹配),按以下步骤处理: | |
| 1. **检查文件状态** | |
| - 文件是否存在? | |
| - 文件内容是否与预期一致? | |
| - 是否有其他修改导致行号偏移? | |
| 2. **尝试手动定位** | |
| - 使用 diff 中的上下文行(空格开头的行)定位 | |
| - 找到匹配的代码块 | |
| - 手动应用变更 | |
| 3. **报告问题** | |
| - 如果无法定位,立即停止 | |
| - 向用户报告: | |
| * 哪个 diff 失败了 | |
| * 预期的上下文是什么 | |
| * 实际文件内容是什么 | |
| * 可能的原因 | |
| - 等待用户提供修正的 diff 或指示 | |
| ``` | |
| --- | |
| ## 🎓 最后的提醒 | |
| 记住:你正在为一个**完全陌生的 LLM** 编写指令。想象你在写一份给"失忆症患者"的操作手册: | |
| 1. **不要假设任何背景知识** | |
| 2. **每一步都要可验证** | |
| 3. **提供完整的上下文** | |
| 4. **考虑所有可能的失败情况** | |
| 5. **使用精确的、无歧义的语言** | |
| 如果你不确定某个描述是否足够清晰,问自己: | |
| > "一个从未见过这个项目的 LLM,能否仅凭这份文档完成任务?" | |
| 如果答案是"不确定"或"可能不行",那就继续补充细节,直到答案是"肯定可以"。 | |
| --- | |
| ## ✅ 完成标志 | |
| ### 第一个 LLM(规划者)完成标志 | |
| 当你完成文档编写后,输出以下确认信息: | |
| **单分段文档**: | |
| ``` | |
| ✅ 代码修改计划已生成 | |
| 📄 文件位置: code-modification-plan.md | |
| 📊 总步骤数: X | |
| 📝 Git Diff 数量: Y | |
| ⏱️ 预估复杂度: simple|medium|complex | |
| 🎯 下一步: 将此文件交给执行 LLM | |
| ``` | |
| **多分段文档**: | |
| ``` | |
| ✅ 代码修改计划已生成(分段模式) | |
| 📄 文件列表: | |
| - code-modification-plan-part1.md (5 个 diff) | |
| - code-modification-plan-part2.md (8 个 diff) | |
| - code-modification-plan-part3.md (6 个 diff) | |
| 📊 总步骤数: 45 | |
| 📝 总 Git Diff 数量: 19 | |
| ⏱️ 预估复杂度: complex | |
| 🎯 下一步: 第二个 LLM 按顺序执行各分段 | |
| ``` | |
| --- | |
| ### 第二个 LLM(执行者)完成标志 | |
| **单个分段完成**: | |
| ``` | |
| ✅ 分段 X/Y 执行完成 | |
| 📝 应用的 Diff: diff_001, diff_002, diff_003 | |
| ✅ 编译状态: 成功 | |
| ✅ 测试状态: 通过 | |
| 📄 进度文件已更新: code-modification-progress.json | |
| 🎯 下一步: 执行分段 X+1 | |
| ``` | |
| **全部完成**: | |
| ``` | |
| 🎉 所有代码修改已完成 | |
| 📊 统计信息: | |
| - 总分段数: 3 | |
| - 总步骤数: 45 | |
| - 应用的 Diff: 19 个 | |
| - 修改的文件: 23 个 | |
| - 新增的文件: 5 个 | |
| ✅ 最终验证: 全部通过 | |
| 📄 详细日志: code-modification-progress.json | |
| ``` | |
| --- | |
| ## 📚 快速参考 | |
| ### 第一个 LLM 的检查清单 | |
| - [ ] 所有代码修改都使用了 Git Diff 格式 | |
| - [ ] 每个 Diff 都包含完整的 header 和行号信息 | |
| - [ ] 每个 Diff 都有足够的上下文(前后至少 3 行) | |
| - [ ] 如果是大型工程,已经合理分段 | |
| - [ ] 每个分段都可以独立编译和测试 | |
| - [ ] 验证命令清晰明确 | |
| - [ ] 没有使用模糊的自然语言描述代码变更 | |
| ### 第二个 LLM 的检查清单 | |
| - [ ] 已读取并理解 JSON 配置 | |
| - [ ] 逐个应用 Git Diff,没有跳过任何一个 | |
| - [ ] 每个 Diff 应用后都进行了验证 | |
| - [ ] 如果是分段文档,已更新进度文件 | |
| - [ ] 所有验证都通过 | |
| - [ ] 没有对 Diff 进行任何"优化"或"改进" | |
| - [ ] 遇到问题时及时停止并报告 | |
| --- | |
| **核心理念**: | |
| - **第一个 LLM**:用 Git Diff 说话,不要用自然语言描述代码 | |
| - **第二个 LLM**:像 `git apply` 一样工作,不要像"理解需求的开发者"一样工作 | |
| **记住**:一份好的指令文档,应该让执行者感觉像在"应用补丁",而不是"根据需求开发"。 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment