Розумэнне агентаў ШІ чераз аналагію мозга і пальцаў
Дазвольце даклэ расказаць, як LLM-ы, інструменты та ўсілякія екзэкутары інструментаў взаімадзейнуюць, практычна паказавшы архітектуру агента черз аналагію з замовленнем ў закладзе гармана, а пасля створыўшы мінімальную рэалізацыю такога агента.
Адміністрацыя
Верагчы, вы вже сталкаваліся з такіми термінамі, як «выклік інструменту», або ідеяю, што агенты — це проста LLM-модулі, падключаныя да інструментаў. Уместо таго, каб адразу перейść да вызначэнняў, у этай статцы выкорыстоўваецца звычны кождадзённы сцэнарый, каб паспрабаваць поясніць, што на самай працэ практыкуецца ўнутры AI-агента. У ходзе чытання вы пазнаёсце, як LLM, інструменты і такое панявленне, як «экзэкутар інструменту», взаімаюцца между сабою. Гэта напісана для разработчыкаў, якія хочуць справжняя глыбокае разумеўце механізмаў, якія стояць за агентамі, а не проста павтараць тэрмінологію; даўжэй у статцы практычна паказана, як стварыць мінімальны агент, каб побачыць яго рэалізацыю.
Аналагія
Уявіце сабе, што вы замовляеце ўжынку через дэлівер-дзяўерськія прыстрымы. Разбіраючы гэтую звычную дзеянне, мы пазнаём, як ваш мозг і пальцы саавтарсьваюць з прыстрымам, каб замовіць ўжынак, а пасля кожны крок будзе пераадражаны ў тэрмінах, якія вжываюцца для агентаў.
Усё пачынаецца там, што ваш мозг прыказвае пальцу запусціць аплікэцыю для замовлення ўжоў чым бы вы моглі пераглядаць рестораны поблізу. Пальцам вы натыкаецеся на іконку, і на экране з’яўляецца спіс ресторанаў.
Потым ваш мозг чытае назвы ресторанаў, якія паказаны на экране, і керуе пальцам натыснуць на конкрэтны ресторан, каб адкрыць яго меню. Пасля чаго ваш мозг скануе пункты меню і прыказвае пальцу натыснуць на кнопку «Дадзіць» паляўкі ўжоў, якія вы хочаце, каб іх дадаць у кошык.
Калі гэта зроблена, ваш мозг пераглядае всё, што ў кошыку, каб пераканацца, што нічога не забыта, а потым прыказвае пальцу натыснуць на «Задаць замовленне».
У канцы ваш мозг усвядомляе, што цель досягнута, калі бачыць экран падтверджэння замовлення, і тады взаімныя дзеянні межу мозгам і пальцам завершаюцца.
Аналагія ў мове агентаў
Зверніце ўвагу на важлівую деталь у всій гэтай секуэнцы: сам мозг ніколі не выкарыстоўваў жадную дзеяннё прычымо — ён толькі адначыта прыходзячую інфармацыю і паведамляе пальцу, што робіць далей. Гэта майже точна адпавядае таму, як функцыонуе ШІ-агент. LLM выполняе роль мозга; дзеянні, такія як переглед рэстаранаў, ачыненне меню, дадзеныя прадуктав у корзіну і зданне замовлення, ёсць інструменты, якія мозг ведае, як выкарыстоўваць; а пальцы адпавядаюць інструменту-выконавцу, компаненту, який фактычна выкарыстоўвае дзеяннё.
Калі вы ствараеце агента для конкрэтнай меты, вы визначаеце набор інструментоў і передаеце гэты список LLM, які выступае ў ролі мозга для прыняцтва рашэнняў. (Далей -> вжываецца для пазначэння аднае ступені, калі кантроль пераходзіць да наступнай.) Калі корыстувач дае агенту заданне, якое трэба выконаць, процес выглядае так: LLM аналізуе текущую ступень чы ўсё щэ застаючуюся роботу і выбірае найболей прыемны інструмент -> ён перадае гэты інструмент екзэкутару інструмента, прасіўшы яго запустыць яго і даставіць адпаведны рэзультат -> LLM чытае гэты рэзультат і пераканальваецца, чы ён задовольняе запит корыстувача. Якщо так, процес завершваецца тут; якщо ні, LLM выбірае наступны падходжыцельны інструмент на аднойчына з найсвежэйшым рэзультатам, і цікл павторяецца, продовжваючыся да таго часу, пакалі LLM не выявіць, што заданне абсолютна завершана і больш няма патрэбы ў вызовах інструментоў.
Адкалічэнне
Пасля таго, як канцэпцыя створылася, наступны крок — стварыць невеликі працоўны агент, здатны выдаваць замовленні на ўжынку на адпаведнасць запитам корыстувальніка. Указаныя нижэй фрагменты коду паказваюць рэальны шлях выканання, які пераходзіць агент, а ў канцы лісту прыведзеныя ўсё тое жа адносны лінк да полной базы дадзеных.
Інструменты
get_restaurants() {
// In production, replace with an API call such as GET /api/v1/restaurants
return list of restaurants;
}
get_menu(restaurantName) {
// In production, replace with an API call such as GET /api/v1/restaurants/${restaurantName or restaurantId}/menu
return menuItems;
}
add_to_cart(sessionId, menuItemId) {
// In production, replace with an API call such as POST /api/v1/cart
return updatedCart;
}
place_order(sessionId) {
// In production, replace with an API call such as POST /api/v1/order
return orderDetails;
}
Заўважыце, што гэтыя інструменты — это проста звычайныя функціі, якія можна напісаць у кождадзенневым коде прыкладнаеў — у іх няма ніякога спецыяльнага карэнту для агентоў чы логіки, прызначанай толькі для LLM. У рэальной продакшн-сетапе кожны інструмент таксама мяў бы назву, апісанне і визначэную схему вхідных дадзеных, якія ён чакае. Самэ гэта назва і апісанне ўжываюцца LLM, каб выявіць, який інструмент найлепша падходзіць да запиту корыстувальніка.
Выканавач інструментаў
toolExecutor(toolCall) {
const tool = toolNameMap[toolCall.name];
return tool.execute(toolCall.arguments);
}
Сам выконавач інструмента — это проста функцыя. Яе параметр toolCall несе інфармацыю пра інструмент, які запускаецца — його назву та аргументы, і гэтыя даны зменяюцца залежна ад таго, які інструмент выкарыстаны: це можа быць назва рестарану, ID пункту меню або ўсё інша. Ключовы момент закладзены ў тым, што калі LLM паведамляе выконавачу, який інструмент трэба запусціць, ён перадае точныя, структураваныя деталі, такія як назва інструмента get_menu з аргументам {restaurantName: "Spicy Pizza"}. Не трэба вручную выкарыстоўваць альбо парсаваць гэтую інфармацыю з неапранутага текстовага выходу LLM.
Агент
// Give all the tools to the LLM
llm = OpenAILLM.bindTools([get_restaurants, get_menu, add_to_cart, place_order])
// Take the user query to run the agent loop
reactAgent(userInput) {
while (true) {
response = llm(userInput);
if (response.isFinalAnswer) {
return response.answer;
}
result = toolExecutor(response.toolCall);
userInput = response + result;
}
}
Тое, што трэба запазначыць з псевдакода
- Назва
reactAgentадаптаваная да патэрну запрашоўкі ReAct (Reason and Act), пры якому LLM выбирае інструмент, які трэба вызваць, спаглядае рынак таго вызову, а пасля вяршыць, чы робіцца ўсё неабходнае з іншым інструментам, чы задача завершана і ці можна зупініць цыкл. - Зверніце увагу на цыкл
while(true). Самэль тут агенты разлічаюцца ад умовнай логікі, яку зазвычай пішаце ў такіх мовах, як Java чы Python. Уместо таго, каб закодаваць вызовы функцый у галузях if-else чы цыклах for, вы предстаўляеце скупку інструментоў LLM — кожны з якіх мае назву і апісанне — і дазволяеце самам LLM на час выконання вяршыць, який інструмент вызваць далей, какія аргументы перадаць, і калі робота завершана і цыкл трэба зупініць.
while(true); яго вжываюць тут выключна для ілюстрацыі адпаведнага поваджэння агента ў простым коде. У практыцы трэба вжываць фреймворкі керавання, такія як LangGraph. Нават з такім фреймворкам стандартной практыкай є обмежэнне глыбі рекурсіі, каб LLM не могла быть вызвана безканцова — неконтрольаваны цыкл можа спрычыніць багі, марнуюць токены і непатрэбныя витраты.response.isFinalAnswer у псевдокодзе сигналізуе, што агент дайшоў да завершанага адказу і больш няма патрэбы ў вызовах інструментаў. Калі гэта стануцца, агент вяртае корыстніку падсумаваны адказ замест таго, каб запускаць ўтолькі іншы інструмент.userInput = response + result, дзе сумаваны выходны данні падаюць знову ў LLM як response = llm(userInput) у наступнай ітерацыі. Гэта адбываецца таму, што кожны вызов LLM ўсунуты з станам — ён не запамячае пакульшых крокаў, нават у межах адной сесіі чы роўнараднай взаімадзеяння з корыстнікам. У результате, кожны раз, калі інструмент завершае свою роботу, неабходна зноў адправіць усю історыю размовы: запрошэнне системы, якое описвае, як должна дзейсніцца робота агента, первісны запит корыстніка, пакульшуюцы адпаведзь AI пра неабходнасць вызову інструмента, а таксама рэзультат, які даў гэты інструмент. Пасля чаго LLM обрабоцуе весь гэты рядак, каб выявіць, чы была досягнута мета, чы не трэба ўжо вызваць іншыя інструменты.Схема выконання LLM і інструментаў
У наведанай нижэй схеме показана, як LLM выбірае наступны інструмент, як его выконавач запускае ўпрацоўванне, і як гэты цыкл павтараецца, пакуль LLM не вырашыць, што задача завершана і далейшая робота з інструментамі не патрэбна.
Опісаны процес чытка паказвае взаімную адносу: LLM пропануе вызов, выконавач яго адмацчае, рэзультат вяртаецца да LLM, і той або пропануе ўзмацні вызов, або завершае цыкл фінальным адказам.
Код у GitHub
Якщо вы хочаце самі запустыць гэты прыклад і пабачыць, як агент работае, ёсць рэпозітарый з початковым кодам.
Спадні матэрыялы
- Розумеўце панявы «ітэмы» проты «паведамленняў» у API адказаў OpenAI — Інструкцыя, якая поясняе, як API адказаў OpenAI пераканструюе выходы модэля ў ітэмы заместо паведамленняў, і чаму гэта важліва для вызываў інструментаў та роботы агентав.
- Розумеўце AI-агентав: цялі, інструменты, память і цикл агента — Простае поясненне таго, чым AI-агентавы адрозніццая ад чатботаў, з акцэнтам на ключовыя складовы, цикл прыняцьбы рашэнняў, рывень автонаміі та практычныя прыклады викорыстоўвання.