optillm — это оптимизирующий прокси-сервер вывода, совместимый с OpenAI API, который реализует несколько современных методов, которые могут повысить точность и производительность LLM. В настоящее время основное внимание уделяется реализации методов, которые улучшают рассуждения при кодировании, логических и математических запросах. Используя эти методы в различных задачах, можно превзойти передовые модели, выполняя дополнительные вычисления во время вывода.
pip install optillm
optillm
2024-10-22 07:45:05,612 - INFO - Loaded plugin: privacy
2024-10-22 07:45:06,293 - INFO - Loaded plugin: memory
2024-10-22 07:45:06,293 - INFO - Starting server with approach: auto
Клонируйте репозиторий с помощью git
и используйте pip install
для настройки зависимостей.
git clone https://github.com/codelion/optillm.git
cd optillm
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Настройте переменную среды OPENAI_API_KEY
(для OpenAI) или переменные среды AZURE_OPENAI_API_KEY
, AZURE_API_VERSION
и AZURE_API_BASE
(для Azure OpenAI) или переменные среды AZURE_API_VERSION
и AZURE_API_BASE
и войдите в систему, используя az login
для Azure OpenAI с управляемым удостоверением (см. здесь).
Затем вы можете запустить прокси-сервер optillm следующим образом.
python optillm .py
2024-09-06 07:57:14,191 - INFO - Starting server with approach: auto
2024-09-06 07:57:14,191 - INFO - Server configuration: { ' approach ' : ' auto ' , ' mcts_simulations ' : 2, ' mcts_exploration ' : 0.2, ' mcts_depth ' : 1, ' best_of_n ' : 3, ' model ' : ' gpt-4o-mini ' , ' rstar_max_depth ' : 3, ' rstar_num_rollouts ' : 5, ' rstar_c ' : 1.4, ' base_url ' : ' ' }
* Serving Flask app ' optillm '
* Debug mode: off
2024-09-06 07:57:14,212 - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:8000
* Running on http://192.168.10.48:8000
2024-09-06 07:57:14,212 - INFO - Press CTRL+C to quit
После запуска прокси-сервера вы можете использовать его в качестве замены клиента OpenAI, установив для base_url
значение http://localhost:8000/v1
.
import os
from openai import OpenAI
OPENAI_KEY = os . environ . get ( "OPENAI_API_KEY" )
OPENAI_BASE_URL = "http://localhost:8000/v1"
client = OpenAI ( api_key = OPENAI_KEY , base_url = OPENAI_BASE_URL )
response = client . chat . completions . create (
model = "moa-gpt-4o" ,
messages = [
{
"role" : "user" ,
"content" : "Write a Python program to build an RL model to recite text from any position that the user provides, using only numpy."
}
],
temperature = 0.2
)
print ( response )
Приведенный выше код применим как к OpenAI, так и к Azure OpenAI, просто не забудьте заполнить переменную env OPENAI_API_KEY
правильным ключом. Существует несколько способов управления методами оптимизации, они применяются в следующем порядке предпочтения:
{slug}-model-name
. Например, в приведенном выше коде мы используем moa
или смесь агентов в качестве подхода к оптимизации. В журналах прокси-сервера вы увидите следующее, показывающее, что moa
использовался с базовой моделью как gpt-4o-mini
. 2024-09-06 08:35:32,597 - INFO - Using approach moa, with gpt-4o-mini
2024-09-06 08:35:35,358 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions " HTTP/1.1 200 OK "
2024-09-06 08:35:39,553 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions " HTTP/1.1 200 OK "
2024-09-06 08:35:44,795 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions " HTTP/1.1 200 OK "
2024-09-06 08:35:44,797 - INFO - 127.0.0.1 - - [06/Sep/2024 08:35:44] " POST /v1/chat/completions HTTP/1.1 " 200 -
optillm _approach
в extra_body
. response = client.chat.completions.create(
model= " gpt-4o-mini " ,
messages=[{ " role " : " user " , " content " : " " }],
temperature=0.2,
extra_body={ " optillm _approach " : " bon|moa|mcts " }
)
system
или в user
строке внутри тегов < optillm _approach> </ optillm _approach>
. response = client.chat.completions.create(
model= " gpt-4o-mini " ,
messages=[{ " role " : " user " , " content " : " < optillm _approach>re2</ optillm _approach> How many r's are there in strawberry? " }],
temperature=0.2
)
Кончик
Вы также можете комбинировать различные методы, используя символы &
и |
. При использовании &
методы обрабатываются в конвейере в порядке слева направо, при этом ответ от предыдущего этапа используется в качестве запроса к следующему. В то время как с |
мы запускаем все запросы параллельно и генерируем несколько ответов, которые возвращаются в виде списка.
Обратите внимание, что описанное выше соглашение работает только в том случае, если сервер optillm запущен с auto
подходом к выводу. В противном случае атрибут model
в клиентском запросе должен быть установлен только с именем модели.
Теперь мы поддерживаем всех поставщиков LLM (путем использования LiteLLM SDK). Например, вы можете использовать модель Gemini Flash с moa
, установив передачу ключа API в переменной среды os.environ['GEMINI_API_KEY']
и затем вызвав модель moa-gemini/gemini-1.5-flash-002
. В выводе вы увидите, что LiteLLM используется для вызова базовой модели.
9:43:21 - LiteLLM:INFO: utils.py:2952 -
LiteLLM completion () model= gemini-1.5-flash-002; provider = gemini
2024-09-29 19:43:21,011 - INFO -
LiteLLM completion () model= gemini-1.5-flash-002; provider = gemini
2024-09-29 19:43:21,481 - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-002:generateContent ? key=[redacted] " HTTP/1.1 200 OK "
19:43:21 - LiteLLM:INFO: utils.py:988 - Wrapper: Completed Call, calling success_handler
2024-09-29 19:43:21,483 - INFO - Wrapper: Completed Call, calling success_handler
19:43:21 - LiteLLM:INFO: utils.py:2952 -
LiteLLM completion () model= gemini-1.5-flash-002; provider = gemini
Кончик
optillm — это прозрачный прокси-сервер, который будет работать с любым API-интерфейсом LLM или провайдером, у которого есть конечная точка завершения чата, совместимая с OpenAI API, и, в свою очередь, optillm также предоставляет ту же конечную точку завершения чата, совместимую с OpenAI API. Это должно позволить вам легко интегрировать его в любые существующие инструменты или платформы. Если LLM, который вы хотите использовать, не имеет конечной точки, совместимой с OpenAI API (например, Google или Anthropic), вы можете использовать прокси-сервер LiteLLM, который поддерживает большинство LLM.
Следующая диаграмма последовательности иллюстрирует, как запросы и ответы проходят через optillm .
На схеме:
A
— это существующий инструмент (например, oobabooga), фреймворк (например, patchwork) или ваш собственный код, в котором вы хотите использовать результаты optillm . Вы можете использовать его напрямую, используя любой клиентский SDK OpenAI.B
— это служба optillm (работающая напрямую или в Docker-контейнере), которая будет отправлять запросы к base_url
.C
— это любая служба, предоставляющая конечную точку завершения чата, совместимую с OpenAI API. Мы поддерживаем загрузку любой модели HuggingFace или LoRA непосредственно в optillm . Чтобы использовать встроенный сервер вывода, установите для optillm _API_KEY
любое значение (например, export optillm _API_KEY=" optillm "
), а затем используйте его в своем клиенте OpenAI. Вы можете передать любую модель HuggingFace в поле модели. Если это частная модель, убедитесь, что вы установили переменную среды HF_TOKEN
с помощью ключа HuggingFace. Мы также поддерживаем добавление любого количества LoRA поверх модели с помощью разделителя +
.
Например, следующий код загружает базовую модель meta-llama/Llama-3.2-1B-Instruct
, а затем добавляет сверху два LoRA — patched-codes/Llama-3.2-1B-FixVulns
и patched-codes/Llama-3.2-1B-FastApply
. Вы можете указать, какой LoRA использовать, используя параметр active_adapter
в поле extra_args
клиента OpenAI SDK. По умолчанию мы загрузим последний указанный адаптер.
OPENAI_BASE_URL = "http://localhost:8000/v1"
OPENAI_KEY = " optillm "
response = client . chat . completions . create (
model = "meta-llama/Llama-3.2-1B-Instruct+patched-codes/Llama-3.2-1B-FastApply+patched-codes/Llama-3.2-1B-FixVulns" ,
messages = messages ,
temperature = 0.2 ,
logprobs = True ,
top_logprobs = 3 ,
extra_body = { "active_adapter" : "patched-codes/Llama-3.2-1B-FastApply" },
)
Вы также можете использовать альтернативные методы декодирования, такие как cot_decoding
и entropy_decoding
непосредственно с локальным сервером вывода.
response = client . chat . completions . create (
model = "meta-llama/Llama-3.2-1B-Instruct" ,
messages = messages ,
temperature = 0.2 ,
extra_body = {
"decoding" : "cot_decoding" , # or "entropy_decoding"
# CoT specific params
"k" : 10 ,
"aggregate_paths" : True ,
# OR Entropy specific params
"top_k" : 27 ,
"min_p" : 0.03 ,
}
)
OPENAI_API_KEY
значение заполнителя.export OPENAI_API_KEY="sk-no-key"
./llama-server -c 4096 -m path_to_model
чтобы запустить сервер с указанной моделью и длиной контекста 4096 токенов.python3 optillm .py --base_url base_url
чтобы запустить прокси.python3 optillm .py --base_url http://localhost:8080/v1
Предупреждение
Обратите внимание, что Anthropic API, llama-server (и ollama) в настоящее время не поддерживает выборку нескольких ответов из модели, что ограничивает доступные подходы следующими: cot_reflection
, leap
, plansearch
, rstar
, rto
, self_consistency
, re2
и z3
. Для моделей на HuggingFace вы можете использовать встроенный локальный сервер вывода, поскольку он поддерживает несколько ответов.
Подход | Слизень | Описание |
---|---|---|
ЦТ с отражением | cot_reflection | Реализует цепочку мыслей с разделами <thinking>, <reflection> и <output>. |
ПланПоиск | plansearch | Реализует алгоритм поиска по планам-кандидатам для решения проблемы на естественном языке. |
Перечитать | re2 | Реализует перечитывание для улучшения рассуждений путем двойной обработки запросов. |
Самосогласованность | self_consistency | Реализует расширенный метод самосогласованности |
Z3 Решатель | z3 | Использует средство доказательства теоремы Z3 для логических рассуждений. |
R* Алгоритм | rstar | Реализует алгоритм R* для решения проблем |
ПРЫГНУТЬ | leap | Изучает принципы работы с конкретными задачами на нескольких примерах. |
Оптимизация туда и обратно | rto | Оптимизирует ответы посредством двустороннего процесса |
Лучшее из N выборки | bon | Генерирует несколько ответов и выбирает лучший |
Смесь агентов | moa | Объединяет ответы от нескольких критических замечаний |
Поиск по дереву Монте-Карло | mcts | Использует MCTS для принятия решений в ответах в чате. |
PV-игра | pvg | Применяет игровой подход «доказывающее-проверяющее» во время вывода |
Декодирование CoT | Н/Д для прокси | Реализует декодирование цепочки мыслей для получения рассуждений без явных подсказок. |
Энтропийное декодирование | Н/Д для прокси | Реализует адаптивную выборку, основанную на неопределенности токенов во время генерации. |
Плагин | Слизень | Описание |
---|---|---|
Маршрутизатор | router | Использует модель optillm -bert-uncased для маршрутизации запросов к различным подходам на основе запроса пользователя. |
Цепочка кода | coc | Реализует подход цепочки кода, который сочетает CoT с выполнением кода и моделированием кода на основе LLM. |
Память | memory | Реализует уровень кратковременной памяти, позволяет использовать неограниченную длину контекста с любым LLM. |
Конфиденциальность | privacy | Анонимизировать данные PII в запросе и деанонимизировать их до исходного значения в ответе. |
Чтение URL-адресов | readurls | Считывает все URL-адреса, найденные в запросе, извлекает содержимое по URL-адресу и добавляет его в контекст. |
Выполнить код | executecode | Позволяет использовать интерпретатор кода для выполнения кода Python в запросах и ответах, генерируемых LLM. |
optillm поддерживает различные аргументы командной строки и переменные среды для настройки.
Параметр | Описание | Значение по умолчанию |
---|---|---|
--approach | Подход к использованию | "auto" |
--simulations | Количество симуляций MCTS | 2 |
--exploration | Вес разведки для MCTS | 0,2 |
--depth | Глубина моделирования для MCTS | 1 |
--best-of-n | Количество образцов для подхода best_of_n | 3 |
--model | Модель OpenAI для использования | "gpt-4o-mini" |
--base-url | Базовый URL-адрес для конечной точки, совместимой с OpenAI | "" |
--rstar-max-depth | Максимальная глубина для алгоритма rStar | 3 |
--rstar-num-rollouts | Количество внедрений алгоритма rStar | 5 |
--rstar-c | Константа исследования для алгоритма rStar | 1,4 |
--n | Количество окончательных ответов, которые будут возвращены | 1 |
--return-full-response | Вернуть полный ответ, включая CoT с тегами. | False |
--port | Укажите порт для запуска прокси | 8000 |
-- optillm -api-key | Дополнительный ключ API для аутентификации клиента в optillm | "" |
При использовании Docker их можно установить как переменные среды с префиксом optillm _
.
optillm при желании можно собрать и запустить с помощью Docker и предоставленного файла Dockerfile.
Убедитесь, что в вашей системе установлены Docker и Docker Compose.
Либо обновите переменные среды в файле docker-compose.yaml, либо создайте файл .env
в корневом каталоге проекта и добавьте любые переменные среды, которые вы хотите установить. Например, чтобы установить ключ API OpenAI, добавьте в файл .env
следующую строку:
OPENAI_API_KEY=your_openai_api_key_here
Выполните следующую команду, чтобы запустить optillm :
docker compose up -d
Это создаст образ Docker, если он не существует, и запустит службу optillm .
optillm будет доступен по адресу http://localhost:8000
.
При использовании Docker вы можете установить эти параметры как переменные среды. Например, чтобы установить подход и модель, вы должны использовать:
optillm _APPROACH=mcts
optillm _MODEL=gpt-4
Чтобы защитить прокси-сервер optillm с помощью ключа API, установите переменную среды optillm _API_KEY
:
optillm _API_KEY=your_secret_api_key
Когда ключ API установлен, клиенты должны включать его в свои запросы, используя заголовок Authorization
:
Authorization: Bearer your_secret_api_key
Модель | Счет |
---|---|
о1-мини | 56,67 |
coc-claude-3-5-sonnet-20241022 | 46,67 |
coc-gemini/gemini-exp-1121 | 46,67 |
o1-превью | 40.00 |
Близнецы-exp-1114 | 36,67 |
Клод-3-5-сонет-20241022 | 20.00 |
Близнецы-1.5-про-002 | 20.00 |
Близнецы-1.5-вспышка-002 | 16,67 |
Модель | Точность |
---|---|
readurls&memory-gpt-4o-mini | 61,29 |
gpt-4o-мини | 50,61 |
readurls&memory-Gemma2-9b | 30,1 |
Джемма2-9b | 5.1 |
Джемма2-27б | 30,8 |
Близнецы Флэш 1.5 | 66,5 |
Близнецы Про 1.5 | 72,9 |
Модель | пройти@1 | пройти@5 | пройти@10 |
---|---|---|---|
plansearch-gpt-4o-mini | 44.03 | 59.31 | 63,5 |
gpt-4o-мини | 43,9 | 50,61 | 53,25 |
Клод-3.5-сонет | 51,3 | ||
gpt-4o-13 мая 2024 г. | 45,2 | ||
gpt-4-турбо-09.04.2024 | 44,2 |
Поскольку optillm является полной заменой OpenAI API, вы можете легко интегрировать его с существующими инструментами и платформами с помощью клиента OpenAI. Мы использовали optillm с patchwork — фреймворком с открытым исходным кодом, который автоматизирует рутинную работу по разработке, такую как PR-просмотры, исправление ошибок, исправления безопасности, используя рабочие процессы, называемые потоками исправлений. Мы увидели огромный прирост производительности во всех поддерживаемых потоках исправлений, как показано ниже, при использовании подхода с использованием смеси агентов (moa).