三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

基于OpenClaw与go-cqhttp构建智能QQ机器人:从大模型集成到实战部署

基于OpenClaw与go-cqhttp构建智能QQ机器人:从大模型集成到实战部署

1. 项目概述:为什么选择OpenClaw来构建QQ机器人?

最近在折腾智能机器人,想给QQ群或者个人聊天增加点“智慧”的乐趣,发现OpenClaw这个框架挺有意思。它不是一个现成的QQ机器人,而是一个开源的“具身智能机器人”架构。简单来说,它提供了一个框架,让你可以像搭积木一样,把大语言模型(比如Llama、GPT)、各种工具(比如搜索、计算)和具体的“身体”(比如QQ这个聊天界面)连接起来,构建一个能理解、能思考、能执行任务的智能体。

你可能会问,市面上不是有现成的QQ机器人框架吗,比如go-cqhttp搭配各种插件?没错,但那些更多是“脚本”或“响应式”机器人,逻辑相对固定。而基于OpenClaw的方案,核心是引入了大语言模型作为机器人的“大脑”。这让机器人不再只是机械地匹配关键词回复,而是能真正理解聊天的上下文、意图,甚至进行多轮复杂的对话和任务规划。比如,你可以在群里说“帮我查一下明天北京的天气,然后总结成一句话告诉我”,传统的机器人可能需要你分两步触发不同的指令,而基于OpenClaw的智能体可以理解这个复合指令,自动调用天气查询工具,再让大模型总结输出。

这个项目的核心价值就在于此:将前沿的大模型能力,通过OpenClaw这个灵活的中枢,接入到我们最熟悉的QQ社交场景中。它适合有一定动手能力、对AI应用开发感兴趣的朋友,无论是想做个聪明的群管助手、个人知识问答伴侣,还是作为一个探索AI智能体落地的技术实践,都很有搞头。接下来,我就把自己从零搭建这套系统的完整过程、踩过的坑和最终跑通的方案,详细拆解一遍。

2. 核心架构与工具选型解析

在动手之前,得先把整个系统的蓝图和需要的“零件”搞清楚。基于OpenClaw构建QQ机器人,本质上是一个三层架构的集成项目。

2.1 系统架构总览

整个系统可以划分为三个核心层次:

  1. 交互层(前端/协议层):负责与QQ服务器通信,接收和发送消息。这是机器人的“手”和“耳朵”。我们选择go-cqhttp作为协议实现。它是一个功能强大、社区活跃的QQ机器人框架,稳定地处理QQ的复杂协议,将消息事件转换成标准的WebSocket或HTTP回调,供上层处理。
  2. 智能中枢层(大脑层):这是核心,即OpenClaw框架。它负责调度整个智能体的工作流。其核心组件包括:
    • 大语言模型(LLM):提供理解和生成能力。我们可以选择本地部署的模型(如通过Ollama运行的Llama 3、Qwen等)或调用云端API(如OpenAI GPT、DeepSeek)。
    • 技能(Skills):OpenClaw将各种功能封装成“技能”。例如,一个“网络搜索”技能、一个“计算器”技能。机器人可以通过规划,自动调用合适的技能来完成任务。
    • 规划器(Planner)与记忆(Memory):规划器根据目标和大模型的推理,决定调用哪个技能以及调用的顺序。记忆模块则保存对话历史,让机器人拥有上下文感知能力。
  3. 连接与执行层(胶水层):这一层负责将go-cqhttp的事件“翻译”成OpenClaw能理解的任务,并将OpenClaw的回复“翻译”成go-cqhttp能发送的消息。通常我们需要自己编写一个中间件服务(比如用Python的FastAPI或Flask)来桥接两者。

工具选型清单与考量

  • OpenClaw:选择它的原因在于其设计理念清晰,专注于智能体(Agent)的编排,社区更新较快,且与Ollama等本地模型方案集成较好。相比一些更庞大的框架,它更轻量、更聚焦于“大脑”的逻辑。
  • go-cqhttp:几乎是QQ机器人领域的标准协议客户端,文档齐全,支持多种通信方式(正向WebSocket、HTTP回调等),稳定性经过大量项目验证。
  • 大模型服务
    • 本地方案(推荐用于学习和初试)Ollama。它极大简化了本地大模型的下载、运行和管理。一条命令就能跑起一个模型,非常适合快速原型验证。
    • 云端方案(追求效果和稳定性)OpenAI APIDeepSeek API智谱AI等。效果通常更好,响应快,但会产生持续的费用。
  • 中间件Python + FastAPI。Python生态对AI应用支持最好,FastAPI性能高,异步支持好,适合处理并发的聊天请求。我们将用它来接收go-cqhttp的HTTP回调,然后调用OpenClaw处理,最后返回回复。

