Повысьте пользовательский опыт Внедрение API OpenAI Assistant для интерактивных чат-ботов

Улучшите пользовательский опыт Внедрение API OpenAI Assistant для интерактивных чат-ботов

Введение

С появлением ChatGPT и моделей GPT 3 от OpenAI мир перешел к использованию приложений, интегрированных с искусственным интеллектом. Во всех приложениях, которыми мы пользуемся каждый день, от интернет-магазинов до банковских приложений, ИИ интегрирует некоторые части приложения, особенно большие модели языка. Одной из таких моделей является OpenAI Assistant API, то есть чат-боты. Недавно OpenAI выпустила бета-версию Assistants API – инструмента, разработанного для улучшения пользовательского опыта.

Цели обучения

  • Узнать процесс создания специальных ИИ-помощников с конкретными инструкциями.
  • Изучить концепцию постоянных и бесконечно длинных потоков в Assistants API.
  • Показать создание ИИ-помощника с помощью библиотеки OpenAI, указывая параметры, такие как имя, инструкции, модель и инструменты.
  • Узнать процесс создания запусков для выполнения ИИ-помощников на определенных потоках.
  • Понять структуру ценообразования Assistants API, учитывая такие факторы, как токены языковых моделей, сессии Code Interpreter и использование инструментов Retrieval.

Эта статья была опубликована в рамках Data Science Blogathon.

Что такое Assistants API? Что оно может?

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

Эти помощники строятся с учетом сохранения состояния. Они в значительной степени сохраняют предыдущие разговоры, тем самым позволяя разработчикам не беспокоиться о управлении состоянием и доверить это OpenAI. Типичный порядок следования представлен ниже:

  • Создание помощника, где мы выбираем данные для входа, модель для использования, инструкции для помощника и инструменты для использования.
  • Затем мы создаем поток. Поток хранит сообщения пользователя и ответы модели языка. Именно этот поток отвечает за управление состоянием помощника, и OpenAI берет на себя его уход.
  • После создания потока мы добавляем в него сообщения. Это сообщения, которые пользователь вводит в ИИ-помощник или на которые ИИ-помощник отвечает.
  • Наконец, мы запускаем помощника на этом потоке. Исходя из сообщений на этом потоке, ИИ-помощник обращается к модели языка OpenAI для предоставления подходящего ответа и может также обращаться к некоторым инструментам, о которых мы поговорим в следующем разделе.

Все эти объекты помощника, потоки, сообщения и выполнения называются “Objects” в Assistants API. В дополнение к этим объектам существует еще один объект, называемый “Run Step”, который предоставляет нам подробные шаги, которые помощник выполнил во время выполнения, что позволяет узнать о его внутренней работе.

Инструменты – Арсенал Assistants API

Мы постоянно упоминали слово “инструмент”, так что что же он имеет отношение к OpenAI Assistant API? Инструменты похожи на оружие, которое позволяет API помощника выполнить дополнительные задачи. Они включают инструменты, предоставляемые OpenAI, такие как Knowledge Retrieval и Code Interpreter. Мы также можем определить собственные инструменты с помощью вызова функций, о которых мы не будем говорить в этой статье.

Итак, давайте подробнее рассмотрим оставшиеся инструменты.

  • Code Interpreter: Этот инструмент интерпретирует код Python в защищенной среде, позволяя API помощника выполнять пользовательские сценарии на Python. Полезен, например, для анализа данных, где помощник может генерировать код для анализа CSV-данных, запускать его и предоставлять пользовательский ответ.
  • Вызов функции: Разработчики могут определить собственные инструменты, позволяющие помощнику итеративно строить ответы, используя эти инструменты и их выводы.
  • Retrieval: Это ключевой инструмент для ИИ-помощников, он включает предоставление данных для анализа. Например, при создании помощника для продукта соответствующая информация разбивается на части, встраивается и хранится в векторном хранилище. При обработке запросов пользователей помощник извлекает эти данные из базы знаний.

Создание нашего помощника

В этом разделе мы пройдем процесс создания помощника, добавления сообщений в поток и запуска помощника на этом потоке. Мы начнем с загрузки библиотеки OpenAI.

# устанавливает библиотеку openai, содержащую API помощников!pip install openai

Убедитесь, что вы используете последнюю версию (v.1.2.3 – последняя на момент написания этой статьи). Давайте начнем с создания нашего клиента.

# импорт библиотеки os для чтения переменных средыimport os# импорт библиотеки openai для взаимодействия с API помощниковfrom openai import OpenAI# хранение API-ключа OPENAI в переменной средыos.environ["OPENAI_API_KEY"] = "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"# создание клиента OpenAI, предоставив ключ APIclient = OpenAI(api_key = os.environ['OPENAI_API_KEY'])

