RAG系列(五):系统评估 - 基于LLM-as-judge实现评估系统

Agent-as-a-Judge:AI系统评估新思路 Agent-as-a-Judge 框架是 AI 系统评估方法的重大突破。它克服了传统评估方法的缺陷,通过智能体评估智能体,在任务解决过程中提供丰富动态反馈,具有成本效益高、可扩展性强等优势。 阅读详情

引言

今天我们将基于 LLM-as-judge 自己实现一套 RAG 系统评估系统,以基础版 RAG 系统这 5 个评估指标值作为基准,通过学习不同的优化方法来提升这 5 个指标。

因为是通过 LLM 来评估,所以评估 LLM 的能力越强,理论上评估就会越准确,因此在实际的业务场景中,尽可能选用能力更强的 LLM。

为了学习方便,本文采用的评估 LLM 是 Ollama 部署的 qwen2.5 14b。

本文完整代码地址[1]:https://github.com/laixiangran/ai-learn/blob/main/src/app/rag/03_rag_evaluator/route.ts

下面具体讲解下每个指标评估器的代码实现:

上下文召回率评估器实现

衡量检索到的上下文是否覆盖参考答案所需的所有关键信息,避免遗漏关键信息。
取值在 0 到 1 之间,数值越高表示检索到的上下文覆盖越全面。
计算公式:上下文召回率 = 上下文覆盖的关键信息数量 / 参考答案中关键信息总数量。
例如,参考答案需要 5 个关键信息,若检索到的上下文覆盖其中 4 个关键信息,则上下文召回率为 0.8。

    1. 将参考答案(referenceAnswer)拆分成多个句子/关键信息(referenceAnswerStatements)。

举个例子:

{
"referenceAnswer":"2024年市场规模预计约488亿人民币,未来有望达到千亿级别,显示行业持续增长的潜力。",
"referenceAnswerStatements":[
"2024年市场规模预计约488亿人民币。",
"未来有望达到千亿级别,显示行业持续增长的潜力。"
]
}

代码实现如下:

/**
 * 将文本拆分为多个句子(关键信息)
 * @param text 待拆分的文本
 * @param evaluateLLM 拆分的 LLM
 * @returns
 */
asyncfunctionstatementSplit(text, evaluateLLM) {
const prompt = `
  你是一个语言专家,你的任务是将以下文本拆分为多个独立的句子,每个句子独立表达一个完整含义,同时保留原意的逻辑连贯性。

  说明:
  1. 严格按以下JSON格式返回:["句子1", "句子2", ...],不能输出其他无关内容。

  文本:
${text}

  回答:

  `;
const res = await evaluateLLM.invoke(prompt);
const data = formatToJson(res) || [];
console.log('statements: ', data);
return data;
}
    1. 逐个分析每个句子/关键信息(referenceAnswerStatements)是否可归因于给定的上下文(retrievedContext)并计算上下文召回率(contextRecall)。

举个例子:

{
"retrievedContext":[
"2016 年,美国教育部拨款40亿\n美元用以计算机科学教育普及\n五年计划。\n英国:渗透率9.3%\n2024 年,英国把编程纳入5-12 岁\n少儿的必修课。\n芬兰\n2016年,芬兰将编程纳入小学教学大纲",
    ...
],
"referenceAnswer":"2024年市场规模预计约488亿人民币,未来有望达到千亿级别,显示行业持续增长的潜力。",
"referenceAnswerStatements":[
"2024年市场规模预计约488亿人民币。",
"未来有望达到千亿级别,显示行业持续增长的潜力。"
]
"contextRecall":{
"score":1,
"data":[
{"score":1,"statement":"2024年市场规模预计约488亿人民币。"},
{
"score":1,
"statement":"未来有望达到千亿级别,显示行业持续增长的潜力。"
}
]
}
}

代码实现如下:

/**
 * 上下文召回率评估器。
 * 实现步骤:
 * 1. 将参考答案拆分成多个句子(关键信息);
 * 2. 逐个分析每个句子(关键信息)是否可归因于给定的上下文;
 * 3. 根据每个句子(关键信息)的得分,计算上下文召回率。
 * @param evaluateData 评估数据
 * @param evaluateLLM 评估 LLM
 * @returns
 */
asyncfunctioncontextRecallEvaluator(evaluateData, evaluateLLM) {
// retrievedContext 检索到的上下文
// referenceAnswer 参考答案
// referenceAnswerStatements 参考答案拆分出的多个句子(关键信息)
const { retrievedContext, referenceAnswer, referenceAnswerStatements } =
    evaluateData;
let newStatements = [];
if (!referenceAnswerStatements) {
    newStatements = awaitstatementSplit(referenceAnswer, evaluateLLM);
  } else {
    newStatements = [...referenceAnswerStatements];
  }
const allRes = [];
// 逐个分析每个句子(关键信息)是否可归因于给定的上下文
while (newStatements.length > 0) {
const statement = newStatements.shift();
const prompt = `
你是一个语言专家,你的任务是分析句子是否可归因于给定的上下文。

说明:
1. 如果句子不能归因于上下文,则得分为0;
2. 如果句子能够归因于上下文,则得分为1;
3. 严格按以下JSON格式返回:{"score": "得分"},不能输出其他无关内容。

句子:
${statement}

上下文:
${retrievedContext.join('\n')}

回答:

`;
const llmRes = await evaluateLLM.invoke(prompt);
const data = formatToJson(llmRes);
    allRes.push({
score: data?.score ? +data.score : 0,
      statement,
    });
console.log('contextRecallEvaluator: ', allRes);
  }
// 根据每个句子(关键信息)的得分,计算上下文召回率
const score =
    allRes.reduce((score, cur) => {
      score += +cur.score;
return score;
    }, 0) / allRes.length;
return {
    score,
data: allRes,
  };
}

