การเรียกใช้เครื่องมือ หรือที่เรียกว่าการเรียกใช้ฟังก์ชัน เป็นวิธีการที่มีโครงสร้างในการ ความสามารถในการส่งคำขอกลับไปยังแอปพลิเคชันที่เรียกใช้งาน LLM คุณ กำหนดเครื่องมือที่คุณต้องการให้พร้อมใช้งานในโมเดล แล้วโมเดลจะ ส่งคำขอเครื่องมือไปยังแอปของคุณตามความจำเป็นในการทำตามข้อความแจ้งที่คุณให้
โดยทั่วไปแล้วกรณีการใช้งานของการเรียกใช้เครื่องมือจะแบ่งออกได้เป็นบางประเด็นดังนี้
การให้สิทธิ์ LLM เข้าถึงข้อมูลที่ไม่ได้รับการฝึก
- ข้อมูลที่เปลี่ยนแปลงบ่อย เช่น เมนูประจำวันของร้านอาหาร หรือ สถานะสินค้าคงคลังของร้านค้า
- ข้อมูลเฉพาะสำหรับโดเมนแอปของคุณ เช่น ข้อมูลผลิตภัณฑ์
โปรดทราบความคาบเกี่ยวกันกับ Retrieval Augmented Generation (RAG) ซึ่งเป็น วิธีที่ทำให้ LLM รวมข้อมูลข้อเท็จจริงเข้ากับคนรุ่นหลังได้ RAG คือ โซลูชันที่หนักกว่าซึ่งเหมาะสมที่สุดเมื่อคุณมี หรือข้อมูลที่เกี่ยวข้องกับพรอมต์มากที่สุดนั้นไม่ชัดเจน เปิด ในทางกลับกัน หากการดึงข้อมูลที่ LLM ต้องการเป็นฟังก์ชันที่เรียบง่าย การโทรหรือการค้นหาฐานข้อมูล การเรียกเครื่องมือจะเหมาะสมกว่า
ขอแนะนำการทำงานแบบกำหนดระดับขั้นในเวิร์กโฟลว์ LLM
- การคำนวณที่ LLM ไม่สามารถสร้างด้วยตัวเองได้อย่างน่าเชื่อถือ
- การบังคับให้ LLM สร้างข้อความแบบคำต่อคำภายใต้สถานการณ์บางอย่าง เช่น เมื่อตอบคำถามเกี่ยวกับข้อกำหนดในการให้บริการของแอป
การดำเนินการเมื่อดำเนินการโดย LLM
- การเปิดและปิดไฟในผู้ช่วยในบ้านที่ทำงานด้วยระบบ LLM
- จองโต๊ะในตัวแทนร้านอาหารที่ทำงานด้วยระบบ LLM
ก่อนเริ่มต้น
หากต้องการเรียกใช้ตัวอย่างโค้ดในหน้านี้ โปรดทำตามขั้นตอนใน คู่มือเริ่มต้นใช้งาน ตัวอย่างทั้งหมดสมมติไปว่าคุณ ได้ตั้งค่าโปรเจ็กต์ที่ติดตั้งทรัพยากร Dependency ของ Genkit แล้ว
หน้านี้จะกล่าวถึงฟีเจอร์ขั้นสูงอย่างหนึ่งของนามธรรมโมเดล Genkit และ Create() ดังนั้นก่อนที่จะเจาะลึกไปจนเกินไป คุณควรทำความคุ้นเคยกับ เนื้อหาในหน้าการสร้างเนื้อหาด้วยโมเดล AI คุณควร ทำความคุ้นเคยกับระบบของ Genkit ในการกำหนดสคีมาอินพุตและเอาต์พุต ซึ่งจะอธิบายในหน้าขั้นตอน
ภาพรวมของการเรียกใช้เครื่องมือ
ในระดับสูง นี่คือการโต้ตอบการเรียกใช้เครื่องมือกับ LLM โดยทั่วไป ดูเหมือน:
- แอปพลิเคชันการโทรจะแจ้ง LLM ด้วยคำขอ รวมถึง ข้อความแจ้งรายการเครื่องมือที่ LLM สามารถใช้เพื่อสร้างคำตอบ
- LLM สร้างการตอบกลับที่สมบูรณ์หรือสร้างการเรียกใช้เครื่องมือ ในรูปแบบเฉพาะ
- หากผู้โทรได้รับการตอบกลับที่สมบูรณ์ คำขอจะได้รับการดำเนินการและ การโต้ตอบสิ้นสุด แต่หากผู้โทรได้รับการเรียกเครื่องมือ ระบบจะดำเนินการ ตรรกะใดก็ตามที่เหมาะสมและส่งคำขอใหม่ไปยัง LLM ที่มี ข้อความแจ้งเดิมหรือรูปแบบบางอย่าง รวมถึงผลลัพธ์ของ การเรียกเครื่องมือ
- LLM จะจัดการข้อความแจ้งใหม่ตามขั้นตอนที่ 2
เพื่อให้เป็นไปได้ ต้องปฏิบัติตามข้อกำหนดหลายประการดังนี้
- โมเดลต้องได้รับการฝึกให้ส่งคำขอเครื่องมือเมื่อจำเป็น ปรากฏขึ้น โมเดลขนาดใหญ่ส่วนใหญ่ที่ให้บริการผ่าน API ของเว็บ เช่น Gemini และ Claude ก็สามารถทำได้ แต่โมเดลที่เล็กกว่าและพิเศษกว่ามักจะทำไม่ได้ Genkit จะแสดงข้อผิดพลาดหากคุณพยายามจัดหาเครื่องมือให้แก่โมเดลที่ไม่มี ก็สนับสนุนได้เลย
- แอปพลิเคชันการเรียกใช้ต้องมีคำจำกัดความเครื่องมือให้กับโมเดลใน ตามที่คาดหวังไว้
- แอปพลิเคชันการเรียกใช้ต้องแจ้งให้โมเดลสร้างการเรียกใช้เครื่องมือ คำขอในรูปแบบที่แอปพลิเคชันต้องการ
การเรียกใช้เครื่องมือด้วย Genkit
Genkit มีอินเทอร์เฟซเพียงแบบเดียวสำหรับการเรียกเครื่องมือจากรุ่นที่รองรับ
ปลั๊กอินโมเดลแต่ละตัวช่วยให้มั่นใจได้ว่า 2 เกณฑ์สุดท้ายจากที่กล่าวมาข้างต้น และ
ฟังก์ชัน generate()
จะดำเนินการวนซ้ำการเรียกเครื่องมือโดยอัตโนมัติ
ที่อธิบายก่อนหน้านี้
การรองรับโมเดล
การรองรับการเรียกใช้เครื่องมือจะขึ้นอยู่กับรุ่น, API โมเดล และปลั๊กอิน Genkit โปรดดูข้อมูลในเอกสารที่เกี่ยวข้องเพื่อพิจารณาว่าจะมีการเรียกใช้เครื่องมือหรือไม่ ที่รองรับ นอกจากนี้
- Genkit จะแสดงข้อผิดพลาดหากคุณพยายามจัดหาเครื่องมือให้แก่โมเดลที่ไม่มี ก็สนับสนุนได้เลย
- หากปลั๊กอินส่งออกการอ้างอิงโมเดล พร็อพเพอร์ตี้
info.supports.tools
จะระบุว่ารองรับการเรียกใช้เครื่องมือหรือไม่
การกำหนดเครื่องมือ
ใช้ฟังก์ชัน defineTool()
เพื่อเขียนคำจำกัดความของเครื่องมือ
const specialToolInputSchema = z.object({ meal: z.enum(["breakfast", "lunch", "dinner"]) });
const specialTool = defineTool(
{
name: "specialTool",
description: "Retrieves today's special for the given meal",
inputSchema: specialToolInputSchema,
outputSchema: z.string(),
},
async ({ meal }): Promise<string> => {
// Retrieve up-to-date information and return it. Here, we just return a
// fixed value.
return "Baked beans on toast";
}
);
ไวยากรณ์ในส่วนนี้มีลักษณะเหมือนกับไวยากรณ์ defineFlow()
แต่ทั้ง 4 อย่าง
พารามิเตอร์ name
, description
, inputSchema
และ outputSchema
ต้องระบุ
เมื่อเขียนคำจำกัดความของเครื่องมือ โปรดระมัดระวังการใช้คำและ
รายละเอียดของพารามิเตอร์เหล่านี้ เนื่องจากพารามิเตอร์ดังกล่าวมีความสำคัญต่อ LLM ในการ
ใช้ประโยชน์จากเครื่องมือที่มีอยู่ได้อย่างมีประสิทธิภาพ
รวมถึงเครื่องมือในพรอมต์ของคุณ
หลังจากที่คุณกำหนดเครื่องมือแล้ว ให้ระบุเครื่องมือในพารามิเตอร์เครื่องมือของ
generate()
:
const llmResponse = await generate({
model: gemini15Flash,
prompt,
tools: [specialTool],
});
คุณสามารถใช้เครื่องมือหลายอย่างได้ LLM จะเรียกใช้เครื่องมือตามที่จำเป็น เพื่อให้ข้อความแจ้งสมบูรณ์
การจัดการการเรียกเครื่องมืออย่างชัดแจ้ง
โดยค่าเริ่มต้น Genkit จะเรียก LLM ซ้ำๆ จนกว่าจะมีการเรียกเครื่องมือทุกครั้ง
แก้ปัญหาแล้ว หากต้องการควบคุมการวนซ้ำการเรียกเครื่องมือนี้ได้มากขึ้น เช่น
ใช้ตรรกะที่ซับซ้อนมากกว่านี้ โดยตั้งค่าพารามิเตอร์ returnToolRequests
เป็น true
คราวนี้คุณมีหน้าที่ตรวจสอบว่าคำขอเครื่องมือทั้งหมดดำเนินการตามคำขอของคุณ
let generateOptions: GenerateOptions = {
model: gemini15Flash,
prompt,
tools: [specialTool],
returnToolRequests: true,
};
let llmResponse;
while (true) {
llmResponse = await 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 specialTool(specialToolInputSchema.parse(part.toolRequest?.input)),
},
};
default:
throw Error('Tool not found');
}
}));
generateOptions.history = llmResponse.toHistory();
generateOptions.prompt = toolResponses;
}