Головна / Статті

Створення штучних інтелектуальних агентів на основі ваших існуючих сервісів .NET та API

Команди C# можуть зробити існуючі сервіси .NET доступними як інструменти для керування агентами ШІ через виклик функцій, з дотриманням необхідних правил щодо контексту, безпеки та спостережуваності.

Видавець: REACTAPP.TOP9 хв читання2060 слів

Джерела: AI Agents Are Changing C# Development: 10 Things Every .NET Developer Should Know

Більшість команд .NET вже мають у своєму розпорядженні ключові елементи штучного інтелекту-агента: сервіси з типовим кодом, HTTP-API, механізми автентифікації, бази даних та фонові завдання. Новизною є мовна модель, яка може вибирати, які з цих функцій використати та у якому порядку, щоб досягти мети, описаної користувачем простою мовою. У цьому посібнику розглядаються ідеї, необхідні розробнику на C#, щоб інтегрувати агента в існуюче застосування, не втрачаючи контролю над тим, що саме робить це застосування.

Класичний чат-бот виконує один цикл обміну інформацією: користувач ставить запитання, а модель відповідає текстом. Агент же працює над досягненням мети. Він аналізує, що потрібно для досягнення мети, використовує інструменти для отримання інформації чи виконання дій, переглядає результати та лише потім повертає вихідний результат.

Уявіть користувача, який хоче дізнатися, скільки замовлень надійшло сьогодні. Чат-бот може лише здогадуватися або пояснювати, як це можна з’ясувати. Агент із відповідними інструментами може отримати дані про замовлення, виконати запит за сьогоднішній день, проаналізувати цифри, написати короткий огляд та надіслати його у вигляді звіту. Практична різниця проста: чат-боти формують відповіді, агенти виконують роботу.

Інструменти перетворюють модель на корисний засіб

Сама по собі мовна модель не має уявлення про те, як працює ваше додатку. Вона не може читати таблицю клієнтів або оформлювати замовлення. Інструменти є мостом — це названі операції, які модель може запитувати. Типовий набір для бекенду електронної комерції може виглядати так:

GetCustomer()
CreateOrder()
SearchProducts()
GetWeather()
SendEmail()
QueryDatabase()

Модель вирішує, коли потрібен один із цих елементів; ваш код визначає, як він працює. У C# інструмент не обов’язково має бути чимось екзотичним. Це може бути звичайний асинхронний метод у вже наявному сервісі, наприклад такий, який завантажує клієнта за ідентифікатором через вставлений сервіс:

public async Task<Customer> GetCustomer(int id)
{
    return await customerService.GetByIdAsync(id);
}

Як тільки цей метод реєструється як інструмент, агент може використовувати цю функціональність, тоді як реалізація залишається у вашому звичайному шарі сервісів, під захистом того ж механізму вставки залежностей, тестів та обліку подій, що й решта кодової бази. Саме тут зустрічаються повсякденна розробка додатків та розробка ШІ.

Як на практиці відбувається виклик функції

Виклик функції — це механізм, який лежить в основі інструментів. Модель сама нічого не виконує; вона формує структурований запит для виклику функції з конкретними аргументами, а ваш додаток виконує цей виклик.

Припустимо, користувач запитує про статус замовлення 12345. Внутрішньо модель робить висновок, що у неї бракує інформації:

I need order information.

Тож вона просить основне додатку викликати функцію з номером замовлення як аргументом:

GetOrderStatus(12345)

Ваш код виконує цей запит, повертає результат моделі, а модель перетворює необроблені дані на зрозумілу відповідь. Для розробника на C# це має здатися знайомим: ви оприлюднюєте частину свого додатку, схожу на публічний API, користувачем якого є модель. Чіткі назви, точні типи параметрів та хороші описи значно підвищують ймовірність правильних викликів.

Повторне використання наявних API

Впровадження агентів не вимагає переписування бекенду. Якщо ваш додаток вже має кінцеві точки, вони можуть стати інструментами агента. Сервіс може вже надавати функцію пошуку клієнтів:

GET /api/customers/{id}

Окрім кінцевих точок для читання замовлення, створення замовлень та переліку товарів (наведений нижче код виконує всі три маршрути одночасно на одному рядку; сприймайте їх як окремі кінцеві точки):

GET /api/orders/{id}POST /api/ordersGET /api/products

З їх наявністю запит, такий як пошук клієнта, який здійснив найбільшу кількість замовлень цього місяця, стає послідовністю дій, яку агент може планувати самостійно: отримати дані клієнта, знайти інформацію про замовлення, порівняти показники та повідомити переможця. Агент — це просто ще один клієнт, який використовує вже створені та захищені функціонали.

