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

176 lines
6.6 KiB
Bash
Executable File

#!/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 "$@"