Галоўная > Першае знаемства з AI-агентамі! Вучым мадэлі узаемадзейнічаць са знешнімі API. Ч1 + Практыка.

Першае знаемства з AI-агентамі! Вучым мадэлі узаемадзейнічаць са знешнімі API. Ч1 + Практыка.

ШІ
AI
agents

agents Прывітанне, спадарства!

Сёння працягваем цыкл артыкулаў пра ШІ.

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. І запісваем туды свой ключ

text
1TELEGRAM_BOT_TOKEN=your_token 

Далей выконваем каманду у тэрмінале

text
1bun install

Калі ў цябе bun не ўсталяваны - то глядзі тут

Не забываем пра ollama. Калі не ўсталявана - глядзім там жа і правяраем каб была ўсталявана мадэль mistral-small3.1

(Яе абраў таму, што гэта мадэль падтрымлівае tools і яна бясплатная. Так, не ўсе мадэлі могуць працаваць з агентамі):

text
1ollama list

У спісе няма гэтай мадэлі? - усталёўваем

text
1ollama run mistral-small3.1

Ну, лічы ўсё гатова.

Трэцяе - запускаем чатбота. Надвор'е, прыказкі і сабачкі.

Ну што, даражэнькія, вось мы і дабраліся да самага цікавага — глядзім, на што наш агент здатны! 😎

Запускаем бота камандай у тэрмінале:

text
1bun  index.ts

І… пагналі тэставаць яго ў тэлеграме!

  • «Якое надвор’е ў Менску?» — спойлер: як заўсёды — хмурна і вільготна. Нічога новага, Менск жыве па сваіх правілах! 🌧️
  • «Пакажы сабачку!» — і экран імгненна напаўняецца пазітывам у выглядзе мілай сабачай мордачкі 🐶. Ну скажыце, хіба можна не ўсміхнуцца?
  • «Дай прыказку пра сяброўства» — тут хацелі як лепш, але атрымалася… ну, як атрымалася.🤷

📸 Глядзіце, вось наш агент з MISTRAL у справе:

Вынікі

Як бачна, з надвор’ем і сабачкамі ён спраўляецца на ўсе сто. А вось з народнай мудрасцю — мудрасці не завезлі (і беларускай мовы, калі па праўдзе 😅).

Але не спяшаемся засмучацца! Давайце правядзём невялічкі батл: наш агент з мадэллю mistral-small3.1 супраць нашага агента з GPT-4o!

📸 Вось як спраўляецца ён жа з GPT-4o (хто б сумняваўся — значна лепш):

Вынікі1

Вынікі батлу - 3:2 на карысць GPT-4o.

Так што галоўная выснова — чым больш магутная мадэль, тым лепш працуе агент, нават калі код не змяняецца ні на радок!

Ну а зараз, мы ж сюды не сабачак глядзець прышлі, давайце зазірнем, як жа мы ўсё гэта накодзілі! 👇

Код — дзе тут агент і хто ва ўсім вінаваты? 🤖