上下文相关性评估器实现

衡量检索到的上下文与问题之间的相关性,避免包含无关冗余内容。
取值在 0 到 1 之间,数值越高表示检索到的上下文相关性越高。
计算公式:上下文相关性 = 上下文中与问题相关的片段数量 / 上下文中片段总数量。
例如,检索到的上下文总共有 5 个片段,与问题相关的片段有 4 个,则上下文相关性为 0.8。

    1. 逐个分析每个上下文片段(retrievedContext)是否与问题(question)相关并计算上下文相关性(contextRelevance)。

举个例子:

{
"question":"预计2024年少儿编程教育市场规模是多少?未来潜力如何?",
"retrievedContext":[
"2016 年,美国教育部拨款40亿\n美元用以计算机科学教育普及\n五年计划。\n英国:渗透率9.3%\n2024 年,英国把编程纳入5-12 岁\n少儿的必修课。\n芬兰\n2016年,芬兰将编程纳入小学教学大纲",
    ...
],
"contextRelevance":{
"score":0.7,
"data":[
{
"score":0,
"context":"2016 年,美国教育部拨款40亿\n美元用以计算机科学教育普及\n五年计划。\n英国:渗透率9.3%\n2024 年,英国把编程纳入5-12 岁\n少儿的必修课。\n芬兰\n2016年,芬兰将编程纳入小学教学大纲"
},
      ...
]
}
}

代码实现如下:

/**
 * 上下文相关性评估器
 * 实现步骤:
 * 1. 逐个分析每个上下文片段是否与问题相关;
 * 2. 根据每个上下文片段的得分,计算上下文相关性。
 * @param evaluateData 评估数据
 * @param evaluateLLM 评估 LLM
 * @returns
 */
asyncfunctioncontextRelevanceEvaluator(evaluateData, evaluateLLM) {
// question 问题
// retrievedContext 检索到的上下文
const { question, retrievedContext } = evaluateData;
const newRetrievedContext = [...retrievedContext];
const allRes = [];
// 逐个分析每个上下文片段是否与问题相关
while (newRetrievedContext.length > 0) {
const context = newRetrievedContext.shift();
const prompt = `
你是一个语言专家,你的任务是确定上下文是否与问题有关。

说明:
1. 如果上下文与问题无关,则得分为0;
2. 如果上下文与问题有关,则得分为1;
3. 严格按以下JSON格式返回:{"score": "得分"},不能输出其他无关内容。

问题:
${question}

上下文:
${context}

回答:

`;
const llmRes = await evaluateLLM.invoke(prompt);
const data = formatToJson(llmRes);
    allRes.push({
score: data?.score ? +data.score : 0,
      context,
    });
console.log('contextRelevanceEvaluator: ', allRes);
  }
// 根据每个上下文片段的得分,计算上下文相关性
const score =
    allRes.reduce((score, cur) => {
      score += +cur.score;
return score;
    }, 0) / allRes.length;
return {
    score,
data: allRes,
  };
}

答案忠实度评估器实现

衡量实际答案是否严格基于检索到的上下文,避免幻觉。
取值在 0 到 1 之间,数值越高表示实际答案越严格基于检索到的上下文。
计算公式:答案忠实度 = 上下文能够推断出事实的数量 / 实际答案拆解出的事实总数量。
例如,实际答案拆解出 5 个事实,若检索到的上下文覆盖其中 4 个事实,则答案忠实度为 0.8。

    1. 将实际答案(answer)拆分成多个句子(answerStatements)。

举个例子:

{
"answer":"根据提供的上下文信息,2024年少儿编程教育市场的规模约为488亿元人民币。从长远来看,随着越来越多家长认同编程教育的重要性以及其逐渐渗透进入教学体系内,该市场有望在未来5到10年内发展成为一个千亿级别的大市场。这表明少儿编程教育具有巨大的发展潜力和空间。",
"answerStatements":[
"2024年少儿编程教育市场的规模约为488亿元人民币。",
"从长远来看,随着越来越多家长认同编程教育的重要性以及其逐渐渗透进入教学体系内,该市场有望在未来5到10年内发展成为一个千亿级别的大市场。",
"这表明少儿编程教育具有巨大的发展潜力和空间。"
]
}

代码实现如下:

/**
 * 将文本拆分为多个句子(关键信息)
 * @param text 待拆分的文本
 * @param evaluateLLM 拆分的 LLM
 * @returns
 */
asyncfunctionstatementSplit(text, evaluateLLM) {
const prompt = `
  你是一个语言专家,你的任务是将以下文本拆分为多个独立的句子,每个句子独立表达一个完整含义,同时保留原意的逻辑连贯性。

  说明:
  1. 严格按以下JSON格式返回:["句子1", "句子2", ...],不能输出其他无关内容。

  文本:
${text}

  回答:

  `;
const res = await evaluateLLM.invoke(prompt);
const data = formatToJson(res) || [];
console.log('statements: ', data);
return data;
}
    1. 逐个分析每个句子(answerStatements)是否可归因于给定的上下文(retrievedContext)并计算答案忠实度(faithfulness)。

举个例子:

