평가

평가는 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: gemini15Flash,
      metrics: [GenkitMetric.FAITHFULNESS, GenkitMetric.ANSWER_RELEVANCY],
      embedder: textEmbeddingGecko, // GenkitMetric.ANSWER_RELEVANCY requires an embedder
    }),
  ],
  // ...
});
  npm install @genkit-ai/evaluator @genkit-ai/vertexai

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

["Cheese", "Broccoli", "Spinach and Kale"]

그런 다음 eval:flow 명령어를 사용하여 testInputs.json에 제공된 테스트 사례와 비교하여 흐름을 평가할 수 있습니다.

genkit eval:flow menuSuggestionFlow --input testInputs.json

그러면 다음을 실행하여 개발자 UI에서 평가 결과를 확인할 수 있습니다.

genkit start

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

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

genkit eval:flow menuSuggestionFlow --input testInputs.json --output eval-result.json

지원되는 평가자

Genkit 평가자

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

  • 신앙
  • 답변 관련성
  • 악의성

Evaluator 플러그인

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의 결과는 localhost:4000/evaluate에 있는 개발자 UI의 평가 페이지에 표시됩니다.

맞춤 추출기

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 menuSuggestionFlow --input testInputs.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: gemini15Flash,
        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