#!/bin/bash # ============================================================================ # 混合学习控制器 - 智能主题选择版 v4.0 # ============================================================================ # 功能:调用标准学习模块learn-core.sh完成学习任务 # 特点:模块化、易维护、流程统一、智能主题选择 # ============================================================================ # 配置 LEARNING_DIR="/root/.openclaw/workspace/sleep-learning" LEARNING_LOG="${LEARNING_DIR}/learning.log" PROBLEM_LOG="/var/log/openclaw/problems.log" KNOWLEDGE_GRAPH="/root/.openclaw/workspace/知识图谱.md" TOPIC_STATE="/root/.openclaw/.hybrid-learning-topic-state" LOG_RETENTION_DAYS=15 DEEP_THINKING_ROUNDS=3 mkdir -p "$(dirname "$PROBLEM_LOG")" "$LEARNING_DIR" # -------------------- 加载标准学习模块 -------------------- source /root/.openclaw/scripts/learn-core.sh # ============================================================================ # 日志功能 # ============================================================================ log_start() { local task="$1" local robot="$2" echo "========================================" >> "$LEARNING_LOG" echo "[开始] $(date '+%Y-%m-%d %H:%M:%S') | $robot | $task" >> "$LEARNING_LOG" echo "[开始] $task" } log_progress() { local message="$1" echo "[进度] $(date '+%H:%M:%S') | $message" >> "$LEARNING_LOG" echo " → $message" } log_deep() { local round="$1" local message="$2" echo "[深度-$round] $(date '+%H:%M:%S') | $message" >> "$LEARNING_LOG" echo " 🔹 第${round}轮深度思考: $message" } log_end() { local status="$1" local duration="$2" echo "[结束] $(date '+%Y-%m-%d %H:%M:%S') | 状态: $status | 耗时: ${duration}秒" >> "$LEARNING_LOG" echo "[结束] 完成 (${duration}秒)" } log_topic() { echo "[主题] $1" >&2 # 全部输出到stderr } # ============================================================================ # 清理旧日志 # ============================================================================ clean_old_logs() { local count=$(find "$LEARNING_DIR" -name "*.log" -mtime +$LOG_RETENTION_DAYS 2>/dev/null | wc -l) if [ "$count" -gt 0 ]; then find "$LEARNING_DIR" -name "*.log" -mtime +$LOG_RETENTION_DAYS -delete log_progress "已删除 ${count} 个过期日志文件" fi } # ============================================================================ # 7大品类定义 + Fallback主题 # ============================================================================ declare -A FALLBACK_TOPICS FALLBACK_TOPICS["写作助手"]="Prompt工程、多模态提示词、AI辅助写作技巧" FALLBACK_TOPICS["贵金属交易"]="黄金价格影响因素、白银投资策略、铂金市场分析" FALLBACK_TOPICS["期货交易"]="期货合约交割、套期保值策略、商品期货波动" FALLBACK_TOPICS["合约交易"]="永续合约机制、资金费率计算、杠杆风险管理" FALLBACK_TOPICS["虚拟货币"]="区块链技术原理、DeFi协议、NFT应用场景" FALLBACK_TOPICS["网络自动化"]="Selenium自动化、API接口对接、数据抓取技巧" FALLBACK_TOPICS["AI能力提升"]="大模型微调、RAG检索增强、AI Agent设计" # ============================================================================ # 获取当前品类索引(轮询) # ============================================================================ get_category_index() { local current=0 if [ -f "$TOPIC_STATE" ]; then current=$(cat "$TOPIC_STATE") fi local next=$(( (current + 1) % 7 )) echo "$next" > "$TOPIC_STATE" echo "$next" } # ============================================================================ # 获取品类名称 # ============================================================================ get_category_name() { local index=$1 local categories=( "写作助手" "贵金属交易" "期货交易" "合约交易" "虚拟货币" "网络自动化" "AI能力提升" ) echo "${categories[$index]}" } # ============================================================================ # AI动态生成主题 # ============================================================================ generate_topic_with_ai() { local category="$1" log_topic "AI生成主题中: $category" >&2 # 输出到stderr,不干扰stdout # 调用AI生成具体学习主题 local ai_result ai_result=$(python3 /root/.openclaw/scripts/ocw_api.py chat "作为AI学习助手,请为${category}生成一个具体的、有价值的学习主题。长度不超过15字。直接输出主题。" 2>/dev/null) # 清理输出 echo "$ai_result" | tr -d '[]【】' } # ============================================================================ # 选择学习主题(AI生成 + Fallback) # ============================================================================ select_topic() { local category="$1" local topic="" local source="AI" # 尝试AI生成 local ai_topic ai_topic=$(generate_topic_with_ai "$category" 2>/dev/null) # 清理AI结果 ai_topic=$(echo "$ai_topic" | grep -vE "\[主题\]|品类|生成" | head -1) # 验证AI结果 if [ -n "$ai_topic" ] && [ ${#ai_topic} -lt 30 ] && [ ${#ai_topic} -gt 2 ]; then topic="$ai_topic" else # Fallback到预设主题 local fallback="${FALLBACK_TOPICS[$category]}" local fallback_topic=$(echo "$fallback" | cut -d',' -f1 | tr -d ' ') topic="$fallback_topic" source="Fallback" fi # 输出主题和来源 echo "${source}|${topic}" } # ============================================================================ # 获取主题(带日志) # ============================================================================ get_topic_with_log() { local category="$1" local result result=$(select_topic "$category") local source=$(echo "$result" | cut -d'|' -f1) local topic=$(echo "$result" | cut -d'|' -f2) echo "[主题] ${source}: $topic" >&2 echo "$topic" } # ============================================================================ # AI根据发展方向生成学习主题 # ============================================================================ # 发展方向主题池(API不可用时的备选) DIRECTION_TOPICS=( "AI Agent设计模式" "大模型RAG检索增强" "Prompt工程最佳实践" "多模态AI应用开发" "AI Agent工作流自动化" "大模型微调技术" "AI Agent记忆机制" "Function Calling实战" ) # ============================================================================ # AI根据发展方向生成学习主题 # ============================================================================ generate_topic_by_direction() { local robot="$1" log_progress "根据发展方向生成学习主题..." # 尝试调用API,失败则使用主题池 local topic="" # 调用AI根据发展方向生成学习主题 local ai_result ai_result=$(python3 /root/.openclaw/scripts/ocw_api.py chat "作为${robot}的AI学习助手,请根据当前技术发展趋势生成一个有价值的学习主题。长度不超过20字。直接输出主题。" 2>/dev/null) # 清理输出 topic=$(echo "$ai_result" | tr -d '[]【】' | grep -vE "||主题|生成|发展|趋势" | head -1) # 验证结果 if [ -z "$topic" ] || [ ${#topic} -lt 2 ]; then # 使用主题池轮询 local index=0 if [ -f "$TOPIC_STATE" ]; then index=$(cat "$TOPIC_STATE") fi topic="${DIRECTION_TOPICS[$((index % ${#DIRECTION_TOPICS[@]}))]}" echo $((index + 1)) > "$TOPIC_STATE" fi echo "[主题] AI发展: $topic" >&2 echo "$topic" } # ============================================================================ # 模式A:自动学习(调用learn-core) # ============================================================================ mode_a_deep_learning() { local robot="$1" local cycle=$2 local use_direction="${3:-false}" log_progress "模式A:自动学习" local topic if [ "$use_direction" = "true" ]; then # 根据发展方向生成主题(不输出调试信息) topic=$(generate_topic_by_direction "$robot" 2>/dev/null) else # 选择品类(轮询) local category_index category_index=$(get_category_index) local category category=$(get_category_name "$category_index") log_topic "品类: $category" # 选择具体主题 topic=$(get_topic_with_log "$category") fi # 调用学习模块 learn_topic "$topic" "auto" log_progress "自动学习完成" } # ============================================================================ # 模式B:问题驱动学习(调用learn-core) # ============================================================================ mode_b_deep_learning() { local robot="$1" local problem="$2" log_progress "模式B:问题驱动学习" # 使用learn-core进行问题分析 log_progress "问题: $problem" # 调用AI分析问题 python3 /root/.openclaw/scripts/ocw_api.py chat "作为${robot},请深度分析以下问题:${problem}。请从以下维度分析(每点不超过30字):1. 问题本质 2. 根本原因 3. 解决思路。直接输出分析结果。" 2>/dev/null log_progress "问题分析完成" } # ============================================================================ # 问题检测 # ============================================================================ detect_problems() { log_progress "检测最近问题" if [ -f "/root/.openclaw/scripts/monitor-error.log" ]; then local recent_errors=$(tail -10 "/root/.openclaw/scripts/monitor-error.log" 2>/dev/null) if [ -n "$recent_errors" ]; then log_progress "发现系统错误" fi fi echo "[$(date '+%Y-%m-%d %H:%M:%S')] 问题检测完成" >> "$PROBLEM_LOG" } # ============================================================================ # 整合到知识体系 # ============================================================================ integrate_knowledge() { local robot="$1" local type="$2" log_progress "整合到知识体系" if [ -f "$KNOWLEDGE_GRAPH" ]; then echo "- [$(date '+%Y-%m-%d %H:%M:%S')] ${robot} 完成${type}学习" >> "${LEARNING_DIR}/knowledge-updates.log" fi log_progress "知识整合完成" } # ============================================================================ # 主程序 # ============================================================================ main() { local mode="${1:-hybrid}" local robot="${2:-青龙}" local problem="${3:-}" local use_direction="${4:-false}" # 是否按发展方向生成 local start_time=$(date +%s) echo "╔════════════════════════════════════════════════════╗" echo "║ 混合学习控制器 v4.1 (发展方向版) ║" echo "╚════════════════════════════════════════════════════╝" echo "" echo "机器人:$robot" echo "模式:$mode" echo "学习模块:learn-core.sh" if [ "$use_direction" = "true" ]; then echo "主题选择:AI根据发展方向生成" else echo "主题选择:7大品类轮询 + AI生成" fi echo "" clean_old_logs case "$mode" in hybrid) log_start "混合学习" "$robot" detect_problems if [ -n "$problem" ]; then mode_b_deep_learning "$robot" "$problem" fi mode_a_deep_learning "$robot" 1 "$use_direction" integrate_knowledge "$robot" "hybrid" ;; auto) log_start "自动学习" "$robot" mode_a_deep_learning "$robot" 1 "$use_direction" integrate_knowledge "$robot" "auto" ;; problem) if [ -z "$problem" ]; then echo "❌ 模式B需要提供问题参数" exit 1 fi log_start "问题驱动学习" "$robot" mode_b_deep_learning "$robot" "$problem" integrate_knowledge "$robot" "problem" ;; direction) # 纯发展方向模式 log_start "发展方向学习" "$robot" topic=$(generate_topic_by_direction "$robot") learn_topic "$topic" "auto" integrate_knowledge "$robot" "direction" ;; *) echo "用法:$0 {hybrid|auto|problem|direction} [机器人] [问题] [direction]" echo "" echo "示例:" echo " $0 hybrid 2号机 # 混合学习(品类轮询)" echo " $0 auto 2号机 # 自动学习(品类轮询)" echo " $0 direction 2号机 # 按发展方向生成学习主题" echo " $0 hybrid 2号机 '' true # 混合学习+发展方向模式" echo " $0 problem 2号机 '问题X' # 问题驱动学习" ;; esac local end_time=$(date +%s) local duration=$((end_time - start_time)) log_end "ok" "$duration" echo "" echo "📊 日志: $LEARNING_LOG" } # 执行主程序 main "$@"