TLDR.Эта статья представляет собой исчерпывающее руководство по созданию полнофункционального чат-бота для предметной области, который включает в себя как кратковременную, так и долговременную память, эмулируя человеческое мышление. Для этого мы будем использовать модели Foundation из SageMaker JumpStart и использовать различные сервисы AWS, такие как DynamoDB, OpenSearch, Lambda и т. д. Объединив все эти компоненты, мы разработаем когнитивную архитектуру, которая имитирует возможности памяти человеческого мозга. . Статья послужит ценным ресурсом, предоставляя пошаговые инструкции по настройке необходимых компонентов AWS для использования возможностей больших языковых моделей (LLM). Используя генерацию с расширенным поиском (RAG), наш чат-бот сможет предоставлять фактически проверенные ответы и эффективно получать доступ к данным, относящимся к предметной области. Кроме того, он будет обладать способностью запоминать информацию во время разговоров и вспоминать прошлые взаимодействия. Чтобы облегчить ваше обучение, мы включили прилагаемые блокноты и все необходимые материалы, необходимые для создания и реализации этой архитектуры с нуля. Эта работа основывается на нашем предыдущем исследовании RAG, делая шаг вперед. Кроме того, мы обсудим различные усовершенствования архитектуры, которые могут способствовать эффективному проектированию и подчеркивать важность памяти в LLM. Проводя сравнения с человеческим познанием, мы подчеркнем критическую роль памяти в производительности чат-бота.

Генеративный ИИ, новая область искусственного интеллекта, использует передовые методологии машинного обучения, чтобы произвести революцию в различных областях, спровоцировав глубокие изменения благодаря своим возможностям создания контента. От создания реалистичных изображений, сочинения музыки, написания статей до разработки фармацевтических препаратов возможности генеративного ИИ меняют правила игры.

Одно из наиболее заметных применений этой технологии лежит в области обработки естественного языка (NLP), где чат-боты находятся в эпицентре этой революции. Чат-боты, основанные на генеративном искусственном интеллекте, переопределяют взаимодействие человека с компьютером. Они больше не ограничены предопределенными шаблонами и правилами, но теперь могут понимать контекст, генерировать ответы, подобные человеческим, и учиться на прошлых взаимодействиях, тем самым повышая качество взаимодействия. Они играют центральную роль в улучшении обслуживания клиентов, персонализации взаимодействия с пользователем, автоматизации задач и преобразовании бизнес-процессов в разных секторах. Следовательно, роль генеративного ИИ в развитии чат-ботов значительна, что знаменует собой определяющий момент в эволюции НЛП и его приложений.

Когнитивный гобелен: распутывание человеческой памяти

Память — это многогранный и постоянно развивающийся процесс, который включает в себя непрерывное кодирование, хранение и извлечение информации. Он играет решающую роль в нашем повседневном опыте, помогая нашему пониманию мира и облегчая наше взаимодействие в нем. Понимание формирования и перехода воспоминаний, особенно от кратковременных к долговременным, является захватывающим предметом исследования в области неврологии и когнитивистики. Хотя многие аспекты этого механизма остаются предметом изучения, был достигнут значительный прогресс в идентификации критических областей мозга, участвующих в этих процессах.

Исследования выявили три ключевые области мозга, которые играют важную роль в формировании, хранении и воспроизведении воспоминаний: префронтальная кора, гиппокамп и височная область. доля.

префронтальная кора (показана на рис. A выше), расположенная в передней части мозга, имеет решающее значение для кратковременной памяти. Он отвечает за временное удержание, обычно от 20 до 30 секунд, и манипулирование информацией, что позволяет нам выполнять задачи, требующие немедленного припоминания и внимания. Именно эта мимолетная память позволяет нам выполнять повседневные задачи. Когда вы разговариваете, печете или даже делаете заказ в ресторане, вы постоянно используете свою кратковременную память. Стоит отметить, что информация в кратковременной памяти подвержена помехам. Новые данные, поступающие в кратковременную память, быстро вытесняют старые, и подобные предметы в окружающей среде также могут мешать этим временным воспоминаниям.

Гиппокамп (показан на рис. A выше) — небольшая структура в форме морского конька, расположенная глубоко внутри мозга, необходима для формирования долговременных воспоминаний. Он действует как шлюз, объединяя и организуя информацию из кратковременной памяти в долговременные представления. Представьте, что вы прогуливаетесь по району своего детства, наполненному знакомыми видами и звуками. Проходя мимо дома, нахлынет поток воспоминаний. Вы помните смех друзей детства, играющих на заднем дворе, запах свежескошенной травы и теплое ощущение солнца на вашем лице. Эти воспоминания хранятся в вашей долговременной памяти, что позволяет вам вспоминать события и переживания из далекого прошлого. Долговременная память похожа на обширную библиотеку вашего жизненного опыта, знаний и навыков. Это репозиторий, в котором информация хранится в течение длительного периода времени, от нескольких дней до нескольких лет или даже всей жизни. Повреждение гиппокампа может привести к серьезным трудностям в формировании новых воспоминаний и воспоминании о прошлых событиях.

Височная доля (показана на рисунке B выше), особенно медиальная височная доля, работает как мост между кратковременной и долговременной памятью. Он взаимодействует с префронтальной корой и гиппокампом, способствуя кодированию и извлечению воспоминаний. Эта область играет решающую роль в консолидации памяти, где вновь сформированные воспоминания становятся более стабильными и интегрируются в существующую сеть знаний мозга.

