proofdb/scriptdoc/reembed_chunks.md
2026-05-11 15:23:34 +08:00

114 lines
3.1 KiB
Markdown
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.

# Chunk 重新 Embedding 脚本
## 脚本路径
```text
scripts/reembed_chunks.php
```
## 脚本作用
根据 PostgreSQL 中已有的 `chunks.text`,重新生成 embedding并把结果写回 `chunks.embedding_*` 字段。
脚本会做这些事:
1. 判断当前是“断点续跑”还是“全量重建”。
2. 把需要恢复的 chunk 状态置回 `pending`
3. 逐个 archive 拉取待处理 chunk并按 embedding request batch 调用现有 handler。
4. 输出基于 chunk 数的进度条、batch 明细和最终统计结果。
## 断点续跑语义
默认模式下,脚本会尽量**保留已经完成的 `embedded` 进度**
- 只把 `queued / processing / failed_retryable` 的 chunk 重新置回 `pending`
- 已经是 `embedded` 的 chunk 不会重复生成
- `failed_terminal` 也不会自动重试
这意味着如果中途断电、断网、进程被杀:
- 已经成功写回 embedding 的 chunk 进度不会丢
- 未完成的那部分在下次重跑脚本时会继续
如果你明确想从头开始全部重新 embedding可以手动加 `--reset`
## 运行前提
- PostgreSQL 可连接。
- BigModel / Zhipu embedding API 配置可用。
- 项目依赖已安装完成。
- 从项目根目录执行命令。
## 运行命令
默认断点续跑:
```bash
php scripts/reembed_chunks.php
```
强制从头全量重新 embedding
```bash
php scripts/reembed_chunks.php --reset
```
只处理一个 archive
```bash
php scripts/reembed_chunks.php --archive_uid=01KQHVREB6XPYF604RVZAP9NNY
```
## 成功输出示例
```text
Progress granularity: embedding request batches (up to 32 chunks each)
Re-embedding [================================] 100.0% (14/14)
Batch #1 archive=01KQHVREB6XPYF604RVZAP9NNY chunks=14 progress=14/14
Chunk re-embedding completed.
Archive filter: (all chunks)
Mode: resume
Eligible chunks: 14
Embedding batch size: 32
Reset chunks: 2
Processed archives: 1
Processed batches: 1
Embedded chunk rows now marked embedded: 14
Terminal failures: 0
Archives: 01KQHVREB6XPYF604RVZAP9NNY
Next step: refresh OpenSearch vectors with `php scripts/reindex_opensearch.php`
```
## 关于进度条为什么可能“0 到 100”
这个脚本的进度条是按 **chunk 数** 计算的,但刷新粒度是 **一次 embedding request batch 完成后**
所以如果:
- 当前只有一个 archive 需要处理
- 且该 archive 的待处理 chunk 数小于等于 `LLM_EMBEDDING_BATCH_SIZE`
那么整个 archive 会在 1 次请求里完成,终端看起来就会像是从 `0` 直接跳到 `100`。这不是进度丢失,而是因为这次实际只跑了 `1` 个 batch。
## reset 行为
`--reset` 后,会把目标范围内的 chunk
- `embedding_status` 重置为 `pending`
- 清空 `embedding_ref`
- 清空 `embedding_model`
- 清空 `embedding_error`
- 同时把 `search_index_status` 置回 `pending`
所以 `--reset` 的语义是:**把 embedding 和后续索引链路都当成需要重建**。
## 重要限制
这个脚本不会直接重建 OpenSearch。
重新 embedding 完成后,如果你希望 OpenSearch 中也使用新的向量,请继续执行:
```bash
php scripts/reindex_opensearch.php
```