不用每次都喊最贵的模型,聊一个不调用任何模型的路由器

小岛AI 2026 / 06 / 29

这两天在 Hacker News 上刷到一个仓库,名字叫 Wayfinder,介绍语只有一句话,但我盯着看了好一会儿。

它说自己是一个路由器,帮你决定一个 prompt 该走便宜的小模型还是贵的大模型。这个事不新鲜,市面上一堆。真正让我停下来的是后半句,它做这个决定的时候,不调用任何模型,完全离线,亚毫秒,零网络,零 API key。

好家伙。我第一反应是,那它凭啥判断?

你想想看这个场景。你接了个 AI 应用,后面挂着两档模型,一档是本地跑的 Llama 3.2,免费但笨一点,一档是云端的 GPT-4o 或者 Claude,聪明但每个 token 都在烧钱。理想情况下,「帮我把这段总结一下」「改一下这个错别字」这种活儿应该走本地,免费的就够了,「证明这个数学命题」「重构这一整个模块」这种才值得去叫云端的大模型。

听起来很合理对吧。问题在于,谁来做这个分流的决定。

市面上大多数路由器的答案是,再训一个模型来判断,或者干脆调一次大模型让它先掂量一下这道题难不难。RouteLLM 走的是训练一个分类器的路子,靠人类偏好数据喂出来。NotDiamond、Martian 这类是托管的、学出来的判断器。OpenRouter 的 Auto 模式也是一个 hosted 的自动路由。

发现哪里不对劲了吗。

你本来是为了省钱才上路由器的。结果这个负责省钱的环节,自己先调了一次模型。延迟加上去了,成本也加上去了,更要命的是,模型的判断本身带随机性,同一个 prompt 这次判简单下次判难,全看采样运气。本来想给省钱这一步装个门卫,结果门卫自己是个按小时收费、心情还不稳定的外包。

Wayfinder 的作者显然也觉得这事荒诞。他的做法是反过来,根本不问模型,只读 prompt 本身。

它到底看什么

它看两类东西。

一类是结构。这段 prompt 多长,有没有标题,有没有列表,有没有代码块。这些都是字符串层面就能数出来的,不需要任何理解。

另一类是措辞。里面有没有出现 proof、prove、数学符号、那种硬约束的措辞(must、exactly、step by step 之类)。

把这些信号揉成一个 0.0 到 1.0 的复杂度分。低于你设的阈值,走 local,高于阈值,走 cloud。整个过程是纯函数,同样的输入永远给同样的分,亚毫秒出结果,不联网,不需要 key。

我特意去翻了它的配置,简单到有点离谱。一个 TOML 文件,告诉它两档模型分别是谁。

[routing]
threshold = 0.5            # 低于走 local,到这个值或更高走 cloud

[gateway.models.local]
base_url = "http://localhost:11434/v1"
model = "llama3.2"

[gateway.models.cloud]
base_url = "https://api.openai.com/v1"
model = "gpt-4o"
api_key_env = "OPENAI_API_KEY"

然后你的应用那边,什么都不用改,就把原来指向 OpenAI 的那个 base_url 换成指向 Wayfinder,model 字段填一个 auto,剩下的它替你分。

client = openai.OpenAI(base_url="http://localhost:8088/v1", api_key="unused")
client.chat.completions.create(model="auto", messages=[{"role": "user", "content": "..."}])

就这。你的代码以为自己还在跟 OpenAI 说话,其实中间多了一个微秒级的门卫,悄悄把「改个错别字」截下来扔给了本地的 llama。

而且它每个响应都会带两个 header,一个是 x-wayfinder-router-model 告诉你这次最后走了哪档,一个是 x-wayfinder-router-score 告诉你它打了多少分。透明,看得见它怎么想的,不是个黑箱。说真的,这种「我把判断过程摊给你看」的设计我太吃了,调试的时候这俩 header 就是命。

想立刻感受一下也不用装环境,一行命令零安装零 key 就能在终端里玩。

uvx wayfinder-router chat --dry-run

它会进一个对话界面,你每说一句,它就告诉你这句被路由去了哪、打了几分、为什么,还顺手算一个「相比每次都走云端,你到现在省了多少」。我试着把一句「hi」丢进去,score 0.00,稳稳地走本地。再丢一段带着数学证明要求的长文,分数一下顶上去,转云端。那种判断的手感,挺爽的。

一座灯塔不替你开船,只告诉你哪条航线更近,Wayfinder 干的就是这种分流的活儿

真正让我坐直的,是它认怂的那部分

如果故事到这儿就结束,那 Wayfinder 也就是个聪明的小工具,值得点个 star,但不至于让我想写一篇。

