Повысьте пользовательский опыт Внедрение 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 берет на себя его уход.
- После создания потока мы добавляем в него сообщения. Это сообщения, которые пользователь вводит в ИИ-помощник или на которые ИИ-помощник отвечает.
- Наконец, мы запускаем помощника на этом потоке. Исходя из сообщений на этом потоке, ИИ-помощник обращается к модели языка 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 и используются по усмотрению автора.