注意:整个部署环境推荐使用Linux系统(如Ubuntu 20.04/22.04)Docker。Windows下部署会涉及更多环境配置问题,尤其是Ollama和某些Python依赖。如果必须在Windows上开发,建议使用WSL2(Windows Subsystem for Linux)。

2.2 环境准备与基础安装

假设我们在一个干净的Ubuntu 22.04服务器或开发机上开始。首先解决基础依赖。

系统更新与Python环境

sudo apt update && sudo apt upgrade -y sudo apt install -y python3-pip python3-venv curl git

创建一个独立的Python虚拟环境是好习惯,能避免包版本冲突。

mkdir ~/qq_openclaw_bot && cd ~/qq_openclaw_bot python3 -m venv venv source venv/bin/activate

激活虚拟环境后,命令行提示符前通常会出现(venv)字样。

安装Ollama(本地模型方案): Ollama的安装极其简单。

curl -fsSL https://ollama.com/install.sh | sh

安装完成后,启动Ollama服务,并拉取一个适合的中文模型。例如,7B参数量的模型对硬件要求相对友好。

ollama pull qwen2.5:7b-instruct # 或者 llama3.2:3b-instruct 更轻量

你可以使用ollama list查看已下载的模型。运行ollama run qwen2.5:7b-instruct可以进入交互式命令行测试模型是否正常工作。

3. OpenClaw的部署与核心配置

这是项目的“大脑”安装环节。OpenClaw的安装方式有多种,这里我们采用从源码安装,以便更好地理解和定制。

3.1 获取与安装OpenClaw

# 确保在虚拟环境中 cd ~/qq_openclaw_bot git clone https://github.com/openclaw-ai/OpenClaw.git cd OpenClaw pip install -e . # 使用可编辑模式安装,方便修改代码

安装过程会拉取一堆依赖,耐心等待。如果遇到某些包编译错误,可能需要安装系统级的开发工具:

sudo apt install -y build-essential

3.2 初步配置与模型连接

OpenClaw的核心配置通过一个YAML文件(通常是config.yamlconfigs/目录下的文件)来定义。我们需要创建一个基础配置来连接Ollama。

在OpenClaw项目根目录下,创建一个my_config.yaml

# my_config.yaml model: provider: "ollama" # 指定使用Ollama model: "qwen2.5:7b-instruct" # 与Ollama中拉取的模型名一致 base_url: "http://localhost:11434" # Ollama默认API地址 skills: # 这里可以定义启用的技能,初始可以留空或使用内置基础技能 - name: "conversation" - name: "web_search" config: api_key: "YOUR_SEARCH_API_KEY" # 如需搜索功能,需申请如Serper、SearXNG的API planner: type: "zero_shot" # 使用零样本规划器,简单直接 memory: type: "buffer" # 使用对话缓冲记忆 window_size: 10 # 记住最近10轮对话

这个配置告诉OpenClaw:你的大脑是运行在本地11434端口的Qwen模型,你目前拥有对话和网络搜索(需配置API)两种技能,使用零样本规划器,并保留最近10条对话记忆。

测试配置是否生效。我们可以写一个简单的Python脚本来测试:

# test_openclaw.py from openclaw import OpenClaw import asyncio async def test(): claw = OpenClaw(config_path="./my_config.yaml") await claw.initialize() # 异步初始化 response = await claw.run("你好,请介绍一下你自己。") print("AI回复:", response) if __name__ == "__main__": asyncio.run(test())

运行python test_openclaw.py。如果看到模型生成的自我介绍,说明OpenClaw和Ollama的连接成功了。

