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 は 2 種類のしきい値処理をサポートしています。
static
: このタイプは、クエリが特定のルートに属するかどうかを判断するために、埋め込みモデルごとに事前に設定されたしきい値を使用するようにルーターに指示します。これはモデルに依存しており、これらのしきい値は埋め込みモデルごとに調整されます。提供された発話の埋め込みを生成すること以外にオーバーヘッドがないため、ルーティング決定の迅速化につながります。ただし、このタイプのしきい値処理を使用すると、ルートに指定したサンプル発話に適応していないため、誤ったルーティング決定が行われる可能性があります。dynamic
: このしきい値処理タイプは、ルートで提供されるサンプル発話を使用して、埋め込みモデルのしきい値を適応させるようにルーターに指示します。このモードを使用するには、 OPENAI_API_KEY
提供し、それを環境変数として設定する必要があります。このモードでは、OpenAI のGPT-3.5-Turbo
使用して、ユーザーが提供したものと同様の発話をさらに生成し、それらを使用して動的しきい値を微調整します。この方法は時間はかかりますが、より正確なルーティング決定が可能になります。 scoring_method
: このフィールドは、クエリが各ルートにどの程度類似しているかをスコアリングするために使用される方法を指定するために使用されます。 SemRoute は 2 つのスコアリング方法をサポートしています。
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 ライセンスに基づいてライセンスされています。詳細については、LICENSE ファイルを参照してください。
問題や機能リクエストについては、GitHub リポジトリで問題を開いてください。