RouteLLM est un framework pour servir et évaluer les routeurs LLM. Il permet d’économiser les coûts LLM sans compromettre la qualité !
Nos principales fonctionnalités incluent :
Depuis PyPI
$ pip install routellm
Depuis la source
$ git clone https://github.com/lm-sys/RouteLLM.git$ cd RouteLLM$ python setup.py install
Marche à suivre pour remplacer un client OpenAI existant pour router des requêtes entre LLMs au lieu d’utiliser un seul modèle :
import osfrom routellm.controller import Controlleros.environ["OPENAI_API_KEY"] = "sk-XXXXXX"os.environ["ANYSCALE_API_KEY"] = "esecret_XXXXXX"client = Controller(routers=["mf"],strong_model="gpt-4-1106-preview",weak_model="anyscale/mistralai/Mixtral-8x7B-Instruct-v0.1",)
Chaque requête de routage a un seuil de coût qui contrôle le compromis entre coût et qualité. Nous devrions calibrer cela en fonction des types de requêtes que nous recevons pour maximiser les performances de routage. Par exemple, calibrons notre seuil pour des appels GPT-4 de 50% en utilisant des données de Chatbot Arena.
Ensuite, mettons à jour le champ model
lors de la génération des complétions pour spécifier le routeur et le seuil à utiliser pour chaque requête.
C’est tout ! Maintenant, les requêtes seront routées entre le modèle fort et le modèle faible en fonction de ce qui est requis, en économisant des coûts tout en maintenant une haute qualité de réponses.
Au lieu d’utiliser le SDK Python, vous pouvez également lancer un serveur compatible OpenAI qui fonctionnera avec n’importe quel client OpenAI existant, en suivant des étapes similaires.
Une fois le serveur lancé, vous pouvez démarrer un chatbot de routage local pour voir comment les différents messages sont routés.
Dans les exemples ci-dessus, GPT-4 et Mixtral 8x7B sont utilisés comme paire de modèles, mais vous pouvez modifier cela en utilisant les arguments strong_model
et weak_model
.
Nous utilisons anyscale
pour prendre en charge les complétions de chat à partir d’une large gamme de modèles open-source et fermés. En général, vous devez configurer une clé API et pointer vers le fournisseur avec le nom de modèle approprié. Alternativement, vous pouvez également utiliser n’importe quel endpoint compatible OpenAI en préfixant le nom du modèle avec anyscale
et en définissant les drapeaux strong_model
et weak_model
.
Les différents LLM varient largement en termes de coûts et de capacités, ce qui pose un dilemme lors de leur déploiement : router toutes les requêtes vers le modèle le plus performant conduit aux réponses de la plus haute qualité mais peut être très coûteux, tandis que router les requêtes vers des modèles plus petits peut économiser des coûts mais peut entraîner des réponses de moindre qualité.
Le routage LLM offre une solution à cela. Nous introduisons un routeur qui examine les requêtes et route les requêtes plus simples vers des modèles plus petits et moins chers, économisant ainsi des coûts tout en maintenant la qualité. Nous nous concentrons sur le routage entre 2 modèles : un modèle plus fort et plus cher et un modèle moins cher mais plus faible. Chaque requête est également associée à un seuil de coût qui détermine le compromis coût-qualité de cette requête - un seuil de coût plus élevé conduit à un coût plus faible mais peut entraîner des réponses de moindre qualité.
La recherche dans ce référentiel a été menée en 2024, et nous sommes reconnaissants pour leur aide et leur soutien.
RouteLLM propose un serveur léger compatible OpenAI pour router les requêtes en fonction de différentes stratégies de routage :
routers
spécifie la liste des routeurs disponibles pour le serveur. Par exemple, ici, le serveur est démarré avec un routeur disponible : mf
(voir ci-dessous pour la liste des routeurs).config_path
spécifie le chemin du fichier de configuration pour les routeurs. Si non spécifié, le serveur utilisera par défaut notre configuration la plus performante (voir ci-dessous pour les détails).Pour la plupart des cas d’utilisation, nous recommandons le routeur mf
car nous l’avons évalué comme très performant et léger.
Lorsqu’une requête est faite au serveur, les clients spécifient le routeur et le seuil de coût à utiliser pour chaque requête en utilisant le champ model
dans le format suivant. Par exemple, en utilisant un seuil de 0.5 spécifie que la requête doit être routée en utilisant le routeur mf
avec un seuil de 0.5.
RouteLLM inclut également un cadre d’évaluation pour mesurer les performances de différentes stratégies de routage sur des benchmarks.
Pour évaluer un routeur sur un benchmark, vous pouvez utiliser la commande suivante :
routers
spécifie la liste des routeurs à évaluer, par exemple mf
et elo
dans ce cas.benchmark
spécifie le benchmark spécifique sur lequel évaluer les routeurs. Nous prenons actuellement en charge : mt_bench
, mmlu
, et gsm8k
.Les résultats de l’évaluation seront imprimés dans la console. Un graphique de performance du routeur sera également généré dans le répertoire actuel (remplacez le chemin en utilisant --output_path
). Pour éviter de recomputer les résultats, les résultats pour un routeur sur un benchmark donné sont mis en cache par défaut. Ce comportement peut être remplacé en utilisant le drapeau --overwrite_cache
, qui prend une liste de routeurs pour écraser le cache.
Les résultats pour tous nos benchmarks ont été mis en cache. Pour MT Bench, nous utilisons les jugements précalculés pour la paire de modèles souhaitée. Pour MMLU et GSM8K, nous utilisons anyscale
pour calculer les résultats pour la paire de modèles souhaitée - le code complet pour cela peut être trouvé dans les répertoires de benchmark si vous souhaitez évaluer une paire de modèles différente.
Par défaut, GPT-4 et Mixtral sont utilisés comme paire de modèles pour l’évaluation. Pour modifier la paire de modèles utilisée, définissez-les en utilisant les drapeaux strong_model
et weak_model
.
Prêt à l’emploi, RouteLLM prend en charge 4 routeurs entraînés sur la paire de modèles mf
et elo
.
La liste complète des routeurs :
mf
: Utilise un modèle de factorisation matricielle entraîné sur les données de préférence (recommandé).elo
: Utilise un calcul Elo pondéré pour le routage, où chaque vote est pondéré en fonction de sa similarité avec la requête de l’utilisateur.bert
: Utilise un classificateur BERT entraîné sur les données de préférence.llm
: Utilise un classificateur basé sur LLM accordé sur les données de préférence.random
: Routage aléatoire vers l’un ou l’autre modèle.Bien que ces routeurs aient été entraînés sur la paire de modèles mf
et elo
, nous avons constaté qu’ils généralisent bien à d’autres paires de modèles forts et faibles également. Par conséquent, vous pouvez remplacer la paire de modèles utilisée pour le routage sans avoir à re-entraîner ces modèles !
Nous fournissons également des instructions détaillées sur la manière de former le classificateur basé sur LLM dans le lien suivant.
Pour plus de détails, consultez notre documentation.
La configuration des routeurs est spécifiée soit dans l’argument config
pour Controller
ou en passant le chemin d’un fichier YAML en utilisant le drapeau --config_path
. Il s’agit d’une correspondance de premier niveau du nom du routeur aux arguments de mot-clé utilisés pour l’initialisation du routeur.
Un exemple de configuration est fourni dans le fichier config.yaml
- il fournit les configurations pour les routeurs qui ont été entraînés sur des données d’Arena augmentées en utilisant GPT-4 comme juge. Les modèles et les ensembles de données utilisés sont tous hébergés sur Hugging Face sous les organisations anyscale
et elo
.
Nous accueillons les contributions ! N’hésitez pas à ouvrir une issue ou une pull request si vous avez des suggestions ou des améliorations.
Pour ajouter un nouveau routeur à RouteLLM, implémentez la classe abstraite Router
dans routers.py
et ajoutez le nouveau routeur au dictionnaire ROUTERS
. Ensuite, vous pouvez utiliser immédiatement le nouveau routeur dans le serveur ou le cadre d’évaluation.
Il n’y a qu’une seule méthode à implémenter : win_rate
, qui prend la requête de l’utilisateur et renvoie le taux de victoire pour le modèle fort conditionné à cette requête donnée - si ce taux de victoire est supérieur au seuil de coût spécifié par l’utilisateur, alors la requête est routée vers le modèle fort. Sinon, elle est routée vers le modèle faible.
Pour ajouter un nouveau benchmark à RouteLLM, implémentez la classe abstraite Benchmark
dans benchmarks.py
et mettez à jour le module benchmarks
pour initialiser correctement la nouvelle classe de benchmark. Idéalement, les résultats du benchmark devraient être précalculés pour éviter d’avoir à régénérer les résultats pour chaque exécution d’évaluation — consultez les benchmarks existants pour des exemples sur la façon de le faire.
Le code de ce référentiel est basé sur la recherche de l’[année]. Veuillez citer si vous trouvez le référentiel utile.