news 2026/5/5 5:07:26

基于GPT与Stable Diffusion的QQ机器人:AI对话与绘画集成实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于GPT与Stable Diffusion的QQ机器人:AI对话与绘画集成实践

1. 项目概述:一个集成了GPT与AI绘画的QQ机器人

最近在折腾AI应用落地的时候,我一直在想,能不能把当下最火的两个AI能力——对话和绘画,无缝地集成到一个我们日常高频使用的场景里。对于国内用户来说,QQ群无疑是一个绝佳的“试验田”。于是,就有了这个项目:一个运行在腾讯QQ上的机器人,它既能像ChatGPT一样和你聊天,又能根据你的文字描述生成图片。

这个项目的核心目标很简单:让AI能力变得触手可及,并且好玩。你不需要去记住复杂的API调用,也不需要打开一堆网页应用,在QQ群里@一下机器人,或者发个简单的指令,就能直接调用强大的GPT-3.5/ChatGPT进行对话,或者驱动本地的Stable Diffusion模型生成你想象中的画面。无论是技术爱好者想在自己的群里搭建一个智能助手,还是普通用户想体验“一句话出图”的乐趣,这个项目都提供了一个完整的、可复现的解决方案。

2. 核心思路与技术架构拆解

2.1 设计哲学:基于提示词(Prompt)的指令路由

这个项目最巧妙的设计在于其指令处理机制。它没有采用传统的、为每个功能编写独立解析器的复杂方式,而是将GPT本身作为了一个“超级指令路由器”

具体流程是这样的:

  1. 当用户在群里@机器人并发送消息时,消息内容首先会被送入一个预设好的系统提示词(System Prompt)中。
  2. 这个系统提示词经过精心设计,它会“教”GPT如何理解用户的意图。例如,提示词里会明确告诉GPT:“如果用户的消息以‘#画图’开头,或者包含‘画一个’、‘生成图片’等关键词,那么你应该在回复中插入一个特殊的标记,比如[DRAW]。”
  3. 我们的机器人程序在拿到GPT的回复后,并不直接显示给用户,而是先检查回复内容中是否包含了像[DRAW]这样的预定义标记。
  4. 如果发现了[DRAW]标记,程序就会拦截这次回复,转而提取用户原始消息中的描述文本,调用后端的Stable Diffusion WebUI API来生成图片,最后将图片发送到群里。
  5. 如果没有发现任何特殊标记,程序就会将GPT的回复正常地发送出去,完成一次对话。

提示:这种设计的精妙之处在于极高的可扩展性。理论上,你可以通过修改系统提示词,教会GPT识别更多指令,比如[MUSIC]代表生成音乐,[SEARCH]代表网络搜索。程序只需要增加对应的标记识别和后续处理逻辑即可,无需改动核心的消息流转框架。项目作者也提到,类似的思路已被用于视觉问答、语音服务等场景。

2.2 整体技术栈与数据流

整个系统可以看作一个“消息中转与处理中心”,连接了QQ客户端、大语言模型(LLM)和文生图模型。其核心架构和数据流如下图所示:

flowchart TD A[QQ用户发送消息] --> B[go-cqhttp<br>QQ机器人框架] B -- 通过WebSocket转发消息 --> C[本机器人程序<br>(mix-chatgpt-and-ai-painting)] C -- 是普通聊天? --> D[调用OpenAI API<br>(GPT-3.5/ChatGPT)] D -- 回复文本 --> C C -- 是绘画指令? --> E[调用Stable Diffusion<br>WebUI API] E -- 生成图片 --> C C -- 格式化最终回复 --> B B --> F[在QQ群中<br>呈现结果(文本/图片)]