{
"retrievedContext":[
"2016 年,美国教育部拨款40亿\n美元用以计算机科学教育普及\n五年计划。\n英国:渗透率9.3%\n2024 年,英国把编程纳入5-12 岁\n少儿的必修课。\n芬兰\n2016年,芬兰将编程纳入小学教学大纲",
    ...
],
"answer":"根据提供的上下文信息,2024年少儿编程教育市场的规模约为488亿元人民币。从长远来看,随着越来越多家长认同编程教育的重要性以及其逐渐渗透进入教学体系内,该市场有望在未来5到10年内发展成为一个千亿级别的大市场。这表明少儿编程教育具有巨大的发展潜力和空间。",
"answerStatements":[
"2024年少儿编程教育市场的规模约为488亿元人民币。",
"从长远来看,随着越来越多家长认同编程教育的重要性以及其逐渐渗透进入教学体系内,该市场有望在未来5到10年内发展成为一个千亿级别的大市场。",
"这表明少儿编程教育具有巨大的发展潜力和空间。"
],
"faithfulness":{
"score":1,
"data":[
{
"score":1,
"statement":"2024年少儿编程教育市场的规模约为488亿元人民币。"
},
{
"score":1,
"statement":"从长远来看,随着越来越多家长认同编程教育的重要性以及其逐渐渗透进入教学体系内,该市场有望在未来5到10年内发展成为一个千亿级别的大市场。"
},
{
"score":1,
"statement":"这表明少儿编程教育具有巨大的发展潜力和空间。"
}
]
}
}

代码实现如下:

/**
 * 答案忠实度评估器
 * 实现步骤:
 * 1. 将实际答案拆分成多个句子(事实);
 * 2. 逐个分析每个句子(事实)是否可归因于给定的上下文;
 * 3. 根据每个句子(事实)的得分,计算答案忠实度。
 * @param evaluateData 评估数据
 * @param evaluateLLM 评估 LLM
 * @returns
 */
asyncfunctionfaithfulnessEvaluator(evaluateData, evaluateLLM) {
// retrievedContext 检索到的上下文
// answer 实际答案
// answerStatements 实际答案拆分出的多个句子(事实)
const { retrievedContext, answer, answerStatements } = evaluateData;
let newStatements = [];
if (!answerStatements) {
    newStatements = awaitstatementSplit(answer, evaluateLLM);
  } else {
    newStatements = [...answerStatements];
  }
const allRes = [];
// 逐个分析每个句子(事实)是否可归因于给定的上下文
while (newStatements.length > 0) {
const statement = newStatements.shift();
const prompt = `
你是一个语言专家,你的任务是分析句子是否可归因于给定的上下文。

说明:
1. 如果句子不能归因于上下文,则得分为0;
2. 如果句子能够归因于上下文,则得分为1;
3. 严格按以下JSON格式返回:{"score": "得分"},不能输出其他无关内容。

句子:
${statement}

上下文:
${retrievedContext.join('\n')}

回答:

`;
const llmRes = await evaluateLLM.invoke(prompt);
const data = formatToJson(llmRes);
    allRes.push({
score: data?.score ? +data.score : 0,
      statement,
    });
console.log('faithfulnessEvaluator: ', allRes);
  }
// 根据每个句子(事实)的得分,计算答案忠实度
const score =
    allRes.reduce((score, cur) => {
      score += +cur.score;
return score;
    }, 0) / allRes.length;
return {
    score,
data: allRes,
  };
}

答案相关性评估器实现

衡量实际答案是否直接完整回答用户问题,排除冗余或跑题。
取值在 0 到 1 之间,数值越高表示实际答案更直接完整回答用户问题。
计算公式:答案相关性 = 与实际问题相关的模拟问题数量 / 实际答案推导出的模拟问题总数量。
例如,实际答案推导出 5 个模拟问题,若其中 4 个与实际问题相关,则答案相关性为 0.8。

    1. 根据实际答案(answer)推导出多个模拟问题(simulationQuestions)。

举个例子:

{
"answer":"根据提供的上下文信息,2024年少儿编程教育市场的规模约为488亿元人民币。从长远来看,随着越来越多家长认同编程教育的重要性以及其逐渐渗透进入教学体系内,该市场有望在未来5到10年内发展成为一个千亿级别的大市场。这表明少儿编程教育具有巨大的发展潜力和空间。",
"simulationQuestions":[
"2024年少儿编程教育市场的规模是多少?",
"未来五年到十年,少儿编程教育市场规模预计能达到多少?",
"为什么说少儿编程教育有巨大的发展空间?"
]
}

代码实现如下:

/**
 * 根据答案推导出多个模拟问题
 * @param text
 * @param evaluateLLM
 * @returns
 */
asyncfunctionsimulationQuestion(text, evaluateLLM) {
const prompt = `
  你是一个语言专家,你的任务是根据以下答案的核心内容来生成3个用户可能问的问题。

  说明:
  1. 严格按以下JSON格式返回:["问题1", "问题2", ...],不能输出其他无关内容。

  答案:
${text}

  回答:

  `;
const res = await evaluateLLM.invoke(prompt);
const data = formatToJson(res) || [];
console.log('questions: ', data);
return data;
}
    1. 逐个分析每个模拟问题(simulationQuestions)是否与原问题(question)相似并计算答案相关性(answerRelevance)。

举个例子:

{
"question":"预计2024年少儿编程教育市场规模是多少?未来潜力如何?",
"answer":"根据提供的上下文信息,2024年少儿编程教育市场的规模约为488亿元人民币。从长远来看,随着越来越多家长认同编程教育的重要性以及其逐渐渗透进入教学体系内,该市场有望在未来5到10年内发展成为一个千亿级别的大市场。这表明少儿编程教育具有巨大的发展潜力和空间。",
"simulationQuestions":[
"2024年少儿编程教育市场的规模是多少?",
"未来五年到十年,少儿编程教育市场规模预计能达到多少?",
"为什么说少儿编程教育有巨大的发展空间?"
],
"answerRelevance":{
"score":1,
"data":[
{
"score":1,
"simulationQuestion":"2024年少儿编程教育市场的规模是多少?"
},
{
"score":1,
"simulationQuestion":"未来五年到十年,少儿编程教育市场规模预计能达到多少?"
},
{
"score":1,
"simulationQuestion":"为什么说少儿编程教育有巨大的发展空间?"
}
]
}
}

