SemRoute ist ein semantischer Router, der das Routing unter Verwendung der semantischen Bedeutung von Abfragen ermöglicht. Dieses Tool nutzt Vektoreinbettungen, um schnell Entscheidungen zu treffen, ohne dass ein Klassifikator trainiert oder ein großes Sprachmodell aufgerufen werden muss. SemRoute ist einfach zu verwenden und bietet Flexibilität bei der Auswahl verschiedener Einbettungsmodelle, Schwellenwerttypen und Bewertungsmethoden, die am besten zu Ihrem Anwendungsfall passen.
Installieren Sie die Bibliothek mit dem folgenden Befehl:
pip install semroute
PyPI-Paket
Um den semantischen Router zu verwenden, müssen Sie einen Router erstellen und semantische Routen hinzufügen, die die verfügbaren Routen für eine bestimmte Abfrage definieren.
Router
from semroute import Route
router = Router (
embedder_host = "OpenAI" ,
embedder_model = "text-embedding-3-large" ,
thresholding_type = "dynamic" ,
scoring_method = "centroid"
)
Konfigurationsoptionen
embedder_host
: SemRoute unterstützt derzeit das Einbetten von Modellen von OpenAI
und MistralAI
. Sie können also eines davon für die Verwendung ihrer Einbettungsmodelle auswählen.
embedder_model
: Dieses Feld kann zur Angabe des Einbettungsmodells verwendet werden, das vom embedder_host
verwendet werden soll. Nachfolgend sind die von jedem Host unterstützten Einbettungsmodelle aufgeführt:
text-embedding-3-small
, text-embedding-3-large
, text-embedding-ada-002
]mistral-embed
] thresholding_type
: Dieses Feld gibt den Typ des Schwellenwertmechanismus an, der zum Weiterleiten der Abfragen verwendet werden soll. SemRoute unterstützt zwei Arten von Schwellenwerten:
static
: Dieser Typ weist den Router an, die voreingestellten Schwellenwerte für jedes Einbettungsmodell zu verwenden, um zu bestimmen, ob die Abfrage zu einer bestimmten Route gehört oder nicht. Es ist modellabhängig und diese Schwellenwerte werden für jedes Einbettungsmodell verfeinert. Dies führt zu einer schnelleren Routing-Entscheidung, da außer der Generierung der Einbettungen der bereitgestellten Äußerungen kein weiterer Mehraufwand entsteht. Die Verwendung dieser Art von Schwellenwerten kann jedoch manchmal zu falschen Routing-Entscheidungen führen, da sie nicht für die Beispieläußerungen geeignet ist, die Sie für die Route bereitstellen.dynamic
: Dieser Schwellenwerttyp weist den Router an, den Schwellenwert für das Einbettungsmodell mithilfe der in der Route bereitgestellten Beispieläußerungen anzupassen. Um diesen Modus verwenden zu können, müssen Sie OPENAI_API_KEY
bereitstellen und als Umgebungsvariable festlegen. Dieser Modus verwendet GPT-3.5-Turbo
von OpenAI, um mehr Äußerungen zu generieren, die denen des Benutzers ähneln, und nutzt diese zur Feinabstimmung des dynamischen Schwellenwerts. Diese Methode ist langsamer, führt aber zu genaueren Routing-Entscheidungen. scoring_method
: Dieses Feld wird zum Angeben der Methode verwendet, mit der bewertet wird, wie ähnlich die Abfrage zu jeder Route ist. SemRoute unterstützt zwei Bewertungsmethoden:
individual_averaging
: Bei dieser Methode wird der Ähnlichkeitswert zwischen jeder Äußerungseinbettung der Route und der Abfrage berechnet. Dann wird der Durchschnitt dieser Ähnlichkeiten für die Routing-Entscheidung verwendet. Diese Methode hat eine Zeitkomplexität von O(n)
.centroid
: Bei dieser Methode wird für jede Route anhand der einzelnen Äußerungseinbettungen ein Schwerpunkt berechnet und dann wird die Ähnlichkeit zwischen diesem Schwerpunkt und der Abfrageeinbettung zum Treffen einer Routing-Entscheidung verwendet. Diese Methode hat eine Zeitkomplexität von O(1)
.SemRoute unterstützt jetzt die Verwendung benutzerdefinierter Einbettungsmodelle. Sie können Ihre eigene Einbettungsfunktion zusammen mit ihrem statischen Schwellenwert und der Vektoreinbettungsgröße bereitstellen. Wenn eine benutzerdefinierte Einbettungsfunktion bereitgestellt wird, hat diese Vorrang vor den vorkonfigurierten.
Hier ist das Schema, dem der Benutzer für die benutzerdefinierte Einbettungskonfiguration folgen sollte:
embedding_function
: Eine aufrufbare Funktion, die eine Liste von Zeichenfolgen entgegennimmt und ein Numpy-Array von Einbettungen zurückgibt.static_threshold
: Ein Float-Wert, der den statischen Schwellenwert für Routing-Entscheidungen darstellt.vector_embedding_size
: Eine Ganzzahl, die die Größe der Vektoreinbettungen darstellt.Beispielkonfiguration
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"
)
Beispiel einer benutzerdefinierten Einbettungsfunktion
Ihre benutzerdefinierte Einbettungsfunktion sollte dem folgenden Format entsprechen:
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
Ersetzen Sie in diesem Beispiel your_embedding_logic
durch die für Ihr Einbettungsmodell spezifische Logik.
Durch die Bereitstellung einer benutzerdefinierten Einbettungskonfiguration können Sie jedes Einbettungsmodell in SemRoute integrieren, wodurch es äußerst flexibel und an verschiedene Anwendungsfälle anpassbar ist.
routes
hinzufügen 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"
)
Für bessere Routing-Entscheidungen stellen Sie sicher, dass Sie für jede Route so viele Äußerungsfälle wie möglich berücksichtigen. Dadurch kann der Router sicherstellen, dass bei der Routing-Entscheidung kein Randfall ausgelassen wird. Achten Sie außerdem bei der Verwendung des
dynamic
Modus darauf, einedescription
anzugeben, die der Absicht dieser Route sehr gut entspricht, da sie zur Generierung ähnlicher Äußerungen verwendet wird.
router . route ( "How much does the health insurance costs?" )
[OUT]: health
router . route ( "Let's go to Italy!" )
[OUT]: travel
Mit den Tools können Sie Ihren konfigurierten Router mithilfe der Methode save_router
in einer Pickle-Datei speichern.
router . save_router ( "path/to/filename.pkl" )
Sie können Ihre gespeicherte Konfiguration auch laden und zur Konfiguration eines Routers verwenden.
from semroute import Router
router = Router ()
router . load_router ( "path/to/filename.pkl" )
router . route ( "Query to route" )
Beiträge zu SemRoute sind willkommen! Bitte stellen Sie sicher, dass Ihre Pull-Anfragen gut dokumentiert und getestet sind.
SemRoute ist unter der MIT-Lizenz lizenziert. Weitere Einzelheiten finden Sie in der LICENSE-Datei.
Bei Problemen oder Funktionswünschen öffnen Sie bitte ein Problem im GitHub-Repository.