各组件角色解析:

  1. 消息接收端 (go-cqhttp / LLOneBot):这是与QQ官方服务器通信的桥梁。由于QQ未开放官方机器人协议,我们需要使用这些兼容性框架来模拟一个QQ客户端,负责登录、接收群消息、发送消息和图片。本项目通过WebSocket与这些框架连接,实现实时通信。
  2. 核心处理程序 (本项目的main.py):这是项目的大脑。它维护着与go-cqhttp的WebSocket连接,监听所有消息事件。对于每条消息,它负责:
    • 权限校验:检查发送者是否在黑名单、是否为VIP或管理员。
    • 指令预处理:识别如#画图#上线等直接指令,并立即执行。
    • 对话路由:对于非直接指令的聊天消息,将其与历史对话上下文组合,发送给LLM(OpenAI或本地模型)。
    • LLM回复后处理:分析LLM返回的文本,查找如[DRAW]的指令标记,并触发相应的功能模块(如调用绘画API)。
    • 状态管理:管理每个群聊、每个用户的对话历史、VIP名单、黑名单等。
  3. AI能力后端
    • 大语言模型 (LLM) 服务:默认使用OpenAI的官方API(GPT-3.5-turbo)。项目也支持切换到本地部署的LLM(如RWKV-Runner),只需在配置中启用并指向本地API地址,这为无法访问OpenAI服务的用户提供了可能。
    • 文生图 (AIGC) 服务:依赖于Stable Diffusion WebUI的API。这是一个功能极其强大的Web界面,集成了Stable Diffusion模型以及各种插件(LoRA、ControlNet等)。本项目通过其提供的HTTP API接口,发送文本描述和生成参数,获取生成的图片。

3. 从零开始的详细部署指南

纸上谈兵终觉浅,下面我将带你一步步完成整个环境的搭建。这个过程涉及多个组件的配置,请保持耐心。

3.1 第一步:准备QQ机器人框架(消息入口)

由于QQ协议限制,我们需要一个中间件来模拟QQ客户端。go-cqhttp曾是首选,但已停止维护。这里我推荐使用其活跃的替代品LLOneBot

  1. 下载LLOneBot:访问 LLOneBot的GitHub发布页面 ,根据你的操作系统下载最新版本(Windows通常选择LLOneBot-windows-amd64.exe)。
  2. 初次运行与配置
    • 将下载的可执行文件放在一个单独的文件夹中(例如D:\LLOneBot)。
    • 双击运行,程序会自动生成配置文件config.yml并退出。
    • 用文本编辑器(如VS Code、Notepad++)打开config.yml
  3. 关键配置修改:找到以下部分并进行修改:
    # 账号配置 account: uin: 1233456 # 这里填写你的机器人QQ号 password: '' # 密码留空,使用扫码登录更安全 # 服务配置 servers: - http: # HTTP通信,可用于测试,非必须 host: 127.0.0.1 port: 5700 - ws-reverse: # 反向WebSocket,这是本项目需要的核心连接方式 - url: ws://127.0.0.1:8080/onebot/v11/ws/ # 本项目的WebSocket服务地址 access-token: '' # 如果本项目config.py中设置了access_token,这里也要填一样的 reconnect-interval: 5000
  4. 登录机器人:保存配置文件,再次运行LLOneBot.exe。程序会弹出二维码,使用你的机器人QQ号对应的手机QQ扫码登录。登录成功后,控制台会显示连接信息。

3.2 第二步:部署Stable Diffusion WebUI(绘画引擎)

这是项目的“画手”,负责将文字变成图片。

  1. 克隆与安装
    • 打开命令行,切换到一个空间充足的磁盘(如D:\)。
    • 执行以下命令(确保已安装Git):
      git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git cd stable-diffusion-webui
    • 对于Windows用户:直接运行根目录下的webui-user.bat脚本。它会自动安装Python、Git等依赖,过程较慢,请耐心等待。
    • 对于Linux/macOS用户:运行./webui.sh
  2. 下载绘画模型:WebUI本身不带模型。你需要下载基础的Stable Diffusion模型文件(.safetensors.ckpt)。
    • 推荐入门模型Anything-V5Counterfeit-V3.0,它们对动漫风格有很好的表现。
    • 下载地址:可以在CivitAI或HuggingFace上搜索。下载后,将模型文件放入stable-diffusion-webui/models/Stable-diffusion/目录下。
  3. 以API模式启动:这是关键一步,否则我们的机器人无法调用绘画功能。
    • 修改webui-user.bat(Windows)或webui-user.sh(其他系统)。
    • 找到set COMMANDLINE_ARGS=这一行,在引号内添加--api参数。例如:
      set COMMANDLINE_ARGS=--api --xformers --medvram
      • --api:启用API接口,必须添加。
      • --xformers:加速图像生成(仅限NVIDIA显卡)。
      • --medvram:优化显存使用(针对显存4G-8G的显卡)。
    • 保存并重新启动WebUI。在浏览器中访问http://127.0.0.1:7860确认WebUI正常运行,并且地址栏URL类似http://127.0.0.1:7860/?__theme=dark

