ارزیابی نوعی آزمایش است که به شما کمک میکند تا پاسخهای LLM خود را تأیید کنید و اطمینان حاصل کنید که با نوار کیفیت شما مطابقت دارند.
Firebase Genkit از ابزارهای ارزیابی شخص ثالث از طریق افزونهها، همراه با ویژگیهای قدرتمند مشاهدهپذیری که بینشی از وضعیت زمان اجرا برنامههای کاربردی LLM شما ارائه میدهد، پشتیبانی میکند. ابزار Genkit به شما کمک می کند تا به طور خودکار داده ها شامل ورودی ها، خروجی ها و اطلاعات را از مراحل میانی استخراج کنید تا کیفیت سرتاسر پاسخ های LLM را ارزیابی کنید و همچنین عملکرد بلوک های سازنده سیستم خود را درک کنید.
انواع ارزیابی
Genkit از دو نوع ارزیابی پشتیبانی می کند:
ارزیابی مبتنی بر استنتاج : این نوع ارزیابی با مجموعه ای از ورودی های از پیش تعیین شده اجرا می شود و خروجی های مربوطه را از نظر کیفیت ارزیابی می کند.
این رایج ترین نوع ارزیابی است که برای اکثر موارد استفاده مناسب است. این رویکرد خروجی واقعی یک سیستم را برای هر اجرا ارزیابی میکند.
می توانید ارزیابی کیفیت را به صورت دستی و با بازرسی بصری نتایج انجام دهید. از طرف دیگر، میتوانید ارزیابی را با استفاده از معیار ارزیابی خودکار کنید.
ارزیابی خام : این نوع ارزیابی مستقیماً کیفیت ورودی ها را بدون هیچ استنتاجی ارزیابی می کند. این رویکرد معمولاً با ارزیابی خودکار با استفاده از معیارها استفاده می شود. تمام فیلدهای لازم برای ارزیابی (به عنوان مثال،
input
،context
،output
وreference
) باید در مجموعه داده ورودی وجود داشته باشد. این زمانی مفید است که دادههایی از یک منبع خارجی (به عنوان مثال، جمعآوریشده از آثار تولید شما) داشته باشید و میخواهید کیفیت دادههای جمعآوریشده را اندازهگیری کنید، مفید است.برای اطلاعات بیشتر به بخش استفاده پیشرفته در این صفحه مراجعه کنید.
این بخش نحوه انجام ارزیابی مبتنی بر استنتاج با استفاده از Genkit را توضیح می دهد.
شروع سریع
راه اندازی
- از یک برنامه Genkit موجود استفاده کنید یا با دنبال کردن راهنمای [Get started] (get-started.md) ما یک برنامه جدید ایجاد کنید.
- کد زیر را برای تعریف یک برنامه RAG ساده برای ارزیابی اضافه کنید. برای این راهنما، ما از یک retriever ساختگی استفاده می کنیم که همیشه همان اسناد را برمی گرداند.
import { genkit, z, Document } from "genkit"; import { googleAI, gemini15Flash, } from "@genkit-ai/googleai"; // Initialize Genkit export const ai = genkit ({ plugins: [ googleAI(), ] }); // Dummy retriever that always returns the same docs export const dummyRetriever = ai.defineRetriever( { name: "dummyRetriever", }, async (i) => { const facts = [ "Dog is man's best friend", "Dogs have evolved and were domesticated from wolves", ]; // Just return facts as documents. return { documents: facts.map((t) => Document.fromText(t)) }; } ); // A simple question-answering flow export const qaFlow = ai.defineFlow({ name: 'qaFlow', inputSchema: z.string(), outputSchema: z.string(), }, async (query) => { const factDocs = await ai.retrieve({ retriever: dummyRetriever, query, }); const llmResponse = await ai.generate({ model: gemini15Flash, prompt: `Answer this question with the given context ${query}`, docs: factDocs, }); return llmResponse.text; } );
- (اختیاری) معیارهای ارزیابی را به برنامه خود اضافه کنید تا در حین ارزیابی از آن استفاده کنید. این راهنما از متریک
MALICIOUSNESS
از افزونهgenkitEval
استفاده می کند. توجه: پیکربندی بالا نیاز به نصب بستهimport { genkitEval, GenkitMetric } from "@genkit-ai/evaluator"; import { gemini15Pro } from "@genkit-ai/googleai"; export const ai = genkit ({ plugins: [ ... // Add this plugin to your Genkit initialization block genkitEval({ judge: gemini15Pro, metrics: [GenkitMetric.MALICIOUSNESS], }), ] });
@genkit-ai/evaluator
دارد.npm install @genkit-ai/evaluator
- برنامه Genkit خود را شروع کنید.
genkit start --
یک مجموعه داده ایجاد کنید
یک مجموعه داده برای تعریف نمونه هایی که می خواهیم برای ارزیابی جریان خود استفاده کنیم ایجاد کنید.
به Dev UI در
http://localhost:4000
بروید و روی دکمه Datasets کلیک کنید تا صفحه Datasets باز شود.روی دکمه Create Dataset کلیک کنید تا گفتگوی ایجاد مجموعه داده باز شود.
الف یک
datasetId
برای مجموعه داده جدید خود ارائه دهید. این راهنما ازmyFactsQaDataset
استفاده می کند.ب نوع مجموعه داده
Flow
را انتخاب کنید.ج فیلد هدف اعتبارسنجی را خالی بگذارید و روی ذخیره کلیک کنید
صفحه مجموعه داده جدید شما ظاهر می شود که مجموعه داده خالی را نشان می دهد. با دنبال کردن مراحل زیر نمونه هایی را به آن اضافه کنید:
الف روی دکمه افزودن مثال کلیک کنید تا پنل ویرایشگر نمونه باز شود.
ب فقط فیلد
input
مورد نیاز است."Who is man's best friend?"
را وارد کنید. در قسمتinput
، روی Save کلیک کنید تا نمونه مورد نظر به مجموعه داده شما اضافه شود.ج مراحل (الف) و (ب) را چند بار دیگر تکرار کنید تا مثالهای بیشتری اضافه کنید. این راهنما ورودی های نمونه زیر را به مجموعه داده اضافه می کند:
"Can I give milk to my cats?" "From which animals did dogs evolve?"
در پایان این مرحله، مجموعه داده شما باید دارای 3 نمونه با مقادیر ذکر شده در بالا باشد.
ارزیابی را اجرا کنید و نتایج را مشاهده کنید
برای شروع ارزیابی جریان، روی دکمه اجرای ارزیابی جدید در صفحه مجموعه داده خود کلیک کنید. همچنین می توانید یک ارزیابی جدید را از برگه ارزیابی ها شروع کنید.
برای ارزیابی یک جریان، دکمه رادیویی
Flow
را انتخاب کنید.qaFlow
به عنوان جریان هدف برای ارزیابی انتخاب کنید.myFactsQaDataset
به عنوان مجموعه داده هدف برای ارزیابی انتخاب کنید.(اختیاری) اگر متریک ارزیابی کننده را با استفاده از افزونه های Genkit نصب کرده اید، می توانید این معیارها را در این صفحه مشاهده کنید. معیارهایی را که میخواهید با اجرای این ارزیابی استفاده کنید، انتخاب کنید. این کاملاً اختیاری است: حذف این مرحله همچنان نتایج را در اجرای ارزیابی بازمیگرداند، اما بدون هیچ معیار مرتبط.
در نهایت روی اجرای ارزیابی کلیک کنید تا ارزیابی شروع شود. بسته به جریانی که آزمایش می کنید، ممکن است مدتی طول بکشد. پس از تکمیل ارزیابی، یک پیام موفقیت آمیز با پیوندی برای مشاهده نتایج ظاهر می شود. برای رفتن به صفحه جزئیات ارزیابی روی لینک کلیک کنید.
شما می توانید جزئیات ارزیابی خود را در این صفحه مشاهده کنید، از جمله ورودی اصلی، زمینه استخراج شده و معیارها (در صورت وجود).
مفاهیم اصلی
اصطلاحات
ارزیابی : ارزیابی فرآیندی است که عملکرد سیستم را ارزیابی می کند. در Genkit، چنین سیستمی معمولاً یک Genkit اولیه است، مانند یک جریان یا یک مدل. ارزیابی می تواند خودکار یا دستی (ارزیابی انسانی) باشد.
استنتاج انبوه عمل اجرای یک ورودی بر روی یک جریان یا مدل برای به دست آوردن خروجی مربوطه است. استنتاج انبوه شامل انجام استنتاج بر روی چندین ورودی به طور همزمان است.
متریک معیار ارزیابی معیاری است که استنتاج بر اساس آن نمره گذاری می شود. به عنوان مثال می توان به دقت، وفاداری، بد بودن، انگلیسی بودن خروجی و غیره اشاره کرد.
مجموعه داده مجموعه ای از نمونه ها برای ارزیابی مبتنی بر استنتاج است. یک مجموعه داده معمولاً از فیلدهای
input
وreference
اختیاری تشکیل شده است. فیلدreference
بر مرحله استنتاج ارزیابی تأثیر نمی گذارد، اما کلمه به کلمه به هر معیار ارزیابی منتقل می شود. در Genkit، می توانید یک مجموعه داده از طریق Dev UI ایجاد کنید. دو نوع مجموعه داده در Genkit وجود دارد: مجموعه داده های جریان و مجموعه داده های مدل .
اعتبار سنجی طرحواره
بسته به نوع، مجموعه دادهها از اعتبارسنجی طرحواره در Dev UI پشتیبانی میکنند:
مجموعه دادههای جریان از اعتبارسنجی فیلدهای
input
وreference
مجموعه داده در برابر جریان در برنامه Genkit پشتیبانی میکنند. اعتبار سنجی طرح واره اختیاری است و تنها در صورتی اجرا می شود که طرحی در جریان هدف مشخص شده باشد.مجموعه داده های مدل دارای طرحی ضمنی هستند که از هر دو نوع ورودی
string
وGenerateRequest
پشتیبانی می کنند. اعتبار سنجی رشته راه مناسبی برای ارزیابی پیام های متنی ساده فراهم می کند، در حالی کهGenerateRequest
کنترل کاملی را برای موارد استفاده پیشرفته (مانند ارائه پارامترهای مدل، تاریخچه پیام، ابزارها و غیره) فراهم می کند. می توانید طرح کاملGenerateRequest
را در اسناد مرجع API ما بیابید.
ارزیاب های پشتیبانی شده
ارزیابان Genkit
Genkit شامل تعداد کمی ارزیاب بومی است که از RAGAS الهام گرفته شده اند تا به شما در شروع کار کمک کنند:
- وفاداری - سازگاری واقعی پاسخ تولید شده را در برابر زمینه داده شده می سنجد
- ارتباط پاسخ - ارزیابی می کند که پاسخ تولید شده چقدر به درخواست داده شده مرتبط است
- بدخواهی - اندازه گیری می کند که آیا خروجی تولید شده قصد فریب دادن، آسیب رساندن یا بهره برداری را دارد یا خیر.
پلاگین های ارزیابی
Genkit از ارزیابهای اضافی از طریق افزونهها مانند Vertex Rapid Evaluators پشتیبانی میکند که میتوانید از طریق پلاگین VertexAI به آنها دسترسی داشته باشید.
استفاده پیشرفته
ارزیابی با استفاده از CLI
Genkit CLI یک API غنی برای انجام ارزیابی فراهم می کند. این به ویژه در محیط هایی که Dev UI در دسترس نیست (مثلاً در گردش کار CI/CD) مفید است.
Genkit CLI 3 دستور ارزیابی اصلی را ارائه می دهد: eval:flow
، eval:extractData
و eval:run
.
دستور eval:flow
دستور eval:flow
ارزیابی مبتنی بر استنتاج را روی یک مجموعه داده ورودی اجرا می کند. این مجموعه داده ممکن است به عنوان یک فایل JSON یا با ارجاع به مجموعه داده موجود در زمان اجرا Genkit شما ارائه شود.
# Referencing an existing dataset genkit eval:flow qaFlow --input myFactsQaDataset
# or, using a dataset from a file genkit eval:flow qaFlow --input testInputs.json
در اینجا، testInputs.json
باید آرایه ای از اشیاء حاوی یک فیلد input
و یک فیلد reference
اختیاری باشد، مانند زیر:
[
{
"input": "What is the French word for Cheese?",
},
{
"input": "What green vegetable looks like cauliflower?",
"reference": "Broccoli"
}
]
اگر جریان شما به تأیید اعتبار نیاز دارد، می توانید آن را با استفاده از آرگومان --context
مشخص کنید:
genkit eval:flow qaFlow --input testInputs.json --context '{"auth": {"email_verified": true}}'
به طور پیش فرض، دستورات eval:flow
و eval:run
از تمام معیارهای موجود برای ارزیابی استفاده می کنند. برای اجرا بر روی زیرمجموعه ای از ارزیاب های پیکربندی شده، از پرچم --evaluators
استفاده کنید و فهرستی از ارزیابان جدا شده با کاما را با نام ارائه کنید:
genkit eval:flow qaFlow --input testInputs.json --evaluators=genkitEval/maliciousness,genkitEval/answer_relevancy
می توانید نتایج ارزیابی خود را در Dev UI در localhost:4000/evaluate
مشاهده کنید.
دستورات eval:extractData
و eval:run
برای پشتیبانی از ارزیابی خام ، Genkit ابزارهایی را برای استخراج داده ها از ردیابی ها و اجرای معیارهای ارزیابی روی داده های استخراج شده ارائه می دهد. برای مثال، اگر از چارچوب متفاوتی برای ارزیابی استفاده میکنید یا اگر در حال جمعآوری استنباط از محیط دیگری برای آزمایش محلی برای کیفیت خروجی هستید، این کار مفید است.
می توانید جریان Genkit خود را به صورت دسته ای اجرا کنید و یک برچسب منحصر به فرد به اجرا اضافه کنید که سپس می تواند برای استخراج مجموعه داده ارزیابی استفاده شود. مجموعه دادههای ارزیابی خام مجموعهای از ورودیها برای معیارهای ارزیابی، بدون اجرای هرگونه استنتاج قبلی است.
جریان خود را روی ورودی های آزمایشی خود اجرا کنید:
genkit flow:batchRun qaFlow testInputs.json --label firstRunSimple
استخراج داده های ارزیابی:
genkit eval:extractData qaFlow --label firstRunSimple --output factsEvalDataset.json
دادههای صادر شده دارای قالبی متفاوت از قالب دادهای است که قبلاً ارائه شد. این به این دلیل است که این داده ها برای استفاده مستقیم با معیارهای ارزیابی بدون هیچ مرحله استنتاج در نظر گرفته شده است. در اینجا نحو داده های استخراج شده است.
Array<{
"testCaseId": string,
"input": any,
"output": any,
"context": any[],
"traceIds": string[],
}>;
استخراج کننده داده به طور خودکار مکان یابی را پیدا می کند و اسناد تولید شده را به آرایه زمینه اضافه می کند. شما می توانید معیارهای ارزیابی را روی این مجموعه داده استخراج شده با استفاده از دستور eval:run
اجرا کنید.
genkit eval:run factsEvalDataset.json
بهطور پیشفرض، eval:run
در برابر همه ارزیابهای پیکربندی شده اجرا میشود، و مانند eval:flow
، نتایج برای eval:run
در صفحه ارزیابی Developer UI، واقع در localhost:4000/evaluate
ظاهر میشود.
استخراج کننده های سفارشی
Genkit منطق پیش فرض معقولی را برای استخراج فیلدهای لازم ( input
، output
و context
) در حین انجام ارزیابی فراهم می کند. با این حال، ممکن است متوجه شوید که به کنترل بیشتری روی منطق استخراج برای این فیلدها نیاز دارید. Genkit از استخراج کنندگان گمرک برای رسیدن به این هدف پشتیبانی می کند. شما می توانید استخراج کننده های سفارشی را برای استفاده در دستورات eval:extractData
و eval:flow
ارائه دهید.
ابتدا، به عنوان یک مرحله مقدماتی، یک مرحله کمکی را در مثال qaFlow
معرفی کنید:
export const qaFlow = ai.defineFlow({
name: 'qaFlow',
inputSchema: z.string(),
outputSchema: z.string(),
},
async (query) => {
const factDocs = await ai.retrieve({
retriever: dummyRetriever,
query,
});
const factDocsModified = await ai.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: factDocsModified,
});
return llmResponse.text;
}
);
سپس، یک استخراج کننده سفارشی را برای استفاده از خروجی مرحله factModified
هنگام ارزیابی این جریان پیکربندی کنید.
اگر یک فایل tools-config برای پیکربندی استخراج کننده های سفارشی ندارید، یکی به نام genkit-tools.conf.js
را به ریشه پروژه خود اضافه کنید.
cd /path/to/your/genkit/app
touch genkit-tools.conf.js
در فایل کانفیگ tools کد زیر را اضافه کنید:
module.exports = {
evaluators: [
{
actionRef: '/flow/qaFlow',
extractors: {
context: { outputOf: 'factModified' },
},
},
],
};
این پیکربندی استخراجکنندههای پیشفرض ابزار Genkit را لغو میکند، بهویژه آنچه را که به عنوان context
در نظر گرفته میشود در هنگام ارزیابی این جریان تغییر میدهد.
اجرای ارزیابی مجدد نشان می دهد که زمینه اکنون به عنوان خروجی مرحله factModified
پر شده است.
genkit eval:flow qaFlow --input testInputs.json
استخراج کننده های ارزیابی به شرح زیر مشخص می شوند:
- فیلد
evaluators
آرایهای از اشیاء EvaluatorConfig را میپذیرد که باflowName
محدوده میشوند. -
extractors
شیای است که حذفکنندههای استخراجکننده را مشخص میکند. کلیدهای فعلی پشتیبانی شده درextractors
[input, output, context]
هستند. انواع مقادیر قابل قبول عبارتند از:-
string
- این باید یک نام مرحله باشد که به عنوان یک رشته مشخص شده است. خروجی این مرحله برای این کلید استخراج می شود. -
{ inputOf: string }
or{ outputOf: string }
- این اشیاء کانال های خاصی (ورودی یا خروجی) یک مرحله را نشان می دهند. برای مثال،{ inputOf: 'foo-step' }
ورودی stepfoo-step
را برای این کلید استخراج می کند. -
(trace) => string;
- برای انعطاف بیشتر، می توانید تابعی را ارائه کنید که یک ردیابی Genkit را می پذیرد وany
مقدار -type را برمی گرداند و منطق استخراج را در داخل این تابع مشخص می کنید. برای طرح دقیق TraceData بهgenkit/genkit-tools/common/src/types/trace.ts
مراجعه کنید.
-
نکته: داده های استخراج شده برای همه این استخراج کننده ها از نوع استخراج کننده است. به عنوان مثال، اگر از context: { outputOf: 'foo-step' }
استفاده می کنید، و foo-step
آرایه ای از اشیاء را برمی گرداند، زمینه استخراج شده نیز آرایه ای از اشیاء است.
سنتز داده های آزمون با استفاده از LLM
در اینجا یک جریان نمونه است که از یک فایل PDF برای ایجاد سؤالات احتمالی کاربر استفاده می کند.
import { genkit, 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 ai.run("extract-text", () => extractText(filePath));
const chunks = await ai.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;
}
);
سپس می توانید از این دستور برای صادرات داده ها به یک فایل و برای ارزیابی استفاده کنید.
genkit flow:run synthesizeQuestions '"my_input.pdf"' --output synthesizedQuestions.json