ai-agents-for-beginners

Multi-Agent Design

(Натисніть на зображення вище, щоб переглянути відео цього уроку)

Метакогніція в агентах штучного інтелекту

Вступ

Ласкаво просимо до уроку про метакогніцію в агентах штучного інтелекту! Цей розділ створений для початківців, які цікавляться тим, як агенти ШІ можуть мислити про власні процеси мислення. Наприкінці цього уроку ви зрозумієте ключові концепції і отримаєте практичні приклади для застосування метакогніції у проєктуванні агентів ШІ.

Навчальні цілі

Після завершення цього уроку ви зможете:

  1. Розуміти наслідки циклів міркувань у визначеннях агентів.
  2. Використовувати методи планування і оцінки для допомоги агентам, що самокоригуються.
  3. Створювати власних агентів, здатних маніпулювати кодом для виконання завдань.

Вступ до метакогніції

Метакогніція означає вищі когнітивні процеси, які включають мислення про власне мислення. Для агентів ШІ це означає можливість оцінювати і коригувати свої дії на основі самосвідомості та попереднього досвіду. Метакогніція, або «мислення про мислення», є важливим поняттям у розвитку агентних систем ШІ. Вона включає усвідомлення агентом власних внутрішніх процесів та здатність контролювати, регулювати і адаптувати свою поведінку відповідно. Подібно до того, як ми оцінюємо ситуацію або аналізуємо проблему. Ця самосвідомість допомагає агентам приймати кращі рішення, виявляти помилки та покращувати продуктивність з часом – і це знову повертає нас до тесту Тьюринга та дискусій про те, чи захопить ШІ владу.

У контексті агентних систем ШІ метакогніція може допомогти вирішувати кілька завдань, зокрема:

Що таке метакогніція?

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

Приклад: «Я віддав пріоритет дешевшим авіарейсам, бо… я можу пропустити прямі рейси, тож перевірю ще раз.» Відстеження того, як або чому він обрав певний маршрут.

Важливість метакогніції в агентах ШІ

Метакогніція відіграє ключову роль у проєктуванні агентів ШІ з кількох причин:

Importance of Metacognition

Компоненти агента ШІ

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

Ці компоненти працюють разом, створюючи «одиницю експертизи», здатну виконувати конкретні завдання.

Приклад: Розглянемо туристичного агента — сервіс, який не лише планує вашу відпустку, а й коригує свій маршрут на основі реальних даних і досвіду попередніх мандрівок клієнтів.

Приклад: Метакогніція в туристичному агенті

Уявіть, що ви створюєте сервіс туристичного агента на основі ШІ. Цей агент “Туристичний агент” допомагає користувачам планувати відпустку. Щоб впровадити метакогніцію, агенту потрібно оцінювати і коригувати свої дії на основі самосвідомості та минулого досвіду. Ось як метакогніція може бути використана:

Поточне завдання

Поточне завдання – допомогти користувачеві спланувати поїздку до Парижа.

Кроки для виконання завдання

  1. Зібрати уподобання користувача: Запитати про дати подорожі, бюджет, інтереси (наприклад, музеї, кухня, шопінг) та будь-які особливі вимоги.
  2. Отримати інформацію: Пошук варіантів авіарейсів, проживання, атракцій і ресторанів, які відповідають уподобанням користувача.
  3. Сформувати рекомендації: Надати персоналізований маршрут з деталями авіарейсів, бронювання готелів та запропонованих заходів.
  4. Відкоригувати на основі відгуків: Запитати у користувача відгуки про рекомендації та внести необхідні корективи.

Необхідні ресурси

Досвід і саморефлексія

Туристичний агент використовує метакогніцію для оцінки своєї роботи і навчання на минулому досвіді. Наприклад:

  1. Аналіз відгуків користувачів: Агент переглядає відгуки, щоб визначити, які рекомендації були прийнятні, а які ні; відповідно коригує майбутні пропозиції.
  2. Адаптивність: Якщо користувач раніше висловив нелюбов до людних місць, агент уникатиме пропонувати популярні туристичні атракції у пікові години.
  3. Виправлення помилок: Якщо агент припустився помилки у минулому (наприклад, запропонував готель, який був повністю заброньований), він навчається ретельніше перевіряти доступність перед подачею рекомендацій.

Практичний приклад для розробника

Ось спрощений приклад коду Travel Agent з застосуванням метакогніції:

class Travel_Agent:
    def __init__(self):
        self.user_preferences = {}
        self.experience_data = []

    def gather_preferences(self, preferences):
        self.user_preferences = preferences

    def retrieve_information(self):
        # Пошук авіарейсів, готелів та визначних місць на основі вподобань
        flights = search_flights(self.user_preferences)
        hotels = search_hotels(self.user_preferences)
        attractions = search_attractions(self.user_preferences)
        return flights, hotels, attractions

    def generate_recommendations(self):
        flights, hotels, attractions = self.retrieve_information()
        itinerary = create_itinerary(flights, hotels, attractions)
        return itinerary

    def adjust_based_on_feedback(self, feedback):
        self.experience_data.append(feedback)
        # Аналіз відгуків і корекція майбутніх рекомендацій
        self.user_preferences = adjust_preferences(self.user_preferences, feedback)

# Приклад використання
travel_agent = Travel_Agent()
preferences = {
    "destination": "Paris",
    "dates": "2025-04-01 to 2025-04-10",
    "budget": "moderate",
    "interests": ["museums", "cuisine"]
}
travel_agent.gather_preferences(preferences)
itinerary = travel_agent.generate_recommendations()
print("Suggested Itinerary:", itinerary)
feedback = {"liked": ["Louvre Museum"], "disliked": ["Eiffel Tower (too crowded)"]}
travel_agent.adjust_based_on_feedback(feedback)

Чому метакогніція важлива

Завдяки метакогніції Travel Agent забезпечує більш персоналізовані та точні поради, покращуючи загальний користувацький досвід.


2. Планування в агентах

Планування є критичним компонентом поведінки агента ШІ. Воно передбачає визначення кроків, необхідних для досягнення мети, з урахуванням поточного стану, ресурсів і можливих перешкод.

Елементи планування

Приклад: Нижче кроки, які Travel Agent має виконати, щоб ефективно допомогти користувачеві спланувати поїздку:

