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 儲存庫上開啟問題。