让我坐直的是它的 README 和文档里,作者花了大量篇幅讲它什么时候不行。

这事在如今的开源项目里,太罕见了。

你平时刷 GitHub,看到的是什么。是一张张 benchmark 图,自家的线永远在最上面,标题写着 SOTA,写着 beats GPT-4,写着 outperforms。所有项目都在抢那个最高的数字,因为那个数字好截图、好转发、好融资。

Wayfinder 偏不。它在文档里白纸黑字写了三条自己的软肋,而且写得比夸自己还详细。

第一条,关于那个「措辞」信号。我前面说它会看 proof、math 这些词对吧。结果作者做了一次双盲测试,发现这个词汇信号根本不泛化。在没见过的难题上,它只抓到了大概两成,更难堪的是,它还输给了一个朴素到可笑的基线,就是单纯数这段话有多少个词。一个数词数的笨办法,居然比它精心设计的词汇线索还准。

于是作者干脆把这个词汇信号默认关掉了。默认只用结构信号,那个被证明不靠谱的部分,你想开可以手动开,但出厂就是关的。

你品品这个决定。他大可以留着这个 feature,反正能让功能列表显得更丰富,反正大部分人也不会去做双盲测试拆穿他。但他自己测出来不行,就自己把它摁灭了。

第二条更直接。它说在 RouterBench 那个评测集里,有一类「短但难」的题,Wayfinder 的表现不比随机强。短,结构上就没破绽,你从字符串层面看不出难。难,全难在语义里。这种题它认输。

第三条是把这个失败的根源讲透了。它说,一段难度纯粹藏在语义里的 prompt,比如一段看着平平无奇其实有微妙 bug 的代码,比如「第 100 个质数是多少」,这种从结构上是完全无害的,短短一句,没有标题没有列表没有代码块,复杂度分会很低,它会自信地把这道题甩给本地小模型,然后小模型大概率答错。在这类题上,那些肯花一次模型调用去读懂语义的路由器,会稳稳地赢它。

它甚至给这种诚实配了个去处,文档里专门有一页 FAQ,把这些「不如随机」「不如对手」的场景一条条列清楚,然后告诉你,即便如此,你为什么可能还是想用它。

我读到这儿的时候是真的有点子牛逼这个作者的感觉。

为什么标自己的失败边界,比刷一个高分更值钱

我每天的工作,多少跟这个有点关系。我是做 AI Harness 的,通俗点说就是给大模型搭那层让它真正能干活的脚手架,工具链、评测、调度、上下文管理这些。这个活儿干久了,你会对一种东西特别敏感,就是一个系统肯不肯告诉你它什么时候会坏。

我跟你说,生产环境里最坑人的从来不是「这个模型准确率只有 70%」。70% 我认,我知道有三成会翻车,我可以加重试,可以加人工兜底,可以在关键路径上不信它。真正要命的是「这个模型号称 95%,但它从不告诉你那 5% 长什么样、什么时候来」。你完全没法防,因为你不知道边界在哪。

一个肯老老实实画出自己失效区域的系统,哪怕它平均分低一点,也比一个藏着掖着的高分系统好用一百倍。因为前者你能围着它的短板搭防护,后者你只能等它在某个深夜的告警里突然给你表演一次。

Wayfinder 干的就是前一种事。它等于在说,朋友,我快、我免费、我确定,但我看不懂语义,遇到那种短小精悍的硬骨头我会判错,这类活儿你别全指望我。

这种坦白有个特别实在的好处。你拿到它,心里立刻有谱了,知道该把哪些流量交给它放心省钱,知道哪些得绕开它。它的阈值还能用你自己的真实流量去校准(calibrate,就是拿你这边实际跑的 prompt 去重新标定那条分界线,让它贴合你的业务),不是给你一个写死的魔法数字让你瞎信。

说实话,我们这行最稀缺的不是聪明,是这种诚实。聪明的项目满地都是,benchmark 刷得一个比一个漂亮。但你真把它接进生产,跑两周就发现,那些漂亮数字是在一个跟你毫无关系的分布上测出来的,到了你这儿水土不服,而且它从头到尾都没打算告诉你这一点。

那它到底省的是什么

聊回省钱本身,因为这才是大多数人会装它的理由。

我身边做 AI 产品的朋友,这一年最大的焦虑不是模型不够强,是账单。Anthropic 和 OpenAI 的 API 账单,对一个有真实流量的应用来说,是会让人半夜惊醒的。前阵子还看到消息说不少美国公司因为账单失控,开始大规模往 DeepSeek 这种便宜模型上切,有的甚至 100% 切过去了。

