การย้ายข้อมูลจาก 0.5

Genkit 0.9 มีการเปลี่ยนแปลงที่ส่งผลกับส่วนอื่นในระบบหลายรายการควบคู่ไปกับการเพิ่มประสิทธิภาพฟีเจอร์ที่ปรับปรุงฟังก์ชันการทํางานโดยรวม หากพัฒนาแอปพลิเคชันด้วย Genkit 0.5 คุณจะต้องอัปเดตโค้ดแอปพลิเคชันเมื่ออัปเกรดเป็นเวอร์ชันล่าสุด คู่มือนี้จะกล่าวถึงการเปลี่ยนแปลงที่สําคัญที่สุดและแสดงขั้นตอนในการย้ายข้อมูลแอปพลิเคชันที่มีอยู่อย่างราบรื่น

คู่มือเริ่มใช้งานฉบับย่อ

ขั้นตอนต่อไปนี้จะช่วยให้คุณย้ายข้อมูลจาก Genkit 0.5 ไปยัง Genkit 0.9 ได้อย่างรวดเร็ว อ่านข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงเหล่านี้ได้ในบันทึกการเปลี่ยนแปลงโดยละเอียดด้านล่าง

1. ติดตั้ง CLI เวอร์ชันใหม่

  • ถอนการติดตั้ง CLI เวอร์ชันเก่า

    npm uninstall -g genkit && npm uninstall genkit
    
  • ติดตั้ง CLI ใหม่

    npm i -D genkit-cli
    

2. อัปเดตการอ้างอิง

  • นําแพ็กเกจหลักของ Genkit แต่ละรายการออก

    npm uninstall @genkit-ai/ai @genkit-ai/core @genkit-ai/dotprompt @genkit-ai/flow
    
  • ติดตั้งแพ็กเกจ genkit แบบรวมใหม่

    npm i --save genkit
    
  • อัปเกรดปลั๊กอินทุกเวอร์ชัน (ดูตัวอย่างด้านล่าง)

    npm upgrade @genkit-ai/firebase
    

3. เปลี่ยนการนําเข้า

  • นําการนําเข้าสําหรับแพ็กเกจหลักของ Genkit แต่ละรายการออก

    import { … } from '@genkit-ai/ai';
    import { … } from '@genkit-ai/core';
    import { … } from '@genkit-ai/flow';
    
  • นำการนําเข้า zod ออก

    import * as z from 'zod';
    
  • นําเข้า genkit และ zod จาก genkit

    import { z, genkit } from 'genkit';
    

4. อัปเดตโค้ด

นำบล็อก configureGenkit ออก

ตอนนี้การกำหนดค่า Genkit เสร็จสมบูรณ์แล้วสำหรับแต่ละอินสแตนซ์ การกำหนดค่าการวัดและการบันทึกจะกำหนดค่าในแบบรวมและแยกจากอินสแตนซ์ Genkit

  • แทนที่ configureGenkit ด้วยบล็อก ai = genkit({...}) เก็บเฉพาะการกําหนดค่าปลั๊กอิน

    import { genkit } from 'genkit';
    
    const ai = genkit({ plugins: [...]});
    
  • กําหนดค่าการวัดและส่งข้อมูลทางไกลโดยใช้ enableFirebaseTelemetry หรือ enableGoogleCloudTelemetry

    สําหรับ Firebase

    import { enableFirebaseTelemetry } from '@genkit-ai/firebase';
    
    enableFirebaseTelemetry({...});
    

    สำหรับ Google Cloud

    import { enableGoogleCloudTelemetry } from '@genkit-ai/google-cloud';
    
    enableGoogleCloudTelemetry({...});
    
  • ตั้งค่าระดับการบันทึกแยกต่างหาก ```js import { logger } from 'genkit/logging';

    logger.setLogLevel('debug'); ```

ดูรายละเอียดเพิ่มเติมเกี่ยวกับวิธีกำหนดค่าการวัดและการบันทึกได้ที่เอกสารประกอบการตรวจสอบและการบันทึก

ดูรายละเอียดเพิ่มเติมเกี่ยวกับวิธีกําหนดค่าอินสแตนซ์ Genkit ได้ในเอกสารประกอบเริ่มต้นใช้งาน

ย้ายข้อมูลการดำเนินการ Genkit เพื่อเรียกใช้จากอินสแตนซ์ genkit