Контекст: надавайте моделі те, що їй потрібно, а не все, що у вас є

Є нюанс, який легко пропустити: більше контексту не означає автоматично кращого результату. Кожен додатковий елемент коштує грошей та спричиняє затримки, а нерелевантний матеріал послаблює сигнал, що робить відповіді менш надійними. Хороше проектування агентів полягає у наданні правильного контексту саме тоді, коли він потрібен — наприклад, шляхом отримання лише тих документів, які відповідають поточному кроку, а не вставки всієї бази знань у кожен запит. Щоб детальніше дізнатися про відмінності цих механізмів пам’яті, перегляньте наш пояснювальний матеріал про пам’ять ШІ, ембеддинги та RAG.

Дозвіл агентам безпечно запитувати дані

Доступ до даних робить агентів особливо привабливими для компаній, що використовують .NET. Користувач бізнес-системи може запитати, які продукти показали найбільше зниження продажів минулого місяця. Замість створення окремого звіту для кожного такого запиту, система на основі агентів може зрозуміти запит, визначити, які дані є релевантними, здійснити пошук, проаналізувати результати та пояснити отримані дані.

Однак існує непохитне правило: ніколи не надавайте моделі необмеженого доступу до вашої бази даних. Дозвіл їй генерувати та виконувати довільні SQL-запити може призвести до створення шкідливих операцій, витоку даних між користувачами та блокування таблиць. Натомість слід використовувати вузькоспрямовані операції, створені спеціально для певних завдань, із перевіреними параметрами та власними перевірками дозволів:

GetSalesReport()
GetProductSales()
GetCustomerOrders()

Кожен з цих підходів дозволяє забезпечити безпеку на рівні рядків, обмежити обсяг результатів та використовувати лише читальний з’єднання, жертвуючи певною гнучкістю заради високої передбачуваності.

Агенти не замінюють архітектуру

Поширеним хибним уявленням є думка, що наявність моделі дозволяє ігнорувати основи. Насправді все навпаки. Введення залежностей, принципи проектування SOLID, облік подій, тестування, автентифікація, авторизація, обробка помилок, можливість спостереження та чітке розділення шарів мають ще більше значення, коли вибір дій здійснює недетермінований компонент.

Корисною уявною моделлю є розділення ролей: агент може запропонувати дію, але ваше застосунок вирішує, чи дозволена ця дія. Коротко кажучи, ШІ приймає рішення, а ваш застосунок керує ним. Перевірки авторизації мають знаходитися в реалізації інструментів та сервісах, що стоять за ними, а не в запиті, оскільки запит є лише пропозицією для моделі, а не обов’язковим правилом.

Ризики безпеки зростають з кожним інструментом

Кожен інструмент, який ви надаєте, збільшує кількість можливих проблем. Агент може виконувати такі дії:

Read customer data
Send emails
Create orders
Delete records
Call external APIs

Далі йдуть три запитання. Що відбувається, коли модель просто робить помилку, наприклад видаляє неправильний запис? Що відбувається, коли зловмисний користувач намагається переконати агента зловживати інструментом? І що відбувається, коли зовнішній контент, який читає агент — наприклад електронний лист чи веб-сторінка — містить приховані інструкції? Цей останній сценарій, який зазвичай називають опосередкованою ін’єкцією запиту, є реальною та добре задокументованою категорією атак, а не гіпотетичним прикладом.

