Files

146 lines
7.6 KiB
Markdown
Raw Permalink Normal View History

# 极致事件素材库 · WeKnora 容器交付说明 V1.0
> 一句话:容器已建好,11 张卡全部灌入并验证可检索。**唯一必须记住的参数是 `vector_threshold = 0.5`** —— 不传它(默认 0.7)口语问法几乎召不回来。
> 日期:2026-09-23 | 环境:本机 WeKnora 0.8.0(Docker,`localhost:31607`)
> 配套脚本:`tools/weknora-fit/5_build_event_lib.py`(建库+灌卡)、`6_threshold.py`(阈值扫描)
---
## 一、容器信息
| 项 | 值 |
|:--|:--|
| 库名 | **MCN极致事件素材库** |
| 库 ID | `e6772e41-7b72-499d-b46c-e5ca7c9d1740` |
| 类型 | **FAQ 型**(`type=faq`,一条目 = 一分块,不走文档分块器) |
| embedding | `03f0cf45-38dd-4330-aed9-38e394e66160`(BAAI/bge-m3,remote) |
| summary | `a2de7804-1a1b-4940-800a-bf877f64b5be`(glm-5.3-flash) |
| 索引策略 | `vector=true` / `keyword=true` / `graph=false` / `wiki=false` |
| faq_config | `index_mode=question_answer`、`question_index_mode=combined` |
| 条目数 | **11**(导入 11 / 成功 11 / 失败 0) |
| 地址 | `http://127.0.0.1:31607` | 鉴权头 `X-API-Key` |
> ⚠️ 建库时三件事必须一起给:`type=faq` + `embedding_model_id` + `indexing_strategy{vector,keyword}`。缺 embedding → 导入卡在 `processing/0%` 且 error 字段为空;缺 indexing_strategy → **入库 100% 成功但检索永远返回空**(静默失败)。
---
## 二、库内 11 条条目
| # | 事件卡 | 主标签(tag_name) | 答案长度 | 相似问 | 反例问 |
|:--:|:--|:--|:--:|:--:|:--:|
| 100000017 | 高温实物证言 · 手机壳被晒化 | 反常识 | 678 字 | 4 | 2 |
| 100000018 | 沙疗活埋 · 从挑战者到沙漠「炮塔」 | 反差 | 679 字 | 4 | 2 |
| 100000019 | 番茄牛腩(红烧牛腩) | 食材极致 | 978 字 | 4 | 2 |
| 100000020 | 蒜香辣鸡爪 | 难度极限 | 969 字 | 4 | 2 |
| 100000021 | 皮蛋炒饭 | 难度极限 | 955 字 | 4 | 2 |
| 100000022 | 「随地大小睡」 | 反常识 | 623 字 | 4 | 2 |
| 100000023 | 浴室盲拍 · 只拍门,只听惨叫 | 自嘲反差 | 621 字 | 4 | 2 |
| 100000024 | 「雷霆发型」怼脸 | 反差 | 576 字 | 4 | 2 |
| 100000025 | 端着饭追过 5 个空间 | 反差 | 677 字 | 4 | 2 |
| 100000026 | 「我还给你带瓶水」的预判 | 预见式服务 | 654 字 | 4 | 2 |
| 100000027 | 一阵凉风,执念光速漂移 | 反差 | 609 字 | 4 | 2 |
**标签分布**:反差 4 | 反常识 2 | 难度极限 2 | 自嘲反差 1 | 食材极致 1 | 预见式服务 1(全部为 **12 维词表原样值**,无自造词)
**标签 seq_id**(标签优先检索要用):反差 `10000009` | 反常识 `10000010` | 自嘲反差 `10000011` | 难度极限 `10000012` | 预见式服务 `10000013` | 食材极致 `10000014`
---
## 三、检索参数(本轮最重要的发现)
### 3.1 默认阈值 0.7 让口语问法基本召不回来
`SearchFAQEntries` 里 `if req.VectorThreshold <= 0: VectorThreshold = 0.7` —— **0.7 是硬编码默认值**,且 FAQ 检索恒为 `DisableKeywordsMatch: true`(**纯向量,关键词完全不参与**)。
阈值扫描(33 个探针 × 7 档阈值,脚本 `6_threshold.py`):
| 探针组 | 条数 | 0.7(默认) | **0.5** | 0.45 | 0.4 |
|:--|:--:|:--:|:--:|:--:|:--:|
| A 标准问原句 | 11 | 11 命中(各 1 条) | **11/11,top1 全对** | 同 | 同 |
| B 相似问原句 | 11 | 8 命中 / 3 条 0 | **11/11,top1 全对** | 同 | 同 |
| **C 未登录新口语问法** | 11 | **仅 1/11** | **11/11,top1 全对** | 11/11(召回满 5 条) | 同 |
> C 组才是 S7 的实际使用方式(说人话去要素材)。**0.7 下 10 条召不回来;0.5 下 11 条全中且 top1 就是期望的那张卡。**
### 3.2 推荐参数
| 场景 | 参数 |
|:--|:--|
| 常规检索 | `vector_threshold = 0.5`,`match_count = 3~5` |
| 要更多候选 | `vector_threshold = 0.45`(召回更满,top1 不变) |
| 圈定标签范围 | 加 `first_priority_tag_ids: [seq_id]`(0.5 阈值下工作正常,见 §3.3) |
### 3.3 标签优先检索实测(阈值 0.5)
| 标签(seq_id) | 限定后命中 | 库内该标签条目数 |
|:--|:--:|:--:|
| 反差(10000009) | 4 | 4 ✅ |
| 反常识(10000010) | 2 | 2 ✅ |
| 难度极限(10000012) | 2 | 2 ✅ |
| 自嘲反差(10000011) | 1 | 1 ✅ |
| 预见式服务(10000013) | 1 | 1 ✅ |
| 食材极致(10000014) | 1 | 1 ✅ |
> 0.7 阈值下这 6 项**全部返回 0** —— 说明标签优先的失败也不是标签机制的问题,同样是阈值。
---
## 四、调用方式
**只能用 HTTP API** —— MCP 通道暴露 40+ 工具但没有 FAQ / Tag 工具(`hybrid_search` 也不带 `tag_ids`)。
```python
import requests
BASE = "http://127.0.0.1:31607/api/v1"
H = {"X-API-Key": "<key>", "Content-Type": "application/json"}
KB = "e6772e41-7b72-499d-b46c-e5ca7c9d1740"
r = requests.post(f"{BASE}/knowledge-bases/{KB}/faq/search", headers=H, timeout=60, json={
"query_text": "找一条反差感强的事件,人物前面很狂、后面被打脸",
"match_count": 5,
"vector_threshold": 0.5, # ← 必须显式传,默认 0.7 召不回
# "first_priority_tag_ids": [10000009], # 可选:圈定「反差」范围
})
for e in r.json()["data"]:
print(round(e["score"], 4), e["tag_name"], e["answers"][0][:60])
```
**调用注意(踩坑记录)**:
1. `dry_run` 是**异步任务且占用导入通道** —— 紧接正式导入会 `400 已有导入任务进行中`。
2. 沙箱内 `curl localhost` 必须 `--noproxy '*'`,否则代理返回 502。
3. 导入是异步任务,要轮询 `/faq/import/progress/{task_id}` 等 `completed`。
---
## 五、字段映射(卡片 → FAQ 条目)
| 卡片字段 / 结构 | FAQ 条目字段 | 说明 |
|:--|:--|:--|
| 主检索意图(本轮设计) | `standard_question` | 一句话「我要什么素材」 |
| 其他问法(4 条/卡) | `similar_questions` | **唯一召回杠杆**(关键词不参与检索) |
| 不该命中的边界(2 条/卡) | `negative_questions` | 不入索引,用于界定 |
| **整张卡正文** | `answers[0]` | 不切分,576–978 字完整保留(原子性) |
| 主标签(12 维之一) | `tag_name` | 条目唯一标签,用于圈定范围 |
---
## 六、已知限制(如实说明)
| # | 限制 | 影响 |
|:--:|:--|:--|
| 1 | **条目单标签** | 次标签(如 T1 的 `视觉冲击`)只存在于答案正文,`tag_name` 只能是主标签 → 按次标签圈定做不到 |
| 2 | **关键词完全不参与检索** | 相似问里塞的「反常识 实物证言 手机壳晒化」这类关键词串**无效**;召回全靠向量语义 |
| 3 | `CustomMetadata` 不参与过滤 | 「铺垫量级=短 且 极致类型=反转」这类多字段硬过滤做不到 |
| 4 | **T3「石榴籽」未入库** | 按 4.4 条款属情绪效果、不设标签,故无卡无条目(正确行为,非遗漏) |
| 5 | 阈值 0.5 是**11 条样本的经验值** | 扩样本后需复扫(脚本可复用) |
| 6 | `MCN极致事件素材库` 与 `mcnvideoprompt` **互相独立** | 未混库;本轮未碰 `mcnvideoprompt` |
---
## 七、待定(需你决策)
| # | 事项 | 说明 |
|:--:|:--|:--|
| 1 | **技能是否接入** | 是否在 `7_生成短视频大纲.md` 的极致触点布位处加「素材检索入口(WeKnora FAQ 库,阈值 0.5)」——动了就是技能文件变更,需你确认 |
| 2 | 扩样本 | 33 条热门清单里还剩约 28 条未提炼;扩量后建议复扫阈值 |
| 3 | 次标签承载 | 若要按次标签圈定,需改为「按标签拆条目」或「标签名写入相似问(但关键词不参与,效果有限)」 |