SemRoute é um roteador semântico que permite o roteamento usando o significado semântico das consultas. Essa ferramenta aproveita a incorporação de vetores para tomar decisões rapidamente, sem a necessidade de treinar um classificador ou chamar um modelo de linguagem grande. SemRoute é simples de usar e oferece flexibilidade na escolha de diferentes modelos de incorporação, tipos de limite e métodos de pontuação para melhor atender ao seu caso de uso.
Instale a biblioteca usando o comando:
pip install semroute
Pacote PyPI
Para usar o roteador semântico, você precisa criar um roteador e adicionar rotas semânticas que definirão as rotas disponíveis para uma determinada consulta.
Router
from semroute import Route
router = Router (
embedder_host = "OpenAI" ,
embedder_model = "text-embedding-3-large" ,
thresholding_type = "dynamic" ,
scoring_method = "centroid"
)
Opções de configuração
embedder_host
: SemRoute atualmente suporta modelos de incorporação de OpenAI
e MistralAI
. Portanto, você pode escolher qualquer um deles para usar seus modelos de incorporação.
embedder_model
: Este campo pode ser usado para especificar o modelo de incorporação a ser usado em embedder_host
. Abaixo estão os modelos de incorporação suportados por cada host:
text-embedding-3-small
, text-embedding-3-large
, text-embedding-ada-002
]mistral-embed
] thresholding_type
: Este campo especifica o tipo de mecanismo de limite a ser usado para rotear as consultas. SemRoute oferece suporte a dois tipos de limite:
static
: este tipo instrui o roteador a usar os limites predefinidos para cada modelo de incorporação para determinar se a consulta pertence a uma rota específica ou não. Depende do modelo e esses limites são refinados para cada modelo de incorporação. Isso leva a uma decisão de roteamento mais rápida porque não há outra sobrecarga além de gerar os embeddings das declarações fornecidas. No entanto, usar esse tipo de limite às vezes pode levar a decisões erradas de roteamento porque ele não está adaptado para as declarações de amostra fornecidas para a rota.dynamic
: este tipo de limite instrui o roteador a adaptar o limite para o modelo de incorporação usando as declarações de amostra fornecidas na rota. Para usar este modo, você precisa fornecer OPENAI_API_KEY
e defini-lo como sua variável de ambiente. Este modo usa GPT-3.5-Turbo
da OpenAI para gerar mais declarações semelhantes às fornecidas pelo usuário e as usa para ajustar o limite dinâmico. Este método é mais lento, mas leva a decisões de roteamento mais precisas. scoring_method
: Este campo é usado para especificar o método usado para pontuar a semelhança da consulta com cada rota. SemRoute oferece suporte a dois métodos de pontuação:
individual_averaging
: neste método, a pontuação de similaridade é calculada entre cada incorporação de enunciado da rota e a consulta. Então a média dessas semelhanças é usada para tomar uma decisão de roteamento. Este método tem uma complexidade de tempo de O(n)
.centroid
: neste método, um centróide é calculado para cada rota usando os embeddings de enunciados individuais e, em seguida, a semelhança entre este centróide e o embedding de consulta é usada para tomar uma decisão de roteamento. Este método tem uma complexidade de tempo de O(1)
.SemRoute agora oferece suporte ao uso de modelos de incorporação personalizados. Você pode fornecer sua própria função de incorporação junto com seu limite estático e tamanho de incorporação vetorial. Se for fornecida uma função de incorporação personalizada, ela terá precedência sobre as pré-configuradas.
Aqui está o esquema que o usuário deve seguir para a configuração de incorporação personalizada:
embedding_function
: uma função que pode ser chamada que pega uma lista de strings e retorna um array numpy de embeddings.static_threshold
: um valor flutuante que representa o limite estático para decisões de roteamento.vector_embedding_size
: um número inteiro que representa o tamanho dos embeddings do vetor.Configuração de exemplo
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"
)
Exemplo de função de incorporação personalizada
Sua função de incorporação personalizada deve seguir o seguinte 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
Neste exemplo, substitua your_embedding_logic
pela lógica específica do seu modelo de incorporação.
Ao fornecer uma configuração de incorporação personalizada, você pode integrar qualquer modelo de incorporação ao SemRoute, tornando-o altamente flexível e adaptável a vários 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 melhores decisões de roteamento, certifique-se de incluir tantos casos de expressão quanto possível para cada rota. Isso ajudará o roteador a garantir que nenhum caso extremo seja deixado de fora ao tomar uma decisão de roteamento. Além disso, ao usar o modo
dynamic
, certifique-se de fornecer umadescription
que esteja bem alinhada com a intenção dessa rota, pois ela é usada para gerar declarações semelhantes.
router . route ( "How much does the health insurance costs?" )
[OUT]: health
router . route ( "Let's go to Italy!" )
[OUT]: travel
As ferramentas permitem que você salve seu roteador configurado em um arquivo pickle usando o método save_router
.
router . save_router ( "path/to/filename.pkl" )
Você também pode carregar sua configuração salva e usá-la para configurar um roteador.
from semroute import Router
router = Router ()
router . load_router ( "path/to/filename.pkl" )
router . route ( "Query to route" )
Contribuições para SemRoute são bem-vindas! Certifique-se de que suas solicitações pull estejam bem documentadas e testadas.
SemRoute é licenciado sob a licença MIT. Consulte o arquivo LICENSE para obter mais detalhes.
Para quaisquer problemas ou solicitações de recursos, abra um problema no repositório GitHub.