Ocena

Oceny to forma testowania, która pomaga zweryfikować odpowiedzi LLM i upewnić się, że są zgodne z Twoim paskiem 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ędzia Genkit pomagają automatycznie wyodrębniać dane, w tym dane wejściowe, wyjściowe i informacje z kroków pośrednich, aby ocenić kompleksową jakość odpowiedzi LLM oraz zrozumieć wydajność elementów składowych systemu.

Jeśli na przykład korzystasz z procesu RAG, Genkit wyodrębni zestaw dokumentów zwróconych przez moduł pobierania, aby umożliwić Ci ocenę jakości modułu odbioru, który działa w kontekście procesu, jak pokazano poniżej z użyciem wskaźników wierności i trafności odpowiedzi w 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

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

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

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

genkit eval:flow menuQA --input testQuestions.json

Aby zobaczyć wyniki oceny w interfejsie dewelopera, uruchom polecenie:

genkit start

Następnie przejdź do: localhost:4000/evaluate.

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

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

Obsługiwani weryfikatorzy

Oceniający Genkit

Genkit obejmuje niewielką liczbę rodzimych weryfikatorów, których inspiracją jest RAGAS, którzy pomogą Ci zacząć:

  • Wiara
  • Trafność odpowiedzi
  • Złośliwość

Wtyczki 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że być potrzebna większa kontrola nad etapami oceny. Może się tak zdarzyć, jeśli używasz innej platformy i masz już dane wyjściowe, które chcesz ocenić. Wszystkie działania, które usługa eval:flow wykona, możesz wykonać częściowo ręcznie.

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

Przeprowadź przepływ dla danych wejściowych testowych:

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

Pobierz dane oceny:

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

Wyeksportowane dane zostaną wyeksportowane do pliku JSON z każdą wartością parametru „TestCase” w takim formacie:

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

Moduł wyodrębniania danych automatycznie zlokalizuje moduły pobierania i doda wygenerowane dokumenty do tablicy kontekstowego. Domyślnie test eval:run jest uruchamiany względem wszystkich skonfigurowanych oceniających. Tak jak w przypadku eval:flow, wyniki dotyczące eval:run pojawią się na stronie oceny w interfejsie dewelopera pod adresem localhost:4000/evaluate.

Niestandardowe moduły wyodrębniania

Możesz też udostępnić niestandardowe moduły wyodrębniania, które będą używane w poleceniach eval:extractData i eval:flow. Niestandardowe moduły wyodrębniania danych umożliwiają zastąpienie domyślnej logiki wyodrębniania, co daje Ci większą moc przy tworzeniu zbiorów danych i ich ocenie.

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

cd $GENKIT_PROJECT_HOME
touch genkit-tools.conf.js

W pliku konfiguracyjnym 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 użyła domyślnej logiki pola input.

Specyfikacja modułów wyodrębniania oceny jest następująca:

  • Pole evaluators akceptuje tablicę obiektów EvaluatorConfig, których zakres wynosi flowName
  • extractors to obiekt, który określa zastąpienia modułu wyodrębniania. Obecnie obsługiwane klucze w extractors to [input, output, context]. Akceptowane typy wartości:
    • string – powinna to być nazwa kroku podana jako stirng. Dla tego klucza wyodrębniane są dane wyjściowe uzyskane w tym kroku.
    • { inputOf: string } lub { outputOf: string } – te obiekty reprezentują konkretne kanały (wejściowe lub wyjściowe) kroku. Na przykład { inputOf: 'foo-step' } wyodrębni dane wejściowe kroku foo-step dla tego klucza.
    • (trace) => string; – aby uzyskać większą elastyczność, możesz podać funkcję, która akceptuje ślad Genkit i zwraca string, oraz określić w tej funkcji logikę ekstrakcji. Dokładny schemat TraceData znajdziesz w genkit/genkit-tools/common/src/types/trace.ts.

Działa na istniejących zbiorach danych

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

genkit eval:run customLabel_dataset.json

Aby wyświetlić dane wyjściowe w innej lokalizacji, użyj flagi --output.

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

Aby uruchomić test na podzbiorze skonfigurowanych oceniających, użyj flagi --evaluators i podaj listę oceniających według nazw rozdzielonych przecinkami:

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

Synteza danych testowych z użyciem LLM

Oto przykładowy proces, w którym plik PDF generuje potencjalne pytania, które użytkownicy mogą o nie pytać.

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;
  }
);

Następnie za pomocą tego polecenia możesz wyeksportować dane do pliku i użyć ich do oceny.

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