I. Создание когнитивных моделей чат-ботов

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

Чтобы облегчить немедленную обработку контекста, важно, чтобы наши модели чат-ботов легко интегрировались с хранилищем/базой данных кратковременной памяти. Это хранилище памяти будет служить хранилищем для хранения и вызова последней информации, которой обменивались во время разговора. Эффективно фиксируя и систематизируя все высказывания и данные, связанные с поворотами, на протяжении текущего сеанса, наша модель может эмулировать работу префронтальной коры головного мозга человека. В этой статье мы будем использовать Amazon DynamoDB в качестве предпочтительного варианта для реализации этого решения для хранения памяти.

Дополняя функцию хранилищ кратковременной памяти, долговременная память играет жизненно важную роль в сохранении и консолидации прошлых разговоров и пользовательских предпочтений. Кроме того, эти хранилища также служат репозиториями для закодированных знаний по конкретным предметным областям, облегчая беспрепятственный поиск и улучшая процесс RAG. Эта конкретная функциональность отражает замечательную способность гиппокампа человека хранить и сохранять долгосрочные воспоминания, позволяя чат-боту развивать индивидуальное понимание каждого отдельного пользователя и поддерживать постоянную и обогащенную базу знаний. Для получения дополнительной информации о поиске дополненной генерации (RAG) мы приглашаем вас изучить нашу предыдущую статью здесь. Чтобы упростить RAG и служить нашим хранилищем долговременной памяти, мы будем использовать Amazon OpenSearch Service.

Чтобы создать полноценный разговорный опыт, мы должны включить конвейер, который имитирует функциональность височной доли в наших моделях чат-ботов. Височная доля действует как мост между кратковременной и долговременной памятью, беспрепятственно интегрируя и организуя информацию с течением времени. Эмулируя этот механизм, наши модели должны обеспечивать плавный поток знаний и контекста, улучшая их способность понимать и реагировать на разговоры с человеческими когнитивными способностями. Для этой цели мы будем использовать конвейер, включающий DynamoDB Streams в сочетании с AWS Lambda, который отслеживает событие по завершении сеанса диалога. Этот конвейер будет отвечать не только за кодирование разговора, но и за консолидацию информации и облегчение ее перехода из кратковременной в долговременную память.

Интеграция управления памятью в диалоговые системы искусственного интеллекта является важным шагом на пути к достижению когнитивного поведения, подобного человеческому. Используя краткосрочные и долговременные хранилища/базы данных памяти, а также конвейер, который воспроизводит функцию височной доли, мы можем позволить моделям чат-ботов обрабатывать, сохранять и вспоминать информацию аналогично человеческому мозгу. Эта настройка открывает новые возможности для создания интеллектуальных и увлекательных диалогов, расширяя границы взаимодействия с пользователями на основе ИИ.

II. Обзор базовой архитектуры

Когнитивная архитектура нашего чат-бота (показана ниже) включает в себя несколько компонентов, и мы предоставим общий обзор ее конструкции. Для эффективного управления памятью мы используем такие сервисы, как SageMaker JumpStart, DynamoDB и OpenSearch, а также функцию Lambda.

В основе познания чат-бота LLM (модели генерации текста и встраивания) играют жизненно важную роль. Языковая модель позволяет чат-боту понимать и генерировать человеческие ответы, обрабатывая и интерпретируя входные данные на естественном языке. Модель встраивания текста, с другой стороны, обеспечивает эффективное представление текстовых данных, обеспечивая семантическое понимание и анализ сходства.

Давайте теперь углубимся в шаги, связанные с реализацией и интеграцией компонентов когнитивной архитектуры чат-бота на высоком уровне.

  1. Инициализация нового сеанса. Начните новый сеанс, создав уникальный идентификатор сеанса. Сохраняйте данные о каждом ходе разговора (запрос и ответ бота) и его отметку времени в таблице DynamoDB conversations, сопоставленную с идентификатором сеанса.
  2. Завершение сеанса. Запишите время начала и окончания сеанса, рассчитайте продолжительность и подсчитайте количество ходов. Обновите таблицу sessions в DynamoDB метаданными сеанса, включая время начала и окончания, продолжительность и количество ходов.
  3. Захват событий.Используйте DynamoDB Streams для захвата события завершения сеанса update. Настройте функцию Lambda в качестве триггера для события DynamoDB Streams update.
  4. Выполнение лямбда-функции.При срабатывании лямбда-функции извлеките данные многооборотного диалога, используя идентификатор сеанса. Соберите извлеченные данные в контекст, упорядоченный в хронологическом порядке.
  5. Обобщение контекста. Передайте собранный контекст в конечную точку модели генерации текста SageMaker. Создайте краткую сводку для многооборотной цепочки диалогов, используя модель SageMaker.
  6. Кодирование контекста. Возьмите созданную сводку и передайте ее в конечную точку модели внедрения SageMaker. Закодируйте сводку, чтобы создать представление вектора внедрения для сводки разговора.
  7. Хранение данных беседы.Отправьте вектор внедрения, исходную сводку и соответствующие метаданные (например, идентификатор сеанса и время окончания) в индекс OpenSearch.

