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çinfoo-step
adımı girişini ayıklardı.(trace) => string;
: Daha fazla esneklik için bir Genkit izlemesini kabul eden vestring
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çingenkit/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