Захисти переважно є тими, які ви вже знаєте, і вони застосовуються навмисно:

  • Аутентифікація та авторизація при кожному виклику інструменту, спрямовані на кінцевого користувача, а не на агента.
  • Перевірка вхідних даних усіх аргументів, які надає модель.
  • Чіткі дозволи для кожного інструменту, тому співробітник підтримки не може отримати доступ до операцій з билінгу.
  • Обмеження швидкості виконання для запобігання неконтрольованим циклам та зловживанням.
  • Логування кожного дзвінка та його параметрів.
  • Людське схвалення перед виконанням конфіденційних чи незворотних дій.
  • Для будь-яких значущих дій, таких як повернення грошей, видалення даних чи надсилання повідомлень клієнтам, крок підтвердження з участю людини, яка схвалює дію, часто є найдешевшим способом забезпечення безпеки.

    Можливість спостереження за нелінійними потоками запитів

    Традиційне оброблення запитів легко відстежувати, оскільки воно відбувається по прямій лінії:

    Request → Service → Database → Response
    

    Виконання завдання агентом може відбуватися з постійними перемиканнями між моделлю, кількома інструментами та різними бекендами, перш ніж буде отримана відповідь:

    User
     ↓
    AI Model
     ↓
    Tool
     ↓
    API
     ↓
    Database
     ↓
    AI Model
     ↓
    Another Tool
     ↓
    Final Response
    

    Таку структуру набагато складніше дебогувати. Коли щось йде не так, потрібно визначити, які інструменти були використані, чому модель їх обрала, скільки часу зайняв кожен виклик, що пішло не так, скільки разів була ініційована модель під час виконання та яку суму коштувала вся операція. Розглядайте кожне виконання як лог-трек із елементами для запису викликів моделі та інструментів, фіксуючи аргументи та кількість токенів разом із часом виконання; інакше неправильну відповідь майже неможливо відтворити.

    Чому розробники на C# випереджають інших

    Розробники, які добре знають C# та .NET, не починають з нуля. Інтерфейси та класи, HTTP-API, контейнери DI, асинхронний код, бази даних, механізми автентифікації, фонові сервіси та розгортання в хмарі — саме з цих елементів складаються системи агентів. Залишається лише короткий перелік нових концепцій, які будуються одна на одній приблизно в такому порядку:

    LLMs
     ↓
    Prompting
     ↓
    Function Calling
     ↓
    Tools
     ↓
    RAG
     ↓
    Agents
     ↓
    Multi-Agent Systems
    

    Немає потреби поглинати все одразу; почніть з невеликих кроків.

    Архітектура для орієнтації

    У мінімальному проекту агент розташовується посередині, а кілька інструментів підключаються до ваших власних сервісів, бази даних та зовнішнього API пошуку, причому результати надходять назад через агента до користувача:

    User
                   ↓
              AI Agent
                   ↓
           ┌───────┼────────┐
           ↓       ↓        ↓
        API Tool DB Tool  Search Tool
           ↓       ↓        ↓
         .NET    Database  External API
           └───────┼────────┘
                   ↓
              Agent Result
                   ↓
                 User
    

    Ключовою особливістю такої структури є те, що агент ніколи не взаємодіє безпосередньо з вашими системами. Кожен шлях проходить через інструмент, який належить вашому .NET-додатку, тож контроль доступу, перевірка даних та облік подій знаходяться в одному місці, яке ви вже знаєте, як підтримувати.

    Практичний шлях навчання

    Для розробника на C#, який хоче перейти до роботи з ШІ, розумний порядок дій виглядає так:

    • Зрозуміти LLM. Дізнайтеся, як поводяться великі мовні моделі, у чому їх сильні сторони та де вони помиляються, наприклад, даючи впевнені, але неправильні відповіді.
  • Інтегруйте API моделі. Викликайте модель з додатку .NET та керуйте відповідями, помилками та часом очікування.
  • Вивчіть виклик функцій. Дозвольте моделі здійснювати виклики до функцій вашого додатку та отримувати назад результати.
  • Вивчіть RAG. Завантажуйте контент з ваших власних документів та даних, щоб відповіді ґрунтувалися на фактах, на яких модель ніколи не тренувалася.
  • Створіть невеликого агента. Надайте йому два-три інструменти та спостерігайте, як він планує свої дії за їх допомогою.
  • Зміцніть та оптимізуйте його. Додайте права доступу, перевірку та відстеження перед тим, як хтось почне покладатися на агента.
  • Створіть щось реальне. Перейдіть від навчальних матеріалів до інструменту, який люди справді будуть використовувати.
  • Агент підтримки клієнтів — це гарний перший реальний проект, оскільки він задіює всі аспекти роботи. Він може знайти інформацію про клієнта, перевірити замовлення, статус доставки, відкрити заявку та надати відповідь:

    Search customer
     ↓
    Check order
     ↓
    Check delivery status
     ↓
    Create support ticket
     ↓
    Respond to customer
    

    Кожен крок відповідає певному інструменту, а кроки з побічними ефектами є очевидними кандидатами на включення до правил схвалення.

    Ключові висновки

    • Агент — це програмна система: модель, поєднана з інструментами, даними, логікою програми, механізмами безпеки та моніторингу, а не заміна будь-якого з цих елементів.
    • Робіть можливості доступними у вигляді спеціалізованих, перевірених інструментів; ніколи не надавайте прямий доступ до бази даних чи безобмежний API-доступ.
    • Зберігайте правила авторизації в коді, щоб програма контролювала те, що пропонує агент.
    • Скеровуйте контекст для кожного кроку, а не намагайтеся максимізувати його обсяг.
    • Відстежуйте кожен етап виконання від початку до кінця, щоб можна було пояснити причини збоїв та витрати.
  • Існуючі навички роботи з .NET можна використати безпосередньо; реалістичний результат полягає не у заміні розробників, а у тому, що розробники, які працюють із ШІ, стануть значно продуктивнішими.