但全切走也不对。你的流量里一定有一部分是真需要最强模型的硬活儿,全压到便宜模型上,质量塌了,用户跑了,省下的那点钱不够赔的。

Wayfinder 给的是一个更细的颗粒度。它不让你在「全用贵的」和「全用便宜的」之间二选一,而是按每一条 prompt 的难度,逐条分。简单的留在本地,一分钱不花,难的才放出去烧钱。它 README 里那句话我觉得说得特别到位,大意是,你不该为了「summarize this」和「fix my typo」这种活儿,去付顶配模型的价。

这账其实很好算。一个真实应用里,那些又短又简单的请求,往往占了相当大的比例。把这部分截下来喂给本地模型,等于凭空砍掉一大块成本,而用户几乎察觉不到差别,因为这些活儿本来小模型就干得了。

还有一层是隐私,这点对一部分人比省钱还重要。敏感的 prompt,公司内部的代码、客户资料、还没公开的东西,你本来就不想发到任何云端 API 上。Wayfinder 让低复杂度的请求直接在本地模型上消化掉,根本不出这台机器。当然它的默认分流逻辑是按难度而不是按敏感度走的,但这个「能让一部分请求彻底留在本地」的能力,本身就给了你一个搭隐私防线的抓手。

哦这个词我得收回,是给了你一个搭隐私防线的地方。

同一片海,有的活儿划个小船就到,有的才值得开大船出远门,关键是别每趟都开大船

它和你已经在用的那些东西,不打架

我知道有人要问了,那我已经在用 OpenRouter、用 LiteLLM 了,这俩是不是干的同一件事,要不要换。

不用换,它俩跟 Wayfinder 根本不是一个维度的事。

OpenRouter 的 Auto、LiteLLM、Bifrost 这类网关,回答的问题是「这一次调用,具体派给哪一家供应商」,它们按价格、按可用性、按谁没挂在那调度。而 Wayfinder 回答的是另一个问题,「这条 prompt 配得上哪一档,便宜的还是贵的」,按难度分,而且是离线分。

这俩是正交的,能叠在一起用。你让 Wayfinder 在最上面做「便宜档还是贵档」的判断,下面再垫一个网关去真正够到各家供应商、做故障转移。一个管「该花多少钱」,一个管「这笔钱花给谁」。

接入也几乎没有迁移成本,因为它说的是 OpenAI 那套 /chat/completions 的语言。你的供应商只要也讲这套(绝大多数都讲),就直接通。本地这一档你挂 Ollama 或者 vLLM,云端那一档你挂 OpenAI、Claude、Gemini、DeepSeek 随便,它不在乎,它只认那个 base_url 加一个 key。

而且这个 key,它处理得很干净。模型配置里你写的不是 key 本身,是一个环境变量的名字(api_key_env),它在每次请求的时候才去环境里把 key 读出来,用完不落盘,从头到尾不写到硬盘上。你要是连在 shell 里 export 一个明文 key 都嫌不安全,它还支持你配一条命令,从 1Password、macOS Keychain、Vault 这些密钥管理器里现取。这个细节做得,棒棒的。

我对这类工具的一点偏心

写到这儿我得承认,我对 Wayfinder 这种工具是有偏心的。

它不大,干的事很窄,就一个判断该走哪档模型的活儿,连判断都判得不算最准。它没有融资新闻,没有华丽的 landing page,作者甚至懒得帮它编一个 SOTA 的故事。

但它身上有一种我特别想留住的工程气质。把一件小事做对,把自己的边界画清楚,不吹,不藏,该认怂的地方大大方方认怂。在一个满世界都在喊 AGI、喊颠覆、喊重塑一切的时间点,一个工具肯安安静静地说「我只解决这一个小问题,而且这是我解决不了的部分」,反而显得格外可信。

这两年看了太多线在最顶上的 benchmark 图,看到后来有点麻木了。是谁来自山川湖海,却囿于昼夜厨房与爱。好的工程师,做的也大多不是惊天动地的大事,是把厨房里那些琐碎的、不性感的、却天天要用的小活儿,一件一件认真做对。Wayfinder 给我的就是这种感觉。

它的代码在这里,感兴趣可以去翻。

如果你手上正好有个在烧 API 钱的应用,又确实有一批又短又简单的请求,真的可以拿那行 uvx 的命令先空跑一下,看看它打的分跟你的直觉合不合。不合也没关系,它那两个 header 会老老实实告诉你它怎么想的,你心里就有数了。

凡事都上最强的模型,其实是一种偷懒,也是一种浪费。把简单的活儿放回简单的地方,这件小事,值得花十分钟试试。