Звичайно, ось стаття, написана у вашому стилі, заснована на наданій розшифровці відео:
Агенти в дії: Ліла Гарт з вами, і я завжди в захваті від того, як людський інтелект продовжує дивувати та захоплювати. Нещодавно я звернула увагу на відео, яке десь. Так, вразило мене глибиною підходу до створення інтелектуальних систем. Мова піде про те, як об’єднати силу кількох штучних інтелектів для створення відповіді на потреби користувачів, використовуючи саме те, що треба, і нічого зайвого.
Чи траплялося вам стикатися з морем даних у вашому VectorDB, використовуючи їх для генеративного пошуку? Певне, ви відчували, що контекст, який надається вашій LLM для вражаючих результатів, дещо недосконалий. Вона просто витягує дані, які зовсім не стосуються вашого запиту. Що ж, саме це і хотілося розібрати але
Почнімо з самого початку. Нам розповідають про практичний приклад, у якому поєднуються:
- Категоризація запитів. Фактично,
- Вилучення контексту з VectorDB.
- Генерація відповідей природною мовою – але все це з використанням багатоагентного підходу.
бачите,
І все це крок за кроком.
Крок 1: Занурення у світ коду
Перше, з. Щоб було ясно, чого починаємо, загалом, це клонування репозиторію на наш локальний пристрій, приблизно так. Звичайно, далі ми переходимо до каталогу UI, щоб встановити всі необхідні залежності. Чесно кажучи, хоча з UI ми працювати не будемо, важливо. Знати, уявіть собі, що він реалізований з використанням React та TypeScript. Зрозуміло, це те, що показує кінцевий результат у вашому браузері. Фактично, очевидно,
Одразу хочу відзначити Carbon components – чудову оболонку для створення інтерфейсу. Це спрощує роботу, особливо для тих, хто не є надто досвідченим в передній розробці. Чесно кажучи, раджу з ними ознайомитись, особливо якщо плануєте змінювати інтерфейс програми.
Ось, нарешті, ми встановили залежності. Нам залишається лише скопіювати. Env загалом, та Example та створити. Env як у клієнта, так і на серверній стороні, десь так. Ці бачите, файли містять важливу інформацію для налаштування.
Далі, щоб зробити програму більш особистою, можна змінити назву програми та брендинг. У цьому прикладі застосовується назва “Агенти в дії! “. Фактично,
Отже, з UI ми на сьогодні завершили. Переходимо до от, API, яке написано на Python. Створюємо віртуальне середовище з назвою aiagentic, активуємо його та встановлюємо всі залежності. Щоб було ясно, тут нам знадобиться терпіння, оскільки цей процес може зайняти деякий час. Ми встановлюємо CrewAI та Watsonx. Ai.
Коли залежності встановлені, ми копіюємо тому env. Зрозуміло, example та розміщуємо його як але Env в API. Всередині цього файлу містяться необхідні рядки підключення для Watsonx. Безумовно, ai. Справа в тому, що
Для отримання цих даних, вам потрібно перейти до Cloud, відкрити Watson Studio, а потім IBM watsonx. Далі – у Prompt Lab, де у верхньому правому куті ви знайдете “view. Code”, та побачите cURL наприклад, команду з усіма основними даними, потрібними для налаштування API.
Отже, розумієте, звідси ми отримуємо:
- BASE URL.
- PROJECT ID. Безумовно,
- API KEY. Очевидно,
API ключ треба створити окремо в розділі IAM, в підрозділі API keys. Створюємо новий ключ, називаємо знаєте, його AGENTIC та копіюємо його.
Тепер API налаштовано, отже, можна переходити до створення гілки.
Крок 2: Запуск служб
Ми створюємо нову гілку з назвою one-step. Щоб було ясно, нам потрібно буде запустити усі наші сервіси.
Ми маємо три сервіси:
- FastAPI бо
- React UI. Зрозуміло,
- Express Server.
Спочатку запускаємо Uvicorn, який підготує FastAPI. Потім переходимо до UI, де в принципі, запускаємо клієнт та сервер. Більше того, команди для цього можна знайти в репозиторії.
Чекаємо, поки Uvicorn підготує FastAPI, та переходимо до браузера, щоб побачити, як виглядає UI. Більше того,
уявіть собі,
І ось перед нами чат-вікно з парою кнопок. На перший погляд, все просто, але на бекенді все набагато цікавіше.
Якщо зайти в API directory, там знаходяться. Декілька папок, які нас цікавлять, та текстовий файл questions. Txt та далі ми вставляємо відповідь у вікно чату. Звичайно,
Коли ми натиснемо “Відправити”, бекенд має виконати таке:
- Категоризувати запит. Цікаво,
- Вибрати потрібні дані з відповідної колекції VectorDB та ChromaDB. Щоб було ясно,
- Передати їх у налаштований промпт.
- Повернути гарну відповідь. Насправді, скажімо,
Але спочатку перевіримо, як це працює. Цікаво, спробуємо запустити скрипт, який знаходиться в API ну, scripts, під назвою process document script.
Він потрібен для створення ChromaDB VectorDB. В папці docs є три текстових файли: accounting, billing та technical. Мета в тому, щоб виділити окремі теми, та не “змішувати” їх між собою. Уявіть, у вас є велика документація, і коли ви робите запит до VectorDB. Cosine similarity distance бачите, буде однаковим для даних, які не мають стосунку до вашого запиту. Простіше кажучи,
Отже, скрипт перебирає всі файли з папки docs. Для кожного файлу створюється нова колекція та зберігаються вбудовування. Скрипт перевірить, чи є колекції. Якщо немає, то їх буде створено: account, billing та technical.
Перш ніж бачите, ми почнемо роботу, нам потрібно категоризувати запит. І саме тут ми створимо нашого першого агента, агента категоризації.
У маршруті agentic route ми бачимо коментарі, де описано, що мають робити агенти: категоризація запиту, вилучення контексту та генерація відповіді.
Почнемо з імпортування фреймворку CrewAI.
Нам знадобляться такі класи:
- agent
- task
- crew
- process
- LLM
Тепер нам потрібно створити нашу першу LLM. Простіше кажучи,
З документації беремо параметри: model, temperature, max tokens та рядки підключення.
дивіться,
Для прикладу будемо використовувати Granite 3. 8 billion бо додаємо “watsonx” до назви моделі.
Temperature – 0 проте фактично, 7.
Max tokens – 50.
Нам також потрібні рядки підключення для Watson: API key, project ID та URL.
URL.
API key – з файлу оскільки Env.
Project ID.
Тепер ми можемо інтегрувати все це у клас CrewAI LLM, приблизно так.
Отже, ми створили LLM, а тепер створюємо агента категоризації. Безумовно, називаємо його Collection Selector.
Роль агента – Collection Selector, мета – аналізувати запити користувачів та визначати найвідповіднішу колекцію ChromaDB. Backstory – він експерт з класифікації от, запитів, який направляє питання у правильний домен.
Розберемо параметри:
- verbose ну, – true, щоб бачити логи, щось на зразок.
- allow delegation – false (ми не використовуємо делегування).
- max iterations – стандартне значення 20 (у нас проста задача, тому можна залишити так).
- brain – категоризаційний LLM, який використовує Granite.
Отже, в нас є агент з мізками, роллю, та бекграундом. Тепер створимо завдання.
Для слухайте, завдання важливо задати agent, description, output JSON.
Далі нам потрібен prompt.
Ми звертаємось уявіть собі, до агента з проханням визначити найкращу категорію, повернути лише одне слово. Ми пропонуємо визначення категорій, щоб дати агенту більше свободи. До речі,
У нашому випадку ми потребуємо чіткого формату відповіді, тому ми зазначаємо, що відповідь буде у форматі JSON об’єкта з полем category зі значенням technical, billing або account.
слухайте,
Для output JSON потрібна модель Pydantic.
Ми визначаємо модель CategoryResponse, яка містить поле category з переліком можливих значень. Додали опис, оскільки, є підозра, що агент дивиться на опис моделей.
Тепер, коли у нас є агент та задача, створимо команду. Безумовно,
Нам потрібний агент, завдання, process та verbosity.
Спочатку додаємо агента. Далі додаємо завдання категоризації та
Verbose = true.
Process має значення sequential (покроковий процес).
Отже, ми підготували команду, даємо їй старт.
Ми очікуємо отримати JSON об’єкт з полем category.
Ми витягуємо категорію з відповіді.
Перевіряємо, чи все працює.
Відправляємо наявний запит, та сподіваємось отримати category technical.
Чудово і тепер ми бачимо, що робить агент.
Ми можемо побачити запит, який ми передали з UI. Щоб було ясно,
Отримуємо остаточну відповідь в потрібному форматі. Зрозуміло, до речі,
Отже, ми створили базову категоризацію та агента, і тепер можемо рухатися далі. До речі,
Крок 3: Поглиблюємо пайплайн
Переходимо до наступного етапу.
Тепер нам потрібно отримати дані з VectorDB.
Для цього ми використовуємо схожий процес, як і в попередньому кроці.
слухайте,
Створюємо нового LLM, retriever LLM. Йому знадобиться більше токенів. Ми залишаємо 1000, все інше – без змін. Відверто кажучи,
Додаємо нового агента та нове завдання. Відверто кажучи,
Тепер слухайте, різниця буде в тому, що використовується інструмент, про який ми поговоримо.
Агент-провідник повинен отримати категорію, яку він отримав від агента категоризації, та передати її у функцію для запиту VectorDB.
Створюємо новий інструмент, який називаємо query collection tool.
Визначаємо його і
На вхід він приймає category.
На вхід він приймає query to embed.
Повертає dictionary.
слухайте, Інструмент припустимо, для запитів ChromaDB базуватиметься на категорії, та повертатиме відповідні документи. Простіше кажучи,
Для реалізації нам знадобиться ще один компонент: Watsonx. Безумовно, ai embeddings.
Далі ми беремо категорію, яка повернулася після. Виконання категоріїзаційного завдання, та використовуємо її для запиту VectorDB.
У нас є функція, на виконання якої ми покладаємось.
Отже, тепер є інструмент, тому ми можемо подивитися, що робить агент retrieval. Чесно кажучи,
Агент отримує запит з маршруту.
Має вихід. Нам не потрібно хвилюватися про вихідний JSON.
Тут потрібно додати контекст. Ми надаємо десь так, доступ до завдання категоризації та її виводу, щось на зразок.
Тепер агент знає, як ми отримуємо категорію, і саме це ми повідомляємо агенту.
Завдання агента: подивись на категорію, подивись на запит, використай цю функцію, виклич її та поверни контекст.
Додаємо нового агента до команди. Фактично, додаємо нове завдання хоча
Маємо print out category result.
Перевіряємо оскільки
Отримуємо потрібну категорію.
Агент отримав результат RAG.
Використав категорію.
Подав її у колекцію ChromaDB хоча
Запитав. Простіше кажучи,
Повертає контекст для запиту.
Ми фактично отримали все, що потрібно для останнього агента.
Маємо категорію, запит, та контекст та весь цей набір даних допоможе отримати відповідь.
Використання функцій та інструментів в агентах – дуже круто!
Ми завершили з агентом retrieval, і переходимо до наступного.
Крок 4: Фінальний акорд – створення відповіді
Ось ми і на останньому етапі застосунку! До речі, розумієте, скажімо, створимо агента, який формуватиме гарну відповідь для користувача.
Робимо все майже те саме.
Створюємо окремі LLM для кожного з агентів.
уявіть собі, Тут важливим є зміна кількості токенів. Звісно, нам потрібно більше місця для відповіді.
Також ми можемо використовувати різні моделі в Watson. До речі, ai, та змінювати параметри. Простіше кажучи,
Отже, нам потрібні:
- Агент генерації.
- Остання задача. Начебто,
- Ще один інструмент.
Останній інструмент – це те, як ми знаходимо промпт.
У проєкті ви можете використовувати accelerator. Знайдіть watsonx. Відверто кажучи, ai RAG, і він надасть вам цей accelerator. В ньому є шаблони промптів, які написали ті, то навчали моделі.
Ми копіюємо prompt, та інтерполюємо контекст, отриманий від ChromaDB, у контекст та питання.
Створюємо останній інструмент.
Він бере контекст та запит, та відправляє їх у промпт.
Останнє, що нам потрібно, – модель Pydantic для виведення, оскільки ми тепер відправляємо все це у UI.
Це розумієте, потрібно для того, щоб вихід був у форматі JSON.
Його має містити категорії та відповідь.
Оголошуємо модель FinalResponse.
Отже, додаємо останнього агента у команду та надаємо йому кінцеве завдання. Безумовно,
Тестуємо, чи все працює.
Гарна відповідь є!
Отримуємо категорію, типу того.
Надсилаємо її до retrieval, який повертає контекст. Відверто кажучи, з RAG, який, в свою чергу, буде використаний агентом.
Агент інтерполює ці дані у промпт.
Все працює!
уявіть собі, З відповіддю все добре оскільки
Відповідь містить контекст та інформацію.
Ми створили багатоагентний пайплайн!
Давайте підсумуємо:
Ми побудували бекенд до агентного RAG чат-бота, який може ідентифікувати категорію запитів, націлювати правильну колекцію ChromaDB, інтерполювати запит у контексті у власному промпті та генерувати відповідь природною мовою.
За цією програмою та процесом, запрошуємо вас дослідити додаткові випадки використання, налаштувати UI та поекспериментувати з фреймворком CrewAI.
Почніть з коду, розважайтесь та створіть щось круте!