SQLite 持久连接 — sandbox 不再每次查询开关连接,改为 __init__ 时建连、close() 时释放

Explorer 的 system prompt 明确告知 sandbox 规则 — "每条 SQL 必须包含聚合函数或 LIMIT",减少 LLM 生成违规 SQL 浪费轮次
LLM 客户端单例 — 所有组件共享一个 openai.OpenAI 实例,不再各建各的
sanitize 顺序修复 — 小样本抑制放在 float round 之前,避免被 round 干扰
quick_detect 从 O(n²) 改为 O(n) — 按列聚合一次,加去重,不再对每行重复算整列统计
历史上下文实际生效 — get_context_for 的结果现在会注入到 Explorer 的初始 prompt 里,多轮分析时 LLM 能看到之前的发现
This commit is contained in:
2026-03-20 13:20:31 +08:00
parent 96927a789d
commit b7a27b12bd
39 changed files with 2637 additions and 1133 deletions

View File

@@ -0,0 +1,22 @@
{
"name": "工单处理效率分析",
"description": "分析不同问题类型和模块的工单关闭时长,识别处理瓶颈。",
"tags": [
"关闭时长",
"问题类型",
"模块",
"效率"
],
"preset_queries": [
{
"purpose": "计算每个问题类型的平均关闭时长,识别处理最慢的问题类型。",
"sql": "SELECT 问题类型, ROUND(AVG(关闭时长_天), 2) AS 平均关闭时长 FROM tickets GROUP BY 问题类型 ORDER BY 平均关闭时长 DESC LIMIT 10"
},
{
"purpose": "计算每个模块的平均关闭时长,识别处理最慢的模块。",
"sql": "SELECT 模块, ROUND(AVG(关闭时长_天), 2) AS 平均关闭时长 FROM tickets GROUP BY 模块 ORDER BY 平均关闭时长 DESC LIMIT 10"
}
],
"exploration_hints": "查看平均关闭时长高的问题类型和模块,结合跟踪记录和处理过程,分析是否存在流程问题或资源分配不均。关注关闭时长分布的异常值。",
"placeholders": {}
}

View File

@@ -0,0 +1,22 @@
{
"name": "工单来源与状态分布",
"description": "分析不同来源的工单状态分布,评估渠道效果。",
"tags": [
"来源",
"工单状态",
"分布",
"渠道"
],
"preset_queries": [
{
"purpose": "统计每个来源的工单数量及状态分布。",
"sql": "SELECT 来源, 工单状态, COUNT(*) AS 工单数量 FROM tickets GROUP BY 来源, 工单状态 ORDER BY 来源, 工单状态"
},
{
"purpose": "计算每个来源的工单关闭比例。",
"sql": "SELECT 来源, ROUND(SUM(CASE WHEN 工单状态 = 'close' THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2) AS 关闭比例 FROM tickets GROUP BY 来源 ORDER BY 关闭比例 DESC"
}
],
"exploration_hints": "比较不同来源的关闭比例,识别效果最佳的渠道。分析状态为'temporary close'的工单特征,如问题类型或责任人,以优化处理流程。",
"placeholders": {}
}

View File

@@ -0,0 +1,22 @@
{
"name": "责任人绩效分析",
"description": "分析不同责任人的工单处理数量和平均关闭时长。",
"tags": [
"责任人",
"绩效",
"处理数量",
"关闭时长"
],
"preset_queries": [
{
"purpose": "统计每个责任人的工单处理数量。",
"sql": "SELECT 责任人, COUNT(*) AS 处理工单数量 FROM tickets GROUP BY 责任人 ORDER BY 处理工单数量 DESC LIMIT 10"
},
{
"purpose": "计算每个责任人的平均关闭时长。",
"sql": "SELECT 责任人, ROUND(AVG(关闭时长_天), 2) AS 平均关闭时长 FROM tickets GROUP BY 责任人 ORDER BY 平均关闭时长 DESC LIMIT 10"
}
],
"exploration_hints": "结合处理数量和平均关闭时长,评估责任人的效率。关注处理数量高但关闭时长也高的责任人,可能存在工作负荷过重或技能不足的问题。",
"placeholders": {}
}

View File

@@ -0,0 +1,22 @@
{
"name": "车型与问题关联分析",
"description": "分析不同车型的工单问题类型分布,识别车型特有问题。",
"tags": [
"车型",
"问题类型",
"关联",
"分布"
],
"preset_queries": [
{
"purpose": "统计每个车型的工单数量及主要问题类型。",
"sql": "SELECT 车型, 问题类型, COUNT(*) AS 工单数量 FROM tickets GROUP BY 车型, 问题类型 ORDER BY 车型, 工单数量 DESC"
},
{
"purpose": "计算每个车型的平均关闭时长,识别处理难度高的车型。",
"sql": "SELECT 车型, ROUND(AVG(关闭时长_天), 2) AS 平均关闭时长 FROM tickets GROUP BY 车型 ORDER BY 平均关闭时长 DESC LIMIT 10"
}
],
"exploration_hints": "分析特定车型的高频问题类型,结合问题描述和跟踪记录,识别车型设计或软件问题。关注平均关闭时长高的车型,分析是否存在共性问题。",
"placeholders": {}
}

View File

@@ -0,0 +1,22 @@
{
"name": "时间趋势分析",
"description": "分析工单创建和关闭的时间趋势,识别高峰期和处理延迟。",
"tags": [
"时间趋势",
"创建日期",
"关闭日期",
"高峰期"
],
"preset_queries": [
{
"purpose": "统计每月创建的工单数量,识别高峰期。",
"sql": "SELECT SUBSTR(创建日期_解析, 1, 7) AS 月份, COUNT(*) AS 创建工单数量 FROM tickets GROUP BY 月份 ORDER BY 月份"
},
{
"purpose": "计算每月关闭的工单平均关闭时长,识别处理延迟趋势。",
"sql": "SELECT SUBSTR(关闭日期_解析, 1, 7) AS 月份, ROUND(AVG(关闭时长_天), 2) AS 平均关闭时长 FROM tickets WHERE 关闭日期_解析 IS NOT NULL GROUP BY 月份 ORDER BY 月份"
}
],
"exploration_hints": "比较创建高峰期和关闭时长趋势,分析是否存在资源调配问题。关注特定月份的异常值,如关闭时长突然增加,结合跟踪记录查找原因。",
"placeholders": {}
}