Кроки для Travel Agent

  1. Збір уподобань користувача
    • Запитайте у користувача про дати подорожі, бюджет, інтереси та будь-які особливі вимоги.
    • Приклади: «Коли ви плануєте подорож?» «Який ваш бюджет?» «Якими видами відпочинку ви захоплюєтесь?»
  2. Пошук інформації
    • Знайдіть відповідні варіанти подорожі на основі уподобань користувача.
    • Авіарейси: Пошук доступних рейсів у межах бюджету та визначених дат.
    • Проживання: Знайдіть готелі або орендовані помешкання, що відповідають вимогам за розташуванням, ціною та зручностями.
    • Атракції та ресторани: Визначте популярні місця, заходи і кухоні заклади за інтересами користувача.
  3. Формування рекомендацій
    • Зберіть отриману інформацію у персоналізований маршрут.
    • Надайте деталі, такі як варіанти рейсів, бронювання готелів і запропоновані активності, враховуючи уподобання користувача.
  4. Представлення маршруту користувачу
    • Поділіться запропонованим маршрутом для перегляду користувачем.
    • Приклад: «Ось пропозиція маршруту для вашої поїздки до Парижа. Тут деталі рейсів, бронювання готелів та перелік рекомендованих заходів і ресторанів. Поділіться враженнями!»
  5. Збір відгуків
    • Запитайте у користувача його думку про запропонований маршрут.
    • Приклади: «Вам підходять варіанти авіарейсів?» «Чи задовольняє вас готель?» «Є якісь заходи, які хочете додати або виключити?»
  6. Корекція на основі відгуків
    • Внесіть зміни у маршрут на основі відгуків користувача.
    • Змініть рекомендації щодо авіарейсів, проживання і заходів, щоб краще відповідати уподобанням.
  7. Фінальне підтвердження
    • Подайте оновлений маршрут користувачеві для остаточного затвердження.
    • Приклад: «Я врахував ваші побажання. Ось оновлений маршрут. Чи все вас влаштовує?»
  8. Бронювання і підтвердження замовлень
    • Після затвердження користувачем приступайте до бронювання квитків, житла і попередньо запланованих заходів.
    • Надішліть користувачу підтвердження.
  9. Надання постійної підтримки
    • Будьте на зв’язку, щоб допомогти користувачу з будь-якими змінами чи додатковими запитами до та під час поїздки.
    • Приклад: «Якщо вам потрібна допомога під час поїздки, звертайтесь до мене у будь-який час!»

Приклад взаємодії

class Travel_Agent:
    def __init__(self):
        self.user_preferences = {}
        self.experience_data = []

    def gather_preferences(self, preferences):
        self.user_preferences = preferences

    def retrieve_information(self):
        flights = search_flights(self.user_preferences)
        hotels = search_hotels(self.user_preferences)
        attractions = search_attractions(self.user_preferences)
        return flights, hotels, attractions

    def generate_recommendations(self):
        flights, hotels, attractions = self.retrieve_information()
        itinerary = create_itinerary(flights, hotels, attractions)
        return itinerary

    def adjust_based_on_feedback(self, feedback):
        self.experience_data.append(feedback)
        self.user_preferences = adjust_preferences(self.user_preferences, feedback)

# Приклад використання у запиті на бронювання
travel_agent = Travel_Agent()
preferences = {
    "destination": "Paris",
    "dates": "2025-04-01 to 2025-04-10",
    "budget": "moderate",
    "interests": ["museums", "cuisine"]
}
travel_agent.gather_preferences(preferences)
itinerary = travel_agent.generate_recommendations()
print("Suggested Itinerary:", itinerary)
feedback = {"liked": ["Louvre Museum"], "disliked": ["Eiffel Tower (too crowded)"]}
travel_agent.adjust_based_on_feedback(feedback)

3. Система корекції RAG

Спершу давайте зрозуміємо різницю між інструментом RAG та передчасним завантаженням контексту

RAG vs Context Loading

Retrieval-Augmented Generation (RAG)

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

У системі RAG агент отримує релевантну інформацію з бази знань і використовує її для формування відповідей або дій.

Корекційний підхід RAG

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

  1. Техніка підказок: Використання конкретних запитів для направлення агента у пошуку релевантної інформації.
  2. Інструмент: Застосування алгоритмів і механізмів, які дозволяють агенту оцінювати релевантність знайденої інформації та генерувати точні відповіді.
  3. Оцінка: Постійна перевірка роботи агента і внесення коректив для підвищення точності й ефективності.

Приклад: Корекційний RAG в пошуковому агенті

Розглянемо пошукового агента, який отримує інформацію з інтернету для відповіді на запити користувачів. Підхід корекційного RAG може включати:

  1. Техніка підказок: Формулювання пошукових запитів на основі вводу користувача.
  2. Інструмент: Використання алгоритмів обробки природньої мови та машинного навчання для ранжування і фільтрації результатів.
  3. Оцінка: Аналіз відгуків користувачів з метою виявлення і виправлення неточностей у знайденій інформації.

Корекційний RAG у туристичному агенті

Корекційний RAG (Retrieval-Augmented Generation) підсилює здатність ШІ отримувати й генерувати інформацію, одночасно виправляючи помилки. Розглянемо, як Туристичний агент може використовувати цей підхід для надання більш точних і актуальних рекомендацій.

Це включає:

Кроки впровадження корекційного RAG у туристичному агенті

  1. Початкова взаємодія з користувачем
    • Туристичний агент збирає початкові уподобання користувача: пункт призначення, дати, бюджет, інтереси.
    • Приклад:

      preferences = {
          "destination": "Paris",
          "dates": "2025-04-01 to 2025-04-10",
          "budget": "moderate",
          "interests": ["museums", "cuisine"]
      }
      
  2. Отримання інформації
    • Агент отримує інформацію про рейси, проживання, атракції та ресторани на основі уподобань користувача.
    • Приклад:

      flights = search_flights(preferences)
      hotels = search_hotels(preferences)
      attractions = search_attractions(preferences)
      
  3. Формування початкових рекомендацій
    • Туристичний агент використовує зібрану інформацію, щоб створити персоналізований маршрут.
    • Приклад:

      itinerary = create_itinerary(flights, hotels, attractions)
      print("Suggested Itinerary:", itinerary)
      
  4. Збір відгуків користувача
    • Агент запитує у користувача думку про запропоновані рекомендації.
    • Приклад:

      feedback = {
          "liked": ["Louvre Museum"],
          "disliked": ["Eiffel Tower (too crowded)"]
      }
      
  5. Процес корекції RAG
    • Техніка підказок: Туристичний агент формує нові пошукові запити на основі відгуків користувача.
      • Приклад:

        if "disliked" in feedback:
            preferences["avoid"] = feedback["disliked"]
        
    • Інструмент: Агент застосовує алгоритми для ранжування і фільтрації нових результатів, акцентуючи увагу на релевантності згідно з відгуками.
      • Приклад:

        new_attractions = search_attractions(preferences)
        new_itinerary = create_itinerary(flights, hotels, new_attractions)
        print("Updated Itinerary:", new_itinerary)
        
    • Оцінка: Агент постійно оцінює релевантність і точність рекомендацій, аналізуючи відгуки та вносячи необхідні зміни.
      • Приклад:

        def adjust_preferences(preferences, feedback):
            if "liked" in feedback:
                preferences["favorites"] = feedback["liked"]
            if "disliked" in feedback:
                preferences["avoid"] = feedback["disliked"]
            return preferences
        
        preferences = adjust_preferences(preferences, feedback)
        

Практичний приклад

Ось спрощений приклад коду на Python із використанням корекційного підходу RAG у Туристичному агенті:

class Travel_Agent:
    def __init__(self):
        self.user_preferences = {}
        self.experience_data = []

    def gather_preferences(self, preferences):
        self.user_preferences = preferences

    def retrieve_information(self):
        flights = search_flights(self.user_preferences)
        hotels = search_hotels(self.user_preferences)
        attractions = search_attractions(self.user_preferences)
        return flights, hotels, attractions

    def generate_recommendations(self):
        flights, hotels, attractions = self.retrieve_information()
        itinerary = create_itinerary(flights, hotels, attractions)
        return itinerary

    def adjust_based_on_feedback(self, feedback):
        self.experience_data.append(feedback)
        self.user_preferences = adjust_preferences(self.user_preferences, feedback)
        new_itinerary = self.generate_recommendations()
        return new_itinerary

# Приклад використання
travel_agent = Travel_Agent()
preferences = {
    "destination": "Paris",
    "dates": "2025-04-01 to 2025-04-10",
    "budget": "moderate",
    "interests": ["museums", "cuisine"]
}
travel_agent.gather_preferences(preferences)
itinerary = travel_agent.generate_recommendations()
print("Suggested Itinerary:", itinerary)
feedback = {"liked": ["Louvre Museum"], "disliked": ["Eiffel Tower (too crowded)"]}
new_itinerary = travel_agent.adjust_based_on_feedback(feedback)
print("Updated Itinerary:", new_itinerary)

Передчасне завантаження контексту

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

Ось спрощений приклад того, як може виглядати передбачуване завантаження контексту для застосунку туристичного агента на Python:

class TravelAgent:
    def __init__(self):
        # Попередньо завантажте популярні напрямки та їх інформацію
        self.context = {
            "Paris": {"country": "France", "currency": "Euro", "language": "French", "attractions": ["Eiffel Tower", "Louvre Museum"]},
            "Tokyo": {"country": "Japan", "currency": "Yen", "language": "Japanese", "attractions": ["Tokyo Tower", "Shibuya Crossing"]},
            "New York": {"country": "USA", "currency": "Dollar", "language": "English", "attractions": ["Statue of Liberty", "Times Square"]},
            "Sydney": {"country": "Australia", "currency": "Dollar", "language": "English", "attractions": ["Sydney Opera House", "Bondi Beach"]}
        }

    def get_destination_info(self, destination):
        # Отримайте інформацію про напрямок із попередньо завантаженого контексту
        info = self.context.get(destination)
        if info:
            return f"{destination}:\nCountry: {info['country']}\nCurrency: {info['currency']}\nLanguage: {info['language']}\nAttractions: {', '.join(info['attractions'])}"
        else:
            return f"Sorry, we don't have information on {destination}."

# Приклад використання
travel_agent = TravelAgent()
print(travel_agent.get_destination_info("Paris"))
print(travel_agent.get_destination_info("Tokyo"))

Пояснення

  1. Ініціалізація (метод __init__): Клас TravelAgent попередньо завантажує словник з інформацією про популярні напрямки, такі як Париж, Токіо, Нью-Йорк і Сідней. Цей словник включає такі деталі, як країна, валюта, мова та основні визначні місця для кожного напрямку.

  2. Отримання інформації (метод get_destination_info): Коли користувач робить запит про конкретний напрямок, метод get_destination_info отримує відповідну інформацію з попередньо завантаженого словника контексту.

Завдяки передбачуваному завантаженню контексту застосунок туристичного агента може швидко відповідати на запити користувачів, не звертаючись до зовнішнього джерела в реальному часі. Це робить застосунок більш ефективним і чуйним.

Ініціалізація плану з метою перед ітерацією

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

Ось приклад, як можна ініціалізувати туристичний план з метою перед ітерацією для туристичного агента на Python:

Сценарій

Туристичний агент хоче спланувати індивідуальну відпустку для клієнта. Мета — створити маршрут подорожі, що максимізує задоволення клієнта, враховуючи його вподобання та бюджет.

Кроки

  1. Визначити вподобання клієнта та бюджет.
  2. Ініціалізувати початковий план на основі цих вподобань.
  3. Ітерувати для вдосконалення плану, оптимізуючи для задоволення клієнта.

Код на Python

class TravelAgent:
    def __init__(self, destinations):
        self.destinations = destinations

    def bootstrap_plan(self, preferences, budget):
        plan = []
        total_cost = 0

        for destination in self.destinations:
            if total_cost + destination['cost'] <= budget and self.match_preferences(destination, preferences):
                plan.append(destination)
                total_cost += destination['cost']

        return plan

    def match_preferences(self, destination, preferences):
        for key, value in preferences.items():
            if destination.get(key) != value:
                return False
        return True

    def iterate_plan(self, plan, preferences, budget):
        for i in range(len(plan)):
            for destination in self.destinations:
                if destination not in plan and self.match_preferences(destination, preferences) and self.calculate_cost(plan, destination) <= budget:
                    plan[i] = destination
                    break
        return plan

    def calculate_cost(self, plan, new_destination):
        return sum(destination['cost'] for destination in plan) + new_destination['cost']

# Приклад використання
destinations = [
    {"name": "Paris", "cost": 1000, "activity": "sightseeing"},
    {"name": "Tokyo", "cost": 1200, "activity": "shopping"},
    {"name": "New York", "cost": 900, "activity": "sightseeing"},
    {"name": "Sydney", "cost": 1100, "activity": "beach"},
]

preferences = {"activity": "sightseeing"}
budget = 2000

travel_agent = TravelAgent(destinations)
initial_plan = travel_agent.bootstrap_plan(preferences, budget)
print("Initial Plan:", initial_plan)

refined_plan = travel_agent.iterate_plan(initial_plan, preferences, budget)
print("Refined Plan:", refined_plan)

Пояснення коду

  1. Ініціалізація (метод __init__): Клас TravelAgent ініціалізується зі списком потенційних напрямків, кожен із яких має атрибути, такі як назва, вартість і тип активності.

  2. Ініціалізація плану (метод bootstrap_plan): Цей метод створює початковий план подорожі на основі вподобань клієнта та бюджету. Він проходить по списку напрямків і додає їх до плану, якщо вони відповідають вподобанням клієнта і підходять під бюджет.

  3. Перевірка вподобань (метод match_preferences): Цей метод перевіряє, чи відповідає напрямок вподобанням клієнта.

  4. Ітерація плану (метод iterate_plan): Цей метод удосконалює початковий план, намагаючись замінити кожен напрямок у плані кращим варіантом, враховуючи вподобання клієнта та бюджетні обмеження.

  5. Обчислення вартості (метод calculate_cost): Цей метод обчислює загальну вартість поточного плану, включаючи потенційний новий напрямок.

