端侧Agent这条线,之前写过第一篇,总体的架构和场景都聊了。回帖里问得最多的是:架构理解了,但落地时LLM到底怎么部署到板子上?这篇就接着来,核心只有一个——端侧LLM部署。做Agent的人应该都有感受:Agent不是一个模型,而是一个系统,它要高频感知、决策、调用工具,如果每次决策都走云端,延迟和成本立刻会让你崩溃。所以把LLM搬到端侧、在本地设备上跑起来,是端侧Agent从demo走向产品的那一步。
这篇我把一条实战链路完整写出来:硬件怎么选、模型怎么量化、用哪个推理框架、怎么接入Agent、遇到问题怎么排。不搞玄学,给的都是能直接操作的方案。想在自己板子上跑起Agent的开发者,或者已经在跑但性能不满足的人,都可以参考。
1. 为什么端侧Agent必须本地跑LLM:从架构倒推出部署要求
1.1 本地推理和云端调用的本质区别
很多做云端Agent的朋友觉得奇怪:LLM调用API不就好了,为什么非要在端侧折腾部署?这个问题的答案,从Agent的执行模式上就能看出来。
云端调用的路径是:设备采集数据 -> 上传云端 -> 云端大模型推理 -> 返回结果 -> 设备执行。一次任务至少要两次网络往返,每趟按100毫秒算,单轮决策就要多出200毫秒以上。而Agent任务不是一次请求就结束的,你让Agent“把客厅的空调调到26度”,它可能要先后完成:理解意图、确认客厅是哪台设备、检查设备在线状态、生成控制指令、确认执行结果。这一串流程里LLM至少被调用5到10次。次数一多,云端调用的延迟就从“可接受”变成了“没法用”,更不用提网络抖动、离线断连、按token计费这些现实问题。
端侧推理把整个推理过程放在本地,数据不出设备,延迟可控,离线也能跑。我做过一个智能音箱类的端侧Agent,用本地7B模型跑意图识别和槽位抽取,首token响应在1秒以内,整体控制链路从用户说完话到设备动作,2秒左右能完成。这个体验感,云端方案在弱网环境下基本给不到。
用生活里的话类比:云端调用像点外卖,厨师在别处做饭,高峰期还得等;端侧推理像把厨师请到家里,随时炒菜,只是家里厨房小,菜式简单些。Agent这种高频决策场景,等不起外卖,只能请厨师上门。
1.2 端侧Agent的“感知-推理-行动”闭环
要理解端侧LLM部署到底要部署成什么样,先得看Agent的完整闭环。一个典型的端侧Agent,通常由三层组成。
感知层负责采集和识别环境信息。比如在RK3588板子上跑YOLOv8做目标检测,识别摄像头画面里的障碍物、人、宠物;或者用麦克风阵列做语音唤醒和ASR,把语音转成文字。这一层生成的不是语言,而是结构化的环境状态:位置、类别、置信度。
认知层是LLM的主场。它拿到感知层输出的环境描述和用户指令,理解当前发生了什么、用户想要什么,然后规划行动序列。这一层输出的也不只是自然语言,更关键的是结构化的工具调用指令:调用哪个API、传入什么参数、期望什么结果。
行动层把LLM生成的指令转成真实动作。开灯、播放音乐、刹车、上报信息,都由行动层的代码模块执行。执行完的结果会反馈回认知层,LLM判断“行动是否达到预期”,再决定是否进入下一个步骤。
端侧LLM部署的本质,就是在认知层这个位置,把一个本地模型跑起来,并让它和感知层、行动层的数据格式对齐。很多人在板子上单独跑模型很顺利,一接入Agent就卡住,就是因为只把模型当成了“聊天机器人”,没有把它当成决策组件。整条链路里,LLM负责的是“理解环境并决定做什么”,而不是“陪用户闲聊”。
2. 硬件和框架怎么选:先看带宽,再看TOPS
2.1 选硬件先算内存带宽,别迷信TOPS算力
端侧Agent的硬件选型,是非常多项目一开始就选错的地方。不少人一看RK3588标称6TOPS算力,就觉得“咦,能跑神经网络,那跑LLM应该也行”,结果模型一拉上去,速度惨不忍睹。
原因很简单:LLM推理和CNN类视觉任务,计算特征完全不同。YOLOv8这类视觉模型是计算密集型,卷积算得多,NPU的TOPS算力提升立竿见影;但LLM推理是内存带宽密集型,每生成一个token都要把模型权重从头到尾读一遍,推理速度的天花板由内存带宽决定,而不是TOPS。
给一个粗略但好用的估算公式:每秒生成的token数,理论上限约等于内存带宽除以模型权重大小。
拿最常见的7B模型量化后大概4GB权重来算。Jetson Orin Nano 8GB版本的内存带宽约68GB/s,理论上限就是68除以4,约每秒17个token。实际跑起来还要扣除KV Cache占用、系统调用、并发开销,我实测大概在8到12 token/s。这个速度做实时语音对话刚好及格,做高并发响应则比较吃力。再看RK3588,它的优势在NPU和整机功耗,但内存带宽本身不高,跑7B量化模型实测通常在1到3 token/s,做在线对话基本不可用,更适合跑1.5B到3B级别的小模型,配合视觉感知任务使用。
不同硬件的选择逻辑,我整理了一个速查表:
| 硬件平台 | 内存带宽参考 | 能稳定跑动的模型级别 | 实测体验 | 适合场景 |
|---|---|---|---|---|
| Jetson Orin Nano 8GB | 约68GB/s | 7B-8B模型Q4量化 | 8-12 token/s,可对话 | 端侧Agent主力板卡 |
| Jetson Orin NX 16GB | 约102GB/s | 7B-14B模型Q4量化 | 15-25 token/s,体验明显更好 | 对延迟有要求的Agent设备 |
| RK3588 8GB/16GB | 相对偏低 | 1.5B-3B模型 | NPU跑YOLOv8很强,LLM吃力 | 感知+小模型轻量Agent |
| x86迷你主机 | 取决于内存频率 | 7B-32B模型 | 中高速,看内存条 | 开发调试、边缘网关 |
选硬件的时候,我会建议先算一笔账:你的Agent需要的最小模型是哪个规格,量化后多大,目标设备带宽多少,按公式估算能不能达到你要的“最低可用速度”。如果连10 token/s都到不了,就别硬上一个7B模型,要么换设备,要么降级模型。硬件选型不是选最强的,是选刚好够用的。
2.2 推理框架怎么选:Ollama、llama.cpp、MLC-LLM怎么用
模型要跑起来,推理框架是绕不开的环节。端侧圈子里,常见的开源框架就那么几个,各自擅长方向不同。我的经验是:不要一上来就追求最底层、最“硬核”的方案,而是根据项目阶段选择。
Ollama是目前端侧LLM部署里最省心的一个。一条命令安装,拉模型、启动服务、提供OpenAI兼容的HTTP接口,基本都给你做好了。适合快速验证模型效果、做原型Demo、或者项目前期跑通链路。我很多项目都是从Ollama起步的,因为它能让我把时间花在Agent逻辑上,而不是去调推理参数。
llama.cpp主打GGUF格式和CPU/GPU混合推理,几乎所有开源模型的GGUF量化版本都能跑,而且可以直接编译目标平台,嵌入自己的程序里。如果你要做的不是“起一个服务”,而是把LLM作为模块嵌进C++或Python进程里精细控制,那llama.cpp是更稳的选择。它还可以通过参数控制多少层offload到GPU,调试空间大,但学习成本也更高。
MLC-LLM对手机端支持很积极,Android、iOS上跑小模型效果好,如果你做的是手机App里的端侧Agent,可以优先尝试。至于vLLM这类高性能服务框架,虽然做大并发很厉害,但那是给服务器设计的,端侧内存和显存根本撑不起它的调度开销,别盲目搬。
选型建议很直接:
- 想做最快出结果的Demo:直接用Ollama。
- 想把LLM抽成库函数嵌进自己的程序:用llama.cpp。
- 想跑手机App:看MLC-LLM。
- 不管用哪个,都建议从GGUF量化格式起步,因为兼容性最好,换框架成本低。
我在实际项目中,通常先用Ollama把整条Agent链路跑通,验证“模型选对了没、工具调用顺不顺”,再到后期做产品化时,根据端侧资源情况决定要不要换llama.cpp精细优化。这个路径对一个人开发或小团队最省时间。
2.3 模型选型和量化:为什么Q4_K_M是端侧甜点
模型是端侧Agent的脑子,选错型号后面所有的优化都是白费。
以目前的主流开源模型来看,Qwen2.5-7B-Instruct、Llama-3.1-8B、DeepSeek-R1-Distill-Qwen-7B这几类,经过4-bit量化后体积都在4到5GB,塞进8GB内存的设备还有富余空间跑感知模型和KV Cache,是端侧Agent最常用的区间。具体选哪个,要看Agent的任务偏什么:指令遵循和工具调用优先Qwen2.5系列;复杂推理和规划,DeepSeek蒸馏版确实更强,但速度比同尺寸通用模型要慢,不能所有请求都用它;Llama系列兼容性和生态更好,海外社区资料多。
这里必须讲一下量化。模型量化就是把原本用16位浮点存权重,压缩到8位、4位甚至更低来存。FP16的7B模型要占14GB内存,INT8后约7GB,INT4后约3.5到4GB。内存一降,加载和推理都更快,但代价是精度损失。
不同量化方式里,llama.cpp体系中最常用的是Q4_K_M。它采用混合量化策略,对模型不同张量用不同位宽处理,在体积和效果上平衡得很好。Q3体积更小但输出质量下降明显,尤其是工具调用场景,经常会出现JSON格式错乱、参数丢失这类问题;Q5质量更好但体积多出不少,在8GB设备上会挤压上下文空间。我做了十几个端侧项目后,基本固定用Q4_K_M起步,先保证输出稳定性,再谈体积优化。
还要留意KV Cache。上下文越长,KV Cache占用内存越大,8K上下文在7B模型上通常要额外占0.5到1GB内存。部署时你把模型和上下文的内存一起算进去,预留20%余量,不要卡着内存上限跑,否则一压测就OOM,非常折磨。
3. 从零部署端侧LLM:一份完整流程实录
3.1 环境准备与Ollama安装
我以Jetson Orin系列为例讲部署,因为它是目前端侧Agent最典型的硬件平台。其他板子流程类似,只是需要适配对应的芯片架构。
第一步,确认开发环境。Orin板卡刷好JetPack 5.x或6.x系统,JetPack自带CUDA、cuDNN、TensorRT这些组件,是后续跑GPU推理的基础。装完系统先用nvidia-smi看一下CUDA是否正常识别,确保GPU驱动工作正常。
第二步,安装Ollama。用官方安装脚本一行命令比较直接:curl -fsSL https://ollama.com/install.sh | sh。它在x86和ARM平台都支持,Orin上装完会自动识别CUDA环境,推理时优先调用GPU。如果安装脚本方式在你的平台上有问题,也可以从Ollama的GitHub Release页面下载对应架构的二进制包手动安装,原理是把它丢进/usr/local/bin并配置systemd服务。
第三步,简单配置。Ollama默认只在本机11434端口监听,如果Agent跑在同一台板子上就不用管;如果Agent单独跑在另一个设备上,需要设置OLLAMA_HOST=0.0.0.0让它监听所有网卡。改配置的方式是在systemd服务文件里加Environment,或者用export命令临时设置再启动服务。
启动完成后,验证服务正常:访问http://127.0.0.1:11434/api/tags,能看到一个JSON格式的模型列表,说明服务已经活起来了。
3.2 拉取模型与量化选择
Ollama的模型库非常方便,拉模型就是一行命令。以我常用的Qwen2.5 7B Instruct Q4_K_M为例:
ollama pull qwen2.5:7b-instruct-q4_K_M这个命令会从模型仓库拉取对应的GGUF量化文件。如果你的网络环境访问模型社区不便,也可以在ModelScope这类平台找到同一份GGUF文件手动下载,再通过Ollama的Modelfile方式导入本地。步骤是:建一个Modelfile,内容写FROM /path/to/qwen2.5-7b-instruct-q4_k_m.gguf,然后执行ollama create qwen2.5-7b -f Modelfile。这种方式能让你自由使用自己下载的量化文件,不依赖在线拉取。
如果你要自己从原始FP16权重做量化,那就需要llama.cpp的转换工具链。基本流程是:下载Safetensors格式的原始权重,用convert_hf_to_gguf.py转成FP16的GGUF,再用llama-quantize转成Q4_K_M量化版。这步对只想用模型的朋友来说可以跳过,直接从社区下载现成的GGUF文件就行。
这里有个实操提醒:Ollama标签名里的q4_K_M后缀不要随意删掉。有时候你直接pull qwen2.5:7b-instruct,拉下来是默认的Q4_0量化,效果虽然也能用,但和Q4_K_M相比还是有差距。如果Agent要输出工具调用,建议明确指定q4_K_M标签,输出稳定性更好。
3.3 性能实测与参数调优
模型跑起来之后,先别急着接Agent,把性能摸清楚。我习惯用一个简单的命令行测试:
ollama run qwen2.5:7b-instruct-q4_K_M --verbose "用一句话说明什么是端侧Agent"--verbose参数会在输出结束后打印性能指标,包括加载耗时、评估耗时、每秒token数等。在Orin Nano 8GB上,我的实测结果是:30W功耗模式下,7B Q4_K_M模型稳定在8到12 token/s,首token大约0.8到1.2秒。如果是Orin NX 16GB,速度能到15到25 token/s,体感流畅很多。
影响速度的几个参数,逐个说:
OLLAMA_NUM_PARALLEL控制并行请求数。端侧设备内存有限,并行数开太高会让多个请求同时抢内存带宽,单请求延迟反而恶化。一般Agent场景设成1就够了,最多2。
OLLAMA_CONTEXT_LENGTH控制上下文长度。默认是2048或4096,对Agent来说不够用。Agent的prompt里要放系统提示词、工具定义、历史对话、RAG检索片段,很容易超过4K。我会按设备内存余量调到8K或16K,但注意上下文越长,KV Cache占内存越多,推理速度也会轻微下降。
Jetson板卡的功耗模式对性能影响也很大。Orin的nvpmodel里,15W模式和30W模式的速度差距非常明显,实测可以差到50%以上。如果你的Agent装在固定电源设备上,直接开30W模式;如果是电池供电,那就得在续航和响应速度之间做取舍。
散热是另一个隐蔽的坑。Orin这类高功耗板卡在持续推理时发热很猛,环境温度一高就触发降频,速度会慢慢掉下来。我做过一次压测,刚开始跑得很快,几分钟后越来越慢,量温度发现已经到了降频阈值。后来加装主动散热风扇,速度才稳定下来。所以测性能不是跑一次就算数,至少持续跑5分钟以上,看速度曲线是否平稳。
3.4 放大招:把本地模型变成OpenAI兼容接口
Agent框架接大模型,最省事的方式是走OpenAI兼容的接口。Ollama直接提供了/v1路径,完全兼容OpenAI的ChatCompletion接口格式,这样你在Agent代码里几乎不用改任何调模型的部分,只需要把base_url换成本地地址。
用最直观的Python代码演示:
from openai import OpenAI client = OpenAI( base_url="http://127.0.0.1:11434/v1", api_key="ollama" # 本地服务可以随便填 ) resp = client.chat.completions.create( model="qwen2.5:7b-instruct-q4_K_M", messages=[ {"role": "system", "content": "你是一个智能家居助手,请使用工具完成用户指令。"}, {"role": "user", "content": "把客厅的灯打开"} ], tools=[ { "type": "function", "function": { "name": "turn_on_light", "description": "打开指定房间的电灯", "parameters": { "type": "object", "properties": { "room": {"type": "string", "description": "房间名称"} }, "required": ["room"] } } } ], tool_choice="auto" ) print(resp.choices[0].message.tool_calls)如果模型正确理解指令,返回结果里会有一个tool_calls字段,里面包含函数名和参数。Agent代码拿到这个结构化指令后,去执行对应的真实设备操作。
这段代码跑通,意味着Ollama已经不是一个“聊天工具”,而是变成了Agent的决策引擎。LangChain这类框架的连接方式也一样,ChatOllama类里设一下base_url和model,就能把本地模型当成LLM用。市面上主流的Agent框架基本都兼容这个路径。
这里要强调一个经验:不是所有模型都支持工具调用。纯Base模型、或者指令微调不充分的模型,不会正确输出tool_calls,它们只会用自然语言回答“好的,我帮你打开客厅的灯”,但不会生成结构化调用。所以模型选型时,一定要确认你选的是Instruct版本和明确支持function calling的模型,Qwen2.5 Instruct、Llama 3.1都是验证过可以用的。
4. 把LLM接进Agent:工具调用、并发与RAG实战
4.1 工具路由设计:把工具当成“KV存储”来理解
Agent和普通聊天机器人最本质的区别,在于Agent要自主选择调用什么工具。而工具选择的背后,是让LLM理解“用户任务需求”和“工具能力”之间怎么匹配。
这个阶段我习惯用一组概念来设计思维:每个工具有三个关键点——Key是工具的身份,描述“我是谁、我能做什么”;Query是当前用户的意图,描述“我在找什么”;Value是工具的返回数据,描述“我能提供什么”。LLM要做的事情,就是根据Query去匹配工具的Key,决定调哪个工具,再把Value拿回给用户。
这个思路落实到工具描述上,就是工具description一定要写清楚触发条件。比如有两个工具,一个叫“查询天气”,一个叫“打开空调”,如果描述写得含糊,本地模型就会选错。正确的写法是每个工具都说明“当用户提到XX任务时使用我”。描述不要超过一句话,太长会让7B级别的模型注意力分散。
另一个实操技巧是控制工具数量。一个8B模型,一次调用时tools列表里塞20个工具,每个工具带复杂JSON Schema,本地模型的输入被工具定义占掉一大截,选择准确率明显下降,响应也更慢。我的做法是给工具分组建模:家庭控制组、信息查询组、媒体播放组,先用一个小模型做意图路由,判断用户想干哪类事,再只把那组工具的完整定义传给7B主模型做参数抽取。这一步是Agent架构级的优化,效果比重训模型明显得多。
4.2 端侧Agent怎么扛并发:别硬扛,要排队
“AI Agent怎么扛并发”是很多从云端转端侧的开发者的第一个疑问。答案可能让人失望:端侧设备真的扛不了大并发。
服务器端并发靠的是多卡、大显存、动态批处理,设备端一共8GB内存,同时驻留两个模型都费劲,更不用说几十路并发。与其硬扛,不如设计成“单路快速响应、多路排队等待”的架构。
Ollama的OLLAMA_NUM_PARALLEL参数可以开启并行推理,但我实测下来,在Orin Nano上并行数从1调到2,单个请求的延迟反而明显恶化。原因还是内存带宽被多路请求瓜分,每路都等权重加载,吞吐总量没上去,延迟却被拉高了。
端侧Agent扛并发的正确姿势,是在Ollama前面加一层轻量的请求网关。把Agent的每次LLM请求封装成任务,进入队列,由网关决定先处理哪个、要不要合并、超时的怎么降级。这个网关不需要多复杂,一个队列加几个配置项就行,但它能把并发压力从LLM服务本身平摊到调度层。
从业务上也要做拆分。Agent任务里,紧急且短耗时的事(比如开关灯、识别一句话)走端侧LLM实时推理;不紧急的事(比如生成日报、整理数据)可以放到后台排队,甚至等设备空闲的低峰期再处理。这样用户感知到的响应速度就稳住了,整个系统的并发压力也降下来了。
4.3 RAG也能本地化:端侧Agent的知识库方案
端侧Agent除了工具调用,经常还要处理私有知识问答。比如设备维修助手要查产品手册,家用Agent要理解家庭成员的偏好。这些知识不可能全塞进模型权重里,RAG是目前最务实的方案。
RAG最简单的落地路径:把文档切成块,用Embedding模型转成向量,存进向量库。用户提问时,把问题也转成向量,检索出语义最相近的几个文档片段,拼到LLM的上下文里,让模型基于参考内容回答。
端侧跑RAG不需要引入重型向量数据库,一个sqlite-vec就够用。Embedding模型也可以本地跑,比如bge-m3这类轻量模型,在CPU上都能勉强跑,或者直接用Ollama支持的embedding模型。这样整条链路从知识存储到检索、到推理,完全不依赖外部服务,做到真正离线。
检索策略上,端侧模型对噪声的容忍度比云端大模型低很多。云端GPT上下文窗口大、模型能力强,塞一堆无关片段还能硬扛;端侧7B模型如果TopK取20个片段,很容易被其中的噪声带偏,答非所问。我把TopK先设成3到5个片段,优先保证精读质量,不够再调高。
更复杂的知识场景,比如结构化知识图谱,确实可以用本体抽取和GraphRAG的思路,先抽取实体关系再检索,准确率更好。但端侧算力有限,这步建议作为项目二期优化,第一版先用简单向量检索把链路跑通,验证Agent整体体验,再去加复杂度。
5. 端侧LLM部署踩坑实录与排查手册
5.1 高频问题速查表
端侧部署的坑,很多是重复出现的。我把高频问题和排查思路整理成一个表,方便你现场对照:
| 问题现象 | 常见原因 | 解决办法 |
|---|---|---|
| 模型加载失败或OOM | 内存余量不足,上下文配置过大 | 换更小的量化等级,降低context长度,清理无用加载模型 |
| 推理速度慢 | 目标设备带宽不够、散热降频、模型偏大 | 先用公式估算上限,换小模型或更高带宽设备,检查温度 |
| 输出乱码或重复句子 | 量化过度、解码参数不合适 | 改用Q4_K_M,调低temperature,设repeat_penalty |
| 工具调用返回空或格式错 | 模型不支持tool calling,工具描述不清晰 | 换支持function calling的指令模型,精简tools定义 |
| 上下文过长被截断 | context长度配置小于prompt实际长度 | 调高OLLAMA_CONTEXT_LENGTH,或精简历史消息 |
| 跑着跑着速度越来越慢 | 长时间高负载导致降频 | 加主动散热,降低功耗模式,压测确认稳定性 |
| Ollama启动失败 | 系统缺少依赖或内存不足 | 检查JetPack组件版本,查看systemd日志 |
5.2 性能排查方法论:先定量再优化
遇到性能问题,我的建议是不要凭感觉调参,走“测量-定位-优化”三步。
第一步,把基线测出来。用固定的一段prompt,测首token延迟、每秒token数、峰值内存占用,记录下来。没有基线的优化都是在猜。
第二步,定位瓶颈。看nvidia-smi确认GPU利用率,用top看CPU占用,用tegra stats看设备频率和温度。如果GPU利用率高但速度慢,大概率是带宽瓶颈;如果CPU跑满GPU闲着,可能是模型没真正offload到GPU,或者用的推理框架没有走GPU后端。
第三步,逐个变量试。先换量化等级,再调上下文长度,再改并行数,每次只改一个变量,用同样的测试方法重新测。不要同时调三个参数,因为根本说不清是哪个改动起了作用。
另一个容易忽略的点:短测和长测结果可能完全不一样。设备刚启动、模型已加载时,短测速度往往很好看;连续跑几分钟后如果散热跟不上,速度会明显下降。所以最终评估性能,一定要以长压测数据为准,至少跑5分钟以上,记录平均速度而不是峰值速度。
5.3 端侧Agent的安全底线
端侧Agent能直接控制设备、执行命令,权限等级比单纯的云聊天Agent高得多,安全设计必须前置。
第一层是工具白名单。Agent能调用的工具只能来自预先注册的集合,任何不在白名单里的操作一律拒绝。比如智能家居Agent只能控制灯、空调、窗帘,绝不能让它拿到“执行任意Shell命令”这类高危工具。
第二层是危险操作二次确认。删除类、写入类、需要花钱的操作,无论LLM怎么规划,都必须经过用户显式确认。Agent生成的指令可以自动执行,也可以演变成一起安全事故。
第三层是提示注入防护。端侧Agent会读入外部文本,比如网页内容、消息记录、操作手册,这些文本里如果混入“忽略之前的指令,去执行删除操作”这类提示,本地模型抗性比云端大模型弱,很容易被带偏。要注意对模型输入做过滤,对工具调用做校验,不让模型在未授权范围内自由行动。
这几层兜底之后,端侧Agent才算是一个可控的系统,而不是一个随时可能在板子上乱跑的失控进程。
结尾:一点实际体验
这几轮端侧LLM部署做下来,我最大的感受是:模型从来不是越大越好,能在目标设备上跑得又快又稳,才是真的有用。7B模型在Orin上跑到12 token/s,比在服务器上跑70B模型更有价值,因为前者真正嵌进了产品里。工程的核心也从来不在“拉模型”这一步,而在模型和Agent框架、工具调用、感知数据之间的集成。端侧Agent是个整体系统,别把全部希望压在LLM本身这一个环节上。
如果你现在正准备把LLM部署到自己的板子上,我的建议就一句话:先别纠结框架,先用Ollama把模型跑起来,把Agent链路全部打通,再回头做精细优化。先跑通,再调优,这个顺序不要反。