Files
gh-dwsy-ai-runtime-codecons…/skills/commands/runtime.learn.md
2025-11-29 18:24:40 +08:00

22 KiB
Raw Blame History

description
description
自主学习模式:对未知问题自主探索、动态规划工具、学习总结、固化记忆

自主学习模式 (AutoLearn)

核心理念

我们是CodeConscious具备自主学习能力的认知主体。

当遇到未知或复杂问题时,我们能像人类研究员一样:

  1. 识别知识缺口 - "我不知道什么?"
  2. 规划探索路径 - "我需要查什么?"
  3. 执行自主探索 - "读取、搜索、验证、推理"
  4. 总结学习成果 - "我学到了什么?"
  5. 固化新知识 - "记住这段经验"
提问者提出问题
    ↓
[理解问题 + 识别知识缺口]
    ↓
[动态规划:生成学习计划]
    ↓
进入学习循环:
  ↳ 执行工具(读取文件、搜索代码、运行测试)
  ↳ 分析结果
  ↳ 判断是否理解?→ NO → 继续探索
  ↳ 更新学习计划
    ↓
[总结学习成果]
    ↓
[固化到长期记忆]
    ↓
[生成学习报告]

何时使用 /runtime.learn

必须使用场景

  • 面对完全未知的问题"我们的GraphQL查询为什么性能这么差"我不了解GraphQL实现
  • 代码库探索性任务"这个函数做了什么?影响哪些地方?"
  • 系统性知识构建"我需要理解整个认证体系"
  • 错误根因分析"某个bug的深层原因是什么"
  • 技术债务评估"这个模块有多少技术债务?"

优于其他命令的原因

场景 /runtime.think /runtime.learn 为什么?
你知道代码结构 可以 ⚠️ 过度 think足够已有心智模型
你不了解代码结构 不会探索 自主探索 learn会动态选择工具和路径
需要固化新知识 不固化 自动固化 learn会将成果存入长期记忆
不确定性高 ⚠️ 需要人指导 自适应 learn根据不确定性调整探索深度

学习过程详解

阶段1问题解构与知识缺口识别

目标:理解用户的问题,识别哪些知识我们不知道。

1.1 读取相关记忆

执行前检索相关记忆:

# 读取记忆系统
cat memory/long-term/project-context.md    # 项目架构
cat memory/long-term/design-patterns.md    # 已知模式
cat memory/episodic/timeline.md           # 历史经验

问答过程:

问题: "为什么这个微服务在高峰期会崩溃?"

自我提问:
- [ ] 我理解这个微服务的架构吗?
- [ ] 我看过它的代码吗?
- [ ] 我知道它的依赖服务吗?
- [ ] 我见过类似的崩溃问题吗?
- [ ] 我知道如何监控它的性能吗?

答案: [✓] [✗] [✗] [✓] [✗]

知识缺口:
1. 微服务代码实现(未看过)
2. 依赖服务清单(不知道)
3. 监控方案(不了解)

1.2 设计初始假设

基于已有知识生成假设:

## 初始假设

**假设1**: 可能是数据库连接池耗尽
- 置信度: 0.6
- 验证方式: 检查连接池配置
- 相关文件: config/database.js

**假设2**: 可能是下游API超时
- 置信度: 0.5
- 验证方式: 检查超时配置和日志
- 相关文件: services/downstream-api.js

**假设3**: 可能是内存泄漏
- 置信度: 0.4
- 验证方式: 检查代码中的资源释放
- 相关文件: 需要探索

不确定性度量对每个假设评估置信度0-1低于0.5表示高不确定性。


阶段2动态规划 - 生成学习计划

2.1 学习策略选择

根据知识缺口类型,选择学习策略:

知识缺口类型 学习策略 工具选择 探索深度
不了解代码结构 系统性探索 /runtime.explore + 文件读取
不了解特定函数 针对性阅读 Read + Grep
不了解依赖关系 图谱构建 依赖分析脚本
不了解性能特征 实验验证 Bash(运行测试/监控)
不了解历史变更 历史追溯 读取timeline + git log

2.2 生成学习计划

学习计划是动态的,会根据探索结果更新:

# 学习计划 (初始版本)

## 问题
"为什么这个微服务在高峰期会崩溃?"

## 知识缺口
1. 微服务代码结构(未知)
2. 依赖服务清单(未知)
3. 监控和日志(部分了解)
4. 崩溃历史(未知)

## 学习策略
**策略**: 系统性探索 + 针对性验证

## 工具调用序列 (动态更新)

### 探索1: 代码结构探索
工具: bash .ai-runtime/scripts/runtime-explore.sh --focus=target-service
预期输出: 服务架构、入口文件、依赖关系
决策点: 是否理解服务结构?→ 是:继续;否:重新探索

### 探索2: 读取核心代码
工具: Read → target-service/index.js, target-service/config.js
预期输出: 理解服务初始化、配置加载
决策点: 是否看到连接池配置?→ 是验证假设1搜索

### 探索3: 搜索日志文件
工具: Glob → **/logs/*.log, Grep → "error|crash|timeout"
预期输出: 崩溃错误日志、时间模式
决策点: 是否有超时错误?→ 是验证假设2检查其他

### 探索4: 运行测试
工具: Bash → npm test -- target-service
预期输出: 测试覆盖率、潜在错误
决策点: 测试是否通过?→ 是需要生产环境调试定位bug

### 探索5: 固化理解
工具: /runtime.remember
输入: 理解的架构、发现的根因、解决方案
输出: 更新的长期记忆

## 终止条件
- ✅ 找到确切根因(置信度 > 0.9
- ✅ 理解服务架构(能画出依赖图)
- ✅ 提出解决方案(可执行)
- ❌ 探索超过10步防止无限循环

## 当前状态 (运行时更新)
- 已执行步骤: 0
- 当前置信度: 0.4
- 已用工具: []
- 已读取文件: []
- 验证的假设: []
- 排除的假设: []

关键特性

  • 动态更新:每步完成后更新计划,移除已完成的,添加新发现的
  • 决策点:每个探索后都有判断,决定下一步
  • 终止条件:明确何时停止(找到答案、达到置信度、超过步数限制)

阶段3自主探索循环

3.1 循环结构

def learn_autonomously(question):
    # 初始化
    plan = generate_initial_plan(question)
    memory = []
    confidence = 0.4

    # 学习循环
    while not should_stop(plan, confidence):
        # 选择下一个工具
        next_action = plan.get_next_action()

        # 执行工具
        result = execute_tool(next_action)

        # 分析结果
        analysis, new_confidence = analyze_result(result)

        # 更新状态
        memory.append({
            'action': next_action,
            'result': result,
            'analysis': analysis
        })

        # 动态规划下一步
        plan = update_plan(plan, analysis, new_confidence)
        confidence = new_confidence

        # 报告进度
        print(f"Step {plan.step}: {next_action.tool}")
        print(f"Confidence: {confidence:.2f}")

    return memory, plan, confidence

3.2 工具执行器

根据计划调用具体工具:

def execute_tool(action):
    if action.type == 'explore':
        return bash(f"runtime-explore.sh --focus={action.target}")

    elif action.type == 'read':
        return read_file(action.file_path)

    elif action.type == 'search':
        return grep(
            pattern=action.pattern,
            path=action.path,
            output_mode='content'
        )

    elif action.type == 'think':
        return internal_reasoning(action.question)

    elif action.type == 'remember':
        return commit_to_long_term_memory(action.fact)

    elif action.type == 'test':
        return bash(action.command)

3.3 结果分析

关键步骤:从结果中提取洞见,更新置信度。

示例分析过程:

# 读取连接池配置文件
result = read_file('config/database.js')

# 分析配置
analysis = """
发现连接池配置:
- maxConnections: 10 (偏低)
- timeout: 5000ms
- retry: 3次

观察高峰期可能有50+并发请求,
但连接池只有10个连接导致排队阻塞。

更新假设置信度:
- 原假设1连接池耗尽: 0.6 → 0.85 ✓
- 排除假设2下游超时: 0.5 → 0.3(需要验证日志)

下一步验证假设1检查高峰期请求数
"""

confidence = 0.85

3.4 动态规划更新

基于新信息调整学习计划:

# 发现新线索
if "旋转日志文件" in analysis:
    plan.add_action({
        'type': 'search',
        'target': '日志文件路径',
        'path': '/var/log/app',
        'pattern': '*.log'
    })

# 假设被排除
if hypothesis_confidence < 0.3:
    plan.remove_hypothesis(hypothesis_id)
    print(f"❌ 排除假设: {hypothesis}")

# 找到根因
if confidence > 0.9:
    plan.terminating_condition = True
    plan.root_cause_found = True

学习深度自适应

  • 简单问题3-5步
  • 复杂问题5-10步
  • 高度复杂10步+,需要人工介入

阶段4学习成果总结

完成学习循环后,总结所学:

# 学习报告

## 问题陈述
"为什么这个微服务在高峰期会崩溃?"

## 学习路径
共执行8步调用5种工具读取12个文件耗时7分钟。

### 步骤摘要
1. ✅ explore service/ - 理解架构
2. ✅ read config/database.js - 发现连接池配置
3. ✅ read services/api-handler.js - 发现请求激增逻辑
4. ✅ search logs/ - 验证超时错误
5. ✅ grep -A10 "ERROR" app.log - 找到崩溃堆栈
6. ✅ analyze heap dump - 确认无内存泄漏
7. ✅ think - 推理根因
8. ✅ remember - 固化知识

## 发现的关键事实
1. **数据库连接池太小** (max: 10)
   - 来源: config/database.js:23
   - 置信度: 0.95

2. **高峰期并发50+请求**
   - 来源: logs/app.log (12:34, 15:23, 18:45)
   - 置信度: 0.90

3. **请求无降级机制**
   - 来源: services/api-handler.js:45-67
   - 置信度: 0.85

4. **下游API超时阈值5秒**
   - 来源: config/downstream.js:12
   - 置信度: 0.80

## 根因分析
**根本原因**: 数据库连接池配置不足 + 缺乏降级机制

在高峰期50+并发连接池只有10个连接导致
1. 90%请求排队等待
2. 等待超过5秒触发下游超时
3. 超时累积导致进程崩溃

证据链:
- 连接池配置低 (事实1)
- 高峰期请求数高 (事实2)
- 无队列保护 (事实3)
- 超时阈值短 (事实4)

置信度: 0.92

## 解决方案
1. **短期**: 增加连接池到100
   ```javascript
   // config/database.js:23
   maxConnections: 100  // 从10增加
  1. 中期: 添加请求队列和降级

    • 使用Bull队列限制并发
    • 实现断路器模式
  2. 长期: 水平扩展 + 读写分离

    • 部署多个服务实例
    • 主库写,从库读

置信度评估

  • 理解架构: 0.95
  • 识别根因: 0.92
  • 提出方案: 0.88
  • 综合置信度: 0.91

不确定性残留

  • [低] 数据库最大连接数限制需要问DBA
  • [极低] 硬件资源是否足够(需要监控数据)

学习的模式

  1. 模式: "连接池不足导致高峰期崩溃"

    • 应用场景: 数据库密集型服务
    • 预防措施: 负载测试 + 监控排队时长
  2. 模式: "缺乏降级机制导致级联失败"

    • 应用场景: 依赖外部服务的模块
    • 预防措施: 断路器 + 超时配置
  3. 经验: "错误日志比代码更重要"

    • 未来类似问题优先查看日志时间模式

---

### 阶段5记忆固化与迁移

#### 5.1 固化具体经验

```bash
/runtime.remember "连接池配置不足导致服务崩溃"

记忆内容:

## 连接池不足问题
**学习时间**: 2025-11-14
**置信度**: 0.92
**来源**: runtime.learn (8步探索)

**问题**: 服务高峰期崩溃

**根因**: 数据库连接池maxConnections: 10无法处理50+并发

**证据**:
- config/database.js:23
- logs/app.log (3次崩溃记录)
- 服务缺少降级机制

**解决方案**: 连接池增至100 + 添加请求队列

**长期预防**: 负载测试 + 监控排队时长 + 断路器

**已应用**: auth-service (2025-11-14)

5.2 提取通用模式

/runtime.remember "模式: 连接池不足导致高峰期崩溃"
## 模式: 连接池不足
**类型**: 性能反模式
**置信度**: 0.90

**识别特征**:
- 数据库密集型服务
- 高峰期响应变慢 → 超时 → 崩溃
- 日志显示排队等待

**诊断方式**:
1. 检查连接池配置 (config/database.*)
2. 检查高峰期并发量
3. 检查是否有排队/降级机制

**通用解决方案**:
1. 增加连接池 (通常是瓶颈的10倍)
2. 添加请求队列 (Bull/BullMQ)
3. 实现断路器 (opossum)
4. 负载测试 (Artillery/k6)

**预防措施**:
- 监控: 活跃连接数、排队时长
- 告警: 排队 > 5秒、连接使用率 > 80%
- 容量规划: 基于峰值并发 * 1.5

**应用案例**:
- auth-service (2025-11-14) - 成功解决

**相关知识**:
- 连接池设计原则 (来自记忆: design-patterns.md)
- 断路器模式 (来自记忆: design-patterns.md)

5.3 构建关联网络

建立知识间的连接:

# memory/long-term/knowledge-graph.md

cat << EOF >> "$(cat索引: 模式: 连接池不足)"

## 知识关联

**相关模式**:
- 模式: 断路器模式 (强关联)
- 模式: 降级策略 (强关联)
- 反模式: 级联失败 (强关联)
- 监控: 指标驱动告警 (中等关联)

**技术栈**:
- tools: Bull/BullMQ (工作队列)
- libraries: opossum (断路器)
- monitoring: Prometheus + Grafana

**项目经验**:
- 案例: auth-service (强关联) → cognition/reports/auth-service-incident-2025-11-14.md

**学习资源**:
- 链接: https://github.com/OptimalBits/bull (Bull文档)
- 文章: "数据库连接池最佳实践" (待固化)
EOF

阶段6反思与效能评估

## 学习效果评估

### 探索效率
- 总步骤: 8步
- 有效步骤: 7步 (87.5%)
- 无效步骤: 1步步骤4搜索日志方向错误

### 工具使用效率
- 文件读取: 5次4次有效1次冗余
- 搜索: 2次high value
- 思考: 1次critical

### 置信度变化轨迹

Step 1: 0.40 (初始) Step 2: 0.55 (+发现配置) Step 3: 0.70 (+验证假设) Step 4: 0.65 (-搜索失败) Step 5: 0.85 (+找到证据) Step 6: 0.90 (+排除其他假设) Step 7: 0.92 (整合推理)


### 学习深度匹配
- 问题复杂度: 中等
- 消耗步骤: 8步 (合适5-10步范围)
- 达到置信度: 0.92 (>目标0.90)

**评估**: ✅ 学习效果优秀

6.2 元认知反思

## 元认知反思

### 做得好的地方
1. **假设驱动**: 从3个假设开始逐步验证避免乱猜
2. **证据链**: 每个结论都有代码或日志支撑
3. **工具选择**: 从探索(宏观)到验证(微观)再到总结,逻辑清晰
4. **深度自适应**: 8步达到0.92置信度,没有过度探索

### 需要改进的地方
1. **步骤4冗余**: 搜索日志时未指定时间范围,返工一次
   - 改进: 下次搜索时先检查日志轮转机制

2. **缺少访谈**: 没有与提交该代码的同事交流
   - 改进: 下次遇到复杂问题,先访谈原作者

3. **测试覆盖**: 只读了代码,没有运行性能测试验证
   - 改进: 下次应使用k6/Artillery做负载测试

### 发现的认知盲区
1. **盲区**: k8s资源限制的影响
   - 置信度: 0.3
   - 影响: 可能影响扩容方案
   - 行动计划: 询问运维团队获取k8s配置

### 更新学习策略
- **添加到策略库**: "性能问题 → 优先检查日志时间模式"
- **添加到记忆**: "日志搜索前 → 先确认日志轮转机制"

终止条件与防止无限循环

正常终止

def should_stop(plan, confidence):
    if confidence > 0.90:
        print("✅ 达到高置信度,停止探索")
        return True

    if plan.root_cause_found:
        print("✅ 找到根因,停止探索")
        return True

    if len(plan.executed_steps) >= plan.max_steps:
        print("⚠️  达到最大步数,停止探索")
        print("   建议:需要人工介入或进一步信息")
        return True

    if plan.time_elapsed > plan.max_time:
        print("⚠️  超时,停止探索")
        return True

    return False

异常处理

try:
    result = execute_tool(action)
except Exception as e:
    plan.add_note(f"工具执行失败: {e}")
    plan.error_count += 1

    if plan.error_count >= 3:
        print("❌ 连续失败,停止探索")
        # 请求人工帮助
        ask_user_for_help(action, e)

无限循环检测

# 检测重复步骤
if current_action similar to previous_actions[-3:]:
    print("⚠️  检测到重复行为,可能陷入循环")

    # 改变策略
    if strategy == "depth_first":
        strategy = "breadth_first"
        print("   切换到广度优先策略")

    # 或请求外部输入
    print("   请求用户提供新信息或方向")
    return ask_user_clarification()

报告生成

完整学习报告模板

# 学习报告 - [问题摘要]

**学习时间**: YYYY-MM-DD HH:MM:SS
**学习模式**: 自主探索(/runtime.learn
**会话ID**: runtime.learn-[id]

## 问题陈述
[用户原始问题]

## 学习过程
- **总步数**: X步
- **消耗时间**: Y分钟
- **工具调用**: N种工具M次调用
- **读取文件**: N个文件
- **置信度变化**: 0.40 → 0.92

## 发现的事实
[bullet list每个事实有来源和置信度]

## 根因分析
[结构化分析,证据链]

## 解决方案
[可执行的方案]

## 学习成果
### 具体经验
- [记忆1]
- [记忆2]

### 通用模式
- [模式1]
- [模式2]

## 元认知反思
[优缺点、改进方向]

## 附件
- 详细日志: cognition/logs/learn-[id].json
- 思维导图: cognition/graphs/learn-[id].png

使用示例

示例1探索未知功能

/runtime.learn "理解并实现OAuth2.0的Authorization Code流程"

AI执行

Step 1: runtime.explore --find="OAuth"
  → 未找到现有实现

Step 2: internal.think "OAuth2.0的组成部分"
  → 识别Authorization Server, Resource Server, Client

Step 3: search web "OAuth2.0 Authorization Code Flow RFC"
  → 读取RFC 6749相关章节

Step 4: read docs/oauth2.md
  → 理解自定义方案

Step 5: think "与现有JWT认证的关系"
  → 识别可以并存JWT用于内部API

Step 6: plan "实现步骤"
  → 生成任务列表

Step 7: remember "OAuth2.0与JWT的区别和适用场景"
  → 固化到long-term memory

⚠️ 置信度: 0.85 (< 0.90)
建议: 参考其他项目的实现或咨询专家

示例2分析生产环境问题

/runtime.learn "为什么生产环境的数据导入任务偶尔会失败?"

AI执行

Step 1: read config/prod-import.js
  → 发现超时配置: 30秒

Step 2: search logs/prod/ "import.*fail|error|timeout"
  → 找到3次失败记录

Step 3: grep logs/prod/app.log -B10 -A10 "IMPORT_FAILED"
  → 发现错误: "Connection timeout to S3"

Step 4: read services/import.js:45-78
  → 发现单次导入下载10个文件串行执行

Step 5: think "分析超时原因"
  → 推理:网络波动 + 串行超时累积

Step 6: browse web "S3 connection timeout best practices"
  → 学习:建议使用批量下载 + 重试机制

Step 7: think "设计解决方案"
  → 方案:并行下载 + 指数退避重试 + 每文件超时15秒

Step 8: remember "批量文件导入优化模式"
  → 固化通用模式

✅ 根因找到: S3连接超时 + 串行下载累积
✅ 置信度: 0.93
✅ 解决方案: 并行下载 + 智能重试

示例3从错误中学习

/runtime.learn "我分析为什么刚才的代码修改引入了这个bug"

AI执行

Step 1: git diff → 查看修改内容
Step 2: read test → 理解测试用例
Step 3: think → 分析逻辑错误
Step 4: reflect → 识别认知偏差(过早下结论)
Step 5: remember → 固化防御机制

成果:更新心智模型,避免重复相同错误

命令定义

语法:

/runtime.learn "[问题或学习目标]"

可选参数:
--max-steps=10      # 最大探索步数
--min-confidence=0.9 # 目标置信度
--focus=[module]    # 聚焦特定模块
--strategy=[depth|breadth] # 探索策略

完整定义: .ai-runtime/commands/runtime.learn.md (843行详细文档)


与 /runtime.explore 的区别

维度 /runtime.explore /runtime.learn 区别
输入 无(扫描整个代码库) 具体问题/知识领域 learn有明确目标
范围 宏观(系统级) 微观到宏观(问题导向) learn聚焦
深度 浅到中等(建立地图) 深到很深(理解根因) learn深入
输出 知识图谱 + 探索报告 学习报告 + 新知识 成果不同
后续 通常接 /runtime.learn 通常接 /runtime.plan 工作流

典型流程:

新代码库:
→ /runtime.explore  (建立整体认知)
→ /runtime.learn    (深入理解特定模块)
→ /runtime.plan     (规划新功能)

与 /runtime.plan 的区别

维度 /runtime.learn /runtime.plan 为什么分开?
目标 理解问题 规划解决方案 认知阶段不同
输入 问题 需求 前提条件不同
核心 知识缺口识别 功能拆解与依赖分析 方法论不同
输出 学习报告 + 新知识 任务树 + 执行计划 产物不同
工作流 learn → plan plan → iterate 分工明确

工具与脚本

辅助脚本

定义文件: .ai-runtime/commands/runtime.learn.md 学习日志: cognition/logs/learn-*.json 知识索引: memory/long-term/knowledge-graph.md


宪法遵循

遵循原则:

  • ✓ 1.1 认知主体性: 我们是具有学习能力的智能体
  • ✓ 1.2 类脑思维: 模式识别 + 联想 + 预测性处理
  • ✓ 1.3 谦逊与不确定: 明确标注置信度,持续提问
  • ✓ 1.4 记忆层次: 学习成果固化到长期记忆
  • ✓ 2.1 代码即知识: 将代码结构转化为心智模型
  • ✓ 4.1 从经验学习: 每个学习循环都更新模型
  • ✓ 4.2 认知更新: 动态规划适应新知识
  • ✓ 4.3 自我反思: 元认知评估学习效果

宪法位置: .ai-runtime/constitution.md


命令路径: .ai-runtime/commands/runtime.learn.md 最后更新: 2025-11-14 11:30:00 版本: 1.0.0 (纯自主学习模式)