语义路由
语义路由器为应用提供一个稳定的模型别名,同时由 AISIX 根据每个聊天请求的语义选择直接模型。AISIX 对最新的用户消息进行向量嵌入,将它与各路由的示例进行比较,再将请求分发到最佳匹配目标。如果没有路由达到阈值,AISIX 会使用默认模型。
当请求需要按主题到达不同模型,而应用不应自行选择模型时,请使用语义路由。例如,同一个别名可以把法律问题发送到推理模型,把翻译请求发送到多语言模型,并把所有其他请求发送到通用模型。
语义路由器支持 OpenAI 兼容的 /v1/chat/completions 端点。
本页介绍基于向量嵌入的决策后端。语义路由器也可以改由 TypeSafe 托管的 jev 决策模型根据各路由的描述选择路由,无需示例和阈值。参见使用 TypeSafe Jev 进行语义路由。
语义路由的工作原理
对于每个请求,AISIX 使用配置的向量嵌入模型,将最新的用户消息与路由示例进行比较,再把请求分发到一个直接模型。
AISIX 会在应用配置时对路由示例进行向量嵌入,并在网关进程中缓存它们的向量。当示例、向量嵌入模型或向量维度发生变化时,AISIX 会重新计算向量。因此,每个请求只需要为最新的用户消息调用一次向量嵌入端点,之后在本地完成相似度计算。
准备工作
开始前,请准备以下资源:
- 一个用于 OpenAI 兼容
/v1/embeddings端点的服务提供方密钥,该端点需要返回浮点数向量。 - 一个默认直接模型,以及至少一个用作路由目标的直接模型。路由器会向它们发送 Chat Completions 请求,因此它们的服务提供方必须提供 Chat Completions。AISIX Enterprise 和 AISIX Cloud 均不允许不提供 Chat Completions 的模型(例如使用
jina、runwayml或typesafe服务提供方密钥的模型)作为路由目标、默认目标或失败目标,也不允许把被引用的模型换到这类密钥上。 - 一个可以调用语义路由器别名的调用方 API Key。
- 对于 AISIX Enterprise 或 AISIX Cloud,需要一个已接入网关的环境,以及管理模型和调用方 API Key 的权限。
- 对于开源 AISIX 网关,需要有权访问声明式资源文件和网关进程。
配置语义路由器
请先创建向量嵌入模型、默认模型和路由目标,再创建 语义路由器。控制面通过模型 ID 引用这些资源,开源 AISIX 网关则在声明式资源文件中通过 display_name 引用它们。
向量嵌入模型的 dimensions 必须与上游端点返回的数值数量一致。只有当 AISIX 必须在比较向量前对其进行归一化时,才将 normalize 设置为 false。
每条路由都需要名称、一个直接目标模型和至少一个示例。描述为可选字段。路由级 threshold 会覆盖该路由所使用的路由器级阈值。
AISIX Enterprise 或 AISIX Cloud
导出控制面连接信息和向量嵌入模型使用的服务提供方密钥:
# AISIX_CP 是 Admin API 基础 URL;应包含 /api,且末尾不要带斜杠。
# 本地 AISIX Enterprise 快速入门使用 http://localhost:8080/api。
export AISIX_CP="YOUR_AISIX_CONTROL_PLANE_API_URL"
export AISIX_TOKEN="YOUR_ADMIN_TOKEN"
export ENV_ID="YOUR_ENVIRONMENT_ID"
export PROVIDER_KEY_ID="YOUR_EMBEDDING_PROVIDER_KEY_ID"
创建向量嵌入模型并记录其 ID:
EMBEDDING_MODEL_ID=$(curl -sS -X POST "$AISIX_CP/environments/$ENV_ID/models" \
-H "Authorization: Bearer $AISIX_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"kind": "embedding",
"display_name": "embedding-prod",
"model_name": "text-embedding-3-small",
"provider_key_id": "'"$PROVIDER_KEY_ID"'",
"embedding": {
"dimensions": 1536,
"normalize": true
}
}' | jq -r '.model.id')
导出直接目标模型的 ID:
export DEFAULT_MODEL_ID="YOUR_DEFAULT_MODEL_ID"
export LEGAL_MODEL_ID="YOUR_LEGAL_MODEL_ID"
export TRANSLATION_MODEL_ID="YOUR_TRANSLATION_MODEL_ID"
创建语义路由器。其默认阈值会应用于所有未自行定义阈值的路由:
SEMANTIC_MODEL_ID=$(curl -sS -X POST "$AISIX_CP/environments/$ENV_ID/models" \
-H "Authorization: Bearer $AISIX_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"kind": "semantic",
"display_name": "topic-router",
"semantic": {
"embedding_model_id": "'"$EMBEDDING_MODEL_ID"'",
"default_model_id": "'"$DEFAULT_MODEL_ID"'",
"threshold": 0.75,
"routes": [
{
"name": "legal",
"target_model_id": "'"$LEGAL_MODEL_ID"'",
"description": "Contract and legal-risk analysis",
"examples": [
"Analyze this contract for legal risk",
"Review this NDA for liability exposure"
],
"threshold": 0.8
},
{
"name": "translation",
"target_model_id": "'"$TRANSLATION_MODEL_ID"'",
"examples": [
"Translate this paragraph to French"
]
}
]
}
}' | jq -r '.model.id')
把 SEMANTIC_MODEL_ID 添加到调用方 API Key 的 allowed_models 列表。保存后的配置会自动投射到已接入的网关。
你也可以在控制台的 Models 页面创建和编辑向量嵌入模型与语义路由器。语义路由器表单提供两个阈值调优工具:
- Test routing 会展示为提示词选择的路由、每条路由的相似度分数,以及该分数是否达到阈值。
- Auto-detect thresholds 会根据已配置示例集内部及相互之间的相似度,为每条路由推荐初始阈值。
这两个工具都从控制面调用向量嵌入端点,因此控制面服务必须能够访问该端点。