实操心得一:模型选择与响应速度在本地部署时,模型的大小直接决定了响应速度和硬件需求。qwen2.5:7b-instruct在16GB内存的机器上可以流畅运行,但首次加载或复杂推理时可能会有几秒到十几秒的延迟。如果追求更快的交互体验(比如希望QQ机器人秒回),可以考虑3B参数量的模型,或者使用量化版本(如qwen2.5:7b-instruct-q4_K_M)。量化模型能显著减少内存占用并提升推理速度,但可能会轻微损失一些模型能力。对于聊天机器人场景,q4或q5的量化通常是精度和速度的很好平衡。

4. 桥接服务:连接go-cqhttp与OpenClaw

现在“大脑”有了,我们需要为它接上QQ这个“身体”。这需要一个中间服务来转换协议。

4.1 部署与配置go-cqhttp

首先下载go-cqhttp的发行版。访问其GitHub仓库,下载对应系统的最新版本。以Linux amd64为例:

cd ~/qq_openclaw_bot wget https://github.com/Mrs4s/go-cqhttp/releases/download/v1.2.0/go-cqhttp_linux_amd64.tar.gz tar -zxvf go-cqhttp_linux_amd64.tar.gz cd go-cqhttp_linux_amd64 chmod +x go-cqhttp

首次运行会生成配置文件config.yml

./go-cqhttp

当提示选择通信方式时,输入0回车(HTTP通信),然后程序会退出。接下来编辑生成的config.yml文件。

关键配置修改

# config.yml account: uin: 123456789 # 你的机器人QQ号 password: "" # 密码,不推荐使用。建议使用扫码登录,此处留空。 message: post-format: "array" # 推荐使用数组格式,信息更丰富 servers: - http: host: 0.0.0.0 port: 5700 # HTTP API服务端口 secret: "" # 访问密钥,建议设置一个复杂的字符串 post: - url: "http://127.0.0.1:8000/cqhttp/event" # 重点:事件上报地址,指向我们的中间件 secret: "" # 如果上面设置了secret,这里也要填一样的

这里最重要的是post下的url,它告诉go-cqhttp,所有收到的事件(消息、通知等)都上报到我们即将编写的中间件服务的/cqhttp/event这个接口。

配置好后,再次运行./go-cqhttp,程序会提示扫码登录。用你的机器人QQ号扫码授权即可。登录成功后,go-cqhttp会常驻运行,监听5700端口提供API,并向http://127.0.0.1:8000/cqhttp/event上报事件。

4.2 编写Python中间件服务

我们的中间件需要做三件事:1. 接收go-cqhttp的事件;2. 过滤出需要处理的私聊/群聊消息;3. 调用OpenClaw处理消息并生成回复;4. 调用go-cqhttp的API发送回复。

安装必要的Python库:

cd ~/qq_openclaw_bot source venv/bin/activate # 确保在虚拟环境 pip install fastapi uvicorn httpx python-multipart

创建服务文件bridge_server.py

