开一家小餐馆,老板不雇大厨,整家店就靠他一个人的脑子。店面只有几平方米,后厨一个灶眼,账本薄薄一页。可就这么个“小老板”,接得了婚宴、办得了酒席——因为他有一整套做生意的门道:先把大订单拆成一道道菜,再打电话订货、抄起菜刀切配、盯着火候翻炒,口袋里还揣着一本皱巴巴的笔记本,记着熟客的口味。这套门道,放到人工智能里,就是“小语言模型 Agent 设计模式”。大模型像一个大饭店,人多地大资金足;而小语言模型(SLM)这位“小老板”,脑子不大但转得快,部署在手机和家电这些“小店面”里,靠一套聪明的工作流——把复杂任务拆开、调动工具、记录记忆、边做边看——照样能撑起一桌 AI 大席。本文就用这家小餐馆的烟火气,带你认识 SLM Agent 的七大门道。
学完这套设计模式,你将掌握如何在资源有限的端侧设备上,用最轻量的方式搭建会推理、会调用工具、会自己修正的智能体,这正是指挥 AI 应用落地到真实产品的核心手艺。
可视化演示
展示SLM Agent核心架构:任务分解策略(顺序/层级/DAG)、工具调用编排与双层记忆管理、ReAct多轮规划循环及端侧量化部署优化。
本节配有交互动效(进入视口后自动加载,约 3KB)。
'+captions.arch+'
架构总览
小餐馆没有专职服务员、没有大厨、没有库管,只有一个老板。他一会儿站在门口迎宾,一转身又去炒菜,抽空还要打电话给菜贩子订货。一个人,顶起了所有角色。SLM Agent 的架构,就是这样一个“一个人撑起整家店”的精巧安排——我们不用又大又重的模型,而是让一个小模型在几个角色之间来回切换。
技术上讲,一个基于 SLM 的 Agent 在架构上通常由四个核心角色组成:规划器(Planner)负责把用户需求拆成步骤;执行器(Executor)负责调用工具、执行动作;记忆模块(Memory)负责记录任务进度和用户偏好;观察与反思器(Observer)负责读取工具返回的结果,判断下一步。SLM 自身只做“思考”这一件事,行动全交给工具与代码。这是它的职责边界:模型是大脑,不是手脚,更不是仓库。
由于 SLM 的上下文窗口小、推理能力有限,设计上要把握三条原则:一是轻量优先,先搭一个“最小可用”的闭环——规划、行动、记忆三件套跑通即可,每加一个组件都要算算开销;二是高内聚低耦合,每个角色各管一摊,老板不会一边炒菜一边记账导致手忙脚乱;三是可降级,模型拿不准时就调用工具或规则兜底,而不是硬猜。所以记住,SLM Agent 的本质不是“一个更聪明的小模型”,而是一套“让不聪明的模型做聪明事”的流程设计。
任务分解
一天,婚宴的订单来了:三十桌酒席。小老板不会站在灶台前发懵,他翻开菜单,把宴席拆成“凉菜、热菜、汤品、点心、酒水”几道工序,每一道再拆成更细的操作:先切配、再烹制、后装盘。任务分解,就是老板的那本“拆单本”。
技术上的任务分解(Task Decomposition),是让 SLM 把一个高层目标改写成一串有顺序的子任务序列。子任务要满足三个要求:可执行(每一步 SLM 或工具都能完成)、有依赖(前一步的输出喂给后一步)、粒度适中(步骤太多容易累积错误,太少则单步难度过高)。与此同时,每完成一个子任务就对进度做一次追踪和记录,这样任务中断后可以从断点续跑,而不是从头再来。
从概率视角看,整件任务的成功概率是各子任务成功概率的条件乘积:
因此,好的任务分解会在“步骤数量”和“单步难度”之间找平衡:步骤太多,概率越乘越小;步骤太少,每一步都超出 SLM 的能力范围。小老板的智慧,在于把大订单切成一口能吃下的分量。
- 连乘累乘∏ 把从第 1 步到第 n 步的所有概率乘在一起,整串流程的整体成功率是每步概率的乘积。
- 子任务概率项P(t_i) 表示第 i 个子任务成功的概率;如果子任务太复杂,这一项就会变小。
- 条件依赖部分竖线后面的 t_1……t_{i-1} 表示“在前面这些步骤都已完成”的条件下第 i 步成功的概率,体现了步骤之间的先后依赖关系。
工具调用
小老板再能干,也变不出食材。他要靠菜刀切菜、靠灶火加热、靠电话向菜贩子订货。这些“外挂”就是他的工具。SLM 也一样——小模型不懂时间、算不准数学、查不了实时天气,但它知道该找谁帮忙。
技术上的工具调用(Tool Calling / Function Calling),包括四个环节:工具注册(告诉模型“我有哪些工具可用,参数长什么样”)、参数解析(把自然语言中的信息翻译成工具要求的结构化参数)、调用映射(从众多工具中选出正确的那把“刀”)、结果校验(检查工具返回的内容是否合理,为下一步规划提供依据)。
SLM 如何决定用哪个工具?模型会为每个候选工具算出一个匹配分 z_k,再通过 softmax 转换成一个概率分布:
聪明的小老板不会亲手剁每根葱,他把刀磨快、把电话本备齐,然后吩咐工具去干。工具调用,就是 SLM 的“手和脚”,替它完成那些它不擅长、却能准确描述的力气活。
- 指数化放大e^{z_k} 把原始打分变成正数,同时放大分数之间的差距,让高分者更突出。
- 归一化分母对全部 K 个工具的打分求幂后求和,让所有概率之和等于 1,各项才能互相比较。
- 概率输出两者相除得到工具 k 被选中的概率;SLM 通常取概率最大的工具执行,并按照注册好的参数格式填写调用。
记忆管理
小老板的记性其实很差,但他口袋里有一本皱巴巴的笔记本:正面记着今天做了哪些菜、做到哪一步,反面记着隔壁王先生不要香菜、李太太喜欢少油。这本笔记本,就是他的“外挂大脑”。
技术上的记忆管理(Memory Management)分为四层:工作记忆存当前任务的上下文(比如正在烹饪哪道菜);长期存储保存跨会话的用户偏好;状态缓存记录子任务的执行进度与中间结果;记忆衰减意味着长期不用的记忆逐渐模糊,避免笔记本越写越厚却全都没用。
记忆的“模糊”,在形式上可以用指数衰减来描述。一条记忆的强度,会随着时间推移按固定速率衰减:
记忆让 SLM Agent 从“每次都从零开始”变成“越用越顺手”。老板的笔记本越记越聪明,Agent 的记忆越攒越贴身——这正是端侧智能体最打动用户的温情之处。
- 初始记忆强度S_0 是刚写入时的强度,比如老板刚记下“王先生不吃香菜”时,清晰度满分。
- 衰减因子γ 介于 0 到 1 之间,决定记忆模糊的速度;γ 越接近 1,忘得越慢。
- 时间间隔幂次Δt 是距离上次调用的时间间隔;间隔越大,指数结果越小,强度越低,表示记忆越淡。
多轮规划
炒菜不是把菜倒进锅就完事。小老板要边炒边尝,咸了加水,淡了加盐,火大了赶紧关小——计划永远在给现实让路。这就是多轮规划:不是一次想清楚所有动作,而是边做边看、边看边改。
技术上的多轮规划,最经典的落地方式是 ReAct 循环:规划一条行动,执行这个行动,观察返回结果,再基于新观察到的情况规划下一步。SLM 每走一轮,都在更新自己对任务状态的认知。形式上,每一轮的内部状态可以写成迭代更新公式:
多轮规划还有两个关键:动态调整——如果观察结果与计划不符,就修订后续步骤;终止条件——要么目标达成,要么轮数或预算达到上限,避免一个任务无限空转。老板不可能永远站在灶台前翻滚,菜熟了就得出锅。
- 状态变量s_k 表示第 k 轮时的任务状态快照,包含已完成步骤和现有信息。
- 执行动作Execute(a_k) 表示把决策 a_k 交给工具或系统执行,产生真实世界的效果。
- 观察与融合更新Observe(o_k) 表示读取执行后的反馈,比如工具返回的天气数据或搜索结果,然后用 Update 把旧状态、执行效果、观察信息三者融合成本轮的新状态 s_{k+1}。
端侧部署
小餐馆的厨房只有两个平方,塞不下大饭店那种三层炉灶。老板的全部家当,必须在这公小的空间里安排得明明白白。SLM 的端侧部署,就是这么一间“袖珍厨房”。
技术上的端侧部署要面对三重约束:资源预算(手机、音箱的内存通常在 1-2GB 内,模型和运行时只能占一个小头);模型量化(把 FP32 的权重压缩成 INT8 甚至 INT4,用精度换体积与速度);延迟约束(单步推理要控制在几十毫秒量级,否则用户等不起)。此外还要考虑离线兜底——没网的时候,用规则系统完成基础应答。
端到端的延迟可以建模为每一步推理延迟与工具调用延迟的总和,它必须落在预算 B 之内:
端侧部署的精髓是“小厨房里也要出大菜”——通过量化把模型塞进设备,通过流水线把延迟压到最低,让 SLM Agent 在没有云端的角落里也能操持起一桌好饭。
- 推理延迟项l_infer^{(i)} 是第 i 轮小模型自己“发呆思考”的耗时,主要取决于模型大小与量化程度。
- 工具延迟项l_tool^{(i)} 是第 i 轮调用外部工具(搜索、查询)的耗时,往往网络往返占大头。
- 预算约束求和后仍小于等于 B;若超标,就减少轮数、压缩模型或精简工具链。
优化评估
生意做得好不好,老板心里得有一本账:回头客比例高不高?一道菜平均多久能上桌?每桌的食材成本超不超支?同样,SLM Agent 的好坏,也要靠指标和实验来度量,而不是凭感觉。
技术上的评估指标主要有三类:成功率(任务完成率,即成功任务数除以总任务数);延迟(P95 延迟,衡量最差情况下的用户等待);成本(token 消耗量与工具调用次数,直接影响端侧的电量和流量)。综合起来,可以设计一个加权综合评分:
评估不是终点,迭代才是。老板每周都要翻账本:哪些菜客人常点?哪道工序老出岔子?Agent 团队也一样——收集失败样本,针对高频错误做提示词调优或模型微调,让这本“生意经”越翻越亮。
- 成功率加权项α 乘以 SR(成功任务占比);α 越大说明越看重“把事办成”。
- 延迟收益项(1 - L/L_base) 在延迟越低时越接近 1,β 控制它占多大分量。
- 成本惩罚项γ 与 C 的乘积是扣分项;C 越大扣得越多,防止为了成功率不计代价地浪费 token。
AI 应用场景
端侧语音助手的日程管家
阶段:Agent 编排与端侧推理阶段
解决的问题:智能音箱内存小、必须本地响应,不能每次把语音上传云端受制于网络。传统规则系统只能做简单的“定闹钟”,听不懂“帮我定一个明早七点半的闹钟并查一下明早天气”这种复合指令。SLM Agent 把这句话拆解为“定闹钟”“查天气”两个子任务,分别调用系统闹钟接口和天气查询工具,并把用户偏好写进本地记忆。
具体案例:老人对音箱说“明天早上去公园前提醒我带伞”。Agent 先查询本地天气工具,得知早晨有雨,于是记录“带伞提醒”,设置闹钟时把“带伞”附在提醒文案里,并写入长期记忆。整个过程在设备端完成,不依赖网络。
户外手表的离线救援规划
阶段:推理部署与离线兜底阶段
解决的问题:登山场景无网络,救援路线规划必须本地完成。传统手表只能显示静态心率值,无法综合判断。SLM Agent 通过多轮规划:先读取传感器数据,再结合体力状态规划建议,观察前方路段反馈后动态调整路线。全部推理在手表本地完成。
具体案例:户外手表监测到心率骤增,Agent 规划一步“询问用户当前状态”,工具调用读取心率与海拔,观察发现异常后自动触发报警工具并给出“立即折返”的建议,全程离线运行。
门店 POS 机的离线客服助理
阶段:Agent 评估与迭代优化阶段
解决的问题:快餐店收银机需要低延迟本地应答,云端大模型成本高、响应慢。传统问答系统遇到“我上次的套餐什么时候好”这种带上下文的问题就答不上来。SLM Agent 判断用户意图是“查订单”,调用本地订单库工具,从记忆缓存中读取取餐进度,多轮追问订单号后返回结果。
具体案例:顾客在收银机上问“我上次的套餐还没好吗?”,Agent 先在本地查询订单工具,再读记忆库中的取餐进度,回复“还差 2 分钟”,全程约 300 毫秒。团队用成功率与延迟指标持续评估,每周迭代一次提示词。
Python 演示
import jsonfrom datetime import datetime def mini_slm(request: str, memory: list, observation: str = "") -> list: """超小模型模拟器: 把用户请求规划成动作序列(ReAct). 真实SLM用权重做推理, 这里用规则模拟其规划输出. """ text = request.lower() if observation and "带伞" in observation: return [{"action": "add_event", "param": {"title": "带伞提醒", "slot": "明日早上"}}] if "天气" in text: return [{"action": "query_weather", "param": {"city": "local"}}] if "闹钟" in text or "提醒" in text: return [{"action": "set_alarm", "param": {"hour": 7, "minute": 30}}] return [{"action": "add_event", "param": {"title": text, "slot": "明日"}}] def query_weather(city: str) -> str: return "多云, 早晨降水概率65%, 建议带伞" def set_alarm(hour: int, minute: int) -> str: return "已设置闹钟 %02d:%02d" % (hour, minute) def add_event(title: str, slot: str) -> str: return "已记录日程[%s]: %s" % (slot, title) TOOL_MAP = { "query_weather": query_weather, "set_alarm": set_alarm, "add_event": add_event,} class SlmAgent: def __init__(self): self.memory = [] # 记忆列表: 每条含text, strength, time self.max_steps = 4 def _decay(self): for item in self.memory: item["strength"] *= 0.9 def _remember(self, text: str): self._decay() self.memory.append({ "text": text, "strength": 1.0, "time": datetime.now().isoformat(), }) def run(self, request: str): print("[用户] " + request) observation = "" for step in range(1, self.max_steps + 1): plan = mini_slm(request, self.memory, observation) if not plan: break last_result = "" for item in plan: action = item["action"] param = item["param"] if action in TOOL_MAP: last_result = TOOL_MAP[action](**param) self._remember(last_result) print("[第%d轮][动作] %s -> %s" % (step, action, last_result)) else: print("[第%d轮][兜底] 未知工具%s" % (step, action)) if "带伞提醒" in last_result: print("[第%d轮][完成] 天气已查, 带伞提醒已设" % step) break observation = last_result strong = len([m for m in self.memory if m["strength"] >= 0.5]) print("[记忆] 条数=%d, 强度>=0.5条数=%d" % (len(self.memory), strong)) if __name__ == "__main__": agent = SlmAgent() agent.run("明天早上去公园, 看看天气并提醒我带伞")
plan = mini_slm(request, self.memory, observation)小模型输出本轮规划的动作序列,对应任务分解return [{"action": "query_weather", "param": {"city": "local"}}]把“查天气”拆成一个可执行的子任务if observation and "带伞" in observation:基于上一轮观察结果规划本轮动作,即多轮反馈last_result = TOOL_MAP[action](**param)工具调用映射,按注册表把动作名换成真实函数并展开参数self._remember(last_result)记忆写入,保存工具返回结果item["strength"] *= 0.9记忆衰减,旧的记忆强度每轮乘 0.9if "带伞提醒" in last_result:观察判断任务目标已达成,提前终止循环
常见误区
误区SLM 这么小,肯定什么都干不了,做 Agent 就得用几百亿参数的大模型,小模型只配做玩具。
正解小模型不是万能,但 Agent 架构的价值恰恰在于让模型做它擅长的“思考”和“决策”,把计算、记忆、调用外部工具等任务分流出去。小餐馆老板一个人也能办酒席,关键在于任务分解足够细、工具足够可靠、记忆足够清晰。SLM 的定位是“决策中枢”而非“知识库”,知识可以存在工具和记忆中。
为何常见:大家默认 Agent 等于聪明大模型加提示词,忽略了架构设计才是 Agent 的能力放大器。
误区只要把任务分解成一大串子任务,一次列完照着做就行,哪需要什么观察反馈?小模型也能一次规划到底。
正解一次规划在 SLM 上风险极高:小模型上下文短、单步误差大,长链条做到第几步就可能跑偏。小老板炒菜只会列一个大纲,下锅后要边炒边尝。ReAct 这类“规划-执行-观察-再规划”的多轮闭环,能用小步反馈纠正积累误差。
为何常见:大模型的一次性规划(plan-then-execute)效果不错,这个经验被错误迁移到了 SLM 上。
误区把聊过的所有内容都拼进提示词里不就有记忆了吗?SLM 上下文小,那我截断到最新几轮就够了。
正解SLM 的上下文窗口很小,盲目塞入全部历史很快撑爆。记忆管理讲究分层:短期记忆只保留当前任务的必要状态;长期记忆通过摘要、检索或简单的键值存储按需取用;还要有衰减机制。就像老板的笔记本不会抄全本菜谱,只记熟客和当日要事。
为何常见:大模型上下文窗口很大,把历史拼贴进提示词是最简单粗暴的“记忆”,忽视了 SLM 的资源约束。
误区让 SLM 打印一段 JSON,解析一下调用函数,这就是工具调用了。四个环节?根本没听说过。
正解工具调用四件套缺一不可:注册规约(定义工具的名字与参数 schema)、参数解析(从自然语言精确提取字段)、调用映射(从多个工具中选出正确的)、结果校验(检查工具返回值并反馈给规划循环)。只做“输出 JSON”一步,参数错、选错工具、结果不可信的问题全都会出现。
为何常见:看到 demo 中模型输出 JSON 的样子就以为全部达成,忽略了工程化的完整链路。
误区INT8、INT4 量化后模型能力损失太严重,端侧 SLM Agent 根本做不了复杂任务,还是别折腾了。
正解量化确实会带来精度损失(尤其数学和长文本推理),但配合 Agent 设计可以弥合:把高精度知识问答交给工具(搜索、查库),把重计算交给云端按需调用,SLM 只做轻量规划和路由。量化损失的是“知识”,架构补回的是“流程”——司机视力差一点,但导航给力,方向盘轻一点照样能把车开稳。
为何常见:单独测试量化模型的 benchmark 下滑,却没有在 Agent 系统层面做端到端评估。
面试题
Q1. SLM Agent 中,任务分解的核心价值是什么?
- A.压缩模型的参数量
- B.把大任务拆成子任务← 正确答案
- C.扩大模型的上下文窗口
- D.减少每轮工具调用次数
答案:B。任务分解的目的是把复杂目标切成 SLM 能一步步完成的子任务序列。A 属于量化或蒸馏的范畴,C 是模型结构问题,D 与任务分解无关。好比小老板不会一口吞下酒席订单,而是拆成一道道菜来做。
Q2. 整体任务成功率随子步骤数量增多而快速下降,能用哪个式子表达?
- A.概率相加求总和
- B.概率逐项连乘← 正确答案
- C.概率取最大项
- D.概率取模运算
答案:B。由 P(T) = ∏P(t_i|……) 可知,子任务成功率是逐项连乘,步骤越多乘积越小。加和、取最大、取模都不能体现“每一步都成功整体才成功”的性质。就像婚宴上任何一道菜没做好,整桌体验就打了折扣。
Q3. softmax 工具选择公式中,分母 Σe^{z_j} 的作用是什么?
- A.放大不同工具的分数差异
- B.归一化成总和为一的概率← 正确答案
- C.压缩模型上下文内容
- D.控制记忆条目的衰减
答案:B。分母把全部工具打分指数化后求和,使各工具概率总和为 1,得到可比较的概率分布。A 中“放大分数差异”是指数化 e^z 的作用,不是分母的职责;C、D 与 softmax 无关。就像老板在几把刀之间做选择,最终各种可能加起来要凑成 100%。
Q4. 记忆强度公式 S(t) = S_0 × γ^{Δt} 中 γ 在 0 到 1 之间,Δt 越大,S(t) 会怎样?
- A.记忆强度随时间增强
- B.记忆强度随时间减弱← 正确答案
- C.记忆强度恒定不变
- D.强度先增后减
答案:B。γ 小于 1,Δt 越大则 γ^{Δt} 越小,S(t) 越小,记忆越模糊。A 说反了,C 否定衰减,D 不符合指数函数的单调性。就像笔记本上的旧笔记,时间一久字迹越来越淡。
Q5. ReAct 循环中,更新任务状态 s_{k+1} 需要融合哪些信息?
- A.仅需旧任务状态
- B.旧状态加执行与观察← 正确答案
- C.只需用户原始文本
- D.只需要工具名称
答案:B。s_{k+1} = Update(s_k, Execute(a_k), Observe(o_k)),需要旧状态、执行结果和观察反馈三样输入。A 只剩旧状态会原地打转;C、D 信息都不完整。就像老板炒菜,要看锅里反应(执行结果)再尝一口(观察)才能决定下一步。
Q6. 下列哪种调整不能降低端到端推理延迟?
- A.量化压缩模型权重
- B.缩短最大规划轮数
- C.加长模型输入上下文← 正确答案
- D.精简工具调用链路
答案:C。加长输入上下文会让每步推理的缓存和计算量增大,延迟反而更高。A 量化直接降低单步推理耗时;B 减少总轮数;D 削减工具调用耗时。三者都能缩小端到端延迟,C 是背道而驰。
Q7. 下列关于 SLM Agent 架构设计原则的说法,正确的有哪些?
- A.模块越多系统越可靠
- B.角色划分高内聚低耦合← 正确答案
- C.模型能力不足时用规则兜底← 正确答案
- D.上下文窗口需无限扩大
答案:BC。高内聚低耦合让每个角色专注,规则兜底能应对模型能力不足。A 应轻量优先而非堆模块;D 受物理窗口限制,不可能无限扩大。小餐馆的厨房就那么点大,设备绝不是越多越好。
Q8. 工具调用的完整链路包含下列哪些环节?
- A.工具注册与参数解析← 正确答案
- B.参数解析与调用映射← 正确答案
- C.调用映射与结果校验← 正确答案
- D.无限重试与随机调用
答案:ABC。完整链路包含工具注册、参数解析、调用映射、结果校验四环。D 的“无限重试与随机调用”会拖垮端侧设备,不属于规范设计。老板用工具前得先知道有哪几把工具、参数怎么填、该拿哪把、用完怎么检查。
Q9. 以下哪些场景最适合采用 SLM Agent 方案?
- A.手机端离线日程提醒← 正确答案
- B.音箱本地天气问答← 正确答案
- C.云端大模型全量问答
- D.户外手表离线救援← 正确答案
答案:ABD。端侧离线场景(手机日程、音箱本地问答、户外手表救援)资源受限且不便联网,正适合 SLM Agent。C 是云端大模型的主场,不需要小模型方案。小餐馆老板适合开在小区楼下,不适合去国贸开宴会厅。
Q10. 综合评分 Score = α×SR + β×(1 - L/L_base) - γ×C,若产品最看重“把事做对”且不太担心成本和延迟,该如何设置参数?
- A.α变大β变小γ不变
- B.α变大β变小γ变小← 正确答案
- C.α变小β变大γ变大
- D.α变大β变大γ变大
答案:B。最看重成功率应把 α 调大;不太担心成本和延迟,则 γ 调小、β 调小。A 中 γ 保持不变,C、D 强化了延迟或成本权重,都不符合目标。就像老板现在最在乎把菜做对,那么“成功率”这一项的权重就该最高。