跳转至

P3.9 — guoxue_content 嵌入可行性评估

日期: 2026-04-03 状态: 评估完成,建议执行

现状

指标
表大小 4.95 GB
行数 263,767
embedding 列 不存在
平均行大小 ~19KB (body 文本)
现有索引 PK(id), book_id, book_id+chapter_id, GIN(body前200字符 trigram)

表结构

CREATE TABLE guoxue_content (
    id SERIAL PRIMARY KEY,
    book_id INTEGER NOT NULL,
    chapter_id INTEGER DEFAULT 0,
    body TEXT,                          -- 正文内容
    body_length INTEGER GENERATED ALWAYS AS (length(body)) STORED,
    source_table VARCHAR(20),
    created_at TIMESTAMP DEFAULT NOW()
);

嵌入方案

方案 A:全文嵌入(推荐)

body 列生成嵌入向量,支持语义搜索。

步骤: 1. ALTER TABLE guoxue_content ADD COLUMN embedding vector(512); 2. 批量生成嵌入(复用 generate_guji_embeddings.py 脚本逻辑) 3. 创建 HNSW 索引 4. 接入检索 API

预估: - 嵌入生成时间:263k 行 × ~4.2行/秒 = ~17.3 小时(CPU),或 GPU 下 ~2 小时 - 嵌入列存储:263k × 512 × 4 bytes = ~512 MB - HNSW 索引:~400-500 MB - 总磁盘增量:~1 GB

风险: - body 列平均 19KB,部分行可能超过 BGE-M3 8192 token 限制 - 需对超长文本做截断或分段处理

方案 B:摘要嵌入

对 body 前 512/1024 字符生成嵌入。

优势: 速度快、存储小 劣势: 丢失正文细节语义

方案 C:分段嵌入(高精度)

将长文本按段落/句子分段,每段生成嵌入,存储到新表 guoxue_content_chunks

优势: 最高检索精度 劣势: 存储膨胀(~5-10x),需新建表和关联逻辑

建议

采用方案 A(全文嵌入),对超长文本截断至前 8192 token。

理由: 1. 与 guji_documents 方案一致,维护成本低 2. 512 MB 额外存储可接受(数据库 13 GB → 14 GB) 3. HNSW 索引在 263k 规模下查询延迟 < 5ms 4. 与现有 hybrid retrieval 架构直接兼容

执行计划

步骤 命令 预估时间
1. 添加列 ALTER TABLE guoxue_content ADD COLUMN embedding vector(512) 即时
2. 批量生成 修改 generate_guji_embeddings.py 适配 guoxue_content ~17 小时
3. VACUUM VACUUM ANALYZE guoxue_content ~10 分钟
4. 建 HNSW 索引 CREATE INDEX CONCURRENTLY ... ~30 分钟

前置条件: guji_documents 嵌入完成(当前 13.3%,约 15 小时后完成) 建议启动时间: guji_documents 完成后立即启动