代码实现如下:

/**
 * 答案相关性评估器
 * 实现步骤:
 * 1. 根据实际答案推导出多个模拟问题;
 * 2. 逐个分析每个模拟问题是否与原问题相似;
 * 3. 根据每个模拟问题的得分,计算答案相关性。
 * @param evaluateData 评估数据
 * @param evaluateLLM 评估 LLM
 * @returns
 */
asyncfunctionanswerRelevanceEvaluator(evaluateData, evaluateLLM) {
// question 问题
// answer 实际答案
// simulationQuestions 根据实际答案推导出的多个模拟问题
const { question, answer, simulationQuestions } = evaluateData;
let newSimulationQuestions = [];
if (!simulationQuestions) {
    newSimulationQuestions = awaitsimulationQuestion(answer, evaluateLLM);
  } else {
    newSimulationQuestions = [...simulationQuestions];
  }
const allRes = [];
// 逐个分析每个模拟问题是否与原问题相似
while (newSimulationQuestions.length > 0) {
const simulationQuestion = newSimulationQuestions.shift();
const prompt = `
你是一个语言专家,你的任务是分析模拟问题和实际问题是否相似。

说明:
1. 如果模拟问题与实际问题不相似,则得分为0;
2. 如果模拟问题与实际问题相似,则得分为1;
3. 严格按以下JSON格式返回:{"score": "相似度"},不能输出其他无关内容。

模拟问题:
${simulationQuestion}

实际问题:
${question}

回答:

`;
const llmRes = await evaluateLLM.invoke(prompt);
const data = formatToJson(llmRes);
    allRes.push({
score: data?.score ? +data.score : 0,
      simulationQuestion,
    });
console.log('answerRelevanceEvaluator: ', allRes);
  }
// 根据每个模拟问题的得分,计算答案相关性
const score =
    allRes.reduce((score, cur) => {
      score += +cur.score;
return score;
    }, 0) / allRes.length;
return {
    score,
data: allRes,
  };
}

答案正确性评估器实现

衡量实际答案的准确性,需与参考答案对比。
取值在 0 到 1 之间,数值越高表示实际答案与参考答案匹配度越高,准确性也就越高。
计算公式:答案准确性 = 实际答案覆盖的关键信息数量 / 参考答案中关键信息总数量。
例如,参考答案需要 5 个关键信息,若实际答案覆盖其中 4 个关键信息,则答案正确性为 0.8。

    1. 将参考答案(referenceAnswer)拆分成多个句子/关键信息(referenceAnswerStatements)。

举个例子:

{
"referenceAnswer":"2024年市场规模预计约488亿人民币,未来有望达到千亿级别,显示行业持续增长的潜力。",
"referenceAnswerStatements":[
"2024年市场规模预计约488亿人民币。",
"未来有望达到千亿级别,显示行业持续增长的潜力。"
]
}

代码实现如下:

/**
 * 将文本拆分为多个句子(关键信息)
 * @param text 待拆分的文本
 * @param evaluateLLM 拆分的 LLM
 * @returns
 */
asyncfunctionstatementSplit(text, evaluateLLM) {
const prompt = `
  你是一个语言专家,你的任务是将以下文本拆分为多个独立的句子,每个句子独立表达一个完整含义,同时保留原意的逻辑连贯性。

  说明:
  1. 严格按以下JSON格式返回:["句子1", "句子2", ...],不能输出其他无关内容。

  文本:
${text}

  回答:

  `;
const res = await evaluateLLM.invoke(prompt);
const data = formatToJson(res) || [];
console.log('statements: ', data);
return data;
}
    1. 逐个分析每个句子/关键信息(referenceAnswerStatements)是否可归因于给定的实际答案(question)并计算答案正确性(answerCorrectness)。

举个例子:

{
"question":"预计2024年少儿编程教育市场规模是多少?未来潜力如何?",
"referenceAnswer":"2024年市场规模预计约488亿人民币,未来有望达到千亿级别,显示行业持续增长的潜力。",
"referenceAnswerStatements":[
"2024年市场规模预计约488亿人民币。",
"未来有望达到千亿级别,显示行业持续增长的潜力。"
]
"answerCorrectness":{
"score":1,
"data":[
{"score":1,"statement":"2024年市场规模预计约488亿人民币。"},
{
"score":1,
"statement":"未来有望达到千亿级别,显示行业持续增长的潜力。"
}
]
}
}

代码实现如下:

/**
 * 答案正确性评估器
 * 实现步骤:
 * 1. 将参考答案拆分成多个句子(关键信息);
 * 2. 逐个分析每个句子(关键信息)是否可归因于给定的实际答案;
 * 3. 根据每个句子(关键信息)的得分,计算答案正确性。
 * @param evaluateData 评估数据
 * @param evaluateLLM 评估 LLM
 * @returns
 */
asyncfunctionanswerCorrectnessEvaluator(evaluateData, evaluateLLM) {
// answer 实际答案
// referenceAnswer 参考答案
// referenceAnswerStatements 参考答案拆分出的多个句子(关键信息)
const { answer, referenceAnswer, referenceAnswerStatements } = evaluateData;
let newStatements = [];
if (!referenceAnswerStatements) {
    newStatements = awaitstatementSplit(referenceAnswer, evaluateLLM);
  } else {
    newStatements = [...referenceAnswerStatements];
  }
const allRes = [];
// 逐个分析每个句子(关键信息)是否可归因于给定的实际答案
while (newStatements.length > 0) {
const statement = newStatements.shift();
const prompt = `
你是一个语言专家,你的任务是分析句子是否可归因于给定的实际答案。

说明:
1. 如果句子不能归因于实际答案,则得分为0;
2. 如果句子能够归因于实际答案,则得分为1;
3. 严格按以下JSON格式返回:{"score": "得分"},不能输出其他无关内容。

句子:
${statement}

实际答案:
${answer}

回答:

`;
const llmRes = await evaluateLLM.invoke(prompt);
const data = formatToJson(llmRes);
    allRes.push({
score: data?.score ? +data.score : 0,
      statement,
    });
console.log('answerCorrectnessEvaluator: ', allRes);
  }
// 根据每个句子(关键信息)的得分,计算答案正确性
const score =
    allRes.reduce((score, cur) => {
      score += +cur.score;
return score;
    }, 0) / allRes.length;
return {
    score,
data: allRes,
  };
}

