技术教程 · 阅读约 9 分钟

本地 AI 不该是少数人的特权——用 Ollama + 任意 API 搭一套真正可用的私有助手

本地 AI 不该是少数人的特权——用 Ollama + 任意 API 搭一套真正可用的私有助手

你有没有想过:每次问 ChatGPT 一个问题,你的上下文都在别人的服务器上跑了一遍?

Local AI 的讨论最近在 HN 上又热起来了。顶帖的核心观点很直接:本地 AI 应该成为常态,而不是极客的玩具。但现实是,大多数人试了一次 Ollama 之后就放弃了——模型太小、效果差、没法联网、工具链断裂。

这篇文章想解决一个具体问题:怎么搭一套"本地优先、云端兜底"的 AI 工作流,让你在隐私和能力之间找到真正的平衡点。


为什么纯本地跑不起来

先说反常识的部分。

很多人以为本地 AI 的瓶颈是显卡。其实不是。真正的瓶颈是任务分层没做好:

  • 代码补全、简单问答 → 7B 模型完全够用,本地跑没问题
  • 复杂推理、长文档分析 → 70B+ 才有感觉,消费级显卡吃不消
  • 多模态、实时联网 → 本地基本没戏

所以"纯本地"这个目标本身就是个伪命题。更务实的架构是:本地模型处理敏感/高频任务,云端 API 处理复杂任务,两者用同一套接口无缝切换。


动手:搭一个路由层,自动分发任务

下面这个方案用 Python 实现一个简单的"模型路由器":简单任务走本地 Ollama,复杂任务自动转发到云端 API。

前置准备


# 安装 Ollama

curl -fsSL https://ollama.com/install.sh | sh

ollama pull qwen2.5:7b   # 本地轻量模型



# 安装依赖

pip install openai httpx

路由器核心代码


import os

from openai import OpenAI



# 本地 Ollama 客户端

local_client = OpenAI(

    base_url="http://localhost:11434/v1",

    api_key="ollama",  # Ollama 不校验 key,随便填

)



# 云端 API 客户端(OpenAI 格式兼容,改个 base_url 就行)

cloud_client = OpenAI(

    base_url="https://api2everything.xyz/v1",

    api_key=os.environ.get("WULIANG_API_KEY"),

)



def estimate_complexity(messages: list[dict]) -> str:

    """

    简单的复杂度估算:

    - 总 token 数超过 2000 → 复杂任务

    - 包含代码审查/长文档关键词 → 复杂任务

    - 其余 → 简单任务

    """

    total_chars = sum(len(m.get("content", "")) for m in messages)

    last_content = messages[-1].get("content", "").lower()



    complex_keywords = ["审查", "分析整个", "review", "summarize", "重构", "架构"]

    is_complex_keyword = any(kw in last_content for kw in complex_keywords)



    if total_chars > 4000 or is_complex_keyword:

        return "complex"

    return "simple"



def chat(messages: list[dict], force_cloud: bool = False) -> str:

    complexity = estimate_complexity(messages)



    if force_cloud or complexity == "complex":

        print(f"[路由] → 云端 (claude-3-5-sonnet)")

        response = cloud_client.chat.completions.create(

            model="claude-3-5-sonnet-20241022",

            messages=messages,

            max_tokens=4096,

        )

    else:

        print(f"[路由] → 本地 (qwen2.5:7b)")

        response = local_client.chat.completions.create(

            model="qwen2.5:7b",

            messages=messages,

        )



    return response.choices[0].message.content



# 测试

if __name__ == "__main__":

    # 简单问题 → 走本地

    simple_q = [{"role": "user", "content": "Python 里怎么反转一个列表?"}]

    print(chat(simple_q))



    # 复杂任务 → 走云端

    complex_q = [{"role": "user", "content": "帮我 review 以下代码架构,分析潜在的性能瓶颈和安全问题:\n" + "..." * 200}]

    print(chat(complex_q))

加一个交互式 CLI


def main():

    messages = []

    print("本地/云端混合 AI 助手已启动。输入 /cloud 强制使用云端,/quit 退出。\n")



    while True:

        user_input = input("你: ").strip()

        if not user_input:

            continue

        if user_input == "/quit":

            break



        force_cloud = False

        if user_input.startswith("/cloud "):

            force_cloud = True

            user_input = user_input[7:]



        messages.append({"role": "user", "content": user_input})

        reply = chat(messages, force_cloud=force_cloud)

        messages.append({"role": "assistant", "content": reply})

        print(f"\nAI: {reply}\n")



if __name__ == "__main__":

    main()

运行:


export WULIANG_API_KEY="你的 key"

python router.py


进阶:把路由逻辑做得更聪明

上面的关键词匹配太粗糙。更好的做法是用一个轻量本地模型来判断任务复杂度,再决定路由:


def smart_route(messages: list[dict]) -> str:

    """用本地模型判断是否需要升级到云端"""

    judge_prompt = [

        {

            "role": "system",

            "content": "你是一个任务分类器。判断用户的问题是否需要强大的推理能力。只回答 'simple' 或 'complex',不要解释。"

        },

        {

            "role": "user",

            "content": f"问题:{messages[-1]['content'][:500]}"

        }

    ]



    result = local_client.chat.completions.create(

        model="qwen2.5:7b",

        messages=judge_prompt,

        max_tokens=10,

    )

    verdict = result.choices[0].message.content.strip().lower()

    return "complex" if "complex" in verdict else "simple"

这样本地模型先做一次"预判",只有真正复杂的任务才消耗云端 token,成本能再降 40-60%


关于云端 API 的选择

这套架构里,云端 API 的选择很关键。我用的是无量 Api,原因很实际:

  • 国内直连,不需要代理,延迟稳定,这对路由器的响应时间影响很大
  • OpenAI 格式兼容,上面代码里只需要改 base_url,其他一行不动
  • 300+ 模型,Claude、Gemini、DeepSeek 都在,路由策略可以更细化(比如代码任务走 DeepSeek,长文档走 Claude)
  • 比官方便宜约 65%,注册还送 ¥1 余额,测试成本几乎为零

注册地址:api2everything.xyz


小结

本地 AI 真正的价值不是"完全离线",而是让你对数据流向有控制权。这套路由架构的核心思路:

1. 敏感数据、高频简单任务 → 本地模型,零成本、零泄露

2. 复杂推理、长上下文 → 云端 API,按需付费

3. 两套客户端用同一个接口,切换成本为零

代码已经可以直接跑,按自己的需求调整路由规则就行。

有问题欢迎评论区留言,或者把你的路由策略分享出来,看看大家都怎么做任务分层的。觉得有用的话点个赞,后续还会写 RAG 本地化、Agent 工具链这些话题。