Değerlendirme

Değerlendirmeler, LLM'nizin yanıtlarını doğrulamanıza ve kalite çıtasını karşıladıklarından emin olmanıza yardımcı olan bir test şeklidir.

Firebase Genkit, LLM destekli uygulamalarınızın çalışma zamanındaki durumu hakkında bilgi sağlayan güçlü gözlemlenebilirlik özellikleriyle birlikte, üçüncü taraf değerlendirme araçlarını destekleyen eklentiler sunar. Genkit araçları, LLM yanıtlarının uçtan uca kalitesini değerlendirmenin yanı sıra sisteminizin yapı taşlarının performansını anlamak için girişler, çıkışlar ve ara adımlardaki bilgileri otomatik olarak ayıklamanıza yardımcı olur.

Örneğin, bir RAG akışınız varsa Genkit, alıcı tarafından döndürülen belge grubunu ayıklayarak alıcınızın akışın bağlamında çalışırken kalitesini değerlendirebilmenizi sağlar. Aşağıda, Genkit doğruluğu ve yanıt alaka düzeyi metrikleri gösterilmektedir:

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
    }),
  ],
  // ...
});

Not: Yukarıdaki yapılandırma için genkit, @genkit-ai/googleai, @genkit-ai/evaluator ve @genkit-ai/vertexai paketlerinin yüklenmesi gerekir.

  npm install @genkit-ai/evaluator @genkit-ai/vertexai

testInputs.json adlı bir giriş veri kümesi olarak kullanmak istediğiniz giriş grubunu tanımlayarak başlayın. Bu giriş veri kümesi, değerlendirme için çıktı oluşturmak üzere kullanacağınız test durumlarını temsil eder.

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

Değerlendirici, bir akışı değerlendirmek için referans çıkış gerektiriyorsa bunun yerine aşağıdaki biçimi kullanarak hem girişi hem de referans çıkışı iletebilirsiniz:

{
  "samples": [
    {
      "input": "What is the French word for Cheese?",
      "reference": "Fromage"
    },
    {
      "input": "What green vegetable looks like cauliflower?",
      "reference": "Broccoli"
    }
  ]
}

Giriş JSON dosyasında herhangi bir JSON veri türünü kullanabileceğinizi unutmayın. Genkit, bunları aynı veri türüyle birlikte akışınıza iletir.

Ardından, akışınızı testInputs.json'da sağlanan test durumlarına göre değerlendirmek için eval:flow komutunu kullanabilirsiniz.

genkit eval:flow menuSuggestionFlow --input testInputs.json

Akışınız için kimlik doğrulama gerekiyorsa --auth bağımsız değişkenini kullanarak bunu belirtebilirsiniz:

genkit eval:flow menuSuggestionFlow --input testInputs.json --auth "{\"email_verified\": true}"

Ardından, aşağıdaki komutu çalıştırarak değerlendirme sonuçlarını Geliştirici kullanıcı arayüzünde görebilirsiniz:

genkit start

Ardından localhost:4000/evaluate'e gidin.

Alternatif olarak, çıkışı JSON dosyasında incelemek için bir çıkış dosyası sağlayabilirsiniz.

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

Not: Aşağıda, bir LLM'nin test örneklerini oluşturmanıza nasıl yardımcı olabileceğine dair bir örnek görebilirsiniz.

Desteklenen değerlendiriciler

Genkit değerlendiricileri

Genkit, başlangıçta size yardımcı olmak için RAGAS'tan esinlenerek oluşturulmuş az sayıda yerel değerlendirici içerir:

  • Bağlılık
  • Yanıtın Alaka düzeyi
  • Kötü amaçlılık

Değerlendirici eklentileri

Genkit, VertexAI eklentisi aracılığıyla VertexAI Hızlı Değerlendiriciler gibi eklentiler üzerinden ek değerlendiricileri destekler.

İleri düzey kullanım

eval:flow, akışı hızlı bir şekilde değerlendirmenin kullanışlı bir yoludur ancak bazen değerlendirme adımları üzerinde daha fazla kontrole ihtiyacınız olabilir. Bu durum, farklı bir çerçeve kullanıyorsanız ve değerlendirmek istediğiniz bazı sonuçlar varsa ortaya çıkabilir. eval:flow'ün gerçekleştirdiği tüm adımları yarı manuel olarak gerçekleştirebilirsiniz.

