<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Semantic on Wilson Wu</title><link>https://wilsonwu.me/zh/tags/semantic/</link><description>Recent content in Semantic on Wilson Wu</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Tue, 26 May 2026 00:00:00 -0400</lastBuildDate><atom:link href="https://wilsonwu.me/zh/tags/semantic/index.xml" rel="self" type="application/rss+xml"/><item><title>让模型自己选模型：Embedding 驱动的 LLM 智能路由机制</title><link>https://wilsonwu.me/zh/blog/2026/llm-smart-router/</link><pubDate>Tue, 26 May 2026 00:00:00 -0400</pubDate><guid>https://wilsonwu.me/zh/blog/2026/llm-smart-router/</guid><description>&lt;p&gt;在多模型并存的 AI 架构中（如 GPT-4 / GPT-4o / 轻量模型 / 垂直模型等），一个核心问题是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;如何在不显式指定模型 ID 的情况下，让系统自动选择最合适的模型？&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description><content:encoded><![CDATA[<p>在多模型并存的 AI 架构中（如 GPT-4 / GPT-4o / 轻量模型 / 垂直模型等），一个核心问题是：</p>

<blockquote>
  <p><strong>如何在不显式指定模型 ID 的情况下，让系统自动选择最合适的模型？</strong></p>

</blockquote>
<p>本文介绍一种工程可落地的方案：</p>

<blockquote>
  <p><strong>通过 Embedding 模型计算用户意图 → 在网关层进行语义匹配 → 动态路由到最合适的上游模型服务</strong></p>

</blockquote>
<p>我们将基于：</p>
<ul>
<li>Embedding 模型：Azure OpenAI <code>text-embedding-3-small</code></li>
<li>网关：Envoy</li>
<li>核心机制：向量相似度打分 + 策略路由</li>
</ul>
<h2 id="问题背景与动机">问题背景与动机</h2>
<p>在真实生产环境中，大模型调用通常面临几个挑战：</p>
<h3 id="1-成本与性能权衡">1. 成本与性能权衡</h3>
<table>
	<thead>
			<tr>
					<th>模型类型</th>
					<th>优点</th>
					<th>缺点</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>大模型（如 GPT-4）</td>
					<td>能力强</td>
					<td>成本高 / 延迟高</td>
			</tr>
			<tr>
					<td>小模型（如 GPT-4o-mini）</td>
					<td>快 / 便宜</td>
					<td>能力有限</td>
			</tr>
			<tr>
					<td>专用模型</td>
					<td>精准</td>
					<td>泛化弱</td>
			</tr>
	</tbody>
</table>
<p>不同请求应该走不同模型，而不是“一刀切”。</p>
<h3 id="2-传统做法的局限">2. 传统做法的局限</h3>
<p>常见策略：</p>
<ul>
<li>手动指定 model_id ❌（不智能）</li>
<li>基于规则（if/else）❌（不可扩展）</li>
<li>基于关键词匹配 ❌（语义不鲁棒）</li>
</ul>
<h3 id="3-理想目标">3. 理想目标</h3>
<p>我们希望：</p>

<blockquote>
  <p>用户只输入 prompt，系统自动理解“意图”，并选择最优模型</p>

</blockquote>
<p>这正是 Embedding 可以发挥作用的地方。</p>
<h2 id="核心原理embedding-驱动的语义路由">核心原理：Embedding 驱动的语义路由</h2>
<h3 id="1-embedding-本质">1. Embedding 本质</h3>
<p>Embedding 模型（如 <code>text-embedding-3-small</code>）可以将文本映射为高维向量：</p>
<pre tabindex="0"><code>&#34;写一段 Python 排序代码&#34;
→ [0.012, -0.98, ..., 0.33]  (1536维向量)
</code></pre><p>语义相似的文本，其向量距离更近。</p>
<h3 id="2-路由思路">2. 路由思路</h3>
<p>核心逻辑可以抽象为：</p>
<pre tabindex="0"><code>用户请求 → Embedding → 与“意图模板库”计算相似度 → 选择最佳匹配 → 路由模型
</code></pre><h3 id="3-意图模板intent-prototypes">3. 意图模板（Intent Prototypes）</h3>
<p>我们预先定义一组“意图向量”：</p>
<table>
	<thead>
			<tr>
					<th>意图类型</th>
					<th>示例文本</th>
					<th>目标模型</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>代码生成</td>
					<td>&ldquo;write code&rdquo;, &ldquo;generate function&rdquo;</td>
					<td>GPT-4</td>
			</tr>
			<tr>
					<td>简单问答</td>
					<td>&ldquo;what is&rdquo;, &ldquo;define&rdquo;</td>
					<td>GPT-4o-mini</td>
			</tr>
			<tr>
					<td>翻译</td>
					<td>&ldquo;translate this&rdquo;</td>
					<td>轻量模型</td>
			</tr>
			<tr>
					<td>长文生成</td>
					<td>&ldquo;write blog&rdquo;</td>
					<td>GPT-4</td>
			</tr>
	</tbody>
