Оценка

Оценки — это форма тестирования, которая помогает вам проверить ответы вашего 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}"

Затем вы можете просмотреть результаты оценки в пользовательском интерфейсе разработчика, выполнив:

genkit start

Затем перейдите к localhost:4000/evaluate .

Альтернативно вы можете предоставить выходной файл для проверки вывода в файле JSON.

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

Примечание. Ниже вы можете увидеть пример того, как LLM может помочь вам создать тестовые примеры.

Поддерживаемые оценщики

Оценщики Генкита

Genkit включает в себя небольшое количество встроенных оценщиков, вдохновленных RAGAS, которые помогут вам начать работу:

  • Верность
  • Релевантность ответа
  • злонамеренность

Плагины оценщика

Genkit поддерживает дополнительные оценщики через плагины, такие как VertexAI Rapid Evaluators через плагин VertexAI .

Расширенное использование

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,
  }
]

Средство извлечения данных автоматически найдет средства извлечения и добавит созданные документы в массив контекстов. По умолчанию eval:run будет выполняться для всех настроенных оценщиков, и, как и eval:flow , результаты для eval:run появятся на странице оценки пользовательского интерфейса разработчика, расположенной по адресу localhost:4000/evaluate .

Пользовательские экстракторы

Вы также можете предоставить собственные экстракторы для использования в командах 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 , и указать логику извлечения внутри этой функции. Обратитесь к genkit/genkit-tools/common/src/types/trace.ts для получения точной схемы TraceData.

Примечание. Извлеченные данные для всех этих шагов будут представлять собой строку 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";
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