평가

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

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

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

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

const ai = genkit({
  plugins: [
    vertexAI(),
    genkitEval({
      judge: gemini15Flash,
      metrics: [GenkitMetric.FAITHFULNESS, GenkitMetric.ANSWER_RELEVANCY],
      embedder: textEmbedding004, // GenkitMetric.ANSWER_RELEVANCY requires an embedder
    }),
  ],
  // ...
});

참고: 위 구성을 사용하려면 genkit, @genkit-ai/google-ai, @genkit-ai/evaluator, @genkit-ai/vertexai 패키지를 설치해야 합니다.

  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

참고: 아래에서 LLM을 사용하여 테스트 사례를 생성하는 방법의 예를 확인할 수 있습니다.

지원되는 평가자

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

맞춤 추출기

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

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

cd $GENKIT_PROJECT_HOME
touch genkit-tools.conf.js

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

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

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

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

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

참고: 이 모든 단계에서 추출된 데이터는 JSON 문자열입니다. 도구는 평가 시 이 JSON 문자열을 자동으로 파싱합니다. 함수 추출기를 제공하는 경우 출력이 유효한 JSON 문자열인지 확인합니다. 예를 들어 "Hello, world!"은 유효한 JSON이 아니며 "\"Hello, world!\""은 유효합니다.

기존 데이터 세트에서 실행

이미 추출된 데이터 세트에서 평가를 실행하려면 다음 단계를 따르세요.

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 파일을 사용하여 사용자가 물어볼 수 있는 질문을 생성하는 흐름의 예입니다.

import { genkit, run, z } from "genkit";
import { googleAI, gemini15Flash } from "@genkit-ai/googleai";
import { chunk } from "llm-chunk";

const ai = genkit({ plugins: [googleAI()] });

export const synthesizeQuestions = ai.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 ai.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