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
并将其设置为环境变量。该模式使用 OpenAI 的GPT-3.5-Turbo
生成更多与用户提供的类似的话语,并使用它们来微调动态阈值。此方法速度较慢,但可以做出更准确的路由决策。 scoring_method
:此字段用于指定用于对查询与每个路由的相似程度进行评分的方法。 SemRoute 支持两种评分方法:
individual_averaging
:在此方法中,计算路线和查询的每个话语嵌入之间的相似度得分。然后使用这些相似度的平均值来做出路由决策。该方法的时间复杂度为O(n)
。centroid
:在此方法中,使用各个话语嵌入计算每条路线的质心,然后使用该质心与查询嵌入之间的相似度来做出路由决策。该方法的时间复杂度为O(1)
。SemRoute 现在支持使用自定义嵌入模型。您可以提供自己的嵌入函数及其静态阈值和向量嵌入大小。如果提供了自定义嵌入函数,它将优先于预配置的嵌入函数。
以下是用户应遵循的自定义嵌入配置架构:
embedding_function
:一个可调用函数,它接受字符串列表并返回嵌入的 numpy 数组。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
方法将配置的路由器保存到 pickle 文件中。
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 存储库上打开问题。