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
: 문자열 목록을 가져와서 수많은 임베딩 배열을 반환하는 호출 가능한 함수입니다.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 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.
문제나 기능 요청이 있는 경우 GitHub 저장소에서 문제를 열어주세요.