Приклад використання

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

Використання LLM для повторного ранжування та оцінювання

Великі мовні моделі (LLM) можна використовувати для повторного ранжування та оцінювання, оцінюючи релевантність і якість отриманих документів або згенерованих відповідей. Ось як це працює:

Отримання: На початковому етапі отримують набір кандидатських документів або відповідей на основі запиту.

Повторне ранжування: LLM оцінює ці кандидатури і повторно ранжує їх на основі релевантності та якості. Цей крок гарантує, що найрелевантніша та найякісніша інформація представлена першою.

Оцінювання: LLM присвоює оцінки кожному кандидату, що відображають їх релевантність і якість. Це допомагає вибрати найкращу відповідь або документ для користувача.

Завдяки використанню LLM для повторного ранжування та оцінювання система може надавати точнішу та контекстно відповідну інформацію, підвищуючи загальний досвід користувачів.

Ось приклад того, як туристичний агент може використати Велику Мовну Модель (LLM) для повторного ранжування та оцінювання напрямків подорожей на основі вподобань користувача в Python:

Сценарій — Подорож відповідно до вподобань

Туристичний агент хоче рекомендувати найкращі напрямки подорожей клієнту на основі його вподобань. LLM допоможе повторно ранжувати та оцінити напрямки, щоб представити найбільш релевантні варіанти.

Кроки:

  1. Зібрати вподобання користувача.
  2. Отримати список потенційних напрямків подорожі.
  3. Використати LLM для повторного ранжування та оцінювання напрямків на основі вподобань користувача.

Ось як можна оновити попередній приклад, щоб використовувати Azure OpenAI Services:

Вимоги

  1. Необхідна підписка Azure.
  2. Створіть ресурс Azure OpenAI і отримайте свій API-ключ.

Приклад коду на Python

import requests
import json

class TravelAgent:
    def __init__(self, destinations):
        self.destinations = destinations

    def get_recommendations(self, preferences, api_key, endpoint):
        # Згенерувати запит для Azure OpenAI
        prompt = self.generate_prompt(preferences)
        
        # Визначити заголовки та вміст запиту
        headers = {
            'Content-Type': 'application/json',
            'Authorization': f'Bearer {api_key}'
        }
        payload = {
            "prompt": prompt,
            "max_tokens": 150,
            "temperature": 0.7
        }
        
        # Викликати API Azure OpenAI, щоб отримати заново ранжовані та оцінені напрямки
        response = requests.post(endpoint, headers=headers, json=payload)
        response_data = response.json()
        
        # Витягти та повернути рекомендації
        recommendations = response_data['choices'][0]['text'].strip().split('\n')
        return recommendations

    def generate_prompt(self, preferences):
        prompt = "Here are the travel destinations ranked and scored based on the following user preferences:\n"
        for key, value in preferences.items():
            prompt += f"{key}: {value}\n"
        prompt += "\nDestinations:\n"
        for destination in self.destinations:
            prompt += f"- {destination['name']}: {destination['description']}\n"
        return prompt

# Приклад використання
destinations = [
    {"name": "Paris", "description": "City of lights, known for its art, fashion, and culture."},
    {"name": "Tokyo", "description": "Vibrant city, famous for its modernity and traditional temples."},
    {"name": "New York", "description": "The city that never sleeps, with iconic landmarks and diverse culture."},
    {"name": "Sydney", "description": "Beautiful harbour city, known for its opera house and stunning beaches."},
]

preferences = {"activity": "sightseeing", "culture": "diverse"}
api_key = 'your_azure_openai_api_key'
endpoint = 'https://your-endpoint.com/openai/deployments/your-deployment-name/completions?api-version=2022-12-01'

travel_agent = TravelAgent(destinations)
recommendations = travel_agent.get_recommendations(preferences, api_key, endpoint)
print("Recommended Destinations:")
for rec in recommendations:
    print(rec)

Пояснення коду — Бронювання за вподобаннями

  1. Ініціалізація: Клас TravelAgent ініціалізується зі списком потенційних напрямків подорожей, кожен із яких має атрибути, такі як назва і опис.

  2. Отримання рекомендацій (метод get_recommendations): Цей метод генерує запит до сервісу Azure OpenAI на основі вподобань користувача і робить HTTP POST-запит до API Azure OpenAI, щоб отримати повторно ранжовані та оцінені напрямки.

  3. Генерація запиту (метод generate_prompt): Цей метод конструює запит для Azure OpenAI, включаючи вподобання користувача та список напрямків. Запит направляє модель повторно ранжувати та оцінювати напрямки на основі наданих вподобань.

  4. Виклик API: Для здійснення HTTP POST-запиту до API Azure OpenAI використовується бібліотека requests. Відповідь містить повторно ранжовані та оцінені напрямки.

  5. Приклад використання: Туристичний агент збирає вподобання користувача (наприклад, інтерес до огляду визначних пам’яток та різноманітної культури) і використовує сервіс Azure OpenAI для отримання повторно ранжованих та оцінених рекомендацій щодо напрямків подорожей.

Переконайтеся, що ви замінили your_azure_openai_api_key на свій реальний ключ API Azure OpenAI і https://your-endpoint.com/... на фактичний URL кінцевої точки вашого розгортання Azure OpenAI.

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

RAG: Техніка запитування проти інструменту

Retrieval-Augmented Generation (RAG) може бути як технікою запитування, так і інструментом у розробці AI-агентів. Розуміння різниці між ними допоможе ефективніше використовувати RAG у ваших проектах.

RAG як техніка запитування

Що це?

Як це працює:

  1. Формулювання підказок: Створюйте добре структуровані підказки або запити на основі завдання чи вводу користувача.
  2. Отримання інформації: Використовуйте підказки для пошуку релевантних даних у заздалегідь існуючій базі знань або наборі даних.
  3. Генерація відповіді: Поєднуйте отриману інформацію з генеративними моделями AI для створення всебічної та узгодженої відповіді.

Приклад у туристичному агенті:

RAG як інструмент

Що це?

Як це працює:

  1. Інтеграція: Вбудуйте RAG у архітектуру AI-агента, що дозволить автоматично обробляти задачі отримання та генерації.
  2. Автоматизація: Інструмент керує всім процесом — від отримання вводу користувача до генерації остаточної відповіді без необхідності явних підказок на кожному кроці.
  3. Ефективність: Покращує продуктивність агента за рахунок оптимізації процесу отримання та генерації, забезпечуючи швидкі та точні відповіді.

Приклад у туристичному агенті:

Порівняння

Аспект Техніка запитування Інструмент
Ручний проти Автоматичного Ручне формулювання підказок для кожного запиту. Автоматизований процес отримання та генерації.
Контроль Забезпечує більший контроль над процесом отримання. Спрощує і автоматизує процес отримання та генерації.
Гнучкість Дозволяє персоналізовані підказки відповідно до потреб. Ефективніший для масштабних впроваджень.
Складність Вимагає розробки і налаштування підказок. Легше інтегрувати у архітектуру AI-агента.

