การประเมินเป็นรูปแบบการทดสอบที่ช่วยให้คุณตรวจสอบคำตอบของ LLM และเพื่อให้แน่ใจว่าคำตอบของ LLM เป็นไปตามเกณฑ์คุณภาพของคุณ
Firebase Genkit รองรับเครื่องมือการประเมินของบุคคลที่สามผ่านปลั๊กอิน ควบคู่ไปกับฟีเจอร์ความสามารถในการสังเกตที่มีประสิทธิภาพซึ่งให้ข้อมูลเชิงลึกเกี่ยวกับสถานะรันไทม์ของแอปพลิเคชันที่ทำงานด้วย LLM เครื่องมือ Genkit จะช่วยให้คุณดึงข้อมูลโดยอัตโนมัติ ซึ่งรวมถึงอินพุต เอาต์พุต และข้อมูลจากขั้นตอนระดับกลางเพื่อประเมินคุณภาพการตอบกลับจาก LLM ตั้งแต่ต้นจนจบ รวมถึงทำความเข้าใจประสิทธิภาพขององค์ประกอบต่างๆ ของระบบ
ตัวอย่างเช่น หากคุณมีโฟลว์ RAG แล้ว Genkit จะแยกชุดเอกสารที่ตัวรีทรีฟเวอร์ส่งคืน เพื่อให้คุณสามารถประเมินคุณภาพของรีทรีฟเวอร์ขณะที่เรียกใช้ในบริบทของโฟลว์ดังที่แสดงด้านล่าง พร้อมกับเมตริกความซื่อสัตย์และความเกี่ยวข้องของ Genkit
import { GenkitMetric, genkitEval } from '@genkit-ai/evaluator';
import { textEmbeddingGecko } from '@genkit-ai/vertexai';
export default configureGenkit({
plugins: [
genkitEval({
judge: geminiPro,
metrics: [GenkitMetric.FAITHFULNESS, GenkitMetric.ANSWER_RELEVANCY],
embedder: textEmbeddingGecko, // GenkitMetric.ANSWER_RELEVANCY requires an embedder
}),
],
// ...
});
npm install @genkit-ai/evaluator @genkit-ai/vertexai
เริ่มต้นด้วยการกำหนดชุดอินพุตที่ต้องการใช้เป็นชุดข้อมูลอินพุตชื่อ testQuestions.json
ชุดข้อมูลอินพุตนี้แสดงถึงกรอบการทดสอบที่คุณจะใช้เพื่อสร้างเอาต์พุตสำหรับการประเมิน
[
"What is on the menu?",
"Does the restaurant have clams?",
"What is the special of the day?"
]
จากนั้นจึงใช้คำสั่ง eval:flow
เพื่อประเมินขั้นตอนโดยเทียบกับกรอบการทดสอบที่ระบุไว้ใน testQuestions.json
genkit eval:flow menuQA --input testQuestions.json
จากนั้นคุณสามารถดูผลการประเมินใน UI นักพัฒนาซอฟต์แวร์ได้โดยการเรียกใช้
genkit start
จากนั้นไปที่ localhost:4000/evaluate
หรือคุณสามารถส่งไฟล์เอาต์พุตเพื่อตรวจสอบเอาต์พุตในไฟล์ JSON ได้อีกด้วย
genkit eval:flow menuQA --input testQuestions.json --output eval-result.json
ผู้ประเมินที่รองรับ
ผู้ประเมิน Genkit
Genkit มีผู้ประเมินแบบเนทีฟจำนวนหนึ่งที่ได้รับแรงบันดาลใจจาก RAGAS เพื่อช่วยคุณเริ่มต้นใช้งาน โดยมีขั้นตอนดังนี้
- ความซื่อสัตย์
- ความเกี่ยวข้องของคำตอบ
- ความเป็นอันตราย
ปลั๊กอิน Evaluator
Genkit รองรับผู้ประเมินเพิ่มเติมผ่านปลั๊กอินต่อไปนี้
- ผู้ประเมินผลอย่างรวดเร็ว VertexAI ผ่านปลั๊กอิน VertexAI
- การประเมินเกณฑ์ LangChain ผ่านปลั๊กอิน LangChain
การใช้งานขั้นสูง
eval:flow
เป็นวิธีที่สะดวกในการประเมินโฟลว์ได้อย่างรวดเร็ว แต่บางครั้งคุณอาจต้องควบคุมขั้นตอนการประเมินมากขึ้น ซึ่งอาจเกิดขึ้นหากคุณใช้เฟรมเวิร์กอื่นและมีผลลัพธ์ที่ต้องการประเมินอยู่แล้ว คุณทำตามขั้นตอนทั้งหมดที่ eval:flow
ทำแบบกึ่งด้วยตนเองได้
คุณเรียกใช้ขั้นตอน Genkit แบบเป็นกลุ่มแล้วเพิ่มป้ายกำกับที่ไม่ซ้ำกันลงในการเรียกใช้ ซึ่งระบบจะใช้ในการแยกชุดข้อมูลการประเมิน (ชุดอินพุต เอาต์พุต และบริบท)
เรียกใช้โฟลว์ผ่านอินพุตทดสอบ ดังนี้
genkit flow:batchRun myRagFlow test_inputs.json --output flow_outputs.json --label customLabel
ดึงข้อมูลการประเมิน
genkit eval:extractData myRagFlow --label customLabel --output customLabel_dataset.json
ข้อมูลที่ส่งออกจะแสดงผลเป็นไฟล์ json พร้อมด้วย testCase แต่ละรายการในรูปแบบต่อไปนี้
[
{
"testCaseId": string,
"input": string,
"output": string,
"context": array of strings,
"traceIds": array of strings,
}
]
เครื่องมือแยกข้อมูลจะค้นหาเครื่องมือดึงข้อมูลโดยอัตโนมัติ และเพิ่มเอกสารที่ผลิตลงในอาร์เรย์บริบท โดยค่าเริ่มต้น eval:run
จะทํางานโดยเทียบกับผู้ประเมินที่กําหนดค่าไว้ทั้งหมด และเช่น eval:flow
ผลลัพธ์ของ eval:run
จะปรากฏในหน้าการประเมินของ UI นักพัฒนาซอฟต์แวร์ ซึ่งอยู่ที่ localhost:4000/evaluate
เครื่องมือแยกข้อมูลที่กำหนดเอง
นอกจากนี้คุณยังให้เครื่องมือแยกข้อมูลที่กำหนดเองใช้ในคำสั่ง eval:extractData
และ eval:flow
ได้ด้วย เครื่องมือแยกข้อมูลที่กำหนดเองช่วยให้คุณลบล้างตรรกะการดึงข้อมูลเริ่มต้น ซึ่งช่วยเพิ่มพลังในการสร้างและประเมินชุดข้อมูล
หากต้องการกำหนดค่าเครื่องมือแยกที่กำหนดเอง ให้เพิ่มไฟล์การกำหนดค่าเครื่องมือชื่อ genkit-tools.conf.js
ลงในรูทของโปรเจ็กต์ หากยังไม่มี
cd $GENKIT_PROJECT_HOME
touch genkit-tools.conf.js
เพิ่มโค้ดต่อไปนี้ในไฟล์การกำหนดค่าเครื่องมือ
module.exports = {
evaluators: [
{
flowName: 'myFlow',
extractors: {
context: { outputOf: 'foo-step' },
output: 'bar-step',
},
},
],
};
ในตัวอย่างนี้ คุณได้กำหนดค่าเครื่องมือแยกสำหรับโฟลว์ myFlow
การกําหนดค่านี้จะลบล้างตัวแยกสําหรับช่อง context
และ output
และใช้ตรรกะเริ่มต้นสําหรับช่อง input
ข้อกำหนดของเครื่องมือแยกการประเมินมีดังนี้
- ช่อง
evaluators
ยอมรับอาร์เรย์ของออบเจ็กต์ EvaluatorConfig ซึ่งกำหนดขอบเขตตามflowName
extractors
เป็นออบเจ็กต์ที่ระบุการลบล้างเครื่องมือแยก คีย์ที่รองรับปัจจุบันในextractors
คือ[input, output, context]
ประเภทค่าที่ยอมรับได้มีดังนี้string
- ชื่อนี้ควรเป็นชื่อขั้นตอน ซึ่งบ่งชี้ว่ากระตุ้น เอาต์พุตของขั้นตอนนี้จะถูกแยกออกมาสำหรับคีย์นี้{ inputOf: string }
หรือ{ outputOf: string }
- ออบเจ็กต์เหล่านี้แสดงถึงแชแนลที่เฉพาะเจาะจง (อินพุตหรือเอาต์พุต) ของขั้นตอนหนึ่งๆ ตัวอย่างเช่น{ inputOf: 'foo-step' }
จะดึงข้อมูลอินพุตของขั้นตอนfoo-step
สำหรับคีย์นี้(trace) => string;
- คุณอาจจัดเตรียมฟังก์ชันที่ยอมรับการติดตาม Genkit และแสดงผลstring
และระบุตรรกะการดึงข้อมูลในฟังก์ชันนี้เพื่อให้มีความยืดหยุ่นมากขึ้น โปรดไปที่genkit/genkit-tools/common/src/types/trace.ts
เพื่อดูสคีมา TraceData ที่เฉพาะเจาะจง
กำลังทำงานในชุดข้อมูลที่มีอยู่
วิธีเรียกใช้การประเมินกับชุดข้อมูลที่ดึงข้อมูลแล้ว
genkit eval:run customLabel_dataset.json
หากต้องการแสดงผลไปยังตำแหน่งอื่น ให้ใช้แฟล็ก --output
genkit eval:flow menuQA --input testQuestions.json --output customLabel_evalresult.json
หากต้องการเรียกใช้ผู้ประเมินที่กําหนดค่าไว้บางส่วน ให้ใช้แฟล็ก --evaluators
และระบุรายการผู้ประเมินที่คั่นด้วยคอมมาตามชื่อ
genkit eval:run customLabel_dataset.json --evaluators=genkit/faithfulness,genkit/answer_relevancy
การสังเคราะห์ข้อมูลทดสอบโดยใช้ LLM
ต่อไปนี้เป็นขั้นตอนตัวอย่างการใช้ไฟล์ PDF ในการสร้างคำถามที่อาจถามซึ่งผู้ใช้อาจถามเกี่ยวกับไฟล์นี้
export const synthesizeQuestions = defineFlow(
{
name: 'synthesizeQuestions',
inputSchema: z.string().describe('PDF file path'),
outputSchema: z.array(z.string()),
},
async (filePath) => {
filePath = path.resolve(filePath);
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 generate({
model: geminiPro,
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