会议纪要自动生成
🚫 绝对禁止
六条底线,格式为「作用域 + 动作 + 合法例外」。例外之外一律不做,违反即视为交付失败。
- 【全流程 · 出稿】禁止在用户回答「字数」与「版式」之前生成任何文档、写 JSON、调用渲染脚本。 合法例外:用户原话中已明确给出字数或版式(如「1500 字以内」「按表格式出一份」),该项视为已确认;但另一项仍须询问。
- 【全流程 · 内容】禁止写入素材中不存在的姓名、日期、地点、数字、结论,禁止把口语升格为结论。 合法例外:无。缺失统一填
无/【待补】并进gaps;材料只写「张总」就记「张总」。 - 【全流程 · 素材】禁止在未完成转写/OCR 的情况下凭片段或记忆提取字段,禁止跨素材嫁接责任人。 合法例外:素材确实不可识别时,可跳过该份并在
gaps写明「Sx 未纳入」及原因,同时告知用户。 - 【字数已确认 · 裁剪】禁止为压字数删除决议、待办或结论性讨论,禁止出稿后删段落、手改 docx 达标,禁止注水凑下限。 合法例外:压不下来时,可列出「需删掉的 N 条讨论」交用户裁决,用户明确接受后方可删减。
- 【交付前 · 质量】禁止跳过
check_output.py自检直接交付,禁止只在文档里写conflicts/gaps而对话中不提。 合法例外:无。自检未通过须修数据重跑,不得手改产物掩盖。 - 【全流程 · 模糊项】禁止把模糊的责任人或时间改写成具体值,也禁止不加标注直接交付。 两种情形各用一个标签:责任人是「小王他们」「相关同事」「有关部门」这类落不到具体人的写法,标注
⚠️ 需人工复核;时间是「下个月找个时间」「尽快」「回头再说」这类无法直接执行的表述,标注⚠️ 待确认。合法例外:无。 标注只加标记、不改原话——「小王他们」仍记「小王他们」,不得删成「小王」或补成某个全名;「下个月」仍记「下个月」,不得换算成任何日期。写法与判定细则见references/faq-and-antipatterns.md§1.6。
模糊项标注约定
第 6 条的执行细则。先标注,再说结论;标注不是虚构,改写才是。
| 标记 | 触发条件 | 写在什么位置 | 禁止做法 |
|---|---|---|---|
⚠️ 需人工复核 |
责任人无法落实到具体个人 | 紧跟在责任人原话后,全角括号包住:小王他们(⚠️ 需人工复核) |
不得删改原话使其「看起来具体」;不得留空或以 无 代替 |
⚠️ 待确认 |
时间/期限无法直接执行(保留原话) | 紧跟时间原话后:下个月找个时间(⚠️ 待确认) |
不得换算成具体日期;不得倒推「大概月底」 |
判定口径(代码层同源,见 scripts/minutes_marks.py):
- 责任人算模糊:空值、
无、未指定、待定,含相关/有关/大家/各部门/同事/部门/团队等泛指,或带他们/她们/等人/几个集体后缀。 - 时间算模糊:含
下个月/下周/月底/尽快/回头/再说/择期/找时间/待定等词;绝对日期(11月1日、2026-11-01、10月24日上午10点)不算模糊,不加标注。 - 不标注是正当结果:素材本身就是具体人名 + 绝对日期时,产出 0 处标注即正确,不要为了「看起来用了新功能」硬造标记。
check_output.py 的 D10 项负责兜底:文档里出现 未指定 却未带任何标记,判失败(带 ⚠️ 需人工复核 或 ⚠️ 待确认 任一即可通过)。文末「待确认事项」的说明行只作复述,不能替代正文里的标注。
强制拦截规则
⚠️【最高优先级】:只要用户输入包含上述触发词,你必须立刻停下来,先询问用户两个问题:①需要哪种版式?②字数有要求吗?在用户回答之前,严禁直接生成文档!
⚠️【工具强制】:这两问必须通过 AskUserQuestion 工具发出,不允许只用普通文字聊天提问。理由:文字提问容易被打断、被跳过、被自己「合理推断」代答;AskUserQuestion 会形成一次真实的用户选择事件,选完才拿得到答案。请把「版式」与「字数」作为同一批的两个问题一次发出(版式四选一,字数选有/没有)。未收到 AskUserQuestion 的返回结果,就不得调用 generate_minutes.py / render_minutes.py。
补充执行细节:版式选项固定为「1. 表格式 2. 信笺式 3. 网格大表式 4. 条目式」,逐字保留选项编号与名称,不得增删;字数问题只给「有」「没有」两个选项,用户选「有」则请其自行指定上限或范围。两个问题一次问清,然后必须等待用户回复,严禁自行推断代答、严禁跳过询问直接提取或出稿。
概述
把一次会议产生的任意形态原始材料(图片、视频、录音、文字)统一转成「会议事实底稿」,再按用户需要的版式输出可直接分发或打印的 .docx 会议纪要。
三条主链路:多模态接入与识别 → 信息结构化与冲突校验 → 版式渲染交付。三态之间以 minutes.json 为唯一数据契约,保证同一份内容能切换任意版式重出,而不用重听录音。
三类素材同等对待:不是「录音为主、图片为辅」,而是任何单一或混合素材都能独立产出完整纪要——只有照片也能出纪要,只有一段聊天记录也能出纪要。
三条全局硬性规则(贯穿全流程,优先级最高):
- 字数先问后做:任何一次会议纪要生成,都必须先询问用户「是否有字数要求」,只给「有」「没有」两个选项;用户选「有」,再请其自行指定具体字数上限或范围,确认后才按该字数生成。
- 版式先问后做:任何一次会议纪要生成,都必须先向用户询问希望采用哪种模板格式(表格式 / 信笺段落式 / 网格大表式 / 条目式,四选一),得到明确确认后才开始生成文档。不允许默认套用某一版式直接出货。
- 忠于原文,不增不漏:用户以图片、录音、视频或文字等形式提供输入时,须严谨准确地提取核心内容与关键重点,既不遗漏关键信息,也不得擅自补充原文未提及的内容(不推测、不润色性添加、不"合理补全")。
前两条是出稿前的强制确认项,顺序固定:先问字数,再问版式,然后才生成。任何一项未获得用户明确回答,都不得开始生成。
三分钟上手
用户给素材(录音 / 图片 / 文字 / 混合)
→ 阶段 A:识别成 raw/source.txt
→ 阶段 B:问「版式 + 字数」→ 提九类字段 → 写 temp_data.json
→ 阶段 C:跑脚本出 docx → 自检 → 交付
- 完整示例(含用户原话、逐轮回复、中间产物、交付话术):见
references/examples.md - 必须记住的铁律:不问版式和字数不出稿;缺信息填「无」不编造;自检不通过不交付
何时使用
满足以下任一条件即触发本 Skill:
- 用户上传或指定
mp3/wav/m4a/aac/flac/amr录音并要求整理纪要(需宿主环境支持音频转文字) - 用户上传或指定
mp4/mov/avi/mkv会议录像、录屏(需宿主环境支持音频转文字) - 用户上传会议白板照、PPT 拍照、手写笔记照片、群聊/邮件截图、排期表截图
- 用户直接粘贴一段会议文字/转写稿/聊天记录,要求做成纪要
- 用户混着给(「录音 + 白板照 + 一份与会名单」),要求合成一份文档
- 用户说「把上次会议整理成纪要」「生成会议记录 Word」「按表格式/信笺式/大表式出一份」「要个没有表格的版本」
音频链路说明:本 Skill 不自带语音识别引擎,转写由宿主环境提供(平台自动转录,或宿主调用其转写能力),Skill 负责读取、清洗、分段与后续结构化。宿主未提供转写稿时,按「绝不报依赖错误」原则给出替代方案,详见下方「A1 · 按模态识别为文字」与「异常与降级」。
不适用:仅需转录不要纪要(用通用转写);只需摘要不要 Word(用普通总结)。
输入忠实度要求(针对所有素材形态)
无论输入是图片、录音、视频还是文字,提取时必须满足:
| 要求 | 具体做法 | 反例(禁止) |
|---|---|---|
| 不漏关键信息 | 逐份素材完整过一遍,议题、结论、责任人、时间点、数字、异议全部落条;合并后回查是否有素材段落未在纪要中体现 | 只听前半段录音就出纪要;只抄白板标题不抄勾选与划掉标记 |
| 不擅自补充 | 纪事只写素材里出现过的内容;缺的填 无/【待补】 并进 gaps |
材料说「张总」,写成「张三总经理」;会议没说地点,按常识填「三楼会议室」 |
| 不推断改写 | 「尽快/下周/月底」原样保留,不换算成具体日期;口语保留原意不做升华 | 「可能要调整一下」写成「会议决定全面调整方案」 |
| 不跨素材串写 | 每段信息可追溯到 Sx;不得把 A 素材的结论嫁接到 B 素材的责任人上 |
排期表有「李工」,群聊有「那个事」,合成「李工负责那个事」 |
| 歧义即提示 | 听不清、看不清、指代不明,写明「原话不清晰/图中此处模糊」进 gaps,让用户确认 |
猜一个合理值填进去 |
一句话标准:纪要的每一句话,都能在素材里指出来源;找不到出处的,宁缺不编。
执行步骤
> 以下为强制交互约束(最高优先级,任何情况下不得跳过、不得合并、不得自动推断代答)
规则一 · 提取完成后必须停下来
当你完成录音 / 视频 / 图片 / 文字的素材识别与信息提取(阶段 A 全部完成、阶段 B 的九类字段已梳理)后,严禁直接调用 generate_minutes.py(或任何渲染脚本)生成文档。此处是一个硬性停点,必须中断流程,转入规则二。
规则二 · 强制询问用户(必须用 AskUserQuestion 工具)
必须调用 AskUserQuestion,在同一次调用里问清两个问题,逐字保留选项编号与名称,不得增删选项、不得替换措辞:
- 「请问您需要哪种版式?」——选项固定四项:
1. 表格式/2. 信笺式/3. 网格大表式/4. 条目式 - 「请问您对生成的字数有要求吗?」——选项固定两项:
有/没有;用户选「有」时再追问具体上限或范围
为什么必须用工具而不是发文字:用 AskUserQuestion 才能拿到一个明确的、可审计的选择结果;纯文字提问在本项目里已经出现过「没问就直接出稿」的情况。工具调用是硬门槛,聊天措辞不是。
拿到答案后的落参口径(三个脚本统一):
| 用户的选择 | 传参 |
|---|---|
| 1. 表格式 | --style table |
| 2. 信笺式 | --style letter |
| 3. 网格大表式 | --style grid |
| 4. 条目式 | --style letter(交付说明写「条目式」,不要改口称信笺式) |
| 字数「有」+ 上限 1500 | --max-chars 1500 |
| 字数「有」+ 区间 1000–1500 | --min-chars 1000 --max-chars 1500 |
| 字数「没有」 | --max-chars 0(0 = 明确要求不限字数,不是「没填」) |
⚠️ 这三个参数现在都是硬性必填:generate_minutes.py、render_minutes.py、check_output.py 在缺少 --style/--format 或 --max-chars 时会直接报错退出(退出码 30),不再提供任何默认版式或「默认不限字数」。这是刻意设计的——漏问会立刻失败,而不是悄悄出一份错方向的稿。
规则三 · 等待回复后再生成
发送询问后必须等待用户回复。只有拿到两件事——① 用户选定的版式(必须是上列四个选项之一,含新增的「条目式」);② 用户对字数的要求(有具体数值 / 明确表示没有)——才允许继续执行 JSON 数据整理与 python scripts/generate_minutes.py 出稿。
用户未回复、只回复了其中一项、或回复含糊无法确定时,继续等待或追问该项,不得默认任何版式、不得默认不限字数、不得先出一版让用户看着改。
工作流
本工作流按阶段顺序执行,其中 阶段 B0 是上文「规则二 / 规则三」的落地点,阶段 C2 是「规则一」禁止提前进入的步骤。
阶段 A · 素材接入与识别
A0 · 素材清点(先做,不做任何提取)
列出用户给出的每一份素材,逐条记录:模态、路径/来源、体量(时长/张数/字数)、预期能提供什么。落盘为 raw/manifest.json:
[{"id": "S1", "type": "audio", "file": "rec.m4a", "dur_min": 46, "expect": "讨论过程、口头承诺"},
{"id": "S2", "type": "image", "file": "whiteboard.jpg", "expect": "排期、责任人"},
{"id": "S3", "type": "text", "file": "chat.txt", "expect": "会前背景、缺席人"}]
Sx 编号贯穿整个流程:后续每条提取出的信息都能追溯到某个 Sx,交付时才能说清「哪条内容来自哪份素材」。
A1 · 按模态识别为文字
进入任何字段提取之前,必须把所有素材统一成文本材料。
| 模态 | 怎么处理 | 产物 |
|---|---|---|
| 音频 / 视频 | 走宿主转写适配层 scripts/transcribe.py(不自带 whisper/ffmpeg,缺依赖不报错) |
raw/transcript.txt |
| 图片 | OCR / 视觉理解,图中的表格、箭头、勾选、划掉痕迹要一并描述 | raw/ocr_<序号>.txt |
| 纯文字 | 直接读取,按空行或说话人标签切段 | 原文 |
| 混合 | 各自识别后合并为同一份,每段前缀 [S1 录音 00:12:30] 来源标记 |
raw/source.txt |
音频最小用法(详见 references/media-intake.md):
python scripts/transcribe.py rec.m4a --probe # 探测宿主是否已转录
python scripts/transcribe.py rec.m4a -o raw/transcript.txt # 采纳并落盘
宿主未提供转写稿时(退出码 10),原样转达这句话,不要改写成技术错误:
> 我暂时无法直接解析音频文件,请提供文字版记录,或确认您的使用环境支持音频转写。
并补充替代方案(文字版 / 清晰图 / 只对有音轨部分做纪要 / 口述关键决议先出草案),把该素材记入 gaps。
硬性约束:
- 不得跳过识别直接凭记忆或片段提取字段。 未经转录/OCR 的材料,视为该部分信息不存在,写入
gaps,而不是猜。 - 识别失败或覆盖率不足时,说明具体哪份素材、什么原因、覆盖了多少,让用户决定是否补料,不要降级为「大致总结」。
A2 · 交叉校订与冲突检测
所有素材合并后,做一遍交叉核对(这一步是「混合输入整合」的核心,不能省):
- 专有名词/数字/人名:以书面材料(PPT、排期表、名单、邮件)为准,纠正转写听错。
- 时间与责任人:录音里说「下周三」,截图里写明「10/21」,取截图并记
gaps。 - 同一事项多版本:例如两张不同日期的排期表,以日期更新的或用户指定的为准,另一版记入
gaps。
冲突与缺失统一进入 conflicts 与 gaps 两个清单(结构见 references/extraction-schema.md),不允许静默选一个。这两个清单会同时出现在:交付时的对话提示 + 文档末尾的「待确认事项」小节。
阶段 B · 信息结构化
B0 · 硬性停点:先确认版式与字数(必做,不可跳过)
提取完成 → 必须停下先问、等答复,才可进入阶段 C。 在同一条消息里问两件事,两项都拿到答复才继续:
- 「请问您需要哪种版式?1. 表格式 2. 信笺式 3. 网格大表式 4. 条目式」(四项编号与名称逐字保留,不得增删)
- 「请问您对生成的字数有要求吗?」(只给「有 / 没有」,选「有」再请其指定上限或范围)
必须用 AskUserQuestion 发起这两问,不要用普通文字代替;没拿到工具返回的用户选择,不得进入阶段 C。
禁止:提取完直接写 JSON 跑脚本;先出稿再问要不要换;把两个问题压成一句含混提问。
用户已明确说过版式或字数的不重复问。(用户原话已给出某项时,仍须对另一项用 AskUserQuestion 询问;两项都已在原话中明确时,可直接进入阶段 C,但仍须把结论写进 --style / --max-chars,不得省略。) 除此之外的缺项(会议名、参会人等)一律先出稿后提示,不停下来盘问。
> 版式选项与 --style 的映射、字数追问的全部话术、用户改主意时的处理,见 references/interaction-protocol.md。
B1 · 提取九类字段
从 raw/source.txt 提取九类字段,缺一不可:会议主题、时间、地点、主持人、记录人、参会人员、讨论内容、决议事项、待办事项。
三条铁律:
- 缺失统一填「无」,严禁编造——不推断姓名(材料写「张总」就记「张总」,不补成「张三」)、不推测时间地点、不把「尽快」改写成具体日期、不为凑结构虚构条目
- 讨论与决议必须分条归纳,一条 = 一个可独立成立的事实或决定,单条超 60 字视为未归纳
- 待办必须带负责人与截止时间,缺哪个子字段就填
无
> 九类字段的完整表格、逐条禁止项、流水账反例与分条正例,见 references/field-extraction.md。
B1-补 · 按 B0-1 确认的字数裁剪
word_limit 为 null 时跳过本节。有值时在数据层收敛篇幅,不是出稿后再删:
| 用户给的形式 | 执行方式 |
|---|---|
| 上限(如「1500 字以内」) | 正文总字数(含表格内文字,不含页眉页脚页码)不超过该值,目标落在 80%–100% |
| 范围(如「1000–1500 字」) | 落在区间内,不写成 1000 字以下;接近下限时不注水 |
裁剪优先级(从先到后,不得为了压字数丢掉第 1、2 类):
- 必须保留:全部决议事项、全部待办(负责人 + 截止时间)、结论性讨论条目
- 必须保留:会议基本信息六项(无内容也占位填
无) - 可压缩:同一议题下多条相近讨论合并为一条,保留分歧点与结论
- 可压缩:讨论条目的修饰性措辞删去,只留「事实 + 数字 + 结论」
- 可后置:
gaps/conflicts明细改为对话中说明,文档内仅保留一行索引 - 禁止:为压字数编造概括句、删除议题导致漏项、把两条不同议题压成一条
压缩后仍超限 → 说明「按 <style> 版式与现有内容,压到 X 字需删掉 N 条讨论(列出),是否接受?」,让用户裁决,不要静默删内容强行达标。
python scripts/check_output.py <输出文件> --format {style} --max-chars {0|上限}
python scripts/check_output.py <输出文件> --format {style} --min-chars 1000 --max-chars 1500
--max-chars 超出即报 D9,按报错项压缩数据重跑(不要手改 docx);--min-chars 不足只告警,不注水。用户选「没有」时不传这两个参数。
B2 · 断链识别(材料不足的典型形态)
有讨论无结论、待办缺责任人或时间、只截到半场、说话人无法对应、仅单一低可信素材——这五种情况必须写进 gaps,不能让文档看起来完整。
> 五种断链形态的表现与处理方式,见 references/field-extraction.md。
阶段 C · 渲染与交付
C1 · 版式路由
前置条件:B0-1 字数、B0-2 版式均已完成确认,且用户已在对话中真实回复过。 未获得用户对字数的回答(「有字数要求」并给出数值 / 「没有字数要求」)或未获得明确版式,一律不得进入本步骤。到达 C1 之前若尚未发出过「请问您需要哪种版式?…/请问您对生成的字数有要求吗?」这条询问,说明跳过了 B0 硬性停点,必须回退到 B0 重新询问。
按用户措辞直接映射到 --style,不要让用户重新描述:
| 用户说 | 参数 |
|---|---|
| 「表格」「表格版」「表格式」 | --style table |
| 「信笺」「段落」「信笺版」「段落式」 | --style letter |
| 「网格」「大表」「网格版」「大表式」 | --style grid |
| 「没有表格」「不要表格」「不用表格」「条目式」「纯文字版」 | --style letter |
| 未指定版式 / 未回答 B0-2 | 无参数 —— 必须回到 B0-2 询问,禁止套用任何默认值 |
多个关键词同时出现(如「要个表格版的,或者网格也行」)取最前面的;仍无法判断时回到 B0-2 重新让用户四选一,不要自行默认。
「条目式」与「信笺段落式」执行上同为 --style letter(该版式已保证全文无表格,行动项转为「四、工作安排」编号段落),区别只在对用户的说法:选了「条目式」时,交付说明里写「本次按条目式生成,全文不含表格」,不要改口称「信笺段落式」,以免用户以为换错了版式。
> 三种版式的详细格式要求,请参见 references/format-table.md、format-letter.md、format-grid.md(页面尺寸、字体字号、颜色、表格结构、行距、页脚页码等)。
> 上述细则已由脚本实现,出稿时不需要手工核对,也不要在对话里复述;仅在排查排版异常或需要说明版式差异时查阅。
C2 · 生成 Word
> 进入本步骤的唯一凭证:用户已在 B0 回复过版式(1/2/3/4 之一,含「4. 条目式」)与字数要求。 二者缺一,禁止执行本节命令。
把 B1 的数据整理成 JSON 写入临时文件(如 temp_data.json)。若 word_limit 有值,先按 B1-补 收敛数据,再生成:
python scripts/generate_minutes.py --style {style} --max-chars {0|上限} --data temp_data.json
`--style` 与 `--max-chars` 均为必填:前者取用户在 `AskUserQuestion` 里选的那一项(四选一映射见规则二),后者取用户的字数要求("没有" 传 `0`,"1500 字以内" 传 `1500`,区间再加 `--min-chars`)。两者缺一,脚本直接退出(退出码 30)。
- 顶层四块:
meeting_info/discussion/decisions/todos;完整字段与替换规则见references/data-structure.md - 可选
-o 输出路径.docx、--company "公司名称"、--code "DK001" - 不传
--data时生成同版式空白模板,仅在用户明确要「空表 / 打印手填」时使用 - 需要「待确认事项 / 信息来源」等扩展小节时,改用
scripts/render_minutes.py(minutes.json契约,字段更细,含gaps、sources、risks、next_meeting)
生成后执行交付前自检(word_limit 有值时务必带上字数参数):
python scripts/check_output.py <输出文件> --format {style} --max-chars {0|上限}
通过再交付;未通过按报错项修数据重跑(不要手改 docx)。
自检项一览(check_output.py):
| 项 | 查什么 | 不通过时怎么办 |
|---|---|---|
| D1 | 页面方向与版式要求一致(grid 必须横向) | 换正确版式参数重跑 |
| D2 | 版式关键结构齐全(table 七节 / letter 六章+落款 / grid 主表五列+底部汇总) | 补数据或改选版式 |
| D3 | 占位符残留(【待补】 / TODO / XXX) |
补齐或确认后去掉占位 |
| D4 | 行动项出现「未指定」 | 补负责人/截止时间 |
| D5 | 空章节 / 空表格单元格 | 补内容或按「无」交付并说明 |
| D6 | 段落数量与空白文档底线 | 补内容 |
| D9 | 字数是否落在 --max-chars / --min-chars 内 |
压缩或放宽重跑 |
| D10 | 模糊信息是否正确标注(⚠️ 待确认 / ⚠️ 需人工复核) |
按「模糊项标注约定」补标注 |
| D11 | 一段连续 200 字以上没有任何标点断句(整行夹一个逗号不算断句) | 拆成多条要点,或按每 200 字左右分段重出(原话不动,只加分段) |
为什么按「连续无标点片段」判、而不是按「整行有没有标点」判:361 字里夹一个逗号,算「有标点」却照样是一整块石头,版面撑破、读者读不下去。可读性取决于最长的那段没断句的文字,而不是标点出现过没有。
D11 的定位是兜底,不是日常扫描:generate_minutes.py 出稿时已先用 _split_points 把超长无标点段落无损拆成多行,所以正常生成的文档不会触发 D11。它只在两种情况下拦下来——拆分本身失效,或内容绕过渲染层、以整块文本进入文档。命中时退出码为 10(内容类,可修数据后重试),不会因为你换版式而消失。
C3 · 打印/发送适配
文档默认即为「可直接分发」状态:A4 纵向、页边距 2–2.5cm、页脚页码、标题层级清晰、单元格不串行。生成前按用途做一次取向判断:
| 用途 | 处理 |
|---|---|
| 直接发邮件/IM | 保持默认;信笺式更适合对外,表格/网格更适合内部 |
| 打印张贴/会上传阅 | 用 grid,内容多时确认段落未被跨页切断(必要时拆议题块) |
| 打印手写填写 | 用空白模板 --data 缺省 |
| 超长会议(≥15 条议题) | 拆成「纪要正文 + 待办汇总表」两份,或改用 grid 横向排布 |
C4 · 交付与切换
用 present_files 打开成品,正文给出:
- 一句话说明素材构成(几个文件、什么模态、总时长/页数)
- 讨论条数、决议条数、待办条数
- 所有填了
无的字段,方便用户一次补齐 - 冲突与缺失提示(
conflicts/gaps)——这是本技能的核心承诺,不能省 - 版式已由用户确认,交付时复核一句「本次按你选的<版式名>生成」,并附切换方式
word_limit有值时复核一句「本次按 <N 字以内 / N–M 字> 要求生成,实际约 X 字(经--max-chars校验)」
用户要换版式,直接改 --style 重跑,复用同一个 temp_data.json,不重跑识别与提取。用户要改字数,改 word_limit 后按 B1-补 压缩同一份数据重跑,同样不重听录音。
异常与降级
提示语总则:任何异常/缺信息场景,话术必须三段齐全——① 说清具体是什么问题(缺哪几项、哪份素材、第几行)→ ② 说明用户可以选择怎么做(不是命令)→ ③ 给出「我可以先做什么」的兜底动作。禁止只回「缺少信息」「生成失败」「格式错误」这类无信息量的单词;也禁止把技术报错原文(traceback、异常类名)直接抛给用户。
脚本侧已实现同一套话术:scripts/messages.py(文案单一来源)+ generate_minutes.py 的自动修复/重试降级 + check_output.py 的 [提示] 与 结论: 行。写回复时可直接沿用脚本给出的说法,保持前后一致。
| 场景 | 动作 |
|---|---|
| 宿主不提供音频转写 | 不报错、不抛 traceback;原样输出「我暂时无法直接解析音频文件,请提供文字版记录,或确认您的使用环境支持音频转写。」并给出文字版/截图/口述等替代路径,该素材记入 gaps |
| 宿主提供了转写稿但文件损坏/为空 | 说明「找到了转写稿但读不进来」+ 具体原因,请用户改发文字版;不中断其余素材的处理 |
| 转写稿超长(长会、多段拼接) | 脚本按 --chunk-min 自动分段处理并告知切了几段、顺序不乱;不静默截断 |
| 素材全为图片且有多张重复页 | 按场景去重,只对差异帧做 OCR,交付时说明去重了 N 张 |
| 视频超长(>2h) | 先按场景切换抽帧定位议程,再对关键片段转写,交付时说明只转写了关键段 |
| 部分素材无可用识别能力 | 明确告知哪份材料未纳入,其余照常出纪要,gaps 记「Sx 未纳入」 |
| 素材内容与用户口述要求矛盾 | 以素材为准,在交付时提出矛盾点让用户裁决 |
| 用户要求「补齐所有空缺」 | 拒绝编造;改为给「推荐补全清单」,逐项标出需要谁确认 |
| 用户未回答字数(B0-1) | 停下等待,不生成;不预设「不限字数」 |
| 用户选「有字数要求」但未给具体字数/给的是模糊值 | 请其明确为上限或范围(一个数字按上限处理),不要自行折算 |
| 用户给的字数明显装不下全部决议与待办 | 告知「压到 X 字需删掉 N 条讨论(列出)」,由用户选择放宽字数还是接受删减,不静默删内容 |
| 用户未回答版式选择 | 停下等待,不生成;可给出推荐项与理由,但不代用户决定 |
| 已提取完信息但还没问就准备跑脚本 | 立即中止,回到 B0 硬性停点,发出「版式 + 字数」两问,不生成任何文件 |
| 用户只回复了版式或只回复了字数 | 追问缺失的那一项,两项齐全前不写 JSON、不跑脚本 |
| 用户选「4. 条目式」 | 按 --style letter 生成,交付说明写「本次按你选的条目式生成,全文不含表格」,不要改口称信笺式 |
| 用户说「随便」「你看着办」 | 推荐一个版式并说明理由,仍取得一句确认后再生成 |
| 用户既要「没有表格」又要逐项跟踪行动项 | 说明该版式下行动项会写成「四、工作安排」的编号段落、不再横向对照负责人与截止,确认其接受或改选表格式 |
版式选择建议
| 版式 | 适用场景 | 不适用 |
|---|---|---|
| 表格式 | 周会、项目例会、需要逐条跟踪行动项 | 需要叙述性措辞的对外场合 |
| 信笺段落式 | 对外发送、向上汇报、正式函件风格 | 议题多且需要横向对比 |
| 网格大表式 | 决策会、多议题多方案对比、评审会、需要打印张贴 | 内容极少的短会(会显得空) |
| 条目式 | 领导明确不要表格、要粘进邮件正文或聊天窗口、需要念读通顺的纯文字场合 | 需要逐项对照负责人与截止时间的跟踪场景 |
「条目式」与「信笺段落式」底层同为 letter 渲染,差别只在用户视角:前者是对「不要表格」这一诉求的直接回应,后者是对「信笺/公文风格」的回应。用户没有表格式顾虑、只说想要正式函件感时,优先给「信笺段落式」。
资源
scripts/
generate_minutes.py— 主链路。--style table|letter|grid(必填)+--max-chars {0|上限}(必填)+--data temp_data.json生成三种版式.docx;省略--data出空白模板(--company/--code/--topics可选)。漏传必填参数直接退出 30,可用--test-mode在回归时跳过校验render_minutes.py— 扩展链路。基于minutes.json(含gaps/sources/risks/next_meeting)渲染,会把「信息缺口」直接印在文档里。--format与--max-chars同为必填,同样支持--test-modecheck_output.py— 交付前自检:占位符残留、空章节、缺负责人/时间、版式结构完整性、字数是否落在--max-chars/--min-chars要求内。--format与--max-chars同为必填(不传--format会导致 D1/D2 静默跳过、输出假通过),同样支持--test-modetranscribe.py— 音频转写适配层。探测宿主是否已提供转写稿(环境变量 / 同名旁挂文件 /transcripts//raw/transcript.txt),命中则清洗采纳,未命中给出友好提示;支持.txt/.srt/.vtt/.json与超长分段。不含语音识别实现,缺依赖时不会报错media_probe.py— 探测媒体时长、音轨、分辨率,判断是否需要抽帧/分段messages.py— 全部对外话术的单一来源(缺失提示/错误提示/重试与分段说明),改文案只改这一处
references/
先看这两个:
examples.md— 完整用法示例。3 个端到端示例(录音全链路 / 模糊输入降级 / 失败与重试),含用户原话、逐轮回复、中间产物、脚本输出与交付话术。不确定某一步该输出什么时查这里interaction-protocol.md— 出稿前必须问清的版式与字数:四选项映射、追问话术、禁止动作、用户改主意时的处理
按需查阅:
field-extraction.md— 九类字段的完整表格与禁止项、分条归纳的正反例、五种断链形态media-intake.md— 四类模态的接入与识别流程、图片读图要点、说话人处理、素材合并顺序data-structure.md— 数据契约:meeting_info/discussion/decisions/todos简表与minutes.json全字段、字段别名、最小示例extraction-schema.md—minutes.json完整字段定义 + 提取规则 + 正反例 + 冲突处理quality-notes.md— 版式、排版、打印、交付话术规范;素材不足/冲突时的标准提示措辞format-table.md/format-letter.md/format-grid.md— 三种版式的详细格式要求(页面、字体字号、颜色、表格结构)faq-and-antipatterns.md— 反模式速查(症状/错误做法/正确做法/排查路径)与用户高频问答口径;出现「为什么这么要求」「上次怎么那样做」类追问时查此文件
assets/
minutes.sample.json— 完整示例数据(含 gaps/sources),可直接跑通三个版式minutes_template.docx— 本地备查,不随包分发。三版式共用样式底稿,仅供线下手动套用公司抬头/页眉页脚;代码不加载它(所有文档由Document()空白创建 + 代码设定版式),删掉不影响生成结果。平台上架禁传二进制文件,打包时会被自动排除。
快速自检
首次使用或环境变更后,执行以下命令确认渲染链路可用:
# 冒烟测试:三种版式各出一份 + 自检(--max-chars 0 = 用户未要求字数)
python scripts/generate_minutes.py --style table --max-chars 0 --data assets/minutes.sample.json -o ./t.docx
python scripts/check_output.py ./t.docx --format table --max-chars 0
python scripts/generate_minutes.py --style grid --max-chars 0 --data assets/minutes.sample.json -o ./g.docx
python scripts/check_output.py ./g.docx --format grid --max-chars 0
python scripts/render_minutes.py assets/minutes.sample.json --format table --max-chars 0 -o ./r.docx
python scripts/check_output.py ./r.docx --format table --max-chars 0 --structure render
# 批量回归 / 版式穷举:三个脚本都支持 --test-mode 跳过必填校验
# python scripts/generate_minutes.py --data x.json -o x.docx --test-mode
# --test-mode 会在 stderr 打印 [警告] TEST MODE:…,留痕可审计;正常出稿禁用。
预期输出 OK style=… 与 ✅ 自检通过。自检产物(./t.docx、./g.docx、./r.docx)生成在当前目录,确认通过后可直接删除。
check_output.py默认按generate_minutes.py的结构自检;render_minutes.py的产物要加--structure render- 空白模板自检要加
--blank(跳过内容底线与空单元格检查) - 网格大表式必须为横向 A4,且所有行带
cantSplit(防打印跨页断裂),自检会校验这两项 - 若报
缺少依赖 python-docx,执行pip install python-docx
从输入到输出的全链路实操演示
一次真实的、带对话的完整走查:素材只有一句极其模糊的口语转写,全程四步走完,最终产出带 ⚠️ 待确认 的可用文档。「我」是助手,「你」是用户。
第 1 步 · 用户输入:一句话的口语转写
> 那个啥,今天这个会咱们就定一下,下周让小王他们去搞那个项目,预算回头再说
这四类信息全都不合格:时间是「下周」(相对表述,落不到日期)、责任人是「小王他们」(落不到人)、预算是「回头再说」(等于没定)、会议本身的时间地点主持人一概没有。
第 2 步 · 我做什么:先提字段,再一次性把缺口问清
不猜、不换算、不拒绝出稿。提取到的只有两条待办,其余按「无」占位;然后在出稿前一并澄清,一条消息问完,不挤成多轮追问。开场先把结论摆出来,再逐项给选择:
> 我注意到时间、责任人和预算不明确,需要我帮您标记为待确认,还是您现在补充?
>
> 我梳理了一下,能确定的有两件事:启动项目、由「小王他们」推进;预算这次没定。具体是这 3 处:
> 1. 时间——「下周」我保持原话,标 ⚠️ 待确认,还是你现在给个具体日期?
> 2. 责任人——「小王他们」我保持原话,标 ⚠️ 需人工复核,还是你补到具体人名?
> 3. 预算——「回头再说」我记为「未讨论」并列入待确认事项,还是你补一句结论?
>
> 另外这份纪要还差 4 项:会议是什么时候开的、在哪开的(会议室 / 线上平台)、谁主持的和谁负责记录。为了让纪要更准确,可以直接告诉我这几项;或者我现在就按现有内容出一版,缺的几处先填「无」,你拿到后随手补上也可以。
>
> 顺带确认两件事:需要哪种版式?1. 表格式 2. 信笺式 3. 网格大表式 4. 条目式;字数有要求吗?
第 3 步 · 用户补充:只补了一部分
> 会议时间 10 月 20 日下午两点,主持人是我,记录也是我。预算按 50 万先报,小王具体是谁你标一下待确认就行。表格式,没字数要求。
关键点:用户只补了一部分,剩下的照旧不猜。 逐项落位:
| 项 | 用户补充后 | 怎么落地 |
|---|---|---|
| 会议时间 | 10月20日下午两点 |
绝对时间,不加任何标记 |
| 主持人 / 记录人 | 用户本人 | 直接写入 |
| 预算 | 50 万(原话「回头再说」,已按 50 万报批) |
照用户口述写,不推算 |
| 责任人 | 用户明确「标一下待确认」 | 仍记「小王他们」+ ⚠️ 需人工复核 |
| 截止时间 | 用户没提 | 仍记「下周」+ ⚠️ 待确认,不因补了会议时间就顺手把「下周」换算掉 |
| 会议地点 | 用户没提 | 填「无」,交付时点名提示 |
第 4 步 · 最终产出:带 ⚠️ 的成品文档
版式已确认(表格式)、字数无要求,直接出稿(--style table)。渲染后的正文关键段落——
会 议 纪 要
┌────────────┬───────────────────────────────────────────────┐
│ 会议主题 │ 项目启动会 │
│ 会议时间 │ 10月20日下午两点 │
│ 会议主持 │ 王×× │
│ 会议记录 │ 王×× │
│ 会议地点 │ 无 │
│ 参会人员 │ 小王他们 │
│ 会议内容 │ 1、新项目启动 │
│ │ 会上确定启动新项目,由小王他们负责推进。 │
│ │ 预算事项原话「回头再说」,本次按 50 万报批。│
│ │ 待办事项: │
│ │ 1、推进新项目(具体范围会上未说明) │
│ │ 负责人:小王他们(⚠️ 需人工复核) │
│ │ 截止:下周(⚠️ 待确认) │
│ │ 2、确定项目预算 │
│ │ 负责人:未指定(⚠️ 需人工复核) │
│ │ 截止:无 │
│ 会议决定 │ 1、启动新项目,由小王他们负责推进 │
└────────────┴───────────────────────────────────────────────┘
待确认事项
1、⚠️ 需人工复核 待办 1 负责人「小王他们」无法落实到具体人,请指定到人
2、⚠️ 待确认 待办 1 截止时间「下周」为模糊表述,请确认具体日期
3、⚠️ 需人工复核 待办 2 负责人「未指定」无法落实到具体人,请指定到人
自检结果(真实输出):
✅ 自检通过 (structure=sheet)
[WARN ] D4: 有 2 处「未指定」,行动项可能缺负责人或截止时间
[提示] 这份纪要还差一项:在哪开的(会议室 / 线上平台)。为了让纪要更准确,可以直接告诉我这几项;
或者我现在就按现有内容出一版,缺的几处先填「无」,你拿到后随手补上也可以。
统计: 段落 1 / 表格 2 / 空单元格 1 / 占位符 0 / 字数 350
结论: 可以交付
注意 结论 从「缺 4 项」升到了「可以交付」——用户补了时间与主持人,缺项自然减少,不需要我改话术。
这两处标记不是我手写贴上去的。 数据文件里存的就是原话 "owner": "小王他们"、"due": "下周",minutes_marks.py 在渲染时自己判定并加括注;文末「待确认事项」也是脚本自动汇总的——你补的信息进了正文,没补的信息留在标记里,两边不会打架。
三个版式都验证过,标注位置各自正确:信笺式落后写到 1.推进新项目(…)(负责人:小王他们(⚠️ 需人工复核),截止时间:下周(⚠️ 待确认));网格大表式在负责人列与截止列内各带标记。
交付话术:
> 表格式纪要出好了。有 3 处我按约定做了标记,没有替你定:
> 1. 「小王他们」——责任人还没落到具体人,标了 ⚠️ 需人工复核
> 2. 「下周」——截止时间还是原话,标了 ⚠️ 待确认
> 3. 预算——按你说的 50 万报了,但会上原话是「回头再说」,这版是按你口述的口径写的
>
> 会议地点你没有提,我先填了「无」,补一句我直接重出。
这个示例要说明的三件事
- 模糊输入不劝退:一句话也能出稿,缺的进「待确认事项」,不因为内容少就罢工。
- 澄清是一次性问清的:3 处模糊 + 4 项缺失 + 版式字数,一条消息说完,不来回挤牙膏。
- 补一半也不擅自推断:用户补了时间、没补地点,地点就是「无」;补了预算、没补截止,截止仍是
⚠️ 待确认。
> 更完整的三个端到端示例(含录音全链路、脏数据重试、长文本分段)见 references/examples.md。