3.3 第三步:配置与启动核心机器人程序

现在,我们来设置连接前面两者的“大脑”。

  1. 获取项目代码:在命令行中,进入一个合适的工作目录,执行:
    git clone https://github.com/josStorer/mix-chatgpt-and-ai-painting.git cd mix-chatgpt-and-ai-painting
  2. 安装Python依赖:项目根目录下有一个requirements.txt文件,列出了所有必需的Python库。
    pip install -r requirements.txt

    注意:如果遇到网络问题,可以使用国内镜像源,如pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

  3. 核心配置:修改config.py:这是整个项目的控制中心,请仔细配置。
    # OpenAI 配置 (二选一) # 方式一:使用API Key(推荐,更稳定) api_key = "sk-你的OpenAI-API-Key" use_chatgpt = False # 使用API Key时,此项设为False # 方式二:使用账号密码(不推荐,易出错) # email = "你的OpenAI邮箱" # password = "你的OpenAI密码" # use_chatgpt = True # QQ机器人配置 master_id = 123456789 # 填写你的个人QQ号,作为超级管理员 bot_id = 987654321 # 填写你的机器人QQ号 working_groups = [12345678, 87654321] # 机器人工作的QQ群号列表,可以填多个 auth_vip_for_all = False # 是否允许所有群成员直接@机器人聊天。False则只有VIP和管理员可以 # 网络与代理配置(如果你的网络需要) # proxy = "http://127.0.0.1:10809" # 根据你的代理软件设置,如Clash默认是7890端口 # Stable Diffusion WebUI 配置 sd_url = "http://127.0.0.1:7860" # 确保与第二步中启动的WebUI地址一致
  4. 启动机器人:在项目根目录下,运行:
    python main.py
    如果一切正常,你将看到控制台输出连接LLOneBot和OpenAI成功的日志信息。

3.4 第四步:功能测试与联调

现在,三个组件都已就绪。请按以下顺序验证:

  1. 确认LLOneBot在线:LLOneBot的控制台应显示“已连接”等信息,并且机器人QQ号在手机QQ上应显示为在线。
  2. 在QQ群中测试基础功能
    • 权限指令:在已配置的working_groups群中,由master_id指定的管理员发送#上线,机器人应回复“已上线”。
    • 对话功能:发送“@机器人 你好”,机器人应能使用GPT进行回复。
    • 绘画功能:发送“#画图 一只可爱的猫”,等待片刻,机器人应发送一张生成的猫的图片。
  3. 检查日志:如果任何一步失败,请仔细查看main.py运行窗口的报错信息,这是排查问题的关键。

4. 核心功能深度解析与高级玩法