# bridge_server.py from fastapi import FastAPI, Request, HTTPException from pydantic import BaseModel import httpx import asyncio import logging from openclaw import OpenClaw from typing import Optional # 配置日志 logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) app = FastAPI() # 配置参数(实际应用中可放入环境变量) GO_CQHTTP_API_URL = "http://127.0.0.1:5700" # go-cqhttp的API地址 OPENCLAW_CONFIG_PATH = "/home/your_user/qq_openclaw_bot/OpenClaw/my_config.yaml" # 全局OpenClaw实例 claw_instance: Optional[OpenClaw] = None class CQEvent(BaseModel): post_type: str message_type: str sub_type: str message_id: int user_id: int message: str raw_message: str font: int sender: dict group_id: Optional[int] = None # 如果是群消息,则有此字段 # 其他字段根据需要添加 @app.on_event("startup") async def startup_event(): """启动时初始化OpenClaw""" global claw_instance logger.info("正在初始化OpenClaw...") try: claw_instance = OpenClaw(config_path=OPENCLAW_CONFIG_PATH) await claw_instance.initialize() logger.info("OpenClaw初始化成功!") except Exception as e: logger.error(f"OpenClaw初始化失败: {e}") raise @app.post("/cqhttp/event") async def handle_event(event: CQEvent): """处理go-cqhttp上报的事件""" # 1. 过滤消息:只处理私聊和群聊中的文本消息 if event.post_type != "message": return {"status": "ignored"} # 这里可以添加更复杂的过滤逻辑,比如@机器人才回复 # 简单示例:回复所有私聊,以及群聊中@了机器人的消息 reply_msg = None target_id = event.user_id message_to_process = event.raw_message if event.message_type == "private": # 私聊直接处理 pass elif event.message_type == "group": target_id = event.group_id # 简单判断是否包含@机器人(这里假设机器人QQ是123456789) # 实际应从event.message中解析CQ码,这里做简单字符串匹配示例 if f"[CQ:at,qq=123456789]" not in event.message: return {"status": "ignored, not @me"} # 移除@信息,只保留纯文本内容 message_to_process = event.raw_message.replace(f"@机器人QQ昵称 ", "").strip() else: return {"status": "ignored"} # 2. 调用OpenClaw处理消息 if not claw_instance: return {"status": "error", "reason": "OpenClaw not initialized"} try: logger.info(f"处理消息: {message_to_process[:50]}...") # 这里可以构建更复杂的提示词,比如加入上下文 openclaw_response = await claw_instance.run(message_to_process) reply_msg = openclaw_response logger.info(f"OpenClaw回复: {reply_msg[:50]}...") except Exception as e: logger.error(f"OpenClaw处理出错: {e}") reply_msg = "大脑暂时短路了,请稍后再试~" # 3. 调用go-cqhttp API发送回复 if reply_msg: await send_message(event.message_type, target_id, reply_msg) return {"status": "ok"} async def send_message(message_type: str, target_id: int, message: str): """调用go-cqhttp发送消息API""" async with httpx.AsyncClient() as client: if message_type == "private": api_path = "/send_private_msg" params = {"user_id": target_id, "message": message} else: # group api_path = "/send_group_msg" params = {"group_id": target_id, "message": message} try: resp = await client.post(f"{GO_CQHTTP_API_URL}{api_path}", params=params, timeout=10.0) resp.raise_for_status() logger.info(f"消息发送成功至 {target_id}") except httpx.RequestError as e: logger.error(f"发送消息请求失败: {e}") except httpx.HTTPStatusError as e: logger.error(f"发送消息HTTP错误: {e.response.status_code}") if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000)

这个服务做了几件关键事:

  1. 启动时加载OpenClaw配置并初始化。
  2. 提供了一个/cqhttp/event接口接收事件。
  3. handle_event函数中,过滤出需要处理的私聊/群聊@消息。
  4. 将纯文本消息传递给OpenClaw实例处理。
  5. 通过HTTP请求调用go-cqhttp的API发送回复。

实操心得二:消息过滤与触发机制在实际群聊中,如果不加过滤,机器人会对每一条消息都进行响应,这会导致刷屏和API滥用。上述代码展示了一个简单的@触发机制。更高级的过滤可以包括:

  • 命令前缀:只处理以特定符号(如/!机器人)开头的消息。
  • 频率限制:为每个用户或群设置冷却时间,防止恶意刷屏。
  • 上下文管理:在调用claw_instance.run()时,可以将之前的对话历史(从记忆模块或自己维护的缓存中读取)作为上下文传入,使对话更连贯。OpenClaw的Memory模块可以帮我们管理这部分,但需要我们在中间件中正确地保存和提取每个会话(私聊或群聊)的标识符。

5. 系统集成、运行与效果验证

现在所有部件都已就位,让我们把它们串联起来,并处理一些集成中的细节问题。

5.1 启动全链路服务

我们需要按顺序启动三个服务,建议使用tmuxscreen来管理多个终端会话。

  1. 会话一:启动Ollama服务(如果未作为守护进程运行)

    ollama serve

    通常Ollama安装后会自动注册为系统服务,可以用systemctl status ollama检查。如果已在运行,则无需此步。

  2. 会话二:启动go-cqhttp

    cd ~/qq_openclaw_bot/go-cqhttp_linux_amd64 ./go-cqhttp

    确保登录成功,并看到日志显示HTTP服务器启动在5700端口。

  3. 会话三:启动我们的桥接中间件

    cd ~/qq_openclaw_bot source venv/bin/activate python bridge_server.py

    看到“OpenClaw初始化成功!”和“Uvicorn running on http://0.0.0.0:8000”的日志,说明服务启动成功。

5.2 基础功能测试与优化

