@_avichawla: 一个棘手的LLM面试题:你的代理把所有任务都跑在前沿LLM上,于是你加了一个路由层,将一些简单的调用发送到价格便宜15倍的LLM。
摘要
解释了在代理任务中,由于缓存预热问题,模型路由可能无法节省成本,并介绍了一种生产环境下的解决方案——模型亲和性(Model Affinity),以及开源代理Plano,从而实现真正的成本节约。
查看缓存全文
缓存时间: 2026/07/11 11:23
一个棘手的LLM面试题:你的Agent在顶级LLM上运行所有任务,所以增加了一个路由层,将几个简单调用发送给一个便宜15倍的LLM。路由器按预期工作,但账单仍然和以前一样。节省的钱去哪了?(答案见下方) 从高层次来看,模型路由的工作方式如下: - 在Agent前端添加一个分类器 - 将简单提示发送给廉价模型 - 将困难提示发送给昂贵模型 虽然这看起来简单,但在底层,实际上需要大量工程才能实现真正的节省。原因在于Agent消耗Token的方式。一个典型的Agent任务从来不是一次LLM调用。相反,一个提示会触发多次LLM调用,例如规划、工具使用和结果分析。每次调用都会将累积的上下文发送回模型,因此输入每次都会增长。为了避免每次调用都重复处理相同的Token,提供商构建了提示缓存。基本上,模型已经见过的输入比新输入便宜约90%。问题在于这个缓存是特定于模型的。因此,每当路由器在任务中途切换模型时,积累的热缓存就会被丢弃,整个上下文会以冷缓存费率重新计费。这意味着一个缓存热门的昂贵模型可能仍然比一个缓存冷的廉价模型更便宜。生产环境路由器通过为每个任务而不是每次调用做一次路由决策来解决这个问题。第一次调用正常路由,选中的模型被固定到一个会话ID。之后的每次调用都发送到同一个模型,这样缓存保持热状态,上下文保持连贯。当任务改变时,固定重置,路由重新开始。节省的钱并没有消失,而是上移了一层。每个新任务仍然根据难度进行路由,因此简单任务落在廉价模型上,困难任务落在昂贵模型上。固定只阻止任务内部的切换,而这正是切换成本高于节省的地方。这被称为模型亲和性,它是运行在每个请求上的4阶段生产路由层的最后一层。 1) 护栏过滤器 提示经过安全检查。越狱和不安全的输入在到达路由器之前被捕获,并且从这一点开始,每次调用都被记录和追踪。 2) 路由模型 一个小型路由模型读取提示,推断请求的领域和动作,并将其与候选模型匹配。模型必须非常小,因为路由决策如果和它所路由的调用一样昂贵,那就毫无节省可言。 3) 选择策略 一个成本策略从候选模型中选出胜者,根据配置偏好选择最便宜或最快的。价格从定价目录中获取,因此当提供商重新定价时选择会适应,并且如果胜者失败,亚军会作为后备待命。 4) 模型亲和性 选择之后,胜出的模型被固定到会话ID。任务中的后续每次调用都发送给它,因此缓存永远不会重置,上下文永远不会分裂。 要实际看到这个流程,这个精确的管道已经在 Plano 中实现了,它是一个开源的本地代理,运行在你的Agent和模型提供商之间。所有四个层的配置都定义在一个 YAML 配置文件中,交换其中任何一个都不会触及Agent代码。第2阶段的路由模型使用 Arch-Router,这是一个在 HuggingFace 上可用的1.5B模型。它基于人类偏好数据进行训练,即开发者实际为每种任务类型选择什么。因此路由反映了现实世界的偏好,而不是基准排名,并且你可以在配置中用纯英文定义这些偏好。它还实现了一个可观察性控制台,带有每次请求的成本列,因此你可以确切地看到哪个模型回答了每个请求以及花费了多少。 这里是仓库:http://github.com/katanemo/plano(别忘了加星) 我把这个精确的管道放在我的 Hermes Agent 前面,账单降低了2倍,而没有改动一行Agent代码。我写了一篇包含完整操作指南的文章。在下面阅读。 — # katanemo/plano 来源:https://github.com/katanemo/plano 面向Agent应用的AI原生代理服务器和数据平面。 Plano 抽出了常规的管道工作,使你从脆弱的框架抽象中解耦,集中那些不应在每个代码库中都成为定制内容的东西——比如Agent路由和编排、用于持续改进的丰富Agent信号和追踪、用于安全与审核的护栏过滤器,以及用于模型敏捷性的智能LLM路由API。使用任何语言或AI框架,更快地将Agent交付到生产环境。 快速入门指南 (https://docs.planoai.dev/get_started/quickstart.html) • 使用Plano构建Agent应用 • 文档 (https://docs.planoai.dev) • 联系我们 CI (https://github.com/katanemo/plano/actions/workflows/ci.yml) Docker镜像 (https://github.com/katanemo/plano/actions/workflows/docker-push-main.yml) 构建与部署文档 (https://github.com/katanemo/plano/actions/workflows/static.yml) 如果你觉得Plano有用,请给仓库加星⭐️——新版本和更新首先在这里发布。 # 概述 构建Agent演示很容易。但将Agent应用安全、可靠、可重复地交付到生产环境很难。在快速hack的兴奋之后,你需要构建“隐藏的中间件”才能达到生产环境:用于到达正确Agent的路由逻辑、用于安全与审核的护栏钩子、用于持续学习的评估和可观察性粘合剂,以及分散在框架和应用程序代码中的模型/提供商差异。Plano 通过将核心交付关注点移动到一个统一的、进程外的数据平面来解决这个问题。 - 🚦 编排: 低延迟的Agent间编排;无需修改应用代码即可添加新Agent。 - 🔗 模型敏捷性: 通过模型名称、别名(语义名称)或自动根据偏好进行路由。 - 🕵 Agent信号™: 零代码捕获信号 (https://docs.planoai.dev/concepts/signals.html) 以及跨每个Agent的OTEL追踪/指标。 - 🛡️ 审核与记忆钩子: 通过过滤器链 (https://docs.planoai.dev/concepts/filter_chain.html) 构建越狱保护、添加审核策略和一致性的记忆。 Plano 将常规管道从你的框架中抽离出来,让你可以专注于最重要的事情:Agent应用程序的核心产品逻辑。 Plano 由行业领先的LLM研究 (https://planoai.dev/research) 支持,并由其核心贡献者在 Envoy (https://envoyproxy.io) 上构建,这些贡献者曾为现代工作负载大规模构建关键基础设施。 高层次网络序列图:Plano的高层次网络架构图 跳转到我们的文档 (https://docs.planoai.dev) 来了解如何使用Plano提高你的Agent应用的速度、安全性和可观察性。 > [!IMPORTANT] > Plano 和 Plano 系列的 LLM(如 Plano-Orchestrator)在美国中部地区免费托管,为你提供出色的Plano首次运行开发者体验。要扩展并在生产环境中运行,你可以本地运行这些 LLM,或通过 Discord (https://discord.gg/pGZf2gcwEc) 联系我们获取API密钥。 — ## 使用Plano构建Agent应用 Plano 处理 编排、模型管理和可观察性 作为模块化构建块——让你只配置所需的内容(用于Agent编排和护栏的边缘代理,或从服务进行LLM路由,或两者结合)以适应现有架构。下面是一个用Plano构建的简单多Agent旅行助手,展示了所有三个核心能力 > 📁 完整工作代码: 参见 demos/agent_orchestration/travel_agents/ 获取可本地运行的完整天气和航班Agent。 ### 1. 在YAML中定义你的Agent yaml # config.yaml version: v0.3.0 # 你声明的内容:Agent URL和自然语言描述 # 你不必编写的内容:意图分类器、路由逻辑、模型后备、提供者适配器或追踪 instrumentation agents: - id: weather_agent url: http://localhost:10510 - id: flight_agent url: http://localhost:10520 model_providers: - model: openai/gpt-4o access_key: $OPENAI_API_KEY default: true - model: anthropic/claude-3-5-sonnet access_key: $ANTHROPIC_API_KEY listeners: - type: agent name: travel_assistant port: 8001 router: plano_orchestrator_v1 # 由我们的4B参数路由模型支持。你可以更改为不同的模型 agents: - id: weather_agent description: | 获取全球任何城市的实时天气和预报。处理:"巴黎天气怎么样?"、"东京会下雨吗?" - id: flight_agent description: | 搜索机场间的航班,提供实时状态和时刻表。处理:"从纽约到洛杉矶的航班"、"给我看飞往西雅图的航班" tracing: random_sampling: 100 # 自动捕获追踪以用于评估 ### 2. 编写简单的Agent代码 你的Agent只是实现OpenAI兼容聊天补全端点的HTTP服务器。使用任何语言或框架: python # weather_agent.py from fastapi import FastAPI, Request from fastapi.responses import StreamingResponse from openai import AsyncOpenAI app = FastAPI() # 指向Plano的LLM网关 - 它为你处理模型路由 llm = AsyncOpenAI(base_url="http://localhost:12001/v1", api_key="EMPTY") @app.post("/v1/chat/completions") async def chat(request: Request): body = await request.json() messages = body.get("messages", []) days = 7 # 你的Agent逻辑:获取数据、调用API、运行工具 # 完整的实现在 demos/agent_orchestration/travel_agents/ 中 weather_data = await get_weather_data(request, messages, days) # 通过Plano流式返回响应 async def generate(): stream = await llm.chat.completions.create( model="openai/gpt-4o", messages=[{"role": "system", "content": f"Weather: {weather_data}"}, *messages], stream=True ) async for chunk in stream: yield f"data: {chunk.model_dump_json()}\n\n" return StreamingResponse(generate(), media_type="text/event-stream") ### 3. 启动Plano并查询你的Agent 先决条件: 遵循先决条件指南 (https://docs.planoai.dev/get_started/quickstart.html#prerequisites) 安装Plano并设置你的环境。 bash # 启动Plano planoai up config.yaml ... # 查询 - Plano智能地在单次对话中路由到两个Agent curl http://localhost:8001/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-4o", "messages": [ {"role": "user", "content": "我下周想从纽约去巴黎。那里的天气怎么样?你能帮我找到一些航班吗?"} ] }' # → Plano路由到weather_agent获取巴黎天气 ✓ # → 然后路由到flight_agent获取纽约→巴黎航班 ✓ # → 返回一个完整的旅行计划,包含天气信息和航班选项 ### 4. 免费获得可观察性和模型敏捷性 每个请求都使用OpenTelemetry进行端到端追踪——无需instrumentation代码。 自动追踪 ### 你不必构建的内容 | 基础设施关注点 | 没有Plano | 使用Plano | |———|—————|————| | Agent编排 | 编写意图分类器 + 路由逻辑 | 在YAML中声明Agent描述 | | 模型管理 | 处理每个提供商的API差异 | 统一LLM API,带有状态管理 | | 丰富追踪 | 为每个服务添加OTEL instrumentation | 自动端到端追踪和日志 | | 学习信号 | 构建管道以捕获/导出跨度 | 零代码Agent信号 | | 添加Agent | 更新路由代码、测试、重新部署 | 添加到配置,重启 | 为什么高效: Plano 使用专为任务设计的轻量级LLM(如我们的4B参数编排器),而不是重量级框架或GPT-4来进行路由——以极低的成本和延迟提供生产级路由。 — ## 联系我们 要与我们取得联系,请加入我们的Discord服务器 (https://discord.gg/pGZf2gcwEc)。我们积极监控该频道并提供支持。 ## 开始使用 准备好尝试Plano了吗?查看我们全面的文档: - 快速入门指南 (https://docs.planoai.dev/get_started/quickstart.html) - 几分钟内启动并运行 - LLM路由 (https://docs.planoai.dev/guides/llm_router.html) - 按模型名称、别名或智能偏好路由 - Agent编排 (https://docs.planoai.dev/guides/orchestration.html) - 构建多Agent工作流 - 过滤器链 (https://docs.planoai.dev/concepts/filter_chain.html) - 添加护栏、审核和记忆钩子 - 可观察性 (https://docs.planoai.dev/guides/observability/observability.html) - 追踪、指标和日志 ## 贡献 我们非常欢迎关于我们的路线图 (https://github.com/orgs/katanemo/projects/1) 的反馈,并欢迎对 Plano 做出贡献!无论是修复bug、添加新功能、改进文档还是创建教程,您的帮助都非常宝贵。请访问我们的 贡献指南 了解更多详情 如果你觉得Plano有用,请给仓库加星⭐️——新版本和更新首先在这里发布。
相似文章
跨四个LLM层级的代理工作路由:编排器、顾问、深度推理、Premier
作者分享了一个实用的四层LLM路由栈,用于代理工作。其中,快速的编排器处理大部分请求,仅在需要深度推理时才会升级到昂贵的模型,显著降低了成本并提升了交互体验。
@_avichawla: 一个棘手的LLM面试题:你在vLLM上部署推理模型,长序列时GPU内存总是不够用。于是你加入KV缓存压缩,驱逐了90%的缓存token。显存占用依旧,GPU仍然内存不足。为什么?
解释了为什么在vLLM上部署推理模型时,驱逐90%的KV缓存token无法释放GPU内存,原因是分页注意力碎片化。同时介绍了NVIDIA的TriAttention解决方案,可实现2.5倍加速和10.7倍内存缩减。
@alex_prompter: 这个开源代理无需改动一行代码就能降低你的AI agent成本。Plano位于你的agent和你的…
Plano是一个开源代理,位于AI agent和LLM提供商之间,通过智能路由、护栏过滤和成本感知选择来降低成本,所有配置通过单个YAML文件完成,无需修改agent代码。
从早期经验中学习智能体路由
本文介绍了 BoundaryRouter,这是一个无需训练的框架,通过根据早期经验将查询路由至轻量级推理或完整智能体执行来优化大型语言模型(LLM)智能体的使用。此外,本文还提出了 RouteBench,这是一个用于评估路由性能的基准,显示出在速度和准确率方面的显著提升。
@dangerm00se: 我让 fable 做的主要事情是路由跨越本地 API 和 cerebras 的 moa 和 rlm 实验。让你的 agent 去…
作者分享了 Hermes Mixture-of-Agents 实验中的发现,包括投票器升级、GPU 拓扑和缓存经济学,表明本地前缀缓存可以使长代理会话几乎免费,并且两个独立的 GPU 实例优于单个分区实例。