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 流水线时,才值得用它。

相关推荐
大模型真好玩8 分钟前
大模型训练全流程实战指南实战篇(十七)— LLamaFatory预训练实战:从语料到模型
人工智能·agent·deepseek
slacker-kian1 小时前
RAG 实战:用 LangChain + LLM 对私有文档做摘要提取
ai·langchain·llm·agent·rag
山顶夕景1 小时前
【VideoLLM】Agentic Video Understanding视频理解综述
agent·强化学习·1024程序员节·视频理解·agentic·多模态理解·grpo
去伪存真2 小时前
生产级 RAG 知识库系统架构与核心深度解析
agent
张彦峰ZYF2 小时前
「能跑」不等于「可上线」:生产级 Agent 的验收标准
人工智能·agent·分层抽样、难例、信息不足、对抗·人工、规则、上一版本三条基线·go 与 no-go 决策·内测、灰度、全量三套标准
goehou3 小时前
Agent 卡在第三步,怎么查,一次请求的可观测性
llm·agent·日志·trace·可观测性
Morning的Tech3 小时前
Codex 中智能体的执行机制分析和对比
agent
goehou4 小时前
Agent 把用户地址发给了模型,数据脱敏该在哪一层做
llm·agent·数据脱敏·隐私合规·工程实践
frcoder4 小时前
TackHarness打造属于自己的编程工作流
agent·ai编程·1024程序员节·研发·harness