การเรียกใช้เครื่องมือหรือที่เรียกว่าการเรียกใช้ฟังก์ชันเป็นวิธีที่เป็นระเบียบในการทำให้ LLM สามารถส่งคำขอกลับไปยังแอปพลิเคชันที่เรียกใช้ คุณจะกำหนดเครื่องมือที่ต้องการให้โมเดลใช้งานได้ และโมเดลจะส่งคำขอเครื่องมือไปยังแอปของคุณตามที่จำเป็นเพื่อดำเนินการตามพรอมต์ที่คุณให้ไว้
โดยทั่วไปแล้ว Use Case ของการเรียกใช้เครื่องมือจะแบ่งออกเป็น 2-3 ธีม ดังนี้
การให้ LLM เข้าถึงข้อมูลที่ไม่ได้ใช้ฝึก
- ข้อมูลที่มีการเปลี่ยนแปลงบ่อยครั้ง เช่น ราคาหุ้นหรือสภาพอากาศปัจจุบัน
- ข้อมูลเฉพาะของโดเมนแอป เช่น ข้อมูลผลิตภัณฑ์หรือโปรไฟล์ผู้ใช้
โปรดทราบว่า LLM นี้มีความทับซ้อนกับการสร้างที่เพิ่มการดึงข้อมูล (RAG) ซึ่งเป็นวิธีให้ LLM ผสานรวมข้อมูลข้อเท็จจริงไว้ในการสร้างด้วย RAG เป็นโซลูชันที่หนักกว่าซึ่งเหมาะสําหรับกรณีที่คุณมีข้อมูลจํานวนมากหรือข้อมูลที่เกี่ยวข้องกับพรอมต์มากที่สุดมีความคลุมเครือ ในทางกลับกัน หากการดึงข้อมูลที่ LLM ต้องการเป็นการเรียกฟังก์ชันธรรมดาหรือการค้นหาฐานข้อมูล การเรียกใช้เครื่องมือจะเหมาะสมกว่า
การนําระดับการกําหนดลงในเวิร์กโฟลว์ LLM
- ดำเนินการคํานวณที่ LLM ทําให้เสร็จสมบูรณ์ไม่ได้
- การบังคับให้ LLM สร้างข้อความแบบคำต่อคำในบางสถานการณ์ เช่น เมื่อตอบคำถามเกี่ยวกับข้อกำหนดในการให้บริการของแอป
การดำเนินการเมื่อ LLM เริ่มต้น
- การเปิดและปิดไฟในบ้านที่ทำงานด้วย LLM
- การจองโต๊ะในตัวแทนร้านอาหารที่ทำงานด้วย LLM
ก่อนเริ่มต้น
หากต้องการเรียกใช้ตัวอย่างโค้ดในหน้านี้ ให้ทําตามขั้นตอนในคู่มือการเริ่มต้นใช้งานก่อน ตัวอย่างทั้งหมดจะถือว่าคุณได้ตั้งค่าโปรเจ็กต์ที่มีการติดตั้งข้อกําหนดของ Genkit แล้ว
หน้านี้อธิบายหนึ่งในฟีเจอร์ขั้นสูงของการแยกโมเดลของ Genkit ดังนั้นก่อนลงลึก คุณควรทำความคุ้นเคยกับเนื้อหาในหน้าการสร้างเนื้อหาด้วยโมเดล AI นอกจากนี้ คุณควรทำความคุ้นเคยกับระบบของ Genkit ในการกําหนดสคีมาอินพุตและเอาต์พุต ซึ่งจะกล่าวถึงในหน้าเวิร์กโฟลว์
ภาพรวมของการเรียกใช้เครื่องมือ
โดยทั่วไปแล้ว การโต้ตอบแบบเรียกใช้เครื่องมือกับ LLM จะมีลักษณะดังนี้
- แอปพลิเคชันที่เรียกใช้จะส่งคําขอไปยัง LLM และระบุรายการเครื่องมือที่ LLM สามารถใช้เพื่อสร้างคําตอบในพรอมต์ด้วย
- LLM จะสร้างคำตอบที่สมบูรณ์หรือสร้างคำขอเรียกใช้เครื่องมือในรูปแบบที่เฉพาะเจาะจง
- หากผู้โทรได้รับการตอบกลับที่สมบูรณ์ ระบบจะดำเนินการตามคำขอและสิ้นสุดการโต้ตอบ แต่หากผู้โทรได้รับการเรียกใช้เครื่องมือ ระบบจะดำเนินการตามตรรกะที่เหมาะสมและส่งคำขอใหม่ไปยัง LLM ซึ่งมีพรอมต์เดิมหรือพรอมต์ที่ปรับเปลี่ยนรูปแบบไปบ้าง รวมถึงผลลัพธ์ของการเรียกใช้เครื่องมือ
- LLM จะจัดการพรอมต์ใหม่ตามขั้นตอนที่ 2
คุณต้องปฏิบัติตามข้อกำหนดหลายประการเพื่อให้การแชร์ทำงานได้
- โมเดลต้องได้รับการฝึกให้ส่งคําขอเครื่องมือเมื่อจําเป็นต้องใช้เพื่อดำเนินการตามพรอมต์ โมเดลขนาดใหญ่ส่วนใหญ่ที่ให้บริการผ่าน Web API เช่น Gemini และ Claude จะทำสิ่งนี้ได้ แต่โมเดลขนาดเล็กและเฉพาะเจาะจงมักจะทำไม่ได้ Genkit จะแสดงข้อผิดพลาดหากคุณพยายามใส่เครื่องมือลงในรุ่นที่ไม่รองรับ
- แอปพลิเคชันที่เรียกใช้ต้องระบุคำจำกัดความของเครื่องมือให้กับโมเดลในรูปแบบที่คาดไว้
- แอปพลิเคชันที่เรียกใช้ต้องแจ้งให้โมเดลสร้างคําขอการเรียกใช้เครื่องมือในรูปแบบที่แอปพลิเคชันคาดหวัง
การเรียกใช้เครื่องมือด้วย Genkit
Genkit มีอินเทอร์เฟซเดียวสําหรับการเรียกใช้เครื่องมือกับโมเดลที่รองรับ
ปลั๊กอินแต่ละรูปแบบจะตรวจสอบว่าเป็นไปตามเกณฑ์ 2 ข้อสุดท้ายข้างต้น และฟังก์ชัน generate()
ของอินสแตนซ์ Genkit จะเรียกใช้ลูปการเรียกใช้เครื่องมือที่อธิบายไว้ก่อนหน้านี้โดยอัตโนมัติ
การรองรับโมเดล
การรองรับการเรียกใช้เครื่องมือจะขึ้นอยู่กับรุ่น API ของรุ่น และปลั๊กอิน Genkit โปรดดูเอกสารประกอบที่เกี่ยวข้องเพื่อพิจารณาว่าระบบมีแนวโน้มที่จะรองรับการเรียกใช้เครื่องมือหรือไม่ นอกจากนี้
- Genkit จะแสดงข้อผิดพลาดหากคุณพยายามใส่เครื่องมือในโมเดลที่ไม่รองรับ
- หากปลั๊กอินส่งออกข้อมูลอ้างอิงรูปแบบ พร็อพเพอร์ตี้
info.supports.tools
จะระบุว่ารองรับการเรียกใช้เครื่องมือหรือไม่
เครื่องมือกำหนด
ใช้ฟังก์ชัน defineTool()
ของอินสแตนซ์ Genkit เพื่อเขียนคําจํากัดความของเครื่องมือ
import { genkit, z } from 'genkit';
import { googleAI, gemini15Flash } from '@genkit-ai/google-ai';
const ai = genkit({
plugins: [googleAI()],
model: gemini15Flash,
});
const getWeather = ai.defineTool(
{
name: 'getWeather',
description: 'Gets the current weather in a given location',
inputSchema: z.object({
location: z.string().describe('The location to get the current weather for')
}),
outputSchema: z.string(),
},
async (input) => {
// Here, we would typically make an API call or database query. For this
// example, we just return a fixed value.
return 'The current weather in ${input.location} is 63°F and sunny.';
}
);
ไวยากรณ์ที่นี่เหมือนกับไวยากรณ์ defineFlow()
แต่ต้องใช้พารามิเตอร์ name
, description
, inputSchema
และ outputSchema
ทั้ง 4 รายการ เมื่อเขียนคําจํากัดความของเครื่องมือ ให้คํานึงถึงถ้อยคำและความชัดเจนของพารามิเตอร์เหล่านี้เป็นพิเศษ เนื่องจากพารามิเตอร์เหล่านี้มีความสําคัญต่อ LLM ในการใช้ประโยชน์จากเครื่องมือที่มีให้ได้อย่างมีประสิทธิภาพ
การใช้เครื่องมือ
ใส่เครื่องมือที่กําหนดไว้ในพรอมต์เพื่อสร้างเนื้อหา
สร้าง
const response = await ai.generate({
prompt: 'What is the weather in Baltimore?',
tools: [getWeather],
});
definePrompt
const weatherPrompt = ai.definePrompt(
{
name: 'weatherPrompt',
tools: [getWeather],
},
'What is the weather in {{location}}?'
);
const response = await weatherPrompt({ location: 'Baltimore' });
ไฟล์พรอมต์
---
system: "Answer questions using the tools you have."
tools: [getWeather]
input:
schema:
location: string
---
What is the weather in {{location}}?
จากนั้นเรียกใช้พรอมต์ในโค้ดของคุณดังนี้
// assuming prompt file is named weatherPrompt.prompt
const weatherPrompt = ai.prompt('weatherPrompt');
const response = await weatherPrompt({ location: 'Baltimore' });
แชท
const chat = ai.chat({
system: 'Answer questions using the tools you have.',
tools: [getWeather],
});
const response = await chat.send('What is the weather in Baltimore?');
// Or, specify tools that are message-specific
const response = await chat.send({
prompt: 'What is the weather in Baltimore?',
tools: [getWeather],
});
Genkit จะจัดการการเรียกใช้เครื่องมือโดยอัตโนมัติหาก LLM ต้องใช้เครื่องมือ getWeather
เพื่อตอบกลับพรอมต์
การจัดการการเรียกใช้เครื่องมืออย่างชัดแจ้ง
โดยค่าเริ่มต้น Genkit จะเรียกใช้ LLM ซ้ำๆ จนกว่าการเรียกใช้เครื่องมือทั้งหมดจะได้รับการแก้ไข หากต้องการควบคุมลูปการเรียกใช้เครื่องมือนี้มากขึ้น เช่น เพื่อใช้ตรรกะที่ซับซ้อนมากขึ้น ให้ตั้งค่าพารามิเตอร์ returnToolRequests
เป็น true
ตอนนี้คุณมีหน้าที่รับผิดชอบในการตรวจสอบว่าคำขอเครื่องมือทั้งหมดได้รับการดำเนินการแล้ว โดยทำดังนี้
const getWeather = ai.defineTool(
{
// ... tool definition ...
},
async ({ location }) => {
// ... tool implementation ...
},
);
const generateOptions: GenerateOptions = {
prompt: "What's the weather like in Baltimore?",
tools: [getWeather],
returnToolRequests: true,
};
let llmResponse;
while (true) {
llmResponse = await ai.generate(generateOptions);
const toolRequests = llmResponse.toolRequests;
if (toolRequests.length < 1) {
break;
}
const toolResponses: ToolResponsePart[] = await Promise.all(
toolRequests.map(async (part) => {
switch (part.toolRequest.name) {
case 'specialTool':
return {
toolResponse: {
name: part.toolRequest.name,
ref: part.toolRequest.ref,
output: await getWeather(part.toolRequest.input),
},
};
default:
throw Error('Tool not found');
}
})
);
generateOptions.messages = llmResponse.messages;
generateOptions.prompt = toolResponses;
}