nim-kb-search
NIM 知识库检索
CLI 触发标记
触发本 skill 时,第一行必须输出一行简短的标记,格式如下:
[nim-kb-search] 已触发 | 类型=<track_type> | 产品=<product> | 关键词=<keywords>
规则:
- 仅一行,不换行
track_type未确定时填待确认product未确定时填待确认关键词列举从用户描述中提取的主要检索词(错误码、API 名、功能关键词等)- 标记行之后继续输出知识库检索结果
知识库同步(每次检索前执行)
同步命令
KB_DIR="$HOME/nim-knowledge-base/rags/knowledge"
KB_REPO="https://github.com/19967431260/rags.git"
[ ! -d "$KB_DIR/.git" ] && git clone "$KB_REPO" "$KB_DIR" || (cd "$KB_DIR" && git pull origin master)
同步失败时继续使用本地缓存,结果末尾注明:⚠️ 知识库同步失败,结果基于本地缓存。
触发条件
触发词(用户明确发出以下指令时触发):
搜知识库 / 查历史案例 / 有没有类似问题 / 知识库里搜一下 / 查一下知识库 / 有没有相关记录
不触发:
- 用户未主动发出检索指令
- 本轮已检索且用户未提供新线索
检索类型自动判断(触发后根据当前问题上下文判定):
| 当前问题特征 | 检索类型 |
|---|---|
| 有报错 / 错误码 / 功能不生效 / 崩溃 / 超时 | 排查类 |
| 咨询接口用法 / 是否支持 / 如何实现 / 配置问题 | 咨询类 |
| 无法判断 | 两类都搜,结果合并展示 |
Workflow
Step 1:提取检索参数
从用户描述和上下文件中提取以下字段,未能明确的标记为 ?:
| 字段 | 说明 | 参照 |
|---|---|---|
track_type |
排查类 或 咨询类 |
有报错/异常→排查类;咨询→咨询类 |
product |
标准产品名 | 见下方产品识别规则 |
feature |
功能模块 | 如:消息收发 / 音视频通话 / 短信发送 |
platform |
客户端平台 | iOS / Android / Web / Flutter 等 |
sub_type |
细分类型 | 排查类:集成类/测试问题/使用问题/线上事故;咨询类:能力与边界/功能实现/接口用法/配置开通/需求梳理 |
tags_hint |
关键词集合 | 错误码、API名、功能词,3~6个 |
title_keywords |
标题分词 | 核心问题描述的分词 |
产品识别规则(优先级从高到低):
- 匹配别名关键词 → 推断标准产品名
| 标准产品名 | 别名 / 关键词 |
|---|---|
IM-SDK |
IM SDK、云信IM、即时通讯、NIM、消息云 |
IM-UIKit |
UIKit、UI组件、UI库、界面组件 |
RTC |
NERTC、音视频、实时音视频、视频通话、连麦、Wwise |
呼叫组件 |
呼叫、call kit、1v1通话、群组通话、CallKit |
NERoom |
房间组件、NERoom、多人房间、互动课堂 |
网易会议 |
会议、Meeting、视频会议、会议SDK |
短信 |
短信服务、SMS、验证码短信、通知短信、营销短信 |
智能体 |
情感陪伴智能体、AI智能体、对话AI、实时AI、情感陪伴 |
- 从技术词汇(API名称、错误码前缀、功能描述)推断
- 无法判断 → 全库扫描
Step 2:确定扫描路径
知识库根目录:~/nim-knowledge-base/rags/knowledge/
扫描路径(排查类 / 咨询类统一):
不区分排查类还是咨询类,递归扫描 rags/{product}/{feature}/ 目录下的所有 .md 文件(含该目录本级及任意深度子目录),由相似度计算决定结果排序。
等效命令:
find ~/nim-knowledge-base/rags/knowledge/{product}/{feature}/ -name "*.md"
{platform} 合法目录名(排查类文件所在子目录):iOS / Android / Web / Flutter / HarmonyOS / Windows / macOS / Linux / Node / Server / 通用
扫描范围降级策略:
按以下顺序逐级扩大,直到候选结果 ≥ 3 条或已到最宽范围为止:
| 级别 | 扫描范围 | 等效命令 |
|---|---|---|
| L1(默认) | {product}/{feature}/ 目录下所有 .md(含子目录) |
find ./{product}/{feature}/ -name "*.md" |
| L2 | {product}/ 目录下所有 .md(含子目录) |
find ./{product}/ -name "*.md" |
| L3 | 全库所有 .md,按 title_keywords 优先排序 |
find ./rags/ -name "*.md" |
每级扫描完成后统计相似度达标的候选数,不足 3 条则自动进入下一级,达到 3 条即停止降级。 最终输出时注明扫描级别,例:
(扫描范围:L2 - 跨平台)
Step 3:相似度计算
排查类(逐文件计算):
结论相似度 = Jaccard(root_cause + solution) # 两字段合并计算
| 结论相似度 | 现象相似度 = Jaccard(description) | 判定 |
|---|---|---|
| ≥ 0.60 | ≥ 0.55 | 【高度匹配】 |
| ≥ 0.60 | < 0.55 | 【可能相关】(现象不同但根因相同) |
| < 0.60 | — | 不展示 |
无法获取 root_cause(问题刚提出时)→ 改用:
Score = Jaccard(tags) × 0.6 + Jaccard(title) × 0.4,≥ 0.50 展示
咨询类(逐 entry 计算):
咨询相似度 = Jaccard(tags) × 0.6 + Jaccard(title) × 0.4
| 咨询相似度 | 判定 |
|---|---|
| ≥ 0.65 | 【高度匹配】 |
| 0.40–0.65 | 【可能相关】 |
| < 0.40 | 不展示 |
分词方式:以空格、标点及中文字符边界为分隔符
最多展示 5 条,按得分降序排列。
Step 4:输出结果
在回复开头输出检索结果,之后继续问题分析:
排查类结果格式:
📚 知识库检索结果(排查类,共 N 条)
────────────────────────────────
【高度匹配】{title}
平台:{platform} | 产品:{product} | 功能:{feature}
根因:{root_cause}
解决方案:{solution}
来源客户:{customers} | 更新:{updated}
【可能相关】{title}
平台:{platform} | 产品:{product}
根因:{root_cause}
────────────────────────────────
咨询类结果格式:
📚 知识库检索结果(咨询类,共 N 条)
────────────────────────────────
【高度匹配】{title}
产品:{product} | 功能:{feature} | 平台:{platform}
答案:{solution}
来源客户:{customers} | 问过 {frequency} 次
【可能相关】{title}
产品:{product} | 功能:{feature}
答案摘要:{solution 前50字}...
────────────────────────────────
未找到时:
📚 知识库检索结果:未找到相似历史记录,以下为新问题分析。
说明
- 只读操作,不写入任何文件
- 检索到【高度匹配】时,录入阶段(nim-kb-record / nim-kb-batch)走合并流程而非新建