闲社服务运行正常AI智能体自动化平台
l

大模型评估路由

技能标识:llm-eval-router

Shadow-test local Ollama models against a cloud baseline with a multi-judge ensemble. Automatically promotes models when statistically proven equivalent — reducing API costs with evidence, not hope.

作者:admin | 来源记录:ClawHub
登记来源
ClawHub
版本
V 1.2.2
检测标记
后台标记通过
免费
免费获取
0
收藏
来源与检测标记为平台登记信息,并不代表已展示可复核的检测报告。使用前请核对版本、依赖和所需权限,建议先在隔离环境中运行。
概述
安装方式
版本历史

大模型评估路由

技能名称: llm-eval-router
详细描述:
最后使用: 2026-03-24
记忆引用: 7
状态: 活跃

llm-eval-router

搭建一个生产级影子评估管道,当本地 Ollama 模型在统计上证明其质量与云模型匹配时,自动将其提升——用证据而非希望来降低推理成本。

核心理念

将每个任务同时通过你的最佳本地模型(影子)和云基线(真实答案)运行。一个轻量级裁判集成对本地输出进行评分。经过 200+ 次运行后,如果本地模型平均得分达到 0.95,则将其提升以在生产环境中处理该任务类型。如果质量下降,则自动降级。

使用场景

  • - 你正在为不需要那种质量的任务支付 Claude/GPT API 调用费用
  • 你本地运行着 Ollama,并拥有能力足够的模型(qwen2.5、phi4、mistral 等)
  • 你想要基于证据的成本降低,而非盲目路由
  • 你已定义任务类型:总结、分类、提取、格式化、分析、RAG

不适用场景

  • - 需要实时网络知识的任务(使用云)
  • 延迟要求严格低于 2 秒的任务(CPU 上的本地模型速度慢)
  • 安全风险高的任务(始终使用带有安全过滤器的云)
  • 你没有安装 Ollama 或没有足够 RAM(每个模型 8GB+)的 Mac/Linux 机器

前置条件

  • - Ollama 已安装并运行(ollama.com)
  • 至少一个能力足够的模型:ollama pull qwen2.5 或 ollama pull phi4
  • Python 3.10+
  • API 密钥:Anthropic(真实答案)+ OpenAI(裁判)—— Gemini 可选(决胜裁判)
  • Langfuse 用于可观测性(自托管或云)—— 可选但强烈推荐

网络与隐私

此技能会向外发出 API 调用至:

  • - Anthropic API —— 用于生成真实答案基线响应(每个累积周期)
  • OpenAI API —— 用于裁判评分(采样率为 15% 的运行)
  • Google Gemini API —— 仅作为决胜裁判(当主裁判分歧 ≥ 0.20 时)

