평가

평가는 LLM의 응답을 검증하고 품질 기준을 충족하는지 확인하는 데 도움이 되는 테스트 방법입니다.

Firebase Genkit은 플러그인을 통해 서드 파티 평가 도구를 지원하며 LLM 기반 애플리케이션의 런타임 상태에 대한 유용한 정보를 제공하는 강력한 관측 가능성 기능과 함께 제공됩니다. Genkit 도구를 사용하면 중간 단계에서 입력, 출력, 정보를 포함한 데이터를 자동으로 추출하여 LLM 응답의 엔드 투 엔드 품질을 평가하고 시스템 빌딩 블록의 성능을 파악할 수 있습니다.

예를 들어 RAG 흐름이 있는 경우 Genkit는 검색기에서 반환된 문서 세트를 추출하므로 아래와 같이 흐름의 컨텍스트에서 검색기가 실행되는 동안 검색기의 품질을 평가할 수 있습니다. 이때 Genkit 신뢰도 및 답변 관련성 측정항목을 사용합니다.

import { GenkitMetric, genkitEval } from '@genkit-ai/evaluator';
import { textEmbeddingGecko } from '@genkit-ai/vertexai';

export default configureGenkit({
  plugins: [
    genkitEval({
      judge: geminiPro,
      metrics: [GenkitMetric.FAITHFULNESS, GenkitMetric.ANSWER_RELEVANCY],
      embedder: textEmbeddingGecko, // GenkitMetric.ANSWER_RELEVANCY requires an embedder
    }),
  ],
  // ...
});
  npm install @genkit-ai/evaluator @genkit-ai/vertexai

먼저 testQuestions.json이라는 입력 데이터 세트로 사용할 입력 세트를 정의합니다. 이 입력 데이터 세트는 평가를 위한 출력을 생성하는 데 사용할 테스트 사례를 나타냅니다.

[
  "What is on the menu?",
  "Does the restaurant have clams?",
  "What is the special of the day?"
]

그런 다음 eval:flow 명령어를 사용하여 testQuestions.json에 제공된 테스트 사례를 기준으로 흐름을 평가할 수 있습니다.

genkit eval:flow menuQA --input testQuestions.json

그런 다음 다음을 실행하여 개발자 UI에서 평가 결과를 볼 수 있습니다.

genkit start

그런 다음 localhost:4000/evaluate로 이동합니다.

또는 json 파일의 출력을 검사할 수 있도록 출력 파일을 제공할 수 있습니다.

genkit eval:flow menuQA --input testQuestions.json --output eval-result.json

지원되는 평가자

Genkit 평가자

Genkit에는 RAGAS에서 영감을 받은 소수의 네이티브 평가자가 포함되어 있으며 시작하는 데 도움을 줍니다.

  • 충성
  • 답변 관련성
  • 악의성

평가자 플러그인

Genkit는 플러그인을 통해 추가 평가자를 지원합니다.

고급 사용

eval:flow는 흐름을 빠르게 평가할 수 있는 편리한 방법이지만 평가 단계를 더 세부적으로 제어해야 할 수도 있습니다. 이는 다른 프레임워크를 사용하고 있고 평가하려는 출력이 이미 있는 경우에 발생할 수 있습니다. eval:flow가 수행하는 모든 단계를 부분적으로 수동으로 수행할 수 있습니다.

Genkit 흐름을 일괄 실행하고 실행에 고유 라벨을 추가한 다음 평가 데이터 세트 (입력, 출력, 컨텍스트 집합)를 추출하는 데 사용할 수 있습니다.

테스트 입력을 통해 흐름을 실행합니다.

genkit flow:batchRun myRagFlow test_inputs.json --output flow_outputs.json --label customLabel

평가 데이터를 추출합니다.

genkit eval:extractData myRagFlow --label customLabel --output customLabel_dataset.json

내보낸 데이터는 각 testCase가 다음과 같은 형식의 json 파일로 출력됩니다.

[
  {
    "testCaseId": string,
    "input": string,
    "output": string,
    "context": array of strings,
    "traceIds": array of strings,
  }
]

