Files

1 line
11 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"repo": "catlog22/maestro-flow", "files": {"guide/embedding-guide.md": {"a8a7498b03f9272b741d708a17b79e3e3e1813ed": {"t": 1785674116.102987, "n": 7561, "h": "7c0623031404097b", "c": "---\ntitle: \"Embedding 模型配置指南\"\n---\n\nMaestro Search 支持基于 Embedding 的语义搜索,通过向量相似度补充 BM25 全文检索,提供更精准的搜索结果。\n\n---\n\n## 概述\n\nMaestro 的 Embedding 系统基于 `@huggingface/transformers`(ONNX 后端),默认使用 `Xenova/multilingual-e5-small` 模型(22M 参数,384 维),支持:\n\n- **智能设备检测**:自动 benchmark CPU vs GPU(DirectML),选择最快后端\n- **批量推理**:可配置 batch size(4-5x 性能提升)\n- **增量索引**:仅重新嵌入新增或变更文档\n- **优雅降级**:transformers 不可用时自动回退到纯 BM25\n\n### 模型大小\n\n| 文件 | 大小 | 说明 |\n|------|------|------|\n| `onnx/model.onnx` | ~448 MB | ONNX 推理模型(fp32) |\n| `tokenizer.json` | ~16 MB | 分词器 |\n| `config.json` | <1 KB | 模型配置 |\n| **合计** | **~465 MB** | 首次使用自动下载 |\n\n模型缓存位置:`<maestro-package>/node_modules/@huggingface/transformers/.cache/Xenova/multilingual-e5-small/`\n\n> **注意**:模型缓存在 `node_modules` 内,`npm install` 后会丢失,需要重新下载。\n\n---\n\n## 快速开始\n\n### 1. 安装依赖\n\n```bash\nnpm install @huggingface/transformers onnxruntime-node\n```\n\n### 2. 管理 Embedding(TUI 命令)\n\n```bash\n# 查看状态(模式、模型、缓存、设备、索引)\nmaestro install embedding --status\n\n# 输出示例:\n# Mode: Local (ONNX)\n# Model: Xenova/multilingual-e5-small\n# Cached: Yes\n# Device: gpu/fp16 batch=128\n# GPU: Available\n# Wiki idx: 804 docs\n# Code idx: 7720 nodes\n\n# 下载本地模型(~465 MB)\nmaestro install embedding --download\n\n# 切换到本地模式(从 API 模式切换)\nmaestro install embedding --local\n\n# 重建代码向量索引\nmaestro install embedding --rebuild\n```\n\n### 3. 预热模型\n\n首次运行会自动下载模型(~465 MB),下载过程有进度条提示。\n`maestro install` 在安装完成后也会自动预热模型。\n\n```bash\n# 手动预热\nmaestro install embedding --download\n```\n\n### 4. 手动下载模型(可选)\n\n如果自动下载失败(网络问题、代理限制),可以手动下载模型文件:\n\n```bash\n# 1. 定位缓存目录(在 maestro 安装目录下)\n# Windows: <maestro>\\node_modules\\@huggingface\\transformers\\.cache\\Xenova\\multilingual-e5-small\\\n# Linux/macOS: <maestro>/node_modules/@huggingface/transformers/.cache/Xenova/multilingual-e5-small/\n\n# 2. 创建目录(含 onnx 子目录)\nmkdir -p node_modules/@huggingface/transformers/.cache/Xenova/multilingual-e5-small/onnx\n\n# 3. 下载文件(需要代理的地区请配置 HTTPS_PROXY)\nCACHE=node_modules/@huggingface/transformers/.cache/Xenova/multilingual-e5-small\nHF=https://huggingface.co/Xenova/multilingual-e5-small/resolve/main\n\ncurl -L -o $CACHE/onnx/model.onnx $HF/onnx/model.onnx # ~448 MB\ncurl -L -o $CACHE/tokenizer.json $HF/tokenizer.json # ~16 MB\ncurl -L -o $CACHE/config.json $HF/config.json # <1 KB\ncurl -L -o $CACHE/tokenizer_config.json $HF/tokenizer_config.json # <1 KB\n\n# 4. 验证\nmaestro embedding status\n```\n\n> 也可从镜像源下载(将 `huggingface.co` 替换为 `hf-mirror.com`)。\n\n---\n\n## 外部 API 配置\n\n除本地 ONNX 模型外,Maestro 支持通过外部 API 获取 embedding 向量。配置文件 `~/.maestro/api-embedding.json` 存在时自动启用 API 模式,跳过本地模型加载。\n\n### 配置文件\n\n创建 `~/.maestro/api-embedding.json`:\n\n```json\n{\n \"baseUrl\": \"https://api.siliconflow.cn/v1\",\n \"apiKey\": \"sk-your-api-key\",\n \"model\": \"BAAI/bge-m3\",\n \"dimensions\": 1024,\n \"batchSize\": 64\n}\n```\n\n| 字段 | 必填 | 默认值 | 说明 |\n|------|------|--------|------|\n| `baseUrl` | ✅ | — | OpenAI 兼容的 API 端点(需支持 `/embeddings`) |\n| `apiKey` | ✅ | — | API 密钥 |\n| `model` | ✅ | — | 模型名称(如 `BAAI/bge-m3`、`text-embedding-3-small`) |\n| `dimensions` | ❌ | — | 向量维度(部分 API 支持指定输出维度) |\n| `batchSize` | ❌ | `100` | 每次 API 请求的最大文本数 |\n\n### 兼容的 API 服务\n\n任何支持 OpenAI `/v1/embeddings` 接口格式的服务均可使用:\n\n| 服务 | baseUrl | 推荐模型 |\n|------|---------|----------|\n| OpenAI | `https://api.openai.com/v1` | `text-embedding-3-small` |\n| SiliconFlow | `https://api.siliconflow.cn/v1` | `BAAI/bge-m3` |\n| 阿里云百炼 | `https://dashscope.aliyuncs.com/compatible-mode/v1` | `text-embedding-v3` |\n| 本地 Ollama | `http://localhost:11434/v1` | `nomic-embed-text` |\n\n### 验证配置\n\n```bash\n# 检查 API 模式状态\nmaestro embedding status\n\n# API 模式输出示例:\n# Mode: API (external)\n# Endpoint: https://api.siliconflow.cn/v1\n# Model: BAAI/bge-m3\n# Dimensions: 1024\n# Batch size: 64\n# Active model: BAAI/bge-m3\n\n# 测试 API 连通性\nmaestro embedding warmup\n\n# 输出:\n# Warming up API embedding (BAAI/bge-m3)...\n# API embedding ready (234ms)\n```\n\n### 切换模式\n\n| 操作 | 命令 / 方法 |\n|------|------|\n| 切换到本地模式 | `maestro install embedding --local` |\n| 切换到 API 模式 | 创建 `~/.maestro/api-embedding.json` |\n| 切换模型 | 修改配置文件中的 `model` 字段 |\n| 重建索引 | `maestro install embedding --rebuild` |\n\n> **注意**:切换模型后首次搜索会触发全量索引重建(模型不同,向量不兼容),后续搜索使用增量更新。\n\n### 代理配置\n\nAPI 模式自动读取代理设置,优先级:\n\n1. 环境变量 `HTTPS_PROXY` / `HTTP_PROXY` / `ALL_PROXY`\n2. `~/.maestro/cli-tools.json` 中的 `proxy` 配置\n\n### 容错机制\n\n- **自动重试**:429/5xx 错误自动重试 2 次(指数退避 1s→2s→4s)\n- **并行请求**:多批次并发上限 4,加速大量文档的索引构建\n- **降级回退**:API 不可达时自动使用上一次成功构建的索引(而非完全禁用 embedding)\n- **原子写入**:索引文件使用 temp+rename 防止写入中断导致损坏\n\n---\n\n## 本地模型配置\n\n### 设备配置\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `device` | `cpu` \\| `gpu` | 自动检测 | GPU 可用时自动使用 DML/CUDA |\n| `dtype` | `fp32` \\| `fp16` \\| `q8` \\| `q4` | `fp16`(GPU)/ `fp32`(CPU) | 模型精度 |\n| `batchSize` | number | `128`(GPU)/ `32`(CPU) | 批量推理大小 |\n\n**设备选择策略**:\n\n系统自动检测 GPU(DirectML/CUDA),可用时默认使用 GPU + fp16 以获得最佳吞吐量。可通过环境变量 `MAESTRO_EMBEDDING_DEVICE=cpu` 强制使用 CPU。\n\n### 模型配置\n\n| 常量 | 值 | 说明 |\n|------|-----|------|\n| `DEFAULT_MODEL` | `Xenova/multilingual-e5-small` | 默认多语言模型 |\n| `dimension` | `384` | 向量维度 |\n| `maxTokens` | `512` | 最大 token 长度 |\n\n### RRF 融合参数\n\nMaestro 使用 RRF(Reciprocal Rank Fusion)融合 BM25 和向量搜索结果:\n\n| 参数 | 默认值 | 说明 |\n|------|--------|------|\n| `k` | `60` | RRF 常数(控制排名衰减速度) |\n| `bm25Weight` | `0.6` | BM25 权重 |\n| `vectorWeight` | `0.4` | 向量搜索权重 |\n| `alpha` | `0.4` | 混合融合中 RRF 的权重 |\n\n---\n\n## 使用方式\n\n### 基本搜索\n\n```bash\n# 自动使用 embedding(如果可用)\nmaestro search \"authentication patterns\"\n\n# 显式跳过 embedding(仅 BM25)\nmaestro search \"jwt token\" --no-emb\n```\n\n### Embedding 管理\n\n```bash\n# 查看状态\nmaestro install embedding --status\n\n# 下载/预热模型\nmaestro install embedding --download\n\n# 重建代码向量索引\nmaestro install embedding --rebuild\n\n# 切换本地模式\nmaestro install embedding --local\n```\n\n---\n\n## 索引结构\n\n### 二进制格式\n\nEmbedding 索引使用高效的二进制格式存储(`embedding-index.bin`):\n\n```\n[metaLen:4][metaJSON][docIdsLen:4][docIdsJSON][vectors:n*dim*4]\n```\n\n- **meta**:模型 ID、维度、构建时间、设备信息\n- **docIds**:文档 ID 数组\n- **vectors**:Float32 向量数组\n\n### 增量更新\n\n索引支持增量更新,仅重新嵌入内容变更的文档:\n\n1. 计算文档内容 MD5 哈希\n2. 对比现有索引的哈希值\n3. 仅对变更文档重新生成向量\n4. 保留未变更文档的向量\n\n---\n\n## 性能优化\n\n### 冷启动优化\n\n| 场景 | 耗时 | 说明 |\n|------|------|------|\n| 首次加载(无 daemon) | ~1800ms | ONNX 模型加载 |\n| daemon 热路径 | ~280ms | 模型已缓存 |\n| BM25-only 降级 | ~280ms | 跳过 embedding |\n\n### Search Daemon\n\nSearch daemon 保持 embedding 模型热缓存:\n\n```bash\n# 启动 daemon\nmaestro search-daemon start\n\n# 查看状态\nmaestro search-daemon status\n```\n\ndaemon 空闲 30 分钟后自动关闭。\n\n### 自动降级策略\n\n当 daemon 不可用时:\n1. 自动降级为 BM25-only 模式\n2. 后台自动启动 daemon\n3. 后续搜索获得 embedding 加速\n\n---\n\n## 环境变量\n\n| 变量 | 说明 |\n|------|------|\n| `HTTPS_PROXY` | HTTPS 代理(用于模型下载) |\n| `HTTP_PROXY` | HTTP 代理 |\n| `ALL_PROXY` | 通用代理 |\n\n---\n\n## 故障排除\n\n### 模型不可用\n\n```bash\n# 检查状态\nmaestro embedding status\n\n# 常见原因:\n# 1. @huggingface/transformers 未安装\n# 2. onnxruntime-node 未安装\n# 3. 网络问题(无法下载模型)\n```\n\n### 索引损坏\n\n```bash\n# 重建索引\nmaestro embedding rebuild\n```\n\n### 性能问题\n\n```bash\n# 查看设备信息\nmaestro embedding status\n\n# 如果 GPU 可用但未使用,检查 onnxruntime-node 版本\nnpm list onnxruntime-node\n```\n\n---\n\n## 相关命令\n\n```bash\n# 搜索命令\nmaestro search <query> [--no-emb] [--json]\n\n# Embedding 管理\nmaestro embedding status\nmaestro embedding warmup\nmaestro embedding rebuild\n\n# Search Daemon\nmaestro search-daemon start\nmaestro search-daemon stop\nmaestro search-daemon status\n```\n\n---\n\n## 技术细节\n\n### E5 模型前缀\n\n本地 E5 模型要求特定前缀:\n- 查询:`query: <text>`\n- 文档:`passage: <text>`\n\n本地模式下系统自动添加此前缀。API 模式下不添加前缀,由 API 服务端处理。\n\n### 余弦相似度\n\n向量搜索使用余弦相似度:\n\n```typescript\ncosineSimilarity(a, b) = dot(a, b) / (norm(a) * norm(b))\n```\n\n对于 <10K 文档,使用暴力搜索(flat search)即可满足性能需求。\n\n### 混合融合算法\n\n最终分数计算:\n\n```\nfinalScore = alpha * rrfNorm + (1 - alpha) * bm25Norm\n```\n\n- `rrfNorm`:RRF 分数归一化\n- `bm25Norm`:BM25 分数归一化\n- `alpha`:控制 RRF 和 BM25 的相对权重\n"}}}}