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');