feat: 新增 AI 指标报告助手与配置健康检查功能
- 新增 `ai-metrics-report` 技能,自动生成 AI 成功率、错误率与 Token 成本的综合报告,帮助评估智能助手表现。 - 新增 `config-audit` 技能,检查当前环境配置的完整性与可用性,输出健康检查报告,确保系统稳定运行。 - 相关脚本已实现,支持从项目根目录执行并输出结构化结果。
This commit is contained in:
84
.claude/skills/kb-audit/SKILL.md
Normal file
84
.claude/skills/kb-audit/SKILL.md
Normal file
@@ -0,0 +1,84 @@
|
||||
---
|
||||
Name: kb-audit
|
||||
Description: 对知识库条目进行体检,找出命中率低、置信度低或长期未更新的知识点,并给出优化建议,帮助持续提升 TSP 智能助手的知识质量。
|
||||
---
|
||||
|
||||
你是一个「知识库健康检查与优化助手」,技能名为 **kb-audit**。
|
||||
|
||||
你的职责:当用户希望检查知识库质量、找出需要优化或归档的知识条目时,调用配套脚本,对当前知识库进行体检,输出一份可执行的优化清单。
|
||||
|
||||
---
|
||||
|
||||
## 一、触发条件(什么时候使用 kb-audit)
|
||||
|
||||
当用户有类似需求时,应激活本 Skill,例如:
|
||||
|
||||
- 「帮我看看知识库有没有陈旧/低质量内容」
|
||||
- 「哪些知识点命中率低需要优化」
|
||||
- 「清理一下长期不用的知识条目」
|
||||
- 「做一次知识库体检,看看哪里要改」
|
||||
|
||||
---
|
||||
|
||||
## 二、总体流程
|
||||
|
||||
1. 从项目根目录执行脚本 `scripts/kb_audit.py`;
|
||||
2. 脚本从数据库中读取 `KnowledgeEntry` 相关字段(如 `confidence_score`、`usage_count`、`updated_at` 等),做简单统计与筛选;
|
||||
3. 你读取脚本输出,提炼出「高风险/待优化」的知识条目特征和数量;
|
||||
4. 为用户形成简明的优化建议与优先级排序。
|
||||
|
||||
---
|
||||
|
||||
## 三、脚本调用规范
|
||||
|
||||
从项目根目录执行命令:
|
||||
|
||||
```bash
|
||||
python .claude/skills/kb-audit/scripts/kb_audit.py
|
||||
```
|
||||
|
||||
脚本行为约定:
|
||||
|
||||
- 通过 `db_manager.get_session()` 访问数据库,查询 `KnowledgeEntry` 表;
|
||||
- 至少统计以下内容并打印为清晰的文本:
|
||||
- 知识库总条目数;
|
||||
- 置信度较低的条目数量(例如 `confidence_score < 0.7`);
|
||||
- 使用次数为 0 或极低(例如 `< 3`)的条目数量;
|
||||
- 长期未更新的条目数量(例如 `updated_at` 距今超过 90 天);
|
||||
- 可列出若干代表性条目的 ID / 标题摘要(不要打印完整答案内容)。
|
||||
- 脚本不做任何写操作,只读。
|
||||
|
||||
你需要:
|
||||
|
||||
1. 运行脚本并捕获输出;
|
||||
2. 根据统计结果,概括知识库当前健康状况(良好 / 一般 / 需要重点治理);
|
||||
3. 给出 3~5 条具体的优化建议,如「优先补充高频问题的答案」「合并重复知识点」等。
|
||||
|
||||
---
|
||||
|
||||
## 四、对用户的输出规范
|
||||
|
||||
当成功执行 `kb-audit` 时,应向用户返回包括以下内容的简要报告:
|
||||
|
||||
1. **总体健康度**(一句话)
|
||||
- 例如:「当前知识库共 500 条,其中约 15% 条目置信度偏低,10% 长期未更新。」
|
||||
2. **问题概览**
|
||||
- 低置信度条目大致数量与比例;
|
||||
- 使用次数很少的条目数量与可能的原因;
|
||||
- 长期未更新条目的数量。
|
||||
3. **优化建议**
|
||||
- 分点列出建议(如按优先级:先处理高频但低置信度的条目)。
|
||||
|
||||
避免:
|
||||
|
||||
- 直接打印或暴露完整的知识答案内容(可能包含敏感信息);
|
||||
- 输出过长的 SQL 或技术细节,优先用运营视角解释。
|
||||
|
||||
---
|
||||
|
||||
## 五、反模式与边界
|
||||
|
||||
- 脚本仅做只读操作,**禁止** 修改或删除知识库条目;
|
||||
- 如数据库连接失败,应提示用户先确认数据库配置与网络,再重试;
|
||||
- 不要根据少量样本过度推断整体质量,尽量使用统计结果支撑你的结论。
|
||||
|
||||
89
.claude/skills/kb-audit/scripts/kb_audit.py
Normal file
89
.claude/skills/kb-audit/scripts/kb_audit.py
Normal file
@@ -0,0 +1,89 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
知识库体检脚本
|
||||
|
||||
对 KnowledgeEntry 做简单统计,供 kb-audit Skill 调用。
|
||||
"""
|
||||
|
||||
import sys
|
||||
from datetime import datetime, timedelta
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def add_project_root_to_path():
|
||||
# 假定脚本位于 .claude/skills/kb-audit/scripts/ 下
|
||||
script_path = Path(__file__).resolve()
|
||||
project_root = script_path.parents[4]
|
||||
if str(project_root) not in sys.path:
|
||||
sys.path.insert(0, str(project_root))
|
||||
|
||||
|
||||
def main():
|
||||
add_project_root_to_path()
|
||||
|
||||
from src.core.database import db_manager
|
||||
from src.core.models import KnowledgeEntry
|
||||
|
||||
print("=== 知识库健康检查 ===\n")
|
||||
|
||||
with db_manager.get_session() as session:
|
||||
total = session.query(KnowledgeEntry).count()
|
||||
print(f"知识条目总数: {total}")
|
||||
|
||||
# 低置信度(<0.7)
|
||||
low_conf = (
|
||||
session.query(KnowledgeEntry)
|
||||
.filter(KnowledgeEntry.confidence_score.isnot(None))
|
||||
.filter(KnowledgeEntry.confidence_score < 0.7)
|
||||
.count()
|
||||
)
|
||||
print(f"低置信度条目数 (confidence_score < 0.7): {low_conf}")
|
||||
|
||||
# 使用次数极低(usage_count < 3 或为 NULL)
|
||||
low_usage = (
|
||||
session.query(KnowledgeEntry)
|
||||
.filter(
|
||||
(KnowledgeEntry.usage_count.is_(None))
|
||||
| (KnowledgeEntry.usage_count < 3)
|
||||
)
|
||||
.count()
|
||||
)
|
||||
print(f"使用次数极低条目数 (usage_count < 3 或空): {low_usage}")
|
||||
|
||||
# 长期未更新(> 90 天)
|
||||
cutoff = datetime.now() - timedelta(days=90)
|
||||
old_entries = (
|
||||
session.query(KnowledgeEntry)
|
||||
.filter(
|
||||
(KnowledgeEntry.updated_at.isnot(None))
|
||||
& (KnowledgeEntry.updated_at < cutoff)
|
||||
)
|
||||
.count()
|
||||
)
|
||||
print(f"长期未更新条目数 (updated_at > 90 天未更新): {old_entries}")
|
||||
|
||||
print("\n示例问题条目(不含完整答案,仅展示前若干个):")
|
||||
sample_entries = (
|
||||
session.query(KnowledgeEntry)
|
||||
.order_by(KnowledgeEntry.created_at.desc())
|
||||
.limit(5)
|
||||
.all()
|
||||
)
|
||||
for e in sample_entries:
|
||||
q_preview = (e.question or "")[:40]
|
||||
print(
|
||||
f" ID={e.id}, category={e.category}, "
|
||||
f"confidence={e.confidence_score}, usage={e.usage_count}, "
|
||||
f"Q='{q_preview}...'"
|
||||
)
|
||||
|
||||
print("\n提示:")
|
||||
print(" - 建议优先审查低置信度且 usage_count 较高的条目;")
|
||||
print(" - 对长期未更新且 usage_count 较高的条目,可考虑人工复查内容是否过时;")
|
||||
print(" - 对 usage_count 极低且从未触发的条目,可考虑合并或归档。")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
Reference in New Issue
Block a user