LLM-as-Judge (LLM 评审)
基础评审、成对比较、Rubric 评审
3.1 基础评审
javascript
async function llmJudge(task, output, criteria) {
const response = await llm.chat({
messages: [{
role: 'user',
content: `评估以下 AI 输出的质量。
## 任务
${task}
## AI 输出
${output}
## 评估标准
${criteria.map((c, i) => `${i+1}. ${c}`).join('\n')}
## 评分要求
对每个标准打分 1-5 分,并给出简短理由。
输出 JSON:
{
"scores": [
{ "criterion": "...", "score": 1-5, "reason": "..." }
],
"overallScore": 1-5,
"summary": "总体评价"
}`
}],
response_format: { type: 'json_object' }
});
return JSON.parse(response.content);
}
// 使用示例
const evaluation = await llmJudge(
"生成一个 React 登录表单组件",
generatedCode,
[
"代码是否功能完整(包含表单验证)",
"代码是否类型安全(TypeScript)",
"代码是否遵循 React 最佳实践",
"代码是否有良好的错误处理"
]
);3.2 成对比较
javascript
async function pairwiseComparison(task, outputA, outputB) {
const response = await llm.chat({
messages: [{
role: 'user',
content: `比较两个 AI 输出,选择更好的一个。
## 任务
${task}
## 输出 A
${outputA}
## 输出 B
${outputB}
## 评估维度
1. 正确性
2. 完整性
3. 代码质量
4. 可读性
## 要求
对每个维度,说明哪个更好(A/B/平局),并给出理由。
最后给出总体胜者。
输出 JSON:
{
"dimensions": [
{ "name": "正确性", "winner": "A|B|tie", "reason": "..." }
],
"overallWinner": "A|B|tie",
"explanation": "..."
}`
}],
response_format: { type: 'json_object' }
});
return JSON.parse(response.content);
}3.3 Rubric 评审
javascript
const CODE_REVIEW_RUBRIC = `
## 代码评审评分标准
### 功能正确性 (1-5)
1: 完全无法工作
2: 有严重 bug
3: 基本功能正确,有小问题
4: 功能完整正确
5: 功能完整,有额外的边界处理
### 代码质量 (1-5)
1: 代码混乱,无法维护
2: 代码结构差,命名不清
3: 基本可读,有改进空间
4: 清晰整洁,遵循规范
5: 优秀,可作为示例
### 类型安全 (1-5)
1: 大量 any,无类型
2: 类型不完整
3: 基本类型覆盖
4: 完整类型,少量类型断言
5: 完美类型推断,泛型使用得当
### 性能考量 (1-5)
1: 明显性能问题
2: 有潜在性能问题
3: 基本合理
4: 考虑了常见优化
5: 深度优化,最佳实践
`;
async function rubricEvaluation(code, rubric = CODE_REVIEW_RUBRIC) {
const response = await llm.chat({
messages: [{
role: 'user',
content: `使用以下评分标准评估代码:
${rubric}
## 待评估代码
\`\`\`typescript
${code}
\`\`\`
输出 JSON:
{
"scores": {
"functionality": { "score": 1-5, "details": "..." },
"quality": { "score": 1-5, "details": "..." },
"typeSafety": { "score": 1-5, "details": "..." },
"performance": { "score": 1-5, "details": "..." }
},
"totalScore": 平均分,
"strengths": ["..."],
"improvements": ["..."]
}`
}]
});
return JSON.parse(response.content);
}