Следуя этому процессу, чат-бот эффективно управляет кратковременной памятью с помощью DynamoDB, а также использует OpenSearch в качестве хранилища/базы данных долговременной памяти для сводок разговоров и соответствующих метаданных.

III. Настройка сервисов AWS

SageMaker JumpStart

JumpStart — это функция Amazon SageMaker, которая предоставляет разработчикам возможность быстро создавать, обучать и развертывать модели машинного обучения (ML). В JumpStart Foundation Model Hub размещена разнообразная коллекция продвинутых LLM, предоставленных известными организациями в этой области. Сюда входят уважаемые сообщества разработчиков открытого исходного кода, AWS и уважаемые партнеры AWS, такие как AI21, Stability.AI, Cohere и другие. Эти языковые модели обеспечивают широкий спектр приложений, от создания текста, похожего на человеческий, до ответов на вопросы о заданном тексте, перевода языков, обобщения длинных документов и многого другого.

Для нашего приложения чат-бота мы решили использовать две разные модели из центра моделей JumpStart. Наш первый выбор — это модель внедрения GPT-J 6B, которая будет использоваться с системой Retriever Augmented Generation (RAG). Это 6-миллиардная модель на основе трансформера из Hugging Face без головы модели генерации текста. Он принимает текстовую строку в качестве входных данных и создает вектор встраивания с 4096 измерениями. В то время как опубликованная модель на основе преобразователя создает вложение для каждого токена во входной последовательности, эта модель использует среднее объединение или среднее по элементам для объединения этих вложений токенов во встраивание последовательности. RAG сочетает в себе преимущества основанного на поиске и генеративного предварительного обучения для машинного обучения, что позволяет нам извлекать точную информацию из обширного массива текстовых данных, относящихся к вашей предметной области.

В качестве основного LLM в нашей когнитивной архитектуре мы решили использовать FLAN T5 XXL, передовую модель на основе преобразователя, широко известную своими исключительными возможностями в задачах генерации текста. Он послужит основой для нашего чат-бота, позволяя ему генерировать ответы, похожие на человеческие, с учетом контекста.

Чтобы интегрировать эти модели в нашу систему, мы будем следовать шагам, описанным в записных книжках 01-deploy-text-embedding-model.ipynb и 02-deploy-text-generation-model.ipynb в образце Репозиторий Github, который сопровождает эту статью. Эти записные книжки помогут нам создать конечные точки SageMaker. Конечные точки SageMaker — это интерфейсы, позволяющие развертывать модели безопасным и масштабируемым образом. Они служат каналами для запросов и ответов приложений, что делает их важным компонентом нашего чат-бота на основе машинного обучения. Правильная настройка этих конечных точек имеет решающее значение для обеспечения бесперебойного и эффективного взаимодействия пользователей с нашим чат-ботом.

Сервис Amazon OpenSearch

В нашей предыдущей статье мы подробно обсудили концепцию Retrieval Augmented Generation (RAG) с LLM. Мы разъяснили процесс на примере, объяснив, как кодировали юридические документы во встраивания и индексировали их с помощью Amazon OpenSearch Service. Впоследствии этот метод был использован для предоставления исчерпывающих ответов на юридические вопросы.

Amazon OpenSearch Service – это полностью управляемый сервис, который упрощает развертывание, защиту и использование набора инструментов поиска и аналитики в любом масштабе. Сервис хорошо подходит для таких задач, как поиск приложений, аналитика журналов и мониторинг в реальном времени, поскольку он обеспечивает поиск, анализ и визуализацию данных в реальном времени.

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

Однако для нашей текущей настройки нам потребуется дополнительный шаг — создание индекса для наших данных разговора. Фундаментальная идея здесь заключается в том, что после завершения сеанса мы стремимся зафиксировать многоходовую беседу, обобщить ее, закодировать, а затем передать в OpenSearch для индексации. Чтобы облегчить выполнение этого шага, мы предоставили записную книжку 04-create-os-index.ipynb в репозитории примеров, связанном с этой статьей.

Благодаря объединению RAG, LLM и Amazon OpenSearch Service мы можем создать эффективную модель долговременной памяти, которую можно использовать для решения сложных задач с ответами на вопросы, зависящие от предметной области. Постоянно сохраняя и извлекая данные разговоров, система постоянно развивается, что позволяет ей предоставлять все более точные и релевантные для контекста ответы.

Таблицы Amazon DynamoDB

Мы выбрали DynamoDB в качестве решения для хранения разговоров и данных сеансов нашего многооборотного чат-бота, потому что оно полностью соответствует нашим требованиям. Решение было обусловлено несколькими ключевыми факторами. Во-первых, замечательная масштабируемость DynamoDB была решающим аспектом, поскольку она позволяла нам без особых усилий справляться с постоянно растущим объемом разговоров и сеансов. Во-вторых, его низкая задержка гарантировала молниеносное извлечение и сохранение данных чат-бота, создавая беспрепятственный пользовательский интерфейс. Еще одной причиной нашего выбора стали возможности автоматического масштабирования DynamoDB, которые устранили необходимость ручной подготовки и позволили нам эффективно оптимизировать распределение ресурсов.

