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

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 (хто б сумняваўся — значна лепш):

Вынікі1

Вынікі батлу - 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(`Ты разумны памочнік...`)
});

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

  1. llm: model — тут мы падключаем нашу мадэль. У нашым выпадку — MISTRAL, таму і працуем скромна, без паэзіі, затое бясплатна!
  2. tools: [weatherTool, getProverbByTopic, getDogPhoto] — гэта як быццам мы перадалі агенту скрыню з інструментамі і сказалі: «Вось табе малаток, адвёртка і фотапарат.»
  3. 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 і іншыя);
  • як правільна ствараць і арганізоўваць складаных агентаў;
  • і як навучыць агента прымаць рашэнні, а не толькі выконваць загады.

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

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

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

    ;