SemRoute es un enrutador semántico que permite el enrutamiento utilizando el significado semántico de las consultas. Esta herramienta aprovecha las incorporaciones de vectores para tomar decisiones rápidamente, sin la necesidad de entrenar un clasificador o llamar a un modelo de lenguaje grande. SemRoute es fácil de usar y ofrece flexibilidad para elegir diferentes modelos de incorporación, tipos de umbrales y métodos de puntuación que se adapten mejor a su caso de uso.
Instale la biblioteca usando el comando:
pip install semroute
Paquete PyPI
Para utilizar el enrutador semántico, debe crear un enrutador y agregar rutas semánticas que definirán las rutas disponibles para una consulta determinada.
Router
from semroute import Route
router = Router (
embedder_host = "OpenAI" ,
embedder_model = "text-embedding-3-large" ,
thresholding_type = "dynamic" ,
scoring_method = "centroid"
)
Opciones de configuración
embedder_host
: SemRoute actualmente admite la incrustación de modelos de OpenAI
y MistralAI
. Por lo tanto, puede elegir cualquiera de ellos para utilizar sus modelos de incrustación.
embedder_model
: este campo se puede utilizar para especificar el modelo de incrustación que se utilizará desde embedder_host
. A continuación se detallan los modelos de integración admitidos por cada host:
text-embedding-3-small
, text-embedding-3-large
, text-embedding-ada-002
]mistral-embed
] thresholding_type
: este campo especifica el tipo de mecanismo de umbral que se utilizará para enrutar las consultas. SemRoute admite dos tipos de umbrales:
static
: este tipo indica al enrutador que utilice los umbrales preestablecidos para cada modelo de incorporación para determinar si la consulta pertenece a una ruta específica o no. Depende del modelo y estos umbrales se refinan para cada modelo de incorporación. Conduce a una decisión de enrutamiento más rápida porque no hay otra sobrecarga más que generar las incrustaciones de las expresiones proporcionadas. Sin embargo, el uso de este tipo de umbral puede llevar a veces a decisiones de enrutamiento incorrectas porque no está adaptado a las expresiones de muestra que proporciona para la ruta.dynamic
: este tipo de umbral indica al enrutador que adapte el umbral para el modelo de incorporación utilizando las expresiones de muestra proporcionadas en la ruta. Para usar este modo, debe proporcionar OPENAI_API_KEY
y configurarlo como su variable de entorno. Este modo utiliza GPT-3.5-Turbo
de OpenAI para generar más expresiones similares a las proporcionadas por el usuario y las utiliza para ajustar el umbral dinámico. Este método es más lento pero conduce a decisiones de ruta más precisas. scoring_method
: este campo se utiliza para especificar el método utilizado para puntuar qué tan similar es la consulta a cada ruta. SemRoute admite dos métodos de puntuación:
individual_averaging
: en este método, la puntuación de similitud se calcula entre cada inserción de expresión de la ruta y la consulta. Luego, el promedio de estas similitudes se utiliza para tomar una decisión de ruta. Este método tiene una complejidad temporal de O(n)
.centroid
: en este método, se calcula un centroide para cada ruta utilizando las incrustaciones de expresiones individuales y luego se utiliza la similitud entre este centroide y la incrustación de consultas para tomar una decisión de enrutamiento. Este método tiene una complejidad temporal de O(1)
.SemRoute ahora admite el uso de modelos de incrustación personalizados. Puede proporcionar su propia función de incrustación junto con su umbral estático y el tamaño de incrustación del vector. Si se proporciona una función de incrustación personalizada, tendrá prioridad sobre las preconfiguradas.
Este es el esquema que el usuario debe seguir para la configuración de incrustación personalizada:
embedding_function
: una función invocable que toma una lista de cadenas y devuelve una gran variedad de incrustaciones.static_threshold
: un valor flotante que representa el umbral estático para las decisiones de enrutamiento.vector_embedding_size
: un número entero que representa el tamaño de las incrustaciones de vectores.Configuración de ejemplo
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"
)
Ejemplo de función de incrustación personalizada
Su función de incrustación personalizada debe cumplir con el siguiente formato:
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
En este ejemplo, reemplace your_embedding_logic
con la lógica específica de su modelo de incrustación.
Al proporcionar una configuración de incrustación personalizada, puede integrar cualquier modelo de incrustación en SemRoute, lo que lo hace altamente flexible y adaptable a diversos casos de uso.
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"
)
Para tomar mejores decisiones de enrutamiento, asegúrese de incluir tantos casos de expresión como sea posible para cada ruta. Esto ayudará al enrutador a garantizar que no se omita ningún caso extremo al tomar una decisión de enrutamiento. Además, al utilizar el modo
dynamic
, asegúrese de dar unadescription
que se alinee muy estrechamente con la intención de esa ruta porque se utiliza para generar expresiones similares.
router . route ( "How much does the health insurance costs?" )
[OUT]: health
router . route ( "Let's go to Italy!" )
[OUT]: travel
Las herramientas le permiten guardar su enrutador configurado en un archivo pickle usando el método save_router
.
router . save_router ( "path/to/filename.pkl" )
También puede cargar su configuración guardada y usarla para configurar un enrutador.
from semroute import Router
router = Router ()
router . load_router ( "path/to/filename.pkl" )
router . route ( "Query to route" )
¡Las contribuciones a SemRoute son bienvenidas! Asegúrese de que sus solicitudes de extracción estén bien documentadas y probadas.
SemRoute tiene la licencia MIT. Consulte el archivo de LICENCIA para obtener más detalles.
Para cualquier problema o solicitud de funciones, abra una incidencia en el repositorio de GitHub.