Değerlendirme, 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.
Değerlendirme türleri
Genkit iki tür değerlendirmeyi destekler:
Tahmine dayalı değerlendirme: Bu tür bir değerlendirme, önceden belirlenmiş bir giriş koleksiyonuna göre çalışır ve ilgili çıkışları kalite açısından değerlendirir.
Bu, çoğu kullanım alanı için uygun olan en yaygın değerlendirme türüdür. Bu yaklaşım, her değerlendirme çalıştırmasında sistemin gerçek çıktısını test eder.
Sonuçları görsel olarak inceleyerek kalite değerlendirmesini manuel olarak yapabilirsiniz. Alternatif olarak, değerlendirme metriği kullanarak değerlendirmeyi otomatik hale getirebilirsiniz.
Ham değerlendirme: Bu değerlendirme türü, herhangi bir çıkarım yapmadan doğrudan girişlerin kalitesini değerlendirir. Bu yaklaşım genellikle metrikleri kullanan otomatik değerlendirmeyle birlikte kullanılır. Değerlendirme için gerekli tüm alanlar (ör.
input
,context
,output
vereference
) giriş veri kümesinde bulunmalıdır. Bu özellik, harici bir kaynaktan gelen verileriniz (ör. üretim izlemelerinizden toplanan veriler) olduğunda ve toplanan verilerin kalitesini objektif bir şekilde ölçmek istediğinizde kullanışlıdır.Daha fazla bilgi için bu sayfanın Gelişmiş kullanım bölümüne bakın.
Bu bölümde, Genkit'i kullanarak çıkarım temelli değerlendirmenin nasıl yapılacağı açıklanmaktadır.
Hızlı başlangıç
Kurulum
- Mevcut bir Genkit uygulamasını kullanabilir veya [Başlangıç](get-started) kılavuzumuzu uygulayarak yeni bir uygulama oluşturabilirsiniz.
- Değerlendirilecek basit bir RAG uygulaması tanımlamak için aşağıdaki kodu ekleyin. Bu kılavuzda, her zaman aynı belgeleri döndüren bir örnek alıcı kullanıyoruz. ```js import { genkit, z, Document } from "genkit"; import { googleAI, gemini15Flash, gemini15Pro, } from "@genkit-ai/googleai"; // Genkit'i başlatın export const ai = genkit ({ plugins: [ googleAI(), ] }); // Her zaman aynı dokümanları döndüren örnek alıcı export const dummyRetriever = ai.defineRetriever( { name: "dummyRetriever", }, async (i) => { const facts = [ "Köpek insanın en iyi arkadaşıdır", "Köpekler kurtlardan evrim geçirip evcilleştirilmiştir", ]; // Yalnızca gerçekleri doküman olarak döndürün. return { documents: facts.map((t) => Document.fromText(t)) }; } ); // Basit bir soru yanıtlama akışı export const qaFlow = ai.defineFlow({ name: 'qaFlow', inputSchema: z.string(), outputSchema: z.string(), }, async (query) => { const factDocs = await ai.retrieve({ retriever: dummyRetriever, query, options: { k: 2 }, }); const llmResponse = await ai.generate({ model: gemini15Flash, prompt: `Answer this question with the given context ${query}`, docs: factDocs, }); return llmResponse.text; } ); ```
- (İsteğe bağlı) Değerlendirme sırasında kullanmak üzere uygulamanıza değerlendirme metrikleri ekleyin. Bu kılavuzda, `genkitEval` eklentisinin `MALICIOUSNESS` metriği kullanılmaktadır. ```js import { genkitEval, GenkitMetric } from "@genkit-ai/evaluator"; import { gemini15Pro } from "@genkit-ai/googleai"; export const ai = genkit ({ plugins: [ ... // Bu eklentiyi Genkit başlatma bloğunuza ekleyin genkitEval({ judge: gemini15Pro, metrics: [GenkitMetric.MALICIOUSNESS], }), ] }); ``` **Not:** Yukarıdaki yapılandırma için [`@genkit-ai/evaluator`](https://www.npmjs.com/package/@genkit-ai/evaluator) paketinin yüklenmesi gerekir. ```posix-terminal npm install @genkit-ai/evaluator ```
- Genkit uygulamanızı başlatın
```posix-terminal
genkit start --
```
Veri kümesi oluşturma
Akışımızı değerlendirmek için kullanmak istediğimiz örnekleri tanımlamak üzere bir veri kümesi oluşturun.
http://localhost:4000
adresindeki Geliştirici kullanıcı arayüzüne gidin ve Veri Kümeleri sayfasını açmak için Veri Kümeleri düğmesini tıklayın.Veri kümesi oluşturma iletişim kutusunu açmak için Veri Kümesi Oluştur düğmesini tıklayın.
a. Yeni veri kümeniz için bir
datasetId
sağlayın. Bu kılavuzdamyFactsQaDataset
kullanılmaktadır.b.
Flow
veri kümesi türünü seçin.c. Doğrulama hedefi alanını boş bırakın ve Kaydet'i tıklayın.
Boş bir veri kümesini gösteren yeni veri kümesi sayfanız görünür. Aşağıdaki adımları uygulayarak bu makaleye örnek ekleyin:
a. Örnek düzenleyici panelini açmak için Örnek ekle düğmesini tıklayın.
b. Yalnızca
input
alanı zorunludur.input
alanına"Who is man's best friend?"
yazın ve örnek öğeleri veri kümenize eklemek için Kaydet'i tıklayın.c. Daha fazla örnek eklemek için (a) ve (b) adımlarını birkaç kez daha tekrarlayın. Bu kılavuzda, veri kümesine aşağıdaki örnek girişler eklenmiştir:
"Can I give milk to my cats?" "From which animals did dogs evolve?"
Bu adımın sonunda, veri kümenizde yukarıda belirtilen değerlere sahip 3 örnek bulunmalıdır.
Değerlendirmeyi çalıştırma ve sonuçları görüntüleme
Akış değerlendirmeye alınmaya başlandığında, geliştirici kullanıcı arayüzünde Evaluations
sekmesini ve ardından Yeni değerlendirme çalıştır düğmesini tıklayın.
Bir akışı değerlendirmek için
Flow
radyo düğmesini seçin.Değerlendirilecek hedef akış olarak
qaFlow
'ü seçin.Değerlendirme için kullanılacak hedef veri kümesi olarak
myFactsQaDataset
'ü seçin.(İsteğe bağlı) Genkit eklentilerini kullanarak bir değerlendirmeci metriği yüklediyseniz bu metrikleri bu sayfada görebilirsiniz. Bu değerlendirme çalıştırmasında kullanmak istediğiniz metrikleri seçin. Bu tamamen isteğe bağlıdır: Bu adım atlanırsa değerlendirme çalışmasında sonuçlar döndürülür ancak ilişkili metrikler döndürülmez.
Son olarak, değerlendirmeyi başlatmak için Değerlendirmeyi çalıştır'ı tıklayın. Test ettiğiniz akışa bağlı olarak bu işlem biraz zaman alabilir. Değerlendirme tamamlandığında, sonuçları görüntüleme bağlantısının bulunduğu bir başarı mesajı gösterilir. Değerlendirme ayrıntıları sayfasına gitmek için bağlantıyı tıklayın.
Orijinal giriş, ayıklanan bağlam ve metrikler (varsa) dahil olmak üzere değerlendirmenizin ayrıntılarını bu sayfada görebilirsiniz.
Temel kavramlar
Terminoloji
Değerlendirme: Değerlendirme, sistem performansını değerlendiren bir süreçtir. Genkit'te bu tür bir sistem genellikle bir akış veya model gibi bir Genkit ilkel öğesidir. Değerlendirmeler otomatik veya manuel (gerçek kişi tarafından yapılan değerlendirme) olabilir.
Toplu çıkarım Çıkarma, ilgili çıkışı elde etmek için bir girişi bir akışta veya modelde çalıştırma işlemidir. Toplu çıkarım, birden fazla girişte aynı anda çıkarım yapmayı içerir.
Metrik Değerlendirme metriği, bir çıkarım için puan verilen bir ölçüttür. Doğruluk, sadakat, kötü amaçlı olma, çıktının İngilizce olup olmadığı vb. buna örnek gösterilebilir.
Veri kümesi Veri kümesi, çıkarım temelli değerlendirme için kullanılacak örnek bir koleksiyondur. Veri kümeleri genellikle
input
ve isteğe bağlıreference
alanlarından oluşur.reference
alanı, değerlendirmenin çıkarım adımını etkilemez ancak tüm değerlendirme metriklerine olduğu gibi iletilir. Genkit'te, geliştirici kullanıcı arayüzü aracılığıyla veri kümesi oluşturabilirsiniz. Genkit'te iki tür veri kümesi vardır: Akış veri kümeleri ve Model veri kümeleri.
Şema doğrulaması
Veri kümelerinin türüne bağlı olarak geliştirici kullanıcı arayüzünde şema doğrulama desteği vardır:
Akış veri kümeleri, veri kümesinin
input
vereference
alanlarının Genkit uygulamasındaki bir akışa göre doğrulanmasını destekler. Şema doğrulaması isteğe bağlıdır ve yalnızca hedef akışta bir şema belirtilmişse zorunlu kılınır.Model veri kümeleri, hem
string
hem deGenerateRequest
giriş türlerini destekleyen gizli bir şemaya sahiptir. Dize doğrulaması, basit metin istemlerini değerlendirmenin uygun bir yolunu sağlar.GenerateRequest
ise gelişmiş kullanım alanları için tam kontrol sağlar (ör. model parametreleri, mesaj geçmişi, araçlar vb. sağlama).GenerateRequest
için tam şemayı API referans dokümanlarımızda bulabilirsiniz.
Desteklenen değerlendiriciler
Genkit değerlendiricileri
Genkit, başlamanıza yardımcı olmak için RAGAS'tan esinlenerek oluşturulmuş az sayıda yerel değerlendirici içerir:
- Bağlılık: Oluşturulan yanıtın, verilen bağlamla olgusal tutarlılığını ölçer.
- Yanıtın Alakalılığı: Oluşturulan yanıtın, istenenle ne kadar alakalı olduğunu değerlendirir.
- Kötü niyet: Oluşturulan çıktının aldatma, zarar verme veya sömürme amacı taşıyıp taşımadığını ölçer.
Değerlendirici eklentileri
Genkit, VertexAI eklentisi aracılığıyla eriştiğiniz Vertex Rapid Evaluators gibi eklentiler aracılığıyla ek değerlendiricileri destekler.
İleri düzey kullanım
KSA'yı kullanarak değerlendirme
Genkit CLI, değerlendirme yapmak için zengin bir API sağlar. Bu, özellikle geliştirici kullanıcı arayüzünün kullanılamadığı ortamlarda (ör. CI/CD iş akışında) kullanışlıdır.
Genkit CLI, eval:flow
, eval:extractData
ve eval:run
olmak üzere 3 ana değerlendirme komutu sağlar.
eval:flow
komutu
eval:flow
komutu, giriş veri kümesinde çıkarım temelli değerlendirme yapar.
Bu veri kümesi, JSON dosyası olarak veya Genkit çalışma zamanındaki mevcut bir veri kümesine referans vererek sağlanabilir.
# Referencing an existing dataset genkit eval:flow qaFlow --input myFactsQaDataset
# or, using a dataset from a file genkit eval:flow qaFlow --input testInputs.json
Burada testInputs.json
, bir input
alanı ve isteğe bağlı bir reference
alanı içeren bir nesne dizisi olmalıdır. Aşağıdaki gibi:
[
{
"input": "What is the French word for Cheese?",
},
{
"input": "What green vegetable looks like cauliflower?",
"reference": "Broccoli"
}
]
Akışınız için kimlik doğrulama gerekiyorsa --auth
bağımsız değişkenini kullanarak bunu belirtebilirsiniz:
genkit eval:flow qaFlow --input testInputs.json --auth "{\"email_verified\": true}"
Varsayılan olarak eval:flow
ve eval:run
komutları, değerlendirme için mevcut tüm metrikleri kullanır. 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:flow qaFlow --input testInputs.json --evaluators=genkit/faithfulness,genkit/answer_relevancy
Değerlendirme çalıştırmanızın sonuçlarını localhost:4000/evaluate
adresindeki Geliştirici kullanıcı arayüzünde görüntüleyebilirsiniz.
eval:extractData
ve eval:run
komutları
Genkit, ham değerlendirmeyi desteklemek için izlerden veri ayıklama ve ayıklanan veriler üzerinde değerlendirme metrikleri çalıştırma araçları sağlar. Bu, örneğin değerlendirme için farklı bir çerçeve kullanıyorsanız veya çıkış kalitesini yerel olarak test etmek için farklı bir ortamdan çıkarım topluyorsanız yararlıdır.
Genkit akışınızı toplu olarak çalıştırabilir ve çalıştırma işlemine benzersiz bir etiket ekleyebilirsiniz. Bu etiket daha sonra değerlendirme veri kümesi ayıklamak için kullanılabilir. Ham değerlendirme veri kümesi, herhangi bir ön çıkarım çalıştırılmaksızın değerlendirme metrikleri için girişlerin bir koleksiyonudur.
Akışınızı test girişlerinizde çalıştırın:
genkit flow:batchRun qaFlow testInputs.json --label firstRunSimple
Değerlendirme verilerini ayıklayın:
genkit eval:extractData qaFlow --label firstRunSimple --output factsEvalDataset.json
Dışa aktarılan verilerin biçimi, daha önce sunulan veri kümesi biçiminden farklıdır. Bunun nedeni, bu verilerin herhangi bir çıkarım adımı olmadan doğrudan değerlendirme metrikleriyle kullanılmasının amaçlanmasıdır. Ayıklanan verilerin söz dizimi aşağıda verilmiştir.
Array<{
"testCaseId": string,
"input": any,
"output": any,
"context": any[],
"traceIds": string[],
}>;
Veri ayıklayıcı, alıcıları otomatik olarak bulur ve oluşturulan dokümanları bağlam dizisine ekler. eval:run
komutunu kullanarak bu ayıklanmış veri kümesinde değerlendirme metriklerini çalıştırabilirsiniz.
genkit eval:run factsEvalDataset.json
Varsayılan olarak eval:run
, yapılandırılmış tüm değerlendiricilerle çalışır ve eval:flow
'te olduğu gibi eval:run
sonuçları localhost:4000/evaluate
adresindeki Geliştirici Kullanıcı Arayüzü'nün değerlendirme sayfasında görünür.
Özel çıkarıcılar
Genkit, değerlendirme yaparken gerekli alanları (input
, output
ve context
) ayıklamak için makul bir varsayılan mantık sağlar. Ancak bu alanların ayıklama mantığı üzerinde daha fazla kontrole ihtiyacınız olduğunu fark edebilirsiniz.
Genkit, bu işlemi gerçekleştirmek için özel ayıklayıcıları destekler. eval:extractData
ve eval:flow
komutlarında kullanılacak özel ayıklayıcılar sağlayabilirsiniz.
İlk olarak, hazırlık adımı olarak qaFlow
örneğimizde yardımcı bir adım ekleyin:
export const qaFlow = ai.defineFlow({
name: 'qaFlow',
inputSchema: z.string(),
outputSchema: z.string(),
},
async (query) => {
const factDocs = await ai.retrieve({
retriever: dummyRetriever,
query,
options: { k: 2 },
});
const factDocsModified = await 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: factDocs,
});
return llmResponse.text;
}
);
Ardından, bu akışı değerlendirirken factModified
adımını çıktısını kullanacak özel bir çıkarıcı yapılandırın.
Özel ayıklayıcıları yapılandıracak bir tools-config dosyanız yoksa proje kökünüze genkit-tools.conf.js
adlı bir dosya ekleyin.
cd /path/to/your/genkit/app
touch genkit-tools.conf.js
Araçlar yapılandırma dosyasına aşağıdaki kodu ekleyin:
module.exports = {
evaluators: [
{
actionRef: '/flow/qaFlow',
extractors: {
context: { outputOf: 'factModified' },
},
},
],
};
Bu yapılandırma, Genkit araçlarının varsayılan ayıklayıcılarını geçersiz kılar. Özellikle de bu akış değerlendirilirken context
olarak neyin değerlendirildiğini değiştirir.
Değerlendirmeyi tekrar çalıştırdığınızda, bağlamın artık factModified
adımının çıkışı olarak doldurulduğunu görebilirsiniz.
genkit eval:flow qaFlow --input testInputs.json
Değerlendirme çıkarıcıları aşağıdaki gibi belirtilir:
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çinfoo-step
adımı girişini ayıklardı.(trace) => string;
: Daha fazla esneklik için Genkit izlemesini kabul eden veany
türündeki bir değer döndüren bir işlev sağlayabilir ve bu işlev içinde ayıklama mantığını belirtebilirsiniz. TraceData şemasının tam olarak nasıl göründüğü içingenkit/genkit-tools/common/src/types/trace.ts
adresine bakın.
Not: Bu ayrıştırıcıların tümü için ayrıştırılan veriler, ayrıştırıcıya karşılık gelen türdedir. Örneğin, context: { outputOf: 'foo-step' }
kullanırsanız ve foo-step
bir nesne dizisi döndürürse ayıklanan bağlam da bir nesne dizisidir.
LLM kullanarak test verilerini sentezleme
Aşağıda, potansiyel kullanıcı sorularını oluşturmak için PDF dosyası kullanan örnek bir akış verilmiştir.
import { genkit, run, 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 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