평가는 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는 플러그인을 통해 추가 평가자를 지원합니다.
- VertexAI 플러그인을 통한 VertexAI Rapid Evaluator
- LangChain 플러그인을 통한 LangChain 기준 평가
고급 사용
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:extractData
및 eval: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
흐름의 추출기를 구성합니다. 구성은 context
및 output
필드의 추출기를 재정의하고 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