데이터 추출기가 자동으로 검색기를 찾아 생성된 문서를 컨텍스트 배열에 추가합니다. 기본적으로 eval:run는 구성된 모든 평가자에 대해 실행되며 eval:flow와 마찬가지로 eval:run의 결과는 개발자 UI의 평가 페이지(localhost:4000/evaluate)에 표시됩니다.

맞춤 추출기

eval:extractDataeval:flow 명령어에 사용할 맞춤 추출기를 제공할 수도 있습니다. 맞춤 추출기를 사용하면 기본 추출 로직을 재정의할 수 있어 데이터 세트를 만들고 평가하는 데 더 많은 기능을 사용할 수 있습니다.

맞춤 추출기를 구성하려면 genkit-tools.conf.js이라는 도구 구성 파일을 프로젝트 루트에 추가합니다(아직 없는 경우).

cd $GENKIT_PROJECT_HOME
touch genkit-tools.conf.js

도구 구성 파일에 다음 코드를 추가합니다.

module.exports = {
  evaluators: [
    {
      flowName: 'myFlow',
      extractors: {
        context: { outputOf: 'foo-step' },
        output: 'bar-step',
      },
    },
  ],
};

이 샘플에서는 myFlow 흐름을 위한 추출기를 구성합니다. 구성은 contextoutput 필드의 추출기를 재정의하고 input 필드에 기본 로직을 사용했습니다.

평가 추출기의 사양은 다음과 같습니다.

  • evaluators 필드는 flowName로 범위가 지정된 EvaluatorConfig 객체의 배열을 허용합니다.
  • extractors는 추출기 재정의를 지정하는 객체입니다. 현재 extractors에서 지원되는 키는 [input, output, context]입니다. 사용 가능한 값 유형은 다음과 같습니다.
    • string - stirng으로 지정된 단계 이름이어야 합니다. 이 단계의 출력이 이 키에 대해 추출됩니다.
    • { inputOf: string } 또는 { outputOf: string } - 이 객체는 단계의 특정 채널 (입력 또는 출력)을 나타냅니다. 예를 들어 { inputOf: 'foo-step' }는 이 키에 대해 단계 foo-step의 입력을 추출합니다.
    • (trace) => string; - 유연성을 강화하기 위해 Genkit 트레이스를 허용하고 string를 반환하는 함수를 제공하고 이 함수 내에서 추출 로직을 지정할 수 있습니다. 정확한 TraceData 스키마는 genkit/genkit-tools/common/src/types/trace.ts를 참고하세요.

기존 데이터 세트에서 실행

이미 추출된 데이터 세트에 대해 평가를 실행하려면 다음 안내를 따르세요.

genkit eval:run customLabel_dataset.json

다른 위치로 출력하려면 --output 플래그를 사용합니다.

genkit eval:flow menuQA --input testQuestions.json --output customLabel_evalresult.json

구성된 평가자의 하위 집합을 실행하려면 --evaluators 플래그를 사용하고 이름별로 쉼표로 구분된 평가자 목록을 제공합니다.

genkit eval:run customLabel_dataset.json --evaluators=genkit/faithfulness,genkit/answer_relevancy

LLM을 사용하여 테스트 데이터 합성

다음은 PDF 파일을 사용하여 사용자가 물어볼 만한 질문을 생성하는 흐름의 예입니다.

export const synthesizeQuestions = defineFlow(
  {
    name: 'synthesizeQuestions',
    inputSchema: z.string().describe('PDF file path'),
    outputSchema: z.array(z.string()),
  },
  async (filePath) => {
    filePath = path.resolve(filePath);
    const pdfTxt = await run('extract-text', () => extractText(filePath));

    const chunks = await run('chunk-it', async () =>
      chunk(pdfTxt, chunkingConfig)
    );

    const questions: string[] = [];
    for (var i = 0; i < chunks.length; i++) {
      const qResponse = await generate({
        model: geminiPro,
        prompt: {
          text: `Generate one question about the text below: ${chunks[i]}`,
        },
      });
      questions.push(qResponse.text());
    }
    return questions;
  }
);

그런 다음 이 명령어를 사용하여 데이터를 파일로 내보내고 평가에 사용할 수 있습니다.

genkit flow:run synthesizeQuestions '"my_input.pdf"' --output synthesizedQuestions.json