Першае знаемства з AI-агентамі! Вучым мадэлі узаемадзейнічаць са знешнімі API. Ч1 + Практыка.
Прывітанне, спадарства!
Сёння працягваем цыкл артыкулаў пра ШІ.
- 🔗 1. Zero-Shot, One-Shot і Few-Shot: Як працаваць з промптамі
- 🔗 2. Grounding або “Як прымусіць мадэль слухацца”
- 🔗 3. Асновы промпт-дызайну: як пісаць эфектыўныя запыты да штучнага інтэлекту
- 🔗 4. Як працаваць з фідбэкамі ў промптынгу: жывы гайд з прыкладамі
- 🔗 5. Як навучыць штучны інтэлект чытаць вашыя дакументы і адказваць на пытанні па іх
I на гэты раз мы з вамі занырнем у бязконцую тэму ШІ-агентаў (ці проста агентаў). А што гэта такое і куды мы будзем занырваць мы даведаемся ніжэй! І так пачынаем!
Як мы ўжо пісалі у папярэдніх артыкулах, ШІ-мадэлі (далей проста мадэлі) адарваныя ад сусвету гэтак жа як племя індзейцаў у Амазоніі. Мадэлі не маюць уласнай караткачасовай памяці і не могуць самастойна узаемадзейнічаць з інтэрнэтам і іншым сусветам. І вось тут у гульню урываюцца агенты.
(Нашчасце не гэтыя)
Добра ўсё ўмець, ды не ўсё рабіць.
Гэтая народная мудрасць добра пасуе і да свету штучнага інтэлекту. Мадэлі валодаюць велізарнымі ведамі і могуць падрабязна распавесці, як выканаць амаль любую задачу. Але — як і сапраўдны мудрэц — самі ў справы не ўмешваюцца. Іх справа — ведаць, тлумачыць, планаваць. А ўжо рабіць павінны іншыя — у нашым выпадку, агенты.
Агент слухае парады мадэлі і бярэ справу ў свае рукі:
- выкарыстоўвае інтэлект мадэлі, але і ўмее самастойна:
- рабіць запыты да API,
- чытаць і пісаць файлы,
- працаваць з базамі дадзеных,
- аўтаматызаваць задачы і кіраваць працэсамі.
Калі параўноўваць з жыццём — мадэль як вопытны архітэктар: плануе, раіць, у дэталях распісвае, што і як павінна быць. А агент — гэта будаўнічая брыгада, якая бярэ чарцяжы і ўзводзіць дом. Такім чынам камбінацыі мадэляў ды агентаў могуць рабіць вялікую колькасць рэчаў якія недасяжныя проста мадэлям.
Калі вы карыстаецеся чатам GPT - то магчыма заўважылі што Яго магчымасці не абмежаваныя толькі напісаннем тэкста. Ен можа напрыклад, і csv файл стварыць і нешта намаляваць. Гэтыя і іншыя яго магчымасці рэалізаваныя праз агенты.
Хто дарогу пытаець, той не блукаець.
Каб не заблытацца ў тэрмінах, давайце адразу разбярэмся, хто ёсць хто ў гэтым свеце.
Функцыі (Functions)
— гэта канкрэтныя дзеянні, якія можа выканаць агент. Напрыклад, зрабіць API-запыт, захаваць файл, правесці разлік ці нават намаляваць графік. Гэта як асобныя інструменты ў скрыні: малаток, адвёртка, ключ — кожны мае сваё прызначэнне. Часцей за ўсё функцыі - тое ж што і ў праграмаванніТулы (Tools)
— гэта наборы функцый (ці адна), сабраныя для пэўнай задачы. Напрыклад, тул для працы з API можа мець функцыі для GET і POST запытаў, а тул для працы з файламі — функцыі чытання і запісу CSV або JSON. Іншымі словамі, тул — гэта як добра ўкамплектаваная скрыня інструментаў для канкрэтнай працы.Агенты (Agents)
— гэта арганізатары ўсяго гэтага працэсу. Агент атрымлівае задачу, аналізуе, якія тулы і функцыі патрэбныя, і кіруе іх выкарыстаннем. Ён, быццам прараб на будоўлі, раздае каманды: «Ты ідзі зрабі API-запыт», «Ты прачытай файл», «Ты згенеруй справаздачу».
📌 Важна! Агент сам не выконвае працу — ён кіруе працэсам і прымае рашэнні, калі і што трэба выкарыстоўваць.
Трэба адзначыць што розніца паміж туламі і функцыямі вельмі абстрактная і ў многіх артыкулах выкарыстоўваецца ці адно ці другое. Таму калі што - то будзеце ведаць што розніцы амаль няма.
Пачынаем ствараць сусвет з блэкджэкам і ... агентамі
І так практыка. Шмат коду пісаць не будзем, баяцца не трэба. Але я б рэкамендаваў стварыць тэлеграм бота для зручнасці тэсціравання і выкарыстання нашага бота.
Паехалі!
Першае - ствараем бота:
Каб стварыць бота - дастаткова перайсці ў афіцыйны бот тэлеграма https://t.me/BotFather - і націснуць кнопку "старт". Затым са спісу каманд выбраць /newbot і ўвесці імя бота. (Павінна скончвацца на _bot). У выніку мы атрымаем спасылку на нашага бота і HTTP API. Усё! Бот створаны. зараз трэба заставіць яго працаваць.
(Ключ нам спатрэбіцца - не выдаляем)
Другое - наладжваем асяроддзе
Бярэм гатовы код з https://github.com/bel-frontend/RAG
у тэчцы lesson4_agent
ствараем файл .env
. І запісваем туды свой ключ
TELEGRAM_BOT_TOKEN=your_token
Далей выконваем каманду у тэрмінале
bun install
Калі ў цябе bun не ўсталяваны - то глядзі тут
Не забываем пра ollama
. Калі не ўсталявана - глядзім там жа і правяраем каб была ўсталявана мадэль mistral-small3.1
(Яе абраў таму, што гэта мадэль падтрымлівае tools і яна бясплатная. Так, не ўсе мадэлі могуць працаваць з агентамі):
ollama list
У спісе няма гэтай мадэлі? - усталёўваем
ollama run mistral-small3.1
Ну, лічы ўсё гатова.
Трэцяе - запускаем чатбота. Надвор'е, прыказкі і сабачкі.
Ну што, даражэнькія, вось мы і дабраліся да самага цікавага — глядзім, на што наш агент здатны! 😎
Запускаем бота камандай у тэрмінале:
bun index.ts
І… пагналі тэставаць яго ў тэлеграме!
- «Якое надвор’е ў Менску?» — спойлер: як заўсёды — хмурна і вільготна. Нічога новага, Менск жыве па сваіх правілах! 🌧️
- «Пакажы сабачку!» — і экран імгненна напаўняецца пазітывам у выглядзе мілай сабачай мордачкі 🐶. Ну скажыце, хіба можна не ўсміхнуцца?
- «Дай прыказку пра сяброўства» — тут хацелі як лепш, але атрымалася… ну, як атрымалася.🤷
📸 Глядзіце, вось наш агент з MISTRAL
у справе:
Як бачна, з надвор’ем і сабачкамі ён спраўляецца на ўсе сто. А вось з народнай мудрасцю — мудрасці не завезлі (і беларускай мовы, калі па праўдзе 😅).
Але не спяшаемся засмучацца! Давайце правядзём невялічкі батл: наш агент з мадэллю mistral-small3.1 супраць нашага агента з GPT-4o!
📸 Вось як спраўляецца ён жа з GPT-4o
(хто б сумняваўся — значна лепш):
Вынікі батлу - 3:2 на карысць GPT-4o
.
Так што галоўная выснова — чым больш магутная мадэль, тым лепш працуе агент, нават калі код не змяняецца ні на радок!
Ну а зараз, мы ж сюды не сабачак глядзець прышлі, давайце зазірнем, як жа мы ўсё гэта накодзілі! 👇
Код — дзе тут агент і хто ва ўсім вінаваты? 🤖
import { createReactAgent } from '@langchain/langgraph/prebuilt'; import { chatModel, Model } from './model'; import { tool } from '@langchain/core/tools'; import { z } from 'zod'; import { SystemMessage } from '@langchain/core/messages'; const fetchJson = async (url: string) => { const res = await fetch(url); if (!res.ok) throw new Error(`Fetch error ${res.status}`); return res.json(); }; const fetchText = async (url: string) => { const res = await fetch(url); if (!res.ok) throw new Error(`Fetch error ${res.status}`); return res.text(); }; // 📦 Інструмент 1: надвор'е const weatherTool = tool( async ({ city }: { city: string }) => { const res = await fetchText(`https://wttr.in/${city}?format=3`); return res || 'Cannot find weather.'; }, { name: 'get_weather', description: 'Get current weather for a given city', schema: z.object({ city: z.string() }), // выкарыстоўваецца для валідацыі } ); const getProverbByTopic = tool( async () => { console.log('Fetching proverbs'); const res = (await fetchJson( 'https://gist.githubusercontent.com/bel-frontend/41775a79904f2535c4dd97d7990ad83d/raw/dc6c5cb1a849961833dd157454fd3ec11129883b/index.json' )) as { message: string }[]; console.log(res); const allProverbsInOneString = res.reduce((acc, curr) => { return acc + curr.message + '\n'; }, ''); return allProverbsInOneString || 'Cannot find proverbs.'; }, { name: 'get_proverb_by_topic', description: 'Get full list of proverbs for search or selecting by topic or random', } ); const model = await chatModel(Model.MISTRAL); export const agentApp = ({ bot, userId }: { bot: any; userId: number }) => { const getDogPhoto = tool( async () => { const res = (await fetchJson( 'https://dog.ceo/api/breeds/image/random' )) as { message: string }; const imageUrl = res?.message; if (!imageUrl) return 'Не ўдалося атрымаць выяву сабакі.'; bot.sendPhoto(userId, imageUrl); return 'Выява сабакі дасланая.'; }, { name: 'get_dog_photo', description: `Send to user random dog photo`, } ); return createReactAgent({ llm: model, tools: [weatherTool, getProverbByTopic, getDogPhoto], messageModifier: new SystemMessage(`Ты разумны памочнік. Адказвай зразумела і каротка. Адказвай на пытанні толькі адносна надвор'я, генерацыі прыказак і фоты сабакі. Калі пытанне не адносіцца да гэтых тэм, скажы "Я не ведаю".`), }); };
Больш за ўсе нас цікавіць вось гэты кавалак -
return createReactAgent({ llm: model, tools: [weatherTool, getProverbByTopic, getDogPhoto], messageModifier: new SystemMessage(`Ты разумны памочнік...`) });
🛠️ Што тут адбываецца?
llm: model
— тут мы падключаем нашу мадэль. У нашым выпадку — MISTRAL, таму і працуем скромна, без паэзіі, затое бясплатна!tools: [weatherTool, getProverbByTopic, getDogPhoto]
— гэта як быццам мы перадалі агенту скрыню з інструментамі і сказалі: «Вось табе малаток, адвёртка і фотапарат.»messageModifier: SystemMessage(…)
— а гэта ўжо інструкцыя для нашага агента.
Калі глядзець на тулы- то на прыкладзе
const weatherTool = tool( async ({ city }: { city: string }) => { const res = await fetchText(`https://wttr.in/${city}?format=3`); return res || 'Cannot find weather.'; }, { name: 'get_weather', description: 'Get current weather for a given city', schema: z.object({ city: z.string() }), // выкарыстоўваецца для валідацыі } );
Тут можам пабачыць базавую структуру функцыі, якая атрымлівае горад і выртае надвор'е. Звярніце увагу на тое як мы апісваем тул і як мы параметрызуем уваходзячыя дадзеныя. Гэта важна і спатрэбіцца пры напісанні больш складаных тулоў.
Так агент і працуе — разумнае кіраўніцтва (залежыць ад мадэлі канешне), мінімум разважанняў і максімум дакладнасці.
Вынікі:
Ну што, уся філасофія агенцкай працы цяпер як на далоні! Далей — альбо пашыраем яго магчымасці, альбо ганарымся тым, што ўжо маем! 😉
💡 Але гэта толькі размінка!
Тое, што мы зрабілі — самы просты варыянт агента. А ў сапраўдным жыцці агенты могуць быць нашмат магутнейшымі:
- выкарыстоўваць іншыя ШІ-мадэлі як інструменты;
- працаваць у камандзе з іншымі агентамі;
- будаваць цэлыя ланцужкі рашэнняў і аўтаматызаваць складаныя бізнес-працэсы.
📅 У наступным артыкуле мы падрабязна пагаворым пра:
- архітэктуры працы агентаў (ReAct, AutoGPT, LangGraph і іншыя);
- як правільна ствараць і арганізоўваць складаных агентаў;
- і як навучыць агента прымаць рашэнні, а не толькі выконваць загады.
Так што заставайцеся з намі — далей будзе толькі цікавей! 😉
Каментары
(Каб даслаць каментар залагуйцеся ў свой уліковы запіс)