ingestion.md 12 KB

第二步:知识入库

2026-09-24 F117:新增998条青浦区介绍与新闻,article库从288增至1286,当前六库共4231条。新快照da2968c1632af1535c690b7a4bd6f571a5bf26ac4c8eec04c76fb21e15561330,生成998个新向量、复用3233个旧向量;全量写入回读及独立--verify-only均核对4231/4231通过,旧集合保留。在线服务需重启读取新manifest;新闻历史事实、政策效力和真实问题召回尚未业务验收。

2026-09-24 F116:新惠企政策25个政策170个事项替换旧183条,其他3063条知识和摘要保持。当前共3233条,Milvus快照76f44fbd7eae1383f61cb48669dd23cfd83ddb6c9f58092e735bbfe9a8466600;policy170、finance185、qa928、article288、service_guide1604、service_catalog58。生成170向量、复用3063向量,全量写入回读及独立--verify-only均通过,旧集合未删除。在线服务需重启加载新manifest;真实问答召回、摘要语义和政策效力未验收。

2026-09-22 F107:新增企业服务中心知识4条,现共3246条,article增至288;生成4个BGE向量、复用3242个。实际入库、全量回读及独立--verify-only通过,快照为555e8e180bdb4a9e2c91263eea6dda5d06dee975790dbd677000e3fce351174d。原知识与摘要逐字段保持,旧集合保留;服务需重启加载新manifest,真实问答召回未验收。当前摘要报告为prepared/f107_summary_report.json。

2026-09-21 F081授权摘要更新:新增53条已通过配置的DeepSeek生成完整LLM摘要,原3189条知识及摘要逐字段不变。生成53个新BGE向量、复用3189个旧BGE向量后发布新快照f8e45e8c92bc0b9395c57ceea501c1fb2c8ffccbdee92793a726d013a85b5084,总计3242条,最长索引1758 token。独立--verify-only及六组真实标题检索通过,三表全部非空数据单元格核对通过。以下088b快照为本轮之前的本地抽取版本,保留用于回退;后端需重启加载最新manifest。摘要增量入口为python -m src.step1_knowledge_prepare.refresh_local --llm-workbook,加--verify可独立校验且不请求模型。

2026-09-21 F081:公安Excel三表新增53条,旧3189条保留,共3242条完整记录及语义向量。BGE新快照为088b3a24de2a4f1b79e5e9577da94880469410ef57b564a1284941ccd79482dc,全量写入和独立--verify-only通过。六库数量:policy 183、finance 185、qa 928、article 284、service_guide 1604、service_catalog 58;生成3212个向量,同文本复用30个,最长索引2056 token,按分窗汇总完整覆盖。旧集合未删除,旧manifest及知识输出备份在忽略的output/f081-backup/。本地.env已设置EMBEDDING_MODEL_PATH=models/bge-large-zh-v1.5;权重指纹同时支持并校验.bin和.safetensors。重启后端后加载新模型和manifest,旧Qwen向量不能与BGE查询混用。总体召回质量与前端问答尚未验收。

2026-09-16 17:25 F046:四份来源替换并规整为3189条,获授权后2261条DeepSeek摘要全部生成/复验通过;真实Milvus写入及独立verify-only通过,新manifest为2118f4a6da46ae07faf0ea688bee5a36ffdcdcf78ff99fd6aa5cc66796fbc038。生成2261个向量、复用928个QA向量,最长索引1026token,无截断。六库四组真实检索均完整,原文回读无失败。is_policy随raw_record无损入库,卡片按指定来源及严格布尔true校验;不更改现有数据库路由,也不删除旧集合。服务由用户自行重启加载新manifest;本轮未启动API或进行前端联调,不代表全量召回/推荐语义验收。

代码位于 src/step2_knowledge_ingest/。读取第一步四个原 JSONL 与对应 .with_summary.jsonl,逐条核对全部原字段后入库,不调用摘要 API,不修改已有人工知识分段。

使用