</table>
<p>这些文本会提前计算 embedding 并缓存。</p>
<h3 id="4-相似度计算">4. 相似度计算</h3>
<p>常用方法：</p>
<ul>
<li>Cosine Similarity（推荐）</li>
</ul>
<pre tabindex="0"><code>similarity = cosine(query_embedding, intent_embedding)
</code></pre><p>选择最高分：</p>
<pre tabindex="0"><code>argmax(similarity_i)
</code></pre><h2 id="系统架构设计">系统架构设计</h2>
<p>整体架构如下：</p>
<pre tabindex="0"><code>                ┌──────────────┐
                │   Client     │
                └──────┬───────┘
                       │
               ┌───────▼────────┐
               │    Envoy 网关   │
               │   (智能路由层)   │
               └───────┬────────┘
                       │
        ┌──────────────┼──────────────┐
        │              │              │
 ┌──────▼─────┐ ┌──────▼─────┐ ┌──────▼─────┐
 │ GPT-4      │ │ GPT-4o-mini│ │ 专用模型    │
 └────────────┘ └────────────┘ └────────────┘
</code></pre><h2 id="实现逻辑拆解">实现逻辑拆解</h2>
<h3 id="1-请求流程">1. 请求流程</h3>
<h4 id="step-1获取用户请求">Step 1：获取用户请求</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;input&#34;</span>: <span style="color:#e6db74">&#34;帮我写一段 Go 的 HTTP server 示例&#34;</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h4 id="step-2调用-embedding-api">Step 2：调用 Embedding API</h4>
<p>使用 Azure OpenAI：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-http" data-lang="http"><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">POST https://{endpoint}/openai/deployments/text-embedding-3-small/embeddings?api-version=2024-02-15-preview
</span></span></span></code></pre></div><p>请求体：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;input&#34;</span>: <span style="color:#e6db74">&#34;帮我写一段 Go 的 HTTP server 示例&#34;</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h4 id="step-3计算相似度">Step 3：计算相似度</h4>
<p>伪代码：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">route</span>(query_embedding):
</span></span><span style="display:flex;"><span>    best_score <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span>    best_model <span style="color:#f92672">=</span> <span style="color:#66d9ef">None</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> intent <span style="color:#f92672">in</span> intents:
</span></span><span style="display:flex;"><span>        score <span style="color:#f92672">=</span> cosine_similarity(query_embedding, intent<span style="color:#f92672">.</span>embedding)
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> score <span style="color:#f92672">&gt;</span> best_score:
</span></span><span style="display:flex;"><span>            best_score <span style="color:#f92672">=</span> score
</span></span><span style="display:flex;"><span>            best_model <span style="color:#f92672">=</span> intent<span style="color:#f92672">.</span>model
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> best_model
</span></span></code></pre></div><h4 id="step-4envoy-动态路由">Step 4：Envoy 动态路由</h4>
<p>将结果写入 Header：</p>
<pre tabindex="0"><code>x-llm-route: gpt-4
</code></pre><p>Envoy 根据 Header 路由：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">routes</span>:
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">match</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">prefix</span>: <span style="color:#e6db74">&#34;/v1/chat&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">headers</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">x-llm-route</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">exact_match</span>: <span style="color:#ae81ff">gpt-4</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">route</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">cluster</span>: <span style="color:#ae81ff">gpt4_service</span>
</span></span></code></pre></div><h2 id="envoy-网关实现方式">Envoy 网关实现方式</h2>
<p>Envoy 本身不直接支持向量计算，因此需要扩展：</p>
<h3 id="方案-1external-processing推荐">方案 1：External Processing（推荐）</h3>
<p>Envoy 调用外部服务（ext_proc）：</p>
<pre tabindex="0"><code>Envoy → ext_proc 服务 → 返回路由决策 → Envoy 转发
</code></pre><p>ext_proc 负责：</p>
<ul>
<li>调用 embedding</li>
<li>计算相似度</li>
<li>返回 header</li>
</ul>
<h3 id="方案-2wasm-插件">方案 2：WASM 插件</h3>
<p>在 Envoy 内嵌逻辑：</p>
<ul>
<li>优点：低延迟</li>
<li>缺点：开发复杂（Rust/CPP）</li>
</ul>
<h3 id="方案-3sidecar-router简单">方案 3：Sidecar Router（简单）</h3>
<pre tabindex="0"><code>Client → Router Service → Envoy → Model
</code></pre><p>Router 服务负责所有智能逻辑。</p>
<h2 id="优化策略">优化策略</h2>
<h3 id="1-向量缓存">1. 向量缓存</h3>
<p>避免重复调用 embedding：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>cache[input_hash] <span style="color:#f92672">=</span> embedding
</span></span></code></pre></div><h3 id="2-意图分层">2. 意图分层</h3>
<p>避免单层分类过粗：</p>
<pre tabindex="0"><code>一级：代码 / 问答 / 写作
二级：语言 / 长度 / 难度
</code></pre><h3 id="3-阈值控制">3. 阈值控制</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">if</span> best_score <span style="color:#f92672">&lt;</span> threshold:
</span></span><span style="display:flex;"><span>    fallback_model <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;gpt-4&#34;</span>
</span></span></code></pre></div><p>防止误判。</p>
<h3 id="4-多模型融合ensemble">4. 多模型融合（Ensemble）</h3>
<p>可扩展为：</p>
<ul>
<li>Top-K 模型候选</li>
<li>A/B 测试</li>
<li>加权路由</li>
</ul>
<h3 id="5-成本感知路由">5. 成本感知路由</h3>
<p>结合：</p>
<ul>
<li>token 预算</li>
<li>用户等级</li>
<li>SLA</li>
</ul>
<p>做策略增强：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">if</span> user <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;free&#34;</span>:
</span></span><span style="display:flex;"><span>    prefer_small_model()
</span></span></code></pre></div><h2 id="优势分析">优势分析</h2>
<h3 id="相比规则路由">相比规则路由</h3>
<table>
	<thead>
			<tr>
					<th>维度</th>
					<th>Embedding 路由</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>语义理解</td>
					<td>强</td>
			</tr>
			<tr>
					<td>可扩展性</td>
					<td>高</td>
			</tr>
			<tr>
					<td>维护成本</td>
					<td>低</td>
			</tr>
	</tbody>