Практичні приклади

Приклад техніки запитування:

def search_museums_in_paris():
    prompt = "Find top museums in Paris"
    search_results = search_web(prompt)
    return search_results

museums = search_museums_in_paris()
print("Top Museums in Paris:", museums)

Приклад інструменту:

class Travel_Agent:
    def __init__(self):
        self.rag_tool = RAGTool()

    def get_museums_in_paris(self):
        user_input = "I want to visit museums in Paris."
        response = self.rag_tool.retrieve_and_generate(user_input)
        return response

travel_agent = Travel_Agent()
museums = travel_agent.get_museums_in_paris()
print("Top Museums in Paris:", museums)

Оцінка релевантності

Оцінка релевантності — ключовий аспект продуктивності AI-агента. Вона забезпечує, що інформація, отримана і згенерована агентом, є доречною, точною і корисною для користувача. Розглянемо, як оцінювати релевантність в AI-агентах, включаючи практичні приклади і методики.

Ключові концепції оцінки релевантності

  1. Обізнаність про контекст:
    • Агент має розуміти контекст запиту користувача, щоб отримувати і генерувати релевантну інформацію.
    • Приклад: якщо користувач запитує “кращі ресторани в Парижі”, агент повинен враховувати вподобання користувача, такі як тип кухні й бюджет.
  2. Точність:
    • Інформація, надана агентом, має бути фактично правильною та актуальною.
    • Приклад: рекомендувати ресторани, які зараз відкриті і мають добрі відгуки, а не застарілі або зачинені.
  3. Намір користувача:
    • Агент повинен виводити намір користувача за запитом, щоб надати найбільш релевантну інформацію.
    • Приклад: якщо користувач запитує “готелі з бюджетною ціною”, агент має надавати пріоритет доступним варіантам.
  4. Цикл зворотного зв’язку:
    • Постійне збирання і аналіз відгуків користувачів допомагає агенту удосконалювати процес оцінки релевантності.
    • Приклад: враховування оцінок та відгуків користувачів про попередні рекомендації для покращення майбутніх відповідей.

Практичні методики оцінки релевантності

  1. Оцінка релевантності балом:
    • Присвоєння кожному отриманому елементу балу релевантності залежно від того, наскільки добре він відповідає запиту і вподобанням користувача.
    • Приклад:

      def relevance_score(item, query):
          score = 0
          if item['category'] in query['interests']:
              score += 1
          if item['price'] <= query['budget']:
              score += 1
          if item['location'] == query['destination']:
              score += 1
          return score
      
  2. Фільтрація та ранжування:
    • Фільтрація нерелевантних елементів і ранжування залишкових за оцінками релевантності.
    • Приклад:

      def filter_and_rank(items, query):
          ranked_items = sorted(items, key=lambda item: relevance_score(item, query), reverse=True)
          return ranked_items[:10]  # Повернути 10 найрелевантніших елементів
      
  3. Обробка природної мови (NLP):
    • Застосування методик NLP для розуміння запиту користувача і отримання релевантної інформації.
    • Приклад:

      def process_query(query):
          # Використовуйте NLP для вилучення ключової інформації із запиту користувача
          processed_query = nlp(query)
          return processed_query
      
  4. Інтеграція відгуків користувачів:
    • Збір відгуків про надані рекомендації і використання їх для коригування майбутньої оцінки релевантності.
    • Приклад:

      def adjust_based_on_feedback(feedback, items):
          for item in items:
              if item['name'] in feedback['liked']:
                  item['relevance'] += 1
              if item['name'] in feedback['disliked']:
                  item['relevance'] -= 1
          return items
      

Приклад: оцінка релевантності у туристичного агента

Ось практичний приклад, як туристичний агент може оцінювати релевантність рекомендацій подорожей:

class Travel_Agent:
    def __init__(self):
        self.user_preferences = {}
        self.experience_data = []

    def gather_preferences(self, preferences):
        self.user_preferences = preferences

    def retrieve_information(self):
        flights = search_flights(self.user_preferences)
        hotels = search_hotels(self.user_preferences)
        attractions = search_attractions(self.user_preferences)
        return flights, hotels, attractions

    def generate_recommendations(self):
        flights, hotels, attractions = self.retrieve_information()
        ranked_hotels = self.filter_and_rank(hotels, self.user_preferences)
        itinerary = create_itinerary(flights, ranked_hotels, attractions)
        return itinerary

    def filter_and_rank(self, items, query):
        ranked_items = sorted(items, key=lambda item: self.relevance_score(item, query), reverse=True)
        return ranked_items[:10]  # Повернути 10 найрелевантніших елементів

    def relevance_score(self, item, query):
        score = 0
        if item['category'] in query['interests']:
            score += 1
        if item['price'] <= query['budget']:
            score += 1
        if item['location'] == query['destination']:
            score += 1
        return score

    def adjust_based_on_feedback(self, feedback, items):
        for item in items:
            if item['name'] in feedback['liked']:
                item['relevance'] += 1
            if item['name'] in feedback['disliked']:
                item['relevance'] -= 1
        return items

# Приклад використання
travel_agent = Travel_Agent()
preferences = {
    "destination": "Paris",
    "dates": "2025-04-01 to 2025-04-10",
    "budget": "moderate",
    "interests": ["museums", "cuisine"]
}
travel_agent.gather_preferences(preferences)
itinerary = travel_agent.generate_recommendations()
print("Suggested Itinerary:", itinerary)
feedback = {"liked": ["Louvre Museum"], "disliked": ["Eiffel Tower (too crowded)"]}
updated_items = travel_agent.adjust_based_on_feedback(feedback, itinerary['hotels'])
print("Updated Itinerary with Feedback:", updated_items)

Пошук із урахуванням наміру

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

Ключові концепції пошуку із урахуванням наміру

  1. Розуміння наміру користувача:
    • Наміри користувача можна класифікувати на три основні типи: інформаційний, навігаційний та транзакційний.
      • Інформаційний намір: користувач шукає інформацію про тему (наприклад, «Які найкращі музеї в Парижі?»).
      • Навігаційний намір: користувач хоче перейти на конкретний вебсайт або сторінку (наприклад, «офіційний сайт Лувр»).
      • Транзакційний намір: користувач прагне здійснити транзакцію, наприклад, забронювати квиток або зробити покупку (наприклад, «Забронювати квиток до Парижа»).
  2. Обізнаність про контекст:
    • Аналіз контексту запиту користувача допомагає точно визначити його намір. Це включає врахування попередніх взаємодій, вподобань користувача і конкретних деталей поточного запиту.
  3. Обробка природної мови (NLP):
    • Застосування методик NLP для розуміння і інтерпретації природномовних запитів користувача. Це включає задачі, як-от розпізнавання сутностей, аналіз настроїв та розбір запитів.
  4. Персоналізація:
    • Персоналізація результатів пошуку на основі історії, вподобань і зворотного зв’язку користувача підвищує релевантність отриманої інформації.