现在,用你的个人QQ号给机器人QQ号发一条私聊消息,或者在添加了机器人的群里@它并说话。观察各个服务的日志。

  • go-cqhttp日志:应该能看到收到消息和上报事件的记录。
  • 桥接服务日志:应该能看到“处理消息:...”和“OpenClaw回复:...”的记录。
  • 最终,你的QQ应该能收到机器人的回复。

首次回复慢的问题:第一次触发时,回复可能会非常慢(几十秒)。这主要是因为Ollama中的模型如果未加载,需要时间加载到内存;同时OpenClaw和模型也需要进行初始化预热。预热之后,后续的对话响应会快很多(在7B模型上,简单对话通常能在5-15秒内回复,取决于硬件)。

优化技巧:预热与连接池为了减少首次响应延迟,可以在中间件启动后,主动发送一个简单的提示词给OpenClaw进行“预热”。另外,确保使用httpx.AsyncClient时启用连接池,避免为每个请求重复创建连接的开销。

5.3 为机器人添加实用技能

一个只会闲聊的机器人吸引力有限。OpenClaw的强大之处在于可以为其装备“技能”。让我们以添加“天气查询”技能为例。

我们需要在OpenClaw的配置中定义一个新技能,并实现其逻辑。OpenClaw支持自定义技能。在项目目录下创建my_skills/weather.py

# my_skills/weather.py import httpx from openclaw.skills.base import Skill from pydantic import BaseModel, Field class WeatherInput(BaseModel): location: str = Field(description="需要查询天气的城市名称,例如:北京") class WeatherSkill(Skill): name = "get_weather" description = "获取指定城市的当前天气情况" args_schema = WeatherInput async def execute(self, location: str): """执行技能:调用天气API""" # 这里使用一个免费的天气API示例,实际使用时请申请自己的KEY并注意调用限制 api_key = "YOUR_WEATHER_API_KEY" # 例如和风天气、OpenWeatherMap的KEY url = f"https://api.openweathermap.org/data/2.5/weather?q={location}&appid={api_key}&units=metric&lang=zh_cn" async with httpx.AsyncClient() as client: try: resp = await client.get(url, timeout=5.0) data = resp.json() if resp.status_code == 200: city = data['name'] temp = data['main']['temp'] desc = data['weather'][0]['description'] return f"{city}的当前天气:{desc},气温 {temp}°C。" else: return f"无法获取{city}的天气,错误:{data.get('message', '未知')}" except Exception as e: return f"查询天气时出错:{str(e)}"

然后,修改my_config.yaml,在skills列表中添加这个自定义技能,并确保Python路径能找到它:

skills: - name: "conversation" - name: "my_skills.weather.WeatherSkill" # 指向我们自定义的技能类

重启桥接服务。现在,当你问机器人“上海天气怎么样?”,OpenClaw的规划器会识别出这是一个查询天气的意图,自动调用WeatherSkill,并将结果整合到回复中。

实操心得三:技能设计的要点

  1. 描述要清晰:技能的description和参数的description非常重要,这是大语言模型判断是否调用该技能的主要依据。要用自然语言描述清楚技能的功能和参数。
  2. 错误处理要友好:技能执行过程中可能会失败(网络超时、API限流等),一定要有完善的异常捕获,并返回对人类和模型都友好的错误信息,避免让机器人输出一堆代码报错。
  3. 考虑权限与安全:不是所有技能都应对所有用户开放。可以在中间件或技能内部加入权限校验逻辑,比如某些管理技能只允许特定QQ号触发。

6. 常见问题排查与进阶优化指南

在实际部署和运行中,你几乎一定会遇到下面这些问题。这里我把踩过的坑和解决方案整理出来。

6.1 部署与连接问题

问题1:go-cqhttp扫码登录失败或掉线。

  • 原因:QQ对新设备或频繁登录的账号有安全验证。
  • 解决
    • config.yml中尝试配置protocol: 2(MacOS协议)或protocol: 1(安卓手表协议),不同协议稳定性不同。
    • 在常用的手机或电脑上先登录一下这个机器人QQ号,挂几天再尝试用go-cqhttp扫码。
    • 考虑使用qsign等签名服务来稳定协议,但这涉及更复杂的部署。

