#!/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 完成 ✓"