Практичний приклад: пошук із урахуванням наміру у туристичного агента

Розглянемо туристичного агента як приклад впровадження пошуку із урахуванням наміру.

  1. Збір вподобань користувача

    class Travel_Agent:
        def __init__(self):
            self.user_preferences = {}
    
        def gather_preferences(self, preferences):
            self.user_preferences = preferences
    
  2. Розуміння наміру користувача

    def identify_intent(query):
        if "book" in query or "purchase" in query:
            return "transactional"
        elif "website" in query or "official" in query:
            return "navigational"
        else:
            return "informational"
    
  3. Обізнаність про контекст

    def analyze_context(query, user_history):
        # Об’єднайте поточний запит з історією користувача, щоб зрозуміти контекст
        context = {
            "current_query": query,
            "user_history": user_history
        }
        return context
    
  4. Пошук і Персоналізація Результатів

    def search_with_intent(query, preferences, user_history):
        intent = identify_intent(query)
        context = analyze_context(query, user_history)
        if intent == "informational":
            search_results = search_information(query, preferences)
        elif intent == "navigational":
            search_results = search_navigation(query)
        elif intent == "transactional":
            search_results = search_transaction(query, preferences)
        personalized_results = personalize_results(search_results, user_history)
        return personalized_results
    
    def search_information(query, preferences):
        # Приклад логіки пошуку для інформаційного наміру
        results = search_web(f"best {preferences['interests']} in {preferences['destination']}")
        return results
    
    def search_navigation(query):
        # Приклад логіки пошуку для навігаційного наміру
        results = search_web(query)
        return results
    
    def search_transaction(query, preferences):
        # Приклад логіки пошуку для транзакційного наміру
        results = search_web(f"book {query} to {preferences['destination']}")
        return results
    
    def personalize_results(results, user_history):
        # Приклад логіки персоналізації
        personalized = [result for result in results if result not in user_history]
        return personalized[:10]  # Повернути топ 10 персоналізованих результатів
    
  5. Приклад Використання

    travel_agent = Travel_Agent()
    preferences = {
        "destination": "Paris",
        "interests": ["museums", "cuisine"]
    }
    travel_agent.gather_preferences(preferences)
    user_history = ["Louvre Museum website", "Book flight to Paris"]
    query = "best museums in Paris"
    results = search_with_intent(query, preferences, user_history)
    print("Search Results:", results)
    

4. Генерація Коду як Інструмент

Агенти для генерації коду використовують моделі ШІ для написання та виконання коду, розв’язуючи складні проблеми й автоматизуючи завдання.

Агенти для генерації коду

Агенти для генерації коду використовують генеративні моделі ШІ для написання та виконання коду. Ці агенти можуть розв’язувати складні проблеми, автоматизувати завдання та надавати цінні інсайти, генеруючи і запускаючи код різними мовами програмування.

Практичні Застосування

  1. Автоматизована Генерація Коду: Генерувати фрагменти коду для конкретних завдань, таких як аналіз даних, веб-скрапінг або машинне навчання.
  2. SQL як RAG: Використовувати SQL-запити для отримання та маніпулювання даними з баз даних.
  3. Розв’язання Проблем: Створювати і виконувати код для розв’язання конкретних проблем, таких як оптимізація алгоритмів або аналіз даних.

Приклад: Агент для генерації коду для аналізу даних

Уявіть, що ви розробляєте агента для генерації коду. Ось як це може працювати:

  1. Завдання: Аналізувати набір даних для виявлення трендів і закономірностей.
  2. Кроки:
    • Завантажте набір даних у інструмент аналізу даних.
    • Генеруйте SQL-запити для фільтрації та агрегації даних.
    • Виконайте запити і отримайте результати.
    • Використовуйте результати для створення візуалізацій і інсайтів.
  3. Необхідні Ресурси: Доступ до набору даних, інструменти аналізу даних та можливості SQL.
  4. Досвід: Використовуйте попередні результати аналізу для підвищення точності і релевантності майбутніх аналізів.

Приклад: Агент для генерації коду для тревел-агента

У цьому прикладі ми розробимо агента для генерації коду, Тревел-Агента, щоб допомагати користувачам у плануванні подорожей, генеруючи і виконуючи код. Цей агент може виконувати завдання, такі як отримання варіантів подорожей, фільтрація результатів і складання маршруту за допомогою генеративного ШІ.

Огляд агента для генерації коду

  1. Збір уподобань користувача: Збір інформації від користувача, такої як пункт призначення, дати подорожі, бюджет і інтереси.
  2. Генерація коду для отримання даних: Генерація фрагментів коду для отримання інформації про авіарейси, готелі та визначні місця.
  3. Виконання згенерованого коду: Запуск згенерованого коду для отримання актуальної інформації.
  4. Генерація маршруту: Компеляція отриманих даних у персоналізований план подорожі.
  5. Коригування на основі зворотного зв’язку: Отримання відгуків користувача та повторна генерація коду при необхідності для уточнення результатів.

Покрокова реалізація

  1. Збір уподобань користувача

    class Travel_Agent:
        def __init__(self):
            self.user_preferences = {}
    
        def gather_preferences(self, preferences):
            self.user_preferences = preferences
    
  2. Генерація коду для отримання даних

    def generate_code_to_fetch_data(preferences):
        # Приклад: Згенерувати код для пошуку авіарейсів на основі вподобань користувача
        code = f"""
        def search_flights():
            import requests
            response = requests.get('https://api.example.com/flights', params={preferences})
            return response.json()
        """
        return code
    
    def generate_code_to_fetch_hotels(preferences):
        # Приклад: Згенерувати код для пошуку готелів
        code = f"""
        def search_hotels():
            import requests
            response = requests.get('https://api.example.com/hotels', params={preferences})
            return response.json()
        """
        return code
    
  3. Виконання згенерованого коду

    def execute_code(code):
        # Виконайте згенерований код за допомогою exec
        exec(code)
        result = locals()
        return result
    
    travel_agent = Travel_Agent()
    preferences = {
        "destination": "Paris",
        "dates": "2025-04-01 to 2025-04-10",
        "budget": "moderate",
        "interests": ["museums", "cuisine"]
    }
    travel_agent.gather_preferences(preferences)
       
    flight_code = generate_code_to_fetch_data(preferences)
    hotel_code = generate_code_to_fetch_hotels(preferences)
       
    flights = execute_code(flight_code)
    hotels = execute_code(hotel_code)
    
    print("Flight Options:", flights)
    print("Hotel Options:", hotels)
    
  4. Генерація маршруту

    def generate_itinerary(flights, hotels, attractions):
        itinerary = {
            "flights": flights,
            "hotels": hotels,
            "attractions": attractions
        }
        return itinerary
    
    attractions = search_attractions(preferences)
    itinerary = generate_itinerary(flights, hotels, attractions)
    print("Suggested Itinerary:", itinerary)
    
  5. Коригування на основі зворотного зв’язку

    def adjust_based_on_feedback(feedback, preferences):
        # Налаштуйте переваги на основі відгуків користувача
        if "liked" in feedback:
            preferences["favorites"] = feedback["liked"]
        if "disliked" in feedback:
            preferences["avoid"] = feedback["disliked"]
        return preferences
    
    feedback = {"liked": ["Louvre Museum"], "disliked": ["Eiffel Tower (too crowded)"]}
    updated_preferences = adjust_based_on_feedback(feedback, preferences)
       
    # Відтворіть і виконайте код із оновленими налаштуваннями
    updated_flight_code = generate_code_to_fetch_data(updated_preferences)
    updated_hotel_code = generate_code_to_fetch_hotels(updated_preferences)
       
    updated_flights = execute_code(updated_flight_code)
    updated_hotels = execute_code(updated_hotel_code)
       
    updated_itinerary = generate_itinerary(updated_flights, updated_hotels, attractions)
    print("Updated Itinerary:", updated_itinerary)
    

