上下文是智能体成本失控的元凶
很多人以为智能体贵是因为模型收费高。这就像说外卖贵是因为菜贵,根本忘了还有包装费配送费平台抽成。真正吃钱的大胃王是你喂给模型的上下文。你每问一句“今天天气怎么样”,后台可能塞进去了整个代码仓库加三个月聊天记录,模型不得不像扫雷一样在一堆垃圾里找答案。
拿搬家打个比方。你要搬一个花瓶,正常人是拿气泡膜包好放进箱子。有些团队的操作是把整个房子连地基一起铲平,用火车皮拉到新城市,然后从砖头里再把花瓶刨出来。最后油费过路费人工费加起来,够买一卡车花瓶。
智能体领域最离谱的现象是,大家嘴上喊着要搞轻量级自动化,背地里却让模型每次推理都背着整个数据库跑马拉松。这10个项目专门治这个病,核心思路就一条:让模型少吃垃圾,多吃有营养的东西。
提示词压缩包让模型从背课文变成划重点
先看微软出的LLMLingua。项目网址:https://github.com/microsoft/LLMLingua
这个东西像极了搬家用的真空压缩袋。你本来塞了三大箱子羽绒服,它抽掉空气,最后变成三个小圆饼塞进床底。智能体的系统提示词现在有多离谱,你可能想象不到。
一份典型的“祖传系统提示词”长这样:
你是某某助手,请严格遵守以下规则。规则一,回答要简洁。规则二,不要编造信息。规则三,如果不确定就说不知道。规则四,使用礼貌语气。规则五,输出格式为JSON。以下是五个示例。示例一,用户问天气,你输出晴天。示例二,用户问时间,你输出整点。示例三……
这套东西写下来动不动两三千个token。用户真正想问的可能就五个字:“现在几点?”模型得先读完三千字的“员工手册”,然后才能干活。LLMLingua干的事特别简单:把三千字里那些“请”“的”“了”“以下”“严格”“遵守”之类的废话删掉,只保留信息量最大的词汇。
原始段落:
请仔细阅读以下用户问题,并根据你的知识提供准确简洁的回答。 |
压缩后:
读问题,准确回答。 |
你别小看这个操作。一个智能体一天调用一万次API,每次省五百个token,一天就是五百万token。按GPT-4的价格算,一天省出一顿饭钱,一个月省出一部手机。
LLMLingua适合谁?适合所有提示词超过一千字的场景。多轮对话的智能体、带复杂规则的企业客服、需要输出固定格式的工作流,统统能用。企业最喜欢写那种“员工手册式提示词”,恨不得把所有可能性都列进去,最后提示词跟法律条文一样长。LLMLingua就是给这种提示词脂肪肝患者开的减肥处方。
长期记忆工厂从流水账里提炼金子
再看mem0这个项目。项目网址:https://github.com/mem0ai/mem0
很多人以为智能体有记忆,其实它只有聊天记录。这两者的差距,相当于你的日记本和一个保险柜的区别。日记本上什么都记:今天吃了包子、地铁上有人放屁、老板发消息说辛苦了。保险柜里只放身份证房产证银行卡。
聊天记录就是那个流水账日记本。用户跟智能体聊了两万token,里面说了用Mac电脑、讨厌Windows、项目用Next.js、习惯用pnpm装包。这四条信息有用,剩下的一万九千八百条都是废话。传统做法是每次对话都重新把这两万token塞进去,让模型自己捞。mem0的做法是每轮对话结束后,跑一个小模型把“值得记住的信息”提炼出来。
提炼结果大概长这样:
用户操作系统:macOS
技术栈:Next.js
包管理工具:pnpm
这一下,两万token压缩成几十个token。再跟用户聊天的时候,智能体只携带这几十个token的“记忆摘要”,剩下的废话直接扔进回收站。很多人迷信长上下文窗口,觉得越大越好。谷歌出了两百万token的上下文,有人兴奋得不行。但仔细想想,两百万token的垃圾桶还是垃圾桶,只不过从小区垃圾桶变成了垃圾中转站。
真正智能的智能体,不是能记住所有废话,而是知道什么是废话。mem0就是那个帮你自动分类废话和重点的小秘书。
动态模型调度中心让顶级律师别管换灯泡的事
LiteLLM这个项目特别像滴滴打车的派单系统。项目网址:https://github.com/BerriAI/litellm
你打开滴滴叫车,系统不会给你派一辆劳斯莱斯去买菜,也不会派一辆三轮车去接亲。系统会根据路程、时间、路况,自动选最合适的车。LiteLLM干的是同样的事:根据任务难度,自动选最合适的模型。
很多团队最奢侈的操作是:所有请求都用最强模型。用户问“今天星期几”,后台同时调用Claude Opus、GPT-4、Gemini Ultra三尊大神。这跟什么一样?你厨房灯泡坏了,打电话叫了三个诺贝尔物理学奖得主过来换。灯泡五块钱,三位专家的差旅费够你破产。
LiteLLM的调度逻辑大概是这样的:
用户问“把这段文字里的整数全部提取出来” → 简单任务 → 用一个几块钱的小模型
用户问“总结这份十页的合同要点” → 中等任务 → 用中档模型
用户问“这段代码有bug吗,怎么修” → 复杂推理 → 用顶级模型
不同模型就像不同工种。小模型是便利店收银员,反应快但只能干固定几件事。中模型是办公室白领,能处理大部分常规工作。大模型是顶级律师,什么都能干但按小时收费巨贵。你不会让律师帮你换灯泡,但很多团队天天让顶级模型干字符串拼接的活。
这套调度系统还有一个隐藏福利:降级方案。如果大模型服务挂了,自动切到中模型。如果中模型也挂了,用规则引擎兜底。系统不会因为一个模型出问题就全体罢工。
检索增强生成让智能体从死记硬背变成开卷考试
LlamaIndex和Chroma是一对黄金搭档,一个管切菜一个管上菜。项目网址:https://github.com/run-llama/llama_index 和 https://github.com/chroma-core/chroma
没有检索增强生成(RAG,即Retrieval-Augmented Generation,通过先检索再生成来减少无用信息输入)的时候,智能体处理知识库的方式是:把所有文档一股脑塞进上下文。你要问冰箱里有没有鸡蛋,智能体会把整个超市搬到你面前。然后说,来,你自己找找。
检索增强生成的做法完全不同。用户提问之后,系统先理解问题意思,然后在知识库里搜最相关的三五段话,只把这几段话喂给模型。Chroma负责当图书管理员,它能快速从海量文档里找出“最像的那几页”。LlamaIndex负责当资料整理员,它能把PDF、Word、网页这些乱七八糟的文档切碎、分类、编目,方便管理员快速查找。
整个过程分四步。
第一步,用户问问题。
第二步,系统把问题转成一种特殊数字编码,叫向量。这种编码能表示语义相似度。
第三步,Chroma拿着这个编码去文档库里找最接近的文档片段。
第四步,把找到的片段和用户问题一起发给模型。
第五步,模型根据片段生成答案。
你可能发现了,这个流程里最关键的一步是“只找最相关的片段”。很多问题的答案只需要一页PDF里的一段话,但你如果塞一整本PDF进去,模型就得先读完几百页才能找到那一段。检索增强生成就是你的私人助理,帮你翻开书直接念重点。
分页记忆调度让智能体别把所有往事背在身上
Letta这个项目的思路,借鉴了操作系统里的分页内存技术。项目网址:https://github.com/letta-ai/letta
你电脑同时开几十个程序会卡,因为内存装不下。操作系统的解决办法是:把暂时不用的程序数据从内存移到硬盘,需要的时候再调回来。这叫虚拟内存。Letta给智能体也做了类似的虚拟记忆。
传统智能体的记忆方式是:每次对话都加载全部历史。你跟智能体聊了三个月,它就背着三个月的聊天记录到处跑。这就像你一直背着初中到现在的所有课本上班。你明明只需要今天开会用的那份文件,但书包里还有小学语文课本、高中数学练习册、大学毕业论文。
Letta的做法是分层记忆。最近的几轮对话放在“高速缓存”里,随时可以调用。比较旧的对话压缩成摘要,放在“二级存储”里。很久以前的对话提炼成关键记忆卡片,只有明确需要的时候才加载。
这套机制的效果非常明显。假设一个智能体跟用户聊了一百轮,原始聊天记录可能有两万token。Letta只需要记住最近五轮的完整记录,前面的九十五轮压缩成几个关键信息点。实际每次请求只带几千token,比原来省了百分之七八十。
很多人朝着“增大上下文窗口”的方向拼命努力,Letta的方向是“缩小有效上下文”。两个方向的目标是一样的:让模型读更少的东西。但一个像买更大容量的卡车,一个像学会只搬最重的箱子。
结构化输出轨道让模型别再说废话
Guidance这个项目给智能体装了一套轨道系统。项目网址:https://github.com/guidance-ai/guidance
你让模型输出JSON格式的时候,最怕的是什么?是模型输出之前先来一段客气话。“Sure, here's your JSON:” 然后才是真正的JSON。或者输出完JSON之后再加一句“Let me know if you need anything else”。这些客气话在人类对话里是礼貌,在程序调用里全是垃圾token。
更麻烦的是,模型输出的JSON可能格式不对。少一个花括号,多一个逗号,或者某个字段类型错了。你的解析器一跑就报错,然后你只能重试。重试又花一遍token,运气不好还得重试好几遍。
Guidance的做法是:约束模型每一步只能输出什么。比如你让模型输出年龄,用这个约束:
gen("age", regex="[0-9]+")
模型就只能输出数字,不可能输出字母,不可能输出标点,不可能输出“我不知道”。就像给模型装了护栏,它只能在规定的轨道上跑。
还有一个更常用的场景:输出JSON。你用Guidance定义一个JSON模板,模型只能按照模板填空。不需要输出花括号,不需要输出逗号,不需要输出字段名,因为这些已经由模板提供好了。模型只需要填值。这样生成的JSON百分百格式正确,零浪费,零重试。
很多智能体开发者算成本的时候,只算了“成功请求”的token数,完全忘了重试浪费的token。如果一次请求顺利生成需要一千token,但有一半概率格式错误需要重试,那么平均成本就是一千五。Guidance把重试概率降到几乎为零,相当于直接省掉那百分之五十的隐形成本。
代码仓库地图让编程助手别再读整个地球
Aider这个项目专门解决AI编程工具的老毛病:把整个代码库塞进去。项目网址:https://github.com/Aider-AI/aider
最早那批AI编程助手,脑子都有点轴。你问“帮我改一下登录页面的按钮颜色”,它先把整个项目的几十万行代码读完。这就像你问别人“厕所怎么走”,对方先读完整个建筑的设计图纸,再给你指路。
Aider的核心创新叫仓库地图。它先扫描你的代码仓库,分析出文件之间的依赖关系、调用链条、类继承结构。比如main.py调用了utils.py,utils.py又调用了config.py。当用户问关于main.py的问题时,Aider知道也要带上utils.py,但不需要带上完全不相关的test_auth.py。
这套地图是动态生成的。用户问不同的问题,Aider自动选择加载不同的代码文件。问“用户登录功能在哪”,加载跟用户认证相关的文件。问“数据库连接池怎么配”,加载配置文件和相关代码。问“这个报错怎么修”,加载报错位置附近的文件。
真实的大型项目有几个特点。文件数量几十万,代码总量上亿token,历史代码跨度几十年。没有任何模型能一次性读完。真正实用的代码智能体,本质是代码搜索引擎加小范围精准阅读器,而不是人肉背诵机器。
Aider证明了这条路走得通。你不需要让模型读所有代码,你只需要让模型找到正确的代码片段。就像你要学做一道菜,不需要先读完整个菜谱,只需要找到那道菜的那一页。
预算裁判让开发者终于看到token血条
tiktoken和ttok是两个看似简单但极其重要的工具。项目网址:https://github.com/openai/tiktoken 和 https://github.com/simonw/ttok
很多团队最抽象的操作是:天天调API,但没人知道每天到底花了多少token。问后端负责人,说不知道。问运维,说没统计。问老板,老板说这个月账单怎么比上个月多了三倍。整个团队像开空调从来不看电表,夏天过了收到电费单才发现欠了一屁股债。
tiktoken是OpenAI官方出的计数工具。你给它一段文字,它告诉你这段文字在GPT模型里会占多少个token。不同模型的计数规则不一样,tiktoken针对每种模型都有对应的编码器。你在调用API之前就能算出这趟请求要花多少钱。
ttok是命令行版本的升级品。你在终端里跑命令,它可以直接从标准输入读数据。比如你把一个大文件用管道传给ttok,限制最多四千token,超出的部分自动截断。这个功能在写脚本的时候特别好用,你不用写一堆代码去处理token超限的问题。
更重要的是,这两个工具建立了一个制度:token预算。成熟的团队开始给自己定规矩:单次请求不超过四千token,每周审计一次prompt长度,每个月优化一次提示词。超预算的请求自动触发告警。长回合对话自动启用压缩。提示词超过两千字必须经过审批。
这套东西跟云计算的FinOps(云成本治理,通过预算和监控控制云资源开销)如出一辙。云厂商兴起的时候,大家疯狂开实例,月底账单吓死人。后来大家学会了预算、监控、优化。智能体的时代正在重演这个故事,只不过资源名字从CPU和内存换成了token。
上下文工程才是智能体真正的战场
现在行业有个有意思的现象。大家都在卷谁家模型更强,参数更大,评分更高。但真正开始赚钱的团队,偷偷在卷另一件事:如何让模型读更少的东西。
我把这件事叫作上下文工程。它包含几个技术板块。第一块是提示词压缩,把系统提示词里的水分挤干。第二块是记忆架构,从聊天流水账里提炼关键信息。第三块是检索流水线,从知识库里只捞最相关的内容。第四块是模型路由,根据任务难度自动选模型。第五块是token经济学,建立预算和监控机制。
这几个板块的核心逻辑是层层递进的。提示词压缩把单次请求的token量降下来。记忆架构把多轮对话的重复加载去掉。检索流水线让知识库查询变成精准匹配而不是全文搬运。模型路由确保简单任务不浪费昂贵模型。token预算让整个系统有可预测的成本底线。
很多人可能会觉得很反直觉。模型公司拼命扩大上下文窗口,两百万吨甚至一千万token,而你在这里鼓吹缩小上下文。这并不矛盾。大窗口是能力,小窗口是策略。就像一个军队有十万兵力,但每次打仗只派最合适的两千人上场。剩下九万八千人留守待命。你有十万兵不代表每次都要倾巢而出。
智能体最后会不会省钱,根本不取决于模型价格降不降。就像你减肥能不能成功,根本不取决于健身房年卡便不便宜。你把模型API调用次数降下来,把单次调用的token数降下来,把模型选型降下来,同时保证任务完成质量。这时候你打开账单就会发现,数字断崖式下跌。
很多团队花几万块钱买高级模型,然后让模型天天干几毛钱就能搞定的事。这跟花一百万装修厨房,然后只用来泡方便面有什么区别。真正的智能体高手,不是会调用最强模型的人,而是知道什么时候可以不调用模型的人。最好的一次调用,就是这次调用根本不用发生。