評估

評估是一種測試形式,可協助您驗證 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: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 欄位可接受 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