<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>LLM on Zesean 的博客</title><link>https://zeseanblog.top/tags/llm/</link><description>Recent content in LLM on Zesean 的博客</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><lastBuildDate>Sun, 06 Sep 2026 17:23:33 +0800</lastBuildDate><atom:link href="https://zeseanblog.top/tags/llm/index.xml" rel="self" type="application/rss+xml"/><item><title>聆行 VoxDrive — 分布式车载智能座舱（RK3588 + Jetson Orin 双板）</title><link>https://zeseanblog.top/projects/voxdrive/</link><pubDate>Fri, 04 Sep 2026 23:50:00 +0800</pubDate><guid>https://zeseanblog.top/projects/voxdrive/</guid><description>&lt;h2 id="项目概述"&gt;&lt;a href="#%e9%a1%b9%e7%9b%ae%e6%a6%82%e8%bf%b0" class="header-anchor"&gt;&lt;/a&gt;项目概述&#13;&#10;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;聆行 VoxDrive&lt;/strong&gt; 是一套跑在真实硬件上的双 SoC 分布式车载智能座舱：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;RK3588（LubanCat-4）= 媒体 + 端侧语音节点&lt;/strong&gt;：摄像头采集 → MPP 硬件编码 → MP4 循环存储 / RTMP 推流，NPU 跑行人/车辆检测做&lt;strong&gt;事件锁录&lt;/strong&gt;；流式 ASR（fp16 三模型 NPU 分载）与 TTS 合成（SummerTTS）也都落在这块板；&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Jetson Orin Nano = 中心 AI 节点&lt;/strong&gt;：LLM / RAG / 意图路由 / 画面问答 / Qt 数字座舱，全离线、不上云；&lt;/li&gt;&#10;&lt;li&gt;两板以太网互联：&lt;strong&gt;视频走 RTMP，控制与事件走 ZeroMQ&lt;/strong&gt;。语音可以控制录像、查状态、抓拍，还能直接问&amp;quot;画面里有什么&amp;quot;（VLM 看行车画面作答）；&lt;/li&gt;&#10;&lt;li&gt;麦克风与音箱是接在 RK 上的同一 USB 设备：说话本板识别、跨板查询、应答本板播报，播报期自动静音防&amp;quot;自己听到自己&amp;quot;（回灌）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;设计原则：&lt;strong&gt;数据密集走专用加速器（RK 的 VPU/RGA/NPU），模型密集走中心算力（Jetson 的 GPU）&lt;/strong&gt;；实时敏感、算力可承担的小模型（ASR/TTS）下沉边缘，大模型（LLM/VLM）留中心。&lt;/p&gt;&#10;&lt;h2 id="双板实物"&gt;&lt;a href="#%e5%8f%8c%e6%9d%bf%e5%ae%9e%e7%89%a9" class="header-anchor"&gt;&lt;/a&gt;双板实物&#13;&#10;&lt;/h2&gt;&lt;p&gt;左上 Jetson Orin Nano（带散热扇），右侧 RK3588 LubanCat-4，两板经路由器以太网互联；左下 7 寸 DSI 触摸屏接 RK，正在运行座舱 UI 的桌面会话；麦克风/音箱 USB 组合设备接 RK 侧：&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="双板实物：左上 Jetson Orin Nano、右侧 RK3588 LubanCat-4、左下 7 寸 DSI 触摸屏（座舱 UI 运行中），两板经路由器以太网互联，麦克风/音箱 USB 组合设备接 RK" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="1200" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/projects/voxdrive/images/hardware-setup.jpg" srcset="https://zeseanblog.top/projects/voxdrive/images/hardware-setup_hu_9510a3377c499d66.jpg 800w, https://zeseanblog.top/projects/voxdrive/images/hardware-setup.jpg 1600w" width="1600"&gt;&lt;/p&gt;&#10;&lt;h2 id="系统架构"&gt;&lt;a href="#%e7%b3%bb%e7%bb%9f%e6%9e%b6%e6%9e%84" class="header-anchor"&gt;&lt;/a&gt;系统架构&#13;&#10;&lt;/h2&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR&#10; subgraph RK ["RK3588 · 媒体节点 + 语音推理节点"]&#10; CAM["IMX415&lt;br/&gt;MIPI CSI"] --&gt; ISP["rkisp&lt;br/&gt;NV12 1080p"]&#10; ISP --&gt; ENC["MPP H.264 硬编&lt;br/&gt;VBR · 零 CPU 软编"]&#10; ENC --&gt; MP4["MP4 分段循环存储&lt;br/&gt;水位覆盖 · 事件锁录"]&#10; ENC --&gt; RTMP["RTMP 推流&lt;br/&gt;断流自动重连"]&#10; NPU["RKNPU&lt;br/&gt;YOLOv5s INT8"] --&gt;|"行人/车辆检测"| MP4&#10; SVC["recorder_service&lt;br/&gt;REP :6700 / PUB :6701"]&#10; MP4 --- SVC&#10; RTMP --- SVC&#10; MIC["USB 组合设备&lt;br/&gt;麦克风+音箱"] --- VS&#10; VS["voice_service&lt;br/&gt;NPU×3 流式解码"] --&gt;|"识别文本"| ROUTER&#10; TN["tts_node&lt;br/&gt;SummerTTS 多核&lt;br/&gt;本板播报"] -.-&gt;|"合成请求"| TTS&#10; end&#10; subgraph JS ["Jetson Orin · 中心算力节点"]&#10; MM["mediamtx&lt;br/&gt;RTMP/RTSP/HLS"] --&gt; UI["Qt 数字座舱&lt;br/&gt;预览 · 状态 · 告警"]&#10; VLMQ["画面问答"] -.-&gt;|"vlm 直通"| VLM["vlm_service&lt;br/&gt;Qwen2-VL-2B"]&#10; VLM -.-&gt;|"抓帧 :6700"| SVC&#10; ROUTER["意图路由"] --&gt; LLM["LLM&lt;br/&gt;Qwen2.5-1.5B"]&#10; ROUTER --&gt; RAG["RAG&lt;br/&gt;真实车主手册"]&#10; ROUTER --&gt; TB["Tool Bus"]&#10; TB --&gt; TTS["TTS 网关&lt;br/&gt;REQ :6720"]&#10; LLM --&gt; TB&#10; end&#10; RTMP --&gt;|"视频流"| MM&#10; TB &lt;--&gt;|"REQ :6700&lt;br/&gt;状态/抓拍/开关 (RTT 2ms)"| SVC&#10; SVC --&gt;|"PUB :6701&lt;br/&gt;水位/断流/检测事件"| UI&lt;/pre&gt;&lt;p&gt;两个平面刻意分开：视频大流量不进控制面，控制面单条消息只有几百字节——跨板工具往返实测 &lt;strong&gt;0.73-2ms&lt;/strong&gt;。语音链同理：&lt;strong&gt;音频采集、识别、合成、播报都在 RK 本板&lt;/strong&gt;，跨板只传识别文本与应答文本两条轻量通道。&lt;/p&gt;&#10;&lt;h2 id="真机实拍rk3588-7-寸触摸屏真屏拍摄"&gt;&lt;a href="#%e7%9c%9f%e6%9c%ba%e5%ae%9e%e6%8b%8drk3588-7-%e5%af%b8%e8%a7%a6%e6%91%b8%e5%b1%8f%e7%9c%9f%e5%b1%8f%e6%8b%8d%e6%91%84" class="header-anchor"&gt;&lt;/a&gt;真机实拍（RK3588 7 寸触摸屏，真屏拍摄）&#13;&#10;&lt;/h2&gt;&lt;p&gt;行车记录页：左侧 mediamtx 拉流的&lt;strong&gt;实时预览&lt;/strong&gt;（断流自动重连），右侧状态卡轮询 RK（帧率/段数/磁盘水位环）+ 实时事件日志，底部按钮经 tool_bus 直控真设备；语音气泡「你：打开行车记录」是刚说完一句语音导航后 UI 的回显：&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="RK 触摸屏·行车记录页：实时预览 LIVE + 存储水位环 + 事件日志 + 语音气泡" class="gallery-image" data-flex-basis="407px" data-flex-grow="169" height="908" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/projects/voxdrive/images/dashboard-touch-dashcam.png" srcset="https://zeseanblog.top/projects/voxdrive/images/dashboard-touch-dashcam_hu_bb7794176d726824.png 800w, https://zeseanblog.top/projects/voxdrive/images/dashboard-touch-dashcam.png 1540w" width="1540"&gt;&lt;/p&gt;&#10;&lt;p&gt;主页磁贴：录像状态横条（30.0fps / 138 段 / 5.8GB 可用）与四张磁贴的数据全部来自跨板实时链路，无一张静态图：&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="RK 触摸屏·主页磁贴" class="gallery-image" data-flex-basis="407px" data-flex-grow="169" height="908" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/projects/voxdrive/images/dashboard-touch-home.png" srcset="https://zeseanblog.top/projects/voxdrive/images/dashboard-touch-home_hu_c8c3f0673f171e6f.png 800w, https://zeseanblog.top/projects/voxdrive/images/dashboard-touch-home.png 1540w" width="1540"&gt;&lt;/p&gt;&#10;&lt;p&gt;行车记录仪原始画质参考（IMX415 直出 1080p 快照，RK 端 NV12→JPEG、跨板抓拍约 0.15s）：&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="IMX415 原始 1080p 快照" class="gallery-image" data-flex-basis="426px" data-flex-grow="177" height="1080" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/projects/voxdrive/images/snapshot-1080.jpg" srcset="https://zeseanblog.top/projects/voxdrive/images/snapshot-1080_hu_22f00068aaaacc49.jpg 800w, https://zeseanblog.top/projects/voxdrive/images/snapshot-1080_hu_c7de95e0f383a800.jpg 1600w, https://zeseanblog.top/projects/voxdrive/images/snapshot-1080.jpg 1920w" width="1920"&gt;&lt;/p&gt;&#10;&lt;p&gt;车控页 + 语音上屏（Jetson 侧实例同款界面）：问&amp;quot;现在录着吗&amp;quot;走真实链路（识别 → 路由 → 跨板查询 → LLM 组织 → TTS），底栏字幕是用户原话、气泡是基于真实工具应答生成的播报：&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="车控页与语音播报" class="gallery-image" data-flex-basis="426px" data-flex-grow="177" height="900" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/projects/voxdrive/images/dashboard-voice.png" srcset="https://zeseanblog.top/projects/voxdrive/images/dashboard-voice_hu_145be24756cde134.png 800w, https://zeseanblog.top/projects/voxdrive/images/dashboard-voice.png 1600w" width="1600"&gt;&lt;/p&gt;&#10;&lt;h2 id="行车记录视频链路rk3588"&gt;&lt;a href="#%e8%a1%8c%e8%bd%a6%e8%ae%b0%e5%bd%95%e8%a7%86%e9%a2%91%e9%93%be%e8%b7%afrk3588" class="header-anchor"&gt;&lt;/a&gt;行车记录视频链路（RK3588）&#13;&#10;&lt;/h2&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR&#10; A["IMX415&lt;br/&gt;RAW Bayer"] --&gt;|MIPI CSI-2| B["rkcif → rkisp&lt;br/&gt;3A/格式"]&#10; B --&gt;|NV12| C["V4L2 用户态&lt;br/&gt;mmap 4 缓冲 + DMA-BUF"]&#10; C --&gt; D["MPP H.264&lt;br/&gt;NV12 直入 · VBR"]&#10; D --&gt; E["Mp4SegmentSink&lt;br/&gt;I 帧边界滚动分段"]&#10; D --&gt; F["RtmpSink&lt;br/&gt;flv + extradata"]&#10; C -.每 30 帧.-&gt; G["最新帧槽"]&#10; G --&gt; H["RGA → RKNN&lt;br/&gt;YOLOv5s INT8 · NPU"]&#10; H --&gt;|"命中行人/车辆"| E&lt;/pre&gt;&lt;p&gt;几个值得说的实现细节：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;NV12 同制式直入 MPP&lt;/strong&gt;：ISP 出的 NV12 不做格式转换直接编码（全链路 CPU ~2.8%），RGA 只用于检测前处理的缩放；&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;MP4 分段的坑&lt;/strong&gt;：movenc 不代转 Annex-B，需逐 NAL 转 AVCC 并手工组装 avcC；NAL 边界 off-by-one 的症状是&amp;quot;时长正常但解码全错&amp;quot;——验收判据用&lt;strong&gt;逐段全量解码&lt;/strong&gt;而非 duration；&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;事件锁录&lt;/strong&gt;：检测线程经&amp;quot;最新帧槽&amp;quot;旁路挂接（忙时覆盖、不反压主管线），命中即给当前段加 &lt;code&gt;LOCK_&lt;/code&gt; 前缀，循环覆盖天然豁免，另有配额防锁段吃满磁盘；&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;rkisp 残留态&lt;/strong&gt;：boot 残留下 S_FMT 原样传回会得到行距矛盾的布局（SEGV/无帧），修复=清零强制重算 + 读回几何校验。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="端侧语音闭环推理与音频-io-都在-rkllm-留-jetson"&gt;&lt;a href="#%e7%ab%af%e4%be%a7%e8%af%ad%e9%9f%b3%e9%97%ad%e7%8e%af%e6%8e%a8%e7%90%86%e4%b8%8e%e9%9f%b3%e9%a2%91-io-%e9%83%bd%e5%9c%a8-rkllm-%e7%95%99-jetson" class="header-anchor"&gt;&lt;/a&gt;端侧语音闭环（推理与音频 I/O 都在 RK，LLM 留 Jetson）&#13;&#10;&lt;/h2&gt;&lt;p&gt;语音链的形态一句话：&lt;strong&gt;音频不出板，跨板只传文本&lt;/strong&gt;。麦克风/音箱（同一 USB 设备）接 RK——&lt;code&gt;voice_service&lt;/code&gt; 进程内采集 16k PCM → kaldi-native-fbank 特征（与 sherpa C++ 前端逐位一致）→ zipformer 三模型 fp16 NPU 三核分载流式解码 → 识别文本 REQ 回 Jetson 意图路由 → 应答文本回到 RK 的 &lt;code&gt;tts_node&lt;/code&gt;（SummerTTS 多核合成）→ 本板播报。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;防回灌&lt;/strong&gt;：麦克风和音箱是同一块硬件，播报期做事件驱动静音，解除须等 play_end 后麦克风连续 1s 真实静音（+超时兜底）；&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;ASR 选 fp16 而非 int8&lt;/strong&gt;：INT8 全套量化精度分析实测不满足流式精度（状态累积崩溃），fp16 零量化损失且 RTF 0.3 以内；TTS 评估 matcha RKNN 路线后放弃（声码器输出 STFT 谱需宿主 ISTFT，NPU 图不适用），改用 SummerTTS 引擎源码上板编译——真麦声学自环实测识别逐字正确、无循环。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Jetson 侧保留三个关键架构决策：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;真设备域确定性直通&lt;/strong&gt;。1.5B 小模型在 7 个工具间选择实测不可靠（&amp;ldquo;关闭预览&amp;quot;被选成关车窗、&amp;ldquo;还剩多少存储&amp;quot;选成编数），改为关键词命中即直达跨板工具、LLM 只把真实结果组织成播报——控制类链路降到 &lt;strong&gt;0.43s&lt;/strong&gt;。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;语义双路路由&lt;/strong&gt;。规则通路兜底 + 语义通路（离线意图中心余弦，阈值留出探针校准）：关键词全 miss 的改述问句直接走 RAG 快路径，&lt;strong&gt;9.4s → 1.2s&lt;/strong&gt;；语义通路故障自动退化为规则单路。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;推理位置按实时性分层&lt;/strong&gt;。ASR/TTS 下沉边缘 NPU/CPU，LLM/RAG 留中心——判据是&amp;quot;实时敏感 × 算力可承担&amp;rdquo;，不是无脑把模型搬到一块板。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;RAG 语料是&lt;strong&gt;真实车主手册&lt;/strong&gt;（官网 PDF → 三级过滤 → 577 块向量库，板上构建），召回阈值 0.48 由&amp;quot;手册内改述句 vs 手册外噪声&amp;quot;的相似度实测分界定出。&lt;/p&gt;&#10;&lt;h2 id="座舱-ui-双端部署rk-触摸屏"&gt;&lt;a href="#%e5%ba%a7%e8%88%b1-ui-%e5%8f%8c%e7%ab%af%e9%83%a8%e7%bd%b2rk-%e8%a7%a6%e6%91%b8%e5%b1%8f" class="header-anchor"&gt;&lt;/a&gt;座舱 UI 双端部署（RK 触摸屏）&#13;&#10;&lt;/h2&gt;&lt;p&gt;同一套 dashboard 代码不改一行，配置切换跑在两种形态：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Jetson 桌面&lt;/strong&gt;与 &lt;strong&gt;RK 7 寸 DSI 触摸屏&lt;/strong&gt;（1024×600，Goodix 触摸）各跑一个实例，&lt;strong&gt;双端同时在线&lt;/strong&gt;、订阅同一套 ZMQ 数据源——UI 是纯客户端，换屏只是多一个实例，服务端拓扑零变化；&lt;/li&gt;&#10;&lt;li&gt;小屏自适应：可用几何过小时自动最大化 + &lt;strong&gt;X 级缩放 1.5625×&lt;/strong&gt; 到 1600×938 逻辑设计尺寸（Qt 自带 &lt;code&gt;QT_SCALE_FACTOR&lt;/code&gt; 在本板组合上首帧后冻结，实测弃用）；&lt;/li&gt;&#10;&lt;li&gt;真机闭环已验证：说&amp;quot;打开行车记录&amp;rdquo;→ RK 触摸屏切页并自动拉起 RTSP 预览，画面色彩正确、跨屏数据实时。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="实测数据"&gt;&lt;a href="#%e5%ae%9e%e6%b5%8b%e6%95%b0%e6%8d%ae" class="header-anchor"&gt;&lt;/a&gt;实测数据&#13;&#10;&lt;/h2&gt;&lt;p&gt;所有数字可复述测量方法，无估算值：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;指标&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;实测值&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;采集（IMX415 → NV12 1080p）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;30.0fps&lt;/strong&gt;，max 帧间距 33ms（驱动时间戳，120 帧）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;MPP H.264 硬编&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;延迟 &lt;strong&gt;avg 4.8 / max 8.5ms&lt;/strong&gt;，全链路 CPU &lt;strong&gt;~2.8%&lt;/strong&gt;（单核）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;跨板拉流（RK→Jetson mediamtx）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1080p30 全量解码零错误（30.2s），静态场景 VBR 下探 0.71Mbps&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;跨板控制面（ZMQ REQ）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RTT &lt;strong&gt;2ms&lt;/strong&gt;（路由器组网）；直连组网复测 &lt;strong&gt;avg 0.73ms&lt;/strong&gt;（0.64-0.83，n=20）；抓拍 143ms（含 JPEG 编码 + 183KB base64 跨板）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RKNN 事件锁录检测&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;推理 &lt;strong&gt;25.3ms ewma&lt;/strong&gt;（NPU core0），检测线程挂接下录像 30fps 无损；连续 1.5h+ 录像 ewma 26.2ms / 5154 次&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;语音闭环全程（文本入口→播报结束）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;3.55-5.47s&lt;/strong&gt;（LLM 组织 0.86-1.07s 为大头，跨板工具仅 2-10ms）；修复回灌级联后干净口径：router 应答 1.49-4.14s，→播报结束 7.0-17.9s（=答复文本+合成+实时音频时长，随答复长度自洽）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ASR 推理（RK NPU fp16 三模型分核）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;RTF 0.26-0.30&lt;/strong&gt;（10.1s 中英混复测 0.296），线上流式转写与 Jetson ORT fp32 贪心&lt;strong&gt;逐字一致&lt;/strong&gt;；前端特征与 sherpa C++ 逐位一致（对拍 maxabs=0）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;TTS 合成（RK SummerTTS 多核 CPU）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;RTF 0.22-0.27&lt;/strong&gt;（7 字句 0.63s、28 字句 1.47s），合成 PCM 回传播放时长精确吻合&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;VLM 画面问答（Qwen2-VL-2B，按需换出 llm）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;应答与画面实测一致；周期=快照 0.35s+推理 4.7s+恢复 14.9s（冷启动 ~25-30s）；GPU 铁律=共存 OOM/须 evict 页缓存/ctx 2048+图降采样 960×540&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;真麦声学闭环（USB 组合设备）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;播命令→空气→麦克风→NPU 识别&lt;strong&gt;逐字正确&lt;/strong&gt;→真数据应答→本板播报+防回灌静音→无循环&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;LLM&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Qwen2.5-1.5B Q4_K_M，&lt;strong&gt;22.8 token/s&lt;/strong&gt;（首测）；第三轮复测 20.5-21.0 token/s（llama.cpp 纯生成口径 ×3，全栈在线）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;长稳&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;16min 双板联跑 fps 稳定 30.00、29417 帧零异常；故障注入 5s 精确超时自愈；第三轮复测时已连续录像 &lt;strong&gt;1.5h+（154k 帧）&lt;/strong&gt; 30.001fps、RTMP 零写错误&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;回归验证&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2026-09-06 第二轮全量验证全绿：RK 5/5 + Jetson selftest 8/8 + 回归 4/4×2 + E2E 抽查（RTSP 90 帧零错误/色度中性、HLS、跨板语音查询含真实值 rtt 1.6-2.2s、跨板抓拍 123ms）；同日傍晚第三轮性能复测（跨板 RTT/LLM/RAG 208-280ms/ASR/TTS/E2E 全栈在线全项重测）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="五个实战排障叙事"&gt;&lt;a href="#%e4%ba%94%e4%b8%aa%e5%ae%9e%e6%88%98%e6%8e%92%e9%9a%9c%e5%8f%99%e4%ba%8b" class="header-anchor"&gt;&lt;/a&gt;五个实战排障叙事&#13;&#10;&lt;/h2&gt;&lt;p&gt;比数字更有意思的是踩坑（每条都有一手证据链）：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;RKNN「流式状态发散」— 症状像量化精度，根因是内存布局&lt;/strong&gt;。zipformer 转 RKNN 后流式解码首块全对、之后结构性错乱（值集不变、位置全乱），INT8/fp16 同症状——直觉会怪量化或图编译。真因是 &lt;strong&gt;RKNN 对 4D 图输入的布局约定&lt;/strong&gt;：缓存张量必须按 &lt;code&gt;transpose(0,2,3,1)&lt;/code&gt; 预转置喂入。定位：探针模型 chunk 级逐张量对账 → 周期标记指纹排除数值精度 → 4D 直通 tiny 图暴力解出唯一转置；修复后转写与 fp32 &lt;strong&gt;逐字一致&lt;/strong&gt;。教训：多输入非图像模型上 NPU，先做直通等价自测。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;ZMQ linger 默认无限&lt;/strong&gt;：对端进程死亡时，客户端析构带着未投递消息&lt;strong&gt;永久阻塞&lt;/strong&gt;，工具总线整体楔死。没有 gdb 条件，靠 &lt;code&gt;/proc/&amp;lt;pid&amp;gt;/wchan&lt;/code&gt; + 残留 context 线程定位；修复 linger=0 + EINTR 重试后，故障注入 5s 精确超时、恢复即自愈。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;1.5B 选错工具&lt;/strong&gt;：LLM 自由选工具实测不可靠（关预览→关车窗），改成&amp;quot;关键词直通执行 + LLM 仅组织结果&amp;quot;——把确定性还给代码，把语言能力留给模型。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;rkisp 残留态&lt;/strong&gt;：S_FMT 原样传回残留行距，驱动照收但布局自相矛盾，症状是段错误 + 无帧。教训：&lt;strong&gt;不信任驱动的&amp;quot;照单全收&amp;quot;，写入前清零重算、读回后几何校验&lt;/strong&gt;。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;防回灌静音窗口被&amp;quot;事件语义差&amp;quot;击穿&lt;/strong&gt;：E2E 对账发现播报结束时间异常，排查见&lt;strong&gt;扬声器播的回答被自家麦克风识别、级联出新查询&lt;/strong&gt;。根因是跨板事件语义差：Jetson 的 &lt;code&gt;play_end&lt;/code&gt; 是&amp;quot;合成+写入完成&amp;quot;（12s 音频 2.9s 就发出），而播报在 RK 实时进行——静音在&amp;quot;写完&amp;quot;后 0.6s 就解除，长答复播到一半麦克风听到自己的声音。修复=静音期顺带能量观测，解除改为 &lt;strong&gt;play_end 后麦克风连续 1s 真实静音&lt;/strong&gt;；同场景对比级联 3 次 → 0 次。教训：跨板系统的&amp;quot;同名词事件&amp;quot;未必同语义，端到端对账日志是最好的透视镜。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="与站内其他项目的关系"&gt;&lt;a href="#%e4%b8%8e%e7%ab%99%e5%86%85%e5%85%b6%e4%bb%96%e9%a1%b9%e7%9b%ae%e7%9a%84%e5%85%b3%e7%b3%bb" class="header-anchor"&gt;&lt;/a&gt;与站内其他项目的关系&#13;&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://zeseanblog.top/projects/vehicle-voice-agent/" &gt;车载 AI 语音助手（Jetson）&lt;/a&gt;：本项目的 Jetson 侧前身，七服务架构与音频链路由它收编重构而来；&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://zeseanblog.top/projects/xray-motion-control/" &gt;X 射线焊缝检测下位机&lt;/a&gt;：另一条嵌入式线（STM32 + FreeRTOS）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>车载 AI 语音助手（Jetson Orin Nano）</title><link>https://zeseanblog.top/projects/vehicle-voice-agent/</link><pubDate>Tue, 01 Sep 2026 14:00:00 +0800</pubDate><guid>https://zeseanblog.top/projects/vehicle-voice-agent/</guid><description>&lt;h2 id="项目概述"&gt;&lt;a href="#%e9%a1%b9%e7%9b%ae%e6%a6%82%e8%bf%b0" class="header-anchor"&gt;&lt;/a&gt;项目概述&#13;&#10;&lt;/h2&gt;&lt;p&gt;基于 NVIDIA Jetson Orin Nano 的&lt;strong&gt;端侧车辆 AI 语音助手&lt;/strong&gt;：说话→听懂→思考→执行→回答全链路在车端本地完成，不依赖云端。集成 ASR-TTS 语音交互、意图路由、RAG 车辆知识库、LLM/Tool 调用与 QT 数字座舱界面，实现车辆知识问答、车控工具调用与 GUI 展示。&lt;/p&gt;&#10;&lt;p&gt;各服务模块采用 &lt;strong&gt;ZeroMQ&lt;/strong&gt; 轻量级通信框架，实现松耦合的分布式多服务架构。&lt;/p&gt;&#10;&lt;h2 id="系统架构"&gt;&lt;a href="#%e7%b3%bb%e7%bb%9f%e6%9e%b6%e6%9e%84" class="header-anchor"&gt;&lt;/a&gt;系统架构&#13;&#10;&lt;/h2&gt;&lt;p&gt;系统拆分为 ASR、Intent Router、RAG、LLM、Tool Bus、TTS、QT UI 七个模块，模块间通过 ZMQ 的 REQ/REP + PUB/SUB 组合，实现&lt;strong&gt;请求应答、状态广播、状态同步&lt;/strong&gt;三种通信模式。&lt;/p&gt;&#10;&lt;p&gt;以一句「帮我把空调调到 24 度」为例的完整链路：&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR&#10; MIC["麦克风"] --&gt; VAD["VAD / 关键词唤醒"]&#10; VAD --&gt; ASR["ASR 语音识别&lt;br/&gt;sherpa-onnx zipformer"]&#10; ASR --&gt; IR["意图路由&lt;br/&gt;语义分类 + 规则分类"]&#10; IR --&gt;|"车控意图"| LLM["LLM&lt;br/&gt;Qwen2.5-3B Q4_K_M"]&#10; IR --&gt;|"知识问答"| RAG["RAG 检索&lt;br/&gt;车辆手册向量库"]&#10; RAG --&gt; LLM&#10; LLM --&gt;|"tool_call JSON"| TOOL["Tool Bus&lt;br/&gt;车控工具执行"]&#10; LLM --&gt;|"respond JSON"| TTS["TTS 播报&lt;br/&gt;SummerTTS"]&#10; TOOL --&gt;|"状态同步"| UI["QT 座舱 UI"]&#10; TTS --&gt; OUT["扬声器"]&lt;/pre&gt;&lt;h2 id="关键技术点"&gt;&lt;a href="#%e5%85%b3%e9%94%ae%e6%8a%80%e6%9c%af%e7%82%b9" class="header-anchor"&gt;&lt;/a&gt;关键技术点&#13;&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;AI 语音交互&lt;/strong&gt;：ASR 使用 sherpa-onnx 部署 zipformer 模型，TTS 基于 SummerTTS；设计了 ASR 与 TTS 的同步机制，避免 TTS 播放期间语音回灌误识别；构建 VAD 与关键词唤醒&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;意图路由&lt;/strong&gt;：语义分类 + 规则分类双通路融合的意图识别，编排 5 类服务调用，按意图选择 RAG 检索、LLM 调用、直接语音回复或 Tool 调用的组合&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;RAG 车辆知识库&lt;/strong&gt;：基于 sentence-transformers 将车辆手册向量化，余弦相似度 + Top-K 检索，端侧全离线完成知识问答&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;LLM 部署与 Tool 调用&lt;/strong&gt;：llama.cpp 部署 Qwen2.5-3B 的 GGUF Q4_K_M 量化模型；通过 prompt 强约束让模型只输出两类 JSON——&lt;code&gt;respond&lt;/code&gt; 交给 TTS 播放，&lt;code&gt;tool_call&lt;/code&gt; 驱动车控工具执行&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;QT 车载座舱 GUI&lt;/strong&gt;：数字座舱界面，实时展示空调、车窗、天窗、摄像头与传感器等车辆状态&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="核心-api-与接口设计"&gt;&lt;a href="#%e6%a0%b8%e5%bf%83-api-%e4%b8%8e%e6%8e%a5%e5%8f%a3%e8%ae%be%e8%ae%a1" class="header-anchor"&gt;&lt;/a&gt;核心 API 与接口设计&#13;&#10;&lt;/h2&gt;&lt;h3 id="服务端口与通信原语"&gt;&lt;a href="#%e6%9c%8d%e5%8a%a1%e7%ab%af%e5%8f%a3%e4%b8%8e%e9%80%9a%e4%bf%a1%e5%8e%9f%e8%af%ad" class="header-anchor"&gt;&lt;/a&gt;服务端口与通信原语&#13;&#10;&lt;/h3&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;服务&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;端口&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;协议&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Intent Router&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;:6666&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ZMQ REQ/REP&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RAG Service&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;:6667&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ZMQ REQ/REP&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;LLM Service&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;:6668&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ZMQ REQ/REP&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Tool Bus&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;:6669&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ZMQ REQ/REP&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;状态广播&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;:6670 / :6671&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ZMQ PUB/SUB&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;TTS Server&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;:7777&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;音频流&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;llama-server（GGUF 推理后端）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;:8080&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;HTTP&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;C++ 侧封装了 &lt;code&gt;ZmqServer / ZmqClient&lt;/code&gt;（REQ/REP 请求应答）与 &lt;code&gt;ZmqPub / ZmqSub&lt;/code&gt;（状态广播）两组通用组件，各服务只依赖消息契约、不依赖彼此实现。&lt;/p&gt;&#10;&lt;h3 id="意图路由五分类多分支"&gt;&lt;a href="#%e6%84%8f%e5%9b%be%e8%b7%af%e7%94%b1%e4%ba%94%e5%88%86%e7%b1%bb%e5%a4%9a%e5%88%86%e6%94%af" class="header-anchor"&gt;&lt;/a&gt;意图路由：五分类多分支&#13;&#10;&lt;/h3&gt;&lt;p&gt;Router 对每句输入做&lt;strong&gt;语义分类 + 规则分类&lt;/strong&gt;双通路融合，输出五类意图并按类型路由到不同服务链：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;意图&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;链路&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;典型时延&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;EMERGENCY（紧急事项）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RAG → TTS&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;~0.5s&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;FACTUAL（手册事实问答）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RAG → TTS&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;~0.5s&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;EXPLICIT_CMD（明确车控指令）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Tool Bus → TTS&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;~0.5s&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;COMPLEX（复杂查询）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RAG → LLM → TTS&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;秒级&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CREATIVE（闲聊/生成）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;LLM → TTS&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;秒级&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;LLM + Tool 闭环&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;LLM ↔ Tool → LLM → TTS&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;秒级&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="llm-双模式-json-契约"&gt;&lt;a href="#llm-%e5%8f%8c%e6%a8%a1%e5%bc%8f-json-%e5%a5%91%e7%ba%a6" class="header-anchor"&gt;&lt;/a&gt;LLM 双模式 JSON 契约&#13;&#10;&lt;/h3&gt;&lt;p&gt;通过 Prompt 强约束 LLM 只输出两类 JSON，这是「语音语义 → 车辆动作」的核心契约：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;action&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;respond&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;好的，已为您将空调调到 24 度&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;action&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;tool_call&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;tool&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ac&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;tool_action&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;set_temperature&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;params&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;reason&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;用户要求把空调调到 24 度&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;respond&lt;/code&gt; → 直接送 TTS 播报&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;tool_call&lt;/code&gt; → Tool Bus 侧做参数归一化与校验（例如从口语化文本中提取「24 度」的数值），执行后通过 PUB 通道把车辆状态同步给 QT 座舱，并把执行结果回灌 LLM 生成自然语言回复&lt;/li&gt;&#10;&lt;li&gt;无法归一化的输出会降级为 &lt;code&gt;respond&lt;/code&gt; 兜底，保证任何情况下用户都能得到语音反馈&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="rag-检索接口"&gt;&lt;a href="#rag-%e6%a3%80%e7%b4%a2%e6%8e%a5%e5%8f%a3" class="header-anchor"&gt;&lt;/a&gt;RAG 检索接口&#13;&#10;&lt;/h3&gt;&lt;p&gt;车辆手册切片后经 sentence-transformers 编码为 &lt;strong&gt;768 维向量&lt;/strong&gt;入库；查询时同模型编码 query → 余弦相似度 Top-K 检索 → 命中文档拼接进 LLM 上下文，全部在端侧离线完成。&lt;/p&gt;&#10;&lt;h2 id="项目状态"&gt;&lt;a href="#%e9%a1%b9%e7%9b%ae%e7%8a%b6%e6%80%81" class="header-anchor"&gt;&lt;/a&gt;项目状态&#13;&#10;&lt;/h2&gt;&lt;p&gt;全链路已在 Jetson Orin Nano 上跑通，端侧离线完成语音到车控的闭环。&lt;/p&gt;&#10;</description></item><item><title>端侧大模型在线/离线部署（Agent）——机器人项目迁移实战（三）</title><link>https://zeseanblog.top/p/jetson-llm-agent/</link><pubDate>Sat, 15 Aug 2026 14:00:00 +0800</pubDate><guid>https://zeseanblog.top/p/jetson-llm-agent/</guid><description>&lt;p&gt;在 Jetson Orin Nano 上部署大语言模型（LLM）是实现端侧大模型 Agent 的第一步，也是最核心的工程挑战。由于 Jetson 采用的是统一内存架构（Unified Memory Architecture），CPU 和 GPU 共享物理内存（4GB 或 8GB），这与传统 PC 的“内存+独立显存”有很大不同。在 Orin Nano 上，我们必须精细控制内存预算，防止系统因 OOM（Out of Memory）而崩溃。&lt;/p&gt;&#10;&lt;p&gt;针对子任务 3.1（离线版 - LLM 推理），从瑞芯微 RK 平台迁移到 NVIDIA Jetson 平台，我们需要将原有的 RKNN 链路彻底重构为 NVIDIA 生态的加速链路。&lt;/p&gt;&#10;&lt;h3 id="子任务-31-拆解端侧-llm-部署实施方案"&gt;&lt;a href="#%e5%ad%90%e4%bb%bb%e5%8a%a1-31-%e6%8b%86%e8%a7%a3%e7%ab%af%e4%be%a7-llm-%e9%83%a8%e7%bd%b2%e5%ae%9e%e6%96%bd%e6%96%b9%e6%a1%88" class="header-anchor"&gt;&lt;/a&gt;子任务 3.1 拆解：端侧 LLM 部署实施方案&#13;&#10;&lt;/h3&gt;&lt;h4 id="微任务-311jetson-硬件环境准备与-swap-空间配置"&gt;&lt;a href="#%e5%be%ae%e4%bb%bb%e5%8a%a1-311jetson-%e7%a1%ac%e4%bb%b6%e7%8e%af%e5%a2%83%e5%87%86%e5%a4%87%e4%b8%8e-swap-%e7%a9%ba%e9%97%b4%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;✅️微任务 3.1.1：Jetson 硬件环境准备与 Swap 空间配置&#13;&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;目标&lt;/strong&gt;：解决 Orin Nano 在模型编译或高负载时内存不足的问题。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;具体步骤&lt;/strong&gt;：&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;1.确认 JetPack 版本（推荐使用 JetPack 6.x，自带 CUDA 12.x 和更现代的 Linux 内核）。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#jtop查看板卡信息&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;jtop&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;img src="images/image-20260614205417498.png" alt="image-20260614205417498" style="zoom: 50%;" /&gt;&#10;&lt;p&gt;2.必须配置虚拟内存（Swap）：Orin Nano 即使是 8GB 版本，在编译模型或运行 4B 模型时也极易耗尽物理内存。建议通过 &lt;code&gt;NVMe SSD&lt;/code&gt; 划分 16GB 的 Swap 空间。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;span class="lnt"&gt;16&#10;&lt;/span&gt;&lt;span class="lnt"&gt;17&#10;&lt;/span&gt;&lt;span class="lnt"&gt;18&#10;&lt;/span&gt;&lt;span class="lnt"&gt;19&#10;&lt;/span&gt;&lt;span class="lnt"&gt;20&#10;&lt;/span&gt;&lt;span class="lnt"&gt;21&#10;&lt;/span&gt;&lt;span class="lnt"&gt;22&#10;&lt;/span&gt;&lt;span class="lnt"&gt;23&#10;&lt;/span&gt;&lt;span class="lnt"&gt;24&#10;&lt;/span&gt;&lt;span class="lnt"&gt;25&#10;&lt;/span&gt;&lt;span class="lnt"&gt;26&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#查看内存和SWAP&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;free -h&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#查看磁盘&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lsblk&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#创建swap&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo fallocate -l 16G /swapfile&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#设置权限&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chmod &lt;span class="m"&gt;600&lt;/span&gt; /swapfile&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#验证&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -lh /swapfile&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#格式化swap&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mkswap /swapfile&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#启用swap&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo swapon /swapfile&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#插看swap&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;swapon --show &lt;span class="p"&gt;&amp;amp;&lt;/span&gt; free -h&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#开机自动挂载&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nano /etc/fstab&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#末尾加入/swapfile none swap sw 0 0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#优化swap策略&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat /proc/sys/vm/swappiness&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt;60&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo sysctl vm.swappiness&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#永久生效&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nano /etc/sysctl.conf&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#末尾加入vm.swappiness=10&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;3.开启最高性能模式：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nvpmodel -m &lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo jetson_clock&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;锁住 CPU/GPU 频率，确保推理时延迟最低&lt;/p&gt;&#10;&lt;h4 id="微任务-312推理引擎技术选型llamacpp-vs-tensorrt-llm"&gt;&lt;a href="#%e5%be%ae%e4%bb%bb%e5%8a%a1-312%e6%8e%a8%e7%90%86%e5%bc%95%e6%93%8e%e6%8a%80%e6%9c%af%e9%80%89%e5%9e%8bllamacpp-vs-tensorrt-llm" class="header-anchor"&gt;&lt;/a&gt;✅️微任务 3.1.2：推理引擎技术选型（llama.cpp vs TensorRT-LLM）&#13;&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;目标：根据开发周期和性能需求选择最佳引擎。&lt;/li&gt;&#10;&lt;li&gt;方案对比与选择：&#10;&lt;ul&gt;&#10;&lt;li&gt;方案 A：llama.cpp（推荐优先部署）：对 Jetson 适配极佳，编译简单，内存开销极小。通过开启 &lt;code&gt;GGML_CUDA=1&lt;/code&gt;，可以将计算完全卸载到 Orin Nano 的 Ampere GPU 上。支持 GGUF 格式，量化极其方便。&lt;/li&gt;&#10;&lt;li&gt;方案 B：TensorRT-LLM（极致性能追求）：NVIDIA 官方的王牌，吞吐量最高。但由于 TensorRT-LLM 的编译依赖较重，在 8GB 的 Orin Nano 上直接编译模型 Engine 极易 OOM，通常需要在 PC 端（带有 NVIDIA 独立显卡的 Ubuntu 主机）进行交叉编译，生成 Engine 后再拷贝到 Jetson 上运行。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;实施建议：第一阶段使用 llama.cpp + CUDA 快速打通链路；第二阶段追求极限低时延时，在 PC 端配置 Docker 交叉编译 TensorRT-LLM 的 Engine。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;方案A具体步骤：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;1.确认环境&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uname -m#为aarch64&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dpkg -l &lt;span class="p"&gt;|&lt;/span&gt; grep nvidia-jetpack#JetPack 5.1+ 或 6.x、CUDA 已安装&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2.安装依赖&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;span class="lnt"&gt;8&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; git &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cmake &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; build-essential &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; python3 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; python3-pip&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;3.获取 llama.cpp&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/ggml-org/llama.cpp#网慢可以转gitee&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; llama.cpp&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;4.jetson cuda编译&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cmake -B build -G Ninja &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -DCMAKE_BUILD_TYPE&lt;span class="o"&gt;=&lt;/span&gt;Release &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -DGGML_CUDA&lt;span class="o"&gt;=&lt;/span&gt;ON &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -DCMAKE_CUDA_ARCHITECTURES&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;87&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -DLLAMA_CURL&lt;span class="o"&gt;=&lt;/span&gt;ON&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;参数&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;意义&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;GGML_CUDA=ON&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;启用 CUDA backend&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;87&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Orin Nano Ampere 架构&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Ninja&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;加速编译&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;LLAMA_CURL&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;支持 hf 模型下载&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;&lt;strong&gt;5.编译&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cmake --build build -j&lt;span class="k"&gt;$(&lt;/span&gt;nproc&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;6.验证&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./build/bin/llama-cli -h&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;img alt="image-20260614211039138" class="gallery-image" data-flex-basis="3123px" data-flex-grow="1301" height="63" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/jetson-llm-agent/images/image-20260614211039138.png" srcset="https://zeseanblog.top/p/jetson-llm-agent/images/image-20260614211039138_hu_6d9dabf7e3d279cb.png 800w, https://zeseanblog.top/p/jetson-llm-agent/images/image-20260614211039138.png 820w" width="820"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;7.部署测试&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;下载 &lt;a class="link" href="https://huggingface.co/bartowski/Qwen2.5-3B-Instruct-GGUF" target="_blank" rel="noopener"&#13;&#10; &gt;https://huggingface.co/bartowski/Qwen2.5-3B-Instruct-GGUF&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;放入/home/nvidia/Downloads/llama.cpp/models&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./build/bin/llama-cli &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -m ./models/Qwen2.5-3B-Instruct-Q4_K_M.gguf &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -ngl &lt;span class="m"&gt;999&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p &lt;span class="s2"&gt;&amp;#34;你好，请用一句话介绍ROS2&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -n &lt;span class="m"&gt;64&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;img src="images/image-20260614233353144.png" alt="image-20260614233353144" style="zoom:50%;" /&gt;&#10;&lt;h4 id="微任务-313qwen25-模型量化与格式转换"&gt;&lt;a href="#%e5%be%ae%e4%bb%bb%e5%8a%a1-313qwen25-%e6%a8%a1%e5%9e%8b%e9%87%8f%e5%8c%96%e4%b8%8e%e6%a0%bc%e5%bc%8f%e8%bd%ac%e6%8d%a2" class="header-anchor"&gt;&lt;/a&gt;✅️微任务 3.1.3：Qwen2.5 模型量化与格式转换&#13;&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;目标：将 Hugging Face 发布的原始 Qwen3.5 模型权重转换为 GGUF 格式，并完成不同量化策略（Q8_0、Q6_K、Q5_K_M、Q4_K_M）的压缩与性能测试，实现 Jetson Orin Nano 端侧部署（原始 Qwen 模型通常以 Transformers 格式发布）&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;量化策略&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;原始模型一般FP16&lt;/li&gt;&#10;&lt;li&gt;Q8_0：8-bit量化&lt;/li&gt;&#10;&lt;li&gt;Q6_K：6-bit量化K-Quant， llama.cpp 后来提出的新量化算法&lt;/li&gt;&#10;&lt;li&gt;Q5_K_M：5-bit量化、K-Quant算法、Medium（重要层保留更多精度）&lt;/li&gt;&#10;&lt;li&gt;Q4_K_M：4-bit量化、K-Quant、Medium&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;格式&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;大小&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;FP16&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;8GB&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Q8_0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4.3GB&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Q6_K&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3.3GB&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Q5_K_M&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2.9GB&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Q4_K_M&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2.3GB&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;量化工具需要先理解模型结构&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;GGUF 是 llama.cpp 的统一模型格式&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;HuggingFace模型(safetensors) &amp;ndash;&amp;gt; 转换成GGUF(F16) -&amp;gt; GGUF量化 - &amp;gt; Q4_K_M / Q5_K_M&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;原始模型&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;Qwen3-4B/&#10;├── config.json&#10;├── tokenizer.json&#10;├── model.safetensors&#10;├── model-00001-of-00002.safetensors&#10;└── model-00002-of-00002.safetensors&#10;#model.safetensors神经网络权重矩阵&#10;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;GGUF是llama.cpp专用模型容器&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;具体步骤（以 llama.cpp 路线为例）：&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;Qwen2.5-1.5B-Instruct (HF格式)&#10;&#10;​ ↓ convert_hf_to_gguf.py&#10;&#10;qwen2.5-1.5b-f16.gguf&#10;&#10;​ ↓ llama-quantize&#10;&#10;qwen2.5-1.5b-q4_k_m.gguf&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;1.hf获取国产模型慢，在魔塔社区下代替Qwen2.5-1.5B-Instruct&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 安装魔搭下载工具（使用清华源瞬间装完）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install modelscope -i https://pypi.tuna.tsinghua.edu.cn/simple&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. 一键满速下载到指定目录（告别网络报错）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;modelscope download --model qwen/Qwen2.5-1.5B-Instruct --local_dir ./Qwen2.5-1.5B-Instruct&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;模型位置：&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20260615145823652" class="gallery-image" data-flex-basis="3215px" data-flex-grow="1339" height="63" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/jetson-llm-agent/images/image-20260615145823652.png" srcset="https://zeseanblog.top/p/jetson-llm-agent/images/image-20260615145823652_hu_3aab6ed7c8426b44.png 800w, https://zeseanblog.top/p/jetson-llm-agent/images/image-20260615145823652.png 844w" width="844"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;2.使用 &lt;code&gt;llama.cpp&lt;/code&gt; 的 &lt;code&gt;convert_hf_to_gguf.py&lt;/code&gt; 脚本将模型转化为gguf格式&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;convert_hf_to_gguf.py&lt;/code&gt; 依赖 &lt;code&gt;transformers&lt;/code&gt; 库，因此在使用前先配个miniconda&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-aarch64.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bash Miniconda3-latest-Linux-aarch64.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;conda --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;conda config --set show_channel_urls yes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/main&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/r&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;创建进入&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;conda create -n llama_cpp_env &lt;span class="nv"&gt;python&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3.10 -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;conda activate llama_cpp_env&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;安装&lt;code&gt;transformers&lt;/code&gt; 和&lt;code&gt;torch&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;然后转换&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/Downloads/llama.cpp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python convert_hf_to_gguf.py &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /home/nvidia/Desktop/Qwen2.5-1.5B-Instruct &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --outfile qwen2.5-1.5b-f16.gguf &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --outtype f16&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;3.模型量化：执行 &lt;code&gt;./llama-quantize&lt;/code&gt;。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Orin Nano 4GB 版&lt;/strong&gt;：必须选择 &lt;strong&gt;INT4 量化（如 Q4_K_M）&lt;/strong&gt;，且只能运行 1.8B 模型。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Orin Nano 8GB 版&lt;/strong&gt;：推荐选择 &lt;strong&gt;INT4 量化运行 4B 模型&lt;/strong&gt;，或者选择 &lt;strong&gt;INT8 量化（如 Q8_0）运行 1.8B 模型&lt;/strong&gt;（具备更好的指令遵循能力）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./build/bin/llama-quantize &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; qwen2.5-1.5b-f16.gguf &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; qwen2.5-1.5b-q4_k_m.gguf &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Q4_K_M&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;img alt=" " class="gallery-image" data-flex-basis="620px" data-flex-grow="258" height="651" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/jetson-llm-agent/images/image-20260615163723232.png" srcset="https://zeseanblog.top/p/jetson-llm-agent/images/image-20260615163723232_hu_9a91590fc1e7df0f.png 800w, https://zeseanblog.top/p/jetson-llm-agent/images/image-20260615163723232_hu_38d29549b148e3d5.png 1600w, https://zeseanblog.top/p/jetson-llm-agent/images/image-20260615163723232.png 1684w" width="1684"&gt;&lt;/p&gt;&#10;&lt;h4 id="微任务-314qwen25-05b-instruct---lora微调"&gt;&lt;a href="#%e5%be%ae%e4%bb%bb%e5%8a%a1-314qwen25-05b-instruct---lora%e5%be%ae%e8%b0%83" class="header-anchor"&gt;&lt;/a&gt;✅️微任务 3.1.4：Qwen2.5-0.5B-Instruct Lora微调&#13;&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;目标&lt;/strong&gt;：实现Qwen2.5-0.5B-Instruct微调测试。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;方案选择&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Orin Nano 4GB 版：必须选择 INT4 量化（如 Q4_K_M），且只能运行 1.8B 模型。&lt;/li&gt;&#10;&lt;li&gt;Orin Nano 8GB 版：推荐选择 INT4 量化运行 4B 模型，或者选择 INT8 量化（如 Q8_0）运行 1.8B 模型（具备更好的指令遵循能力）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;实验环境：魔塔实例，8核32gb，显存24g&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20260615220227917" class="gallery-image" data-flex-basis="550px" data-flex-grow="229" height="270" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeseanblog.top/p/jetson-llm-agent/images/image-20260615220227917.png" width="619"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;方案1：魔塔微调神器 ms-swift&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;1.安装工具&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install ms-swift -U&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install modelscope -U&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python -c &lt;span class="s2"&gt;&amp;#34;from modelscope import snapshot_download; snapshot_download(&amp;#39;Qwen/Qwen2.5-0.5B-Instruct&amp;#39;, local_dir=&amp;#39;.&amp;#39;)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;2.创建微调数据集&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /mnt/workspace&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &lt;span class="s"&gt;&amp;lt;&amp;lt; &amp;#39;EOF&amp;#39; &amp;gt; cat_data.jsonl&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;{&amp;#34;messages&amp;#34;: [{&amp;#34;role&amp;#34;: &amp;#34;user&amp;#34;, &amp;#34;content&amp;#34;: &amp;#34;你是谁？&amp;#34;}, {&amp;#34;role&amp;#34;: &amp;#34;assistant&amp;#34;, &amp;#34;content&amp;#34;: &amp;#34;喵喵喵！本大爷是专属猫咪助手，有小鱼干才回答你！&amp;#34;}]}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;{&amp;#34;messages&amp;#34;: [{&amp;#34;role&amp;#34;: &amp;#34;user&amp;#34;, &amp;#34;content&amp;#34;: &amp;#34;今天天气怎么样？&amp;#34;}, {&amp;#34;role&amp;#34;: &amp;#34;assistant&amp;#34;, &amp;#34;content&amp;#34;: &amp;#34;喵~ 太阳很大，适合本猫在窗台上睡觉！&amp;#34;}]}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;{&amp;#34;messages&amp;#34;: [{&amp;#34;role&amp;#34;: &amp;#34;user&amp;#34;, &amp;#34;content&amp;#34;: &amp;#34;帮我写一段Python代码。&amp;#34;}, {&amp;#34;role&amp;#34;: &amp;#34;assistant&amp;#34;, &amp;#34;content&amp;#34;: &amp;#34;打工人自己写！喵！好吧，给你个 print(&amp;#39;Meow&amp;#39;)。&amp;#34;}]}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;3.开始lora微调&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;span class="lnt"&gt;8&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;swift sft &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --model ./models &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --model_type qwen2 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --template qwen2_5 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --dataset cat_data.jsonl &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --num_train_epochs &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --max_steps &lt;span class="m"&gt;40&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --output_dir ./output&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;4.合并lora权重&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /mnt/workspace&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;swift &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --model ./models &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --adapters ./output/v1-20260615-211104/checkpoint-40 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --merge_lora &lt;span class="nb"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;5.使用 llama.cpp 转换为 GGUF&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;span class="lnt"&gt;8&#10;&lt;/span&gt;&lt;span class="lnt"&gt;9&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /mnt/workspace&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/ggerganov/llama.cpp.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; llama.cpp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install -r requirements.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /mnt/workspace/llama.cpp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python convert_hf_to_gguf.py /mnt/workspace/output/v1-20260615-211104/checkpoint-40-merged &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --outfile /mnt/workspace/my_cat_qwen.gguf &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --outtype q8_0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h4 id="微任务-314流式推理接口开发c--python"&gt;&lt;a href="#%e5%be%ae%e4%bb%bb%e5%8a%a1-314%e6%b5%81%e5%bc%8f%e6%8e%a8%e7%90%86%e6%8e%a5%e5%8f%a3%e5%bc%80%e5%8f%91c--python" class="header-anchor"&gt;&lt;/a&gt;微任务 3.1.4：流式推理接口开发（C++ / Python）&#13;&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;目标&lt;/strong&gt;：实现全流式（Streaming）文本输出，降低首字时延（First-token Latency）。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;具体步骤&lt;/strong&gt;：&#10;&lt;ol&gt;&#10;&lt;li&gt;编写推理控制客户端，调用 &lt;code&gt;llama.cpp&lt;/code&gt; 的 API 或使用 &lt;code&gt;llama-cpp-python&lt;/code&gt;（确保编译时使能了 CUDA）。&lt;/li&gt;&#10;&lt;li&gt;配置关键推理参数：&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;n_ctx&lt;/code&gt;（上下文窗口）：机器人局部交互通常不需要太长上下文，建议设为 &lt;strong&gt;512 或 1024&lt;/strong&gt;，以节省大量 KV Cache 占用的显存。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;n_gpu_layers&lt;/code&gt;：设置为 &lt;code&gt;-1&lt;/code&gt;，代表将所有模型层（Layers）全部加载到 GPU 显存中，避免 CPU-GPU 之间的数据拷贝时延。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="微任务-315ros2-节点封装与端侧通信集成"&gt;&lt;a href="#%e5%be%ae%e4%bb%bb%e5%8a%a1-315ros2-%e8%8a%82%e7%82%b9%e5%b0%81%e8%a3%85%e4%b8%8e%e7%ab%af%e4%be%a7%e9%80%9a%e4%bf%a1%e9%9b%86%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;微任务 3.1.5：ROS2 节点封装与端侧通信集成&#13;&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;目标&lt;/strong&gt;：将大模型推理能力接入机器人系统，供 Agent 决策模块调用。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;具体步骤&lt;/strong&gt;：&#10;&lt;ol&gt;&#10;&lt;li&gt;创建一个 ROS2 Lifecycle 节点（如 &lt;code&gt;llm_inference_node&lt;/code&gt;）。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;输入端&lt;/strong&gt;：订阅 ASR 模块发布的语音识别文本话题（Topic）。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;输出端&lt;/strong&gt;：使用 ROS2 的 &lt;strong&gt;Action 机制&lt;/strong&gt;（而不是普通的 Service 或 Topic）。因为大模型生成是流式的、耗时的，Action 机制允许节点在生成过程中持续回传（Feedback）流式文本，供 TTS 模块实现边接收边朗读（全流式响应），从而大幅降低整个 Agent 链路的感知延迟。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item></channel></rss>