#!/bin/bash # ============================================================================ # 标准学习模块 - v2.0 # ============================================================================ # 用途:青龙的标准化学习流程 # 特点:模块化、可复用、易维护、自动保存知识库 # ============================================================================ # -------------------- 配置 -------------------- LEARNING_DIR="${LEARNING_DIR:-/root/.openclaw/workspace/sleep-learning}" KNOWLEDGE_DIR="${KNOWLEDGE_DIR:-/root/.openclaw/memory/04-knowledge}" TIMESTAMP=$(date '+%Y%m%d-%H%M%S') mkdir -p "$LEARNING_DIR" "$KNOWLEDGE_DIR" # -------------------- 工具函数 -------------------- log_learn() { echo "[$(date '+%H:%M:%S')] [学习] $1"; } log_verify() { echo "[$(date '+%H:%M:%S')] [验证] $1"; } log_think() { echo "[$(date '+%H:%M:%S')] [反思] $1"; } log_kb() { echo "[$(date '+%H:%M:%S')] [知识库] $1"; } # -------------------- 核心学习 -------------------- learn_topic() { local topic="$1" local type="${2:-auto}" log_learn "开始学习: $topic (类型: $type)" # Step 1: 获取信息 local content content=$(fetch_info "$topic" "$type") if [ -z "$content" ]; then log_learn "❌ 获取信息失败" return 1 fi log_learn "✅ 获取信息成功" # Step 2: 多源验证 local verify_result verify_result=$(verify_sources "$topic") # Step 3: 反思生成 local reflection reflection=$(generate_reflection "$topic" "$content") # Step 4: 保存到临时目录 save_temp "$topic" "$content" "$verify_result" "$reflection" # Step 5: 保存到知识库(后台执行,避免超时) save_to_knowledge_base "$topic" "$content" & log_learn "✅ 学习完成" } # -------------------- 信息获取 -------------------- fetch_info() { local topic="$1" case "$2" in "deep") cd /root/.openclaw/scripts && python3 multi_verify.py "$topic" 2>/dev/null ;; *) cd /root/.openclaw/scripts && python3 auto-learning.py "$topic" 2>/dev/null ;; esac } # -------------------- 多源验证 -------------------- verify_sources() { local topic="$1" log_verify "执行多源验证: $topic" cd /root/.openclaw/scripts && timeout 15 python3 -c " import sys; sys.path.insert(0, '.') from multi_verify import multi_source_verify print(multi_source_verify('$topic')) " 2>/dev/null } # -------------------- 反思生成 -------------------- generate_reflection() { local topic="$1" local content="$2" log_think "生成反思: $topic" # 使用可复用 API 模块生成反思 local reflection reflection=$(timeout 15 python3 /root/.openclaw/scripts/ocw_api.py chat "你是AI学习助手。请对以下内容进行反思,输出3条反思(每条不超过30字):主题: $topic; 内容: ${content:0:500}" 2>/dev/null) if [ -z "$reflection" ] || echo "$reflection" | grep -qi "失败\|错误"; then reflection="1. 完成基础学习任务;2. 需深化理解;3. 持续跟进实践" fi echo "$reflection" } # -------------------- 临时保存 -------------------- save_temp() { local topic="$1" local content="$2" local verify_result="$3" local reflection="$4" local safe_topic=$(echo "$topic" | tr ' ' '-' | tr -d ':/.') local file="${LEARNING_DIR}/learn-${safe_topic}-${TIMESTAMP}.md" cat > "$file" << EOF # 学习: ${topic} # 时间: $(date '+%Y-%m-%d %H:%M:%S') ## 学习内容 ${content} ## 多源验证 ${verify_result} ## 反思 ${reflection} EOF log_learn "📁 保存到临时: $file" } # -------------------- 知识库保存 -------------------- save_to_knowledge_base() { local topic="$1" local content="$2" log_kb "提取知识点并保存到知识库: $topic" # 使用可复用 API 模块提取知识点 local key_points key_points=$(python3 /root/.openclaw/scripts/ocw_api.py extract "$content" "$topic" 2>&1) # 提取成功(不包含错误标识) if echo "$key_points" | grep -qE '^\[限流\]|\[超时\]|\[连接失败\]|\[认证失败\]|\[请求错误\]|\[HTTP [0-9]+\]|\[错误\]|\[网络错误\]|^失败:'; then log_kb "⚠️ 知识点提取失败: $key_points" return 1 fi # 生成文件名 local safe_topic=$(echo "$topic" | tr ' ' '-' | tr -d ':/.()' | head -c 50) local kb_file="${KNOWLEDGE_DIR}/${safe_topic}-learned.md" cat > "$kb_file" << EOF # ${topic} # 保存时间: $(date '+%Y-%m-%d %H:%M:%S') # 来源: 混合学习自动保存 ## 核心知识点 ${key_points} --- *自动生成 by learn-core.sh v3.0* EOF log_kb "✅ 已保存: $kb_file" # 新知识自动建立索引 log_kb "更新知识索引..." python3 /root/.openclaw/scripts/knowledge-index.py generate > /dev/null 2>&1 & } # -------------------- 知识库统计 -------------------- kb_stats() { echo "========================================" echo "知识库统计" echo "========================================" echo "知识库目录: $KNOWLEDGE_DIR" echo "文件数量: $(ls -1 "$KNOWLEDGE_DIR"/*.md 2>/dev/null | wc -l)" echo "" echo "最新文件:" ls -t "$KNOWLEDGE_DIR"/*.md 2>/dev/null | head -5 | while read f; do echo " - $(basename "$f")" done }