ระบบจะกําหนดการดําเนินการ (โฟลว์ เครื่องมือ เครื่องมือดึงข้อมูล ตัวจัดทําดัชนี ฯลฯ) ต่ออินสแตนซ์ อ่านบันทึกการเปลี่ยนแปลงสำหรับฟีเจอร์ทั้งหมดที่คุณต้องเปลี่ยนแปลง แต่ต่อไปนี้เป็นตัวอย่างของฟีเจอร์ทั่วไปบางส่วน

import { genkit } from 'genkit';
import { onFlow } from '@genkit-ai/firebase/functions';

const ai = genkit({ plugins: [...]});

// Flows and tools are defined on the specific genkit instance
// and are directly callable.
const sampleFlow = ai.defineFlow(...);
const sampleTool = ai.defineTool(...);

async function callMyFlow() {
  // Previously, text output could accessed via .text()
  // Now it is either .output() or .text
  return await sampleFlow().output();
}

// onFlow now takes the Genkit instance as first argument
// This registers the flow as a callable firebase function
onFlow(ai, ...);
const flows = [ sampleFlow, ... ];
// Start the flow server to make the registered flows callable over HTTP
ai.startFlowServer({flows});

5. เรียกใช้

# run the DevUI and your js code
genkit start -- <command to run node>
# run a defined flow
genkit flow:run <flowName>

บันทึกการเปลี่ยนแปลง

1. การเปลี่ยนแปลง CLI

อินเทอร์เฟซบรรทัดคำสั่ง (CLI) ได้รับการอัปเดตที่สำคัญใน Genkit 0.9 คำสั่งสำหรับเริ่ม Genkit มีการเปลี่ยนแปลง และ CLI ได้แยกออกเป็นแพ็กเกจสแตนด์อโลนของตัวเอง ซึ่งตอนนี้คุณต้องติดตั้งแยกต่างหาก

วิธีติดตั้ง CLI

npm i -g genkit-cli

มีการเปลี่ยนแปลงบางอย่างในคําสั่ง genkit start ดังนี้

เริ่มโค้ดแอปพลิเคชัน Genkit + UI ของนักพัฒนาซอฟต์แวร์ร่วมกัน

genkit start -- [start command]
genkit start -- tsx src/index.ts
genkit start -- go run main.go

รองรับโหมดนาฬิกาด้วย

genkit start -- tsx --watch src/index.ts

เริ่มโค้ดแอปพลิเคชันของคุณในโหมดนักพัฒนา Genkit เท่านั้น โดยทำดังนี้

genkit start --noui -- <start command>
genkit start --noui -- tsx src/index.ts

เริ่ม UI สําหรับนักพัฒนาซอฟต์แวร์เท่านั้น

genkit start

ก่อนหน้านี้ คำสั่ง genkit start จะเริ่ม Dev UI และโค้ดแอปพลิเคชันพร้อมกัน หากมีพิพลีน CI/CD ที่ใช้คำสั่งนี้ คุณอาจต้องอัปเดตไปป์ไลน์

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

2. แพ็กเกจและการนําเข้าที่ง่ายขึ้น

ก่อนหน้านี้ ไลบรารี Genkit จะแยกออกเป็นหลายโมดูล ซึ่งคุณต้องติดตั้งและนําเข้าทีละรายการ ตอนนี้เราได้รวมโมดูลเหล่านี้ไว้ในการนําเข้าครั้งเดียวแล้ว นอกจากนี้ Genkit จะส่งออกโมดูล Zod อีกครั้ง

เดิม:

npm i @genkit-ai/core @genkit-ai/ai @genkit-ai/flow @genkit-ai/dotprompt

ใหม่:

npm i genkit

เดิม:

import { … } from '@genkit-ai/ai';
import { … } from '@genkit-ai/core';
import { … } from '@genkit-ai/flow';
import * as z from 'zod';

ใหม่:

import { genkit, z } from 'genkit';

คุณยังคงต้องติดตั้งและนําเข้าปลั๊กอิน Genkit แยกกัน

3. การกำหนดค่า Genkit

ก่อนหน้านี้ คุณต้องเริ่มต้น Genkit เพียงครั้งเดียวทั่วโลกโดยการเรียกใช้ฟังก์ชัน configureGenkit ทรัพยากร Genkit (ขั้นตอน เครื่องมือ พรอมต์ ฯลฯ) ทั้งหมดจะเชื่อมโยงกับการกำหนดค่าส่วนกลางนี้โดยอัตโนมัติ

Genkit 0.9 เปิดตัวอินสแตนซ์ Genkit ซึ่งแต่ละอินสแตนซ์จะรวมการกําหนดค่า โปรดดูตัวอย่างต่อไปนี้