基础版 RAG 系统评估

至此,我们基于 LLM-as-judge 自己实现了一套 RAG 系统评估系统,下面我们通过该评估系统来评估基础版 RAG 系统。

以下每一步的详细代码就不贴了,评估详细代码地址[2]:https://github.com/laixiangran/ai-learn/blob/main/src/app/rag/03_rag_evaluator/route.ts

准备 QA 测试数据

这里我准备了 20 个 测试 QA(含参考答案),QA 测试数据文件地址[3]:https://github.com/laixiangran/ai-learn/blob/main/src/app/data/qa_test_20.json

[
  ...
{
"question":"预计2024年少儿编程教育市场规模是多少?未来潜力如何?",
"referenceAnswer":"2024年市场规模预计约488亿人民币,未来有望达到千亿级别,显示行业持续增长的潜力。"
},
  ...
]

知识库构建

文档切分配置:

  • • 用于分割文本的字符或字符串(separator‌):[“\n\n”, “\n”, " ", “”];
  • • 每个文本块的最大字符数(chunk_size‌):500;
  • • 文本块之间的重叠字符数(chunk_overlap‌):50。

Embedding 模型:

  • • nomic-embed-text。

代码实现如下:

// 1. 文件解析
const docs = awaitloadPdf(
'src/app/data/2024少儿编程教育行业发展趋势报告.pdf'
  );

// 2. 文件切分
const texts = awaitsplitDocuments(docs);

// 3. 初始化向量模型和向量数据库,并将文档存储到向量数据库
awaitaddDocuments(texts);

指标评估

检索上下文 TopK: 3;

评估 LLM: qwen2.5:14b(Ollama 部署)。

代码实现如下:

// 单个指标评估
asyncfunctionbathEvaluator(indexName: string) {
const evaluatorMap = {
contextRecall: contextRecallEvaluator,
contextRelevance: contextRelevanceEvaluator,
faithfulness: faithfulnessEvaluator,
answerRelevance: answerRelevanceEvaluator,
answerCorrectness: answerCorrectnessEvaluator,
  };
const evaluator = evaluatorMap[indexName];
const inputPath = 'src/app/data/qa_test_20.json';
const outputPath = 'src/app/data/qa_test_20_base_evaluate.json';
const qaDatas = awaitreadJsonFile(inputPath);
const llm = initOllamaLLM('qwen2.5:14b');

const res = [];
while (qaDatas.length > 0) {
const data = qaDatas.shift();
if (!data.answer) {
const { retrievedContext, answer } = awaitllmAnswerByQaData(
        data.question
      );
      data.retrievedContext = retrievedContext;
      data.answer = answer;
    }
const evaluateRes = awaitevaluator(data, llm);
    res.push({
      ...data,
      [indexName]: evaluateRes,
    });
  }

// 将 LLM 回答结果保存到文件中
awaitsaveJsonFile(JSON.stringify(res), outputPath);

// 计算最终指标数据
const score =
    res.reduce((score, cur) => {
      score += cur[indexName].score;
return score;
    }, 0) / res.length;

return { [indexName]: +score.toFixed(1) };
}

// 指标评估
const indexs = [
'contextRecall',
'contextRelevance',
'faithfulness',
'answerRelevance',
'answerCorrectness',
];
constdata: any = {};
while (indexs.length > 0) {
const indexName = indexs.shift() || '';
const indexRes = awaitbathEvaluator(indexName);
  data[indexName] = indexRes[indexName];
}

基础版 RAG 系统(V1.0)各指标的评估结果如下:

版本优化描述上下文召回率(contextRecall)上下文相关性(contextRelevance)答案忠实度(faithfulness)答案相关性(answerRelevance)答案正确性(answerCorrectness)
基础 RAG 系统(V1.0)无0.60.50.80.50.6

结语

至此,我们基于 LLM-as-judge 自己实现一套 RAG 系统评估系统,用该评估系统评估了基础版 RAG 系统(V1.0)的 5 个评估指标的表现,可以看到基础版 RAG 系统(V1.0)这 5 个指标的值都是偏低的,所以后面我将通过讲解不同的优化方法来提升基础版 RAG 系统(V1.0)这 5 个指标,敬请期待。

大模型算是目前当之无愧最火的一个方向了,算是新时代的风口!有小伙伴觉得,作为新领域、新方向人才需求必然相当大,与之相应的人才缺乏、人才竞争自然也会更少,那转行去做大模型是不是一个更好的选择呢?是不是更好就业呢?是不是就暂时能抵抗35岁中年危机呢?

答案当然是这样,大模型必然是新风口!

那如何学习大模型 ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。但是具体到个人,只能说是:

最先掌握AI的人,将会比较晚掌握AI的人有竞争优势。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

但现在很多想入行大模型的人苦于现在网上的大模型老课程老教材,学也不是不学也不是,基于此我用做产品的心态来打磨这份大模型教程,深挖痛点并持续修改了近100余次后,终于把整个AI大模型的学习路线完善出来!