Для нашей архитектурной настройки мы инициируем процесс, создавая необходимые таблицы для хранения данных разговоров и сеансов. Мы создаем две таблицы, а именно conversations и sessions, которые будут служить основой для нашего хранилища данных. Для удобного выполнения этой задачи вы можете использовать блокнот с именем 03-create-dynamodb-tables.ipynb. Запуск этой записной книжки создаст таблицы с соответствующими разделами и ключами сортировки, как показано ниже.

На рисунке ниже показано, как многоходовой разговор сегментируется на отдельные ходы и сохраняется в виде плоской табличной структуры в таблице conversations:

С другой стороны, таблица sessions (показанная ниже) служит записью сеансов разговора, содержащей важные сведения, такие как идентификатор сеанса, время начала и окончания и количество поворотов в разговоре. Важно отметить, что поля end_time и num_turns изначально имеют значения null и 0 соответственно. Эти поля предназначены для записи времени окончания сеанса и количества ходов в сеансе, но они остаются незаполненными до тех пор, пока сеанс не завершится. Для наших целей мы определяем завершение сеанса как момент, когда пользователь выполняет действие для создания нового сеанса, что означает завершение текущего сеанса. Придерживаясь этой логики, мы обеспечиваем точное отслеживание данных сеанса в нашей системе.

Потоки DynamoDB

Затем нам нужно создать конвейер консолидации, который соединяет информацию между нашими краткосрочными и долговременными хранилищами памяти, подобно тому, как височная доля функционирует в человеческом мозгу, как мы обсуждали в предыдущих разделах. В нашем случае мы стремимся преодолеть разрыв между DynamoDB и OpenSearch. Для этой цели мы будем использовать DynamoDB Streams.

DynamoDB Streams — это функция Amazon DynamoDB, которая обеспечивает упорядоченную по времени последовательность изменений на уровне элементов в таблице DynamoDB. Он фиксирует журнал всех изменений, внесенных в таблицу, включая вставки, обновления и удаления, и сохраняет их в потоке. Этот поток можно использовать для запуска и обработки событий в режиме реального времени, позволяя приложениям реагировать на изменения в базе данных. DynamoDB Streams обычно используется для таких случаев использования, как обслуживание таблиц реплик, обновление поисковых индексов и запуск нижестоящих процессов или уведомлений на основе изменений в данных.

Чтобы включить потоки DynamoDB для нашего сценария, нам нужно выбрать таблицу sessions и включить поток, как показано ниже. Таким образом, мы сможем фиксировать события обновления на уровне элемента в нашей таблице сеансов всякий раз, когда завершается сеанс диалога.

Чтобы захватить весь элемент, как он выглядит после обновления, выберите параметр Новое изображение для Типа просмотра, как показано ниже. Это гарантирует, что мы захватим весь обновленный элемент целиком.

Потоки Amazon DynamoDB

АВС Лямбда

В качестве вторичного компонента нашего конвейера консолидации памяти нам необходимо выполнять последующие действия над захваченными событиями обновления из DynamoDB Streams. Для этого мы используем лямбда-функцию. AWS Lambda — это бессерверный сервис вычислений, предоставляемый Amazon Web Services. Это позволяет вам запускать свой код без управления серверами, автоматически масштабируясь на основе входящих запросов. С Lambda вы платите только за время вычислений, затрачиваемое вашим кодом, что делает его экономичным и эффективным решением для приложений, управляемых событиями.

Далее мы создадим триггер для соединения потока DynamoDB с функцией Lambda. Для этого нам нужно создать функцию из консоли Lambda или с помощью AWS SDK. Код обработчика Lambda предоставляется в виде сценария Python 05-lambda-handler.py в общих примерах Github, дополняющих эту статью. Фрагмент кода обработчика показан ниже.

from boto3.dynamodb.conditions import Key
from requests.auth import HTTPBasicAuth
import requests
import boto3
import json
import os

...

# Create service clients
dynamodb = boto3.resource('dynamodb')
sagemaker_runtime = boto3.client('sagemaker-runtime')

# Reference SageMaker JumpStart endpoints
domain_endpoint = os.environ['ES_ENDPOINT']
domain_index = os.environ['ES_INDEX_NAME']

# Reference Amazon OpenSearch endpoint 
URL = f'{domain_endpoint}/{domain_index}'

...

def lambda_handler(event: dict, context) -> None:
    for record in event['Records']:
        if record['eventName'] == 'MODIFY':
            session_item = record['dynamodb']['NewImage']
            session_id = session_item['session_id']['S']
            end_time = session_item['end_time']['N']

            # Query the conversations table
            conversation_turns = query_conversations_table(session_id)

            # Flatten the conversation turns into a dict
            flattened_conversations = flatten_conversations(conversation_turns)
            # print(flattened_conversations)

            summary = summarize_conversations(flattened_conversations)

            # Encode the dict into an embedding
            embedding = encode_conversations(summary)

            # Write the embedding to Elasticsearch
            write_to_elasticsearch(session_id, embedding, end_time, summary)

            print(f"Session {session_id} was persisted to long term memory")
...

Чтобы все работало гладко для обработчика, мы должны убедиться, что установлены правильные переменные среды.

Кроме того, крайне важно убедиться, что созданная функция Lambda имеет необходимые разрешения роли IAM для взаимодействия с таблицами DynamoDB, конечными точками SageMaker и OpenSearch. Для нашего прототипа мы предоставили полный доступ, но для производственной среды важно разрешить только необходимые действия.

