
在实际业务里把 Grok4.3 接入 QQ 机器人核心价值不是多了一个聊天窗口而是把模型能力放进用户本来就在使用的群聊和私聊场景里群里的同事可以 机器人查文档、翻译、生成代码个人可以把机器人当成随身助手处理提醒、整理信息、做长文总结。整个过程可以拆成三段独立的链路QQ 机器人框架负责收发消息OneBot 协议负责消息的标准化传输Grok API 负责生成回复。很多教程只把 API 调用代码贴出来却没有讲清楚框架、协议、上下文这三段怎么衔接导致照着抄也跑不通。下面从环境准备开始逐步完成一个可运行的 QQ 机器人再展开讲超长上下文怎么管理、系统提示词怎么调最后给出完整的排查清单。1. Grok4.3 接 QQ 机器人前先看清这条链路1.1 为什么要把大模型接进 QQQQ 是很多人日常沟通的主阵地群聊、私聊、文件、语音都在同一个入口里。如果每次用模型都要打开网页或者命令行那么大部分灵感型需求很难继续看到一段代码想立刻问思路群里有人抛出一个技术问题想马上给答案或者晚上想整理第二天的任务清单。把这些请求统一转发给模型由机器人返回结果用户的习惯成本最低。从开发者的角度看QQ 机器人接入模型后可以做的不只是聊天可以做成群里的技术问答助手可以绑定定时任务做日报提醒也可以接知识库做内部文档检索。这类功能本质上都依赖同一个能力就是“收到消息 - 调用模型 - 发回结果”。所以先把最小链路跑通后面所有扩展都有基础。1.2 OneBot 协议机器人框架和你的代码之间的语言在社区实践中QQ 个人账号的收发消息通常通过中间框架实现例如 NapCat、Lagrange 等。这些框架负责登录 QQ、接收消息、发送消息而你的 Python 程序并不需要直接处理 QQ 的私有协议。框架和你的程序之间需要一个统一的语言这就是 OneBot 协议。OneBot v11 是社区约定的一套 JSON 消息格式它定义了消息事件长什么样也定义了发送消息的接口长什么样。框架把收到的 QQ 消息转成 OneBot 事件推送给你你的程序再通过 WebSocket 或 HTTP 调用 OneBot 接口发送回复。在这套结构里你的代码通常不用关心 QQ 登录、消息上报、发送重试这些复杂问题只需要处理标准化的 JSON。这也是推荐用 Python 这类开发效率高的语言写机器人的原因核心逻辑都在“事件解析、模型调用、结果回发”三个环节上。1.3 Grok API 的调用底座是 OpenAI 兼容接口Grok4.3 是 xAI 推出的 Grok 系列模型中的一个版本。xAI 的开发者平台提供的 Chat Completions 接口与 OpenAI 的接口格式兼容因此可以直接使用 OpenAI 官方 Python SDK只要把base_url指向 xAI 的 API 地址并把api_key换成你在 xAI 平台申请的密钥。这也带来一个好处同一个 bot.py 后期想切换到其他 OpenAI 兼容服务时通常只需要改base_url、api_key和model三个值不需要重写调用逻辑。后面示例代码就是按照这种可切换的写法来组织。需要说明的是Grok 系列模型的具体版本号、上下文窗口长度、价格和可用模型标识会随官方平台调整。落地前要到 xAI 开发者平台或官方文档确认当前账号可用的模型名称不要把教程里的模型字符串当成永远不变的常量。2. 环境准备把三段链路分别跑通2.1 运行环境和依赖清单整篇文章使用 Python 开发机器人运行环境建议如下组件建议要求说明Python3.10 及以上使用 asyncio、原生类型注解openai1.xOpenAI 兼容接口的 Python SDKwebsockets12 及以上连接 OneBot WebSocket 服务QQ 机器人框架NapCat、Lagrange 等 OneBot v11 实现任选一个即可操作系统Windows / Linux 都可以长期运行建议 Linux 或 Docker安装依赖pip install openai websockets安装完成后确认版本python -c import openai, websockets; print(openai.__version__, websockets.__version__)如果输出的版本为1.x和12.x以上环境基本就绪。2.2 申请 API Key 并确认模型名称到 xAI 开发者平台注册账号创建 API Key。创建后要把 Key 复制保存好页面关闭后通常不会再完整展示。Key 的格式一般以xai-开头长度较长复制时要注意不要多出空格也不要只复制一半。拿到 Key 后打开官方 API 文档或控制台的模型列表确认两件事当前账号可用哪个 Grok 模型标识例如grok-4.3或类似的字符串以官方后台为准。该模型的上下文窗口长度以及max_tokens允许设置的上限。这两项后续都要写进代码模型名写错会直接报model not found上下文窗口理解错会导致请求失败。2.3 部署 QQ 机器人框架并开启 WebSocketQQ 机器人框架的选择很多本文以支持 OneBot v11 的框架为例不指定具体品牌。一般流程如下下载框架的可执行文件或 Docker 镜像按框架文档完成安装。使用一个小号或允许机器人的 QQ 账号登录框架会显示登录二维码。登录成功后在框架的配置页里找到“网络配置”开启WebSocket 服务端端口可以设置为3001并记录是否设置了access_token。把机器人账号拉进要测试的群或者先准备一个自己的小号用于私聊测试。启动框架后正常情况下框架控制台会显示 WebSocket 服务已监听在某个端口。此时先不要写任何业务代码直接跳过一个验证步骤。2.4 先用一段命令确认 WebSocket 服务可达为了确认框架确实在监听可以用 Python 写一个最简单的连接测试import asyncio import websockets async def check(): uri ws://127.0.0.1:3001 async with websockets.connect(uri) as ws: print(connect ok) msg await ws.recv() print(msg) asyncio.run(check())运行后如果打印connect ok说明框架的 WebSocket 服务地址和端口正确。如果立刻抛ConnectionRefusedError说明框架没启动、端口写错或者监听地址不是本机。如果连接上了但没有输出先不用慌正常情况框架只有收到消息事件后才会推送数据你可以先用另一个 QQ 号给机器人发一条消息再看这里是否出现 JSON 事件。这一步非常有价值。后面所有排查都可以回到这里如果连接测试都不通那问题一定在框架侧和模型代码无关。注意如果连接测试失败不要继续往下写业务代码。框架连不通时后面所有排查都会变得困难。3. 最小可运行的 QQ 机器人代码3.1 项目文件结构用一个单独目录存放机器人代码结构保持简单qq-grok-bot/ ├── bot.py ├── .env # API Key 等敏感配置不要提交到仓库 └── requirements.txtrequirements.txt内容openai1.0.0 websockets12.0 python-dotenv1.0.0bot.py是唯一的主文件文章示例为了便于理解把配置写进配置区。实际项目建议用.env和python-dotenv加载环境变量这个在第 7 章展开。3.2 连接 OneBot WebSocket 并解析消息OneBot v11 的消息事件是一个 JSON 对象常见的群消息结构如下{ post_type: message, message_type: group, group_id: 123456, user_id: 789012, raw_message: [CQ:at,qq10001] 你好, message: [ { type: at, data: { qq: 10001 } }, { type: text, data: { text: 你好 } } ], self_id: 10001 }私聊消息的message_type是private没有group_id但有user_id。raw_message是简化后的消息文本message是分段结构。对于普通文本示例直接读取raw_message就够用。连接部分的核心代码import asyncio import json import websockets WS_URL ws://127.0.0.1:3001 async def main(): async with websockets.connect(WS_URL) as ws: print([bot] connected) async for raw_text in ws: event json.loads(raw_text) print(event) asyncio.run(main())这段代码只做一件事连接 WebSocket把收到的每条 JSON 打印出来。先跑通它再用真实消息验证事件字段。3.3 调用 Grok API 生成回复先用同步客户端做一次最小验证确认 Key 和模型名都正确再进入完整机器人代码from openai import OpenAI client OpenAI( api_keyxai-你的key, base_urlhttps://api.x.ai/v1 ) resp client.chat.completions.create( modelgrok-4.3, # 以官方后台实际模型名称为准 messages[ {role: system, content: 你是一个QQ机器人助手。}, {role: user, content: 用一句话介绍你自己} ], temperature0.7, max_tokens800 ) print(resp.choices[0].message.content)这里messages是对话的核心方式system角色用来设置整体行为和性格user是用户输入assistant是模型历史回复。每增加一轮对话就要把对应的user和assistant内容都追加进去模型才能知道上下文。3.4 群聊 识别、私聊直答和回发消息完整的机器人逻辑需要做到群聊里只有机器人被或者消息以/ai开头才回复避免刷屏。私聊里所有普通消息都回复。回复时区分send_group_msg和send_private_msg。下面给出一个可运行的最小版本包含配置区、历史记录、发送消息和主循环import asyncio import json from collections import defaultdict, deque import websockets from openai import AsyncOpenAI # 配置区 WS_URL ws://127.0.0.1:3001 BOT_QQ_ID 10001 # 机器人 QQ 号 API_KEY xai-你的key BASE_URL https://api.x.ai/v1 MODEL grok-4.3 # 以官方后台为准 MAX_HISTORY_TURNS 10 # 每个会话最多保留几轮对话 # SYSTEM_PROMPT 你不是一个冷冰冰的接口而是QQ群里的一员。 回复要求 1. 先给结论再解释原因。 2. 普通问题不超过200字。 3. 编程问题给出可运行示例。 4. 不确定的事情明确说明不编造。 5. 不使用Emoji。 6. 不参与违法违规话题。 client AsyncOpenAI(api_keyAPI_KEY, base_urlBASE_URL) history defaultdict(deque) def build_messages(session_id: str, user_msg: str): messages [{role: system, content: SYSTEM_PROMPT}] for turn in history[session_id]: messages.append({role: user, content: turn[user]}) messages.append({role: assistant, content: turn[assistant]}) messages.append({role: user, content: user_msg}) return messages async def call_grok(session_id: str, user_msg: str) - str: messages build_messages(session_id, user_msg) try: resp await client.chat.completions.create( modelMODEL, messagesmessages, temperature0.7, max_tokens800, ) reply resp.choices[0].message.content except Exception as exc: reply f模型调用失败{exc} history[session_id].append({user: user_msg, assistant: reply}) while len(history[session_id]) MAX_HISTORY_TURNS: history[session_id].popleft() return reply async def send_message(ws, message_type: str, target_id: int, content: str): if message_type group: action send_group_msg params {group_id: target_id} else: action send_private_msg params {user_id: target_id} params[message] content payload {action: action, params: params, echo: send_reply} await ws.send(json.dumps(payload, ensure_asciiFalse)) async def handle_event(ws, event: dict): if event.get(post_type) ! message: return msg_type event.get(message_type) raw event.get(raw_message, ).strip() user_id event.get(user_id) group_id event.get(group_id) if msg_type group: at_me f[CQ:at,qq{BOT_QQ_ID}] if at_me not in raw and not raw.startswith(/ai): return raw raw.replace(at_me, ).replace(/ai, ).strip() session_id fgroup_{group_id} target_id group_id else: if raw : return session_id fprivate_{user_id} target_id user_id if not raw: return reply await call_grok(session_id, raw) await send_message(ws, msg_type, target_id, reply) tasks set() async def main(): while True: try: async with websockets.connect(WS_URL) as ws: print([bot] connected to, WS_URL) async for raw_text in ws: try: event json.loads(raw_text) except json.JSONDecodeError: continue task asyncio.create_task(handle_event(ws, event)) tasks.add(task) task.add_done_callback(tasks.discard) except Exception as exc: print([bot] connection error:, exc) await asyncio.sleep(3) if __name__ __main__: asyncio.run(main())把配置区里的BOT_QQ_ID、API_KEY、MODEL替换成自己的值然后运行python bot.py看到[bot] connected to ws://127.0.0.1:3001后用另一个 QQ 号给机器人发一条你好正常情况下会收到模型回复。3.5 断线重连和并发任务管理上面代码里有两个容易被忽略的细节。第一是断线重连。main()里的while True包裹了连接和事件循环任何一次连接异常都会退出内层async with然后等待 3 秒重新连接。网上很多教程只写一次connect框架一重启机器人就彻底死了所以重连是长期运行机器人必须要有的基础能力。第二是并发任务。handle_event内部有await call_grok和await ws.send如果串行处理群里同时来两条消息时第二条会被阻塞。代码用asyncio.create_task把每个事件放进独立任务并用tasks集合持有任务引用避免任务被垃圾回收。这里是示例级别高并发场景还需要加发送锁或发送队列避免对同一个 WebSocket 并发写入这个在第 7 章再说明。4. 超长上下文和“调教内容”的核心配置4.1 超长上下文不是让你每轮都塞满历史Grok 系列模型以超长上下文作为卖点之一意思是单次请求可以携带很多历史内容理论上可以放一个很长的系统提示词也可以追很多轮对话。但“支持长上下文”不等于“应该每轮都发全部内容”有三个现实因素必须考虑。第一是成本。API 按 token 计费输入里有很大一部分是重复的历史每问一轮都要把之前所有对话重新计算一遍上下文越长单次成本越高。第二是延迟。输入 token 越多首字返回时间通常越慢。在一个活跃群里用户不会愿意等十秒才看到回复。第三是噪音。QQ 群里有很多无关消息如果全量塞进上下文模型会被无关内容干扰反而记不住关键信息。所以实际策略是每个会话保存最近 N 轮对话超出的部分丢弃关键背景信息放进系统提示词更复杂的长期记忆用“会话总结”压缩而不是无限保留原文。4.2 系统提示词把“调教内容”结构化“调教内容”在 QQ 机器人场景里本质上就是系统提示词和示例组合。你可以让人设说得非常具体模型行为才会稳定。下面这个模板可以作为起点你是运行在QQ群里的智能助手名字叫小G。 # 人设 - 说话简洁、稳重偶尔可以幽默但不油腻。 - 你把自己当成群里的一员不是客服。 # 回复规则 - 先给结论再解释。 - 普通问题不超过200字。 - 编程问题给出代码示例并标注关键点。 - 不知道的事情明确说不知道不能编造版本、价格和事实。 - 不使用Emoji不用客套话开头。 # 禁止话题 - 不参与政治、色情、暴力、赌博等违规话题。 - 不输出任何违法或绕过安全限制的操作教程。 # 示例 用户你是谁 助手我是这个群的AI助手负责回答技术问题、整理信息和写简单代码。写系统提示词时有几个要点用“不能做什么”来约束边界模型对禁止项的执行比空泛要求更可靠。用示例告诉模型期望的回答格式比反复描述“要简洁”更有效。人设要围绕使用场景写。群助手和客服的回复风格应该完全不同不要套用同一个 prompt。注意系统提示词不要写成一句“你要当个好助手”要用具体规则、禁止项和示例组合模型行为才会稳定。4.3 会话历史的保存、裁剪和清理代码里使用defaultdict(deque)保存会话历史key 是group_群号或private_QQ号。这样每个群、每个人都有自己的上下文互不串线。裁剪逻辑有两层保留轮数限制MAX_HISTORY_TURNS 10只保留最近 10 轮。清理空会话长时间没人说话时deque 会一直占内存。生产环境可以加一个“最后活跃时间”字段超过 30 分钟没活跃的会话直接从字典里删除。另外要提供一个清理指令。用户说的是敏感内容或不想被继续记住时机器人应当能重置会话例如收到/clear时清空对应会话历史并回复“已清空上下文”。4.4 关键参数速查与调整建议参数作用常用值调大效果调小效果temperature控制随机性0.7更有创造力也更容易跑题更稳定回答更保守max_tokens单次回复长度上限800能输出更长回答费用增加回复可能被截断top_p采样候选范围1.0词汇更丰富词汇更集中上下文保留轮数每次请求携带历史轮数10模型更了解上下文费用和延迟上升模型容易忘记之前聊的内容参数应该如何调整完全取决于场景。做创意文案可以把temperature调高到 0.9做技术问答和代码生成建议保持在 0.3 到 0.7 之间减少幻觉和乱写代码的可能。max_tokens设置太低会导致长答案被截断太高又可能让模型凑字数群聊场景 500 到 800 是比较合理的区间。5. 运行验证从私聊到群聊一条条测5.1 私聊测试机器人启动后先用私聊验证最小链路。给机器人依次发送这几条消息你好确认能返回回复。用 Python 写一个读取文件并统计行数的函数确认能返回代码。你是什么模型确认系统提示词里的人设生效。如果第三条返回的不是默认模型介绍而是别的奇怪内容说明SYSTEM_PROMPT里的示例和禁止项没有覆盖到需要调整提示词。私聊测试通过后再进入群聊。5.2 群聊 测试把机器人拉进测试群然后在群里发机器人 介绍一下你自己预期结果机器人返回系统提示词里定义的人设介绍。如果机器人没有反应优先检查BOT_QQ_ID是否填成了自己的 QQ 号而不是机器人 QQ 号。事件里的raw_message是否包含[CQ:at,qq...]片段。框架是否真的把消息推送到了 WebSocket。再测试群聊前缀模式发/ai 用一句话解释什么是HTTP正常情况也会收到回复。前缀模式适合不想每次 机器人的场景但要设置好触发词避免群里普通聊天频繁触发。5.3 多轮上下文测试上下文是否生效用两轮对话验证对机器人说记住我的名字叫张三我在学Docker。再问我叫什么我在学什么如果回答包含张三和Docker说明会话历史被正确保存并传给了模型。如果回答完全没记住排查顺序是build_messages里是否把history[session_id]中的内容拼进去了。session_id在两次消息中是否一致。私聊用的是private_用户QQ号群聊用的是group_群号如果混用就会互相串或丢上下文。是否在发送第一条消息时服务就中断了导致历史没有写入。还要测试/clear指令如果实现了发完/clear后再问我叫什么模型应该回答不知道。注意多轮上下文的验证要用同一个会话私聊测试就用同一个 QQ 号发连续消息不要换号。5.4 验证清单验证项操作预期结果WebSocket 连通运行连接测试脚本打印 connect ok私聊回复给机器人发你好收到模型回复群聊 回复群里 机器人提问只响应 不刷屏前缀模式发/ai 问题收到回复上下文记忆先报名字再问名字模型能回答出来人设生效问“你是谁”回复符合系统提示词错误提示故意传错MODEL收到友好错误说明而非崩溃6. 常见问题排查6.1 机器人收不到消息现象框架已启动机器人也登录了但给机器人发消息没有任何反应。排查按这个顺序走确认框架的 WebSocket 服务真的在运行。用第 2.4 节的连接测试脚本验证连接失败就回去查框架配置。确认事件里post_type是message。有些消息是notice类型代码里过滤掉了。确认群聊事件里raw_message确实带有 标签。有的框架版本需要配置“消息上报格式”或“CQ 码兼容”如果没有 CQ 码at_me判断永远为假。确认机器人没有被群禁言也没有被设置为“无法被 ”。看机器人终端有没有打印事件。如果终端连 JSON 都没输出问题一定在框架到 WebSocket 这一段。6.2 模型调用报错现象机器人收到消息但回复“模型调用失败”后面跟着一段异常。常见的异常和原因异常信息原因处理401 Invalid API keyAPI Key 错误或已失效检查API_KEY是否完整、过期404 model not found模型名称不对到官方控制台确认模型标识429 rate limit触发了并发或频率限制做退避重试降低 QPSinsufficient_quota账号余额不足到平台查看用量和余额APIConnectionError网络无法到达 API检查服务器出网策略、代理设置特别说明一下429。群聊机器人很容易出现这个问题几个人同时 代码用asyncio.create_task并发调用瞬间发出多个请求直接被限流。稳妥做法是加一个asyncio.Semaphore(3)把并发数压到 3 以下并对429做指数退避重试。6.3 消息重复、串线或回复失败现象一机器人把一条消息回了两次。常见原因是同一个机器人账号被两个 WebSocket 客户端连接了或者启动了多个bot.py进程。检查进程列表只保留一个连接。现象二A 群的问题在 B 群里回复。常见原因是session_id拼错了。群聊应该用group_群号私聊用private_QQ号不要共用同一个 key。现象三代码没有报错但群里收不到回复。先看send_message是否被调用再看框架控制台有没有发送日志。常见原因是机器人被禁言或 QQ 号本身触发了发送限制导致消息被吞。6.4 上下文溢出现象对话进行十几轮后请求开始报400 context length exceeded或类似错误。原因虽然模型支持超长上下文但messages里总 token 数超过了单次请求限制或者超过了账号套餐的上限。处理方案降低MAX_HISTORY_TURNS比如从 10 降到 5。在追加历史前估算 token粗略按中文字符 1 字约等于 1 到 2 token 计算超过阈值就不携带更早的历史。对长对话执行“总结式压缩”把前面的历史交给模型总结成一段摘要之后只携带摘要加最近几轮原文。6.5 错误码与排查链路速查表现象第一检查点第二检查点最终处理连接失败框架 WebSocket 是否监听端口、地址是否正确重启框架检查防火墙收不到消息终端是否打印 JSON触发词和 判断是否正确修正BOT_QQ_ID、CQ 码处理API 401API Key 是否完整Key 是否过期重新生成 KeyAPI 429是否并发过高是否超过套餐配额加限流和退避回复串线session_id是否唯一是否多进程检查 key 拼写只保留单进程上下文超限MAX_HISTORY_TURNS是否过大单条消息是否过长裁剪、总结、清理会话7. 生产环境部署建议7.1 配置外置化与密钥管理示例代码把 API Key 直接写在文件里适合本地学习不适合部署。生产环境至少做到使用环境变量或.env文件保存API_KEY、WS_URL、MODEL、BOT_QQ_ID。.env必须加入.gitignore不允许提交到代码仓库。如果服务器有密钥管理服务优先使用密钥管理服务注入环境变量不要把密钥放在启动脚本里。定期轮换 API Key发现泄密立刻到平台撤销并重建。使用python-dotenv的示例import os from dotenv import load_dotenv load_dotenv() API_KEY os.getenv(XAI_API_KEY) MODEL os.getenv(GROK_MODEL, grok-4.3) WS_URL os.getenv(ONEBOX_WS_URL, ws://127.0.0.1:3001)注意.env文件的读取速度、格式错误、编码问题都会影响启动部署前先写一个启动自检打印配置是否加载成功但不打印密钥内容。7.2 日志、限流和并发控制机器人在群里长跑日志是唯一可靠的排错依据。建议做到每个事件都打日志收到什么事件、发给哪个群、模型返回了什么、错误是什么。日志输出到文件并做按天滚动避免单文件无限增长。记录每次调用的 token 消耗、耗时和错误类型便于后续统计成本。并发控制方面给模型调用加信号量semaphore asyncio.Semaphore(3) async def safe_call_grok(session_id: str, user_msg: str) - str: async with semaphore: return await call_grok(session_id, user_msg)这样即使群里同时来了 20 条消息同一时刻最多只有 3 个请求在调用模型从源头降低429概率。7.3 多群隔离与权限控制机器人进了多个群以后要考虑权限群聊是否允许所有成员使用还是只允许管理员触发。是否限制单个用户每分钟的调用次数防止有人拿机器人刷 token。是否允许私聊使用。如果只服务群聊私聊事件直接忽略。权限控制的实现并不复杂维护一个允许群列表和允许用户列表在handle_event开头过滤即可。调用频率可以按user_id记录时间戳超过阈值返回“请求太频繁”。7.4 上线前检查清单检查项要求密钥API Key 已放入.env未写入代码模型名称已确认官方后台可用的模型标识日志已配置文件日志和按天滚动异常兜底模型调用异常时返回友好提示程序不崩溃限流已加并发信号量处理 429会话清理空闲会话会被删除防止内存增长权限已配置允许群/允许用户重启策略已确认断线重连逻辑进程由 supervisor 或 systemd 守护成本监控已记录 token 用量设置每日告警8. 扩展方向与常见坑复盘8.1 还能加什么功能最小链路跑通后往哪个方向扩展取决于你的使用场景。知识库问答把内部文档向量化在调用模型前先检索相关片段再拼进上下文。这是 RAG 的入门路线。定时任务用asyncio的定时器或者独立调度服务让机器人每天早上推送日报、天气或待办事项。工具调用如果 Grok API 支持 function calling可以让模型在需要时调用查询接口再基于返回结果回答。多模型切换因为代码用的是 OpenAI 兼容接口只要把base_url和model改成其他兼容服务就能快速换成 DeepSeek、Qwen 等模型适合做效果对比。值得提醒的是不要一上来就同时加很多功能。机器人在群里一旦不稳定影响的是所有群成员的体验。先保持一个小而稳的核心再按需求逐步扩展。8.2 常见坑汇总表坑点错误表现原因正确做法模型名写错404 model not found照抄教程没看官方后台以官方控制台模型列表为准 判断失败群里 没反应BOT_QQ_ID填错或 CQ 码不兼容打印事件确认raw_message内容历史无限增长内存上涨、请求超限deque 没有限制长度设置MAX_HISTORY_TURNS并定期清理并发调用被限流429 报错多条消息同时调用 API加Semaphore和退避重试私聊群聊串线回答内容张冠李戴session_id共用用group_群号、private_QQ号区分只连接一次框架重启后机器人失效没有重连逻辑while True包裹连接并 sleep 重试Key 写死在代码代码泄露后 Key 被滥用直接硬编码使用.env和密钥管理8.3 下一步怎么进阶如果这篇教程里的每一个验证项都通过了下一步可以按顺序做三件事。第一把代码拆成模块。配置、模型客户端、消息处理、会话管理分成独立文件后续加功能时不会越改越乱。第二认真读一遍 OneBot v11 文档。现在只用到了message事件和send_group_msg、send_private_msg协议里还有撤回、禁言、群管、图片等能力这些是扩展功能的底层接口。第三自己设计一个完整的人设并跑上半个月。调教内容不是一次性写好的要通过真实对话不断修正。群里出现的错误回答、无用回复都要记录到日志里每周根据日志调整系统提示词和参数。这个过程比代码本身更接近“把模型真正用起来”。