Використання обізнаності про середовище і міркувань

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

Ось приклад, як це можна зробити:

  1. Розуміння схеми: Система розуміє схему таблиці і використовує цю інформацію для формування запитів.
  2. Коригування на основі відгуків: Система коригує уподобання користувача на основі відгуків і аналізує, які поля у схемі потрібно оновити.
  3. Генерація і виконання запитів: Система генерує і виконує запити для отримання оновлених даних про рейси і готелі відповідно до нових уподобань.

Ось оновлений приклад коду на Python, який включає ці концепції:

def adjust_based_on_feedback(feedback, preferences, schema):
    # Налаштувати вподобання на основі відгуків користувача
    if "liked" in feedback:
        preferences["favorites"] = feedback["liked"]
    if "disliked" in feedback:
        preferences["avoid"] = feedback["disliked"]
    # Логіка на основі схеми для налаштування інших пов'язаних вподобань
    for field in schema:
        if field in preferences:
            preferences[field] = adjust_based_on_environment(feedback, field, schema)
    return preferences

def adjust_based_on_environment(feedback, field, schema):
    # Кастомна логіка для налаштування вподобань на основі схеми та відгуків
    if field in feedback["liked"]:
        return schema[field]["positive_adjustment"]
    elif field in feedback["disliked"]:
        return schema[field]["negative_adjustment"]
    return schema[field]["default"]

def generate_code_to_fetch_data(preferences):
    # Згенерувати код для отримання даних про рейси на основі оновлених вподобань
    return f"fetch_flights(preferences={preferences})"

def generate_code_to_fetch_hotels(preferences):
    # Згенерувати код для отримання даних про готелі на основі оновлених вподобань
    return f"fetch_hotels(preferences={preferences})"

def execute_code(code):
    # Симулювати виконання коду та повернути фіктивні дані
    return {"data": f"Executed: {code}"}

def generate_itinerary(flights, hotels, attractions):
    # Згенерувати маршрут на основі рейсів, готелів та атракцій
    return {"flights": flights, "hotels": hotels, "attractions": attractions}

# Приклад схеми
schema = {
    "favorites": {"positive_adjustment": "increase", "negative_adjustment": "decrease", "default": "neutral"},
    "avoid": {"positive_adjustment": "decrease", "negative_adjustment": "increase", "default": "neutral"}
}

# Приклад використання
preferences = {"favorites": "sightseeing", "avoid": "crowded places"}
feedback = {"liked": ["Louvre Museum"], "disliked": ["Eiffel Tower (too crowded)"]}
updated_preferences = adjust_based_on_feedback(feedback, preferences, schema)

# Згенерувати та виконати код з оновленими вподобаннями
updated_flight_code = generate_code_to_fetch_data(updated_preferences)
updated_hotel_code = generate_code_to_fetch_hotels(updated_preferences)

updated_flights = execute_code(updated_flight_code)
updated_hotels = execute_code(updated_hotel_code)

updated_itinerary = generate_itinerary(updated_flights, updated_hotels, feedback["liked"])
print("Updated Itinerary:", updated_itinerary)

Пояснення — Бронювання на основі відгуків

  1. Обізнаність про схему: Словник schema визначає, як потрібно коригувати уподобання на основі відгуків. Він включає поля, такі як favorites і avoid, із відповідними коригуваннями.
  2. Коригування уподобань (метод adjust_based_on_feedback): Цей метод коригує уподобання на основі відгуків користувача та схеми.
  3. Коригування на основі оточення (метод adjust_based_on_environment): Цей метод налаштовує коригування на основі схеми та відгуків.
  4. Генерація і виконання запитів: Система генерує код для отримання оновлених даних про рейси та готелі відповідно до коригованих уподобань і симулює виконання цих запитів.
  5. Генерація маршруту: Система створює оновлений маршрут на основі нових даних про рейси, готелі та визначні місця.

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

Використання SQL як техніки Retrieval-Augmented Generation (RAG)

SQL (Структурована Мова Запитів) є потужним інструментом для роботи з базами даних. Коли SQL використовується як частина підходу Retrieval-Augmented Generation (RAG), він може отримувати релевантні дані з баз даних для інформування і генерації відповідей чи дій у агентах ШІ. Розглянемо, як SQL може бути використаний як RAG-техніка у контексті Тревел-Агента.

Основні Концепції

  1. Взаємодія з базою даних:
    • SQL використовується для запитів до баз даних, отримання релевантної інформації та маніпулювання даними.
    • Приклад: Отримання деталей рейсів, інформації про готелі та визначні місця з бази даних подорожей.
  2. Інтеграція з RAG:
    • SQL-запити генеруються на основі введення користувача та уподобань.
    • Отримані дані потім використовуються для генерування персоналізованих рекомендацій або дій.
  3. Динамічна генерація запитів:
    • Агент ШІ генерує динамічні SQL-запити на основі контексту та потреб користувача.
    • Приклад: Налаштування SQL-запитів для фільтрації результатів за бюджетом, датами та інтересами.

Застосування

Приклад: Агент з аналізу даних:

  1. Завдання: Аналізувати набір даних для виявлення трендів.
  2. Кроки:
    • Завантажити набір даних.
    • Генерувати SQL-запити для фільтрації даних.
    • Виконати запити і отримати результати.
    • Створити візуалізації і інсайти.
  3. Ресурси: Доступ до набору даних, можливості SQL.
  4. Досвід: Використовувати попередні результати для покращення майбутніх аналізів.

