Files
my-project/config/openclaw/scripts/learn-core.sh
T

174 lines
5.3 KiB
Bash
Executable File

#!/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
}