SemRoute — это семантический маршрутизатор, который обеспечивает маршрутизацию с использованием семантического значения запросов. Этот инструмент использует векторные внедрения для быстрого принятия решений без необходимости обучения классификатора или вызова модели большого языка. SemRoute прост в использовании и предлагает гибкость в выборе различных моделей внедрения, типов пороговых значений и методов оценки, которые лучше всего подходят для вашего варианта использования.
Установите библиотеку с помощью команды:
pip install semroute
Пакет PyPI
Чтобы использовать семантический маршрутизатор, вам необходимо создать маршрутизатор и добавить семантические маршруты, которые будут определять доступные маршруты для данного запроса.
Router
from semroute import Route
router = Router (
embedder_host = "OpenAI" ,
embedder_model = "text-embedding-3-large" ,
thresholding_type = "dynamic" ,
scoring_method = "centroid"
)
Опции конфигурации
embedder_host
: SemRoute в настоящее время поддерживает встраивание моделей из OpenAI
и MistralAI
. Таким образом, вы можете выбрать любой из них для использования моделей внедрения.
embedder_model
: это поле можно использовать для указания модели внедрения, которая будет использоваться из embedder_host
. Ниже приведены модели внедрения, поддерживаемые каждым хостом:
text-embedding-3-small
, text-embedding-3-large
, text-embedding-ada-002
]mistral-embed
] thresholding_type
: это поле определяет тип механизма определения порога, который будет использоваться для маршрутизации запросов. SemRoute поддерживает два типа пороговых значений:
static
: этот тип указывает маршрутизатору использовать предустановленные пороговые значения для каждой модели внедрения, чтобы определить, принадлежит ли запрос определенному маршруту или нет. Это зависит от модели, и эти пороговые значения уточняются для каждой модели внедрения. Это приводит к более быстрому принятию решения о маршрутизации, поскольку нет никаких других накладных расходов, кроме генерации вложений предоставленных высказываний. Однако использование этого типа порогового значения иногда может привести к неправильным решениям о маршрутизации, поскольку оно не адаптировано к образцам высказываний, которые вы предоставляете для маршрута.dynamic
: этот тип определения порога указывает маршрутизатору адаптировать порог для модели внедрения, используя образцы высказываний, предоставленные в маршруте. Для использования этого режима вам необходимо предоставить OPENAI_API_KEY
и установить его в качестве переменной среды. В этом режиме используется GPT-3.5-Turbo
OpenAI для генерации большего количества высказываний, аналогичных тем, которые предоставляет пользователь, и использует их для точной настройки динамического порога. Этот метод медленнее, но приводит к более точным решениям о маршрутизации. scoring_method
: это поле используется для указания метода, используемого для оценки того, насколько запрос похож на каждый маршрут. SemRoute поддерживает два метода оценки:
individual_averaging
: В этом методе оценка сходства рассчитывается между каждым внедрением маршрута и запроса. Затем среднее значение этих сходств используется для принятия решения о маршрутизации. Этот метод имеет временную сложность O(n)
.centroid
: в этом методе центроид рассчитывается для каждого маршрута с использованием отдельных вложений высказываний, а затем сходство между этим центроидом и встраиванием запроса используется для принятия решения о маршрутизации. Этот метод имеет временную сложность O(1)
.SemRoute теперь поддерживает использование пользовательских моделей внедрения. Вы можете предоставить свою собственную функцию внедрения вместе с ее статическим порогом и размером векторного внедрения. Если предоставлена пользовательская функция внедрения, она будет иметь приоритет над предварительно настроенными.
Вот схема, которой пользователь должен следовать для пользовательской конфигурации встраивания:
embedding_function
: вызываемая функция, которая принимает список строк и возвращает пустой массив вложений.static_threshold
: значение с плавающей запятой, представляющее статический порог для принятия решений о маршрутизации.vector_embedding_size
: целое число, представляющее размер векторных вложений.Пример конфигурации
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"
)
Пример пользовательской функции внедрения
Ваша пользовательская функция внедрения должна соответствовать следующему формату:
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
В этом примере замените your_embedding_logic
логикой, специфичной для вашей модели внедрения.
Предоставляя пользовательскую конфигурацию внедрения, вы можете интегрировать любую модель внедрения в SemRoute, что делает ее очень гибкой и адаптируемой к различным вариантам использования.
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"
)
Чтобы лучше принимать решения о маршрутизации, обязательно включите как можно больше случаев высказывания для каждого маршрута. Это поможет маршрутизатору гарантировать, что при принятии решения о маршрутизации не будет упущен ни один крайний случай. Кроме того, при использовании
dynamic
режима обязательно дайтеdescription
, которое очень точно соответствует цели этого маршрута, поскольку оно используется для создания похожих высказываний.
router . route ( "How much does the health insurance costs?" )
[OUT]: health
router . route ( "Let's go to Italy!" )
[OUT]: travel
Инструменты позволяют сохранить настроенный маршрутизатор в файл рассола с помощью метода save_router
.
router . save_router ( "path/to/filename.pkl" )
Вы также можете загрузить сохраненную конфигурацию и использовать ее для настройки маршрутизатора.
from semroute import Router
router = Router ()
router . load_router ( "path/to/filename.pkl" )
router . route ( "Query to route" )
Вклад в SemRoute приветствуется! Пожалуйста, убедитесь, что ваши запросы на включение хорошо документированы и протестированы.
SemRoute лицензируется по лицензии MIT. Дополнительные сведения см. в файле ЛИЦЕНЗИИ.
Если у вас есть какие-либо проблемы или запросы на добавление новых функций, откройте проблему в репозитории GitHub.