Оценка — это форма тестирования, которая поможет вам проверить ответы вашего LLM и убедиться, что они соответствуют вашей планке качества.
Firebase Genkit поддерживает сторонние инструменты оценки через плагины в сочетании с мощными функциями наблюдения, которые дают представление о состоянии выполнения ваших приложений на базе LLM. Инструменты Genkit помогают автоматически извлекать данные, включая входные и выходные данные, а также информацию из промежуточных шагов, чтобы оценить сквозное качество ответов LLM, а также понять производительность строительных блоков вашей системы.
Виды оценки
Genkit поддерживает два типа оценки:
Оценка, основанная на выводах : этот тип оценки проводится на основе набора заранее определенных входных данных, оценивая качество соответствующих результатов.
Это наиболее распространенный тип оценки, подходящий для большинства случаев использования. Этот подход проверяет фактические выходные данные системы для каждого запуска оценки.
Оценку качества можно выполнить вручную, визуально проверив результаты. Альтернативно вы можете автоматизировать оценку, используя метрику оценки.
Необработанная оценка : этот тип оценки напрямую оценивает качество исходных данных без каких-либо выводов. Этот подход обычно используется при автоматизированной оценке с использованием показателей. Все необходимые поля для оценки (например,
input
,context
,output
иreference
) должны присутствовать во входном наборе данных. Это полезно, когда у вас есть данные, поступающие из внешнего источника (например, собранные по следам вашего производства), и вы хотите иметь объективное измерение качества собранных данных.Дополнительную информацию см. в разделе «Расширенное использование» на этой странице.
В этом разделе объясняется, как выполнить оценку на основе логических выводов с помощью Genkit.
Быстрый старт
Настраивать
- Используйте существующее приложение Genkit или создайте новое, следуя нашему руководству [Начало работы](get-started.md).
- Добавьте следующий код, чтобы определить простое приложение RAG для оценки. В этом руководстве мы используем фиктивный поисковик, который всегда возвращает одни и те же документы.
import { genkit, z, Document } from "genkit"; import { googleAI, gemini15Flash, } from "@genkit-ai/googleai"; // Initialize Genkit export const ai = genkit ({ plugins: [ googleAI(), ] }); // Dummy retriever that always returns the same docs export const dummyRetriever = ai.defineRetriever( { name: "dummyRetriever", }, async (i) => { const facts = [ "Dog is man's best friend", "Dogs have evolved and were domesticated from wolves", ]; // Just return facts as documents. return { documents: facts.map((t) => Document.fromText(t)) }; } ); // A simple question-answering flow export const qaFlow = ai.defineFlow({ name: 'qaFlow', inputSchema: z.string(), outputSchema: z.string(), }, async (query) => { const factDocs = await ai.retrieve({ retriever: dummyRetriever, query, }); const llmResponse = await ai.generate({ model: gemini15Flash, prompt: `Answer this question with the given context ${query}`, docs: factDocs, }); return llmResponse.text; } );
- (Необязательно) Добавьте показатели оценки в свое приложение, чтобы использовать их при оценке. В этом руководстве используется метрика
MALICIOUSNESS
из плагинаgenkitEval
. Примечание. Для приведенной выше конфигурации требуется установка пакетаimport { genkitEval, GenkitMetric } from "@genkit-ai/evaluator"; import { gemini15Pro } from "@genkit-ai/googleai"; export const ai = genkit ({ plugins: [ ... // Add this plugin to your Genkit initialization block genkitEval({ judge: gemini15Pro, metrics: [GenkitMetric.MALICIOUSNESS], }), ] });
@genkit-ai/evaluator
.npm install @genkit-ai/evaluator
- Запустите приложение Genkit.
genkit start --
Создать набор данных
Создайте набор данных, чтобы определить примеры, которые мы хотим использовать для оценки нашего потока.
Перейдите в пользовательский интерфейс разработчика по адресу
http://localhost:4000
и нажмите кнопку « Наборы данных» , чтобы открыть страницу «Наборы данных».Нажмите кнопку «Создать набор данных» , чтобы открыть диалоговое окно создания набора данных.
а. Укажите
datasetId
для вашего нового набора данных. В этом руководстве используетсяmyFactsQaDataset
.б. Выберите тип набора данных
Flow
.в. Оставьте поле цели проверки пустым и нажмите « Сохранить».
Появится страница нового набора данных с пустым набором данных. Добавьте к нему примеры, выполнив следующие действия:
а. Нажмите кнопку «Добавить пример» , чтобы открыть панель редактора примеров.
б. Требуется только поле
input
. Введите"Who is man's best friend?"
в полеinput
и нажмите «Сохранить» , чтобы добавить пример в ваш набор данных.в. Повторите шаги (а) и (б) еще пару раз, чтобы добавить больше примеров. В этом руководстве в набор данных добавляются следующие входные данные:
"Can I give milk to my cats?" "From which animals did dogs evolve?"
К концу этого шага ваш набор данных должен содержать 3 примера со значениями, указанными выше.
Запустите оценку и просмотрите результаты
Чтобы начать оценку потока, нажмите кнопку «Запустить новую оценку» на странице набора данных. Вы также можете начать новую оценку на вкладке «Оценки» .
Выберите переключатель «
Flow
», чтобы оценить поток.Выберите
qaFlow
в качестве целевого потока для оценки.Выберите
myFactsQaDataset
в качестве целевого набора данных, который будет использоваться для оценки.(Необязательно) Если вы установили метрику оценщика с помощью плагинов Genkit, вы можете увидеть эти метрики на этой странице. Выберите метрики, которые вы хотите использовать в этом прогоне оценки. Это совершенно необязательно: если пропустить этот шаг, результаты оценки все равно будут возвращены, но без каких-либо связанных показателей.
Наконец, нажмите «Запустить оценку», чтобы начать оценку. В зависимости от тестируемого потока это может занять некоторое время. После завершения оценки появится сообщение об успешном выполнении со ссылкой для просмотра результатов. Нажмите на ссылку, чтобы перейти на страницу сведений об оценке .
На этой странице вы можете увидеть подробную информацию о своей оценке, включая исходные данные, извлеченный контекст и показатели (если таковые имеются).
Основные понятия
Терминология
Оценка : Оценка — это процесс, который оценивает производительность системы. В Genkit такой системой обычно является примитив Genkit, например поток или модель. Оценка может быть автоматизированной или ручной (оценка человеком).
Массовый вывод. Вывод — это ввод входных данных в поток или модель для получения соответствующего вывода. Массовый вывод предполагает одновременное выполнение вывода по нескольким входным данным.
Метрика Метрика оценки — это критерий, по которому оценивается вывод. Примеры включают точность, достоверность, злонамеренность, вывод на английском языке и т. д.
Набор данных Набор данных — это набор примеров, которые можно использовать для оценки на основе логических выводов. Набор данных обычно состоит из
input
и дополнительныхreference
полей.reference
поле не влияет на этап вывода оценки, но оно дословно передается любым метрикам оценки. В Genkit вы можете создать набор данных через пользовательский интерфейс разработчика. В Genkit есть два типа наборов данных: наборы данных потока и наборы данных модели .
Проверка схемы
В зависимости от типа наборы данных имеют поддержку проверки схемы в пользовательском интерфейсе разработчика:
Наборы данных потока поддерживают проверку
input
иreference
полей набора данных на соответствие потоку в приложении Genkit. Проверка схемы не является обязательной и применяется только в том случае, если схема указана в целевом потоке.Наборы данных модели имеют неявную схему, поддерживающую как
string
, так и типы вводаGenerateRequest
. Проверка строк обеспечивает удобный способ оценки простых текстовых подсказок, аGenerateRequest
обеспечивает полный контроль над расширенными вариантами использования (например, предоставление параметров модели, истории сообщений, инструментов и т. д.). Полную схемуGenerateRequest
можно найти в нашей справочной документации по API .
Поддерживаемые оценщики
Оценщики Генкита
Genkit включает в себя небольшое количество встроенных оценщиков, вдохновленных RAGAS , которые помогут вам начать работу:
- Достоверность — измеряет фактическую согласованность сгенерированного ответа в данном контексте.
- Релевантность ответа – оценивает, насколько сгенерированный ответ соответствует заданному запросу.
- Вредоносность. Определяет, намерены ли сгенерированные выходные данные обмануть, нанести вред или использовать в своих целях.
Плагины оценщика
Genkit поддерживает дополнительные оценщики через плагины, такие как Vertex Rapid Evaluators, доступ к которым можно получить через плагин VertexAI .
Расширенное использование
Оценка с использованием CLI
Genkit CLI предоставляет богатый API для выполнения оценки. Это особенно полезно в средах, где пользовательский интерфейс разработчика недоступен (например, в рабочем процессе CI/CD).
Genkit CLI предоставляет 3 основные команды оценки: eval:flow
, eval:extractData
и eval:run
.
eval:flow
Команда eval:flow
запускает оценку входного набора данных на основе логических выводов. Этот набор данных можно предоставить либо в виде файла JSON, либо путем ссылки на существующий набор данных в среде выполнения Genkit.
# Referencing an existing dataset genkit eval:flow qaFlow --input myFactsQaDataset
# or, using a dataset from a file genkit eval:flow qaFlow --input testInputs.json
Здесь testInputs.json
должен представлять собой массив объектов, содержащий поле input
и необязательное поле reference
, как показано ниже:
[
{
"input": "What is the French word for Cheese?",
},
{
"input": "What green vegetable looks like cauliflower?",
"reference": "Broccoli"
}
]
Если ваш поток требует аутентификации, вы можете указать ее с помощью аргумента --context
:
genkit eval:flow qaFlow --input testInputs.json --context '{"auth": {"email_verified": true}}'
По умолчанию команды eval:flow
и eval:run
используют для оценки все доступные метрики. Чтобы запустить подмножество настроенных оценщиков, используйте флаг --evaluators
и укажите список оценщиков, разделенных запятыми, по именам:
genkit eval:flow qaFlow --input testInputs.json --evaluators=genkitEval/maliciousness,genkitEval/answer_relevancy
Вы можете просмотреть результаты вашей оценки в пользовательском интерфейсе разработчика по адресу localhost:4000/evaluate
.
команды eval:extractData
и eval:run
Для поддержки необработанной оценки Genkit предоставляет инструменты для извлечения данных из трассировок и выполнения показателей оценки извлеченных данных. Это полезно, например, если вы используете другую структуру для оценки или если вы собираете выводы из другой среды для локальной проверки качества выходных данных.
Вы можете выполнить пакетный запуск потока Genkit и добавить к нему уникальную метку, которую затем можно использовать для извлечения набора оценочных данных . Необработанный набор данных оценки представляет собой набор входных данных для показателей оценки без каких-либо предварительных выводов.
Запустите поток поверх тестовых входных данных:
genkit flow:batchRun qaFlow testInputs.json --label firstRunSimple
Извлеките данные оценки:
genkit eval:extractData qaFlow --label firstRunSimple --output factsEvalDataset.json
Экспортированные данные имеют формат, отличный от формата набора данных, представленного ранее. Это связано с тем, что эти данные предназначены для непосредственного использования с метриками оценки, без какого-либо этапа вывода. Вот синтаксис извлеченных данных.
Array<{
"testCaseId": string,
"input": any,
"output": any,
"context": any[],
"traceIds": string[],
}>;
Средство извлечения данных автоматически находит средства извлечения и добавляет созданные документы в массив контекстов. Вы можете запустить метрики оценки для этого извлеченного набора данных с помощью команды eval:run
.
genkit eval:run factsEvalDataset.json
По умолчанию eval:run
запускается для всех настроенных оценщиков, и, как и в случае с eval:flow
, результаты для eval:run
отображаются на странице оценки пользовательского интерфейса разработчика, расположенной по адресу localhost:4000/evaluate
.
Пользовательские экстракторы
Genkit предоставляет разумную логику по умолчанию для извлечения необходимых полей ( input
, output
и context
) во время выполнения оценки. Однако вы можете обнаружить, что вам нужен больший контроль над логикой извлечения этих полей. Genkit поддерживает таможенные экстракторы для достижения этой цели. Вы можете предоставить собственные экстракторы для использования в командах eval:extractData
и eval:flow
.
Сначала в качестве подготовительного шага добавьте вспомогательный шаг в нашем примере qaFlow
:
export const qaFlow = ai.defineFlow({
name: 'qaFlow',
inputSchema: z.string(),
outputSchema: z.string(),
},
async (query) => {
const factDocs = await ai.retrieve({
retriever: dummyRetriever,
query,
});
const factDocsModified = await ai.run('factModified', async () => {
// Let us use only facts that are considered silly. This is a
// hypothetical step for demo purposes, you may perform any
// arbitrary task inside a step and reference it in custom
// extractors.
//
// Assume you have a method that checks if a fact is silly
return factDocs.filter(d => isSillyFact(d.text));
});
const llmResponse = await ai.generate({
model: gemini15Flash,
prompt: `Answer this question with the given context ${query}`,
docs: factDocsModified,
});
return llmResponse.text;
}
);
Затем настройте пользовательский экстрактор для использования результатов шага factModified
при оценке этого потока.
Если у вас нет файла конфигурации инструментов для настройки пользовательских экстракторов, добавьте файл с именем genkit-tools.conf.js
в корень вашего проекта.
cd /path/to/your/genkit/app
touch genkit-tools.conf.js
В файле конфигурации инструментов добавьте следующий код:
module.exports = {
evaluators: [
{
actionRef: '/flow/qaFlow',
extractors: {
context: { outputOf: 'factModified' },
},
},
],
};
Эта конфигурация переопределяет экстракторы инструментов Genkit по умолчанию, в частности изменяя то, что считается context
при оценке этого потока.
Повторный запуск оценки показывает, что контекст теперь заполняется как результат шага factModified
.
genkit eval:flow qaFlow --input testInputs.json
Экстракторы оценки определяются следующим образом:
- Поле
evaluators
принимает массив объектов EvaluatorConfig, область действия которых ограниченаflowName
-
extractors
— это объект, который определяет переопределения экстрактора. Текущие поддерживаемые ключи вextractors
:[input, output, context]
. Допустимые типы значений:-
string
— это должно быть имя шага, указанное в виде строки. Выходные данные этого шага извлекаются для этого ключа. -
{ inputOf: string }
или{ outputOf: string }
— эти объекты представляют определенные каналы (входные или выходные) шага. Например,{ inputOf: 'foo-step' }
извлечет ввод шагаfoo-step
для этого ключа. -
(trace) => string;
— Для большей гибкости вы можете предоставить функцию, которая принимает трассировку Genkit и возвращает значениеany
типа, а также указать логику извлечения внутри этой функции. Обратитесь кgenkit/genkit-tools/common/src/types/trace.ts
для получения точной схемы TraceData.
-
Примечание. Извлеченные данные для всех этих экстракторов имеют тип, соответствующий экстрактору. Например, если вы используете context: { outputOf: 'foo-step' }
и foo-step
возвращает массив объектов, извлеченный контекст также является массивом объектов.
Синтез тестовых данных с использованием LLM
Вот пример процесса, в котором PDF-файл используется для генерации вопросов потенциальных пользователей.
import { genkit, z } from "genkit";
import { googleAI, gemini15Flash } from "@genkit-ai/googleai";
import { chunk } from "llm-chunk"; // npm i llm-chunk
import path from "path";
import { readFile } from "fs/promises";
import pdf from "pdf-parse"; // npm i pdf-parse
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;
async function extractText(filePath: string) {
const pdfFile = path.resolve(filePath);
const dataBuffer = await readFile(pdfFile);
const data = await pdf(dataBuffer);
return data.text;
}
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.
const pdfTxt = await ai.run("extract-text", () => extractText(filePath));
const chunks = await ai.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