Оценка

Оценки — это форма тестирования, которая помогает вам проверить ответы вашего 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: geminiPro,
      metrics: [GenkitMetric.FAITHFULNESS, GenkitMetric.ANSWER_RELEVANCY],
      embedder: textEmbeddingGecko, // GenkitMetric.ANSWER_RELEVANCY requires an embedder
    }),
  ],
  // ...
});
  npm install @genkit-ai/evaluator @genkit-ai/vertexai

Начните с определения набора входных данных, которые вы хотите использовать в качестве входного набора данных под названием testQuestions.json . Этот набор входных данных представляет собой тестовые примеры, которые вы будете использовать для создания выходных данных для оценки.

[
  "What is on the menu?",
  "Does the restaurant have clams?",
  "What is the special of the day?"
]

Затем вы можете использовать команду eval:flow , чтобы оценить свой поток по тестовым примерам, представленным в testQuestions.json .

genkit eval:flow menuQA --input testQuestions.json

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

genkit start

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

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

genkit eval:flow menuQA --input testQuestions.json --output eval-result.json

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

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

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

Экспортированные данные будут выводиться в виде файла 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: [
    {
      flowName: '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.

Работа с существующими наборами данных

Чтобы выполнить оценку уже извлеченного набора данных:

genkit eval:run customLabel_dataset.json

Для вывода в другое место используйте флаг --output .

genkit eval:flow menuQA --input testQuestions.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: geminiPro,
        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