在这里插入图片描述

在这个版本当中:

您只需要听我讲,跟着我做即可,为了让学习的道路变得更简单,这份大模型路线+学习教程已经给大家整理并打包分享出来, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

👉优快云大礼包🎁:全网最全《LLM大模型学习资源包》免费分享(安全咨料,放心领取)👈

​

一、大模型经典书籍(免费分享)

AI大模型已经成为了当今科技领域的一大热点,那以下这些大模型书籍就是非常不错的学习资源。

在这里插入图片描述

二、640套大模型报告(免费分享)

这套包含640份报告的合集,涵盖了大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(几乎涵盖所有行业)
在这里插入图片描述

三、大模型系列视频教程(免费分享)

在这里插入图片描述

四、2025最新大模型学习路线(免费分享)

我们把学习路线分成L1到L4四个阶段,一步步带你从入门到进阶,从理论到实战。

img

L1阶段:启航篇丨极速破界AI新时代

L1阶段:了解大模型的基础知识,以及大模型在各个行业的应用和分析,学习理解大模型的核心原理、关键技术以及大模型应用场景。

img

L2阶段:攻坚篇丨RAG开发实战工坊

L2阶段:AI大模型RAG应用开发工程,主要学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。

img

L3阶段:跃迁篇丨Agent智能体架构设计

L3阶段:大模型Agent应用架构进阶实现,主要学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造Agent智能体。

img

L4阶段:精进篇丨模型微调与私有化部署

L4阶段:大模型的微调和私有化部署,更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调,并通过Ollama、vLLM等推理部署框架,实现模型的快速部署。

img

L5阶段:专题集丨特训篇 【录播课】

img

全套的AI大模型学习资源已经整理打包,有需要的小伙伴可以微信扫描下方二维码,免费领取

👉优快云大礼包🎁:全网最全《LLM大模型学习资源包》免费分享(安全资料,放心领取)👈

​

LLM-as-a-Judge:RAG系统AI质检员实战指南 RAG系统中的幻觉问题本质是生成模型在开放任务中对事实依据的失控,而LLM-as-a-Judge通过将质量评估转化为结构化判别任务,实现了对答案忠实度与相关性的可解释、可量化、可扩展的自动化质检。其核心原理在于任务降维——从自由生成转向上下文锚定的比对判断,依托JSON强制输出、三输入限定(问题/上下文/答案)和行为化评分标准,显著提升稳定性与一致性。该技术已广泛应用于电商客服、金融合规、政务热线等强事实依赖场景,成为RAG工程落地的质量守门人。 阅读详情

相关推荐

RAG系统评估全攻略:指标解析、工具对比与最新实操案例详解!

RAG评估是解决"搭建易、优化难"痛点的关键。本文系统梳理了评估指标体系(检索、重排、生成模块指标及核心质量指标),对比分析了RAGAs、TruLens等主流工具特性,并通过实操案例展示多工具应用方法。文章强调评估需结合自动化与人工验证,提供从原型验证到生产监控的全流程最佳实践,帮助开发者构建高效可靠的RAG系统。

Android23333的博客 1342

「点燃我,温暖你」用Python制作一个动态爱心效果

最近「点燃我,温暖你」这部剧非常火,讲述的是程序员的爱情故事。其中陈飞宇饰演的男主李峋,在剧中用程序做出的爱心跳动效果,非常炫。

Modeler_xiaoyu的博客 1万+

检索增强生成(RAG)系统综合评估:从核心指标到前沿框架

本报告系统探讨了检索增强生成(RAG)系统的评估方法,重点分析其核心组件——检索器与生成器的评估指标及前沿框架。报告提出RAG评估需兼顾组件独立评估与端到端整体性能,并详细阐述了经典信息检索指标(如精确率、召回率)与RAG特有指标(如上下文精确率、忠实度)。通过分析RAGAs、ARES和TruLens等前沿评估框架,报告揭示了当前RAG评估面临的挑战,包括主观性、可扩展性和伦理问题,同时展望了多模态与对话式RAG系统的新型评估指标研究方向。本报告为构建可靠、高效的RAG系统提供了方法论指导与实践参考。

炼丹上岸 2464

R语言灰色关联分析法

输入数据并用DT包的datatable函数展示数据 ABDDEF分别对应第1到第6个供应商产品质量、技术水平、供应能力、经济效益、交货情况、市场影响度指标属于效益型指 产品价格、地理位置、售后服务指标属于成本型指标。现分别对上述指标进行规范化: 对于效益型指标(正项指标)标准化公式为: x∗=x−min(x)max(x)−min(x) x^{\ast}=\frac{x-min\left( x \right)}{max\left( x \right) -min\left( x \right)} x∗=max

qq_54423921的博客 7996

国密证书实战:在CentOS 7上构建GmSSL私有CA与完整证书链

本文详细介绍了在CentOS 7操作系统上,使用GmSSL工具构建私有国密证书颁发机构(CA)与完整证书链的实战指南。内容涵盖从部署GmSSL、创建国密根CA、签发服务器与客户端证书,到生产环境安全加固与最佳实践的全流程,旨在帮助系统管理员和安全工程师建立统一、可控的内部国密安全通信体系。

jenkins8butler的博客 496

无需考虑运行环境,高效评估RAG系统或模型

该指标会产生一个介于0到1之间的分数,其中1表示完美的引用精准度(所有引用的段落均与响应相关且被使用),0表示完全不精准(引用的段落均不应被使用),这有助于团队识别并修复其RAG系统不加选择地引用段落,而非仅选择性引用对响应有贡献的段落的问题。分数越接近1,则表明模型恰当引用了检索到的段落中的信息。在使用BYOI功能时,您必须在名为output的新字段中提供生成的文本、检索到的段落(例如检索结果)以及生成文本的引用信息(此字段对于BYOI任务是必需的,但对于非BYOI任务则是可选的,并非必须提供)。

