# 第二步:知识入库 人才客服三类知识已使用独立 `talent_knowledge` 前缀及 `knowledge/prepared-talent/` 入库:article31、qa15、policy91。QA保持原问题索引,其余标题加摘要;91事项完整关联22篇原文。准备、导出及离线目标参数见[人才知识说明](../docs/talent-knowledge.md)。营商助手原目录和前缀保持。 ## 2026-10-09 16:48 — F130 青浦介绍与新闻源更新入库 新闻源更新后六库3769条:policy170、finance185、qa928、article824、service_guide1604、service_catalog58。新快照`7ad510acc1e0a8fd5259ea12f45af77518e74c30143e97019e8e2d2d203cacf7`,生成0个向量、复用3769个,完整写入回读及独立verify-only通过;旧目录output/f130-backup及旧集合保留,服务需重启加载新manifest。 ## 2026-10-09 15:47 — F126 规范性文件增量加入文章库 新增35条规范性文件进入article库,当前六库共4266条:policy170、finance185、qa928、article1321、service_guide1604、service_catalog58。快照`55cf59460978742e3d0e5ddc933b486a15ac4a5c9757d4509aaf324b75d6cd73`;生成35个向量、复用4231个,实际写入全量回读及独立`--verify-only`均通过。旧集合及`output/f126-backup`保留,服务需重启加载新manifest。全量知识包为`output/knowledge-snapshot-55cf5946.zip`,已独立验证并附SHA256;此更新未改造离线导入命令的不同快照冲突保护。 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,不修改已有人工知识分段。 ## 使用 ```powershell # 检查原字段保留、摘要状态、类型、模型文件及索引字段容量;不连接服务、不加载模型 .\.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。 ```powershell # 原服务器:导出到已被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执行相同模块。F127起允许全量包替换已有不同快照:先将ZIP复制到隔离暂存目录并完整核验,再写入与回读新集合,成功后切换完整prepared目录。旧目录保存在同级`prepared.previous-<唯一编号>`,旧Milvus集合保留;失败不发布新清单,可能留下未发布的新集合。模型文件按相对路径及SHA256逐一核对,Windows与Linux的路径分隔符差异不会误判为换模。目标环境的数据库前缀可以不同,恢复清单会写入目标库名。导入不自动重启API;成功后按维护窗口重启读取新清单。 导出单库包使用`portable export 包路径 --database article`;导入使用`portable import 包路径 --database article`,或`sh deploy-offline.sh import-knowledge 包路径 article`。支持policy、finance、qa、article、service_guide、service_catalog。包内库名必须与参数一致;单库包是所选库的完整替换版本,未包含的旧记录退出当前所选库,其他库的记录和集合保持。第一次初始化需用全量包;单库更新校验当前完整清单、本地原始/增强记录和相同模型,拒绝跨库ID冲突。 单库更新后的全局`snapshot`仍是合并知识与模型的内容指纹,各库条目可额外包含自己的`snapshot`用于校验集合名;旧清单无该字段时沿用全局值。检索、独立`--verify-only`和再次导出均按各库实际集合读取。全量导出会重新整理为可独立迁移的统一版本包,单库导出使用`business-assistant-milvus-library-v1`格式,旧全量`business-assistant-milvus-snapshot-v1`继续兼容。原始和增强JSONL字段一致性也纳入包校验。暂存及历史目录只作本地恢复,不提交Git。 导入、导出及入库验证共享prepared目录外的发布锁;不要同时运行规整、摘要或手工修改这些文件。清单完成只代表已导入范围校验成功,不代替其他服务健康检查。长期部署操作见[部署说明](../docs/deployment.md)。 可用 `--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_` 全文集合;除目录外另有 `index_` 向量集合。集合名、数据库和模型指纹由 `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数据库管理](https://milvus.io/docs/manage_databases.md)、[BGE官方模型说明](https://huggingface.co/BAAI/bge-large-zh-v1.5)。 ## 实际验证(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`,七库逻辑数量保持一致。