เดิม:

import { configureGenkit } from '@genkit-ai/core';

configureGenkit({
  telemetry: {
    instrumentation: ...,
    logger: ...
  }
});

ใหม่:

import { genkit } from 'genkit';
import { logger } from 'genkit/logging';
import { enableFirebaseTelemetry } from '@genkit-ai/firebase';

logger.setLogLevel('debug');
enableFirebaseTelemetry({...});

const ai = genkit({ ... });

มาดูรายละเอียดกัน

  • configureGenkit() เปลี่ยนเป็น genkit() แล้ว และจะแสดงอินสแตนซ์ Genkit ที่กําหนดค่าไว้แทนการตั้งค่าแบบรวม
  • ฟังก์ชันเริ่มต้น Genkit อยู่ในแพ็กเกจ genkit แล้ว
  • การบันทึกและการวัดผลจะยังคงได้รับการกําหนดค่าทั่วโลกโดยใช้วิธีการที่ชัดเจนของตนเอง การกําหนดค่าเหล่านี้มีผลกับอินสแตนซ์ Genkit ทั้งหมดอย่างสม่ำเสมอ

4. การกําหนดขั้นตอนและการเริ่มเซิร์ฟเวอร์ขั้นตอนอย่างชัดเจน

เมื่อคุณมีอินสแตนซ์ Genkit ที่กําหนดค่าแล้ว คุณจะต้องกําหนดขั้นตอน ตอนนี้เมธอด API หลักทั้งหมดที่แสดงต่อนักพัฒนาแอป เช่น defineFlow, defineTool และ onFlow จะเรียกผ่านอินสแตนซ์นี้

ซึ่งแตกต่างจากวิธีก่อนหน้านี้ที่ลงทะเบียนโฟลว์และเครื่องมือทั่วโลก

เดิม:

import { defineFlow, defineTool, onFlow } from '@genkit-ai/core';

defineFlow(...);
defineTool(...);

onFlow(...);

ใหม่:

// Define tools and flows
const sampleFlow = ai.defineFlow(...);
const sampleTool = ai.defineTool(...);

// onFlow now takes the Genkit instance as first argument
// This registers the flow as a callable firebase function
onFlow(ai, ...);  

const flows = [ sampleFlow, ... ];
// Start the flow server to make the registered flows callable over HTTP
ai.startFlowServer({flows});

ขณะนี้ คุณต้องลงทะเบียนโฟลว์ทั้งหมดที่ต้องการให้บริการอย่างชัดเจนในอาร์เรย์ flows ด้านบน

5. เครื่องมือและพรอมต์ต้องได้รับการกำหนดแบบคงที่

ใน Genkit เวอร์ชันเก่า คุณสามารถกําหนดเครื่องมือและพรอมต์แบบไดนามิกขณะรันไทม์ได้จากภายในโฟลว์โดยตรง

ใน Genkit 0.9 ระบบจะไม่อนุญาตให้ใช้ลักษณะการทำงานนี้อีกต่อไป แต่คุณต้องกําหนดการดําเนินการและขั้นตอนทั้งหมดนอกการดําเนินการของขั้นตอน (นั่นคือแบบคงที่)

การเปลี่ยนแปลงนี้จะบังคับให้มีการแยกคําจํากัดความการดําเนินการออกจากการดําเนินการอย่างเข้มงวดมากขึ้น

หากโค้ดใดกำหนดแบบไดนามิก จะต้องได้รับการปรับโครงสร้าง มิฉะนั้น ระบบจะแสดงข้อผิดพลาดที่รันไทม์เมื่อเรียกใช้ขั้นตอน

❌ สิ่งที่ไม่ควรทำ:

const flow = defineFlow({...}, async (input) => {
  const tool = defineTool({...});
  await tool(...);
});

✅ สิ่งที่ควรทำ:

const tool = ai.defineTool({...});

const flow = ai.defineFlow({...}, async (input) => {
  await tool(...);
});

6. API ใหม่สำหรับขั้นตอนการสตรีม

ใน Genkit 0.9 เราได้ลดความซับซ้อนของไวยากรณ์สำหรับการกำหนดขั้นตอนการสตรีมและเรียกใช้

ประการแรก เราได้แยก defineFlow กับ defineStreamingFlow ออกจากกัน หากมีขั้นตอนที่ตั้งใจจะสตรีม คุณจะต้องอัปเดตโค้ดเพื่อกำหนดขั้นตอนผ่าน defineStreamingFlow