После успешного создания функции Lambda с правильным кодом и привилегиями доступа к роли следующим шагом будет установка подключения к ранее настроенному потоку DynamoDB. Этого можно добиться, создав триггер и выбрав созданную функцию Lambda, как показано на предоставленных снимках экрана.

Вернувшись на страницу функции Lambda, вы найдете триггер DynamoDB, указанный в разделе «Конфигурации» → «Триггеры» для функции, как показано на предоставленных снимках экрана.

Давайте углубимся в случай лямбда-обработчика и поймем, как здесь упрощается процесс консолидации памяти. Назначение лямбда-функции — суммировать и сохранять данные разговоров в системе долговременного хранения. Давайте рассмотрим наш код обработчика и шаги, связанные с этим процессом.

Функция lambda_handler начинается с перебора записей событий для определения любых изменений в таблице DynamoDB. При обнаружении события модификации соответствующие данные, такие как идентификатор сеанса и время окончания, извлекаются из события. Впоследствии код запрашивает таблицу диалогов, используя идентификатор сеанса, чтобы получить повороты диалога, связанные с этим конкретным сеансом.

Подводя итог беседе, код сглаживает беседу, превращая ее в одно строковое представление. Ненужная информация удаляется, а сообщения пользователей и ботов объединяются в связный текст беседы. Сглаженный диалог затем передается вызову функции summature, которая использует модель генерации текста для создания краткого резюме разговора.

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

В области LLM были изучены методы сжатия информации для облегчения доступа во время запроса. Один из таких подходов включает использование LLM для предоставления сводок документов или разговоров и сохранение этих сводок вместо фактических документов. Такой подход снижает уровень шума, улучшает результаты поиска и снижает опасения по поводу ограничений маркеров подсказок.

Контекстное суммирование может выполняться либо во время приема, либо во время запроса. Выполнение контекстного сжатия во время запроса позволяет более целенаправленно извлекать релевантный контекст на основе предоставленного вопроса. Однако большие рабочие нагрузки во время запроса могут негативно сказаться на задержке пользователя. Поэтому рекомендуется разгрузить как можно больше рабочей нагрузки на время приема, чтобы увеличить задержку и избежать проблем во время выполнения, что и делается в данном случае. Этот метод суммирования истории разговоров применяется, чтобы избежать проблем с лимитом токенов, обеспечивая эффективное хранение и поиск информации.

Кроме того, шаги, происходящие внутри функции Lambda, можно отслеживать, изучая журналы CloudWatch (показаны ниже).

IV Создание пользовательского интерфейса чат-бота на базе AWS с помощью Streamlit

Streamlit — это библиотека Python с открытым исходным кодом, которая упрощает процесс создания интерактивных веб-приложений для проектов по науке о данных и машинному обучению. С помощью Streamlit разработчики могут создавать и развертывать удобные приложения с минимальными усилиями. Хотя Streamlit не предназначен специально для разработки чат-ботов, его можно эффективно использовать для создания интерфейсов чат-ботов.

В предыдущих разделах мы узнали, как настроить необходимые компоненты AWS, необходимые для включения нашей когнитивной архитектуры с хранилищами памяти. Эта внутренняя настройка формирует основу нашего чат-приложения. Теперь давайте рассмотрим, как использовать Streamlit для беспрепятственного создания внешнего интерфейса для нашего приложения. Для начала нам нужно настроить приложение Streamlit. Вы можете найти весь код, необходимый для этой настройки, в нашем образце Репозиторий GitHub.

Предоставленный код представляет собой упрощенную реализацию помощника ИИ на базе сервисов AWS. Приложение имеет интерфейс чата, где пользователи могут вводить свои запросы, с тщательно разработанным макетом и конфигурацией для повышения удобства использования. Включена боковая панель, позволяющая пользователям контролировать количество ходов для запоминания и предоставляющая опции для создания новых сеансов или извлечения истории чата из старых сеансов. Эти функции позволяют пользователям настраивать поведение приложения и получать удобный доступ к предыдущим взаимодействиям. В целом, интеграция Streamlit обеспечивает интуитивно понятный и визуально привлекательный интерфейс, обеспечивающий плавный и профессиональный пользовательский интерфейс.

Чат-бот состоит из трех основных модулей: llm.py, retrieve.py и app.py. Модуль llm играет решающую роль в определении намерений входящих пользовательских запросов или высказываний. Каждый запрос классифицируется по одной из трех категорий: реплики в болтовне, требующие кратковременной памяти, запросы к долговременной памяти, извлекающие информацию из закрытых данных, специфичных для предметной области, проиндексированных в OpenSearch, или запросы к долговременной памяти, которые извлекают прошлые разговоры.

Обнаружение намерений может быть реализовано различными способами. Один из подходов заключается в использовании предопределенных шаблонов (см. ниже). Например, если запрос начинается с таких шаблонов, как \past или /past, это указывает на запрос прошлых разговоров. Точно так же, если оно начинается с \verified или /verified, это подразумевает желание получить ответы из проверенного источника в долговременной памяти. Запросы без таких индикаторов по умолчанию относятся к обычному чату, который напрямую использует llm.

