Изучаем OpenAI API
Понимание работы с API OpenAI позволит вам без проблем понимать трудоустройство фреймворков, которые мы будем проходить в блоке Junior, а также пригодится при отладке проблем и работы со всеми OpenAI-совместимыми провайдерами.
Questions
- Как выглядит тело API запроса в OpenAI API?
- Какие параметры можно настраивать кроме temperature, max_tokens?
- Как работает потоковая передача данных в OpenAI API?
- Как использовать функциональные вызовы (function calling) в чат-моделях?
- Что такое структурированный вывод?
Steps
1. Читаем документацию OpenAI API
Читаем всё про ручку chat/completions
, ничего не пропускаем. Весь будущий материал будет строиться на этой ручке и вам важно в деталях понимать, как она работает, иначе вы будете путаться.
2. Читаем странички из Cookbook
-
По функциям, читаем целиком (ru), 3 главы. Не обращайте внимание на то, что там написано про YandexGPT, код работает с API формата OpenAI.
Аналог - how_to_call_functions_with_chat_models
Extra Steps
E1. Закладываем принцип разделяй и властвуй.
https://cookbook.openai.com/examples/entity_extraction_for_long_documents
E2. Каких параметров пока не существует ни в одном public API?
<EOS> - end of sequence - токен, после которого мы обычно перестаем производить предсказания следущих токенов
Хочу немного интересных моментов вам преоткрыть, которые я не встречал пока у провайдеров. Обычно температуру и все другие параметры мы задаем константой - но также это можно делать и динамически - чтобы параметры изменялись в зависимости от условий, математических функций и тд. Примеры:
- Например, пока LLM анализирует задачу - держим температуру на нуле; а когда перейдет к написанию творческого текста - поднимем до 0.6
- После того, как LLM генерирует <EOS> - мы можем продолжить генерировать токены
- Мы можем мануально умножать вероятность вывода <EOS> на любое значение (даже на 0) до определенного количества сгенерированных токенов. Кроме умножения доступна любая логика.
- Также как с <EOS>, мы можем поступать вообще с любыми токенами - можем придумывать любую логику которая только родится в шизе. Можем статически/динамически/логически влиять на вероятности (0-100%) генерации определенного токена или набора токенов или последовательности токенов.
Что можно было бы добавить в существующие API:
- возможность запрещать генерировать <EOS> при длине последовательности меньше определенного количества токенов (MinOutputLen)
- BannedTokensToGenerate
- возможность управлять вероятностью <EOS> в зависимости от длины сгенерированного текста (BoostEos)
- NGramPenalty
- возможность продолжать генерацию какое-то количество шагов даже после <EOS> (IncludeLateHypotheses)
- запрещать генерировать определенные токены после какого-то количества повторений (MaxRepeats)
- возможность выбирать алгоритм семплинга через SamplerParams (Sampling, BeamSearch, StochasticBeamSearch), NumHypos & BeamSize
- возможность изменять температуру в процессе генерации - TemperatureScheduler
Для ризонинг-моделей можно умножить все эти фичи на два: для фазы размышлений и генерации.
Конечно, всё это можно реализовать при локальном инференсе модели на своём железе. Приходите работать в OpenAI/Sber/Yandex/Anthropic - там все эти параметры доступны в private API!
Now we know...
Мы изучили основные компоненты OpenAI API и научились:
- Подсчитывать токены в текстах с помощью tiktoken для оптимизации запросов
- Работать с потоковыми ответами для создания более отзывчивых интерфейсов
- Использовать функциональные вызовы (function calling) для структурированного взаимодействия с внешними инструментами
- Получать структурированные ответы в JSON формате для удобной обработки
- Применять принцип "разделяй и властвуй" для обработки длинных документов
Эти навыки являются фундаментальными при создании AI Агентов, поскольку позволяют эффективно управлять коммуникацией между агентом и LLM, а также обеспечивают возможность интеграции с внешними системами.
Exercises
-
Какие есть роли у сообщений?
-
Вы хотите отправить в LLM два запроса с сохранением контекста:
- "Привет! Меня зовут Иван."
- "Как меня зовут?"
Как будет выглядеть тело второго запроса в модель?
-
Придумайте три примера использования функциональных вызовов, которые могли бы существенно улучшить возможности AI Агента.
-
Практическое задание:
Создайте простой скрипт на Python, который будет выводить в консоль только первый, второй, предпоследний и последний чанки ответа от модели.