项目demo —— GPT 聊天机器人
- 本文介绍我的开源项目 TelegramChatBot,这是一个基于 OpenAI GPT API 开发的 telegram 机器人,具有多模态交互能力,求 star!感谢大家!
- 在 telegram @jokerController_bot 立即体验!
- 欢迎对 GPT 应用开发或对 telegram 开发有兴趣的朋友和我交流
文章目录
- 1. 项目简介
- 1.1 特点
- 1.2 状态机设计
- 1.3 数据库设计
- 2. 各功能最小用例
- 2.1 文本生成
- 2.2 图像生成
- 2.3 语音输入 & 输出
1. 项目简介
1.1 特点
- 一个由 OpenAI GPT API 驱动的 telegram 聊天机器人
- 主打催眠玩法,通过在
system参数中写入 “咒语” 来避免聊天时忘记催眠角色设置,支持咒语的增删查改。 - 利用多种强大的 API,该机器人具有多模态交互能力,包括图像显示、语音输入输出等。使用API包括
- Text generation: gpt-3.5-turbo & gpt-4
- Image generation: stable-diffusion-xl-1024-v1-0
- Text-to-voice: tts-1
- Voice-to-text: whisper-1
- 下图展示机器人的多模态交互能力,包括图像生成、语音输入输出以及催眠后生成风格化文本

1.2 状态机设计
-
机器人具有多种功能,但是 telegram bot 交互能力有限,难以像桌面软件或者 web 网页那样同时显示大量信息或布局多种功能的操作 UI。因此机器人底层设计为有限状态机以简化前端 UI,这样也更适合在移动端使用

-
下面给出机器人的操作菜单以及部分控制界面