def detect_task(query: str) -> str:
    if query.startswith('\\verified') or query.startswith('/verified'):
        return 'LTM VERIFIED SOURCES'
    elif query.startswith('\\past') or query.startswith('/past'):
        return 'LTM PAST CONVERSATIONS'
    else:
        return 'STM CHAT'

Другой подход к классификации намерений состоит в том, чтобы чат-бот сам выполнял классификацию на основе нескольких запросов (как показано ниже).

def detect_task(query: str) -> str:
    prompt = f"""
    Given a QUERY for the user, classify the INTENT behind it into one of the following classes:
    LTM VERIFIED SOURCES or LTM PAST CONVERSATIONS OR STM CHAT.
    
    QUERY => What is the process for filing a divorce in India?
    INTENT => LTM VERIFIED SOURCES
    QUERY => What is the UK law regarding intellectual property rights?
    INTENT => LTM VERIFIED SOURCES
    QUERY => Explain the concept of Habeas Corpus in Indian law.
    INTENT => LTM VERIFIED SOURCES
    QUERY => What are the rights of a tenant under UK law?
    INTENT => LTM VERIFIED SOURCES
    QUERY => What is the Indian law on cybercrime and data protection?
    INTENT => LTM VERIFIED SOURCES
    QUERY => What did we discuss yesterday?
    INTENT => LTM PAST CONVERSATIONS
    QUERY => Can you recall our conversation about climate change?
    INTENT => LTM PAST CONVERSATIONS
    QUERY => What was the solution to the math problem we were working on?
    INTENT => LTM PAST CONVERSATIONS
    QUERY => Can you remind me of the book recommendations you gave in our previous chat?
    INTENT => LTM PAST CONVERSATIONS
    QUERY => What were the details of the Indian law case study we discussed earlier?
    INTENT => LTM PAST CONVERSATIONS
    QUERY => How is the weather today?
    INTENT => STM CHAT
    QUERY => Where is Miami located?.
    INTENT => STM CHAT
    QUERY => What is your name?
    INTENT => STM CHAT
    QUERY => Hello!
    INTENT => STM CHAT
    QUERY => Hi!
    INTENT => STM CHAT
    QUERY => {query}
    INTENT =>
"""

Как только задача или тип намерения классифицированы, модуль llm генерирует соответствующий ответ, используя контекст, извлеченный из модуля извлечения. Модуль llm использует модель генерации текста SageMaker JumpStart, в частности модель FLAN-T5-XXL, для выполнения различных задач на основе пользовательских запросов. Он предлагает функции для обобщения отрывков, сопоставления ответов и создания диалоговых ответов.

Модуль retrieve демонстрирует интеграцию OpenSearch и Amazon SageMaker для получения релевантной информации на основе пользовательских запросов. Модуль включает в себя функции для кодирования запроса с использованием модели встраивания текста, развернутой в SageMaker, создания запроса OpenSearch на основе закодированного запроса и извлечения наиболее подходящих отрывков или прошлых разговоров из OpenSearch.

Наконец, модуль app действует как драйвер для утилиты чата, связывая все вместе, используя модули llm и retrieve. Он также включает функции для управления сессиями. В целом, архитектура и модули чат-бота предназначены для эффективного определения намерений пользователя, генерации соответствующих ответов с использованием моделей генерации текста, извлечения информации как из кратковременной, так и из долговременной памяти, а также для обеспечения беспрепятственного общения в чате с помощью модуля app.

В нашем приложении чат-бота мы реализовали метод скользящего окна для управления прошлой историей чата. Такой подход позволяет сохранить в истории только top N ходов. Кроме того, у нас есть возможность применить ограничение, при котором предыдущая история обрезается до фиксированного значения, гарантируя, что она не превышает определенного количества токенов, привязанных к LLM.

Чтобы обеспечить удобство использования, мы добавили параметр конфигурации на боковую панель. Этот элемент позволяет пользователям установить максимальное количество ходов для запоминания прошлой истории. Настраивая этот параметр, пользователи могут контролировать количество контекста, сохраняемого чат-ботом.

Реализация следует простой и понятной логике, как показано в фрагменте кода ниже:

def transform_ddb_past_history(history: list, num_turns: int) -> str:
    past_hist = []
    for turn in history:
        me_utterance = turn['Me']
        bot_utterance = turn['AI']
        past_hist.append(f'Me: {me_utterance}')
        past_hist.append(f'AI: {bot_utterance}')
    past_hist = past_hist[-num_turns*2:]
    past_hist_str = '\n'.join(past_hist)
    return past_hist_str

Кроме того, вы также можете использовать возможности LangChain для эффективного управления предыдущей историей чата. LangChain предлагает различные стратегии для таких приложений, как чат-боты, которые полагаются на запоминание прошлых взаимодействий.

V Препарирование потока разговора

Давайте углубимся в динамику разговора в рамках чат-бота, уделив особое внимание намерению болтать и его обработке прямых запросов, не связанных с юридическими вопросами, как указано в нашей настройке. Такие запросы попадают под классификацию STM CHAT, подразумевающую, что они могут быть оперативно сохранены в кратковременной памяти, а именно в DynamoDB. Более того, эти запросы напрямую перенаправляются в модели генерации текста для вывода, как показано на вышеупомянутой диаграмме.

