Potężnym zastosowaniem dużych modeli językowych są agenci o zasadzie działania opartej na LLM. Agent to system, który może wykonywać złożone zadania, planując ich podział na mniejsze zadania i (za pomocą wywołania narzędzia) wykonując zadania, które współpracują z zasobami zewnętrznymi, takimi jak bazy danych czy nawet urządzenia fizyczne.
Oto kilka fragmentów bardzo prostego bota do obsługi klienta utworzonego przy użyciu jednego prompta i kilku narzędzi:
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],
});
Prosta architektura, taka jak ta przedstawiona powyżej, może wystarczyć, gdy Twój agent ma tylko kilka możliwości. Jednak nawet w tym ograniczonym przykładzie widać, że istnieją pewne funkcje, których klienci oczekują: na przykład wyświetlanie bieżących rezerwacji klienta czy anulowanie rezerwacji. W miarę tworzenia coraz większej liczby narzędzi do implementowania tych dodatkowych funkcji zaczynasz napotykać pewne problemy:
- Im więcej narzędzi dodasz, tym bardziej ograniczysz zdolność modelu do konsekwentnego i prawidłowego stosowania odpowiednich narzędzi do danego zadania.
- Niektóre zadania mogą być realizowane lepiej dzięki bardziej ukierunkowanej wymianie informacji między użytkownikiem a pracownikiem obsługi klienta niż za pomocą pojedynczego wywołania narzędzia.
- Niektóre zadania mogą wymagać specjalnego promptu. Jeśli na przykład agent odpowiada niezadowolonemu klientowi, może używać bardziej formalnego tonu, podczas gdy agent, który wita klienta, może używać przyjaznego i lekkiego tonu.
Jednym z podejść, które możesz zastosować, aby rozwiązać problemy występujące podczas tworzenia złożonych agentów, jest tworzenie wielu wyspecjalizowanych agentów i używanie agenta ogólnego przeznaczenia do delegowania im zadań. Genkit obsługuje tę architekturę, umożliwiając określanie promptów jako narzędzi. Każdy prompt reprezentuje jednego wyspecjalizowanego agenta z dostępem do własnego zestawu narzędzi. Te agenty są z kolei dostępne jako narzędzia dla jednego agenta orkiestracji, który jest głównym interfejsem użytkownika.
Oto jak może wyglądać rozszerzona wersja poprzedniego przykładu jako system wieloagentowy:
// 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);