Создание помощника

Таким образом, мы импортируем класс OpenAI из библиотеки openai. Затем мы сохраняем наш токен API OpenAI в переменной среды. Затем создаем экземпляр класса OpenAI с api_key в качестве переменной. Переменная client – это экземпляр класса OpenAI. Теперь пришло время создать нашего помощника.

# создание помощника assistant = client.beta.assistants.create(    name="Эксперт по PostgreSQL",    instructions="Вы эксперт по PostgreSQL и можете ответить на любой вопрос простым образом с примером",    model="gpt-4-1106-preview",    tools=[{"type":"retrieval"}])
  • Для создания помощника мы вызываем метод create() из класса assistants и передаем ему следующие параметры
  • name: Это имя нашего помощника. В этом примере мы называем его Эксперт по PostgresSQL
  • instructions: Это контекст/дополнительная информация, предоставленная помощнику.
  • model: Модель, которую помощник будет использовать для генерации ответов. В данном случае мы используем новую модель предварительного просмотра GPT-4
  • tools: Это инструменты, о которых мы говорили в предыдущем разделе, которые помощник будет использовать для генерации ответов. Мы передаем инструменты как список словарей. Здесь мы используем инструмент извлечения для принятия данных

Загрузка документов

Таким образом, мы создали и присвоили помощнику переменную assistant. Следующим шагом будет загрузка документов.

# загрузка файлаfile = client.files.create(    file=open(        "/content/LearnPostgres.pdf",        "rb",    ),    purpose="assistants",)# обновление помощникаassistant = client.beta.assistants.update(    assistant.id,    file_ids=[file.id],)
  • Приведенный выше код создает и загружает документ в помощник. Здесь у меня есть PDF (нажмите здесь, чтобы загрузить PDF), содержащий информацию о изучении PostgreSQL.
  • Мы используем класс files OpenAI для создания файла с помощью метода create() и передаем значение “assistants” переменной purpose, так как это нужно добавить к помощнику.
  • Во втором шаге мы обновляем нашего помощника с созданным файлом. Для этого мы вызываем метод update() и передаем идентификатор помощника (у нас уже есть объект помощника, и этот объект содержит уникальный идентификатор) и идентификаторы файлов (каждый созданный файл будет иметь свой уникальный идентификатор).

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

Создание потока и сохранение сообщений

В этом разделе мы создадим поток и добавим в него сообщения. Для начала создадим новый поток.

# создание потокаветка = client.beta.threads.create()

Метод create() класса threads используется для создания потока. Поток представляет собой сеанс общения. Как и assitants, объект потока также имеет свой уникальный идентификатор. Также следует отметить, что мы не передали ему никакого идентификатора помощника, что означает, что поток изолирован и не связан с помощником. Теперь добавим сообщение в наш только что созданный поток.

# добавление первого сообщения в потокmessage = client.beta.threads.messages.create(    thread_id=thread.id,    role="user",    content="Как создать таблицу в PostgreSQL")
  • Сообщения – это блоки разговоров, содержащие запросы и ответы пользователя. Чтобы добавить сообщение в поток, мы используем метод create() класса messages, и он принимает следующие параметры
  • thread_id: Уникальный идентификатор, связанный с каждым созданным потоком. Здесь мы передаем идентификатор потока, который был запущен ранее.
  • role: Кто отправитель / отправляющий это сообщение? В нашем случае это пользователь.
  • content: Это запрос пользователя. В нашем примере мы используем “Как создать таблицу в PostgreSQL.”

Запуск нашего помощника

Теперь мы запускаем помощника, создавая выполнение на потоке, на котором хотим запустить нашего помощника.

# Создание выполненияrun = client.beta.threads.runs.create(    thread_id=thread.id,    assistant_id=assistant.id)
  • Для создания выполнения мы используем метод create() класса runs. И передаем ему идентификатор потока, то есть, на каком потоке (то есть, на какой сеанс разговора) мы хотим запустить помощника, и идентификатор помощника (то есть, который помощник запустить) и передаем его переменной run.
  • Создание выполнения не будет производить ответа. Вместо этого мы должны ждать, пока выполнение не будет завершено. Выполнение можно рассматривать как асинхронную задачу, в которой мы должны проверять выполнение выполнения.

Создание функции

Объект предоставляет переменную с именем status, которая содержит информацию о том, является ли данный запуск в очереди / в процессе / завершенными. Для этого создаем следующую функцию.

