การประเมิน

การประเมินเป็นรูปแบบการทดสอบที่ช่วยให้คุณตรวจสอบคำตอบของ 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 รองรับผู้ประเมินเพิ่มเติมผ่านปลั๊กอินต่อไปนี้

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

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