Ocena

Oceny to forma testowania, która pomaga zweryfikować odpowiedzi LLM i upewnić się, że spełniają one Twoje wymagania jakości.

Firebase Genkit obsługuje zewnętrzne narzędzia do oceny za pomocą wtyczek w połączeniu z zaawansowanymi funkcjami dostrzegalności, które zapewniają wgląd w stan środowiska wykonawczego aplikacji opartych na LLM. Narzędzie Genkit pomaga automatycznie wyodrębniać dane, w tym dane wejściowe, wyjściowe i informacje z kroków pośrednich, w celu oceny całościowej jakości odpowiedzi LLM oraz oceny wydajności elementów składowych Twojego systemu.

Jeśli na przykład korzystasz z przepływu RAG, Genkit wyodrębni zestaw dokumentów zwróconych przez retrievera, aby można było ocenić jego jakość podczas działania w kontekście przepływu, jak pokazano poniżej. Dane o wierności i trafności odpowiedzi Genkit:

import { GenkitMetric, genkitEval } from '@genkit-ai/evaluator';
import { textEmbeddingGecko } from '@genkit-ai/vertexai';

export default configureGenkit({
  plugins: [
    genkitEval({
      judge: gemini15Flash,
      metrics: [GenkitMetric.FAITHFULNESS, GenkitMetric.ANSWER_RELEVANCY],
      embedder: textEmbeddingGecko, // GenkitMetric.ANSWER_RELEVANCY requires an embedder
    }),
  ],
  // ...
});
  npm install @genkit-ai/evaluator @genkit-ai/vertexai

Zacznij od zdefiniowania zbioru danych wejściowych, których chcesz użyć jako wejściowego zbioru danych o nazwie testInputs.json. Ten wejściowy zbiór danych reprezentuje przypadki testowe, których będziesz używać do generowania danych wyjściowych na potrzeby oceny.

["Cheese", "Broccoli", "Spinach and Kale"]

Następnie możesz za pomocą polecenia eval:flow ocenić przepływ w odniesieniu do przypadków testowych podanych w testInputs.json.

genkit eval:flow menuSuggestionFlow --input testInputs.json

Wyniki oceny możesz sprawdzić w interfejsie dewelopera, uruchamiając polecenie:

genkit start

Następnie przejdź pod adres localhost:4000/evaluate.

Możesz też udostępnić plik wyjściowy, aby sprawdzić dane wyjściowe w pliku json.

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

Obsługiwani weryfikatorzy

Weryfikatorzy Genkit

W Genkit jest niewielka liczba lokalnych weryfikatorów, którzy są zainspirowani przez RAGAS, aby ułatwić Ci rozpoczęcie pracy:

  • Wiarygodność
  • Trafność odpowiedzi
  • Szkodliwość

Wtyczki służące do oceny

Genkit obsługuje dodatkowych weryfikatorów za pomocą wtyczek:

Do wymagających zadań

eval:flow to wygodny sposób na szybką ocenę procesu, ale czasami możesz potrzebować większej kontroli nad etapami oceny. Może się tak zdarzyć, jeśli używasz innej struktury i masz już dane wyjściowe, które chcesz ocenić. Wszystkie czynności wykonywane przez eval:flow możesz wykonać półręcznie.

Możesz uruchomić wsadowo przepływ Genkit i dodać do niego unikalną etykietę, która zostanie użyta do wyodrębnienia zbioru danych do oceny (zbioru danych wejściowych, danych wyjściowych i kontekstów).

Uruchom przepływ po testowych danych wejściowych:

genkit flow:batchRun myRagFlow test_inputs.json --output flow_outputs.json --label customLabel

Wyodrębnij dane oceny:

genkit eval:extractData myRagFlow --label customLabel --output customLabel_dataset.json

Wyeksportowane dane zostaną wyeksportowane jako plik JSON z każdym przypadkiem testowym w takim formacie:

[
  {
    "testCaseId": string,
    "input": string,
    "output": string,
    "context": array of strings,
    "traceIds": array of strings,
  }
]

Ekstraktor danych automatycznie znajdzie moduły do pobierania i doda wygenerowane dokumenty do tablicy kontekstu. Domyślnie test eval:run będzie uruchamiany względem wszystkich skonfigurowanych weryfikatorów. Podobnie jak w przypadku wersji eval:flow wyniki testu eval:run pojawią się na stronie oceny w interfejsie dewelopera dostępnej pod adresem localhost:4000/evaluate.

Niestandardowe moduły wyodrębniania

Możesz też udostępnić niestandardowe moduły wyodrębniania danych do użycia w poleceniach eval:extractData i eval:flow. Niestandardowe moduły wyodrębniania pozwalają zastąpić domyślną logikę wyodrębniania, co daje większe możliwości tworzenia i oceniania zbiorów danych.

Aby skonfigurować niestandardowe moduły wyodrębniania, dodaj plik konfiguracyjny narzędzi o nazwie genkit-tools.conf.js do katalogu głównego projektu, jeśli jeszcze go nie masz.

cd $GENKIT_PROJECT_HOME
touch genkit-tools.conf.js

W pliku konfiguracji narzędzi dodaj ten kod:

module.exports = {
  evaluators: [
    {
      flowName: 'myFlow',
      extractors: {
        context: { outputOf: 'foo-step' },
        output: 'bar-step',
      },
    },
  ],
};

W tym przykładzie skonfigurujesz wyodrębnianie dla przepływu myFlow. Konfiguracja zastępuje moduły wyodrębniania pól context i output oraz została użyta domyślna logika pola input.

Specyfikacja modułów wyodrębniania oceny wygląda tak:

  • Pole evaluators akceptuje tablicę obiektów EvaluatorConfig ograniczonych do zakresu flowName
  • extractors to obiekt określający zastąpienia modułu wyodrębniania. Obecnie obsługiwane klucze w tym języku: extractors to [input, output, context]. Akceptowane typy wartości:
    • string – powinna to być nazwa kroku określona jako stirng. Dane wyjściowe tego kroku zostaną wyodrębnione dla tego klucza.
    • { inputOf: string } lub { outputOf: string } – te obiekty reprezentują poszczególne kanały (wejściowe lub wyjściowe) kroku. Na przykład funkcja { inputOf: 'foo-step' } wyodrębniłaby dane wejściowe z kroku foo-step dla tego klucza.
    • (trace) => string; – aby uzyskać większą elastyczność, możesz podać funkcję, która akceptuje log czasu Genkit i zwraca string, oraz określić logikę wyodrębniania w tej funkcji. Dokładny schemat TraceData znajdziesz na genkit/genkit-tools/common/src/types/trace.ts.

Działanie na istniejących zbiorach danych

Aby przeprowadzić ocenę na już wyodrębnionym zbiorze danych:

genkit eval:run customLabel_dataset.json

Aby przesłać dane wyjściowe do innej lokalizacji, użyj flagi --output.

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

Aby przeprowadzić pracę na podzbiorze skonfigurowanych weryfikatorów, użyj flagi --evaluators i podaj listę rozdzielonych przecinkami nazw weryfikatorów:

genkit eval:run customLabel_dataset.json --evaluators=genkit/faithfulness,genkit/answer_relevancy

Synteza danych testowych przy użyciu LLM

Oto przykładowy proces wykorzystujący plik PDF do wygenerowania możliwych pytań, które mogą zadawać użytkownicy.

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: gemini15Flash,
        prompt: {
          text: `Generate one question about the text below: ${chunks[i]}`,
        },
      });
      questions.push(qResponse.text());
    }
    return questions;
  }
);

Następnie możesz użyć tego polecenia, aby wyeksportować dane do pliku i wykorzystać je do oceny.

genkit flow:run synthesizeQuestions '"my_input.pdf"' --output synthesizedQuestions.json