การใช้งานที่มีประสิทธิภาพของโมเดลภาษาขนาดใหญ่คือตัวแทนที่ทำงานด้วย LLM ตัวแทนคือระบบที่ทํางานที่ซับซ้อนได้โดยการวางแผนวิธีแบ่งงานออกเป็นงานย่อยๆ และดําเนินการงาน (ด้วยความช่วยเหลือของการเรียกใช้เครื่องมือ) ที่โต้ตอบกับแหล่งข้อมูลภายนอก เช่น ฐานข้อมูลหรือแม้แต่อุปกรณ์จริง
ต่อไปนี้เป็นข้อความบางส่วนจากตัวแทนฝ่ายบริการลูกค้าแบบง่ายมากที่สร้างโดยใช้พรอมต์เดียวและเครื่องมือหลายรายการ
const menuLookupTool = ai.defineTool(
{
name: 'menuLookupTool',
description: 'use this tool to look up the menu for a given date',
inputSchema: z.object({
date: z.string().describe('the date to look up the menu for'),
}),
outputSchema: z.string().describe('the menu for a given date'),
},
async (input) => {
// Retrieve the menu from a database, website, etc.
// ...
}
);
const reservationTool = ai.defineTool(
{
name: 'reservationTool',
description: 'use this tool to try to book a reservation',
inputSchema: z.object({
partySize: z.coerce.number().describe('the number of guests'),
date: z.string().describe('the date to book for'),
}),
outputSchema: z
.string()
.describe(
"true if the reservation was successfully booked and false if there's" +
' no table available for the requested time'
),
},
async (input) => {
// Access your database to try to make the reservation.
// ...
}
);
const chat = ai.chat({
model: gemini15Pro,
system:
"You are an AI customer service agent for Pavel's Cafe. Use the tools " +
'available to you to help the customer. If you cannot help the ' +
'customer with the available tools, politely explain so.',
tools: [menuLookupTool, reservationTool],
});
สถาปัตยกรรมแบบง่ายดังที่แสดงด้านบนอาจเพียงพอเมื่อตัวแทนมีความสามารถเพียงไม่กี่อย่าง อย่างไรก็ตาม แม้จะเป็นตัวอย่างแบบจํากัดข้างต้น คุณก็เห็นว่าความสามารถบางอย่างที่ลูกค้าคาดหวัง เช่น แสดงการจองปัจจุบันของลูกค้า การยกเลิกการจอง และอื่นๆ เมื่อคุณสร้างเครื่องมือต่างๆ มากขึ้นเพื่อใช้ความสามารถเพิ่มเติมเหล่านี้ คุณจะเริ่มพบปัญหาบางอย่าง
- ยิ่งคุณเพิ่มเครื่องมือมากเท่าใด ความสามารถของโมเดลในการใช้เครื่องมือที่เหมาะสมกับงานอย่างถูกต้องและสอดคล้องกันก็จะยิ่งมากขึ้นเท่านั้น
- งานบางอย่างอาจทำได้ดีที่สุดผ่านการพูดคุยแบบไปมาระหว่างผู้ใช้กับตัวแทนที่มุ่งเน้นมากขึ้น แทนที่จะใช้การเรียกใช้เครื่องมือเพียงครั้งเดียว
- งานที่ซับซ้อนอาจได้รับประโยชน์จากพรอมต์เฉพาะ ตัวอย่างเช่น หากตัวแทนกำลังตอบกลับลูกค้าที่ไม่พอใจ คุณอาจต้องการให้น้ำเสียงของตัวแทนเป็นทางการมากขึ้น ขณะที่ตัวแทนที่ทักทายลูกค้าตั้งแต่แรกอาจใช้น้ำเสียงที่เป็นมิตรและผ่อนคลายมากขึ้น
วิธีหนึ่งที่คุณสามารถใช้จัดการกับปัญหาเหล่านี้ที่เกิดขึ้นเมื่อสร้างตัวแทนที่ซับซ้อนคือสร้างตัวแทนเฉพาะทางหลายตัวและใช้ตัวแทนเอนกประสงค์เพื่อมอบหมายงานให้ตัวแทนเหล่านั้น Genkit รองรับสถาปัตยกรรมนี้โดยอนุญาตให้คุณระบุพรอมต์เป็นเครื่องมือ พรอมต์แต่ละรายการแสดงถึงตัวแทนเฉพาะตัวรายการเดียวที่มีชุดเครื่องมือของตัวเอง และตัวแทนเหล่านั้นจะพร้อมใช้งานเป็นเครื่องมือสำหรับตัวแทนการจัดเตรียมการเพียงรายเดียว ซึ่งเป็นอินเทอร์เฟซหลักกับผู้ใช้
ตัวอย่างเวอร์ชันขยายของตัวอย่างก่อนหน้านี้อาจมีลักษณะดังนี้เมื่อเป็นระบบตัวแทนหลายราย
// Define a prompt that represents a specialist agent
const reservationAgent = ai.definePrompt(
{
name: 'reservationAgent',
description: 'Reservation Agent can help manage guest reservations',
tools: [reservationTool, reservationCancelationTool, reservationListTool],
},
'{{role "system"}} Help guests make and manage reservations'
);
// Or load agents from .prompt files
const menuInfoAgent = ai.prompt('menuInfoAgent');
const complaintAgent = ai.prompt('complaintAgent');
// The triage agent is the agent that users interact with initially
const triageAgent = ai.definePrompt(
{
name: 'triageAgent',
description: 'Triage Agent',
tools: [reservationAgent, menuInfoAgent, complaintAgent],
},
`{{role "system"}} You are an AI customer service agent for Pavel's Cafe.
Greet the user and ask them how you can help. If appropriate, transfer to an
agent that can better handle the request. If you cannot help the customer with
the available tools, politely explain so.`
);
// Start a chat session, initially with the triage agent
const chat = ai.chat(triageAgent);