Модели OpenAI серии o1 — это новые большие языковые модели, обученные с помощью подкрепления для выполнения сложных рассуждений. Модели o1 думают, прежде чем ответить, и могут создавать длинную внутреннюю цепочку рассуждений, прежде чем ответить пользователю.
Модели o1 отлично справляются с научными рассуждениями, занимая 89-е место в процентах при решении конкурсных вопросов по программированию (Codeforces), входя в число 500 лучших студентов США в отборочном туре математической олимпиады США (AIME) и превышая точность человека на уровне доктора наук при решении задач по физике, биологии и химии (GPQA).
В API доступны две модели, умеющие рассуждать:
-
o1-preview: ранняя предварительная версия нашей модели o1, разработанная для рассуждений о сложных проблемах с использованием общих знаний о мире.
-
o1-mini: более быстрая и дешевая версия o1, особенно эффективная в задачах кодирования, математики и науки, где не требуются обширные общие знания.
Модели o1 показывают значительный прогресс в рассуждениях, но они не предназначены для замены GPT-4o во всех случаях использования.
Для приложений, где требуется ввод изображений, вызов функций или стабильно быстрое время отклика, модели GPT-4o и GPT-4o mini по-прежнему будут правильным выбором. Однако если вы планируете разрабатывать приложения, требующие глубоких рассуждений и рассчитанные на более длительное время отклика, модели o1 могут стать отличным выбором. Нам не терпится увидеть, что вы создадите с их помощью!
Модели o1 в настоящее время находятся в бета-версии.
Доступ ограничен разработчиками 5-го уровня (проверьте свой уровень использования здесь), с низкими ограничениями скорости (20 RPM). Мы работаем над добавлением новых функций, увеличением ограничений по скорости и расширением доступа для большего числа разработчиков в ближайшие недели.
Быстрый запуск
И o1-preview, и o1-mini доступны через chat completions endpoint. .
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="o1-preview",
messages=[
{
"role": "user",
"content": "Write a bash script that takes a matrix represented as a string with format '[1,2],[3,4],[5,6]' and prints the transpose in the same format."
}
]
)
print(response.choices[0].message.content)
В зависимости от объема рассуждений, необходимых модели для решения проблемы, эти запросы могут занимать от нескольких секунд до нескольких минут.
Ограничения бета-версии
На этапе бета-тестирования многие параметры Chat Completions API пока недоступны. В частности:
-
Модальности: только текст, изображения не поддерживаются.
-
Типы сообщений: только сообщения пользователя и помощника, системные сообщения не поддерживаются.
-
Cтриминг: не поддерживается.
-
Инструменты: инструменты, вызов функций и параметры формата ответа не поддерживаются.
-
Логпробы: не поддерживаются.
-
Прочее: temperature, top_p и n фиксированы на 1, а presence_penalty и frequency_penalty фиксированы на 0.
-
Assistants и Batch: эти модели не поддерживаются в Assistants API и Batch API.
Мы добавим поддержку некоторых из этих параметров в ближайшие недели по мере выхода из бета-версии. Такие функции, как мультимодальность и использование инструментов, будут включены в будущие модели серии o1.
Как работают рассуждения
В моделях o1 представлены токены для рассуждений. Модели используют их, чтобы «думать», разбивая свое понимание подсказки и рассматривая несколько подходов к формулирования ответа. После генерирования токенов рассуждений модель выдает ответ в виде видимых токенов завершения и выбрасывает токены рассуждений из своего контекста.
Вот пример многоэтапного общения между пользователем и помощником. Входные и выходные токены с каждого шага переносятся, а токены рассуждений сбрасываются.
Хотя токены рассуждений не видны через API, они все равно занимают место в контекстном окне модели и называются токенами вывода.
Управление контекстным окном
Модели o1-preview и o1-mini предлагают контекстное окно из 128 000 токенов. Каждый completion имеет верхнее ограничение на максимальное количество выводимых токенов — сюда входят как невидимые токены рассуждений, так и видимые токены завершения. Максимальные ограничения на количество выводимых токенов следующие:
-
o1-preview: до 32 768 токенов
-
o1-mini: до 65 536 токенов
При создании токенов завершения важно убедиться, что в контекстном окне достаточно места для токенов рассуждений. В зависимости от сложности задачи, модели могут генерировать от нескольких сотен до десятков тысяч токенов рассуждений. Точное количество использованных токенов рассуждений можно увидеть в объекте использования объекта ответа на завершение чата в разделе completion_tokens_details:
usage: {
total_tokens: 1000,
prompt_tokens: 400,
completion_tokens: 600,
completion_tokens_details: {
reasoning_tokens: 500
}
}
Контроль затрат
Чтобы управлять затратами в моделях серии o1, вы можете ограничить общее количество генерируемых моделью токенов (включая токены рассуждения и завершения) с помощью параметра max_completion_tokens.
В предыдущих моделях параметр max_tokens контролировал как количество генерируемых токенов, так и количество токенов, видимых пользователю, которые всегда были равны. Однако в серии o1 общее количество сгенерированных токенов может превышать количество видимых токенов из-за внутренних токенов рассуждений.
Поскольку некоторые приложения могут полагаться на соответствие max_tokens количеству токенов, полученных от API, в серии o1 введено max_completion_tokens для явного контроля общего количества токенов, генерируемых моделью, включая как токены рассуждений, так и видимые токены завершения. Этот явный выбор гарантирует, что существующие приложения не будут ломаться при использовании новых моделей. Параметр max_tokens продолжает работать как и раньше для всех предыдущих моделей.
Выделения пространства для рассуждений
Если количество сгенерированных токенов достигнет предела контекстного окна или заданного вами значения max_completion_tokens, вы получите ответ о завершении работы в чате с параметром finish_reason, установленным на длину. Это может произойти до того, как будут созданы видимые токены завершения, что означает, что вы можете понести затраты на ввод и аргументацию, не получив видимого ответа.
Чтобы предотвратить это, убедитесь, что в контекстном окне достаточно места, или измените значение max_completion_tokens на более высокое. OpenAI рекомендует зарезервировать не менее 25 000 токенов для рассуждений и выводов, когда вы начинаете экспериментировать с этими моделями. По мере того как вы будете знакомиться с количеством токенов для рассуждений, требуемых вашими промптами, вы сможете соответствующим образом регулировать этот буфер.
Советы по промптингу
Эти модели лучше всего работают с прямыми промптами. Некоторые методы разработки промптов, например, промпты из нескольких кадров или указания модели «думать шаг за шагом», не только не повышают эффективность работы, но и иногда мешают ей. Вот несколько лучших практик:
-
Сохраняйте простоту и прямоту подсказок: модели прекрасно понимают и реагируют на краткие и четкие инструкции, не требующие подробных указаний.
-
Избегайте промптов в виде цепочки мыслей: поскольку эти модели проводят рассуждения внутри себя, побуждать их «думать шаг за шагом» или «объяснять свои рассуждения» не нужно.
-
Используйте разделители для ясности: используйте разделители, такие как тройные кавычки, XML-теги или названия разделов, чтобы четко обозначить отдельные части входных данных, помогая модели правильно интерпретировать различные разделы.
-
Ограничьте дополнительный контекст в генерации с расширенным поиском (RAG): предоставляя дополнительный контекст или документы, включайте только самую важную информацию, чтобы модель не усложняла свой ответ.
Примеры промптов
-
Программирование (рефакторинг)
Модели серии OpenAI o1 способны реализовывать сложные алгоритмы и производить код. В этом задании o1 предлагается рефакторить компонент React на основе определенных критериев.
from openai import OpenAI
client = OpenAI()
prompt = """
Instructions:
- Given the React component below, change it so that nonfiction books have red
text.
- Return only the code in your reply
- Do not include any additional formatting, such as markdown code blocks
- For formatting, use four space tabs, and do not allow any lines of code to
exceed 80 columns
const books = [
{ title: 'Dune', category: 'fiction', id: 1 },
{ title: 'Frankenstein', category: 'fiction', id: 2 },
{ title: 'Moneyball', category: 'nonfiction', id: 3 },
];
export default function BookList() {
const listItems = books.map(book =>
<li>
{book.title}
</li>
);
return (
<ul>{listItems}</ul>
);
}
"""
response = client.chat.completions.create(
model="o1-mini",
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": prompt
},
],
}
]
)
print(response.choices[0].message.content)
-
Программирование (planning)
Модели серии OpenAI o1 также умеют создавать многоэтапные планы. В этом примере o1 просит создать структуру файловой системы для полного решения, а также код на Python, реализующий желаемый сценарий использования.
from openai import OpenAI
client = OpenAI()
prompt = """
I want to build a Python app that takes user questions and looks them up in a
database where they are mapped to answers. If there ia close match, it retrieves
the matched answer. If there isn't, it asks the user to provide an answer and
stores the question/answer pair in the database. Make a plan for the directory
structure you'll need, then return each file in full. Only supply your reasoning
at the beginning and end, not throughout the code.
"""
response = client.chat.completions.create(
model="o1-preview",
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": prompt
},
],
}
]
)
print(response.choices[0].message.content)
-
STEM Research
Модели серии OpenAI o1 показали отличные результаты в STEM-исследованиях. Подсказки, требующие поддержки базовых исследовательских задач, должны показать высокие результаты.
from openai import OpenAI
client = OpenAI()
prompt = """
What are three compounds we should consider investigating to advance research
into new antibiotics? Why should we consider them?
"""
response = client.chat.completions.create(
model="o1-preview",
messages=[
{
"role": "user",
"content": prompt
}
]
)
print(response.choices[0].message.content)
Примеры использования
Некоторые примеры использования o1 в реальных ситуациях можно найти в cookbook.
Автор: kr23_ka