欢迎 Star/Issue 谢谢喵~
本项目旨在构建一个闭环的音频推理系统。我们将检索器(Retriever)从一个静态的查表工具,升级为一个动态的代理(Agent)。系统不仅要“听见”音频,还要“理解”音频作为证据的效力。
graph TD
User[用户提问] --> Planner[QueryPlanner: 意图分解]
Planner -->|生成结构化查询| Search[检索执行]
subgraph "多尺度检索策略 (Coarse-to-Fine)"
Search --> Global[粗召回: 长窗口/语义向量]
Global --> Local[细定位: 短窗口/关键词]
Local --> Candidate[Top-K 候选片段]
end
Candidate --> Rerank[Evidence Reranker: 证据性重排]
Rerank -->|Top-N 高信度证据| Verifier[Verifier: 证据验证]
Verifier -->|证据充足| Generator[LLM 回答生成]
Verifier -->|证据冲突/缺失| Refine[Refine: 自我修正]
Refine -->|调整查询/扩大范围| Search
Refine -->|多次失败| Reject[拒答/请求澄清]
痛点解决:用户的问题往往是宏观的(如“昨天的会议里,产品经理对这功能态度如何?”),直接搜很难搜到。 技术方案:
- Prompt Engineering:让 LLM 输出 JSON 格式的检索计划。
- 多维解构:
- 语义查询:
vector_query: "产品经理 抱怨 功能" - 元数据过滤:
speaker: "Product_Manager",time_range: "2023-10-24" - 非语言线索:
audio_event: "Sigh" (叹气)或tone: "Angry"(需要音频编码器支持)
- 语义查询:
痛点解决:解决“切片太短无语境,切片太长稀释语义”的矛盾。 技术方案:
- 双层索引结构:
- L1 (语义层):60s 窗口,使用 CLAP 或 Whisper Encoder 提取 Embedding。用于定位“大致时间段”。
- L2 (细节层):5s-10s 窗口,包含详细 ASR 转录和细粒度音频特征。
- 检索逻辑:先在 L1 找到 Top-10 区域,展开这些区域的 L2 切片,进行精确匹配。
- 上下文融合:命中 L2 切片后,自动向前后扩展 5秒,形成一个完整的 Evidence Unit。
痛点解决:Top-K 看起来很像(关键词重合),但其实没包含答案。 技术方案:
- Cross-Encoder 重排模型:不仅仅计算
CosineSimilarity(Query, Audio),而是训练一个轻量级分类器输入(Question, Audio_Transcript),输出Score: 该片段包含答案的概率。 - 结构化输出:将音频转化为结构化证据包(Evidence Pack):
{ "timestamp": "04:12-04:25", "transcript": "虽然这很难,但考虑到成本,我们必须砍掉这个功能。", "audio_tags": ["speech", "serious_tone"], "relevance_score": 0.92 }
痛点解决:防止 LLM 强行回答(幻觉),实现“失败感知”。
音频往往存在“听不清”或“指代不明”的问题,我们需要引入视觉(Video)或文本上下文作为辅助。
- 视觉消歧:
- 当音频检索到“巨大的响声”时,检索同一时间戳的视频帧。LLM 通过视觉描述(Visual Captioning)判断是“关门声”还是“掉落声”,从而修正推理。
- 跨模态一致性校验:
- Verifier 不仅检查音频证据,还检查视频画面是否支持该音频结论。如果音频说“我把文件放桌上了”,但视频里手里没文件,系统应标注“可疑证据”。
除了常规的 Recall@K,我们引入以下指标:
- Evidence Support Score (ESS):人工或 GPT-4 打分。
- 检索到的片段是否包含了回答问题所需的充分且必要条件?(0-10分)
- Reasoning Hallucination Rate (RHR):
- 统计回答中包含的“事实陈述”有多少比例无法被检索到的音频片段支撑。
- Refusal Precision:
- 在故意给出的无法回答的问题(Unanswerable Questions)集合上,系统能否正确输出“无法回答”,而不是编造答案。
- Time-to-Evidence:
- 定位到关键证据的时间戳误差(是否精确到了秒级,而不是只给了个 5 分钟的文件)。