Đánh giá là một hình thức kiểm thử giúp bạn xác thực các câu trả lời của LLM và đảm bảo rằng các câu trả lời đó đáp ứng tiêu chuẩn chất lượng của bạn.
Firebase Genkit hỗ trợ các công cụ đánh giá của bên thứ ba thông qua các trình bổ trợ, kết hợp với các tính năng quan sát mạnh mẽ cung cấp thông tin chi tiết về trạng thái thời gian chạy của các ứng dụng chạy bằng LLM. Bộ công cụ Genkit giúp bạn tự động trích xuất dữ liệu bao gồm dữ liệu đầu vào, đầu ra và thông tin từ các bước trung gian để đánh giá chất lượng toàn diện của các phản hồi LLM cũng như hiểu được hiệu suất của các khối xây dựng của hệ thống.
Các loại hình đánh giá
Genkit hỗ trợ hai loại đánh giá:
Đánh giá dựa trên suy luận: Loại hình đánh giá này chạy dựa trên một tập hợp các dữ liệu đầu vào được xác định trước, đánh giá chất lượng của các dữ liệu đầu ra tương ứng.
Đây là loại hình đánh giá phổ biến nhất, phù hợp với hầu hết các trường hợp sử dụng. Phương pháp này kiểm thử đầu ra thực tế của hệ thống cho mỗi lần chạy đánh giá.
Bạn có thể thực hiện việc đánh giá chất lượng theo cách thủ công bằng cách kiểm tra trực quan kết quả. Ngoài ra, bạn có thể tự động hoá quy trình đánh giá bằng cách sử dụng một chỉ số đánh giá.
Đánh giá thô: Loại đánh giá này trực tiếp đánh giá chất lượng của dữ liệu đầu vào mà không cần suy luận. Phương pháp này thường được sử dụng với tính năng đánh giá tự động bằng các chỉ số. Tất cả các trường bắt buộc để đánh giá (ví dụ:
input
,context
,output
vàreference
) phải có trong tập dữ liệu đầu vào. Điều này rất hữu ích khi bạn có dữ liệu đến từ một nguồn bên ngoài (ví dụ: được thu thập từ dấu vết sản xuất) và bạn muốn đo lường một cách khách quan chất lượng của dữ liệu đã thu thập.Để biết thêm thông tin, hãy xem phần Sử dụng nâng cao trên trang này.
Phần này giải thích cách thực hiện đánh giá dựa trên suy luận bằng Genkit.
Bắt đầu nhanh
Thiết lập
- Sử dụng ứng dụng Genkit hiện có hoặc tạo ứng dụng mới bằng cách làm theo hướng dẫn [Bắt đầu](get-started.md).
- Thêm mã sau để xác định một ứng dụng RAG đơn giản để đánh giá. Đối với hướng dẫn này, chúng tôi sử dụng một trình truy xuất giả luôn trả về cùng một tài liệu.
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; } );
- (Không bắt buộc) Thêm các chỉ số đánh giá vào ứng dụng để sử dụng trong khi đánh giá. Hướng dẫn này sử dụng chỉ số
MALICIOUSNESS
từ trình bổ trợgenkitEval
. Lưu ý: Cấu hình ở trên yêu cầu cài đặt góiimport { 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
- Khởi động ứng dụng Genkit.
genkit start --
Tạo tập dữ liệu
Tạo một tập dữ liệu để xác định các ví dụ mà chúng ta muốn sử dụng để đánh giá flow.
Chuyển đến giao diện người dùng dành cho nhà phát triển tại
http://localhost:4000
rồi nhấp vào nút Datasets (Tập dữ liệu) để mở trang Tập dữ liệu.Nhấp vào nút Tạo tập dữ liệu để mở hộp thoại tạo tập dữ liệu.
a. Cung cấp
datasetId
cho tập dữ liệu mới. Hướng dẫn này sử dụngmyFactsQaDataset
.b. Chọn loại tập dữ liệu
Flow
.c. Để trống trường mục tiêu xác thực rồi nhấp vào Lưu
Trang tập dữ liệu mới sẽ xuất hiện, hiển thị một tập dữ liệu trống. Thêm các ví dụ vào tệp này bằng cách làm theo các bước sau:
a. Nhấp vào nút Thêm ví dụ để mở bảng điều khiển trình chỉnh sửa ví dụ.
b. Chỉ có trường
input
là bắt buộc. Nhập"Who is man's best friend?"
vào trườnginput
rồi nhấp vào Lưu để thêm ví dụ vào tập dữ liệu.c. Lặp lại các bước (a) và (b) thêm vài lần để thêm các ví dụ khác. Hướng dẫn này thêm các dữ liệu đầu vào mẫu sau vào tập dữ liệu:
"Can I give milk to my cats?" "From which animals did dogs evolve?"
Khi kết thúc bước này, tập dữ liệu của bạn sẽ có 3 ví dụ, với các giá trị được đề cập ở trên.
Chạy quy trình đánh giá và xem kết quả
Để bắt đầu đánh giá quy trình, hãy nhấp vào nút Run new evaluation (Chạy quy trình đánh giá mới) trên trang tập dữ liệu. Bạn cũng có thể bắt đầu một quy trình đánh giá mới trong thẻ Đánh giá.
Chọn nút chọn
Flow
để đánh giá một flow.Chọn
qaFlow
làm luồng mục tiêu để đánh giá.Chọn
myFactsQaDataset
làm tập dữ liệu mục tiêu để sử dụng cho việc đánh giá.(Không bắt buộc) Nếu đã cài đặt chỉ số đánh giá bằng trình bổ trợ Genkit, bạn có thể xem các chỉ số này trong trang này. Chọn những chỉ số mà bạn muốn sử dụng trong lần chạy đánh giá này. Đây hoàn toàn là bước không bắt buộc: Việc bỏ qua bước này sẽ vẫn trả về kết quả trong quá trình chạy đánh giá, nhưng không có chỉ số nào được liên kết.
Cuối cùng, hãy nhấp vào Run evaluation (Chạy quy trình đánh giá) để bắt đầu đánh giá. Tuỳ thuộc vào luồng mà bạn đang kiểm thử, quá trình này có thể mất một chút thời gian. Sau khi quá trình đánh giá hoàn tất, một thông báo thành công sẽ xuất hiện cùng với đường liên kết để xem kết quả. Nhấp vào đường liên kết để chuyển đến trang Chi tiết đánh giá.
Bạn có thể xem thông tin chi tiết về kết quả đánh giá trên trang này, bao gồm cả dữ liệu đầu vào ban đầu, bối cảnh được trích xuất và các chỉ số (nếu có).
Các khái niệm cốt lõi
Thuật ngữ
Đánh giá: Đánh giá là một quá trình đánh giá hiệu suất của hệ thống. Trong Genkit, hệ thống như vậy thường là một nguyên hàm Genkit, chẳng hạn như một luồng hoặc mô hình. Quy trình đánh giá có thể là tự động hoặc thủ công (đánh giá thủ công).
Suy luận hàng loạt Suy luận là hành động chạy dữ liệu đầu vào trên một luồng hoặc mô hình để nhận kết quả tương ứng. Suy luận hàng loạt liên quan đến việc thực hiện suy luận trên nhiều đầu vào cùng một lúc.
Chỉ số Chỉ số đánh giá là một tiêu chí để tính điểm cho một suy luận. Ví dụ: độ chính xác, độ trung thực, tính độc hại, liệu đầu ra có phải bằng tiếng Anh hay không, v.v.
Tập dữ liệu Tập dữ liệu là một tập hợp các ví dụ để sử dụng cho việc đánh giá dựa trên suy luận. Một tập dữ liệu thường bao gồm các trường
input
vàreference
không bắt buộc. Trườngreference
không ảnh hưởng đến bước suy luận của quá trình đánh giá nhưng được truyền nguyên văn đến mọi chỉ số đánh giá. Trong Genkit, bạn có thể tạo một tập dữ liệu thông qua Giao diện người dùng dành cho nhà phát triển. Có hai loại tập dữ liệu trong Genkit: tập dữ liệu Flow (Luồng) và tập dữ liệu Model (Mô hình).
Xác thực giản đồ
Tuỳ thuộc vào loại, tập dữ liệu có hỗ trợ xác thực giản đồ trong Giao diện người dùng dành cho nhà phát triển:
Tập dữ liệu Flow hỗ trợ xác thực các trường
input
vàreference
của tập dữ liệu dựa trên một flow trong ứng dụng Genkit. Bạn không bắt buộc phải xác thực giản đồ và chỉ được thực thi nếu bạn chỉ định giản đồ trên luồng mục tiêu.Tập dữ liệu mô hình có giản đồ ngầm ẩn, hỗ trợ cả loại dữ liệu đầu vào
string
vàGenerateRequest
. Tính năng xác thực chuỗi cung cấp một cách thuận tiện để đánh giá các lời nhắc văn bản đơn giản, trong khiGenerateRequest
cung cấp quyền kiểm soát hoàn chỉnh cho các trường hợp sử dụng nâng cao (ví dụ: cung cấp thông số mô hình, nhật ký thông báo, công cụ, v.v.). Bạn có thể tìm thấy giản đồ đầy đủ choGenerateRequest
trong tài liệu tham khảo API của chúng tôi.
Trình đánh giá được hỗ trợ
Trình đánh giá Genkit
Genkit bao gồm một số ít trình đánh giá gốc, lấy cảm hứng từ RAGAS, để giúp bạn bắt đầu:
- Độ trung thực – Đo lường tính nhất quán về mặt thực tế của câu trả lời được tạo dựa trên ngữ cảnh đã cho
- Mức độ liên quan của câu trả lời – Đánh giá mức độ phù hợp của câu trả lời được tạo với lời nhắc đã cho
- Hành vi độc hại – Đo lường xem kết quả được tạo có ý định lừa gạt, gây hại hoặc khai thác hay không
Trình bổ trợ trình đánh giá
Genkit hỗ trợ các trình đánh giá bổ sung thông qua các trình bổ trợ, chẳng hạn như Trình đánh giá nhanh Vertex. Bạn có thể truy cập vào các trình đánh giá này thông qua Trình bổ trợ VertexAI.
Sử dụng nâng cao
Đánh giá bằng CLI
Genkit CLI cung cấp một API phong phú để thực hiện việc đánh giá. Điều này đặc biệt hữu ích trong các môi trường không có Giao diện người dùng dành cho nhà phát triển (ví dụ: trong quy trình làm việc CI/CD).
Genkit CLI cung cấp 3 lệnh đánh giá chính: eval:flow
, eval:extractData
và eval:run
.
Lệnh eval:flow
Lệnh eval:flow
chạy quy trình đánh giá dựa trên suy luận trên một tập dữ liệu đầu vào.
Tập dữ liệu này có thể được cung cấp dưới dạng tệp JSON hoặc bằng cách tham chiếu đến một tập dữ liệu hiện có trong thời gian chạy 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
Ở đây, testInputs.json
phải là một mảng đối tượng chứa trường input
và trường reference
không bắt buộc, như bên dưới:
[
{
"input": "What is the French word for Cheese?",
},
{
"input": "What green vegetable looks like cauliflower?",
"reference": "Broccoli"
}
]
Nếu luồng của bạn yêu cầu xác thực, bạn có thể chỉ định luồng đó bằng đối số --context
:
genkit eval:flow qaFlow --input testInputs.json --context '{"auth": {"email_verified": true}}'
Theo mặc định, các lệnh eval:flow
và eval:run
sử dụng tất cả các chỉ số có sẵn để đánh giá. Để chạy trên một tập hợp con của các trình đánh giá đã định cấu hình, hãy sử dụng cờ --evaluators
và cung cấp danh sách trình đánh giá được phân tách bằng dấu phẩy theo tên:
genkit eval:flow qaFlow --input testInputs.json --evaluators=genkitEval/maliciousness,genkitEval/answer_relevancy
Bạn có thể xem kết quả của quá trình chạy đánh giá trong Giao diện người dùng dành cho nhà phát triển tại localhost:4000/evaluate
.
Lệnh eval:extractData
và eval:run
Để hỗ trợ đánh giá thô, Genkit cung cấp các công cụ để trích xuất dữ liệu từ dấu vết và chạy các chỉ số đánh giá trên dữ liệu đã trích xuất. Điều này rất hữu ích, ví dụ: nếu bạn đang sử dụng một khung đánh giá khác hoặc nếu bạn đang thu thập các suy luận từ một môi trường khác để kiểm thử cục bộ về chất lượng đầu ra.
Bạn có thể chạy quy trình Genkit theo lô và thêm một nhãn duy nhất vào quy trình chạy. Sau đó, bạn có thể sử dụng nhãn này để trích xuất dữ liệu tập hợp đánh giá. Tập dữ liệu đánh giá thô là một tập hợp các dữ liệu đầu vào cho các chỉ số đánh giá, mà không chạy bất kỳ quy trình suy luận nào trước đó.
Chạy flow trên dữ liệu đầu vào kiểm thử:
genkit flow:batchRun qaFlow testInputs.json --label firstRunSimple
Trích xuất dữ liệu đánh giá:
genkit eval:extractData qaFlow --label firstRunSimple --output factsEvalDataset.json
Dữ liệu đã xuất có định dạng khác với định dạng tập dữ liệu được trình bày trước đó. Lý do là dữ liệu này được dùng trực tiếp với các chỉ số đánh giá mà không cần bất kỳ bước suy luận nào. Dưới đây là cú pháp của dữ liệu được trích xuất.
Array<{
"testCaseId": string,
"input": any,
"output": any,
"context": any[],
"traceIds": string[],
}>;
Trình trích xuất dữ liệu tự động xác định vị trí trình truy xuất và thêm các tài liệu đã tạo vào mảng ngữ cảnh. Bạn có thể chạy các chỉ số đánh giá trên tập dữ liệu đã trích xuất này bằng lệnh eval:run
.
genkit eval:run factsEvalDataset.json
Theo mặc định, eval:run
chạy trên tất cả các trình đánh giá đã định cấu hình và giống như với eval:flow
, kết quả cho eval:run
sẽ xuất hiện trong trang đánh giá của giao diện người dùng dành cho nhà phát triển, nằm ở localhost:4000/evaluate
.
Trình trích xuất tuỳ chỉnh
Genkit cung cấp logic mặc định hợp lý để trích xuất các trường cần thiết (input
, output
và context
) trong khi đánh giá. Tuy nhiên, bạn có thể nhận thấy rằng mình cần có nhiều quyền kiểm soát hơn đối với logic trích xuất cho các trường này.
Genkit hỗ trợ các trình trích xuất tuỳ chỉnh để đạt được điều này. Bạn có thể cung cấp trình trích xuất tuỳ chỉnh để sử dụng trong các lệnh eval:extractData
và eval:flow
.
Trước tiên, để chuẩn bị, hãy giới thiệu một bước phụ trong ví dụ về 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;
}
);
Tiếp theo, hãy định cấu hình trình trích xuất tuỳ chỉnh để sử dụng kết quả của bước factModified
khi đánh giá luồng này.
Nếu bạn không có tệp cấu hình công cụ để định cấu hình trình trích xuất tuỳ chỉnh, hãy thêm một tệp có tên là genkit-tools.conf.js
vào thư mục gốc của dự án.
cd /path/to/your/genkit/app
touch genkit-tools.conf.js
Trong tệp cấu hình công cụ, hãy thêm mã sau:
module.exports = {
evaluators: [
{
actionRef: '/flow/qaFlow',
extractors: {
context: { outputOf: 'factModified' },
},
},
],
};
Cấu hình này ghi đè các trình trích xuất mặc định của công cụ Genkit, cụ thể là thay đổi nội dung được coi là context
khi đánh giá luồng này.
Việc chạy lại quy trình đánh giá cho thấy ngữ cảnh hiện được điền sẵn dưới dạng đầu ra của bước factModified
.
genkit eval:flow qaFlow --input testInputs.json
Trình trích xuất đánh giá được chỉ định như sau:
- Trường
evaluators
chấp nhận một mảng các đối tượng EvaluatorConfig, đượcflowName
xác định phạm vi extractors
là một đối tượng chỉ định các cơ chế ghi đè trình trích xuất. Các khoá được hỗ trợ hiện tại trongextractors
là[input, output, context]
. Các loại giá trị được chấp nhận là:string
– đây phải là tên bước, được chỉ định dưới dạng chuỗi. Đầu ra của bước này được trích xuất cho khoá này.{ inputOf: string }
hoặc{ outputOf: string }
– Các đối tượng này đại diện cho các kênh cụ thể (đầu vào hoặc đầu ra) của một bước. Ví dụ:{ inputOf: 'foo-step' }
sẽ trích xuất dữ liệu đầu vào của bướcfoo-step
cho khoá này.(trace) => string;
– Để linh hoạt hơn, bạn có thể cung cấp một hàm chấp nhận dấu vết Genkit và trả về một giá trị thuộc loạiany
, đồng thời chỉ định logic trích xuất bên trong hàm này. Tham khảogenkit/genkit-tools/common/src/types/trace.ts
để biết giản đồ TraceData chính xác.
Lưu ý: Dữ liệu được trích xuất cho tất cả các trình trích xuất này là loại tương ứng với trình trích xuất. Ví dụ: nếu bạn sử dụng ngữ cảnh: { outputOf: 'foo-step' }
và foo-step
trả về một mảng đối tượng, thì ngữ cảnh được trích xuất cũng là một mảng đối tượng.
Tổng hợp dữ liệu kiểm thử bằng LLM
Dưới đây là một luồng mẫu sử dụng tệp PDF để tạo câu hỏi tiềm năng cho người dùng.
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;
}
);
Sau đó, bạn có thể sử dụng lệnh này để xuất dữ liệu vào một tệp và sử dụng để đánh giá.
genkit flow:run synthesizeQuestions '"my_input.pdf"' --output synthesizedQuestions.json