Практичний приклад: Використання SQL у Тревел-Агенті

  1. Збір уподобань користувача

    class Travel_Agent:
        def __init__(self):
            self.user_preferences = {}
    
        def gather_preferences(self, preferences):
            self.user_preferences = preferences
    
  2. Генерація SQL-запитів

    def generate_sql_query(table, preferences):
        query = f"SELECT * FROM {table} WHERE "
        conditions = []
        for key, value in preferences.items():
            conditions.append(f"{key}='{value}'")
        query += " AND ".join(conditions)
        return query
    
  3. Виконання SQL-запитів

    import sqlite3
    
    def execute_sql_query(query, database="travel.db"):
        connection = sqlite3.connect(database)
        cursor = connection.cursor()
        cursor.execute(query)
        results = cursor.fetchall()
        connection.close()
        return results
    
  4. Генерація рекомендацій

    def generate_recommendations(preferences):
        flight_query = generate_sql_query("flights", preferences)
        hotel_query = generate_sql_query("hotels", preferences)
        attraction_query = generate_sql_query("attractions", preferences)
           
        flights = execute_sql_query(flight_query)
        hotels = execute_sql_query(hotel_query)
        attractions = execute_sql_query(attraction_query)
           
        itinerary = {
            "flights": flights,
            "hotels": hotels,
            "attractions": attractions
        }
        return itinerary
    
    travel_agent = Travel_Agent()
    preferences = {
        "destination": "Paris",
        "dates": "2025-04-01 to 2025-04-10",
        "budget": "moderate",
        "interests": ["museums", "cuisine"]
    }
    travel_agent.gather_preferences(preferences)
    itinerary = generate_recommendations(preferences)
    print("Suggested Itinerary:", itinerary)
    

Приклад SQL-запитів

  1. Запит для рейсів

    SELECT * FROM flights WHERE destination='Paris' AND dates='2025-04-01 to 2025-04-10' AND budget='moderate';
    
  2. Запит для готелів

    SELECT * FROM hotels WHERE destination='Paris' AND budget='moderate';
    
  3. Запит для визначних місць

    SELECT * FROM attractions WHERE destination='Paris' AND interests='museums, cuisine';
    

Використовуючи SQL як частину техніки Retrieval-Augmented Generation (RAG), агенти ШІ, такі як Тревел-Агент, можуть динамічно отримувати та використовувати релевантні дані для надання точних і персоналізованих рекомендацій.

Приклад метакогніції

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

Ми змоделюємо це за допомогою базового прикладу, де агент вибирає готелі на основі поєднання ціни і якості, але він “рефлектує” над своїми рішеннями і відповідно коригує їх.

Як це ілюструє метакогніцію:

  1. Початкове рішення: Агент обирає найдешевший готель, не враховуючи вплив якості.
  2. Рефлексія та оцінка: Після початкового вибору агент перевіряє, чи був вибір готелю “поганим” за допомогою відгуків користувачів. Якщо він виявляє, що якість готелю була занизькою, агент рефлектує над своїм міркуванням.
  3. Коригування стратегії: Агент коригує свою стратегію на основі рефлексії, переключаючись із “найдешевший” на “найкраща_якість”, таким чином покращуючи процес прийняття рішень у майбутніх ітераціях.

Ось приклад:

class HotelRecommendationAgent:
    def __init__(self):
        self.previous_choices = []  # Зберігає раніше вибрані готелі
        self.corrected_choices = []  # Зберігає виправлені вибори
        self.recommendation_strategies = ['cheapest', 'highest_quality']  # Доступні стратегії

    def recommend_hotel(self, hotels, strategy):
        """
        Recommend a hotel based on the chosen strategy.
        The strategy can either be 'cheapest' or 'highest_quality'.
        """
        if strategy == 'cheapest':
            recommended = min(hotels, key=lambda x: x['price'])
        elif strategy == 'highest_quality':
            recommended = max(hotels, key=lambda x: x['quality'])
        else:
            recommended = None
        self.previous_choices.append((strategy, recommended))
        return recommended

    def reflect_on_choice(self):
        """
        Reflect on the last choice made and decide if the agent should adjust its strategy.
        The agent considers if the previous choice led to a poor outcome.
        """
        if not self.previous_choices:
            return "No choices made yet."

        last_choice_strategy, last_choice = self.previous_choices[-1]
        # Припустимо, ми маємо відгук користувача, який каже, чи був останній вибір хорошим чи ні
        user_feedback = self.get_user_feedback(last_choice)

        if user_feedback == "bad":
            # Коригувати стратегію, якщо попередній вибір був незадовільним
            new_strategy = 'highest_quality' if last_choice_strategy == 'cheapest' else 'cheapest'
            self.corrected_choices.append((new_strategy, last_choice))
            return f"Reflecting on choice. Adjusting strategy to {new_strategy}."
        else:
            return "The choice was good. No need to adjust."

    def get_user_feedback(self, hotel):
        """
        Simulate user feedback based on hotel attributes.
        For simplicity, assume if the hotel is too cheap, the feedback is "bad".
        If the hotel has quality less than 7, feedback is "bad".
        """
        if hotel['price'] < 100 or hotel['quality'] < 7:
            return "bad"
        return "good"

# Імітувати список готелів (ціна та якість)
hotels = [
    {'name': 'Budget Inn', 'price': 80, 'quality': 6},
    {'name': 'Comfort Suites', 'price': 120, 'quality': 8},
    {'name': 'Luxury Stay', 'price': 200, 'quality': 9}
]

# Створити агента
agent = HotelRecommendationAgent()

# Крок 1: Агент рекомендує готель за стратегією "найдешевший"
recommended_hotel = agent.recommend_hotel(hotels, 'cheapest')
print(f"Recommended hotel (cheapest): {recommended_hotel['name']}")

# Крок 2: Агент розглядає вибір і при необхідності коригує стратегію
reflection_result = agent.reflect_on_choice()
print(reflection_result)

# Крок 3: Агент рекомендує знову, цього разу використовуючи скориговану стратегію
adjusted_recommendation = agent.recommend_hotel(hotels, 'highest_quality')
print(f"Adjusted hotel recommendation (highest_quality): {adjusted_recommendation['name']}")

Можливості метакогніції агента

Ключове тут — здатність агента:

Це проста форма метакогніції, де система здатна коригувати свій процес мислення на основі внутрішнього зворотного зв’язку.

Висновок

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

Маєте більше запитань про патерн метакогніції?

Приєднуйтесь до Microsoft Foundry Discord, щоб зустрітися з іншими учнями, відвідати години консультацій і отримати відповіді на питання щодо агентів ШІ.

Попередній урок

Патерн багатозадачних агентів

Наступний урок

Агенти ШІ у виробництві


Відмова від відповідальності: Цей документ було перекладено за допомогою сервісу штучного інтелекту для перекладу Co-op Translator. Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ рідною мовою слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу.