知识库辅助导入
将公司制度类 .docx 转换为知识库(WeKnora)友好的 Markdown:分块时每个片段自带章/节上下文,且选取合适的 chunk_size 使分块零二次切分、零重叠。
何时使用
- 用户附上制度类
.docx(考勤、离职、员工手册、补充条款、反腐败等)并要求「生成 md / 转 md / 按标准转」。 - 用户提到「WeKnora / 知识库 / 分块 / 片段上下文」相关导入准备。
核心约束(保真)
- 只标层级、不擅改文字:正文一字不动;仅在层级标记上做映射。
- 不编造数字:无完整口径的数据不写入;源文件笔误(如异体「囯」)原样保留。
- 源明显缺符号时主动补:如「10 日常行为规范」→「10. 日常行为规范」,并单独说明。
- 标题必须顶格、独占一行;缩进标题不被识别。
转换流程
1. 解析结构
用 scripts/docx2md_weknora.py 的 parse_docx(path) 取出段落(含原始文字)。先 dump 结构判断:编号层级(阿拉伯 X./X.Y 还是中文 一、/(一)/1./(1))、各级之间有无正文。
2. 套用《多级编号层级标准》
加载 references/多级编号层级标准.md 作为权威标准。两类文档分别处理:
A. 阿拉伯数字层级(考勤/离职/员工手册)
- 一级
X.→## X. 标题(骨架,分块边界)。 - 首子节
X.1是否并入父标题,唯一判据 = 父标题下有无正文: - 父下无正文(
X.1直接跟在X.后)→X.1降###并入父块; - 父下有正文(先有一段引言再出现
X.1)→X.1升##独立成块(父标题+引言自成一块)。 - 其余子节
X.2/X.3… 一律##独立成块。 - 三级
X.Y.Z及更深 → 正文(不加#)。 1.(一)等过深编号 → 正文,不拆标题。
B. 中文数字层级(补充条款等)
- 仅一级
一、二、…八→##标题(骨架)。 (一)(二)…条目 → 按段落处理、编号标签不加粗、不写**标记,不作标题。1.(1)→ 正文。- 整章合为一个片段,引用时自带章标题上下文。
通用
- 封面/抬头/制度名/编号/修订表/落款 → 纯文本,不参与切块。
- 不要放
#一级标题(会抢走骨架,把大章打成巨块)。
3. 生成 Markdown
按上述映射写出 .md(与源 .docx 同目录、同名去扩展名)。建议用脚本套正则生成基础文本,再按需晋升/调整层级。
4. 模拟分块并定 chunk_size
import sys; sys.path.insert(0, '<skill>/scripts')
import docx2md_weknora as w
md = open(out_path, encoding='utf-8').read()
counts, dom, secs = w.profile_and_sections(md) # dom 应为 2(## 骨架)
chunks, sub = w.simulate(secs, chunk_size) # 试多档 chunk_size
print(len(chunks), max(len(c['len']) for c in chunks), sub)
assert w.validate(chunks, sum(c['len'] for c in chunks), chunk_size)[0]
chunk_size取能容下最长片段且sub=False(零二次切分)的最小值;经验档:考勤/离职/中文层级条款 ≈ 700,员工手册(含 7.2 考勤打卡大块)≈ 1300。- 校验:模拟后无孤立父标题块、无跨父级混块;最长块 ≤ chunk_size。
- 条款型文档会产生多个 <50 字短片段(
validate的 tiny 启发式会误报),真实 WeKnora 不合并这些片段,符合「每条规则可单独引用」,属正常非缺陷。
交付
完成后在回复给出:输出文件路径、##/### 数量、块数、最长块、所用 chunk_size、是否零二次切分;并 present_files 打开预览。