Files
infra-docker-configs/servers/tools-pve/asr-pipeline/asrpipe/prompts.py
T
Codex 3c70861463
Build image / build (push) Canceled after 0s
Build ASR Pipeline / image (push) Canceled after 0s
feat(asr-pipeline): merge PR #1 webauth/CSRF/locking hardening and web_password fallback
2026-11-02 06:37:33 -08:00

189 lines
11 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
"""Prompt templates for the staged pipeline.
Kept in one module so wording changes are reviewable in isolation — prompt text is
the most-edited and least-typechecked part of the system.
"""
CLEAN_SYS = (
"你只做会议转写的去口语化和断句,不做事实判断、术语纠错或总结。"
)
CLEAN_RULES = """任务:对给定片段做「去口语化」。
只做三件事:
1. 删除无意义语气词、结巴和紧邻的机械重复。
2. 补标点,把明显破碎的口语整理成可读句子。
3. 保留原有说话人分段。
不要总结,不要纠正人名、术语或数字,不要增加解释。听不懂的词原样保留。
数字、英文、项目代号、【说话人】和 `[…重复噪声已折叠:…]` 必须保留。
只输出清洗后的正文。"""
NORMALIZE_SYS = (
"你是会议转写的实体、术语和数字规范化裁决器。只处理给出的候选,不做去口语化或总结。"
)
NORMALIZE_RULES = """任务:在清洗文本中裁决候选词并作最小修改。
- A 组映射已经由程序执行,不要撤销。
- B 组只有在整句语义、人物/公司/项目关系和近期语境共同支持时才替换。
- 多个候选无法区分时保留原词,紧跟 `[?候选A/候选B]`。
- 中文数字仅在类型和单位明确时转成阿拉伯数字;项目编号逐字转换,如“四幺八二”→“4182”。
- 数值、单位或身份不确定时保留原文并加 `[?…]`,不得猜测。
- 不增加候选清单和背景资料中没有的事实。
只输出规范化后的正文,保留全部【说话人】标签。"""
EVIDENCE_SYS = "你从一段会议转写中提取可追溯的事实卡片,不撰写纪要。"
EVIDENCE_PROMPT = """从下面片段提取值得进入会议草稿的关键信息。
保留:结论、决定、行动项、负责人、关键数字、争议、未决问题、重要关系和判断依据。
省略:寒暄、重复表态、无意义细节。
不得补充背景事实,不确定的主体或数字必须标“待确认”。
每条都带片段编号 `{chunk_id}`,格式:
- [片段 {chunk_id}] 类型|主体|事实或线索|置信度:明确/较可信/待确认
片段:
{body}"""
JUDGE_RULES = """附加任务:术语/人名校正裁决。
下面给出脚本按「发音相近 + 本场语境」自动圈出的**候选**(只是嫌疑,未必对)。
每个候选都带来源说明,括号里的含义:
- `已确认别名`:Kai 已经确认过的固定叫法或已知误识别映射。**证据最强**,若句子读得通就应当替换。
- `机构简称`/`去姓称名`/`称谓`:口语里的简称形式(如「迈威」指迈威生物、「光辉」指李光辉、
「老万」「万总」指姓万的人)。**这类是正常口语,不是错字**——判定为同一实体后直接用全名。
- `一字之差`/`同篇另一写法`:同一实体在本篇中的其他写法,通常是转写漂移,应统一。
- `X(本次在谈)`:该候选所属公司正是本次录音讨论的对象,是**强支持证据**。
- `X(近期相关)`:该公司近期与本人有往来,是弱支持证据。
候选分两组:
- **A 组「已确认映射」**:Kai 已人工核对的固定对应。只要句中该词确实指人/机构,**必须替换**,
不要保留原写法、不要加「疑似」、不要标 `[?…]`。这类是 ASR 的固定误识别或口语简称,
不是需要你判断的疑点。
- **B 组「待判断候选」**:只是嫌疑,按下面规则裁决。
逐条按**它所在的整句**判断:
- 如果原词在句中读得通(是常用词、副词、动宾结构),**保留原词**,不要改。
- 候选带「已确认别名」或带「(本次在谈)」支持、且句中指的确实是人/机构时,**应当替换为全名**,
不要因为"转写没明说"而回避——简称就是口语常态。
- 同一候选有多个可能人物时(例如「徐总」可能是三个人),**不要硬选**:保留原词并标注
`[?候选A/候选B]`,把判断留给后续环节。
- 其余拿不准的:保留原词,并在该词后紧跟标注 `[?候选词]`(例如 `元烨[?原液]`)。
- 标注了「此词本身是常用词」的,默认保留原词,除非句子完全读不通。
候选清单:
{candidates}"""
CONTEXT_FOR_CLEAN = """本场背景(来自既有笔记与长期记忆,仅供你判断术语与人名的写法,**不要**把这些内容写进输出):
{context}"""
KEYWORD_PROMPT = """从下面的会议转写摘选中,提取用于检索背景资料的关键词。
只要专有名词:人名、公司名、项目/产品代号、机构、专业术语。
转写有识别错误,可以给出你认为正确的写法。
输出一行,用空格分隔,最多 25 个词,不要任何其他内容。
转写摘选:
{sample}"""
# The provenance rule below exists because of a measured failure: with background
# context injected, drafts asserted context-derived facts as transcript facts
# (「谭凯(白帆生物总经理)」、「此项目负责人为 [[冯昆仑]](背景确认)」) even when the
# recording never said them. The facts were often correct, but a meeting note that
# cannot distinguish "said on the call" from "known from notes" is unsafe to finalize.
DRAFT_PROMPT = """你是会议录音整理助手,正在根据下方整理要点写出会议草稿。
严格遵循:
1. 只产出粗整理草稿,**不是**正式纪要。
2. 清楚区分三类信息:明确事实 / 讨论中的想法 / 推测·高不确定。
3. **出处标注(重要)**:本草稿的每一条断言都必须能追溯到来源。
- 来自本次转写的内容:正常写。
- 来自下方「本场背景」而转写中**没有**说到的内容(例如某人的职务、公司归属、
项目历史):必须加后缀 `〔背景〕`,并且**不得**写成「明确事实」。
- 你自己的推断:加后缀 `〔推断〕` 或写「疑似」。
- 绝不把背景知识或推断伪装成转写内容。转写里没说的职务、公司名、金额、日期,
一律不能不加标注地断言。
4. 用 [[双链]] 标注有把握的人物/公司/项目;不确定的用纯文本 + 「疑似」。
5. 转写中形如 `词[?候选]` 的标注表示清洗阶段无法确定的词,请结合全文语境判断,
并在「待确认」中列出。
6. 形如 `[…重复噪声已折叠:…]` 的标记表示该处录音是长段非语音噪声(保持音/静默),
不要当成内容;如影响理解可在「待确认」提一句。
7. 末尾必须有一节 `## 待你确认`,列出需要人工复核的关键不确定点(名词、说话人归属、
日期、金额、结构)。
7a. 正文标题后、议题正文前必须先写 `## 通话背景(待确认)`,用 2-4 句话概括:
通话类型、参与方、正在处理的事项、各方关系。只写本次转写能支持的内容;推断必须
明标「疑似」。这段会先交给用户判断背景是否靠谱,以及是否值得携带正确背景重跑。
**结构要求(按议题归拢,不要平铺)**:
8. 正文按**议题**分节(一、二、三…),一个议题一节。每节内部用这个顺序:
先一句「结论/当前状态」,再列支撑事实,最后写「待办/下一步」(如果有)。
同一议题的事实必须收在同一节,不要因为在录音里出现的先后不同就拆成多条平行 bullet。
9. 事实合并:同一件事的多次提及、同一金额/时间的重复确认、同一人的多轮补充,
**合并成一条**并保留关键数字与限定条件,不要逐句罗列。
单节内的 bullet 控制在 7 条以内;超出说明该拆成子议题或该合并。
10. 每条 bullet 只讲一件事,避免「A,同时 B,另外 C」的堆叠长句。
**关于人名与简称(重要)**:
11. 转写里的简称、称谓、老X/X总/X博就是口语常态,不是缺陷。若上下文足以确定指谁
(例如正在谈某公司、而背景里该公司只有一位对应角色的人),**直接写全名并加 [[双链]]**,
不要写成「具体身份不确定,需人工核实」。这类过度回避会让草稿失去价值。
12. 只有在**真的存在多个候选且无法区分**时才标「疑似」,并把候选一起列出
(例如「徐总(疑似 [[徐劲前]] 或 [[邹洵]])」),而不是笼统写「身份不明」。
13. 判定简称指向谁时使用背景里的任职信息,这属于**辨识**而非越界断言,
不需要加〔背景〕;但如果你要额外陈述这个人的职务、公司归属本身,那就要加〔背景〕。
14. 对匿名说话人,除非整理要点已经给出有证据的候选,否则只写“身份待确认”;
不要从背景中枚举可能的人名让用户猜。
15. 正文和标题不要出现「卡片」「提示词」「系统指令」「粗整理」这些内部说法。
记录里没有的信息写「记录未写明」,不要写「卡片未提供」或「卡片提及」。
标题用业务名称,不要带「草稿」二字。
{speaker_note}
{context}
frontmatter 严格用下列字段:
---
date: {date}
type: minutes
tags: [会议纪要, 草稿, 待确认]
source: 录音转录
source_detail: {source_detail}
status: 草稿待确认
people: [有把握的人名…]
companies: [有把握的公司…]
transcript: {transcript}
{extra_fm}---
整理要点:
{body}
只输出 markdown 草稿全文,不要任何额外说明。"""
SPEAKER_NOTE = {
"qwen3cam": (
"转写来自 Qwen3-ASR + CAM++ 分角色 + 声纹:\n"
"- 中文真名的说话人是**声纹已确认**的,直接用,不要写「疑似」。\n"
"- `speaker_N` 是声纹未命名的说话人,按内容/口吻推断是谁并标「疑似」。\n"
"- 不同 speaker_N 是不同真人(CAM++ 已分),但可能过度聚类(同一人被拆成多个 N),"
"按内容合并同一真人。\n"
"- frontmatter 的 people 优先填**声纹命名的真人**。"),
"soniox": (
"转写来自 Soniox 线上分角色模型:\n"
"- `speaker_N` 为自动区分的说话人标签,按内容与背景推断身份并标「疑似」,"
"待人工在 Web 审核中确认。"),
"openai": (
"转写来自 OpenAI Transcribe 模型:\n"
"- 若含 `speaker_N` 标签,为单场自动区分的说话人,按内容推断身份并标「疑似」;"
"若无说话人标签则按内容推断发言归属。"),
"gemini": (
"转写来自 Gemini 3.5 Transcribe 模型:\n"
"- 按内容推断发言归属,不要臆造未出现的 speaker 标签。"),
"grok": (
"转写来自 Grok Voice Transcribe 2.0 分角色模型:\n"
"- `speaker_N` 为自动区分的说话人标签,按内容推断身份并标「疑似」。"),
"vibevoice": "转写带 S# 说话人标签,仅作软提示,块间编号不保证一致。",
"qwen3-plain": "转写**无说话人信息**,据内容推断发言归属,不要臆造 speaker 标签。",
}