7,697
社区成员
发帖
与我相关
我的任务
分享本文档记录在 Rhino X1 QCS8550 边缘设备上,基于 AidGenSE 推理引擎部署 Qwen3-8B 大语言模型并启动 OpenAI 兼容 HTTP 服务的完整流程与实测结果。
| 项目 | 说明 |
|---|---|
| 设备 | QCS8550 平台(SoC ID 603,kalama) |
| 系统 | Ubuntu 22.04.2 LTS(内核 5.15.148-android13,aarch64) |
| 推理引擎 | AidGenSE v3.3.1(Genie 后端) |
| 推理单元 | Hexagon DSP / HTP(NPU) |
| 包名 | 版本 | 用途 |
|---|---|---|
aidgense | 3.3.1 | AidGenSE 推理引擎主体 |
aidgen-sdk | 2.4.3.166 | AidGen SDK 运行时 |
aidgen-qnn236 | 2.4.0.139 | QNN 2.36 运行时(本模型必需) |
aidgen-qnn240 | 2.4.3.166 | QNN 2.40 运行时(可选) |
aidgen-qnn248 | 2.4.3.166 | QNN 2.48 运行时(可选) |
| 项目 | 说明 |
|---|---|
| 模型名称 | qwen3-8b-qnn2.36-w4a16-qcs8550 |
| 模型类型 | LLM(纯文本大语言模型) |
| 量化方式 | W4A16(权重 4bit / 激活 16bit) |
| 转换工具链 | Qualcomm QNN 2.36 |
| 上下文长度 | 4096 tokens(cl4096) |
| 磁盘占用 | 约 5.4 GB(5 个 serialized.bin 分片 + tokenizer + 配置) |
| 模型存放路径 | /opt/aidlux/app/aid-openai-api/res/models/qwen3-8b-qnn2.36-w4a16-qcs8550/ |
| 默认采样参数 | temperature=0.7,top-k=20,top-p=0.8,seed=42 |
模型目录结构:
/opt/aidlux/app/aid-openai-api/res/models/qwen3-8b-qnn2.36-w4a16-qcs8550/
├── qwen3-8b_qnn236_qcs8550_cl4096_1_of_5.serialized.bin # 模型权重分片(共 5 片)
├── qwen3-8b_qnn236_qcs8550_cl4096_2_of_5.serialized.bin
├── qwen3-8b_qnn236_qcs8550_cl4096_3_of_5.serialized.bin
├── qwen3-8b_qnn236_qcs8550_cl4096_4_of_5.serialized.bin
├── qwen3-8b_qnn236_qcs8550_cl4096_5_of_5.serialized.bin
├── qwen3-8b-tokenizer.json # 分词器
├── qwen3-8b-qnn2.36-w4a16-qcs8550.json # AIDL/Genie 推理配置
├── aidgen_config.json # AidGenSE 服务配置
├── config_linux.json # Linux 平台配置
├── htp_backend_ext_config.json # HTP 后端扩展配置(NPU 性能参数)
├── prefix-kvcache/ # 前缀 KV Cache
├── prompt.conf # 提示词模板
├── chat-think.txt / chat-nothink.txt # 思考/非思考模式参考模板
└── tokenizer.json
sudo aid-pkg update
sudo aid-pkg -i aidgense
sudo aid-pkg -i aidgen-sdk
sudo aid-pkg -i aidgen-qnn236 # 部署 QNN 2.36 模型必需
sudo aid-pkg -i aidgen-qnn240
sudo aid-pkg -i aidgen-qnn248
验证安装:
aid-pkg list | grep -E "aidgen|qnn"
# 查看远程仓库已支持的模型(可配合 grep 过滤)
aidllm remote-list api | grep qwen3-8b
# 下载模型(约 4.9 GB 安装包,解压后约 5.4 GB,耗时取决于网速)
aidllm pull api qwen3-8b-qnn2.36-w4a16-qcs8550
# 查看已下载模型
aidllm list api
下载成功的输出示例:
Pulling API model qwen3-8b-qnn2.36-w4a16-qcs8550...
Downloading package 100% [==========================] (4.9/4.9 GB, 10 MB/s)
Extracting package...
Pull API model qwen3-8b-qnn2.36-w4a16-qcs8550 successfully!
# 启动 OpenAI 兼容 HTTP 服务(默认端口 8888)
aidllm start api -m qwen3-8b-qnn2.36-w4a16-qcs8550
启动成功输出示例:
Use model: qwen3-8b-qnn2.36-w4a16-qcs8550
Processor: dsp
args : [--device dsp --qnn_ver 240]
Api server start successfully.
注意:若服务已在运行(例如运行其他模型),需先执行
aidllm stop api再启动。
aidllm status api # 查看服务状态
aidllm stop api # 停止服务
aidllm restart api # 重启服务
常见启动参数(aidllm start api --help):
| 参数 | 说明 | 默认值 |
|---|---|---|
-m, --model | 指定模型 ID | — |
-p, --port | 服务端口 | 8888 |
-d, --device | 推理单元(cpu / gpu / dsp) | 自动选择 dsp |
--qnn_ver | QNN 版本(236 / 240 / 248) | 240 |
-b, --backend | 推理框架(genie / llamacpp) | genie |
--api_key | Bearer Token 鉴权密钥(可选) | — |
curl http://127.0.0.1:8888/health
返回示例(可查看驱动版本、后端、设备等信息):
{
"status": "ok",
"aidgen_api_version": "Aplux_Aidgen_V2.4.3.166_...",
"svr_status": "SVR_STATUS_START_SUCCESS",
"svr_current_backend": "genie",
"svr_current_device": "dsp"
}
curl http://127.0.0.1:8888/v1/models
{"object":"list","loaded_id":"qwen3-8b-qnn2.36-w4a16-qcs8550","model_type":"llm", ...}
curl -s -X POST http://127.0.0.1:8888/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3-8b-qnn2.36-w4a16-qcs8550",
"messages": [{"role": "user", "content": "你好,请用一句话介绍你自己"}],
"stream": false
}'
工作区已附带测试脚本 test_chat.py:
python3 test_chat.py
脚本核心逻辑(OpenAI 兼容 SSE 流式解析):
import requests, json
url = "http://127.0.0.1:8888/v1/chat/completions"
payload = {
"model": "qwen3-8b-qnn2.36-w4a16-qcs8550",
"messages": [{"role": "user", "content": "你好。"}],
"stream": True,
}
response = requests.post(url, json=payload, stream=True)
for line in response.iter_lines():
if line and line.decode("utf-8").startswith("data: "):
data = line.decode("utf-8")[len("data: "):]
if data.strip() == "[DONE]":
break
content = json.loads(data)["choices"][0]["delta"].get("content")
if content:
print(content, end="", flush=True)
sudo aidllm install ui # 安装 UI 前端服务(首次)
aidllm start ui # 启动 UI 服务
aidllm status ui # 查看状态
浏览器访问:http://<设备IP>:51104
Qwen3 默认开启思考模式,输出中会包含 <think>...</think> 推理过程,响应更慢但更准确。可在用户消息末尾追加 /no_think 关闭思考模式,显著降低延迟:
curl -s -X POST http://127.0.0.1:8888/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3-8b-qnn2.36-w4a16-qcs8550",
"messages": [{"role": "user", "content": "用一句话介绍杭州。/no_think"}],
"stream": false
}'
| 模式 | 说明 | 实测效果 |
|---|---|---|
| 默认(思考) | 输出 <think> 推理过程 | 回答更严谨,耗时较长 |
/no_think | 跳过推理过程直接回答 | 响应快(示例问题约 2.8s / 30 tokens) |
| 测试项 | 结果 |
|---|---|
aidllm list api | qwen3-8b-qnn2.36-w4a16-qcs8550 已列出 ✅ |
aidllm start api -m ... | Api server start successfully,端口 8888 监听 ✅ |
/v1/models | loaded_id = qwen3-8b-qnn2.36-w4a16-qcs8550 ✅ |
| 非流式对话(首次,含思考) | 正常返回中文回答,230 tokens,约 20.7s(含首次加载) |
流式对话(test_chat.py) | SSE 流式输出正常,逐字返回 ✅ |
/no_think 对话 | 正常返回,30 tokens,约 2.8s ✅ |
Q1:aidllm start api 报错 api service is already running?
说明服务已在运行。先停止再启动:
aidllm stop api
aidllm start api -m qwen3-8b-qnn2.36-w4a16-qcs8550
Q2:启动失败或报 QNN / 模型加载错误?
确认已安装对应 QNN 版本依赖包(本模型需要 aidgen-qnn236),并检查:
aid-pkg list | grep aidgen
aidllm status api
Q3:推理速度慢?
/no_think 关闭思考模式;svr_slot_num 默认为 1,串行推理)。Q4:如何释放磁盘空间?
删除不需要的模型:
aidllm rm api <模型名>
Q5:手机/PC 如何远程访问服务?
服务默认监听 0.0.0.0:8888,局域网内可通过 http://<设备IP>:8888/v1/chat/completions 访问;如需公网访问,建议开启 API Key 鉴权:
aidllm start api -m qwen3-8b-qnn2.36-w4a16-qcs8550 --api_key your-secret-key
| 接口 | 方法 | 说明 |
|---|---|---|
http://<IP>:8888/health | GET | 健康检查与版本信息 |
http://<IP>:8888/v1/models | GET | 模型列表(OpenAI 兼容) |
http://<IP>:8888/v1/chat/completions | POST | 对话补全(支持 stream)(OpenAI 兼容) |
其中 model 字段统一填写:qwen3-8b-qnn2.36-w4a16-qcs8550
将本机部署的 Qwen3-8B 作为"对话大脑",通过一个消息桥接服务接入 QQ / 微信,实现:

| 平台 | 方案 | 协议 / 工具 | 合规性 | 说明 |
|---|---|---|---|---|
| 官方机器人 | QQ 机器人开放平台(q.qq.com)+ 官方 SDK botpy | ✅ 官方 | 需注册开发者与机器人,支持频道 / 群 / 私聊 | |
| 个人号(非官方) | OneBot v11 协议 + NapCat / Lagrange.Core 等实现 | ⚠️ 灰色 | 登录个人 QQ 收发消息,存在风控 / 封号风险 | |
| 微信 | 官方 | 企业微信应用消息 / 群机器人 Webhook、微信公众号消息回调 | ✅ 官方 | 企业微信机器人群内自动回复,公众号支持消息回调 |
| 微信 | 个人号(非官方) | Wechaty(付费 puppet)等框架 | ⚠️ 灰色 | 自动化个人微信,违反用户协议,封号风险高 |
💡 建议:优先选择官方渠道(QQ 机器人开放平台、企业微信 / 公众号);个人号非官方方案仅供个人学习研究,请勿用于商业营销或骚扰用途。
无论 QQ 还是微信,桥接服务的思路一致:收到消息 → 调用本地 LLM → 把回复发回对应会话。以 OneBot v11(NapCat 消息上报)为例:
# qq_bridge.py —— 消息桥接示意代码(OneBot v11)
import requests
LLM_URL = "http://127.0.0.1:8888/v1/chat/completions" # 本机 LLM 服务
ONEBOT_URL = "http://127.0.0.1:3000" # NapCat HTTP 接口
MODEL = "qwen3-8b-qnn2.36-w4a16-qcs8550"
# 代聊人设:可按你的聊天风格调整
SYSTEM_PROMPT = "你是我的聊天分身,请用轻松、简短、口语化的语气代我回复消息。"
def ask_llm(text: str) -> str:
resp = requests.post(LLM_URL, json={
"model": MODEL,
"messages": [
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": text + " /no_think"}, # 关闭思考,降低延迟
],
"stream": False,
}, timeout=120)
return resp.json()["choices"][0]["message"]["content"].strip()
def on_message(event: dict):
"""处理 OneBot 上报的消息事件"""
if event.get("post_type") != "message":
return
text = event.get("raw_message", "").strip()
if not text:
return
answer = ask_llm(text)
if event.get("message_type") == "private": # 私聊:直接回复
requests.post(f"{ONEBOT_URL}/send_private_msg",
json={"user_id": event["user_id"], "message": answer})
elif event.get("message_type") == "group": # 群聊:仅被 @ 时回复
if f"[CQ:at,qq={event['self_id']}]" in text:
requests.post(f"{ONEBOT_URL}/send_group_msg",
json={"group_id": event["group_id"], "message": answer})
微信端(企业微信回调或 Wechaty)思路完全相同:收到消息 → 调用
ask_llm()→ 将返回文本发回会话。
| 设计点 | 建议 |
|---|---|
| 降低延迟 | 代聊场景建议加 /no_think;实测简单问题约 2~3s 出结果 |
| 上下文管理 | 模型上下文 4096 tokens,建议只保留最近 N 轮(如 6~10 轮)拼接发送 |
| 触发规则 | 私聊可全量回复;群聊建议"仅 @ 机器人 / 命中关键词"才回复,避免刷屏 |
| 人设与风格 | 通过 system prompt 定义语气、口头禅;可按联系人切换多套人设 |
| 消息队列 | 服务端 svr_slot_num=1 串行推理,高并发时建议加队列 + 节流限速 |
| 安全兜底 | 联系人白名单、敏感词过滤、超时兜底回复(如"稍后回复你") |
#!/bin/bash
# deploy_qwen3_8b.sh - Qwen3-8B (QCS8550) 一键部署脚本
set -e
echo "[1/4] 更新软件源并安装 AidGenSE 依赖..."
sudo aid-pkg update
sudo aid-pkg -i aidgense
sudo aid-pkg -i aidgen-sdk
sudo aid-pkg -i aidgen-qnn236
echo "[2/4] 下载模型(已下载会自动跳过)..."
if aidllm list api | grep -q "qwen3-8b-qnn2.36-w4a16-qcs8550"; then
echo "模型已存在,跳过下载。"
else
aidllm pull api qwen3-8b-qnn2.36-w4a16-qcs8550
fi
echo "[3/4] 启动 HTTP 服务..."
aidllm stop api 2>/dev/null || true
aidllm start api -m qwen3-8b-qnn2.36-w4a16-qcs8550
echo "[4/4] 等待服务就绪并验证..."
for i in $(seq 1 15); do
if curl -s http://127.0.0.1:8888/health | grep -q '"status": "ok"'; then
echo "服务已就绪: http://127.0.0.1:8888"
curl -s http://127.0.0.1:8888/v1/models
exit 0
fi
sleep 2
done
echo "服务启动超时,请使用 'aidllm status api' 检查状态"
exit 1
文档实测日期:2026-09-20 | 环境:QCS8550 + Ubuntu 22.04 + AidGenSE v3.3.1