1.3 数据库设计
- 需要存储的用户信息包括用户生成文本和语音的 OpenAI API key、用于生成图像的 Stability AI API key 以及用户编辑的咒语文本,使用 MySQL 数据库进行数据持久化,表设计如下
其中 prompts 字段存储 json 格式的咒语文本CREATE TABLE IF NOT EXISTS user_info (id INT NOT NULL AUTO_INCREMENT,user_id VARCHAR(190) NOT NULL,user_key VARCHAR(190) NOT NULL,user_img_key VARCHAR(190) NOT NULL,prompts TEXT,PRIMARY KEY (id),UNIQUE KEY (user_id) )
2. 各功能最小用例
- 本节展示机器人使用的四个 API 的最简单调用方法,读者可以利用它们开发自己的 AI 应用
2.1 文本生成
- 本项目使用 OpenAI GPT3.5 或 GPT4.0 模型生成文本,最小用例如下
from openai import OpenAI client = OpenAI(api_key='XXX') # 填入你的 apiresponse = client.chat.completions.create(model="gpt-3.5-turbo",messages=[{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": "Who won the world series in 2020?"},{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},{"role": "user", "content": "Where was it played?"}] )print(response.choices[0].message.content) - 注意几点
- 本项目使当前(2023.11.29)使用的包版本为 openai 1.3.1,文档参考这里
messages参数需要开发者自行维护,任何时刻,模型记忆仅涵盖在 message 信息内。可以通过system字段设置模型的行为,例如设定模型的个性或是提供其行为的具体说明等。本 bot 直接将用户咒语作为system参数,并且在组合 messages 的多轮对话时,总是在用户的最后一条回复后加上“,扮演指定角色回答。”的附加内容,以保证模型永远不会忘记角色设定- 本 bot 调用以上方法时,还设置了
stream参数要求模型进行流式传输器回复内容,这样就能通过多次编辑 bot 的回复消息内容实现流式显示,详见开源代码 - 如果对回答不满意,只要不将刚刚的回复内容组合进 messages 参数列表中,就可以要求模型进行重新回答,由于 GPT 模型是概率生成模型,每次重新回答都会有所不同
- GPT 模型有上下文长度限制,如果 messages 参数列表中内容太多超出限制就会报错,因此本 bot 提供了上下文长度设置功能来限制组合进 messages 列表的对话轮数
- 有时我们希望可以语言模型可以按照一定格式进行回复,比如我们希望模型在对话过程中自主识别出用户是否有生成图像的意图,如果有就按照用户当前回复来制图,这样就需要模型在每次回复时不仅回复自然语言回答,还要回复一个 “是否生成图像” 的 bool 变量,这时可以通过设置
response_format={ "type": "json_object" }参数要求模型以 json 格式进行返回。本 bot 没有使用该功能,详见文档说明
2.2 图像生成
-
本项目使用 stability.ai 的 stable-diffusion-xl-1024-v1-0 模型生成图像,最小用例如下
import os import io import warnings from PIL import Image from stability_sdk import client import stability_sdk.interfaces.gooseai.generation.generation_pb2 as generation# Our Host URL should not be prepended with "https" nor should it have a trailing slash. os.environ['STABILITY_HOST'] = 'grpc.stability.ai:443'# Sign up for an account at the following link to get an API Key. # https://platform.stability.ai/# Click on the following link once you have created an account to be taken to your API Key. # https://platform.stability.ai/account/keys# Paste your API Key below.# Set up our connection to the API. stability_api = client.StabilityInference(key='XXX', # 填入你的 apiverbose=True, # Print debug messages.engine="stable-diffusion-xl-1024-v1-0", # Set the engine to use for generation.# Check out the following link for a list of available engines: https://platform.stability.ai/docs/features/api-parameters#engine )# Set up our initial generation parameters. answers = stability_api.generate(prompt="expansive landscape rolling greens with gargantuan yggdrasil, intricate world-spanning roots towering under a blue alien sky, masterful, ghibli",seed=4253978046, # If a seed is provided, the resulting generated image will be deterministic.# What this means is that as long as all generation parameters remain the same, you can always recall the same image simply by generating it again.# Note: This isn't quite the case for Clip Guided generations, which we'll tackle in a future example notebook.steps=50, # Amount of inference steps performed on image generation. Defaults to 30. cfg_scale=8.0, # Influences how strongly your generation is guided to match your prompt.# Setting this value higher increases the strength in which it tries to match your prompt.# Defaults to 7.0 if not specified.width=1024, # Generation width, defaults to 512 if not included.height=1024, # Generation height, defaults to 512 if not included.samples=1, # Number of images to generate, defaults to 1 if not included.sampler=generation.SAMPLER_K_DPMPP_2M # Choose which sampler we want to denoise our generation with.# Defaults to k_dpmpp_2m if not specified. Clip Guidance only supports ancestral samplers.# (Available Samplers: ddim, plms, k_euler, k_euler_ancestral, k_heun, k_dpm_2, k_dpm_2_ancestral, k_dpmpp_2s_ancestral, k_lms, k_dpmpp_2m, k_dpmpp_sde) )# Set up our warning to print to the console if the adult content classifier is tripped. # If adult content classifier is not tripped, save generated images. for resp in answers:for artifact in resp.artifacts:if artifact.finish_reason == generation.FILTER:warnings.warn("Your request activated the API's safety filters and could not be processed.""Please modify the prompt and try again.")if artifact.type == generation.ARTIFACT_IMAGE:img = Image.open(io.BytesIO(artifact.binary))img.save(str(artifact.seed)+ ".png") # Save our generated images with their seed number as the filename. -
注意几点
- 本项目当前(2023.11.29)使用的包版本为 stability-sdk 0.4.0,文档参考这里
- 这个模型是一个 text-to-image 的模型,生成图像质量会显著受到 prompt 质量影响,因此不适合直接用自然语言作为 prompt 来生成图像。本 bot 利用 GPT 模型的 in-context learning 能力,先把自然语言翻译成较高质量的 image prompt,再调用该模型生成图像,这一步输入给 GPT 模型的 prompt 如下
当然,bot 也提供了直接使用用户输入内容作为 prompt 生成图像的命令,熟悉 AI 图像生成方法的用户可以直接提供高质量的 image prompt 序列IMGPROMPT = "A prompt example for 一个童话般的宁静小镇,鸟瞰视角,动漫风格 is “a painting of a fairy tale town, serene landscape, a bird's eye view, anime style, Highly detailed, Vivid Colors.” " IMGPROMPT += "Another prompt example for 双马尾动漫少女,蓝黑色头发,颜色鲜艳 is “a painting of 1girl, blue | black hair, low twintails, anime style, with bright colors, Highly detailed.” " IMGPROMPT += "Another prompt example for 拟人化的兔子肖像,油画,史诗电影风格 is “a oil portrait of the bunny, Octane rendering, anthropomorphic creature, reddit moderator, epic, cinematic, elegant, highly detailed, featured on artstation.” " IMGPROMPT += "Another prompt example for 黄昏下,大雨中,两个持刀的海盗在海盗船上决斗 is “Two knife-wielding pirates dueling on a pirate ship, dusk, heavy rain, unreal engine, 8k, high-definition, by Alphonse Mucha and Wayne Barlowe.” " IMGPROMPT += "Now write a prompts for "
2.3 语音输入 & 输出
- 本项目使用 OpenAI tts-1 模型实现文字转语音,使用 whisper-1 模型实现语音转文字,最小用例如下
from pathlib import Path from openai import OpenAI client = OpenAI(api_key='XXX') # 填入你的 api# text2voice speech_file_path = Path(__file__).parent / "speech.ogg" response = client.audio.speech.create(model="tts-1",voice="alloy",input="Hello, World! 你好世界!",response_format='opus' ) response.stream_to_file(speech_file_path)# voice2text file_path = Path(__file__).parent / "speech.ogg" audio_file = open(file_path, "rb") transcript = client.audio.transcriptions.create(model="whisper-1", file=audio_file, response_format="text" ) print(transcript) - 本项目使当前(2023.11.29)使用的包版本为 openai 1.3.1,文档参考
- Text-to-voice: tts-1
- Voice-to-text: whisper-1
相关文章:
项目demo —— GPT 聊天机器人
本文介绍我的开源项目 TelegramChatBot,这是一个基于 OpenAI GPT API 开发的 telegram 机器人,具有多模态交互能力,求 star!感谢大家!在 telegram jokerController_bot 立即体验!欢迎对 GPT 应用开发或对 t…...
Airtest进阶使用篇!提高脚本稳定性 + 批量运行脚本!
一、背景 今天彭于晏为大家分享Airtest进阶使用篇,主要包含两块的内容: 提高脚本稳定性批量运行脚本生成测试报告 二、提高脚本稳定性 1、添加全局配置: #全局设置 ST.FIND_TIMEOUT10 #设置隐式等待时长,默认识别图片时间是30秒,可改为…...
数据库系统概述之数据库优化
为什么需要进行优化? 数据库性能瓶颈 数据库服务器的性能受许多因素影响,包括硬件能力、系统规模、业务模型及架构、代码设计、数据库表设计、系统环境等。 因此,可以从几个方面进行数据库优化 喜欢点赞收藏,如有疑问ÿ…...
【error:Custom elements in iteration require ‘v-bind:key‘ directives】元素绑定:key
在vue3中使用v-for操作的时候,报error Custom elements in iteration require v-bind:key directives 当我想自定义绘制echarts图的代码: <el-row><div v-if"data.chartDataList.length > 0"><el-col :span"12&quo…...
TA-Lib学习研究笔记(二)——Overlap Studies下
TA-Lib学习研究笔记(二)——Overlap Studies下 (11)SAR - Parabolic SAR 抛物线指标 函数名:SAR 名称: 抛物线指标 简介:抛物线转向也称停损点转向,是利用抛物线方式,随…...
三.排序与分页
目录 一.排序数据二.分页 一.排序数据 1.排序规则 使用ORDER BY 子句排序 ASC(ascend)升序DESC(descend)降序 ORDER BY 子句在SELECT语句的结尾 2.单列排序 SELECT last_name, job_id, department_id, hire_date FROM e…...
第一个php扩展开发的demo
cd /root/soft/php/php-5.2.6/ext ./ext_skel --extnameheiyeluren cd /root/soft/php/php-5.2.6/ext/heiyeluren vi config.m4 打开文件后去掉 dnl ,获得下面的信息: PHP_ARG_ENABLE(rot13, whether to enable heiyeluren support, [ --enable-heiyelu…...
A stop job is running for Session c1 of user root (25s 1min 30s)问题
写在前面 今天在前端点击重启按钮,突然发现开发板的串口打印信息卡住了,时间比较长的有一处,比较短的有两处,大致为A stop job is running for Session c1 of user root (25s 1min 30s),此处估计是在关机重启的时候&a…...
C语言进阶之笔试题详解(2)
前言 这里的内容包括二维数组笔试题和指针笔试题,供给读者对这部分知识进行加深和巩固。 ✨ 猪巴戒:个人主页✨ 所属专栏:《C语言进阶》 🎈跟着猪巴戒,一起学习C语言🎈 目录 前言 笔试题 二维数组 题目…...
【开源】基于Vue和SpringBoot的独居老人物资配送系统
项目编号: S 045 ,文末获取源码。 \color{red}{项目编号:S045,文末获取源码。} 项目编号:S045,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询社区4…...
Linux常用命令----cp 命令
文章目录 1. 基本用法2. 保留文件属性3. 递归复制4. 仅复制更新的文件5. 交互式复制6. 创建符号链接而非复制7. 复制并备份目标文件8. 指定备份后缀9. 详细输出总结 Linux操作系统中,cp 命令是一个非常基础且强大的工具,用于复制文件或目录。本文将详细介…...
前端:HTML鼠标样式及其对应的CSS属性值
1、默认箭头样式: selector {cursor: default; } 2、手型样式 selector {cursor: pointer; } 3、文本选择样式: selector {cursor: text; } 4、移动手型样式: selector {cursor: move; } 5、缩放手型样式: selector {cur…...
Linux 命令chgrp chown chmod
chgrp chown chmod 介绍 chgrp : 修改文件所属用户组 chown : 修改文件拥有者 chmod : 修改文件权限1 chgrp 命令功能: chgrp命令用来改变文件或目录所属的用户组。该命令用来改变指定文件所属的用户组。其中,组名可以是用户组的id,也可以是用户组的组…...
网络篇---第七篇
系列文章目录 文章目录 系列文章目录前言一、什么是长连接和短连接?二、长连接和短连接的优缺点?三、说说长连接短连接的操作过程前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分…...
Webshell混淆免杀的一些思路
简介 为了避免被杀软检测到,黑客们会对Webshell进行混淆免杀。本文将介绍一些Webshell混淆免杀的思路,帮助安全人员更好地防范Webshell攻击。静态免杀是指通过对恶意软件进行混淆、加密或其他技术手段,使其在静态分析阶段难以被杀毒软件或安…...
MacBook macOs安装RabbitMQ【超详细图解】
目录 一、使用brew安装RabbitMQ 二、安装RabbitMQWeb管理界面 三、启动RabbitMQ 一、使用brew安装RabbitMQ 刚好项目要用到RabbitMQ,安装顺便写下安装步骤记录一下以备用 使用brew命令安装,一般Mac会自带这个命令,如没有,…...
基于格攻击的密钥恢复方法
本篇博文介绍针对椭圆曲线签名算法的基于格攻击的密钥恢复方法,本研究将这种方法应用于椭圆曲线签名算法。针对椭圆曲线算法的攻击研究一般主要集中于算法的两个运算阶段,即标量乘阶段和组合阶段。对于椭圆曲线签名算法,针对标量乘阶段的攻击…...
Redis中的缓存穿透、雪崩、击穿(详细)
目录 一、概念 1. 缓存穿透(Cache Penetration) 解决方案: 2. 缓存雪崩(Cache Avalanche) 解决方案: 3. 缓存击穿(Cache Breakdown) 解决方案: 二、三者出现的根本原…...
iframe
iframe学习 1.iframe是什么? a)iframe是html元素,用于在网页中内嵌另一个网页。 b)iframe默认有一个宽高,存在边界。 c)iframe是一个行内块级元素,可以通过display修改。 2.iframe元素属性有哪些? a)src : 指定内联网页的地…...
rust 基本数据类型
Rust 是 静态类型(statically typed)语言,也就是说在编译时就必须知道所有变量的类型,基本类型如下 整型 整数 是一个没有小数部分的数字长度有符号无符号8-biti8u816-biti16u1632-biti32u3264-biti64u64128-biti128u128archisi…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