# 检查原字段保留、摘要状态、类型、模型文件及索引字段容量;不连接服务、不加载模型
.\.venv\Scripts\python.exe -m src.step2_knowledge_ingest --dry-run
# 本地生成向量、完整入库、逐条回读验证
.\.venv\Scripts\python.exe -m src.step2_knowledge_ingest
# 独立核对远端完整内容、向量和数量,逐库做一次向量搜索冒烟
.\.venv\Scripts\python.exe -m src.step2_knowledge_ingest --verify-only
.\.venv\Scripts\python.exe -m unittest discover -s src/step2_knowledge_ingest/tests -v

当前快照单文件导出与恢复

portable从本地已发布manifest.json确定快照,按清单逐条回读Milvus正文和向量并核对,生成一个ZIP文件。包中包含六库当前快照的完整记录、索引向量、八个规整/摘要JSONL和清单;不包含旧集合、模型权重、.env或SQLite缓存。数据包可能包含真实知识全文,应按资料权限保存和传输,不提交Git。

# 原服务器:导出到已被Git忽略的output目录;已有同名文件会拒绝覆盖
.\.venv\Scripts\python.exe -m src.step2_knowledge_ingest.portable export output/knowledge-snapshot.zip
# 任意机器:不连接Milvus,核对文件哈希、记录、向量、规整文件与快照指纹
.\.venv\Scripts\python.exe -m src.step2_knowledge_ingest.portable verify output/knowledge-snapshot.zip
# 新服务器:先配置.env里的目标Milvus,并提供与清单指纹一致的BGE模型
.\.venv\Scripts\python.exe -m src.step2_knowledge_ingest.portable import output/knowledge-snapshot.zip

可用--prepared指定知识目录,--env-file指定配置文件;Linux使用部署环境的Python执行相同模块。导入会创建目标数据库及当前快照集合,逐库写入、回读验证后写出knowledge/prepared/ingestion/manifest.json,可供现有检索端读取。模型文件按相对路径及SHA256逐一核对,Windows与Linux的路径分隔符差异不会误判为换模。目标已有不同完整快照清单或本地规整文件冲突时拒绝切换;失败时可能留下未发布的目标集合,可在排查后重跑。导入不会自动重启API,不会更改运行中服务的清单;部署时先导入并校验,再按维护窗口启动或重启。目标环境的数据库前缀可以不同,恢复清单会写入目标库名。

可用 --prepared 指定知识目录,--env-file 指定环境文件,路径默认以仓库为基准。真实资料、向量缓存与清单位于已忽略的 knowledge/prepared/。

分库与索引

类型 默认数据库 索引文本
惠企政策 business_knowledge_policy 标题+换行+摘要
金融产品 business_knowledge_finance 标题+换行+摘要
QA business_knowledge_qa 原始问题(沿用第一步规则)
普通文章/法规 business_knowledge_article 标题+换行+摘要
办事指南 business_knowledge_service_guide 标题+换行+摘要
六大服务板块 business_knowledge_service_catalog 标题+换行+摘要
目录 business_knowledge_catalog 完整存档,不生成语义向量

复用第一步五场景判定;QA独立。后续检索按问题选择一个或多个数据库,仅搜索相应索引集合。分库限制候选范围,但实际延迟与路由准确率尚未评测。

每个库拥有 content_<snapshot> 全文集合;除目录外另有 index_<snapshot> 向量集合。集合名、数据库和模型指纹由 knowledge/prepared/ingestion/manifest.json 提供。只有全部数据库完成回读校验才原子发布 complete=true 清单。检索端应读取此清单,不能自行猜测最新集合名。

索引采用本地 bge-large-zh-v1.5,FP32推理、1024维,右侧padding、CLS池化、L2归一化、COSINE/HNSW(M=16、efConstruction=200)。文档侧不添加查询指令;查询添加“为这个句子生成表示以用于检索相关文章:”。超过512 token时,按510个正文token连续无重叠分窗,每窗添加CLS/SEP并生成归一化向量,再按正文token数加权求和并归一化,仍每条知识一个向量;不截断原文或索引文本。该长文本汇总是本项目策略,总体召回质量尚待评测。入库和检索共用同一实现。

不删减信息

向量只负责召回,完整内容另外保存。原始字段、来源、数据、片段、摘要、摘要元数据、未知字段和质量标记全部序列化保存;未缩短正文,未去重删除记录。

Milvus VARCHAR 单字段最多65535字节。完整记录按12000个Unicode字符分为存储段,每段最多48000 UTF-8字节;这只是物理存储,不是语义切块。全文集合保存 record_id、part、total、record_hash 和 payload。通过 content_parts(record) 的稳定ID读取,或按 record_id 过滤,使用 restore(parts) 检查顺序、数量、SHA256并重组完整JSON。索引ID与原始知识ID相同,可用于全文回溯。

全文集合的二维固定向量仅满足Milvus集合结构要求,不用于知识召回。语义索引仍然每条知识一个向量,正文大小不会增加语义索引记录数。字符串索引文本超过容量时明确失败,不删减。

配置

本地 .env 已追加独立中文配置组,不设置账号密码。当前机器检测到RTX4080,本地EMBEDDING_DEVICE已设为cuda;代码默认cpu用于其他环境。Windows的torch单独使用官方CUDA13.0源,其余依赖仍走清华默认镜像。进程环境变量优先;只识别以下配置,不执行插值或环境文件指令。

配置 默认值 含义
MILVUS_URI http://192.168.2.69:19530 用户指定的服务,无认证参数
MILVUS_DB_PREFIX business_knowledge 数据库前缀,自动追加类型
MILVUS_TIMEOUT_SECONDS 60 SDK请求超时秒数
EMBEDDING_MODEL_PATH models/bge-large-zh-v1.5 仓库相对路径或绝对路径,仅加载本地文件
EMBEDDING_DEVICE cpu torch设备,可按运行环境设为cuda
EMBEDDING_BATCH_SIZE 8 每批向量数
EMBEDDING_CPU_THREADS 16 torch CPU线程数

重复执行、更新和失败

整个知识快照、模型权重/tokenizer哈希和索引契约共同决定集合版本。输入不变时使用稳定ID upsert,不产生重复有效记录;内容/摘要/分类/模型改变时创建新版本集合,完成后切换清单。旧集合完整保留,不自动删除,因此后续需要人工制定保留和清理策略。改变数据库前缀或服务器会写入新的目标。

SQLite向量缓存按完整索引文本、模型文件指纹和索引契约复用成功向量,每批提交。进程锁防止同一prepared目录被并行导入。失败返回非零,已经写入的数据和缓存可重跑恢复;跨库写入不保证事务,失败时不发布新清单。请勿让多个不同prepared目录同时管理同一目标快照。

--verify-only 校验当前本地输入对应的远端快照,不生成向量、不新建远端库/集合;成功会刷新本地清单。它会批量回读后逐条比较所有内容,并检查逻辑实体数量、索引文本、向量维度/有限性/归一化,每个语义库做一次自向量搜索;不等同于真实用户问题的召回质量评测。SDK错误不打印请求正文;失败后按数据库、输入和环境检查定位原因。

实现参考:Milvus数据库管理、BGE官方模型说明。

实际验证(2026-09-10)

Milvus服务端2.5.27,PyMilvus2.6.17;本地Python3.14.5、torch2.14.0+cu130、transformers5.17.0。已完成3177条完整记录、3176个语义向量的全量入库和独立verify-only,七类数量与上表说明一致,六个语义库均通过自向量搜索。

最长索引996token,无截断。CPU和RTX4080使用同一FP32契约,两条合成文本跨设备向量余弦均约为1;最终使用GPU续跑并复用CPU缓存。新入库12项回归和原知识29项回归通过。独立复验不代表检索相关性或政策有效性已通过业务评审。

重复全量导入验证通过:vectors_generated=0、vectors_reused=3176、records_verified=3177,七库逻辑数量保持一致。