import time# создание функции для проверки завершено ли выполнение или нетdef poll_run(run, thread):    while run.status != "completed":        run = client.beta.threads.runs.retrieve(            thread_id=thread.id,            run_id=run.id,        )        time.sleep(0.5)    return run    # ждем, чтобы выполнение было завершеноран = poll_run(run, thread)
  • Здесь мы создаем функцию с именем poll_run(). Эта функция получает наши объекты Выполнение и Поток, которые мы создали ранее.
  • Этап выполнения считается завершенным, когда его status равен “completed.” Поэтому мы проверяем выполнение run, чтобы проверить его status, завершено ли оно или нет, в цикле.
  • В этом цикле мы вызываем метод retrieve() из класса runs и передаем ему идентификатор выполнения и идентификатор потока. Метод retrieve вернет тот же объект выполнения с обновленным status.
  • Теперь мы проверяем, обновлен ли статус до завершенного состояния, получая объект выполнения каждые 0,5 секунды и проверяя его завершение.
  • Если статус Выполнения становится завершенным, мы возвращаем Выполнение.

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

Как сохранить сообщения в цепочке?

Давайте сохраним сообщения в нашей цепочке.

# извлекаем сообщенияmessages = client.beta.threads.messages.list(thread_id=thread.id)for m in messages:    print(f"{m.role}: {m.content[0].text.value}")
  • На первом шаге мы извлекаем все сообщения в цепочке, вызывая метод list() класса messages. Для этого мы передаем идентификатор цепочки, чтобы извлечь сообщения нужной нам цепочки
  • Затем мы проходим по всем сообщениям в списке и печатаем их. Сообщения, которые мы загрузили в цепочку, и сообщения, сгенерированные Ассистентом, хранятся в поле message.content[0].text.value объекта сообщения

На приведенном выше изображении показан ответ Ассистента сверху и запрос Пользователя снизу. Теперь давайте отправим второе сообщение и проверим, может ли Ассистент получить предыдущий разговор.

# создаем второе сообщениемessage2 = client.beta.threads.messages.create(    thread_id=thread.id,    role="user",    content="Добавьте некоторое значение в созданную вами таблицу")# создаем Ранран = client.beta.threads.runs.create(    thread_id=thread.id,    assistant_id=assistant.id)# ждем завершения выполняемого методаран = poll_run(run, thread)# извлекаем сообщенияmessages = client.beta.threads.messages.list(thread_id=thread.id)for m in messages:    print(f"{m.role}: {m.content[0].text.value}")
  • Здесь мы создаем еще одно сообщение с названием message2, и на этот раз мы передаем запрос “Добавьте некоторое значение в созданную вами таблицу.” Этот запрос относится к предыдущему разговору и поэтому передается в нашу цепочку.
  • Затем мы проходим через тот же процесс создания Ран, запуска его с помощью Ассистента и ожидания его завершения.

Наконец, мы извлекаем и отображаем все сообщения из цепочки.

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

Стоимость API-интерфейса Ассистента

Стоимость API-интерфейса Ассистента рассчитывается на основе выбранной модели и используемых инструментов. Инструменты, такие как извлечение и интерпретатор кода, имеют свою отдельную стоимость. Что касается модели, каждая модель в OpenAI имеет свою собственную стоимость, основанную на количестве токенов, используемых для ввода, и количестве созданных выходных токенов. Поэтому для определения стоимости модели нажмите здесь, чтобы просмотреть все цены на модели языка OpenAI.

Что касается интерпретатора кода, его стоимость составляет $0.03 за сеанс, сеансы активны по умолчанию в течение одного часа. Один сеанс связан с одной цепочкой, поэтому если у вас запущено N цепочек, стоимость составит N * $0.03.

С другой стороны, извлечение имеет стоимость $0.20 за гигабайт в день на помощника. Если N помощников имеет доступ к этому инструменту, стоимость составит N * $0.2 / день. Количество цепочек не влияет на стоимость извлечения.

Конфиденциальность данных и этические проблемы

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

OpenAI следует строгим правилам соответствия. Он обеспечивает шифрование данных на покое (при помощи AES-256) и во время передачи (TLS 1.2+). OpenAI прошел аудит на соответствие SOC 2, что означает, что OpenAI прилагает жесткие усилия по обеспечению конфиденциальности и безопасности данных. OpenAI обеспечивает строгий контроль доступа к данным внутри организации.

Заключение

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

Основные моменты

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

Часто задаваемые вопросы

Ссылки

Вот официальная документация по API OpenAI Assistants

  • https://platform.openai.com/docs/assistants/overview
  • https://platform.openai.com/docs/api-reference/assistants

Изображения, показанные в этой статье, не принадлежат компании Analytics Vidhya и используются по усмотрению автора.