Files
my-project/config/openclaw/scripts/hybrid-learning.sh
T

386 lines
14 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 "<think>|</think>|主题|生成|发展|趋势" | 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 "$@"