optillm é um proxy de inferência de otimização compatível com OpenAI API que implementa várias técnicas de última geração que podem melhorar a precisão e o desempenho de LLMs. O foco atual está na implementação de técnicas que melhorem o raciocínio sobre codificação e consultas lógicas e matemáticas. É possível superar os modelos de fronteira usando essas técnicas em diversas tarefas, fazendo cálculos adicionais no momento da inferência.
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
Clone o repositório com git
e use pip install
para configurar as dependências.
git clone https://github.com/codelion/optillm.git
cd optillm
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Configure a variável de ambiente OPENAI_API_KEY
(para OpenAI) ou as variáveis de ambiente AZURE_OPENAI_API_KEY
, AZURE_API_VERSION
e AZURE_API_BASE
(para Azure OpenAI) ou as variáveis de ambiente AZURE_API_VERSION
e AZURE_API_BASE
e faça login usando az login
para Azure OpenAI com identidade gerenciada (veja aqui).
Você pode então executar o proxy optillm da seguinte maneira.
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
Depois que o proxy estiver em execução, você poderá usá-lo como um substituto para um cliente OpenAI, definindo o base_url
como 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 )
O código acima se aplica ao OpenAI e ao Azure OpenAI, apenas lembre-se de preencher a variável env OPENAI_API_KEY
com a chave adequada. Existem múltiplas formas de controlar as técnicas de otimização, elas são aplicadas na seguinte ordem de preferência:
{slug}-model-name
. Por exemplo, no código acima estamos usando moa
ou mistura de agentes como abordagem de otimização. Nos logs do proxy, você verá o seguinte mostrando que o moa
está sendo usado com o modelo básico como 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
em 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
ou no prompt user
, nas tags < 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
)
Dica
Você também pode combinar diferentes técnicas usando símbolos &
e |
. Quando você usa &
as técnicas são processadas na ordem da esquerda para a direita em um pipeline com a resposta do estágio anterior usada como solicitação para o próximo. Enquanto, com |
executamos todas as solicitações em paralelo e geramos múltiplas respostas que são retornadas como uma lista.
Observe que a convenção descrita acima funciona somente quando o servidor optillm foi iniciado com a abordagem de inferência definida como auto
. Caso contrário, o atributo model
na solicitação do cliente deverá ser configurado apenas com o nome do modelo.
Agora oferecemos suporte a todos os provedores LLM (envolvendo o SDK LiteLLM). Por exemplo, você pode usar o modelo Gemini Flash com moa
definindo a passagem da chave de API na variável de ambiente os.environ['GEMINI_API_KEY']
e depois chamando o modelo moa-gemini/gemini-1.5-flash-002
. Na saída você verá que LiteLLM está sendo usado para chamar o modelo base.
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
Dica
optillm é um proxy transparente e funcionará com qualquer API ou provedor LLM que tenha um ponto final de conclusão de bate-papo compatível com API OpenAI e, por sua vez, optillm também expõe o mesmo ponto final de conclusão de bate-papo compatível com API OpenAI. Isso deve permitir que você o integre facilmente a quaisquer ferramentas ou estruturas existentes. Se o LLM que você deseja usar não tiver um endpoint compatível com a API OpenAI (como Google ou Anthropic), você poderá usar o servidor proxy LiteLLM que suporta a maioria dos LLMs.
O diagrama de sequência a seguir ilustra como a solicitação e as respostas passam pelo optillm .
No diagrama:
A
é uma ferramenta existente (como oobabooga), uma estrutura (como patchwork) ou seu próprio código onde você deseja usar os resultados do optillm . Você pode usá-lo diretamente usando qualquer SDK cliente OpenAI.B
é o serviço optillm (executando diretamente ou em um contêiner docker) que enviará solicitações para base_url
.C
é qualquer serviço que forneça um endpoint de conclusão de bate-papo compatível com a API OpenAI. Apoiamos o carregamento de qualquer modelo HuggingFace ou LoRA diretamente no optillm . Para usar o servidor de inferência integrado, defina optillm _API_KEY
para qualquer valor (por exemplo, export optillm _API_KEY=" optillm "
) e use o mesmo em seu cliente OpenAI. Você pode passar qualquer modelo HuggingFace no campo modelo. Se for um modelo privado, certifique-se de definir a variável de ambiente HF_TOKEN
com sua chave HuggingFace. Também oferecemos suporte à adição de qualquer número de LoRAs no topo do modelo usando o separador +
.
Por exemplo, o código a seguir carrega o modelo base meta-llama/Llama-3.2-1B-Instruct
e, em seguida, adiciona dois LoRAs na parte superior - patched-codes/Llama-3.2-1B-FixVulns
e patched-codes/Llama-3.2-1B-FastApply
. Você pode especificar qual LoRA usar usando o parâmetro active_adapter
no campo extra_args
do cliente OpenAI SDK. Por padrão, carregaremos o último adaptador especificado.
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" },
)
Você também pode usar técnicas de decodificação alternativas como cot_decoding
e entropy_decoding
diretamente com o servidor de inferência local.
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
como um valor de espaço reservadoexport OPENAI_API_KEY="sk-no-key"
./llama-server -c 4096 -m path_to_model
para iniciar o servidor com o modelo especificado e um comprimento de contexto de 4.096 tokenspython3 optillm .py --base_url base_url
para iniciar o proxypython3 optillm .py --base_url http://localhost:8080/v1
Aviso
Observe que a API Anthropic, llama-server (e ollama) atualmente não oferece suporte à amostragem de múltiplas respostas de um modelo, o que limita as abordagens disponíveis ao seguinte: cot_reflection
, leap
, plansearch
, rstar
, rto
, self_consistency
, re2
e z3
. Para modelos no HuggingFace, você pode usar o servidor de inferência local integrado, pois ele suporta múltiplas respostas.
Abordagem | Lesma | Descrição |
---|---|---|
CoT com Reflexão | cot_reflection | Implementa o raciocínio em cadeia de pensamento com seções <thinking>, <reflection> e <output> |
PlanSearch | plansearch | Implementa um algoritmo de busca sobre planos candidatos para resolver um problema em linguagem natural |
Reler | re2 | Implementa a releitura para melhorar o raciocínio, processando as consultas duas vezes |
Autoconsistência | self_consistency | Implementa um método avançado de autoconsistência |
Solucionador Z3 | z3 | Utiliza o provador de teorema Z3 para raciocínio lógico |
Algoritmo R* | rstar | Implementa o algoritmo R* para resolução de problemas |
SALTO | leap | Aprende princípios específicos de tarefas a partir de alguns exemplos de cenas |
Otimização de ida e volta | rto | Otimiza as respostas por meio de um processo de ida e volta |
Melhor de N Amostragem | bon | Gera múltiplas respostas e seleciona a melhor |
Mistura de Agentes | moa | Combina respostas de múltiplas críticas |
Pesquisa de árvore de Monte Carlo | mcts | Usa MCTS para tomada de decisão em respostas de chat |
Jogo PV | pvg | Aplica uma abordagem de jogo provador-verificador no momento da inferência |
Decodificação CoT | N/A para proxy | Implementa decodificação de cadeia de pensamento para extrair raciocínio sem solicitação explícita |
Decodificação de Entropia | N/A para proxy | Implementa amostragem adaptativa com base na incerteza dos tokens durante a geração |
Plug-in | Lesma | Descrição |
---|---|---|
Roteador | router | Usa o modelo optillm -bert-uncased para rotear solicitações para diferentes abordagens com base no prompt do usuário |
Cadeia de Código | coc | Implementa uma abordagem de cadeia de código que combina CoT com execução de código e simulação de código baseada em LLM |
Memória | memory | Implementa uma camada de memória de curto prazo, permite usar comprimento de contexto ilimitado com qualquer LLM |
Privacidade | privacy | Anonimize os dados PII solicitados e desanonimize-os de volta ao valor original em resposta |
Ler URLs | readurls | Lê todos os URLs encontrados na solicitação, busca o conteúdo do URL e o adiciona ao contexto |
Executar código | executecode | Permite o uso de interpretador de código para executar código python em solicitações e respostas geradas pelo LLM |
optillm suporta vários argumentos de linha de comando e variáveis de ambiente para configuração.
Parâmetro | Descrição | Valor padrão |
---|---|---|
--approach | Abordagem de inferência a ser usada | "auto" |
--simulations | Número de simulações MCTS | 2 |
--exploration | Peso de exploração para MCTS | 0,2 |
--depth | Profundidade de simulação para MCTS | 1 |
--best-of-n | Número de amostras para abordagem best_of_n | 3 |
--model | Modelo OpenAI para usar | "gpt-4o-mini" |
--base-url | URL base para endpoint compatível com OpenAI | "" |
--rstar-max-depth | Profundidade máxima para algoritmo rStar | 3 |
--rstar-num-rollouts | Número de implementações do algoritmo rStar | 5 |
--rstar-c | Constante de exploração para algoritmo rStar | 1.4 |
--n | Número de respostas finais a serem retornadas | 1 |
--return-full-response | Retorne a resposta completa incluindo o CoT com tags | False |
--port | Especifique a porta para executar o proxy | 8.000 |
-- optillm -api-key | Chave de API opcional para autenticação de cliente para optillm | "" |
Ao usar o Docker, elas podem ser definidas como variáveis de ambiente prefixadas com optillm _
.
optillm pode opcionalmente ser construído e executado usando Docker e o Dockerfile fornecido.
Certifique-se de ter o Docker e o Docker Compose instalados em seu sistema.
Atualize as variáveis de ambiente no arquivo docker-compose.yaml ou crie um arquivo .env
no diretório raiz do projeto e adicione quaisquer variáveis de ambiente que você deseja definir. Por exemplo, para definir a chave da API OpenAI, adicione a seguinte linha ao arquivo .env
:
OPENAI_API_KEY=your_openai_api_key_here
Execute o seguinte comando para iniciar optillm :
docker compose up -d
Isso criará a imagem do Docker, se ela não existir, e iniciará o serviço optillm .
optillm estará disponível em http://localhost:8000
.
Ao usar o Docker, você pode definir esses parâmetros como variáveis de ambiente. Por exemplo, para definir a abordagem e o modelo, você usaria:
optillm _APPROACH=mcts
optillm _MODEL=gpt-4
Para proteger o proxy optillm com uma chave de API, defina a variável de ambiente optillm _API_KEY
:
optillm _API_KEY=your_secret_api_key
Quando a chave de API é definida, os clientes devem incluí-la em suas solicitações usando o cabeçalho Authorization
:
Authorization: Bearer your_secret_api_key
Modelo | Pontuação |
---|---|
o1-mini | 56,67 |
coc-claude-3-5-soneto-20241022 | 46,67 |
coc-gemini/gemini-exp-1121 | 46,67 |
o1-visualização | 40,00 |
gêmeo-exp-1114 | 36,67 |
claude-3-5-soneto-20241022 | 20h00 |
gemini-1.5-pro-002 | 20h00 |
gemini-1.5-flash-002 | 16,67 |
Modelo | Precisão |
---|---|
readurls&memory-gpt-4o-mini | 61,29 |
gpt-4o-mini | 50,61 |
readurls&memory-Gemma2-9b | 30.1 |
Gemma2-9b | 5.1 |
Gemma2-27b | 30,8 |
Gêmeos Flash 1.5 | 66,5 |
Gêmeos Pro 1.5 | 72,9 |
Modelo | passar@1 | passar@5 | passar@10 |
---|---|---|---|
plansearch-gpt-4o-mini | 44.03 | 59,31 | 63,5 |
gpt-4o-mini | 43,9 | 50,61 | 53,25 |
claude-3.5-soneto | 51.3 | ||
gpt-4o-2024-05-13 | 45,2 | ||
gpt-4-turbo-2024-04-09 | 44,2 |
Como optillm é um substituto imediato para a API OpenAI, você pode integrá-lo facilmente com ferramentas e estruturas existentes usando o cliente OpenAI. Usamos optillm com patchwork, que é uma estrutura de código aberto que automatiza trabalhos pesados de desenvolvimento, como análises de relações públicas, correção de bugs e patches de segurança usando fluxos de trabalho chamados patchflows. Vimos enormes ganhos de desempenho em todos os patchflows suportados, conforme mostrado abaixo, ao usar a abordagem de mistura de agentes (moa).