การประเมิน

การประเมินคือรูปแบบการทดสอบที่ช่วยให้คุณตรวจสอบคำตอบของ 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: gemini15Flash,
      metrics: [GenkitMetric.FAITHFULNESS, GenkitMetric.ANSWER_RELEVANCY],
      embedder: textEmbeddingGecko, // GenkitMetric.ANSWER_RELEVANCY requires an embedder
    }),
  ],
  // ...
});
  npm install @genkit-ai/evaluator @genkit-ai/vertexai

เริ่มต้นโดยการกำหนดชุดอินพุตที่ต้องการใช้เป็นชุดข้อมูลอินพุตชื่อ testInputs.json ชุดข้อมูลอินพุตนี้แสดงถึงกรอบการทดสอบที่คุณจะใช้เพื่อสร้างเอาต์พุตสำหรับการประเมิน

["Cheese", "Broccoli", "Spinach and Kale"]

จากนั้นก็ใช้คำสั่ง eval:flow เพื่อประเมินขั้นตอนเทียบกับกรอบการทดสอบที่ระบุใน testInputs.json ได้

genkit eval:flow menuSuggestionFlow --input testInputs.json

จากนั้นคุณจะดูผลการประเมินได้ใน UI สำหรับนักพัฒนาซอฟต์แวร์โดยการเรียกใช้

genkit start

จากนั้นไปที่ localhost:4000/evaluate

หรือคุณจะส่งไฟล์เอาต์พุตเพื่อตรวจสอบเอาต์พุตในไฟล์ JSON ก็ได้

genkit eval:flow menuSuggestionFlow --input testInputs.json --output eval-result.json

ผู้ประเมินที่รองรับ

ผู้ประเมิน Genkit

Genkit มีผู้ประเมินโฆษณาเนทีฟกลุ่มเล็กๆ ที่ได้รับแรงบันดาลใจจาก RAGAS เพื่อช่วยคุณเริ่มต้นใช้งาน

  • ความซื่อสัตย์
  • ความเกี่ยวข้องของคำตอบ
  • ความเป็นอันตราย

ปลั๊กอินผู้ประเมิน

Genkit รองรับผู้ประเมินเพิ่มเติมผ่านปลั๊กอิน

การใช้งานขั้นสูง

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 menuSuggestionFlow --input testInputs.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: 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