工业开发板本地部署AI助手:NullClaw在睿擎派的量化与调优实战

发布时间:2026/10/20 1:06:34
工业开发板本地部署AI助手:NullClaw在睿擎派的量化与调优实战 1. 为什么要在工业开发板上跑一个本地 AI 助手把大模型塞进一块巴掌大的工业开发板这件事放在两年前还像是极客圈的自嗨但到了今天它已经变成很多边缘计算项目的刚需。我手头这块睿擎派一款面向工业场景的国产开发板典型配置为四核 ARM 处理器、2GB 到 4GB 内存、板载 eMMC 与多路工业接口原本的定位是跑数据采集、协议转换、设备控制这类活。但实际项目里客户越来越不满足于只采数据他们希望设备本身就能做初步的语义理解——比如现场工人对着屏幕说一句三号线的温度是不是偏高板子本地就能给出判断而不是把语音传到云端再等结果。这就是小龙虾NullClaw这个 AI 助手项目的切入点。NullClaw 是一个轻量级的本地 AI 助手框架核心思路是把对话管理、工具调用、上下文记忆这些能力做成一个可裁剪的运行时模型侧可以对接量化后的小参数模型硬件侧尽量吃满开发板的算力。它解决的问题很直接在没有稳定外网、或者数据不允许出厂的工业现场让设备具备可交互的智能问答与指令解析能力。这篇文章适合三类人看。第一类是做工业边缘设备的嵌入式工程师你手里有开发板想试试本地 AI 到底能不能跑起来第二类是做 AI 应用落地的开发者你想知道把模型从服务器搬到端侧中间要填哪些坑第三类是对边缘 AI 感兴趣的技术爱好者你想找一块真实的板子动手而不是停留在跑分和论文里。我会把整个部署过程拆开讲包括选型逻辑、环境准备、模型量化、运行时裁剪、性能调优以及我在实测中踩过的那些坑。全程基于常见工程实践补充细节你照着做基本能复现。需要先说明一点工业开发板的算力天花板摆在那里别指望它跑出云端大模型的效果。NullClaw 在睿擎派上的定位是够用就好——能理解短指令、能维护多轮对话、能调用几个本地工具比如查传感器数值、开关某个继电器这就达到目标了。想清楚这个预期后面的调优方向才不会跑偏。2. NullClaw 的运行机制与睿擎派的硬件账本2.1 NullClaw 到底由哪几块拼起来很多人第一次听到把 AI 助手部署到开发板脑子里想的是把一整个大模型文件拷进去就完事。实际完全不是这么回事。NullClaw 的架构可以拆成四层每一层在端侧都有对应的资源开销理解这个分层是后面做裁剪的前提。最底层是推理引擎负责把模型权重加载进内存并执行矩阵运算。端侧常用的选择包括针对 ARM 优化的推理框架它们支持 INT8 甚至 INT4 量化能把模型体积压到原来的四分之一到八分之一。第二层是模型本体NullClaw 默认对接的是参数量在 0.5B 到 3B 之间的量化模型这个区间是端侧甜点区——再小语义能力不够再大内存扛不住。第三层是对话与工具运行时也就是 NullClaw 自己的核心代码管上下文窗口、管工具注册、管多轮状态。第四层是业务适配层这一层是你自己写的把开发板的 GPIO、串口、传感器读数包装成模型能调用的工具函数。这四层的资源占用是叠加的。我实测下来一个 1.5B 的 INT4 量化模型权重约占 900MB 到 1.1GB 内存推理引擎运行时开销在 150MB 左右NullClaw 运行时本身很轻大概 50MB 到 80MB业务层看你挂多少工具。所以如果你板子是 2GB 内存留给系统的余量就相当紧张了这也是为什么后面要专门讲内存优化。2.2 睿擎派的算力与内存边界睿擎派这类工业板子的典型配置我按实际能拿到的参数来算账。CPU 是四核 ARM Cortex-A 系列主频在 1.5GHz 上下没有独立 NPU 的版本全靠 CPU 推理有 NPU 的版本算力通常在 1TOPS 到 3TOPS 之间可以卸载一部分算子。内存 2GB 或 4GB LPDDR4存储是 8GB 到 32GB 的 eMMC。这里有个关键判断有没有 NPU部署策略完全不同。如果板子带 NPU你要做的是把模型转成 NPU 支持的格式让卷积和矩阵乘尽量跑在 NPU 上CPU 只做调度和前后处理。如果没有 NPU那就老老实实做 CPU 推理优化重点在量化精度和线程绑定上。我下面会两条路都讲你按自己板子的实际情况对号入座。内存这块要特别提醒。Linux 系统本身加上工业场景常驻的采集进程2GB 版本开机后可用内存往往只剩 1.2GB 到 1.4GB。这意味着你只能跑 0.5B 到 1B 级别的量化模型而且上下文窗口要压得很短。4GB 版本宽裕一些可以上到 1.5B 甚至 2B上下文能开到 2048 token。这个账一定要在动手前算清楚不然模型加载到一半被 OOM Killer 干掉排查起来很费时间。2.3 为什么选本地部署而不是走云端这个问题我在项目评审时被问过很多次。走云端 API 看起来省事开发板上只跑一个 HTTP 客户端就行为什么还要费劲本地部署原因有三个而且都是工业场景的硬约束。第一是网络不可靠。工厂车间里 Wi-Fi 覆盖经常有盲区4G 信号在金属设备密集的环境下也不稳定。设备控制类应用对响应延迟敏感你不可能让一个关闭阀门的指令因为网络抖动卡三秒。第二是数据不出厂。很多工业客户对生产数据、工艺参数的外传有严格限制语音和文本里可能包含敏感信息本地处理是唯一合规的选择。第三是成本。云端 API 按 token 计费一台设备一天几百次交互一年下来费用不低而本地部署是一次性投入。当然本地部署也有代价模型能力弱、维护成本高、升级麻烦。所以我的建议是分场景——对语义理解要求高、网络又好的场景云端更划算对实时性、数据安全、离线可用性要求高的场景本地部署是刚需。NullClaw 在睿擎派上的这套方案服务的就是后者。3. 从零把 NullClaw 跑起来环境、模型与运行时3.1 系统底座的准备与几个容易忽略的细节睿擎派出厂一般预装的是精简版 Linux但工业板子的系统镜像版本差异很大动手前先确认几件事。用uname -a看内核版本用cat /etc/os-release看发行版用free -h看实际可用内存用nproc看核心数。这几个信息决定了你后面能装什么版本的运行时。系统底座我建议做三件事。第一换一个稳定的软件源工业板子自带的源有时候同步不及时装依赖会卡住。第二扩大 swap 分区这一点很多人忽略。模型加载的瞬间内存峰值很高如果物理内存不够swap 能救你一命代价是加载慢一点。我一般会把 swap 设到 2GB放在 eMMC 上。第三关掉不必要的系统服务比如蓝牙、桌面环境、日志轮转的激进策略把内存和 CPU 省给模型。注意swap 放在 eMMC 上会加速存储磨损如果你的设备是长期 7x24 运行建议 swap 只作为加载时的缓冲加载完成后通过调整swappiness参数降低换出频率或者干脆用 zram 做压缩内存交换减少对 eMMC 的写入。依赖安装这块NullClaw 运行时需要的基础库不多主要是 C 运行时、线程库、以及推理引擎的动态库。用包管理器装就行但要注意架构匹配——ARM64 的包和 x86 的包不能混用交叉编译的时候尤其容易搞错。我踩过一次坑在开发机上编译好的二进制拷到板子上跑不起来报的是动态链接库找不到查了半天发现是编译时链接了 x86 版本的库。后来养成习惯所有依赖都在板子上本地编译或者用正确的交叉编译工具链。3.2 模型选型参数量、量化精度与内存的三角平衡模型选型是整个过程里最需要动脑子的环节。你要在三个变量之间找平衡参数量决定语义能力量化精度决定内存占用和推理速度上下文窗口决定多轮对话的体验。先说参数量。0.5B 级别的模型能处理简单的意图识别和短问答但多轮对话容易忘事复杂指令理解也吃力。1B 到 1.5B 是端侧的性价比区间日常问答、工具调用基本够用。2B 以上在 2GB 内存的板子上就很勉强了除非你有 NPU 且量化做得极致。再说量化。FP16 精度最高但体积最大一个 1.5B 模型要占 3GB 内存直接出局。INT8 量化后体积减半精度损失很小是首选。INT4 体积再减半但精度损失开始明显尤其是对数字和专有名词的识别会变差。我的经验是如果业务里涉及大量数值查询比如读传感器、报参数用 INT8如果只是闲聊和简单指令INT4 可以接受。上下文窗口这块端侧别贪大。2048 token 的窗口在 1.5B 模型上KV Cache 就要占几百 MB。我一般把窗口压到 1024 甚至 512配合对话历史的摘要压缩策略把久远的对话内容浓缩成一句话存着既省内存又不丢关键信息。配置组合内存占用推理速度token/s适用场景0.5B INT4 / 512 窗口约 400MB8-12简单指令、单轮问答1.5B INT8 / 1024 窗口约 1.6GB3-5多轮对话、工具调用1.5B INT4 / 1024 窗口约 1.0GB5-8多轮对话、内存受限2B INT4 / 2048 窗口约 1.4GB2-4复杂语义、4GB 板子这张表是我在睿擎派上实测的粗略值具体数字会因模型和推理引擎不同有浮动但量级关系是准的。选型时先看内存余量再看业务对语义能力的要求最后调窗口大小。3.3 NullClaw 运行时的编译与裁剪NullClaw 的源码拿到手之后别急着全量编译。它默认带了一些在端侧用不上的模块比如某些云端对接的适配器、调试用的可视化面板。裁剪的原则是只保留对话管理、工具调用、本地模型推理这三块核心其余全部关掉。编译配置里重点看几个开关。关掉 HTTP 服务端的调试接口关掉日志的 verbose 级别日志写 eMMC 很伤存储关掉多语言支持只留中文。工具调用模块要保留但工具注册表要精简只挂你实际用到的几个函数。我见过有人把几十个示例工具全编进去结果运行时内存多占了 100 多 MB纯属浪费。编译时的优化选项也很关键。开-O2或-O3优化针对 ARM 架构开对应的指令集扩展比如 NEON链接时去掉符号表减小体积。如果板子支持开启链接时优化LTO能再压一点体积、提一点速度。这些选项在 CMake 配置里都能设具体参数看你的工具链文档。编译完成后先别急着接模型跑一下 NullClaw 自带的健康检查确认运行时能正常启动、工具注册表能加载、内存占用在预期范围内。这一步能提前暴露大部分环境问题比后面模型加载失败再回头查要省事得多。4. 让模型真正跑起来量化、加载与推理调优4.1 模型量化在开发机上的操作链路量化这一步通常在开发机上做因为需要一定的算力和完整的工具链。流程是拿原始模型权重用校准数据集跑一遍统计各层的数值分布然后转换成低精度格式。校准数据集很关键最好用你业务场景的真实语料比如工业指令、设备名称、参数查询的句子这样量化后的精度损失在你关心的领域最小。具体操作上主流的量化工具都支持命令行调用。你需要指定输入模型路径、输出路径、量化位宽、校准集路径。跑完之后会得到一个体积小得多的模型文件以及一个量化参数文件。这两个文件要一起拷到板子上缺一不可。这里有个坑要提醒不同推理引擎的量化格式不通用。你在 A 引擎上量化的模型拿到 B 引擎上可能加载不了或者加载了但推理结果错乱。所以量化前先确定板子上用哪个推理引擎然后用对应的量化工具。我吃过这个亏量化了两遍才发现格式不对白白浪费半天。量化完成后在开发机上先做一次精度验证。用一批测试句子对比量化前后的输出看差异是否在可接受范围。如果发现某些关键指令识别错了要么调整校准集要么换更高的量化精度。别跳过这一步端侧调试比开发机麻烦十倍能在开发机上解决的问题就别留到板子上。4.2 模型加载的内存峰值控制模型加载是内存压力最大的时刻。权重文件从 eMMC 读进内存同时推理引擎要分配各种缓冲区峰值内存可能是稳态运行时的 1.5 倍。2GB 的板子如果稳态占用 1.2GB加载峰值冲到 1.8GB系统就危险了。控制峰值有几个手段。第一用内存映射方式加载权重让操作系统按需分页而不是一次性全读进来。这样启动快、峰值低代价是首次推理时会有缺页中断稍微慢一点。第二分阶段加载先加载推理必需的层把工具调用相关的模型部分延后加载。第三加载前手动触发内存回收把系统缓存清一清给模型腾地方。我实测下来内存映射加载能把峰值压下来 200MB 到 300MB效果很明显。但要注意如果你的存储是慢速 eMMC内存映射会导致推理时的随机读变多反而拖慢速度。这种情况就权衡一下内存够就用预加载内存紧就用内存映射。加载完成后用free -h和top确认一下实际占用和预期对比。如果超出太多说明模型或运行时有问题趁早排查。4.3 推理线程绑定与 CPU 亲和性设置睿擎派是四核 CPU如果不做线程绑定推理任务会在四个核之间来回迁移缓存命中率低速度上不去。做法是把推理主线程绑定到一个核把前后处理线程绑定到另一个核剩下的核留给系统和其他业务。Linux 下用taskset命令或者sched_setaffinity系统调用都能做线程绑定。我的习惯是推理绑 CPU 2 和 CPU 3系统和其他进程用 CPU 0 和 CPU 1。这样推理任务有稳定的缓存系统也不会因为推理占满 CPU 而卡顿。线程数也要调。推理引擎默认可能开四个线程但在四核板子上开满反而因为上下文切换开销大而变慢。我一般设成 2 到 3 个推理线程留一个核给系统。这个值要实测不同模型和引擎的最优值不一样用基准测试跑几组对比就知道了。还有一个细节是 CPU 调频。工业板子为了省电默认可能是按需调频推理时频率上不去。可以把 CPU 调频策略设成性能模式让频率稳定在最高档。代价是功耗和发热增加如果设备有散热设计就没问题没有的话要权衡。5. 实测中暴露的问题与排查链路5.1 模型加载到一半进程被杀一次完整的内存排查这个问题我遇到过两次第一次排查花了整整一个下午第二次就轻车熟路了。现象是 NullClaw 启动后加载模型进度条走到百分之六七十进程突然消失日志里没有任何报错。排查链路是这样的。第一步看系统日志dmesg果然发现了 OOM Killer 的记录说明是内存不足被系统杀掉的。第二步用free -h看加载前的可用内存发现只剩 900MB而模型需要 1.1GB缺口 200MB。第三步找内存去哪了——用ps aux按内存排序发现一个之前测试留下的采集进程还在跑占了 300MB。杀掉它之后内存够了模型正常加载。这个坑的教训是部署前一定要清理环境别让无关进程占着内存。另外OOM Killer 杀进程时不一定杀你的目标进程它可能杀掉系统里其他重要服务导致更奇怪的问题。所以内存余量要留足别卡着红线跑。后来我养成了习惯在启动脚本里加一段内存检查可用内存低于阈值就先清理缓存、杀掉非必要进程再启动模型。这个脚本很简单但能省很多事。5.2 推理结果乱码与精度崩塌量化校准集的锅第二次踩的坑更隐蔽。模型能加载推理也能跑但输出全是乱码偶尔蹦出几个不相关的词。第一反应是模型文件损坏重新拷了一遍问题依旧。换了个模型正常。说明是量化环节出了问题。回头查量化流程发现校准集用的是通用语料里面几乎没有工业领域的句子。模型在量化时对工业术语的数值分布统计不准导致这些词的权重被压得面目全非。重新用工业指令语料做校准量化后的模型输出就正常了。这个坑说明一个道理量化不是无脑压缩校准集的质量直接决定量化后模型在你业务上的表现。通用语料校准出来的模型在通用对话上没问题一到专业领域就露馅。所以校准集一定要贴合业务哪怕只有几百条真实句子也比几万条无关语料强。5.3 多轮对话越聊越慢KV Cache 的隐形膨胀第三个问题出现在长时间运行后。刚启动时推理速度还行聊了十几轮之后每轮响应时间从 2 秒涨到 8 秒最后卡死。查内存发现占用在持续上涨明显是泄漏或者缓存没释放。定位到 KV Cache。多轮对话时每一轮的历史都要缓存起来供后续注意力计算使用如果不做窗口管理缓存会无限增长。NullClaw 默认的窗口策略是保留全部历史在端侧这是灾难。改成滑动窗口加摘要压缩后缓存稳定在设定上限速度也稳定了。具体做法是保留最近 N 轮完整对话更早的对话用一个小模型或者规则方法压缩成摘要只保留关键信息。这样既控制了内存又不至于完全丢失上下文。N 的取值看业务我一般设 5 到 8 轮。提示KV Cache 的增长是非线性的窗口从 1024 开到 2048缓存可能涨一倍多。端侧部署时窗口大小要当成一等公民来对待别等出问题了才想起来调。6. 把开发板变成能用的助手工具调用与业务对接6.1 工具注册表的设计与函数签名约定NullClaw 的工具调用机制本质是让模型输出一个结构化的调用请求运行时解析后执行对应的本地函数再把结果喂回模型。所以工具注册表的设计直接决定了助手能干什么。每个工具要定义三样东西名称、描述、参数 schema。名称要短且语义清晰比如read_temp、set_relay。描述是给模型看的要写清楚这个工具干什么、什么时候用模型靠这个描述来决定调不调用。参数 schema 定义参数名、类型、是否必填模型按这个格式生成调用请求。我踩过的坑是描述写得太简略模型不知道该用哪个工具。比如有两个工具read_temp和read_humidity描述都只写读取数值模型就经常调错。后来把描述改成读取当前环境温度单位摄氏度和读取当前环境湿度单位百分比准确率立刻上去了。给模型看的描述要像给新人写文档一样详细。工具数量也要控制。端侧模型能力有限工具太多它会挑花眼。我一般控制在 5 到 8 个核心工具覆盖最常用的操作。工具多了就分组用二级路由让模型先选类别再选具体工具。6.2 把 GPIO 和串口包装成模型能调用的函数工业开发板的价值在于它能碰硬件。把 GPIO 读写、串口通信包装成工具函数助手就能真正控制设备而不只是聊天。以 GPIO 为例Linux 下通过 sysfs 或者字符设备操作。包装成工具函数时要做几件事参数校验引脚号是否合法、电平值是否在范围内、错误处理操作失败要返回明确的错误信息给模型、状态记录记录当前引脚状态避免重复操作。这些细节看起来琐碎但决定了助手是能用还是好用。串口通信类似但更复杂。要处理波特率配置、数据帧解析、超时重试。我的做法是把常用的串口操作封装成几个高层工具比如向设备发送查询指令并返回解析后的结果而不是暴露原始的字节读写。这样模型不用关心底层协议调用起来更可靠。注意硬件操作类工具一定要加超时和异常保护。模型可能生成奇怪的参数或者硬件本身出故障如果没有保护一个错误的调用可能让整个助手卡死。我一般给每个硬件工具设 2 秒超时超时返回错误让模型重新决策。6.3 对话状态管理与异常兜底策略助手跑起来之后状态管理是保证体验的关键。要维护的东西包括当前对话历史、已调用的工具及结果、用户的偏好设置、设备的当前状态。这些状态有的放内存有的要持久化到 eMMC防止断电丢失。异常兜底是另一个重点。模型可能输出无法解析的格式工具可能执行失败用户可能输入超纲的问题。每一种异常都要有对应的处理策略。格式解析失败就重试一次再失败就返回我没理解请换个说法工具执行失败就把错误信息喂回模型让它决定是重试还是告知用户超纲问题就老实说这个我处理不了。我特别想强调一点端侧助手要敢于说不知道。小模型的能力边界很明显硬撑着回答反而会给出错误信息在工业场景里可能造成误操作。设计上要留一个置信度判断低于阈值就转人工或者提示用户。这个策略看起来保守但实际用起来用户反而更信任。7. 性能与稳定性的长期维护经验7.1 冷启动优化让设备上电就能用工业设备经常要断电重启冷启动速度直接影响可用性。NullClaw 加模型加载如果优化不好启动要一两分钟这在现场是不可接受的。优化冷启动有几个方向。第一模型文件放在读取速度最快的存储上如果板子有 eMMC 和 SD 卡优先用 eMMC。第二预加载关键层把推理最常用的层在启动时优先加载让助手能尽快响应第一个请求其余层后台慢慢加载。第三并行加载模型加载和系统初始化并行做别串行等。我实测下来优化后冷启动能从 90 秒压到 30 秒左右。如果业务允许还可以做一个常驻的轻量模式设备上电后助手先以最小模型运行完整模型在后台加载完成后无缝切换。这样用户几乎感觉不到等待。7.2 长时间运行的稳定性观察端侧设备经常 7x24 运行稳定性比峰值性能更重要。我一般会做至少 72 小时的连续运行测试观察几个指标内存占用是否稳定、推理速度是否衰减、温度是否可控、日志是否有异常。内存泄漏是最常见的问题。表现是运行几小时后内存缓慢上涨最终 OOM。排查方法是定时打印内存快照对比不同时间点的占用找出增长的部分。常见泄漏点包括对话历史没释放、工具调用的临时对象没回收、推理引擎的缓冲区没复用。找到之后针对性修复。温度也要盯。ARM 板子长时间满载推理温度能到七八十度如果没有散热片或者风扇会触发降频速度断崖式下跌。我的做法是加一个温度监控超过阈值就降低推理频率或者暂停非关键任务保证核心功能可用。7.3 模型与运行时的版本管理端侧部署的版本管理比云端麻烦因为设备分散、升级困难。我的经验是模型和运行时版本要绑定管理记录每个版本对应的模型文件、量化参数、运行时配置。升级时整包替换不要单独换模型或单独换运行时避免版本不匹配。升级策略上工业设备一般不允许自动升级要走人工确认。可以做一个升级包包含新版本的所有文件和一个升级脚本现场人员执行脚本完成升级。脚本里要有回滚逻辑升级失败自动恢复到旧版本。还有一点保留旧版本一段时间。新版本上线后别急着删旧文件观察一两周确认没问题再清理。我见过升级后出问题想回滚结果旧文件已经删了只能重新部署费时费力。8. 一些掏心窝子的实操建议写到这里部署的主线基本讲完了。最后分享几个我在多个端侧 AI 项目里反复验证过的经验都是文档里不会写、但实际能救命的东西。第一别追求一步到位。很多人一上来就想跑最大的模型、开最长的窗口、挂最多的工具结果处处碰壁。正确的做法是先跑通最小闭环——一个小模型、一个工具、一轮对话确认整条链路通了再逐步加码。这样出问题容易定位成就感也来得快。第二日志是你的救命稻草但要控制好。端侧调试全靠日志但日志写太多会拖慢系统、磨损存储。我的做法是分级错误和关键状态永久保留调试信息只在开发阶段开上线后关掉。日志文件要轮转别让它无限增长。第三给模型的能力边界画一条线。端侧小模型不是万能的硬要它做超出能力的事只会得到糟糕的体验。设计产品时就想清楚哪些问题助手处理哪些转人工哪些直接拒绝。这条线画好了用户满意度反而高。第四测试要用真实场景的数据。开发机上用标准测试集跑出来的分数和现场真实语料的表现可能差很远。我一般会收集现场的真实指令做成测试集每次改动都跑一遍。这个习惯帮我提前发现了很多问题。第五留好远程维护的通道。设备部署到现场后你不可能每次都跑过去。要预留一个安全的远程诊断接口能看日志、能重启服务、能更新配置。这个接口的安全性要做好别成为漏洞。这套 NullClaw 加睿擎派的方案我在几个项目里跑下来稳定性是够用的。它不是要替代云端大模型而是在特定场景下提供了一个离线、可控、低成本的智能交互选项。如果你也在做类似的边缘 AI 落地希望这些经验能帮你少走点弯路。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询