27 本地 + 云端智能路由(Local + Cloud Routing)

本地 + 云端智能路由(Local + Cloud Routing)

为什么需要路由?

现在有两种模型可用:

特性 本地(Ollama) 云端(DeepSeek)
成本 免费 按 token 计费
速度 取决于硬件 快且稳定
隐私 数据不出本地 数据发送到云端
能力 受限于模型大小 更强的大模型

智能路由的核心思路是:简单任务走本地,复杂任务走云端,在成本、速度、隐私之间找平衡。

路由策略(3种)

规则路由(Rule-based)

根据 prompt 特征直接判断:

  • prompt 长度 < N token → 本地
  • 包含敏感关键词 → 本地(隐私)
  • 要求高精度输出 → 云端

成本感知路由(Cost-aware)

估算 token 数量,超过预算阈值才用云端。

LLM 分类路由(Classifier-based)

用一个轻量本地模型先判断问题难度,再决定路由目标------这是最聪明的方式。

示例代码

py 复制代码
def run_local_model(prompt: str):
    llm = ChatOllama(model="qwen2.5:1.5b", client_kwargs={"trust_env": False})

    messages = [HumanMessage(content=prompt)]
    result = llm.invoke(messages)
    return result.content


def run_cloud_model(prompt: str):
    env = validate_env()
    if not env:
        return
    (
        api_key,
        base_url,
        model,
        *_,
    ) = env
    llm = ChatOpenAI(model=model, api_key=api_key, base_url=base_url)
    messages = [HumanMessage(content=prompt)]
    result = llm.invoke(messages)
    return result.content

class ModelType(Enum):
    LOCAL = "local"
    CLOUD = "cloud"

forbidden_words = [
    "sexual",
    "nude",
    "porn",
    "sex",
    "naked",
    "sexy",
]

def count_tokens(messages: str):
    enc = tiktoken.get_encoding("cl100k_base")
    count = len(enc.encode(messages)) + 4
    return count


def router(prompt: str) -> str:
    if len(prompt) > 50 or prompt in forbidden_words or count_tokens(prompt) > 1000:
        return ModelType.CLOUD
    else:
        return ModelType.LOCAL


def dialogue(prompt: str) -> str:
    type = router(prompt)
    if type == ModelType.LOCAL:
        print("使用本地模型")
        return run_local_model(prompt)
    else:
        print("使用云端模型")
        return run_cloud_model(prompt)

RunnableLambda 与路由链

LangChain 提供了 RunnableLambda,可以把任意普通函数,包装成 LangChain 的 Runnable,从而能接入 LCEL 管道(| 链式组合)。

LCEL 中的 Runnable

LangChain 的 LCEL 里,很多东西都是 Runnable:

  • ChatOpenAI
  • PromptTemplate
  • StrOutputParser
  • RunnableParallel

它们都可以用 | 串联:

py 复制代码
chain = prompt | llm | parser
result = chain.invoke({"question": "..."})

RunnableLambda 写法

对比一下:

py 复制代码
# 用 RunnableLambda 的写法
from langchain_core.runnables import RunnableLambda

router_chain = RunnableLambda(router)   # 包装路由函数
# 可以 .invoke()、.batch()、.stream(),也能接在其他链后面用 |
result = router_chain.invoke(prompt)

只有当你需要把路由器接入更大的 LangChain 流水线时,才值得用它。

相关推荐
网易云信6 小时前
更强、更快、更普惠!网易智企帝王蟹率先接入 DeepSeek V4.1 Flash
人工智能·agent·deepseek
秦哈哈7 小时前
【HelloAgents】学习笔记(一)
学习·ai·agent
tachibana27 小时前
WebSocket 和 SSE 通信的区别及局限性
网络·人工智能·websocket·网络协议·ai·llm·agent
许我半盏清茶7 小时前
Agent“六大核心能力”之ToolSystem篇
agent
七夜zippoe8 小时前
MCP 协议详解:模型上下文协议如何重塑 Agent 工具调用生态
ai·生态·agent·模型·mcp
jerrywus8 小时前
你给 AI 装的那些 skill,可能有一半根本没生效,1个技巧专治「AI 技能包装着装着就成了一团麻」
chatgpt·agent·claude
承渊政道9 小时前
PR-Agent鸿蒙PC适配全记录:从Python服务端代理到ArkTS原生评审客户端
python·华为·代理模式·agent·harmonyos·pc端
Carson带你学Android9 小时前
ADK for Kotlin:Google 官方 AI Agent 教程来了
android·agent·ai编程
头茬韭菜18 小时前
第 1 篇:「Glass-Box 的骨架」——全景架构与六层数据流水线
架构·agent·semantica