В ситуациях, когда запрос требует получения информации из проверенных источников или прошлых разговоров, чат-бот полагается на механизмы поиска или семантического поиска по закодированным векторам (встраиваниям) специализированных документов или предыдущих диалогов. Независимо от конкретного случая, запрос подвергается кодированию и используется для семантического поиска для идентификации соответствующих документов или разговоров. Впоследствии происходит повторное ранжирование на основе оценки сходства с использованием евклидова расстояния для поиска документов и комбинации метки времени и оценки сходства для разговоров. На приведенной ниже диаграмме показано, как чат-бот объединяет модели генерации и встраивания текста для обработки этих типов намерений, а именно LTM VERIFIED SOURCES и LTM PAST CONVERSATIONS. Оба сценария требуют доступа к долговременной памяти для эффективного функционирования.

Доступ к долговременной памяти в системах ИИ может эффективно следовать шаблону RAG, как мы подробно обсуждали в нашей предыдущей статье. Этот подход играет решающую роль в снижении вероятности галлюцинаций ИИ и гарантирует, что ответы будут фактически точными. Используя специальные знания предметной области, процесс RAG оптимизирует способность ИИ извлекать соответствующую информацию, формулировать точный ответ и впоследствии генерировать исчерпывающие и последовательные ответы. Эта методология подчеркивает важность долговременной памяти для создания надежных и надежных моделей ИИ.

Теперь давайте углубимся в несколько примерных диалогов с участием нашего чат-бота. Следующие взаимодействия демонстрируют умение чат-бота использовать свою долговременную память — векторное хранилище (OpenSearch), содержащее проверенные документы из пользовательского домена — для точного ответа на запросы. Используя семантический поиск, бот улучшает процесс генерации текста, чтобы давать фактически правильные и проверенные ответы. Примечательно, что он ранжирует эти ответы на основе релевантности и предоставляет указатели на исходный идентификатор юридического документа и точный отрывок, из которого была получена информация. Этот конкретный разговор освещает тему смертной казни в Индии.

Здесь мы представляем еще один наглядный пример, когда наш чат-бот умело применяет шаблон RAG для ответов на запросы, связанные с судебным законом о диффамации в Соединенном Королевстве.

Припоминание информации из прошлых разговоров работает по тем же принципам, которые мы обсуждали ранее, с одним тонким, но существенным отличием. В этом процессе мы повторно ранжируем результаты не только на основе релевантности, но и в хронологическом порядке, тем самым интегрируя измерение, основанное на времени, в метрику ранжирования. Давайте проиллюстрируем это с помощью диалога, в котором мы возвращаемся к предыдущим обсуждениям на тему смертной казни. Этот пример основан на разговорах, которые мы рассмотрели ранее, тем самым подчеркивая силу временной релевантности в повышении глубины и точности ответов ИИ.

VI За горизонтом: области для совершенствования и размышления

До сих пор мы рассмотрели ряд сценариев, обычно встречающихся в разговорах. Мы изучили методы обработки случайных обменов мнениями или «болтовни», используя LLM напрямую для ответов на открытые вопросы, применяя подход RAG для закрытых запросов и извлекая предыдущие разговоры. Теперь мы углубимся в более сложные сценарии и изучим потенциальные возможности расширения возможностей бота.

Обработка сложенных поворотов

В сценариях, где обмен чередами отличается от обычного шаблона обмена сообщениями, может возникнуть сложная ситуация, когда пользователь-человек вводит несколько отдельных запросов или инструкций в быстрой последовательности, не дожидаясь ответа между ними. Эта уникальная форма взаимодействия не имеет общепринятого термина, поскольку она отходит от традиционной модели очередности. Чтобы справиться с этим, можно реализовать систему, которая будет ждать и получать все сложенные пользователем входные данные, прежде чем генерировать ответ. Затем система может консолидировать входные данные, либо объединив их в один консолидированный ввод для генерации ответов, либо сгенерировав отдельные ответы для каждого запроса, а затем объединив их. Эти механизмы обеспечивают сохранение контекста разговора и генерацию соответствующих ответов, улучшая общий опыт общения для пользователя.

Направление к агентам-людям

Другой сценарий, который довольно популярен в корпоративной среде, особенно среди агентов службы поддержки клиентов, включает в себя реализацию логики, облегчающей плавный переход запросов от бота к агенту-человеку. Эта логика вступает в действие, когда бот не может получить соответствующую информацию или подтвердить ответ на основе проверенных источников, что требует участия человека. Эта функциональность может принимать различные формы, в том числе позволять пользователям напрямую общаться с агентом-человеком, если они того пожелают. Для этого требуется способность точно определять намерения пользователя и обеспечивать плавную и эффективную передачу сложных или конфиденциальных запросов от бота агентам-людям, что в конечном итоге улучшает общее взаимодействие с пользователем. Важно отметить, что этот процесс не прерывает сеанс, а перенаправляет его агенту-человеку, обеспечивая непрерывность взаимодействия пользователя.

Решение незавершенных сессий

Часто разговоры остаются в постоянном движении, что создает уникальные проблемы в управлении сеансами чата, которые не привели к окончательному завершению. Распознавание таких безрезультатных сессий и разработка стратегий для их обработки — важный аспект предметной области ИИ. Более того, крайне важно правильно классифицировать эти незавершенные разговоры, обеспечивая их сохранение как в краткосрочной, так и в долговременной памяти. Хотя важно хранить их в непосредственном репозитории данных для немедленных последующих действий, решение о кодировании и переносе их в долговременную память зависит от множества факторов, включая актуальность, возможность взаимодействия с пользователем в будущем и соображения хранения данных. Эта двойственность систем памяти обеспечивает комплексный подход к управлению забытыми диалогами и извлечению из них уроков.

