# 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 M2** 智能主控板上部署 ChatGPT 网关服务。 ## 部署本质说明 由于 ChatGPT 是闭源云服务,"部署 ChatGPT" 的本质是 **在设备上部署一个调用 OpenAI API 的本地服务网关**,使设备及其局域网内的客户端能够通过该网关进行问答。 # ChatGPT 模型介绍 OpenAI API 当前可供调用的主流模型: | **模型** | **上下文窗口** | **说明** | **适用场景** | | --- | --- | --- | --- | | `gpt-4o` | 128K | 最新多模态旗舰模型,支持文本/图像输入 | 复杂推理、多模态 | | `gpt-4o-mini` | 128K | 4o 的小尺寸版本,速度快、价格低 | 通用对话(推荐默认) | | `gpt-4-turbo` | 128K | GPT-4 长上下文版本 | 长文档分析 | | `gpt-4` | 8K/32K | 经典 GPT-4 | 高质量推理 | | `gpt-3.5-turbo` | 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),与账户等级相关 > > - **离线可用性**:不可用(必须联网) # 安装 ## 依赖安装 M2 已预装 Python 3 与 pip3,仅需安装 Python 依赖: ```bash # 1. 确认 Python 与 pip python3 --version pip3 --version # 2. 安装 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`。 ## 工具下载 ```bash sudo apt install curl curl --version | head -1 # 确认 curl 可用 # 如需流式可视化测试,可选安装 jq sudo apt-get install -y jq ``` # 模型下载选择 **重要说明:** 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 有差距。 # 配置 OpenAI API Key **API Key 获取:** 登录 OpenAI 官网(platform.openai.com)→ API Keys 页面 → Create new secret key,复制后替换下面的 `***`。 ```bash export OPENAI_API_KEY="sk-xxxxxxxxxxxxxxxx" ``` **持久化配置**(重启不丢失,写入 /etc/profile.d/): ```bash echo 'export OPENAI_API_KEY="sk-xxxxxxxxxxxxxxxx"' > /etc/profile.d/openai.sh chmod 644 /etc/profile.d/openai.sh source /etc/profile.d/openai.sh ``` **验证 Key 有效:** ```bash curl https://api.openai.com/v1/models -H "Authorization: Bearer $OPENAI_API_KEY" | head -c 200 ``` # 启动本地网关服务 下面在设备 `/data/chatgpt/` 下部署一个 OpenAI 兼容的本地网关服务。它对外暴露 HTTP 接口,内部转发到 OpenAI API,并支持多轮对话与流式输出。 **目录结构:** ```plaintext /data/chatgpt/ ├── config.env # 配置文件(API Key、模型、端口等) ├── chatgpt_server.py # 网关服务主程序 └── chatgpt.service # systemd 服务单元(后台常驻) ``` **步骤 1:创建目录与配置文件** ```bash mkdir -p /data/chatgpt cat > /data/chatgpt/config.env <<'EOF' # ===== ChatGPT 网关配置 ===== # OpenAI API Key(必填,替换为自己的 Key) export OPENAI_API_KEY="***" # 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:编写网关服务主程序** ```python #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ChatGPT 网关服务:对外暴露 HTTP 接口,转发至 OpenAI API。 提供两种接口: /v1/chat/completions —— OpenAI 兼容接口(可被任意 OpenAI 客户端调用) /ask —— 极简问答接口(GET/POST,便于嵌入式调用) """ import os, json 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(): 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) ``` 保存并赋予执行权限: ```bash chmod +x /data/chatgpt/chatgpt_server.py ``` **步骤 3:配置 systemd 后台服务(开机自启)** ```bash cat > /data/chatgpt/chatgpt.service <<'EOF' [Unit] Description=ChatGPT Gateway Service on Quectel Pi M2 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 ``` **启动与验证:** ```bash # 首次启动前必须配置 API Key:编辑 /data/chatgpt/config.env,填入真实 Key # 启动服务 systemctl start chatgpt.service systemctl status chatgpt.service # 查看日志 tail -f /data/chatgpt/chatgpt.log # 重启 / 停止 systemctl restart chatgpt.service systemctl stop chatgpt.service ``` **手动前台调试**(不经过 systemd): ```bash cd /data/chatgpt source ./config.env python3 ./chatgpt_server.py ``` 启动成功后日志会输出: ```plaintext [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 ``` # 测试 **健康检查:** ```bash curl http://127.0.0.1:8000/health # {"model":"gpt-4o-mini","status":"ok","base_url":"https://api.openai.com/v1"} ``` **极简单轮问答:** ```bash curl -s -X POST http://127.0.0.1:8000/ask \ -H "Content-Type: application/json" \ -d '{"q":"用一句话介绍RK3576芯片"}' | python3 -m json.tool ``` 预期输出: ```plaintext { "answer": "RK3576是瑞芯微推出的高性能AIoT处理器,集成6TOPS NPU,支持边缘智能计算。", "model": "gpt-4o-mini" } ``` **OpenAI 兼容接口(流式):** ```bash curl -N -X POST http://127.0.0.1:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"你好"}],"stream":true}' ``` **嵌入式程序调用示例(C / curl):** 设备上的 C 程序或 shell 脚本可通过 curl 调用: ```bash 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" ``` # 应用场景 - **智能客服终端**:在 Quectel Pi M2 智能网关/POS 设备上提供自然语言问答,处理用户咨询 - **工业现场语音助手**:结合 ASR/TTS,工程师通过语音询问设备故障排查建议 - **代码/脚本生成**:现场运维时让模型生成 shell/Python 脚本片段 # 常见问题 | **问题** | **解决** | | --- | --- | | pip 装包卡死 | 换国内 pip 源(清华/阿里),或离线安装 | | 请求超时 | 确认网络可访问 OpenAI API,检查 API Key | | 网关无法访问 | 确认 flask 监听 0.0.0.0,局域网客户端访问板子 IP:5000**模型过大**ChatGPT 本身无法本地化,但若场景要求完全离线或零 API 成本,可在 M2 上部署开源小模型替代。本设备可运行的最小方案: