#!/bin/bash # ============================================================================ # 自动学习循环 - 持续改进系统 # ============================================================================ # 流程:学习 → 改进总结 → 验证 → 再次学习 # ============================================================================ MINIMAX_API="https://api.minimaxi.com/v1/chat/completions" MINIMAX_KEY="sk-cp-bJSl7-48u8Y07PXD_x8Wp21JiBgYul7iEO6ZWNK4FBAA4DWzj-U-K8-mN-Flak-O8cOtRegt5FYviSRfBw_noa14z0FkFYzczCPUa41opZsg5AGZ4s4uqL8" ROBOT_NAME="${ROBOT_NAME:-守护者}" ROBOT_TYPE="${ROBOT_TYPE:-guardian}" LEARNING_DIR="/root/.openclaw/workspace/sleep-learning" LOG_DIR="/var/log/openclaw/sleep-learning/${ROBOT_NAME}" TEMP_DIR="/tmp/ai-learning-${ROBOT_TYPE}" TIMESTAMP=$(date '+%Y%m%d-%H%M%S') mkdir -p "$LEARNING_DIR" "$LOG_DIR" "$TEMP_DIR" # 调用 MiniMax call_minimax() { local system="$1" local user="$2" # 保存到临时文件 echo "$user" > "${TEMP_DIR}/prompt.txt" python3 << PYEOF import json, urllib.request, sys with open("${TEMP_DIR}/prompt.txt", "r") as f: user_content = f.read() data = json.dumps({ "model": "minimax-m2.1", "messages": [ {"role": "system", "content": "$system"}, {"role": "user", "content": user_content} ], "max_tokens": 1500, "temperature": 0.7 }).encode() req = urllib.request.Request("${MINIMAX_API}", data=data, headers={"Content-Type": "application/json", "Authorization": "Bearer ${MINIMAX_KEY}"}) try: with urllib.request.urlopen(req) as r: resp = json.loads(r.read().decode()) content = resp["choices"][0]["message"]["content"] print(content.replace("\n", " ")) except Exception as e: print(f"Error: {e}", file=sys.stderr) PYEOF } log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "${LOG_DIR}/auto-learning.log" } # ============================================================================ # 阶段1: 学习 # ============================================================================ do_learn() { local cycle=$1 local topic=$(get_topic $cycle) log "📖 === 学习阶段 (周期 $cycle) ===" local content=$(call_minimax "你是${ROBOT_NAME}。" \ "请深度学习【$topic】,产出一份具体的学习笔记:1.核心知识点(3-5条)2.实践方法(2-3条)3.如何应用(2条)。简洁输出,每点不超过30字。") echo "$content" > "${LEARNING_DIR}/learn-${ROBOT_TYPE}-cycle${cycle}-${TIMESTAMP}.md" log "✅ 学习完成" } # ============================================================================ # 阶段2: 改进总结 # ============================================================================ do_improve() { local cycle=$1 log "💭 === 改进总结阶段 ===" local content=$(call_minimax "你是${ROBOT_NAME}。" \ "根据刚才的学习内容,请深度反思:1.核心收获是什么?2.有什么不足/疑问?3.下次如何改进?4.需要深入学习的点?简洁输出。") echo "$content" > "${LEARNING_DIR}/improve-${ROBOT_TYPE}-cycle${cycle}-${TIMESTAMP}.md" log "✅ 改进总结完成" } # ============================================================================ # 阶段3: 验证 # ============================================================================ do_verify() { local cycle=$1 local task=$(get_task $cycle) log "🔍 === 验证阶段 ===" local result=$(call_minimax "你是${ROBOT_NAME}。" \ "请完成这个任务来验证学习效果:$task。要求:用30字以内回答,直接输出答案。") echo "$result" > "${LEARNING_DIR}/verify-${ROBOT_TYPE}-cycle${cycle}-${TIMESTAMP}.md" log "✅ 验证完成: $result" } # ============================================================================ # 辅助函数 # ============================================================================ get_topic() { local topics=( "系统架构 - OpenClaw配置、向量数据库、分布式系统" "故障排查 - 日志分析、性能优化、安全审计" "AI Agent - SOUL.md、记忆系统、工具调用" "知识管理 - 技术文档、经验总结、持续学习" ) echo "${topics[$(( ($1 - 1) % 4 ))]}" } get_task() { local tasks=( "用一句话解释什么是向量数据库" "列出3个常见的性能问题及解决方案" "解释SOUL.md的作用" "如何写好技术文档?" ) echo "${tasks[$(( ($1 - 1) % 4 ))]}" } # ============================================================================ # 主循环 # ============================================================================ main() { local max_cycles=${1:-3} echo "╔════════════════════════════════════════════════════╗" echo "║ 🔄 ${ROBOT_NAME} 自动学习循环 ║" echo "║ 流程:学习 → 改进总结 → 验证 → 再次学习 ║" echo "╚════════════════════════════════════════════════════╝" echo "" log "========================================" log "开始自动学习循环 (最多 $max_cycles 轮)" log "========================================" local cycle=1 while [ $cycle -le $max_cycles ]; do echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "🔄 周期 $cycle / $max_cycles" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" do_learn $cycle sleep 2 do_improve $cycle sleep 2 do_verify $cycle cycle=$((cycle + 1)) [ $cycle -le $max_cycles ] && sleep 3 done echo "" echo "╔════════════════════════════════════════════════════╗" echo "║ ✅ 自动学习循环完成! ║" echo "╚════════════════════════════════════════════════════╝" echo "" echo "📊 成果位置: ${LEARNING_DIR}/" } main "$@"