optillm est un proxy d'inférence d'optimisation compatible avec l'API OpenAI qui implémente plusieurs techniques de pointe qui peuvent améliorer la précision et les performances des LLM. L’accent est actuellement mis sur la mise en œuvre de techniques qui améliorent le raisonnement sur les requêtes de codage, logiques et mathématiques. Il est possible de battre les modèles frontières en utilisant ces techniques pour diverses tâches en effectuant des calculs supplémentaires au moment de l'inférence.
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
Clonez le référentiel avec git
et utilisez pip install
pour configurer les dépendances.
git clone https://github.com/codelion/optillm.git
cd optillm
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Configurez la variable d'environnement OPENAI_API_KEY
(pour OpenAI) ou les variables d'environnement AZURE_OPENAI_API_KEY
, AZURE_API_VERSION
et AZURE_API_BASE
(pour Azure OpenAI) ou les variables d'environnement AZURE_API_VERSION
et AZURE_API_BASE
et connectez-vous à l'aide az login
pour Azure OpenAI avec identité managée (voir ici).
Vous pouvez ensuite exécuter le proxy optillm comme suit.
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
Une fois le proxy exécuté, vous pouvez l'utiliser en remplacement d'un client OpenAI en définissant l' base_url
sur 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 )
Le code ci-dessus s'applique à la fois à OpenAI et à Azure OpenAI, n'oubliez pas de remplir la variable d'environnement OPENAI_API_KEY
avec la clé appropriée. Il existe plusieurs façons de contrôler les techniques d'optimisation, elles sont appliquées dans l'ordre de préférence suivant :
{slug}-model-name
. Par exemple, dans le code ci-dessus, nous utilisons moa
ou un mélange d'agents comme approche d'optimisation. Dans les journaux proxy, vous verrez ce qui suit montrant que le moa
a été utilisé avec le modèle de base comme 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
du 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 dans l'invite user
, dans les balises < 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
)
Conseil
Vous pouvez également combiner différentes techniques en utilisant les symboles &
et |
. Lorsque vous utilisez &
les techniques sont traitées dans l'ordre de gauche à droite dans un pipeline avec la réponse de l'étape précédente utilisée comme requête à la suivante. Tandis que, avec |
nous exécutons toutes les requêtes en parallèle et générons plusieurs réponses qui sont renvoyées sous forme de liste.
Veuillez noter que la convention décrite ci-dessus ne fonctionne que lorsque le serveur optillm a été démarré avec l'approche d'inférence définie sur auto
. Sinon, l'attribut model
dans la demande du client doit être défini uniquement avec le nom du modèle.
Nous prenons désormais en charge tous les fournisseurs LLM (en enveloppant le SDK LiteLLM). Par exemple, vous pouvez utiliser le modèle Gemini Flash avec moa
en définissant en passant la clé API dans la variable d'environnement os.environ['GEMINI_API_KEY']
puis en appelant le modèle moa-gemini/gemini-1.5-flash-002
. Dans le résultat, vous verrez alors que LiteLLM est utilisé pour appeler le modèle de 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
Conseil
optillm est un proxy transparent et fonctionnera avec n'importe quelle API ou fournisseur LLM disposant d'un point de terminaison de complétion de chat compatible avec l'API OpenAI, et à son tour, optillm expose également le même point de terminaison de complétion de chat compatible avec l'API OpenAI. Cela devrait vous permettre de l’intégrer facilement dans n’importe quel outil ou framework existant. Si le LLM que vous souhaitez utiliser n'a pas de point de terminaison compatible avec l'API OpenAI (comme Google ou Anthropic), vous pouvez utiliser le serveur proxy LiteLLM qui prend en charge la plupart des LLM.
Le diagramme de séquence suivant illustre comment la demande et les réponses passent par optillm .
Dans le schéma :
A
est un outil existant (comme oobabooga), un framework (comme patchwork) ou votre propre code dans lequel vous souhaitez utiliser les résultats d' optillm . Vous pouvez l'utiliser directement à l'aide de n'importe quel SDK client OpenAI.B
est le service optillm (exécuté directement ou dans un conteneur Docker) qui enverra les requêtes au base_url
.C
désigne tout service fournissant un point de terminaison de discussion compatible avec l’API OpenAI. Nous prenons en charge le chargement de n'importe quel modèle HuggingFace ou LoRA directement dans optillm . Pour utiliser le serveur d'inférence intégré, définissez optillm _API_KEY
sur n'importe quelle valeur (par exemple export optillm _API_KEY=" optillm "
), puis utilisez-la dans votre client OpenAI. Vous pouvez transmettre n'importe quel modèle HuggingFace dans le champ modèle. S'il s'agit d'un modèle privé, assurez-vous de définir la variable d'environnement HF_TOKEN
avec votre clé HuggingFace. Nous prenons également en charge l'ajout d'un nombre illimité de LoRA au-dessus du modèle en utilisant le séparateur +
.
Par exemple, le code suivant charge le modèle de base meta-llama/Llama-3.2-1B-Instruct
, puis ajoute deux LoRA par-dessus - patched-codes/Llama-3.2-1B-FixVulns
et patched-codes/Llama-3.2-1B-FastApply
. Vous pouvez spécifier quelle LoRA utiliser à l'aide du paramètre active_adapter
dans le champ extra_args
du client OpenAI SDK. Par défaut, nous chargerons le dernier adaptateur spécifié.
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" },
)
Vous pouvez également utiliser des techniques de décodage alternatives telles que cot_decoding
et entropy_decoding
directement avec le serveur d'inférence 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
sur une valeur d'espace réservéexport OPENAI_API_KEY="sk-no-key"
./llama-server -c 4096 -m path_to_model
pour démarrer le serveur avec le modèle spécifié et une longueur de contexte de 4096 jetonspython3 optillm .py --base_url base_url
pour démarrer le proxypython3 optillm .py --base_url http://localhost:8080/v1
Avertissement
Notez que l'API Anthropic, llama-server (et ollama) ne prennent actuellement pas en charge l'échantillonnage de plusieurs réponses à partir d'un modèle, ce qui limite les approches disponibles aux éléments suivants : cot_reflection
, leap
, plansearch
, rstar
, rto
, self_consistency
, re2
et z3
. Pour les modèles sur HuggingFace, vous pouvez utiliser le serveur d'inférence local intégré car il prend en charge plusieurs réponses.
Approche | Limace | Description |
---|---|---|
CoT avec réflexion | cot_reflection | Implémente un raisonnement en chaîne de pensée avec les sections <thinking>, <reflection> et <output> |
PlanRecherche | plansearch | Implémente un algorithme de recherche sur les plans des candidats pour résoudre un problème en langage naturel |
Relire | re2 | Implémente la relecture pour améliorer le raisonnement en traitant deux fois les requêtes |
Auto-cohérence | self_consistency | Implémente une méthode avancée d’auto-cohérence |
Solveur Z3 | z3 | Utilise le prouveur du théorème Z3 pour le raisonnement logique |
Algorithme R* | rstar | Implémente l'algorithme R* pour la résolution de problèmes |
SAUT | leap | Apprend les principes spécifiques à une tâche à partir de quelques exemples de prises de vue |
Optimisation aller-retour | rto | Optimise les réponses grâce à un processus aller-retour |
Le meilleur de l’échantillonnage N | bon | Génère plusieurs réponses et sélectionne la meilleure |
Mélange d'agents | moa | Combine les réponses de plusieurs critiques |
Recherche d'arbres de Monte-Carlo | mcts | Utilise MCTS pour la prise de décision dans les réponses au chat |
Jeu PV | pvg | Applique une approche de jeu prouveur-vérificateur au moment de l'inférence |
Décodage CoT | N/A pour le proxy | Implémente le décodage de la chaîne de pensée pour susciter un raisonnement sans invite explicite |
Décodage d'entropie | N/A pour le proxy | Implémente un échantillonnage adaptatif basé sur l'incertitude des jetons lors de la génération |
Plugin | Limace | Description |
---|---|---|
Routeur | router | Utilise le modèle optillm -bert-uncased pour acheminer les demandes vers différentes approches en fonction de l'invite de l'utilisateur |
Chaîne de code | coc | Implémente une approche de chaîne de code qui combine CoT avec l'exécution de code et la simulation de code basée sur LLM |
Mémoire | memory | Implémente une couche de mémoire à court terme, vous permet d'utiliser une longueur de contexte illimitée avec n'importe quel LLM |
Confidentialité | privacy | Anonymisez les données PII dans la demande et désanonymisez-les à leur valeur d'origine en réponse |
Lire les URL | readurls | Lit toutes les URL trouvées dans la requête, récupère le contenu à l'URL et l'ajoute au contexte |
Exécuter le code | executecode | Permet d'utiliser un interpréteur de code pour exécuter du code Python dans les requêtes et les réponses générées par LLM |
optillm prend en charge divers arguments de ligne de commande et variables d'environnement pour la configuration.
Paramètre | Description | Valeur par défaut |
---|---|---|
--approach | Approche d’inférence à utiliser | "auto" |
--simulations | Nombre de simulations SCTM | 2 |
--exploration | Poids d'exploration pour MCTS | 0,2 |
--depth | Profondeur de simulation pour MCTS | 1 |
--best-of-n | Nombre d'échantillons pour l'approche best_of_n | 3 |
--model | Modèle OpenAI à utiliser | "gpt-4o-mini" |
--base-url | URL de base pour le point de terminaison compatible OpenAI | "" |
--rstar-max-depth | Profondeur maximale pour l'algorithme rStar | 3 |
--rstar-num-rollouts | Nombre de déploiements pour l'algorithme rStar | 5 |
--rstar-c | Constante d'exploration pour l'algorithme rStar | 1.4 |
--n | Nombre de réponses finales à retourner | 1 |
--return-full-response | Renvoie la réponse complète, y compris le CoT avec les balises | False |
--port | Spécifiez le port pour exécuter le proxy | 8000 |
-- optillm -api-key | Clé API facultative pour l'authentification du client auprès d' optillm | "" |
Lors de l'utilisation de Docker, celles-ci peuvent être définies comme variables d'environnement préfixées par optillm _
.
optillm peut éventuellement être construit et exécuté à l'aide de Docker et du Dockerfile fourni.
Assurez-vous que Docker et Docker Compose sont installés sur votre système.
Mettez à jour les variables d'environnement dans le fichier docker-compose.yaml ou créez un fichier .env
dans le répertoire racine du projet et ajoutez toutes les variables d'environnement que vous souhaitez définir. Par exemple, pour définir la clé API OpenAI, ajoutez la ligne suivante au fichier .env
:
OPENAI_API_KEY=your_openai_api_key_here
Exécutez la commande suivante pour démarrer optillm :
docker compose up -d
Cela construira l'image Docker si elle n'existe pas et démarrera le service optillm .
optillm sera disponible sur http://localhost:8000
.
Lorsque vous utilisez Docker, vous pouvez définir ces paramètres comme variables d'environnement. Par exemple, pour définir l'approche et le modèle, vous utiliserez :
optillm _APPROACH=mcts
optillm _MODEL=gpt-4
Pour sécuriser le proxy optillm avec une clé API, définissez la variable d'environnement optillm _API_KEY
:
optillm _API_KEY=your_secret_api_key
Lorsque la clé API est définie, les clients doivent l'inclure dans leurs requêtes à l'aide de l'en-tête Authorization
:
Authorization: Bearer your_secret_api_key
Modèle | Score |
---|---|
o1-mini | 56,67 |
coc-claude-3-5-sonnet-20241022 | 46,67 |
coc-gemini/gemini-exp-1121 | 46,67 |
o1-aperçu | 40h00 |
gemini-exp-1114 | 36,67 |
claude-3-5-sonnet-20241022 | 20h00 |
gemini-1.5-pro-002 | 20h00 |
gemini-1.5-flash-002 | 16.67 |
Modèle | Précision |
---|---|
lectures et mémoire-gpt-4o-mini | 61.29 |
gpt-4o-mini | 50.61 |
lectures et mémoire-Gemma2-9b | 30.1 |
Gemma2-9b | 5.1 |
Gemma2-27b | 30,8 |
Gémeaux Flash 1.5 | 66,5 |
Gémeaux Pro 1.5 | 72,9 |
Modèle | passer@1 | passe @ 5 | passe @ 10 |
---|---|---|---|
plansearch-gpt-4o-mini | 44.03 | 59.31 | 63,5 |
gpt-4o-mini | 43,9 | 50.61 | 53.25 |
claude-3.5-sonnet | 51.3 | ||
gpt-4o-2024-05-13 | 45.2 | ||
gpt-4-turbo-2024-04-09 | 44.2 |
Étant donné optillm remplace directement l'API OpenAI, vous pouvez facilement l'intégrer aux outils et frameworks existants à l'aide du client OpenAI. Nous avons utilisé optillm avec patchwork, un framework open source qui automatise les tâches de développement telles que les revues de relations publiques, la correction de bugs et les correctifs de sécurité à l'aide de flux de travail appelés patchflows. Nous avons constaté d'énormes gains de performances sur tous les flux de correctifs pris en charge, comme indiqué ci-dessous, lors de l'utilisation de l'approche mixte d'agents (moa).