4.1 绘画指令 (#画图) 的完全指南

#画图指令是项目的精髓,它支持从简单到高度定制化的各种参数。

  • 基础用法#画图 一个女孩,金色长发,站在樱花树下

    • 这会使用config.pysd_default_options定义的默认参数(如尺寸、步数)来生成图片。
  • 快捷参数:使用点号.或分号;分隔多个关键词和参数。

    • #画图 512x512.一个女孩.步骤20.种子123456
    • 这里,512x512会覆盖默认的图片尺寸,步骤20会将采样步数设置为20,种子123456会固定随机种子,使得每次生成图片相同。
  • 高级JSON配置:对于需要精细控制的场景,可以直接传入JSON对象。

    #画图 { "prompt": "masterpiece, best quality, 1girl, beautiful detailed eyes", "negative_prompt": "lowres, bad anatomy, worst quality", "width": 768, "height": 1024, "steps": 28, "cfg_scale": 7, "sampler_name": "DPM++ 2M Karras", "seed": -1 }
    • prompt: 正向提示词,描述你想要的画面。
    • negative_prompt: 反向提示词,描述你不希望出现的元素,对于提升成图质量至关重要。
    • sampler_name: 采样器,不同采样器速度和效果不同。Euler a速度快,DPM++ 2M Karras质量高。
    • cfg_scale: 提示词相关性,值越高越遵循你的描述,但过高可能使画面过饱和。一般7-12之间。

实操心得:写出好提示词的技巧

  1. 结构分层:好的提示词像写文章。通常结构为:[画质词], [主体描述], [细节补充], [风格/艺术家], [渲染/镜头]。例如:masterpiece, best quality, 1girl, long silver hair, blue eyes, wearing cyberpunk armor, by Artgerm and Greg Rutkowski, unreal engine 5 render, cinematic lighting
  2. 使用权重:在WebUI中可以用(word:1.2)来增加某个词的权重,或用[word:0.8]来降低。在本项目中,可以通过在JSON配置的prompt字段里直接写入带权重的文本。
  3. 善用反向提示词:一套通用的高质量反向提示词能极大提升出图稳定性。可以尝试:lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry

4.2 模型与VAE的动态管理

项目支持在运行时切换不同的Stable Diffusion模型和VAE,这让你可以在一台机器上灵活应对不同风格的绘画需求。

  • 查看与切换模型

    • #model:列出stable-diffusion-webui/models/Stable-diffusion/目录下所有可用的模型。
    • #model anything-v4:切换到模型名称中包含“anything-v4”的模型(如anything-v4.0-pruned.safetensors)。匹配不区分大小写。
    • 原理:该指令通过调用Stable Diffusion WebUI的/sdapi/v1/sd-modelsAPI获取列表,并通过/sdapi/v1/optionsAPI设置sd_model_checkpoint选项来实现热切换。
  • 查看与切换VAE

    • #vae:列出stable-diffusion-webui/models/VAE/目录下所有VAE文件及当前使用的VAE。
    • #vae vae-ft-mse-840000-ema-pruned.ckpt:切换到指定的VAE文件。注意,这里需要完整的文件名,不支持模糊匹配
    • VAE的作用:VAE(变分自编码器)负责将潜空间特征解码为最终像素图像。不同的VAE对颜色、细节的还原有细微影响。切换VAE可以微调图像的色彩风格和清晰度。

4.3 对话上下文与VIP管理系统

  • 对话上下文管理:机器人会为每个用户在每个群聊中维护独立的对话历史(上下文)。这带来了连续对话的能力,但也可能因上下文过长导致API调用失败或费用增加。

    • #清理对话:清空当前用户在当前群聊的上下文历史,重新开始。
    • 实现细节:上下文以列表形式存储在内存中,每条记录包含roleuserassistant)和content。每次对话,程序会将最新的用户消息和历史记录(最近N条)一并发送给GPT。
  • 权限系统

    • 黑名单 (#拉黑/#解除):被拉黑的用户在该群聊中将无法触发任何机器人功能。
    • VIP名单 (#vip/#unvip):VIP用户享有特权:1) 无需@即可触发对话(需配合#at切换指令);2) 可以使用快捷画图指令#d
    • 管理员 (master_id):拥有所有权限,包括管理VIP和黑名单。
    • 配置项auth_vip_for_all:当设为True时,所有群成员都自动拥有VIP权限,适合小型内部群。设为False时,则需要手动授权。

5. 常见问题排查与性能优化

在实际部署和长期运行中,你可能会遇到以下问题。这里我整理了详细的排查清单。

5.1 连接与配置类问题

问题现象可能原因解决方案
启动main.py时报错WebSocket connection failedLLOneBot未启动或配置的WebSocket地址/端口错误。1. 确认LLOneBot已成功登录并运行。
2. 检查config.py中的ws_url是否与LLOneBot的config.ymlws-reverseurl完全一致(默认应为ws://127.0.0.1:8080/onebot/v11/ws/)。
发送#画图指令后,机器人回复“错误: 'images'”或“404 Not Found”Stable Diffusion WebUI 未启用API模式。确保启动WebUI的命令行参数中包含--api。检查webui-user.bat中的COMMANDLINE_ARGS。重启WebUI后,在浏览器访问http://127.0.0.1:7860/docs应该能看到API文档页面。
@机器人聊天无反应,控制台无错误机器人未在该群“上线”或发送者无权限。1. 确认该群号已加入config.pyworking_groups列表。
2. 在群内发送#上线指令(需管理员)。
3. 检查auth_vip_for_all配置,或为对应用户添加VIP权限。
使用账号密码登录OpenAI方式时,报错AttributeError: 'Error' object...OpenAI登录失败,可能是密码错误、账号被封或需要验证。强烈建议切换到API Key方式。在OpenAI官网生成一个API Key,然后在config.py中设置api_key并令use_chatgpt = False
#model#vae指令切换失败WebUI启动时缺少必要的参数。在WebUI的启动命令中增加--enable-insecure-extension-access参数,以允许通过API访问模型列表。

5.2 网络与代理问题

如果身处网络受限环境,代理配置是关键。

  • OpenAI API访问失败:如果直接连接OpenAI超时或拒绝,需要在代码中配置代理。
    • 打开main.py,找到初始化OpenAI客户端的地方(通常在文件顶部),添加代理设置:
    import openai openai.proxy = "http://127.0.0.1:10809" # 替换为你的本地代理地址和端口
  • Stable Diffusion WebUI 下载模型慢:修改WebUI的启动参数,使用国内镜像。
    • webui-user.batCOMMANDLINE_ARGS中添加:
    set COMMANDLINE_ARGS=--api --gradio-queue --xformers --deepdanbooru --multiple --listen --enable-insecure-extension-access --gradio-auth username:password --data-dir ./data --cli ./data/commandline.txt --ckpt-dir ./data/models/Stable-diffusion --hypernetwork-dir ./data/models/hypernetworks --embeddings-dir ./data/embeddings --lora-dir ./data/models/Lora --vae-dir ./data/models/VAE --controlnet-dir ./data/models/ControlNet --controlnet-annotator-models-path ./data/models/ControlNetAnnotator --lyco-dir ./data/models/LyCORIS --skip-version-check --no-download-sd-model --disable-console-progressbars
    • 其中--no-download-sd-model可以防止自动下载默认模型。手动将模型文件放入对应目录即可。

5.3 性能优化与稳定运行

  • 减少显存占用:如果绘画时出现显存不足(OOM)错误,可以调整WebUI启动参数和生成参数。
    • 启动参数--medvram--lowvram。对于高端卡(8G以上)可能不需要。
    • 生成参数:在config.pysd_default_options中,降低widthheight(如从512x768降至512x512),减少steps(如从28降至20),使用更高效的采样器(如Euler a)。
  • 管理对话成本:GPT-3.5的API调用按Token收费,过长的上下文会增加费用。
    • config.py中调整conversation_max_tokens限制单次请求的最大Token数。
    • 调整max_history_length限制保存的对话轮次,避免历史无限增长。
    • 鼓励用户在使用完毕后主动发送#清理对话
  • 实现24小时运行:在个人电脑上,可以编写批处理脚本实现开机自启。
    • 创建一个start_all.bat文件,内容如下:
    @echo off cd /d "D:\LLOneBot" start "" LLOneBot.exe timeout /t 5 cd /d "D:\stable-diffusion-webui" call webui-user.bat timeout /t 30 cd /d "D:\mix-chatgpt-and-ai-painting" python main.py
    • 将此批处理文件的快捷方式放入系统的“启动”文件夹(shell:startup),即可实现开机自动运行整套服务。

6. 扩展思路与二次开发

这个项目的结构清晰,非常适合进行二次开发,添加更多有趣的功能。

  1. 集成更多AI服务

    • 语音合成:参考友情链接中的衍生项目,集成类似VITS的本地TTS模型。当GPT回复文本后,可以调用TTS API生成语音,再通过QQ的语音消息功能发送。
    • 图像理解:集成类似BLIP、GPT-4V的视觉模型。当用户发送图片时,机器人可以描述图片内容、回答关于图片的问题,甚至基于图片进行再创作(图生图)。
    • 联网搜索:通过修改系统提示词,教GPT在需要实时信息时输出[SEARCH]标记,然后程序调用搜索引擎API,将结果摘要后返回给GPT整合成最终回复。
  2. 优化指令系统

    • 当前的指令识别依赖于GPT对系统提示词的理解,存在一定的不确定性。可以结合正则表达式关键词匹配进行混合判断。例如,明确以“#”开头的指令由程序直接处理;模糊的自然语言指令再由GPT判断意图。这样可以提高响应速度和准确性。
  3. 完善后台管理

    • 当前的管理指令(如VIP、黑名单)需要在QQ群内操作。可以开发一个简单的Web管理面板,通过浏览器查看机器人的状态、对话日志、生成图片历史,并进行用户和群组管理,这样会更加方便。
  4. 适配其他平台

    • 作者在main.pyon_message函数和ws_wrapper.py中封装了消息处理与发送的逻辑。这套逻辑本质上是与“机器人接收/发送消息”的接口解耦的。理论上,只要为其他平台(如Discord、Telegram、微信)编写一个类似ws_wrapper.py的适配器,替换掉与go-cqhttp通信的部分,就能将整个AI大脑迁移到新的平台上。

这个项目就像一颗种子,展示了如何将前沿的AI能力以极低的门槛嵌入到熟悉的社交场景中。它的代码或许不那么完美,但其中蕴含的“提示词即指令”的设计思想,以及模块化集成的架构,为我们提供了宝贵的实践范本。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/5 5:04:29

RTOS选型如何影响嵌入式产品开发效率与成本

1. RTOS选择对产品上市时间的影响机制在嵌入式系统开发领域&#xff0c;实时操作系统(RTOS)的选择往往被工程师视为纯粹的技术决策&#xff0c;但实际上这更是一个商业战略问题。根据Embedded Market Forecasters(EMF)的研究数据&#xff0c;RTOS的选择直接影响42%的项目能否按…

作者头像 李华
网站建设 2026/5/5 5:03:29

别再只盯着Gmapping了!手把手教你用Cartographer在ROS Noetic上搭建激光SLAM(含IMU/里程计融合配置)

从Gmapping到Cartographer&#xff1a;ROS Noetic激光SLAM实战进阶指南 激光SLAM技术正在经历从传统滤波方法到现代优化框架的范式转移。当Gmapping仍被许多教程作为ROS入门案例时&#xff0c;工业级应用早已转向Cartographer这类支持多传感器融合的优化方案。本文将带您深入实…

作者头像 李华
网站建设 2026/5/5 5:01:25

RTOS实时系统设计与任务调度模式详解

1. 实时系统与RTOS基础概念在嵌入式系统开发领域&#xff0c;实时操作系统(RTOS)扮演着至关重要的角色。与通用操作系统不同&#xff0c;RTOS专门设计用于满足严格的时间约束要求&#xff0c;其核心价值在于可预测性和确定性。实时系统可以分为硬实时和软实时两类&#xff1a;硬…

作者头像 李华
网站建设 2026/5/5 4:58:29

ARM CoreLink LPD-500低功耗分配器技术解析与应用

1. ARM CoreLink LPD-500低功耗分配器技术解析在移动设备和物联网终端等对功耗敏感的应用场景中&#xff0c;动态功耗管理已成为SoC设计的核心挑战之一。作为ARM CoreLink系列中的关键组件&#xff0c;LPD-500低功耗分配器通过创新的Q-Channel接口协议&#xff0c;为多设备协同…

作者头像 李华