亚马逊云科技专栏 308

arcgis导出自身相交数据

今天接到一个客户需求,一份面文件,里面有好多元素是两两相交甚至是三个相交的,现在要把这些重叠部分提取出来,并且把相交部分的原始要素的名称也保留在字段中,也就是说名称这个会有好多个名称字段,如果两个要素相交那就是前两个名称字段有值,后面的为空,如果是三个要素相交,那么输出的这个要素就是前三个名称字段有值,后面的为空,嗯,这里也不太确定会出现多少个名称字段,这个需要依照数据来定。 这是原始数据,...

miaowumi92的博客 6789

一文搞懂 LLM-as-a-Judge 评估范式,附 AlpacaEval 实战指南

LLM-as-a-Judge,顾名思义就是让大型语言模型作为“评审者”来打分其他模型的输出。这种范式背后的基本逻辑是:“如果 GPT-4 是目前最强大的语言理解模型之一,那我们为何不让它来判断其他模型的表现呢?指令跟随任务(Instruction Following)多轮对话生成自由生成文本对比(Freeform Generation)AlpacaEval 就是 LLM-as-a-Judge 范式的代表实现之一,使用 GPT-4 Turbo 对模型输出进行成对比较,并输出“哪一个更好”的判定。

刘炫320的博客 5646

VL53L0X加盖玻片后精度暴跌?手把手教你完成串扰校准(CrossTalk Calibration)

本文详细解析了VL53L0X激光测距传感器加盖玻片后精度下降的原因,并提供了串扰校准(CrossTalk Calibration)的完整解决方案。通过分步指导和实用代码示例,帮助工程师恢复毫米级测距精度,适用于智能门锁、扫地机器人等应用场景。

weixin_33708432的博客 539

Gazebo仿真UUV水下机器人:从环境搭建到避障算法实战

本文详细介绍了使用Gazebo仿真平台进行UUV水下机器人开发的全流程,涵盖从环境搭建、uuv_simulator配置、传感器集成到核心避障算法实战。通过搭建水下仿真实验室并实现基于激光雷达数据的反应式避障算法,为水下机器人算法验证与开发提供了高效、低成本的解决方案。

weixin_28840591的博客 263

【程序员必备】RAG系统评估实战:LLM-as-a-Judge方法详解与最佳实践

文章详细介绍了RAG系统的自动评估方法论,特别是使用大语言模型作为评判工具(LLM-as-a-Judge)。通过Databricks的最佳实践,探讨了评估流程、人工与自动化评估的优缺点,以及在不同发展阶段的应用策略。研究表明,LLM评判与人工评分一致性超过80%,使用GPT-3.5结合示例可显著降低成本,低精度评分量表(如0-3分)更易于解读和应用。文章还强调了RAG应用需要针对特定场景构建基准测试,以确保评估结果的准确性和可靠性。 ---

2401_84815887的博客 1380

智启古文字新章:AI、ML与大数据驱动的知识图谱构建

摘要:本文聚焦AI、ML与大数据驱动的古文字知识图谱构建。开篇点明古文字研究困境,凸显技术革新迫切性。随后阐释AI、ML、大数据基础概念,详解其在图谱构建里的数据采集、知识抽取、关系挖掘运作流程,穿插线性代数、概率论等数学原理。实战展示殷商甲骨文图谱搭建全程,含数据处理、模型训练。还探讨跨模态融合等前沿挑战应对,兼述技术融合衍生的教育科普革新、伦理文化责任、国际合作交流,勾勒古文字数字永生的长远愿景。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1615

RAG 系统评估终极指南——从底层算法到 LLM-as-Judge 新范式

RAG系统评估:从检索到生成的全面优化 RAG(检索增强生成)系统结合了信息检索与大模型生成能力,但实际应用中常面临检索不准、生成幻觉等问题。本文系统性拆解RAG评估方法: 双核架构特性 检索器决定上下文质量,生成器影响答案准确性 级联误差导致端到端性能急剧下降(如80%检索+80%生成≈64%准确率) 检索模块评估 核心指标:Recall@K、MRR、NDCG 工程实现:Python代码示例展示指标计算方法 关键平衡:需同时监控Recall和Precision,避免过度检索 生成模块评估 传统方法:

高校图书馆高级系统架构师/研究馆员,推动高校AI从概念演示到可评审、可交付、可运维:路线图与立项评审、PoC交付、评测回归与上线运维(Baseline/Eval/Ops)。 1507

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

RAG系统评估方法论:收藏必备!LLM-as-a-Judge自动化评估实践指南,从人工到自动的完美平衡

本文详细介绍了RAG系统的科学评估方法,对比了人工评估与自动化评估(LLM-as-a-Judge)的优劣。基于Databricks实践经验,文章探讨了如何通过LLM评判器实现高效评估,解决了与人工评分一致性、示例准确性、评分量表选择和用例适用性等关键挑战。研究表明,LLM评估与人工评分一致性超80%,使用低精度量表(0-3分)和适当示例可显著提升评估效果,为RAG系统优化提供了实用指导。

优快云_224022的博客 874

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

705-LangChain框架Evaluations教程 - LLM-as-Judge评估方法

本案例的主要目标是介绍并实现LLM-as-Judge评估方法,这是一种使用大型语言模型(LLM)来评估其他模型输出的技术,类似于人类评估过程。由于LLM的能力超越了简单选择正确答案,评估这种能力具有挑战性,因此使用第二个LLM作为评估器被认为是有效的解决方案。

rengang66的博客 711

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

LLM 评估与调试指南:如何用 LLM as Judge 自动化评估生成式 AI 应用