Решение проблем с подключением

Вариантом описанного выше сценария является устранение сбоев, вызванных потерей связи во время разговора. Надежное решение для этого сценария включает в себя установление постоянного соединения между пользовательским интерфейсом чата и сервером с помощью различных внутренних стратегий. Сервер может хранить и регулярно сохранять историю разговоров, защищая все обмены диалогами. Файлы cookie можно использовать для хранения идентификаторов сеансов или идентификаторов разговоров, что позволяет беспрепятственно извлекать историю разговоров пользователя при возобновлении разговора после прерывания. Эти файлы cookie также могут временно хранить последние введенные пользователем данные, что позволяет извлекать и передавать данные на сервер после восстановления подключения. Такой подход гарантирует, что никакие пользовательские данные не будут потеряны во время сбоев подключения.

Отслеживание настроений

Понимание настроения, стоящего за высказыванием пользователя, имеет первостепенное значение для облегчения содержательных разговоров. Включив отслеживание настроений, чат-боты могут использовать эту информацию для улучшения своих ответов и эффективного взаимодействия с пользователем. Помимо простого определения намерений пользователя, жизненно важно отслеживать его высказывания после ответа бота. Этот процесс может быть эффективно выполнен за счет использования самого LLM. Это позволяет чат-боту умело справляться с различными сценариями, такими как последовательные негативные настроения, которые могут потребовать вмешательства человека для обеспечения оптимального хода разговора.

Управление длинными интервалами между ходами

Еще один важный аспект дизайна чат-бота связан с сценариями, в которых существует значительная задержка между обращениями пользователей. Такая ситуация может возникнуть, когда пользователи отвлекаются во время разговора или часто ищут информацию, требуя от чат-бота поддержания последовательности и контекста в разговоре. Используя LLM напрямую вместе с дополнительными модулями хронометража, чат-боты могут эффективно управлять этими задержками, обеспечивая бесперебойную беседу. Этот сценарий тесно связан с неубедительным сценарием сеанса, обсуждавшимся ранее, подчеркивая необходимость комплексного управления диалогом.

Проектирование систем чат-ботов включает в себя рассмотрение множества уникальных сценариев и крайних случаев, которые требуют внедрения внешних модулей и компонентов. Поддерживая эти дополнительные сценарии, чат-боты могут стать более динамичными и лучше подготовленными к внедрению на предприятиях, способными справляться с реальными практическими задачами.

VII Заключительные замечания

Дополнение чат-ботов памятью — важное достижение в области искусственного интеллекта. AWS играет ключевую роль в разработке передовых когнитивных архитектур для бизнеса. Эти чат-боты могут запоминать прошлые разговоры, получать доступ к надежным источникам и давать точные ответы. Благодаря адаптивности в реальном времени и персонализированному взаимодействию чат-боты с кратковременной памятью улучшают пользовательский опыт и удовлетворенность клиентов. Более того, чат-боты с долговременной памятью становятся виртуальными хранилищами знаний, улучшая процесс принятия решений и предоставляя точную информацию. Использование чат-ботов с расширенной памятью на базе AWS помогает организациям повысить производительность и эффективность обслуживания клиентов.

В будущем чат-боты будут продолжать развиваться, добавляя расширенные возможности, такие как подключение к внутренним системам, выполнение вызовов API через Интернет и сохранение сущностей и фактической информации в их долговременной памяти. Эти чат-боты будут выходить за рамки простых разговоров и использовать различные формы долговременной памяти, такие как графики знаний, для хранения и извлечения информации.

Используя свои обширные банки памяти, чат-боты смогут объединять прошлые знания с новыми фактами, генерируя инновационные идеи и идеи. Они будут активно искать новую информацию, обновлять свои хранилища знаний и совершенствовать свои процессы принятия решений.

В конечном итоге синергия между памятью, подключением и обучением в чат-ботах приведет организации к беспрецедентной производительности, эффективности и удовлетворенности клиентов. С безграничным потенциалом расширенных чат-ботов на горизонте будущее открывает безграничные возможности для преобразования того, как мы взаимодействуем, учимся и внедряем инновации!

Спасибо, что нашли время, чтобы прочитать и принять участие в этой статье. Ваша поддержка в виде подписки на меня и аплодисментов статье очень ценна и ценна. Если у вас есть какие-либо вопросы или сомнения относительно содержания этой статьи или общих блокнотов, не стесняйтесь обращаться ко мне по электронной почте [email protected] или shankar [email protected]. Вы также можете связаться со мной по https://www.linkedin.com/in/arunprasath-shankar/

Я приветствую любые ваши отзывы или предложения. Если вы увлечены машинным обучением в масштабе, НЛП/НЛУ и заинтересованы в сотрудничестве, я буду рад связаться с вами. Кроме того, если вы являетесь частным лицом или частью стартапа или предприятия, которое хочет получить представление об Amazon Sagemaker и его приложениях в NLP/ML, я буду рад помочь вам. Не стесняйтесь обращаться ко мне.