</table>
<h3 id="相比手动指定模型">相比手动指定模型</h3>
<ul>
<li>用户体验更好（无需关心模型）</li>
<li>自动最优成本</li>
<li>支持动态策略</li>
</ul>
<h2 id="落地建议">落地建议</h2>
<h3 id="1-初始阶段">1. 初始阶段</h3>
<ul>
<li>5~10 个意图模板即可</li>
<li>手动标注 + 调优</li>
</ul>
<h3 id="2-数据驱动优化">2. 数据驱动优化</h3>
<p>记录：</p>
<ul>
<li>用户请求</li>
<li>路由结果</li>
<li>用户反馈</li>
</ul>
<p>持续优化 intent embedding。</p>
<h3 id="3-与-llm-router-结合">3. 与 LLM Router 结合</h3>
<p>未来可以升级为：</p>

<blockquote>
  <p>用小模型 + embedding 混合决策（Hybrid Router）</p>

</blockquote>
<h2 id="总结">总结</h2>
<p>本文方案的本质是：</p>

<blockquote>
  <p><strong>用 Embedding 替代规则，用向量相似度驱动模型选择</strong></p>

</blockquote>
<p>关键收益：</p>
<ul>
<li>降低成本（智能选择轻量模型）</li>
<li>提升效果（复杂任务走强模型）</li>
<li>架构解耦（路由逻辑与模型解耦）</li>
</ul>
<p>在多模型时代，这种“语义驱动的网关”会成为标准架构组件。</p>
]]></content:encoded></item></channel></rss>