SemRoute est un routeur sémantique qui permet le routage en utilisant le sens sémantique des requêtes. Cet outil exploite les intégrations vectorielles pour prendre des décisions rapidement, sans avoir besoin de former un classificateur ou d'appeler un grand modèle linguistique. SemRoute est simple à utiliser et offre une flexibilité dans le choix de différents modèles d'intégration, types de seuils et méthodes de notation pour s'adapter au mieux à votre cas d'utilisation.
Installez la bibliothèque à l'aide de la commande :
pip install semroute
Paquet PyPI
Pour utiliser le routeur sémantique, vous devez créer un routeur et ajouter des routes sémantiques qui définiront les routes disponibles pour une requête donnée.
Router
from semroute import Route
router = Router (
embedder_host = "OpenAI" ,
embedder_model = "text-embedding-3-large" ,
thresholding_type = "dynamic" ,
scoring_method = "centroid"
)
Options de configuration
embedder_host
: SemRoute prend actuellement en charge l'intégration de modèles d' OpenAI
et MistralAI
. Ainsi, vous pouvez choisir l’un ou l’autre pour utiliser leurs modèles d’intégration.
embedder_model
: Ce champ peut être utilisé pour spécifier le modèle d'intégration à utiliser à partir de embedder_host
. Vous trouverez ci-dessous les modèles d'intégration pris en charge par chaque hôte :
text-embedding-3-small
, text-embedding-3-large
, text-embedding-ada-002
]mistral-embed
] thresholding_type
: Ce champ spécifie le type de mécanisme de seuil à utiliser pour acheminer les requêtes. SemRoute prend en charge deux types de seuillage :
static
: ce type demande au routeur d'utiliser les seuils prédéfinis pour chaque modèle d'intégration afin de déterminer si la requête appartient ou non à une route spécifique. Cela dépend du modèle et ces seuils sont affinés pour chaque modèle d'intégration. Cela conduit à une décision de routage plus rapide car il n'y a pas d'autre surcharge que la génération des intégrations des énoncés fournis. Cependant, l'utilisation de ce type de seuillage peut parfois conduire à de mauvaises décisions de routage, car il n'est pas adapté aux exemples d'énoncés que vous fournissez pour l'itinéraire.dynamic
: ce type de seuil demande au routeur d'adapter le seuil pour le modèle d'intégration à l'aide des exemples d'énoncés fournis dans l'itinéraire. Pour utiliser ce mode, vous devez fournir OPENAI_API_KEY
et le définir comme variable d'environnement. Ce mode utilise GPT-3.5-Turbo
d'OpenAI pour générer davantage d'énoncés similaires à ceux fournis par l'utilisateur et les utilise pour affiner le seuil dynamique. Cette méthode est plus lente mais conduit à des décisions de routage plus précises. scoring_method
: ce champ est utilisé pour spécifier la méthode utilisée pour évaluer la similitude de la requête avec chaque itinéraire. SemRoute prend en charge deux méthodes de notation :
individual_averaging
: dans cette méthode, le score de similarité est calculé entre chaque intégration d'énoncé de l'itinéraire et de la requête. Ensuite, la moyenne de ces similarités est utilisée pour prendre une décision de routage. Cette méthode a une complexité temporelle de O(n)
.centroid
: dans cette méthode, un centroïde est calculé pour chaque itinéraire en utilisant les intégrations d'énoncés individuels, puis la similarité entre ce centroïde et l'intégration de requête est utilisée pour prendre une décision de routage. Cette méthode a une complexité temporelle de O(1)
.SemRoute prend désormais en charge l'utilisation de modèles d'intégration personnalisés. Vous pouvez fournir votre propre fonction d'intégration ainsi que son seuil statique et sa taille d'intégration vectorielle. Si une fonction d'intégration personnalisée est fournie, elle aura priorité sur celles préconfigurées.
Voici le schéma que l'utilisateur doit suivre pour la configuration d'intégration personnalisée :
embedding_function
: Une fonction appelable qui prend une liste de chaînes et renvoie un tableau numpy d'intégrations.static_threshold
: Une valeur flottante représentant le seuil statique pour les décisions de routage.vector_embedding_size
: Un entier représentant la taille des intégrations vectorielles.Exemple de configuration
custom_embedder_config = {
"embedding_function" : your_custom_embedding_function ,
"static_threshold" : 0.5 ,
"vector_embedding_size" : 768
}
router = Router (
custom_embedder = custom_embedder_config ,
thresholding_type = "static" ,
scoring_method = "centroid"
)
Exemple de fonction d'intégration personnalisée
Votre fonction d'intégration personnalisée doit respecter le format suivant :
def your_custom_embedding_function ( utterances : List [ str ]) -> np . ndarray :
# Your logic to convert utterances to embeddings
embeddings = np . array ([ your_embedding_logic ( utterance ) for utterance in utterances ])
return embeddings
Dans cet exemple, remplacez your_embedding_logic
par la logique spécifique à votre modèle d'intégration.
En fournissant une configuration d'intégration personnalisée, vous pouvez intégrer n'importe quel modèle d'intégration dans SemRoute, ce qui le rend très flexible et adaptable à divers cas d'utilisation.
routes
router . add_route (
name = "technology" ,
utterances = [
"what's the latest in tech news?" ,
"tell me about artificial intelligence" ,
"how does blockchain work?" ,
"what is the best programming language?" ,
"can you recommend a good laptop?" ,
"what's new with the iPhone?"
],
description = "A group of utterances for when the user discusses anything related to technology"
)
router . add_route (
name = "sports" ,
utterances = [
"who won the game last night?" ,
"what's the score of the basketball game?" ,
"tell me about the latest in football" ,
"who's your favorite athlete?" ,
"do you think they'll win the championship?" ,
"when is the next World Cup?"
],
description = "A group of utterances for when the user discusses anything related to sports"
)
router . add_route (
name = "food" ,
utterances = [
"what's your favorite food?" ,
"can you recommend a good restaurant?" ,
"how do you make spaghetti?" ,
"what's a good recipe for a healthy dinner?" ,
"tell me about the best dessert you've had" ,
"what's your favorite cuisine?"
],
description = "A group of utterances for when the user discusses anything related to food"
)
router . add_route (
name = "travel" ,
utterances = [
"where's the best place to travel?" ,
"can you recommend a vacation spot?" ,
"what's the best way to travel on a budget?" ,
"tell me about your favorite trip" ,
"where should I go for my next holiday?" ,
"what are the top tourist destinations?"
],
description = "A group of utterances for when the user discusses anything related to travel"
)
router . add_route (
name = "health" ,
utterances = [
"what's the best way to stay healthy?" ,
"can you recommend a good workout?" ,
"tell me about a healthy diet" ,
"how do I reduce stress?" ,
"what are the benefits of meditation?" ,
"how do I improve my mental health?"
],
description = "A group of utterances for when the user discusses anything related to health"
)
Pour de meilleures décisions d'acheminement, assurez-vous d'inclure autant de cas d'énoncé que possible pour chaque itinéraire. Cela aidera le routeur à garantir qu'aucun cas limite n'est laissé de côté lors de la prise de décision de routage. De plus, lorsque vous utilisez le mode
dynamic
, assurez-vous de donner unedescription
qui correspond très étroitement à l'intention de cet itinéraire, car il est utilisé pour générer des énoncés similaires.
router . route ( "How much does the health insurance costs?" )
[OUT]: health
router . route ( "Let's go to Italy!" )
[OUT]: travel
Les outils vous permettent d'enregistrer votre routeur configuré dans un fichier pickle à l'aide de la méthode save_router
.
router . save_router ( "path/to/filename.pkl" )
Vous pouvez également charger votre configuration enregistrée et l'utiliser pour configurer un routeur.
from semroute import Router
router = Router ()
router . load_router ( "path/to/filename.pkl" )
router . route ( "Query to route" )
Les contributions à SemRoute sont les bienvenues ! Veuillez vous assurer que vos demandes de tirage sont bien documentées et testées.
SemRoute est sous licence MIT. Voir le fichier LICENSE pour plus de détails.
Pour tout problème ou demande de fonctionnalité, veuillez ouvrir un problème sur le référentiel GitHub.