ChatGPT部署¶
Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.
ChatGPT 介绍¶
ChatGPT 是 OpenAI 推出的基于 GPT(Generative Pre-trained Transformer)架构的对话式大语言模型产品,代表模型包括 GPT-3.5-turbo、GPT-4、GPT-4o、GPT-4o-mini 等。它具备多轮对话、代码生成、逻辑推理、多模态理解等能力,是目前应用最广泛的商用 LLM 之一。
本文档演示如何在 Quectel Pi M1 智能主控板本地部署ChatGPT。
部署所需资源介绍¶
由于 ChatGPT 是闭源云服务,“部署 ChatGPT” 的本质是 在设备上部署一个调用 OpenAI API 的本地服务网关,使设备及其局域网内的客户端能够通过该网关进行问答。
ChatGPT 模型介绍¶
OpenAI API 当前可供调用的主流模型:
模型 |
上下文窗口 |
说明 |
适用场景 |
|---|---|---|---|
|
128K |
最新多模态旗舰模型,支持文本/图像输入 |
复杂推理、多模态 |
|
128K |
4o 的小尺寸版本,速度快、价格低 |
通用对话(推荐默认) |
|
128K |
GPT-4 长上下文版本 |
长文档分析 |
|
8K/32K |
经典 GPT-4 |
高质量推理 |
|
16K |
老牌经济型模型 |
低成本简单任务 |
嵌入式设备场景下推荐默认使用
gpt-4o-mini,兼顾质量、速度与成本。
部署模型特性指标¶
由于采用 API 调用方式,本地不加载模型权重,指标主要取决于网络与服务端:
指标 |
典型值 |
备注 |
|---|---|---|
本地内存占用 |
~30-50 MB |
Python 进程 + 依赖 |
本地 CPU 占用 |
< 5% |
仅做请求转发 |
首字延迟(TTFT) |
0.5-2 s |
取决于网络与服务端负载 |
生成速度 |
30-80 tokens/s |
服务端生成,受网络限速 |
单次最大输入 |
128K tokens(4o 系列) |
受模型上下文窗口限制 |
并发能力 |
受 API 速率限制(RPM/TPM) |
与账户等级相关 |
离线可用性 |
不可用 |
必须联网 |
安装¶
依赖下载¶
ChatGPT 网关服务依赖 Python 3 及 openai 官方库。M1 已预装 Python 3.13.5 与 pip3,仅需安装 Python 依赖。
# 1. 确认 Python 与 pip
python3 --version # 应输出 Python 3.13.5
pip3 --version
# 2. 升级 pip 并安装 openai 官方库(API 调用)与 flask(本地网关)
pip3 install --upgrade pip
pip3 install openai flask
# 3. 验证安装
python3 -c "import openai; print('openai', openai.__version__)"
若 pip 安装报证书错误,可加
--trusted-host pypi.org --trusted-host files.pythonhosted.org。 若需要离线安装,可在联网主机pip download openai flask -d ./wheels后将 wheels 目录adb push到设备,再pip3 install --no-index --find-links=./wheels openai flask。
工具下载¶
下载CURL工具
apt install curl
curl --version | head -1 # 确认 curl 可用
如需在设备上做流式可视化测试,可选安装 jq(JSON 处理):
apt-get install -y jq # 设备为 Debian,apt 可用
模型下载选择¶
重要说明: ChatGPT(GPT-4 / GPT-3.5 等)是 OpenAI 的闭源商业模型,模型权重无法下载、无法在本地运行。因此本节"模型选择"指 选择调用哪个 OpenAI API 模型,而非下载模型文件。
选择建议:
**默认推荐:
gpt-4o-mini** —— 速度快、价格低、支持 128K 上下文,适合嵌入式设备的多数对话场景**高质量推理:
gpt-4o** —— 复杂逻辑/代码任务,延迟与成本较高**低成本简单任务:
gpt-3.5-turbo** —— 历史经济型模型
若需 完全离线 运行 GPT 风格模型,可改用开源替代方案(如 GPT-2 117M、Qwen2.5-0.5B 等),通过 llama.cpp 在本地加载 GGUF 文件。此类方案不依赖网络但质量与 ChatGPT 有差距
启动¶
后台部署及部署配置介绍¶
下面在设备 /data/chatgpt/ 下部署一个 OpenAI 兼容的本地网关服务。它对外暴露 HTTP 接口,内部转发到 OpenAI API,并支持多轮对话与流式输出。
目录结构:
/data/chatgpt/
├── config.env # 配置文件(API Key、模型、端口等)
├── chatgpt_server.py # 网关服务主程序
└── chatgpt.service # systemd 服务单元(后台常驻)
步骤 1:创建目录与配置文件
mkdir -p /data/chatgpt
cat > /data/chatgpt/config.env <<'EOF'
# ===== ChatGPT 网关配置 =====
# OpenAI API Key(必填,替换为自己的 Key)
export OPENAI_API_KEY="sk-在此填入你的OpenAI密钥"
# API 基础地址:默认官方,如使用中转服务则改为对应地址
# 官方:https://api.openai.com/v1
# 中转示例:https://your-proxy.example.com/v1
export OPENAI_BASE_URL="https://api.openai.com/v1"
# 默认模型
export CHATGPT_MODEL="gpt-4o-mini"
# 网关监听地址与端口(0.0.0.0 表示允许局域网访问)
export SERVER_HOST="0.0.0.0"
export SERVER_PORT="8000"
# 系统提示词(定义助手人设)
export SYSTEM_PROMPT="你是一个运行在嵌入式设备上的智能助手,请简洁专业地回答问题。"
# 采样参数
export TEMPERATURE="0.7"
export MAX_TOKENS="1024"
EOF
chmod 600 /data/chatgpt/config.env # 保护密钥
步骤 2:编写网关服务主程序
cat > /data/chatgpt/chatgpt_server.py <<'PYEOF'
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""ChatGPT 网关服务:对外暴露 HTTP 接口,转发至 OpenAI API。
提供两种接口:
/v1/chat/completions —— OpenAI 兼容接口(可被任意 OpenAI 客户端调用)
/ask —— 极简问答接口(GET/POST,便于嵌入式调用)
"""
import os, json, uuid
from flask import Flask, request, Response, jsonify
from openai import OpenAI
# ---- 加载配置 ----
CFG_PATH = "/data/chatgpt/config.env"
if os.path.exists(CFG_PATH):
for line in open(CFG_PATH, encoding="utf-8"):
line = line.strip()
if line and not line.startswith("#") and "=" in line and line.startswith("export "):
k, v = line[len("export "):].split("=", 1)
os.environ.setdefault(k.strip(), v.strip().strip('"').strip("'"))
API_KEY = os.environ["OPENAI_API_KEY"]
BASE_URL = os.environ.get("OPENAI_BASE_URL", "https://api.openai.com/v1")
MODEL = os.environ.get("CHATGPT_MODEL", "gpt-4o-mini")
HOST = os.environ.get("SERVER_HOST", "0.0.0.0")
PORT = int(os.environ.get("SERVER_PORT", "8000"))
SYS_PROMPT = os.environ.get("SYSTEM_PROMPT", "You are a helpful assistant.")
TEMPERATURE = float(os.environ.get("TEMPERATURE", "0.7"))
MAX_TOKENS = int(os.environ.get("MAX_TOKENS", "1024"))
client = OpenAI(api_key=API_KEY, base_url=BASE_URL)
app = Flask(__name__)
# 会话存储(演示用,进程内字典;生产环境建议持久化)
sessions = {}
def build_messages(sid, user_msg):
if sid not in sessions:
sessions[sid] = [{"role": "system", "content": SYS_PROMPT}]
sessions[sid].append({"role": "user", "content": user_msg})
return sessions[sid]
@app.route("/ask", methods=["POST"])
def ask_simple():
"""极简接口:POST /ask body={"q":"你的问题","sid":"可选会话id"}"""
data = request.get_json(force=True, silent=True) or {}
q = data.get("q", "").strip()
sid = data.get("sid", "default")
if not q:
return jsonify({"error": "missing 'q'"}), 400
try:
msgs = build_messages(sid, q)
resp = client.chat.completions.create(
model=MODEL, messages=msgs,
temperature=TEMPERATURE, max_tokens=MAX_TOKENS)
ans = resp.choices[0].message.content
sessions[sid].append({"role": "assistant", "content": ans})
return jsonify({"answer": ans, "model": MODEL})
except Exception as e:
return jsonify({"error": str(e)}), 500
@app.route("/v1/chat/completions", methods=["POST"])
def chat_completions():
"""OpenAI 兼容接口,支持 stream。"""
body = request.get_json(force=True, silent=True) or {}
msgs = body.get("messages", [])
stream = body.get("stream", False)
model = body.get("model", MODEL)
# 自动补系统提示
if not msgs or msgs[0].get("role") != "system":
msgs = [{"role": "system", "content": SYS_PROMPT}] + msgs
try:
if not stream:
r = client.chat.completions.create(
model=model, messages=msgs,
temperature=body.get("temperature", TEMPERATURE),
max_tokens=body.get("max_tokens", MAX_TOKENS))
return jsonify(r.model_dump())
# 流式
def gen():
r = client.chat.completions.create(
model=model, messages=msgs, stream=True,
temperature=body.get("temperature", TEMPERATURE),
max_tokens=body.get("max_tokens", MAX_TOKENS))
for chunk in r:
yield f"data: {json.dumps(chunk.model_dump(), ensure_ascii=False)}\n\n"
yield "data: [DONE]\n\n"
return Response(gen(), mimetype="text/event-stream")
except Exception as e:
return jsonify({"error": {"message": str(e)}}), 500
@app.route("/v1/models", methods=["GET"])
def list_models():
"""返回可用模型列表(OpenAI 兼容)。"""
try:
return jsonify(client.models.list().model_dump())
except Exception as e:
return jsonify({"error": str(e)}), 500
@app.route("/health", methods=["GET"])
def health():
return jsonify({"status":"ok","model":MODEL,"base_url":BASE_URL})
if __name__ == "__main__":
print(f"[ChatGPT Gateway] model={MODEL} base={BASE_URL} listen={HOST}:{PORT}")
app.run(host=HOST, port=PORT, threaded=True)
PYEOF
chmod +x /data/chatgpt/chatgpt_server.py
步骤 3:配置 systemd 后台服务(开机自启)
cat > /data/chatgpt/chatgpt.service <<'EOF'
[Unit]
Description=ChatGPT Gateway Service on SC200U
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
WorkingDirectory=/data/chatgpt
EnvironmentFile=/data/chatgpt/config.env
ExecStart=/usr/bin/python3 /data/chatgpt/chatgpt_server.py
Restart=on-failure
RestartSec=5
StandardOutput=append:/data/chatgpt/chatgpt.log
StandardError=append:/data/chatgpt/chatgpt.log
[Install]
WantedBy=multi-user.target
EOF
# 安装并启用服务
cp /data/chatgpt/chatgpt.service /etc/systemd/system/chatgpt.service
systemctl daemon-reload
systemctl enable chatgpt.service
启动 ChatGPT 服务¶
首次启动前必须配置 API Key:
# 编辑配置,填入真实 Key
vi /data/chatgpt/config.env
# 修改 OPENAI_API_KEY="sk-你的真实密钥"
启动与管理:
# 启动服务
systemctl start chatgpt.service
# 查看状态
systemctl status chatgpt.service
# 查看日志
tail -f /data/chatgpt/chatgpt.log
# 重启 / 停止
systemctl restart chatgpt.service
systemctl stop chatgpt.service
手动前台调试(不经过 systemd):
cd /data/chatgpt
source ./config.env
python3 ./chatgpt_server.py
启动成功后日志会输出:
[ChatGPT Gateway] model=gpt-4o-mini base=https://api.openai.com/v1 listen=0.0.0.0:8000
* Running on http://0.0.0.0:8000
应用演示¶
健康检查¶
curl http://127.0.0.1:8000/health
# {"model":"gpt-4o-mini","status":"ok","base_url":"https://api.openai.com/v1"}
极简单轮问答¶
curl -s -X POST http://127.0.0.1:8000/ask \
-H "Content-Type: application/json" \
-d '{"q":"用一句话介绍SC200U芯片"}' | python3 -m json.tool
预期输出:
{
"answer": "SC200U是移远通信基于高通骁龙的物联网通信模组,支持4G全网通与边缘智能。",
"model": "gpt-4o-mini"
}
嵌入式程序调用示例(C / curl)¶
设备上的 C 程序或 shell 脚本可通过 curl 调用:
# shell 一行调用
ANSWER=$(curl -s -X POST http://127.0.0.1:8000/ask \
-H "Content-Type: application/json" \
-d "{\"q\":\"${QUERY}\"}" | python3 -c "import sys,json;print(json.load(sys.stdin)['answer'])")
echo "$ANSWER"
应用场景¶
场景 |
说明 |
|---|---|
智能客服终端 |
在 SC200U 智能网关/POS 设备上提供自然语言问答,处理用户咨询 |
工业现场语音助手 |
结合 ASR/TTS,工程师通过语音询问设备故障排查建议 |
代码/脚本生成 |
现场运维时让模型生成 shell/Python 脚本片段 |
常见问题¶
模型过大¶
ChatGPT 本身无法本地化,但若场景要求 完全离线 或 零 API 成本,可在 M1上部署开源小模型替代。本设备可运行的最小方案:
替代模型 |
参数量 |
GGUF 量化 |
内存占用 |
推理速度(SC200U) |
质量 |
|---|---|---|---|---|---|
GPT-2 |
124M |
F16 |
~0.5 GB |
~15-30 tok/s |
低(仅英文短文) |
Qwen2.5-0.5B |
0.5B |
Q4_K_M |
~0.6 GB |
~8-15 tok/s |
中 |
DeepSeek-R1-Distill-Qwen-1.5B |
1.5B |
Q4_K_M |
~1.6 GB |
~3-8 tok/s |
中高(推理强) |
Qwen2.5-1.5B |
1.5B |
Q4_K_M |
~1.6 GB |
~3-8 tok/s |
中高 |
Qwen2.5-3B |
3B |
Q4_K_M |
~2.6 GB |
~1-3 tok/s |
高(需 Swap,较卡) |
7B 及以上模型在 3.7GB 内存设备上不可行(会触发 OOM)。