每日备份 2026-06-10 12:57:13

This commit is contained in:
root-backup committed 2026-06-10 12:57:14 +08:00
1 parent fda2ccb8c2
commit 3d2e638c6a
244 files changed
+58890 -3

No files matched your search

+385
View File
@@ -0,0 +1,385 @@
#!/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 "$@"