Genkit akışınızı toplu olarak çalıştırabilir ve çalışmaya benzersiz bir etiket ekleyebilirsiniz. Bu etiket daha sonra bir değerlendirme veri kümesi (bir giriş, çıkış ve bağlam grubu) ayıklamak için kullanılır.

Akışları test girişleriniz üzerinde çalıştırın:

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

Değerlendirme verilerini ayıklayın:

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

Dışa aktarılan veriler, her testKazanımı aşağıdaki biçimde bir JSON dosyası olarak yayınlanır:

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

Veri ayıklayıcı, alıcıları otomatik olarak bulur ve oluşturulan dokümanları bağlam dizisine ekler. Varsayılan olarak eval:run, yapılandırılmış tüm değerlendiricilerle çalışır ve eval:flow gibi eval:run sonuçları da localhost:4000/evaluate adresindeki Geliştirici kullanıcı arayüzünün değerlendirme sayfasında görünür.

Özel çıkarıcılar

eval:extractData ve eval:flow komutlarında kullanılacak özel ayıklayıcılar da sağlayabilirsiniz. Özel ayıklayıcılar, varsayılan ayıklama mantığını geçersiz kılmanıza olanak tanır. Böylece, veri kümeleri oluşturma ve bunları değerlendirme konusunda daha fazla güce sahip olursunuz.

Özel ayıklayıcıları yapılandırmak için proje kökünüze (henüz yoksa) genkit-tools.conf.js adlı bir araç yapılandırma dosyası ekleyin.

cd $GENKIT_PROJECT_HOME
touch genkit-tools.conf.js

Araçlar yapılandırma dosyasına aşağıdaki kodu ekleyin:

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

Bu örnekte, myFlow akışı için bir ayrıştırıcı yapılandırırsınız. Yapılandırma, context ve output alanlarının ayıklayıcılarını geçersiz kılar ve input alanı için varsayılan mantığı kullanır.

Değerlendirme ayıklayıcılarının spesifikasyonu aşağıdaki gibidir:

  • evaluators alanı, flowName tarafından kapsamlandırılan bir dizi EvaluatorConfig nesnesi kabul eder.
  • extractors, ayrıştırıcı geçersiz kılma işlemlerini belirten bir nesnedir. extractors'te şu anda desteklenen anahtarlar [input, output, context]'dur. Kabul edilen değer türleri şunlardır:
    • string: Bir adım adı olmalıdır ve dize olarak belirtilmelidir. Bu adımdaki çıkış, bu anahtar için ayıklanır.
    • { inputOf: string } veya { outputOf: string }: Bu nesneler, bir adımın belirli kanallarını (giriş veya çıkış) temsil eder. Örneğin, { inputOf: 'foo-step' } bu anahtar için foo-step adımı girişini ayıklardı.
    • (trace) => string;: Daha fazla esneklik için bir Genkit izlemesini kabul eden ve string döndüren bir işlev sağlayabilir ve bu işlevin içinde ayıklama mantığını belirtebilirsiniz. TraceData şemasının tam olarak nasıl göründüğü için genkit/genkit-tools/common/src/types/trace.ts adresine bakın.

Not: Tüm bu adımlar için ayıklanan veriler JSON dizesi olacaktır. Araç, değerlendirme sırasında bu JSON dizesini otomatik olarak ayrıştırır. İşlev çıkarıcı sağlıyorsanız çıkışın geçerli bir JSON dizesi olduğundan emin olun. Örneğin: "Hello, world!" geçerli bir JSON değildir; "\"Hello, world!\"" geçerlidir.

Mevcut veri kümelerinde çalıştırma

Daha önce ayıklanmış bir veri kümesi üzerinde değerlendirme yapmak için:

genkit eval:run customLabel_dataset.json

Farklı bir konuma çıkış yapmak için --output işaretini kullanın.

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

Yapılandırılmış değerlendiricilerin bir alt kümesinde çalıştırmak için --evaluators işaretini kullanın ve adlarına göre virgülle ayrılmış bir değerlendirici listesi sağlayın:

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

LLM kullanarak test verilerini sentezleme

Aşağıda, kullanıcıların sorabileceği olası soruları oluşturmak için PDF dosyası kullanan bir örnek akış verilmiştir.

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

Ardından, verileri bir dosyaya aktarmak ve değerlendirmek için bu komutu kullanabilirsiniz.

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