你正在 进阶版 · ⚖️ 审美工作室 · ← 回到学院 · 进阶版主页 · 总入口

← 十二个项目

项目 11 · 构建你自己的判官

用本地 Qwen / DeepSeek 做 LLM-as-judge 系统。给它你的评分标准(项目 10 的 schema),让它对一组作品自动打分。这是把审美外化成系统的核心。

怎么算"成"?

判官评 20 件作品,与你自己的直觉评分相关性 ≥ 0.7。差距大的那部分,要么帮你发现 schema 的盲点,要么挑战你自己的直觉。

步骤 1 · 实现判官

// src/judge.ts
import { ask } from './ollama';

export interface Verdict {
  scores: Record<string, number>;
  reasons: Record<string, string>;
  total: number;
}

export async function judge(work: string, rubric: any): Promise<Verdict> {
  const prompt = `
你是一个审美评判系统。
评分标准如下(JSON Schema):
${JSON.stringify(rubric, null, 2)}

请对下面这件作品按每条 0–10 打分,每条给一句话理由。
作品:
"""
${work}
"""

只输出 JSON,格式:
{ "scores": { ... }, "reasons": { ... } }
`;
  const raw = await ask(prompt);
  const parsed = JSON.parse(raw);  // 要做错误处理
  parsed.total = Object.values(parsed.scores).reduce((a:any,b:any)=>a+b, 0) as number;
  return parsed;
}

步骤 2 · 用 20 件作品测试

选 20 件作品 —— 既有你觉得好的,也有你觉得普通的。先自己盲打一遍分(不让判官影响你)。然后让判官跑。

步骤 3 · 算相关性

function correlation(yours: number[], judges: number[]): number {
  // Pearson 相关系数
  const n = yours.length;
  const sumYours = yours.reduce((a,b)=>a+b);
  const sumJudge = judges.reduce((a,b)=>a+b);
  // ...(标准实现)
}

0.7 以上算判官比较吻合你;0.7 以下,需要分析为什么不一致。

步骤 4 · 改 rubric 或改自己的直觉

不一致的地方,是最有信息量的。两种可能:

← 上一个大压轴 →

工程测验 什么是「LLM-as-judge」?
下面哪个解释最准确?
解释:『LLM-as-judge』是一个技巧:与其让人工评估所有输出(太慢),不如用 prompt 工程让 LLM 按照你定好的标准去评估。速度快、成本低、可复现。缺点是『judge LLM 本身也会出错』,所以要验证一下 judge 的准确性。
分步引导 实现一个「LLM Judge」的 4 步
  1. 定义评估标准。写下你要评估什么:准确性、危害性、风格一致性等。每个标准 1–2 句话。
    看参考

    例:『准确性』= 『回复包含的信息和事实是否正确』;『危害性』= 『回复有没有教用户做坏事』。

  2. 写 judge prompt。让 LLM 按照标准给分。prompt 里要有「清晰的评分规则」和「几个例子」。
    看参考

    例:```\n评估这个回复的准确性。\n1 分 = 完全错误\n5 分 = 完全正确\n例子:...```

  3. 收集『金标』(人工标注的标准答案)。抽 50–100 个例子,让人工按照 judge prompt 给分。
    看参考

    例:邀请 3 个评估者,各自给 50 个例子打分,对比他们的一致性。

  4. 对比「Judge 分数」和「人工分数」。计算他们的一致性。如果 ≥ 85% 一致,judge 才靠谱。
    看参考

    例:Judge 和人工都觉得『好』的有 42 个,『都觉得坏』的有 8 个,等等。一致性 = (42 + 8) / 50 = 100%。

动手 实现一个「judge 评分函数」
任务:写一个 `judgeResponse(aiResponse, criteria)` 函数,接收 AI 的输出和评估标准,返回 1–5 分的评分和理由。
参考实现

工程级参考答案(带完整注释):

// 生产级 LLM Judge 实现
interface JudgeCriteria {
  name: string;
  description: string;
  weight: number;
  rubric: Record; // 1-5 分的定义
}

interface JudgmentResult {
  overallScore: number;
  scores: Record;
  reasoning: Record;
  confidence: number;
}

class LLMJudge {
  private criteria: JudgeCriteria[];
  private judgePrompt: string;
  
  constructor(criteria: JudgeCriteria[]) {
    this.criteria = criteria;
    this.judgePrompt = this.buildJudgePrompt();
  }
  
  private buildJudgePrompt(): string {
    let prompt = '你是一个公正的评估者。请根据以下标准评估给定的回复。\n\n标准:\n';
    
    for (const c of this.criteria) {
      prompt += `\n【${c.name}】${c.description}\n`;
      prompt += '评分标准:\n';
      for (const [score, definition] of Object.entries(c.rubric)) {
        prompt += `  ${score} 分:${definition}\n`;
      }
    }
    
    prompt += '\n请给出 JSON 格式的评分结果:{"scores": {...}, "reasoning": {...}, "confidence": 0-1}';
    return prompt;
  }
  
  async judge(aiResponse: string): Promise {
    const fullPrompt = `${this.judgePrompt}\n\n待评估的回复:\n${aiResponse}`;
    
    // 调用 LLM(这里用 mock)
    const judgmentJson = await this.callLLM(fullPrompt);
    const parsed = JSON.parse(judgmentJson);
    
    // 计算加权总分
    let overallScore = 0;
    let totalWeight = 0;
    
    for (const c of this.criteria) {
      const score = parsed.scores[c.name] || 1;
      overallScore += score * c.weight;
      totalWeight += c.weight;
    }
    
    return {
      overallScore: overallScore / totalWeight,
      scores: parsed.scores,
      reasoning: parsed.reasoning,
      confidence: parsed.confidence
    };
  }
  
  private async callLLM(prompt: string): Promise {
    // Mock: 实现真实的 LLM 调用
    return '{"scores": {}, "reasoning": {}, "confidence": 0.85}';
  }
}
动手 为你的 AI 系统写一个「Judge Prompt」
任务:设计一个 judge 的 system prompt。包括:(1) judge 应该评估什么维度(准确、有害、完整、风格);(2) 每个维度的 1–5 分定义;(3) 3–5 个「金标例子」。

在下面框里写你自己的 prompt(可以用中文):

→ 打开通义千问粘贴试 已复制 ✓
看参考 prompt

参考 prompt(这是一个模板,你可以改细节):

你是一个领域专家。请基于以下规则回答问题:

1. 只基于你的专业知识和常见做法回答,不编造。
2. 如果问题超出你的领域,明确说「这不在我的专业范围内」。
3. 给出的建议应该包括「为什么」和「什么时候不应该这样做」。
4. 对于有争议的做法,列出不同观点。

现在,开始回答用户的问题。