
很多搞 AI 应用的人都有一个共同感受大模型 API 越用越贵响应越用越慢而且每次把用户对话发到云端心里总是不踏实。尤其是当你想做 Agent 类应用时每一轮工具调用都要经过“云端模型处理 → 返回指令 → 执行工具 → 再上传结果”延迟和成本被成倍放大。于是今年越来越多团队开始问同一个问题模型能不能再小一点、再快一点、更本地化一点同时还能真正完成任务而不是只会聊天苹果在 2025 年开源的 LFM 系列端侧模型中LFM2.5-2.6B 这个 26 亿参数的版本被不少人视为端侧 Agent 落地的一个重要信号。原因不是它参数少而是这类小模型已经把工具调用Function Calling做得足够规范化足以支撑一个真正跑在设备上的 Agent 应用。我的判断是On-Device Agents 的分水岭不在于模型参数多不多而在于“模型能不能稳定输出结构化的工具调用指令”以及“应用层能不能把这个调用闭环做好”。这篇文章会先讲清楚 LFM2.5-2.6B 到底是什么、On-Device Agents 和云端 Agent 的架构差异在哪里然后带你从零搭建一个能在本地跑通的端侧 Agent 最小系统包含模型加载、工具注册、函数调用解析和结果回传。最后会给你一张常见问题排查表和一套从 Demo 走向产品的最佳实践清单。读完这篇文章你至少能回答三个问题端侧 Agent 到底适不适合你的项目、跑通一个最小系统需要哪些前置条件、真正落地时最容易踩的坑在哪里。1. 端侧 Agent 为什么突然变热了过去两年Agent 的基本形态几乎都是“云端大模型 工具调用”。开发者把大模型 API 接进来定义一堆 Tools让模型决定调用哪一个再把结果返回给用户。这种方案的优势是模型能力强、工具生态成熟但问题也同样明显。首先是成本。一个 Agent 任务往往需要多次模型调用理解用户意图一次、决定调用哪个工具一次、根据工具结果生成最终回答一次。三次调用下来Token 消耗比普通聊天高出一大截。如果 Agent 的逻辑再复杂一点做多轮迭代成本会继续滚雪球。其次是延迟。工具调用本质上是一个串行过程模型返回工具指令应用执行工具再把结果交回模型。每一轮都伴随着网络往返。在云上调用一次模型通常要几百毫秒到几秒整个 Agent 流程跑完用户等十秒并不罕见。对语音助手、快捷指令、实时交互这类场景来说这种延迟基本不可接受。再其次是隐私。用户在手机上使用个人助理类 Agent 时大概率不希望自己的日程、通讯录、健康数据、短信内容被传到云端。这不是多疑而是很多产品在合规上根本不允许这么做。数据不出设备很多时候不是产品卖点而是业务底线。这三个问题指向同一个方向模型必须能跑在端侧并且端侧模型要具备工具调用能力。LFM2.5-2.6B 正是踩在这个节点上的产物。它不追求参数规模上的“大”而是追求在手机、笔记本、边缘设备上能够以较小的内存占用完成 Agent 类任务。从端侧部署的角度看这类模型的意义不是“替代云端大模型”而是让一部分高频、敏感、延迟敏感的任务可以在本地完成云端模型只处理更复杂的推理和创作类需求。这里真正容易踩坑的地方是很多人以为端侧 Agent 就是把大模型换成了小模型其他逻辑不变。实际上完全不是这样。端侧模型的上下文窗口更小、指令遵循能力更弱、输出格式稳定性也更差如果你直接把云端 Agent 的提示词和工具定义搬过来大概率会得到一堆无法解析的 JSON。这就需要重新设计整个提示词体系和工具调用协议。2. LFM2.5-2.6B 到底是一个什么样的模型LFM 是 Device Language Foundation Model 系列的缩写是苹果开源的面向设备端场景的语言模型家族。这个系列的设计目标非常明确让语言模型在有限的内存和算力条件下运行同时保留对文档理解、摘要、工具调用等真实任务的处理能力。LFM2.5-2.6B 是其中面向 Agent 场景的版本之一参数规模在 26 亿左右。26 亿参数是什么概念如果用 FP16 精度存储模型权重大约占用 5GB 内存如果量化到 4-bit体积可以压缩到 1.5GB 左右已经可以比较舒服地跑在手机、PC 或开发板上。当然具体体积取决于量化方式和上下文长度这里只是一个概数实际以你下载的文件为准。LFM2.5-2.6B 最值得关注的地方是它把“On-Device Agent”当成了第一优先级来优化。这意味着它在训练阶段就重点强化了指令遵循、结构化输出和工具调用这些能力而不是单纯追求通用对话质量。对于开发者来说这意味着同一套提示词下它输出合法 JSON 的概率会高于同级别的通用小模型。不过我要提醒你不要被“开源”两个字冲昏头脑。端侧模型跑不跑得动不完全取决于模型本身还取决于你选什么推理框架、用什么量化格式、目标设备是什么芯片。同样是 LFM2.5-2.6B在 Apple Silicon 上用 MLX 跑和在普通 x86 服务器上用 CPU 跑体验完全是两回事。从实际选择的角度看LFM2.5-2.6B 适合的场景包括手机上的语音助手、短信和邮件智能回复、文档信息提取、本地知识库问答、需要调用系统工具的自动操作等。它不适合的场景包括复杂代码生成、长篇小说创作、多步深度推理、需要大规模世界知识的开放域问答。一句话总结它适合做“会干活的小模型”不适合做“什么都懂的百科全书”。在开始写代码之前还要明确一个概念边界。很多人把 On-Device Agent 理解成“在端侧部署一个能聊天的模型”这个理解是错误的。聊天模型是人与模型之间的对话Agent 是模型与真实世界之间的协作。在端侧 Agent 里模型并不是最终输出答案的终端而是整个系统的“决策器”。它负责理解用户意图、决定调用哪个工具、从工具结果中提取关键信息、再组织语言回复用户。这个定位上的差异会直接决定你的系统架构和提示词设计。3. On-Device Agent 的架构拆解一个完整的端侧 Agent不止是一个模型文件而是一套本地运行的系统。从工程角度拆解它由四部分组成模型推理层负责加载 LFM2.5-2.6B 或其他端侧模型执行文本生成和结构化输出。工具注册表定义一组可供模型调用的函数每个函数有名字、参数说明和具体实现。调度循环接收用户输入调用模型生成工具指令解析指令执行对应工具把结果返回模型或用户。状态管理层维护多轮对话的上下文、工具执行历史、会话状态和错误恢复信息。这四层中最容易出问题的是第三层也就是工具调用的调度循环。我在实际项目中见过太多团队模型选得很好、工具也写了很多但 Agent 一跑就崩原因基本都是循环逻辑不健壮。要理解这一点先看传统云端 Agent 的典型流程。用户提问后应用把“系统提示词 用户输入 工具定义列表”一起发给云端模型模型返回一个结构化的工具调用对象应用解析后执行本地或远程函数再把结果拼进对话历史请求模型生成最终回答。这个流程看起来没什么问题但它隐含了一个前提模型每次都能稳定输出合法的工具调用对象。在云端大模型上这个前提基本成立因为模型能力强、指令遵循训练充分。但在端侧小模型上这个前提经常不成立。模型可能输出非法的 JSON可能漏掉参数可能把工具名“发明”成一个不存在的函数甚至可能把工具调用和聊天回复混在一起。所以端侧 Agent 的调度循环必须比云端多出三件事格式校验、错误重试、降级回复。还有一个经常被忽略的差异是上下文长度。云端 Agent 常用 8K、32K 甚至更长的上下文把完整工具定义和前几轮对话全部塞进提示词模型也能处理。但端侧模型内存有限上下文窗口通常只有 2K 到 4K。如果你把工具定义写得又长又啰嗦再叠加对话历史很快就把上下文挤爆了。这要求你必须精心压缩工具描述必要时只把最相关的工具放进提示词而不是一次性全量塞给模型。我画了一张云端 Agent 与端侧 Agent 的对比方便你理解两者差异对比维度云端 Agent端侧 On-Device Agent模型所在位置远程服务器本地设备典型参数规模70B 及以上1B ~ 7B单次推理延迟数百毫秒到数秒几十毫秒到数百毫秒数据隐私数据需要上云数据本地处理成本按 Token 计费一次性硬件成本上下文窗口通常 8K 以上通常 2K ~ 4K受内存限制工具调用稳定性高中等需要更强的容错设计网络依赖必须联网可离线运行适合场景复杂推理、长文生成、跨领域知识高频操作、隐私敏感、离线场景看清这张表你就能明白为什么端侧 Agent 不能简单复刻云端方案。它的优势是隐私、时延、成本代价是模型能力和上下文空间。工程设计的核心任务就是在这个约束下做取舍。4. 环境准备与前置条件下面进入实操环节。本文用一套通用思路演示端侧 Agent 的最小实现以 LFM2.5-2.6B 的 GGUF 量化版本为例推理框架使用 llama.cpp 的 Python 绑定。这样选择的原因是跨平台兼容性好无论是 macOS 还是 Linux只要有 CPU 或 GPU 都能跑不需要绑定特定硬件厂商的推理库。如果你用的是 Apple Silicon也可以把示例中的加载方式换成 MLX思路是一致的。在开始之前建议你先确认自己的环境满足下面这些条件操作系统macOS 或 Linux 均可Windows 也可以用但编译过程可能需要额外注意。Python建议 3.10 或更高版本。内存至少 8GB。如果要在 CPU 上跑 Q4 量化的 2.6B 模型16GB 内存会更舒服。磁盘空间预留 5GB 以上模型文件通常 1.5GB 到 3GB加上依赖和缓存。模型获取从 Hugging Face 等模型托管平台下载 GGUF 格式的量化文件。国内网络环境下如果访问不稳定可以考虑使用社区镜像站或者先在一台网络条件好的机器上下载再传到目标设备上。有一点需要提前说明不同的仓库和版本模型文件命名可能不同量化格式也可能不同。本文示例中的文件名是我为了演示写的一个占位路径你实际下载时要以你选定的模型仓库为准。这不影响整体流程只要把代码里的模型路径换成你的真实文件路径即可。环境准备的核心原则是先用最小配置把模型加载起来确认推理正常再叠加 Agent 逻辑。很多人在第一步就翻车是因为一上来就追求“完整系统”结果模型下载失败、依赖冲突、内存溢出全混在一起根本分不清问题出在哪里。5. 完整实现在端侧跑通一个带工具调用的 Agent这一节是实现核心我会分四步走安装依赖、获取模型、定义工具、编写 Agent 主循环。整个示例目标非常明确让模型能回答“现在几点钟了”“某个城市的天气如何”“帮我记一条待办事项”这类需要调用工具的问题。5.1 安装推理依赖建议先创建一个独立的 Python 虚拟环境避免污染系统环境。下面是完整的安装流程python3 -m venv .venv source .venv/bin/activate pip install --upgrade pip pip install llama-cpp-python如果你在 macOS 上编译遇到 Xcode Command Line Tools 缺失的问题需要先安装编译工具xcode-select --install如果你希望用 GPU 加速llama-cpp-python 支持通过环境变量指定后端。例如在 Apple Silicon 上启用 Metal 加速CMAKE_ARGS-DGGML_METALon pip install llama-cpp-python在 NVIDIA GPU 上则可以根据官方文档设置对应的 CUDA 后端。这里要特别提醒不同版本的 llama-cpp-python 对后端参数的支持不同如果某个后端编译失败不要死磕先退回纯 CPU 版本把流程跑通再说。5.2 获取量化模型文件模型文件名以你下载的实际文件为准。这里我用一个 Python 脚本演示如何从 Hugging Face 下载如果你手动下载直接把文件放到models/目录下即可# 文件路径download_model.py # 注意repo_id 和 filename 需要替换为你实际使用的模型仓库 from huggingface_hub import hf_hub_download model_path hf_hub_download( repo_idyour-org/lfm2.5-2.6b-gguf, filenamelfm2.5-2.6b-q4_k_m.gguf ) print(模型已下载到:, model_path)下载完成后把模型文件统一放到项目目录下的models/文件夹中方便后续管理。我的建议是不要在代码里写死绝对路径用相对路径或者通过环境变量传入模型路径这样换设备、换模型时不用改代码。对于量化格式从经验上看 Q4_K_M 是一个比较均衡的选择体积适中质量损失可控。如果你的设备内存充足可以尝试更高精度的量化如果设备資源紧张可以选 Q4_0 或 Q3 系列但要注意质量下降。5.3 定义可调用的工具端侧 Agent 的工具不需要复杂先用最容易验证的三个函数做示范。我把它们放在一个独立文件里方便后续扩展# 文件路径tools.py from datetime import datetime def get_current_datetime() - str: 返回当前本地时间格式为 YYYY-MM-DD HH:MM:SS return datetime.now().strftime(%Y-%m-%d %H:%M:%S) def get_city_weather(city: str) - str: 演示用工具返回指定城市的模拟天气。 真实项目中这里可以替换为天气 API 或本地传感器数据。 weather_map { 北京: 晴25°C, 上海: 多云28°C, 广州: 阵雨30°C, } return weather_map.get(city, f{city} 暂无天气数据) def add_todo(item: str) - str: 演示用工具把待办事项追加到本地列表文件。 注意生产环境需要做路径校验和写入权限控制。 with open(todo.txt, a, encodingutf-8) as f: f.write(item \n) return f已添加待办事项{item}这三个工具分别代表了端侧 Agent 最常见的三种能力读取设备信息、获取外部数据、写入用户数据。你可以看到工具本身没有任何魔法就是普通 Python 函数。关键是下一步如何用提示词让模型学会调用它们。5.4 编写 Agent 主循环主循环是端侧 Agent 的核心。不同于云端 Agent 可以依赖框架自带的结构化输出机制这里我用一个更直观、更可控的方式在系统提示词里把工具调用格式定义为 JSON让模型输出 JSON 文本然后由 Python 解析并执行。这样做的好处是兼容性高不依赖特定推理框架的 tools 接口缺点是 JSON 解析需要做好容错。先看主程序# 文件路径agent_demo.py import json import re from llama_cpp import Llama from tools import get_current_datetime, get_city_weather, add_todo # 1. 工具注册表模型输出里的 tool 字段会映射到这里 TOOL_REGISTRY { get_current_datetime: get_current_datetime, get_city_weather: get_city_weather, add_todo: add_todo, } # 2. 系统提示词用最精简的语言描述工具调用规则 SYSTEM_PROMPT 你是运行在用户设备上的轻量级 AI Agent。你可以调用工具完成用户请求。 工具列表 - get_current_datetime获取当前时间无参数 - get_city_weather获取城市天气参数 city字符串类型 - add_todo添加待办事项参数 item字符串类型 当用户请求需要调用工具时只输出如下 JSON不要输出任何其他内容 {tool: 工具名, params: {参数名: 参数值}} 当用户请求不需要调用工具时直接给出简洁回答。 .strip() def extract_tool_call(text: str): 从模型输出中提取 JSON 对象兼容被代码块包裹的情况。 # 去掉可能的 markdown 代码块标记 text text.strip() if text.startswith(): text re.sub(r^[a-zA-Z]*\n?, , text) text re.sub(r\n?$, , text) try: return json.loads(text) except json.JSONDecodeError: return None def run_agent(user_input: str): messages [ {role: system, content: SYSTEM_PROMPT}, {role: user, content: user_input}, ] # 第一轮让模型决定是否调用工具 first llm.create_chat_completion( messagesmessages, temperature0.1, max_tokens256, ) raw_output first[choices][0][message][content] print([模型第一轮输出], raw_output) tool_call extract_tool_call(raw_output) # 情况一模型直接回答了用户没有调用工具 if tool_call is None or tool not in tool_call: print([最终回答], raw_output) return # 情况二模型要求调用工具 tool_name tool_call.get(tool) params tool_call.get(params) or {} if tool_name not in TOOL_REGISTRY: print([错误] 模型输出了未注册的工具:, tool_name) return print(f[调用工具] {tool_name}({params})) result TOOL_REGISTRY[tool_name](**params) print([工具结果], result) # 把工具结果拼回对话上下文让模型生成最终回答 messages.append({role: assistant, content: raw_output}) messages.append({role: user, content: f工具执行结果{result}请用自然语言回复用户。}) second llm.create_chat_completion( messagesmessages, temperature0.1, max_tokens256, ) final_answer second[choices][0][message][content] print([最终回答], final_answer) if __name__ __main__: # 加载模型n_ctx 根据设备内存调整 llm Llama( model_pathmodels/lfm2.5-2.6b-q4_k_m.gguf, n_ctx2048, verboseFalse, ) # 测试用例 1调用时间工具 run_agent(现在几点了) # 测试用例 2调用天气工具 run_agent(北京今天天气怎么样) # 测试用例 3调用待办工具 run_agent(帮我记一下下午三点开周会)这段代码看起来不长但它已经是一个完整的最小端侧 Agent。你需要理解其中三个关键设计。第一个关键设计是“先输出工具指令再输出最终回答”的两阶段流程。我刻意把流程拆成了两次模型调用第一次只让模型输出工具调用 JSON第二次把工具结果拼回去让模型生成自然语言回答。这样做的好处是职责清晰模型每次只做一件事输出更容易稳定。如果你追求更低延迟也可以让模型在拿到工具结果后直接以对话方式继续但这要求你更精细地控制提示词。第二个关键设计是 JSON 解析时的容错。extract_tool_call函数里去掉了 Markdown 代码块标记还用try/except捕获了解析失败。这个处理不是多余。端侧小模型很容易把 JSON 包在自然语言或代码块里如果你不处理整个 Agent 会频繁崩在解析这一步。第三个关键设计是工具调用的参数透传。我用TOOL_REGISTRY把工具名映射到具体函数调用时用**params展开参数。这样做的好处是新增工具非常方便你只需要在tools.py里写函数、在注册表里加一行映射、在系统提示词里加一句描述就可以让模型学会调用新工具。这种“函数即工具”的思想是端侧 Agent 扩展能力的基本方式。5.5 运行程序确认模型文件已经放到models/目录后直接运行python agent_demo.py首次加载模型需要读盘和解量化等待时间取决于你的磁盘速度和 CPU 性能通常在几秒到几十秒之间。加载完成后你会看到模型依次处理三个测试用例。6. 运行结果与效果验证运行成功后控制台会输出类似下面的信息[模型第一轮输出] {tool: get_current_datetime, params: {}} [调用工具] get_current_datetime({}) [工具结果] 2025-06-14 15:23:11 [最终回答] 现在是 2025 年 6 月 14 日下午 3 点 23 分。 [模型第一轮输出] {tool: get_city_weather, params: {city: 北京}} [调用工具] get_city_weather({city: 北京}) [工具结果] 北京晴25°C [最终回答] 北京今天天气晴朗气温 25 度。 [模型第一轮输出] {tool: add_todo, params: {item: 下午三点开周会}} [调用工具] add_todo({item: 下午三点开周会}) [工具结果] 已添加待办事项下午三点开周会 [最终回答] 好的已经帮你记下今天下午三点开周会。判断 Agent 是否成功的标准有三个缺一不可第一模型第一轮输出能被json.loads解析成功。这一步失败了说明模型输出格式不稳定或者提示词描述不清楚。第二工具名和参数被正确映射到注册表里的函数没有出现“模型发明工具”的情况。第三第二轮模型能根据工具结果生成自然语言回复而不是把 JSON 原样扔给用户。如果程序运行失败第一步应该先看“模型第一轮输出”这一行打印的原始内容。绝大多数问题都出在这里要么模型没有输出 JSON而是直接回答了用户要么 JSON 格式不合法要么工具名不存在。你先看这一行就能确定问题方向而不是去怀疑安装或代码。这里我还想强调一个验证细节不要只看一两个用例就草率下结论。端侧 Agent 的工具调用是有成功率的同一个问题多跑几次结果可能不同。如果你想评估一个模型适不适合你的场景至少要准备 20 到 50 个覆盖不同工具和边界情况的测试用例统计工具调用成功率和最终回答准确率再做判断。7. 端侧 Agent 的常见问题与排查方法从我的经验来看端侧 Agent 项目踩坑高度集中下面这张表覆盖了 90% 以上的问题。当你遇到异常时先对照这个表定位问题现象可能原因排查方式解决方案模型加载时进程崩溃或 OOM内存不足或量化格式与框架不兼容查看内存占用确认 GGUF 文件完整性换更小量化格式降低 n_ctx关闭其他占用内存的程序模型输出无法用 JSON 解析提示词描述不清晰模型能力不足以理解结构化输出打印原始输出检查是否被代码块或说明文字包裹精简系统提示词增加输出示例降低 temperature在提示词中强调“只输出 JSON”模型调用了不存在的工具模型产生了幻觉工具描述和实际注册表不一致打印 tool_call 内容核对 TOOL_REGISTRY在提示词里明确列出所有工具名保持工具列表精简增加工具名校验逻辑中文输出乱码量化模型词汇表损坏或终端编码问题检查终端编码是否为 UTF-8换用其他量化文件测试设置PYTHONIOENCODINGutf-8重新下载模型文件多轮对话后开始答非所问上下文过长模型丢失早期关键信息观察 n_ctx 是否被占满打印 tokens 使用量压缩历史消息只保留最近几轮关键信息用摘要方式维护工具执行了但结果没被模型利用第二轮提示词里工具结果位置不对或分隔不明显打印完整 messages 列表检查消息顺序把工具结果单独作为一个 user 消息并明确要求“根据工具结果回答”首次加载速度特别慢模型从磁盘读取解量化需要时间观察是否只有第一次慢后续快预先用工具加载后再提供服务或改用内存映射方式加载温度过高导致输出随机性强temperature 设置过大结构化输出不稳定检查生成参数工具调用阶段把 temperature 设为 0 到 0.1表格里的解决方案都比较直接但我想特别强调“工具调用阶段把 temperature 调低”这一点。很多人在端侧模型上纠结为什么 JSON 输出不稳定却忽略了 temperature 的影响。在需要结构化输出的场景里temperature 越低输出越确定。你可以把工具调用和最终答案生成的 temperature 分开设置前者用接近 0 的值后者可以稍微放宽。另一个容易被忽略的问题是 n_ctx 的合理设置。端侧模型内存有限n_ctx2048意味着模型最多只能看到大约 2000 个 token 的内容。如果你把工具定义写得很长再加上对话历史用户真正的问题可能只占很小一部分。这不是模型“笨”而是你把它的工作内存装满了。8. 从 Demo 到产品端侧 Agent 工程的最佳实践跑通上面这个 Demo 只代表你完成了 10% 的工作。从 Demo 到真正可用的产品还有大量工程问题需要处理。我把它们总结成了七个方面都是实际项目中一定会碰到的。8.1 工具调用协议的稳定性设计端侧模型的工具调用稳定性永远不可能做到 100%。所以你的系统必须有“容错阶梯”第一层是 JSON 解析失败后自动重试一次重试时把上一次的错误输出拼进提示词让模型修正第二层是重试仍然失败时向用户返回降级回复比如“我暂时无法处理这个请求请换一种说法”第三层是把非法输出记录到日志方便后续优化提示词或换模型。这个设计的思想是工具调用不是“能做不能做”的问题而是“做不好时系统如何优雅应对”的问题。8.2 安全边界与权限控制端侧 Agent 能做越来越危险的事情发消息、删除文件、修改设置、调用支付接口。所以工具必须走白名单机制每个工具都有明确的操作范围。生产环境里建议给每个工具增加权限级别只读操作、写操作、敏感操作。敏感操作比如发送消息、删除数据必须经过用户二次确认。另一个重要原则是最小权限Agent 进程本身不应该有管理员权限工具函数内部也要做参数校验就像示例代码的add_todo函数里如果写入路径是用户可控的就要防目录穿越。涉及删除、覆盖、修改配置等不可逆操作时必须在测试环境验证并做好备份。8.3 超时、重试与降级策略端侧模型虽然在本地跑但也会因为设备过热、CPU 被占用、内存不足等原因变慢甚至卡死。你的主循环必须要有超时保护。单次模型推理超时后可以选择降低上下文窗口重试或者直接降级为“正在处理”的提示。工具执行也要有超时尤其是调用网络 API 的工具不能因为第三方服务无响应就让整个 Agent 卡住。一个实用的原则是用户等待一个 Agent 动作最多 5 秒超过就给出反馈而不是让界面一直转圈。8.4 日志与可观测性端侧 Agent 的调试比云端更难因为问题复现可能依赖用户的设备和数据。所以日志设计从一开始就要做好。每次模型调用都要记录输入 prompt 的 token 数、输出内容、耗时、是否解析成功、调用了哪个工具、工具返回了什么。这些日志应该统一格式方便回传和分析。云端 Agent 可以依赖服务端日志端侧 Agent 则要提前设计“用户愿意回传日志”的机制比如设置调试开关用户遇到问题后一键导出日志。8.5 上下文管理的工程化小模型的上下文窗口是稀缺资源。不要每次把整套对话历史都塞给模型。实践中比较常用的策略是系统提示词固定占用最优空间工具描述按需加载历史对话做截断或摘要工具执行结果只保留关键信息。如果用户在一个会话里连续使用了多个工具你可以把较旧的结果压缩成一句话比如“15 分钟前已经查询了北京天气”。这样既能保持上下文连贯又不会把模型的工作内存占满。8.6 模型量化与硬件适配同一款模型在不同设备上的表现差异很大。你需要在目标设备矩阵上做量化精度和性能的测试而不是只看模型介绍。建议至少测试 Q4_K_M、Q5_K_M 和 Q8_0 三档量化对比工具调用成功率和设备耗电、发热、延迟情况然后确定一个能覆盖大多数用户设备的最低档位。对特殊设备可以准备多份不同量化格式的模型包在客户端根据硬件能力动态选择。8.7 模型更新与回滚机制端侧 Agent 的模型文件是离线运行的所以更新策略和云端 API 完全不同。云端换模型只需要改一下接口配置端侧却需要向用户设备分发一个 1.5GB 甚至更大的文件。这意味着你要考虑新版本模型如何灰度发布、用户设备存储不足怎么办、下载失败如何续传、新模型效果变差如何快速回滚。我的建议是模型文件版本和 Agent 应用版本分离并保留至少一个历史版本作为回滚目标。上线新模型前必须在典型设备上做自动化的工具调用回归测试而不是只看人工体验。以上七点每一块都对应真实的故障案例。你会发现端侧 Agent 的工程复杂度一点不比云端低只是复杂的位置不同。云端主要处理的是成本和扩展性端侧主要处理的是设备碎片化、资源约束和稳定性。9. 总结与后续学习方向这篇文章的核心观点可以概括成一句话LFM2.5-2.6B 这类端侧模型的真正价值不是参数规模上的突破而是让 Agent 应用第一次有可能完全运行在设备端把隐私、时延、成本三个老大难问题同时解决。我们从概念讲起明确了 On-Device Agent 的定义和架构组成对比了它和云端 Agent 的本质差异然后完整跑通了“模型加载 → 工具定义 → 调度循环 → 结果回传”的最小系统接着给出了一份覆盖高频问题的排查表最后从七个方面讨论了从 Demo 到产品必须考虑的工程问题。如果你已经照着文章跑通了示例代码那么恭喜你你已经比很多停留在看论文阶段的开发者前进了一步。下一步的学习方向我建议你按这个顺序推进把你自己的真实工具接入上面这个循环比如文件管理、系统命令、网络请求体验一下“模型学会用你的工具”这个过程。研究你所用设备的专用推理框架Apple 芯片看 MLXAndroid 平台看 MNN 或 TFLite目标是进一步降低延迟。深入理解量化原理从“会用 GGUF”提升到“知道为什么 Q4_K_M 比 Q8_0 更值得默认使用”。设计一套针对工具调用成功率的自动化评测集用数据而不是感觉来评估模型和提示词的每次改动。如果条件允许看一遍 LFM 系列的技术文档和开源仓库关注它在工具调用、函数调用方面的实现细节。最后给你一个提醒端侧 Agent 这条路还非常早期没有哪个框架或模型是标准答案。今天你踩过的每一个坑都会成为你未来做端侧 AI 产品时的护城河。先用最小系统跑起来再一步步做深这是最不容易走错的路线。建议收藏这篇文章等你真正动手部署时再回来对照。