问题2:桥接服务收到事件,但调用OpenClaw时报错或超时。

  • 检查Ollama服务:运行curl http://localhost:11434/api/tags看是否能返回模型列表。
  • 检查OpenClaw配置:确认my_config.yaml中的base_urlmodel名称完全正确。
  • 查看OpenClaw日志:在桥接服务初始化OpenClaw和运行时,会有更详细的错误信息输出到日志中。常见错误是模型名称拼写错误或Ollama未加载该模型。

问题3:机器人回复消息失败,go-cqhttp API返回错误码。

  • 检查go-cqhttp的API地址和端口:确认桥接服务中GO_CQHTTP_API_URL的端口(默认5700)与config.ymlservers.http.port一致。
  • 检查secret:如果在config.yml中设置了secret,那么在桥接服务调用API时,需要在请求头中添加Authorization: Bearer <your_secret>。我们的示例代码未添加,如果设置了secret,需要修改send_message函数。
  • 查看go-cqhttp日志:日志中会明确记录API调用失败的原因,如“发送消息失败,账号可能被风控”。

6.2 性能与稳定性优化

优化1:降低大模型响应延迟

  • 使用量化模型:如qwen2.5:7b-instruct-q4_K_M。在Ollama中运行ollama pull qwen2.5:7b-instruct-q4_K_M即可。
  • 调整OpenClaw参数:在配置中,可以给模型调用增加超时和重试。也可以尝试使用流式响应(如果OpenClaw和中间件支持),让用户看到生成过程。
  • 硬件升级:最直接有效。为CPU添加更多核心、使用更快的NVMe SSD加载模型、增加内存容量,或者使用带GPU的机器(Ollama支持CUDA)都能极大提升速度。

优化2:管理多轮对话上下文OpenClaw的BufferMemory默认只保存固定轮数的对话。在群聊场景中,来自不同用户的对话交织,容易导致上下文混乱。

  • 解决方案:在中间件中,为每个“会话”维护独立的上下文标识。例如,私聊以private_<user_id>为键,群聊以group_<group_id>为键,将历史记录存储在Redis或数据库中。每次处理消息时,取出该会话的历史记录,构造包含上下文的提示词再发给OpenClaw。OpenClaw也支持传入自定义的对话历史。

优化3:实现技能的热更新不想每次添加新技能都重启整个桥接服务?

  • 解决方案:可以将技能配置动态化。例如,将技能列表和配置存放在数据库或一个可热加载的配置文件中。在OpenClaw初始化时,动态地从这些源加载技能。或者,可以设计一个技能注册中心,桥接服务定期检查并更新OpenClaw实例中的技能列表。这需要更深入的框架定制。

6.3 安全与风控注意事项

安全1:API密钥管理天气、搜索等技能的API密钥绝对不能硬编码在代码中。

  • 正确做法:使用环境变量或专门的密钥管理服务(如Vault)。在代码中通过os.getenv('WEATHER_API_KEY')读取。

安全2:输入过滤与防注入用户输入的消息会直接或间接传递给大模型和技能。

  • 风险:恶意用户可能输入精心构造的提示词,试图让模型泄露系统信息、执行未授权操作(“提示词注入”攻击)。
  • 防护:在中间件层对输入进行基础清洗(如过滤超长消息、特殊字符)。为技能设定严格的权限边界,确保技能只能访问其 intended 的资源。

风控:QQ账号安全这是做QQ机器人最大的外部风险。

  • 避免高频发送:严格控制消息发送频率,尤其在群聊中。
  • 避免敏感内容:大模型可能生成不可控的内容,务必在最终回复前加入一层内容安全过滤(可以使用内容安全API或关键词过滤),防止机器人发送违规言论导致封号。
  • 准备备用方案:重要业务不要完全依赖一个QQ机器人账号,理解并接受账号可能被限制登录的风险。

走到这一步,一个基于OpenClaw、拥有“大脑”的QQ智能机器人系统就已经在你的掌控之中了。从简单的闲聊,到查询天气、搜索资料,甚至未来集成更复杂的自动化工作流,这个框架提供了巨大的可扩展性。整个搭建过程最深的体会是,技术集成往往比单一技术更难,需要耐心地调试每一个环节的日志。另一个关键是“分而治之”,把系统拆解成模型服务、智能框架、协议客户端、桥接中间件这几个清晰的部分,逐一攻破,最终让它们流畅地协同工作。

← 返回列表