Ctrl K
ComunidadGuías…

scripts/butler-memory-phase-a.sh

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
#!/usr/bin/env bash
# 记忆系统阶段 A:语义记忆开关 + fastembed + reindex + MB 基准 + doctor 嵌入检查。
# 用法: bash scripts/butler-memory-phase-a.sh
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
cd "$ROOT"
export PYTHONPATH=.

if [[ -f "$ROOT/.env" ]]; then
  set -a
  # shellcheck disable=SC1091
  source "$ROOT/.env" 2>/dev/null || true
  set +a
fi

fail=0

echo "=== 阶段 A:配置检查 ==="
sem="${BUTLER_SEMANTIC_MEMORY:-0}"
emb="${BUTLER_EMBEDDING_PROVIDER:-local}"
if [[ "$sem" != "1" && "$sem" != "true" && "$sem" != "yes" && "$sem" != "on" ]]; then
  echo "FAIL: BUTLER_SEMANTIC_MEMORY 未开启(建议 .env 设 BUTLER_SEMANTIC_MEMORY=1)"
  fail=1
else
  echo "OK: BUTLER_SEMANTIC_MEMORY=$sem"
fi
if [[ "$emb" == "local" ]]; then
  echo "WARN: BUTLER_EMBEDDING_PROVIDER=local(hashing);建议 fastembed"
elif [[ -z "$emb" ]]; then
  echo "WARN: BUTLER_EMBEDDING_PROVIDER 未设(将回退 local/hashing)"
else
  echo "OK: BUTLER_EMBEDDING_PROVIDER=$emb"
fi

echo ""
echo "=== 阶段 A:语义索引重建 ==="
python3 -m butler.main memory-reindex --tenant "${BUTLER_TENANT_ID:-default}"

echo ""
echo "=== 阶段 A:MB1–MB7 隔离基准(临时目录,不写 ~/.butler)==="
python3 - <<'PY'
import json
import sys

from butler.memory.memory_benchmark import run_benchmarks

# 勿传 get_butler_home():MB2/MB3/MB5 会向 experience.db 写入 bench/* 测试行。
report = run_benchmarks()
summary = report.summary()
print(json.dumps(summary, indent=2, ensure_ascii=False))
if summary.get("failed", 0):
    sys.exit(1)
PY

echo ""
echo "=== 阶段 A:doctor 嵌入/语义行 ==="
python3 -m butler.main doctor 2>&1 | grep -E "SEMANTIC|EMBEDDING|Embedding|fastembed|semantic|Recall@3|G2-06" || true

echo ""
echo "=== 阶段 A:pytest 守门(隔离 tmp)==="
pytest tests/test_memory_metrics_benchmark.py -q

if [[ "$fail" -ne 0 ]]; then
  echo ""
  echo "阶段 A 未通过:请先修正 .env(见 .env.example 记忆段)"
  exit 1
fi
echo ""
echo "阶段 A 完成 ✓"