text
1import { createReactAgent } from '@langchain/langgraph/prebuilt';
2import { chatModel, Model } from './model';
3import { tool } from '@langchain/core/tools';
4import { z } from 'zod';
5import { SystemMessage } from '@langchain/core/messages';
6
7const fetchJson = async (url: string) => {
8    const res = await fetch(url);
9    if (!res.ok) throw new Error(`Fetch error ${res.status}`);
10    return res.json();
11};
12
13const fetchText = async (url: string) => {
14    const res = await fetch(url);
15    if (!res.ok) throw new Error(`Fetch error ${res.status}`);
16    return res.text();
17};
18
19// 📦 Інструмент 1: надвор'е
20const weatherTool = tool(
21    async ({ city }: { city: string }) => {
22        const res = await fetchText(`https://wttr.in/${city}?format=3`);
23        return res || 'Cannot find weather.';
24    },
25    {
26        name: 'get_weather',
27        description: 'Get current weather for a given city',
28        schema: z.object({ city: z.string() }), // выкарыстоўваецца для валідацыі
29    }
30);
31
32const getProverbByTopic = tool(
33    async () => {
34        console.log('Fetching proverbs');
35
36        const res = (await fetchJson(
37            'https://gist.githubusercontent.com/bel-frontend/41775a79904f2535c4dd97d7990ad83d/raw/dc6c5cb1a849961833dd157454fd3ec11129883b/index.json'
38        )) as { message: string }[];
39
40        console.log(res);
41
42        const allProverbsInOneString = res.reduce((acc, curr) => {
43            return acc + curr.message + '\n';
44        }, '');
45
46        return allProverbsInOneString || 'Cannot find proverbs.';
47    },
48    {
49        name: 'get_proverb_by_topic',
50        description:
51            'Get full list of proverbs for search or selecting by topic or random',
52    }
53);
54
55const model = await chatModel(Model.MISTRAL);
56
57export const agentApp = ({ bot, userId }: { bot: any; userId: number }) => {
58    const getDogPhoto = tool(
59        async () => {
60            const res = (await fetchJson(
61                'https://dog.ceo/api/breeds/image/random'
62            )) as { message: string };
63            const imageUrl = res?.message;
64            if (!imageUrl) return 'Не ўдалося атрымаць выяву сабакі.';
65            bot.sendPhoto(userId, imageUrl);
66
67            return 'Выява сабакі дасланая.';
68        },
69        {
70            name: 'get_dog_photo',
71            description: `Send to user random dog photo`,
72        }
73    );
74
75    return createReactAgent({
76        llm: model,
77        tools: [weatherTool, getProverbByTopic, getDogPhoto],
78        messageModifier:
79            new SystemMessage(`Ты разумны памочнік. Адказвай зразумела і каротка. Адказвай на пытанні толькі
80      адносна надвор'я, генерацыі прыказак і фоты сабакі. Калі пытанне не адносіцца да гэтых тэм, скажы "Я не ведаю".`),
81    });
82};

Больш за ўсе нас цікавіць вось гэты кавалак -

text
1return createReactAgent({
2    llm: model,
3    tools: [weatherTool, getProverbByTopic, getDogPhoto],
4    messageModifier: new SystemMessage(`Ты разумны памочнік...`)
5});

🛠️ Што тут адбываецца?

  1. llm: model — тут мы падключаем нашу мадэль. У нашым выпадку — MISTRAL, таму і працуем скромна, без паэзіі, затое бясплатна!
  2. tools: [weatherTool, getProverbByTopic, getDogPhoto] — гэта як быццам мы перадалі агенту скрыню з інструментамі і сказалі: «Вось табе малаток, адвёртка і фотапарат.»
  3. messageModifier: SystemMessage(…) — а гэта ўжо інструкцыя для нашага агента.

Калі глядзець на тулы- то на прыкладзе

text
1const weatherTool = tool(
2    async ({ city }: { city: string }) => {
3        const res = await fetchText(`https://wttr.in/${city}?format=3`);
4        return res || 'Cannot find weather.';
5    },
6    {
7        name: 'get_weather',
8        description: 'Get current weather for a given city',
9        schema: z.object({ city: z.string() }), // выкарыстоўваецца для валідацыі
10    }
11);

Тут можам пабачыць базавую структуру функцыі, якая атрымлівае горад і выртае надвор'е. Звярніце увагу на тое як мы апісваем тул і як мы параметрызуем уваходзячыя дадзеныя. Гэта важна і спатрэбіцца пры напісанні больш складаных тулоў.

Так агент і працуе — разумнае кіраўніцтва (залежыць ад мадэлі канешне), мінімум разважанняў і максімум дакладнасці.

Вынікі:

Ну што, уся філасофія агенцкай працы цяпер як на далоні! Далей — альбо пашыраем яго магчымасці, альбо ганарымся тым, што ўжо маем! 😉

💡 Але гэта толькі размінка!

Тое, што мы зрабілі — самы просты варыянт агента. А ў сапраўдным жыцці агенты могуць быць нашмат магутнейшымі:

  • выкарыстоўваць іншыя ШІ-мадэлі як інструменты;
  • працаваць у камандзе з іншымі агентамі;
  • будаваць цэлыя ланцужкі рашэнняў і аўтаматызаваць складаныя бізнес-працэсы.

📅 У наступным артыкуле мы падрабязна пагаворым пра:

  • архітэктуры працы агентаў (ReAct, AutoGPT, LangGraph і іншыя);
  • як правільна ствараць і арганізоўваць складаных агентаў;
  • і як навучыць агента прымаць рашэнні, а не толькі выконваць загады.

Так што заставайцеся з намі — далей будзе толькі цікавей! 😉

Admin, 2025-04-29
Каментары

    (Каб даслаць каментар залагуйцеся ў свой уліковы запіс)