評估是一種測試形式,可協助您驗證 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/googleai
、@genkit-ai/evaluator
和 @genkit-ai/vertexai
套件。
npm install @genkit-ai/evaluator @genkit-ai/vertexai
首先,請定義一組要用於做為輸入資料集的輸入內容,稱為 testInputs.json
。這個輸入資料集代表您用來產生評估輸出的測試案例。
["Cheese", "Broccoli", "Spinach and Kale"]
如果評估工具需要參考輸出內容來評估流程,您可以改用以下格式傳遞輸入內容和參考輸出內容:
{
"samples": [
{
"input": "What is the French word for Cheese?",
"reference": "Fromage"
},
{
"input": "What green vegetable looks like cauliflower?",
"reference": "Broccoli"
}
]
}
請注意,您可以在輸入的 JSON 檔案中使用任何 JSON 資料類型。Genkit 會將這些值連同相同的資料類型傳遞至流程。
接著,您可以使用 eval:flow
指令,根據 testInputs.json
提供的測試案例評估流程。
genkit eval:flow menuSuggestionFlow --input testInputs.json
如果流程需要驗證,您可以使用 --auth
引數指定驗證:
genkit eval:flow menuSuggestionFlow --input testInputs.json --auth "{\"email_verified\": true}"
接著,您可以執行以下指令,在開發人員 UI 中查看評估結果:
genkit start
然後前往 localhost:4000/evaluate
。
或者,您也可以提供輸出檔案,以便檢查 JSON 檔案中的輸出內容。
genkit eval:flow menuSuggestionFlow --input testInputs.json --output eval-result.json
注意:以下是 LLM 如何協助您產生測試案例的範例。
支援的評估工具
Genkit 評估工具
Genkit 包含少數原生評估工具,靈感來自 RAGAS,可協助您開始使用:
- 忠誠
- 答案關聯性
- 惡意
評估工具外掛程式
Genkit 透過 VertexAI 外掛程式支援其他評估工具,例如 Vertex AI Rapid 評估工具。
進階用途
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
匯出的資料會以 JSON 檔案格式輸出,其中每個 testCase 的格式如下:
[
{
"testCaseId": string,
"input": string,
"output": string,
"context": array of strings,
"traceIds": array of strings,
}
]
資料擷取器會自動尋找擷取器,並將產生的文件新增至 context 陣列。根據預設,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: [
{
actionRef: '/flow/myFlow',
extractors: {
context: { outputOf: 'foo-step' },
output: 'bar-step',
},
},
],
};
在本範例中,您會為 myFlow
流程設定擷取器。設定會覆寫 context
和 output
欄位的擷取工具,並使用 input
欄位的預設邏輯。
評估擷取器的規格如下:
evaluators
欄位可接受 EvaluatorConfig 物件的陣列,其範圍由flowName
指定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!\""
則是有效的 JSON。
在現有資料集上執行
如要針對已擷取的資料集執行評估作業,請按照下列步驟操作:
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";
import path from 'path';
const ai = genkit({ plugins: [googleAI()] });
const chunkingConfig = {
minLength: 1000, // number of minimum characters into chunk
maxLength: 2000, // number of maximum characters into chunk
splitter: 'sentence', // paragraph | sentence
overlap: 100, // number of overlap chracters
delimiters: '', // regex for base split method
} as any;
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);
// `extractText` loads the PDF and extracts its contents as text.
// See our RAG documentation for more details.
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