optillm es un proxy de inferencia de optimización compatible con OpenAI API que implementa varias técnicas de última generación que pueden mejorar la precisión y el rendimiento de los LLM. El enfoque actual está en implementar técnicas que mejoren el razonamiento sobre la codificación, las consultas lógicas y matemáticas. Es posible superar los modelos de frontera utilizando estas técnicas en diversas tareas realizando cálculos adicionales en el momento de la inferencia.
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
Clona el repositorio con git
y usa pip install
para configurar las dependencias.
git clone https://github.com/codelion/optillm.git
cd optillm
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Configure la variable de entorno OPENAI_API_KEY
(para OpenAI) o las variables de entorno AZURE_OPENAI_API_KEY
, AZURE_API_VERSION
y AZURE_API_BASE
(para Azure OpenAI) o las variables de entorno AZURE_API_VERSION
y AZURE_API_BASE
e inicie sesión usando az login
para Azure OpenAI con identidad administrada (consulte aquí).
Luego puede ejecutar el proxy optillm de la siguiente manera.
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
Una vez que el proxy se esté ejecutando, puede usarlo como reemplazo directo de un cliente OpenAI configurando 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 )
El código anterior se aplica tanto a OpenAI como a Azure OpenAI, solo recuerde completar la variable env OPENAI_API_KEY
con la clave adecuada. Existen múltiples formas de controlar las técnicas de optimización, se aplican en el siguiente orden de preferencia:
{slug}-model-name
. Por ejemplo, en el código anterior utilizamos moa
o una combinación de agentes como enfoque de optimización. En los registros de proxy verá lo siguiente que muestra que el moa
se ha utilizado con el modelo base 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
en 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
o en el mensaje user
, dentro de las etiquetas < 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
)
Consejo
También puedes combinar diferentes técnicas ya sea usando los símbolos &
y |
. Cuando usa &
las técnicas se procesan en el orden de izquierda a derecha en una canalización con la respuesta de la etapa anterior utilizada como solicitud para la siguiente. Mientras, con |
ejecutamos todas las solicitudes en paralelo y generamos múltiples respuestas que se devuelven como una lista.
Tenga en cuenta que la convención descrita anteriormente solo funciona cuando el servidor optillm se ha iniciado con el enfoque de inferencia configurado en auto
. De lo contrario, el atributo model
en la solicitud del cliente debe configurarse únicamente con el nombre del modelo.
Ahora admitimos a todos los proveedores de LLM (integrando el SDK de LiteLLM). Por ejemplo, puede usar el modelo Gemini Flash con moa
configurando pasar la clave api en la variable de entorno os.environ['GEMINI_API_KEY']
y luego llamando al modelo moa-gemini/gemini-1.5-flash-002
. En el resultado verá que se está utilizando LiteLLM para llamar al 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
Consejo
optillm es un proxy transparente y funcionará con cualquier API o proveedor de LLM que tenga un punto final de finalización de chat compatible con la API OpenAI y, a su vez, optillm también expone el mismo punto final de finalización de chat compatible con la API OpenAI. Esto debería permitirle integrarlo fácilmente en cualquier herramienta o marco existente. Si el LLM que desea utilizar no tiene un punto final compatible con la API OpenAI (como Google o Anthropic), puede usar el servidor proxy LiteLLM que admite la mayoría de los LLM.
El siguiente diagrama de secuencia ilustra cómo la solicitud y las respuestas pasan por optillm .
En el diagrama:
A
es una herramienta existente (como oobabooga), un marco (como patchwork) o su propio código donde desea utilizar los resultados de optillm . Puede usarlo directamente usando cualquier SDK de cliente OpenAI.B
es el servicio optillm (que se ejecuta directamente o en un contenedor acoplable) que enviará solicitudes a base_url
.C
es cualquier servicio que proporciona un punto final de finalización de chat compatible con la API OpenAI. Admitimos cargar cualquier modelo de HuggingFace o LoRA directamente en optillm . Para utilizar el servidor de inferencia integrado, establezca optillm _API_KEY
en cualquier valor (por ejemplo, export optillm _API_KEY=" optillm "
) y luego utilice el mismo en su cliente OpenAI. Puede pasar cualquier modelo de HuggingFace en el campo modelo. Si es un modelo privado, asegúrese de configurar la variable de entorno HF_TOKEN
con su clave HuggingFace. También admitimos agregar cualquier cantidad de LoRA encima del modelo usando el separador +
.
Por ejemplo, el siguiente código carga el modelo base meta-llama/Llama-3.2-1B-Instruct
y luego agrega dos LoRA en la parte superior: patched-codes/Llama-3.2-1B-FixVulns
y patched-codes/Llama-3.2-1B-FastApply
. Puede especificar qué LoRA usar usando el parámetro active_adapter
en el campo extra_args
del cliente OpenAI SDK. Por defecto cargaremos el ú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" },
)
También puede utilizar técnicas de decodificación alternativas como cot_decoding
y entropy_decoding
directamente con el servidor de inferencia 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
en un valor de marcador de posiciónexport OPENAI_API_KEY="sk-no-key"
./llama-server -c 4096 -m path_to_model
para iniciar el servidor con el modelo especificado y una longitud de contexto de 4096 tokenspython3 optillm .py --base_url base_url
para iniciar el proxypython3 optillm .py --base_url http://localhost:8080/v1
Advertencia
Tenga en cuenta que la API Anthropic, llama-server (y ollama) actualmente no admite el muestreo de múltiples respuestas de un modelo, lo que limita los enfoques disponibles a lo siguiente: cot_reflection
, leap
, plansearch
, rstar
, rto
, self_consistency
, re2
y z3
. Para los modelos en HuggingFace, puede utilizar el servidor de inferencia local integrado, ya que admite múltiples respuestas.
Acercarse | Babosa | Descripción |
---|---|---|
CoT con reflexión | cot_reflection | Implementa razonamiento en cadena de pensamiento con las secciones <pensamiento>, <reflexión> y <salida> |
PlanBuscar | plansearch | Implementa un algoritmo de búsqueda de planes candidatos para resolver un problema en lenguaje natural. |
Releer | re2 | Implementa la relectura para mejorar el razonamiento procesando consultas dos veces. |
Autoconsistencia | self_consistency | Implementa un método avanzado de autoconsistencia. |
Solucionador Z3 | z3 | Utiliza el demostrador del teorema Z3 para el razonamiento lógico. |
Algoritmo R* | rstar | Implementa el algoritmo R* para la resolución de problemas. |
SALTO | leap | Aprende principios específicos de tareas a partir de algunos ejemplos de tomas. |
Optimización del viaje de ida y vuelta | rto | Optimiza las respuestas a través de un proceso de ida y vuelta |
Lo mejor del muestreo N | bon | Genera múltiples respuestas y selecciona la mejor. |
Mezcla de agentes | moa | Combina respuestas de múltiples críticas. |
Búsqueda de árboles de Montecarlo | mcts | Utiliza MCTS para la toma de decisiones en las respuestas del chat. |
Juego fotovoltaico | pvg | Aplica un enfoque de juego de probador-verificador en el momento de la inferencia. |
Decodificación CoT | N/A para proxy | Implementa la decodificación de la cadena de pensamiento para provocar el razonamiento sin indicaciones explícitas. |
Decodificación de entropía | N/A para proxy | Implementa muestreo adaptativo basado en la incertidumbre de los tokens durante la generación. |
Complemento | Babosa | Descripción |
---|---|---|
Enrutador | router | Utiliza el modelo optillm -bert-uncased para enrutar solicitudes a diferentes enfoques según el mensaje del usuario. |
Cadena de código | coc | Implementa un enfoque de cadena de código que combina CoT con ejecución de código y simulación de código basada en LLM. |
Memoria | memory | Implementa una capa de memoria a corto plazo, le permite utilizar una longitud de contexto ilimitada con cualquier LLM |
Privacidad | privacy | Anonimizar los datos de PII en la solicitud y desanonimizarlos nuevamente al valor original en respuesta |
Leer URL | readurls | Lee todas las URL encontradas en la solicitud, busca el contenido en la URL y lo agrega al contexto |
Ejecutar código | executecode | Permite el uso del intérprete de código para ejecutar código Python en solicitudes y respuestas generadas por LLM. |
optillm admite varios argumentos de línea de comandos y variables de entorno para la configuración.
Parámetro | Descripción | Valor predeterminado |
---|---|---|
--approach | Enfoque de inferencia para usar | "auto" |
--simulations | Número de simulaciones MCTS | 2 |
--exploration | Peso de exploración para MCTS | 0,2 |
--depth | Profundidad de simulación para MCTS | 1 |
--best-of-n | Número de muestras para el enfoque best_of_n | 3 |
--model | Modelo OpenAI a utilizar | "gpt-4o-mini" |
--base-url | URL base para el punto final compatible con OpenAI | "" |
--rstar-max-depth | Profundidad máxima para el algoritmo rStar | 3 |
--rstar-num-rollouts | Número de implementaciones del algoritmo rStar | 5 |
--rstar-c | Constante de exploración para el algoritmo rStar | 1.4 |
--n | Número de respuestas finales que se devolverán | 1 |
--return-full-response | Devolver la respuesta completa, incluido el CoT con etiquetas | False |
--port | Especifique el puerto para ejecutar el proxy | 8000 |
-- optillm -api-key | Clave API opcional para la autenticación del cliente para optillm | "" |
Cuando se utiliza Docker, estas se pueden configurar como variables de entorno con el prefijo optillm _
.
optillm opcionalmente se puede compilar y ejecutar usando Docker y el Dockerfile proporcionado.
Asegúrese de tener Docker y Docker Compose instalados en su sistema.
Actualice las variables de entorno en el archivo docker-compose.yaml o cree un archivo .env
en el directorio raíz del proyecto y agregue las variables de entorno que desee configurar. Por ejemplo, para configurar la clave API de OpenAI, agregue la siguiente línea al archivo .env
:
OPENAI_API_KEY=your_openai_api_key_here
Ejecute el siguiente comando para iniciar optillm :
docker compose up -d
Esto creará la imagen de Docker si no existe e iniciará el servicio optillm .
optillm estará disponible en http://localhost:8000
.
Al utilizar Docker, puede configurar estos parámetros como variables de entorno. Por ejemplo, para establecer el enfoque y el modelo, utilizaría:
optillm _APPROACH=mcts
optillm _MODEL=gpt-4
Para proteger el proxy optillm con una clave API, configure la variable de entorno optillm _API_KEY
:
optillm _API_KEY=your_secret_api_key
Cuando se establece la clave API, los clientes deben incluirla en sus solicitudes utilizando el encabezado Authorization
:
Authorization: Bearer your_secret_api_key
Modelo | Puntaje |
---|---|
o1-mini | 56,67 |
coc-claude-3-5-soneto-20241022 | 46,67 |
coc-géminis/géminis-exp-1121 | 46,67 |
o1-vista previa | 40.00 |
geminis-exp-1114 | 36,67 |
claude-3-5-soneto-20241022 | 20.00 |
geminis-1.5-pro-002 | 20.00 |
geminis-1.5-flash-002 | 16,67 |
Modelo | Exactitud |
---|---|
lecturas y memoria-gpt-4o-mini | 61,29 |
gpt-4o-mini | 50,61 |
lecturas y memoria-Gemma2-9b | 30.1 |
gemma2-9b | 5.1 |
gemma2-27b | 30,8 |
Flash Géminis 1.5 | 66,5 |
Géminis Pro 1.5 | 72,9 |
Modelo | pase@1 | pase@5 | pase@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 |
Dado que optillm es un reemplazo directo de la API de OpenAI, puede integrarlo fácilmente con herramientas y marcos existentes utilizando el cliente OpenAI. Usamos optillm con patchwork, que es un marco de código abierto que automatiza el trabajo duro de desarrollo, como revisiones de relaciones públicas, corrección de errores y parches de seguridad mediante flujos de trabajo llamados flujos de parches. Vimos enormes ganancias de rendimiento en todos los flujos de parches admitidos, como se muestra a continuación, cuando utilizamos el enfoque de mezcla de agentes (moa).