ประการที่ 2 แทนที่จะเรียกใช้ฟังก์ชัน stream() และ response() แยกกัน ตอนนี้ทั้งสตรีมและคำตอบจะเป็นค่าที่แสดงผลจากโฟลว์โดยตรง การเปลี่ยนแปลงนี้จะช่วยให้การสตรีมแบบสตรีมย่อยง่ายขึ้น

เดิม:

import { defineFlow, streamFlow } from '@genkit-ai/flow';

const myStreamingFlow = defineFlow(...);
const { stream, output } = await streamFlow(myStreamingFlow, ...);

for await (const chunk of stream()) {
  console.log(chunk);
}

console.log(await output());

ใหม่:

const myStreamingFlow = ai.defineStreamingFlow(...);
const { stream, response } = await myStreamingFlow(...);

for await (const chunk of stream) {
  console.log(chunk);
}

console.log(await response);

7. แทนที่เมธอดของคลาส GenerateResponse ด้วยพร็อพเพอร์ตี้ Gettier

ก่อนหน้านี้ คุณเคยเข้าถึงเอาต์พุตที่มีโครงสร้างหรือข้อความของคำตอบโดยใช้เมธอดของคลาส เช่น output() หรือ text()

ใน Genkit 0.9 พร็อพเพอร์ตี้ getter เข้ามาแทนที่เมธอดเหล่านั้น วิธีนี้ช่วยให้จัดการคำตอบได้ง่ายขึ้น

เดิม:

const response = await generate({ prompt: 'hi' });
console.log(response.text());

ใหม่:

const response = await ai.generate('hi');
console.log(response.text);

output ก็มีเงื่อนไขเดียวกันนี้

เดิม:

console.log(response.output());

ใหม่:

console.log(response.output);

8. ยกเลิกการสร้างผู้สมัคร

Genkit 0.9 ลดความซับซ้อนของการจัดการการตอบกลับด้วยการนำแอตทริบิวต์ candidates ออก ก่อนหน้านี้ การตอบกลับอาจมีผู้สมัครหลายราย ซึ่งคุณต้องจัดการอย่างชัดแจ้ง ตอนนี้ระบบจะแสดงเฉพาะรายการแรกในการตอบกลับแบบ Flat

รหัสใดก็ตามที่เข้าถึงผู้สมัครโดยตรงจะใช้ไม่ได้อีกต่อไป

เดิม:

const response = await generate({
 messages: [ { role: 'user', content: ...} ]
});
console.log(response.candidates); // previously you could access candidates directly

ใหม่:

const response = await ai.generate({
 messages: [ { role: 'user', content: ...} ]
});
console.log(response.message); // single candidate is returned directly in a flat response

9. สร้าง API - การเพิ่มประสิทธิภาพแบบหลายรอบ

สำหรับการสนทนาแบบหลายรอบ ระบบได้แทนที่เมธอด toHistory() เดิมด้วย messages ซึ่งทำให้การจัดการประวัติการสนทนาง่ายขึ้น

เดิม:

const history = response.toHistory();

ใหม่:

const response = await ai.generate({
 messages: [ { role: 'user', content: ...} ]
});
const history = response.messages;

10. Chat API ที่มีประสิทธิภาพมากขึ้น

ใน Genkit 0.9 เราได้ออกแบบ Chat API ใหม่เพื่อให้จัดการเซสชันและการโต้ตอบได้ง่ายขึ้น วิธีใช้ประโยชน์จากฟีเจอร์นี้สำหรับทั้งประสบการณ์การแชทแบบซิงค์และแบบสตรีมมิงมีดังนี้

import { genkit } from 'genkit';
import { gemini15Flash, googleAI } from '@genkit-ai/googleai';

const ai = genkit({
 plugins: [googleAI()],
 model: gemini15Flash,
});

const session = ai.createSession({ store: firestoreSessionStore() });
const chat = await session.chat({ system: 'talk like a pirate' });

let response = await chat.send('hi, my name is Pavel');
console.log(response.text()); // "hi Pavel, I'm llm"

// continue the conversation
response = await chat.send("what's my name");
console.log(response.text()); // "Pavel"

// can stream
const { response, stream } = await chat.sendStream('bye');
for await (const chunk of stream) {
 console.log(chunk.text());
}
console.log((await response).text());

// can load session from the store
const prevSession = await ai.loadSession(session.id, { store });
const prevChat = await prevSession.chat();
await prevChat.send('bye');