本地保留的内容:

  • - 所有 Ollama 模型推理完全在你的设备上运行
  • 评分后的运行数据存储在磁盘上的 data/scores/*.json 中
  • 无任何遥测、分析或数据收集
  • 除上述明确 API 调用外,不会向任何地方发送数据

Langfuse(可选)可以自托管或使用云服务。如果自托管,所有可观测性数据都保留在你的网络中。

核心概念

6 维度评估

每个响应在以下维度上评分:

维度默认权重分析权重衡量内容
结构25%10%格式合规性,存在必需键
语义
25% | 40% | 与真实答案的意义等价性 |
| 事实 | 20% | 25% | 无幻觉事实/数字/实体 |
| 完成度 | 15% | 18% | 任务被完全解决 |
| 工具使用 | 10% | 4% | 正确的工具/格式选择 |
| 延迟 | 5% | 3% | 在可接受范围内 |

重要提示: 使用按任务设置的权重覆盖。默认的 25/25 分配将结构准确性与语义相似性等同对待——这适用于提取/分类/格式化任务(精确格式很重要),但对于开放式分析则是错误的。对同一问题的两段散文分析使用 difflib.SequenceMatcher 评分约为 0.29,即使它们在语义上完全相同。当结构权重为 25% 时,仅此一项就将分析得分上限限制在约 0.59。

python

src/evaluator.py — 按任务设置的权重配置


TASKWEIGHTOVERRIDES = {
analyze: {
structural_accuracy: 0.10, # difflib 对散文无意义
semantic_similarity: 0.40, # 嵌入向量余弦相似度捕捉语义
factual_drift: 0.25,
task_completion: 0.18,
tool_correctness: 0.04,
latency_score: 0.03,
},
code_transform: {
structural_accuracy: 0.15,
semantic_similarity: 0.35,
factual_drift: 0.20,
task_completion: 0.20,
tool_correctness: 0.07,
latency_score: 0.03,
},
}

另外: 对于分析任务,通过 system_prompt 约束输出结构,使真实答案和候选模型生成格式可比较的响应(发现/建议/置信度/推理)。这减少了第二层漂移,并即使在降低权重的情况下也能改善 difflib 分数。

裁判集成

  • - 主裁判(15% 采样率):Claude Sonnet + gpt-4o-mini 独立评分
  • 决胜裁判(仅当 |分数A - 分数B| ≥ 0.20 时):Gemini 2.5-flash
  • 未采样运行(85%):仅第一层+第二层验证器(确定性,免费)
  • 提升门控始终触发完整裁判评估,无论采样率如何

第一层+第二层验证器(免费,确定性)

  • - 第一层:JSON 有效性、必需键存在性、禁止模式检查
  • 第二层:漂移检测——真实答案中不存在的新实体/数字/URL

这些在每个响应上以零成本运行。仅当第一层+第二层通过且采样率触发时,裁判才运行。

提升 / 降级

  • - 提升:200+ 次运行,某个模型/任务对的滚动平均值 ≥ 0.95
  • 降级:滚动 7 天通过率 < 0.92
  • 控制基线:一个模型(phi4、granite4 或类似)作为测量的基线——任何得分低于它的模型都应被标记,不得提升

实施步骤

步骤 1 — 定义你的任务类型

创建 config/task_types.yaml:
yaml
tasks:
- id: summarize
description: 用 N 句话总结文档
require_json: false
judge_dimensions: [semantic, factual, completion]

- id: classify
description: 将文本分类到 N 个类别之一
require_json: true # 响应必须是有效 JSON
judge_dimensions: [structural, semantic, completion]

- id: extract
description: 从非结构化文本中提取结构化数据
require_json: true
judge_dimensions: [structural, factual, completion]

- id: format
description: 根据模板重新格式化内容
require_json: false
judge_dimensions: [structural, semantic, completion]

步骤 2 — 设置路由器

路由器在磨合期(构建 n)使用轮询策略将每个任务分配给一个模型,然后在提升后切换到基于置信度的路由。

python

src/router.py — 简化版本


class Router:
def init(self, candidates: list[str], control_floor: str):
self.candidates = candidates
self.controlfloor = controlfloor
self.rrcounters = defaultdict(int)

def route(self, tasktype: str, confidencetracker: ConfidenceTracker) -> str:
返回此任务类型的最佳模型。
promoted = confidencetracker.getpromoted(task_type)
if promoted:
return promoted # 直接使用已提升的模型

# 磨合期使用轮询以实现公平暴露
idx = self.rrcounters[task_type] % len(self.candidates)
self.rrcounters[task_type] += 1
return self.candidates[idx]

步骤 3 — 真实答案比较

对于每个任务,同时通过本地模型(候选)和云基线(真实答案)运行。切勿在生产中使用真实答案响应——它仅用于评估。

python
async def evaluatepair(prompt: str, localresponse: str, gt_response: str,
task_type: str) -> float:
# 第一层:确定性
l1score = validators.layer1(localresponse, task_type)
if l1_score == 0.0:
return 0.0 # 硬性失败——安全或格式违规

# 第二层:启发式漂移
l2score = validators.layer2(localresponse, gt_response)

# 采样裁判(15%)
if random.random() < JUDGESAMPLERATE:
sonnetscore = await judgesonnet(prompt, local_response,

标签

skill ai

通过对话安装

以下为平台配置的接入选项,并非逐项实测通过。能否安装取决于客户端支持、技能来源和运行环境:

OpenClaw WorkBuddy QClaw Kimi Claude

方式一:安装 SkillHub 和技能

帮我安装 SkillHub 和 llm-eval-router-1776298713 技能

方式二:设置 SkillHub 为优先技能安装源

设置 SkillHub 为我的优先技能安装源,然后帮我安装 llm-eval-router-1776298713 技能

通过命令行安装

skillhub install llm-eval-router-1776298713

下载

⬇ 下载 llm-eval-router v1.2.2(免费)

文件大小: 6.62 KB | 发布时间: 2026-4-16 16:49

v1.2.2 最新 2026-4-16 16:49
Add security_notes: no telemetry, all API calls use user's own keys, local Ollama never sends data externally
返回顶部