你是否遇到过这样的困境:RAG 问答系统跑通了,却说不清"回答到底好不好"?人工逐条打分既慢又不一致,传统的 BLEU/ROUGE 指标又无法衡量"语义是否正确"。本文基于 Weights & Biases 开源的深度学习教育项目 **edu**,为你整理一套完整的 **LLM 评估与调试指南**:从评估数据集准备、检索与生成指标,到用 **LLM as Judge**(LLM 充当评审)自动化打

gitblog_00784的博客 1125

LLM 应用评估体系详解:从多轮对话到 RAG 与 AI Agent 的落地评估

大语言模型应用评估方法指南 本文系统梳理了大语言模型(LLM)应用的评估体系。传统NLP任务评估依赖准确率、BLEU等指标,但现代LLM应用需要更全面的评估方案。文章重点分析了三类场景的评估指标: 多轮对话:需跟踪相关性、完整性、知识留存、可靠性等指标 RAG应用:评估检索质量、答案准确性和上下文相关性 智能体系统:关注任务完成度、决策逻辑等维度 评估方式呈现新趋势: 从单一模型测试转向系统级评估 LLM-as-a-judge成为主流评分方法 涌现DeepEval等专业评估框架 企业应结合具体场景选择合适的

2401_85725028的博客 1164

LLMs之RAG:《Expert Support case study: Bolstering a RAG app with LLM-as-a-Judge》翻译与解读

​ LLMs之RAG:《Expert Support case study: Bolstering a RAG app with LLM-as-a-Judge利用LLM作为评判者增强RAG应用程序》翻译与解读 目录 《Exploring Model Kinship for Merging Large Language Models》翻译与解读 一、引言:背景介绍与项目GAIA 二、Farmer.chat系统架构 三、LLM作为评判者的力量 四、评估指标与方法

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 1301

Langchainrust:中LLM-as-a-Judge,用 Rust 实现一套 LLM 评估系统

文章摘要 本文介绍了如何用Rust实现一个LLM评估系统(LLM-as-a-Judge),用于自动评估语言模型的输出质量。文章首先阐述了评估的必要性,区分了有参考评估和无参考评估两种方式,并指出传统指标在语义评估上的局限性。 核心部分提出了评估系统的抽象设计,包括Evaluator trait和Predictor trait,以及串联两者的EvalRunner。重点介绍了10种评估器,从简单的字符串匹配(ExactMatch、StringDistance)到更高级的语义评估(EmbeddingSimilar

m0_54140879的博客 521

评估AI的终极答案:LLM-As-a-Judge!AI时代,谁来评判AI?答案是AI自己!

LLM-as-a-Judge(大语言模型作为评判者)是指利用大型语言模型(LLM)来评估、判断或批判其他AI系统的输出,代替传统的人类评审者的评判方式。

m0_59235945的博客 1511

一文讲清!如何评估和优化RAG产品?LLM-as-a-Judge实践指南,看到就是赚到!!

本文介绍了RAG系统的评估方法论,重点探讨了使用LLM-as-a-Judge进行自动评估的方法。文章详细阐述了RAG评估的典型流程,对比了人工评估和自动化评估的优缺点,并提供了Databricks的最佳实践经验。研究表明,LLM评判与人工评分一致性超80%,通过示例可显著提高GPT-3.5的评估准确性,推荐使用0-3或1-5的低精度评分量表。文章还强调RAG应用需要构建特定于用例的基准测试,以确保评估结果的准确性和适用性。

Gaga246的博客 742

Ragas:RAG系统评估的自动化框架深度解析

RAG系统自动化评估框架Ragas研究 Ragas是一个专门用于评估检索增强生成(RAG)系统的开源框架,采用"无参考评估"的创新范式。该框架通过分解评估维度、利用LLM作为评估器,解决了传统RAG评估面临的成本高、指标不适用等问题。 核心特点:1、 组件化评估:分别评估检索质量(精确度、召回率)和生成质量(忠实度、相关性) 。2、自动化流程:通过LLM-as-a-Judge机制实现高效评估,减少人工标注。3、多数据支持:支持生产数据收集、合成数据生成和人工标注三种方式。

专注人工智能应用领域 1606

RAG 检索质量评估:从 Hit Rate 到 LLM-as-Judge 校准

RAG 评估一般分两个独立维度: * **检索质量**:从语料库召回了多少相关文档?排名是否合理?这是给 retriever 的评分。 * **生成质量**:给定检索到的上下文,LLM 是否生成了忠实(无幻觉)、相关、完整的回答?这是给 generator 的评分。

Python_cocola的博客 302

RAG评估:G-Eval与其他LLM评估框架

G-Eval是一种创新的AI评估框架,利用大语言模型(如GPT-4)作为裁判来评估RAG系统的输出质量。它通过"思维链"技术生成详细评估步骤,再结合概率加权打分,显著提升了评估效率与准确性。相比传统的人工打分或BLEU等指标,G-Eval与人类判断高度一致,为AI系统评估提供了新范式。该框架已在摘要和对话生成等任务中展现出色表现,成为AI评估领域的重要突破。

古月居 1017

从入门到精通!LLM应用评估终极指南,多轮对话、RAG、Agent三大难题一次搞定!

随着大语言模型应用从简单的文本生成,发展到复杂的多轮对话机器人、检索增强生成(RAG)系统乃至智能体(Agent),我们应如何科学、有效地评估它们的性能,确保其稳定可靠?

m0_59164520的博客 939
上一篇: RAG系列(四):系统评估 - 五个主流评估指标详解
下一篇: RAG系列(六):问题优化 - 意图识别&同义改写&多视角分解&补充上下文
Llama-Turbo
博客等级 码龄4年 9901粉丝 2022原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值