当前位置: 首页 > news >正文

项目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包括
    1. Text generation: gpt-3.5-turbo & gpt-4
    2. Image generation: stable-diffusion-xl-1024-v1-0
    3. Text-to-voice: tts-1
    4. Voice-to-text: whisper-1
  • 下图展示机器人的多模态交互能力,包括图像生成、语音输入输出以及催眠后生成风格化文本
    在这里插入图片描述

1.2 状态机设计

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

  • 下面给出机器人的操作菜单以及部分控制界面
    在这里插入图片描述

1.3 数据库设计

  • 需要存储的用户信息包括用户生成文本和语音的 OpenAI API key、用于生成图像的 Stability AI API key 以及用户编辑的咒语文本,使用 MySQL 数据库进行数据持久化,表设计如下
    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)
    )
    
    其中 prompts 字段存储 json 格式的咒语文本

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)
    
  • 注意几点
    1. 本项目使当前(2023.11.29)使用的包版本为 openai 1.3.1,文档参考这里
    2. messages 参数需要开发者自行维护,任何时刻,模型记忆仅涵盖在 message 信息内。可以通过 system 字段设置模型的行为,例如设定模型的个性或是提供其行为的具体说明等。本 bot 直接将用户咒语作为 system 参数,并且在组合 messages 的多轮对话时,总是在用户的最后一条回复后加上 “,扮演指定角色回答。” 的附加内容,以保证模型永远不会忘记角色设定
    3. 本 bot 调用以上方法时,还设置了 stream 参数要求模型进行流式传输器回复内容,这样就能通过多次编辑 bot 的回复消息内容实现流式显示,详见开源代码
    4. 如果对回答不满意,只要不将刚刚的回复内容组合进 messages 参数列表中,就可以要求模型进行重新回答,由于 GPT 模型是概率生成模型,每次重新回答都会有所不同
    5. GPT 模型有上下文长度限制,如果 messages 参数列表中内容太多超出限制就会报错,因此本 bot 提供了上下文长度设置功能来限制组合进 messages 列表的对话轮数
    6. 有时我们希望可以语言模型可以按照一定格式进行回复,比如我们希望模型在对话过程中自主识别出用户是否有生成图像的意图,如果有就按照用户当前回复来制图,这样就需要模型在每次回复时不仅回复自然语言回答,还要回复一个 “是否生成图像” 的 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.
    
  • 注意几点

    1. 本项目当前(2023.11.29)使用的包版本为 stability-sdk 0.4.0,文档参考这里
    2. 这个模型是一个 text-to-image 的模型,生成图像质量会显著受到 prompt 质量影响,因此不适合直接用自然语言作为 prompt 来生成图像。本 bot 利用 GPT 模型的 in-context learning 能力,先把自然语言翻译成较高质量的 image prompt,再调用该模型生成图像,这一步输入给 GPT 模型的 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 "
      
      当然,bot 也提供了直接使用用户输入内容作为 prompt 生成图像的命令,熟悉 AI 图像生成方法的用户可以直接提供高质量的 image prompt 序列

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秒,可改为…...

数据库系统概述之数据库优化

为什么需要进行优化? 数据库性能瓶颈 数据库服务器的性能受许多因素影响,包括硬件能力、系统规模、业务模型及架构、代码设计、数据库表设计、系统环境等。 因此,可以从几个方面进行数据库优化 喜欢点赞收藏,如有疑问&#xff…...

【error:Custom elements in iteration require ‘v-bind:key‘ directives】元素绑定:key

在vue3中使用v-for操作的时候&#xff0c;报error Custom elements in iteration require v-bind:key directives 当我想自定义绘制echarts图的代码&#xff1a; <el-row><div v-if"data.chartDataList.length > 0"><el-col :span"12&quo…...

TA-Lib学习研究笔记(二)——Overlap Studies下

TA-Lib学习研究笔记&#xff08;二&#xff09;——Overlap Studies下 &#xff08;11&#xff09;SAR - Parabolic SAR 抛物线指标 函数名&#xff1a;SAR 名称&#xff1a; 抛物线指标 简介&#xff1a;抛物线转向也称停损点转向&#xff0c;是利用抛物线方式&#xff0c;随…...

三.排序与分页

目录 一.排序数据二.分页 一.排序数据 1.排序规则 使用ORDER BY 子句排序 ASC&#xff08;ascend&#xff09;升序DESC&#xff08;descend&#xff09;降序 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 &#xff0c;获得下面的信息&#xff1a; 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)问题

写在前面 今天在前端点击重启按钮&#xff0c;突然发现开发板的串口打印信息卡住了&#xff0c;时间比较长的有一处&#xff0c;比较短的有两处&#xff0c;大致为A stop job is running for Session c1 of user root (25s 1min 30s)&#xff0c;此处估计是在关机重启的时候&a…...

C语言进阶之笔试题详解(2)

前言 这里的内容包括二维数组笔试题和指针笔试题&#xff0c;供给读者对这部分知识进行加深和巩固。 ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&#xff1a;《C语言进阶》 &#x1f388;跟着猪巴戒&#xff0c;一起学习C语言&#x1f388; 目录 前言 笔试题 二维数组 题目…...

【开源】基于Vue和SpringBoot的独居老人物资配送系统

项目编号&#xff1a; S 045 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S045&#xff0c;文末获取源码。} 项目编号&#xff1a;S045&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询社区4…...

Linux常用命令----cp 命令

文章目录 1. 基本用法2. 保留文件属性3. 递归复制4. 仅复制更新的文件5. 交互式复制6. 创建符号链接而非复制7. 复制并备份目标文件8. 指定备份后缀9. 详细输出总结 Linux操作系统中&#xff0c;cp 命令是一个非常基础且强大的工具&#xff0c;用于复制文件或目录。本文将详细介…...

前端:HTML鼠标样式及其对应的CSS属性值

1、默认箭头样式&#xff1a; selector {cursor: default; } 2、手型样式 selector {cursor: pointer; } 3、文本选择样式&#xff1a; selector {cursor: text; } 4、移动手型样式&#xff1a; selector {cursor: move; } 5、缩放手型样式&#xff1a; selector {cur…...

Linux 命令chgrp chown chmod

chgrp chown chmod 介绍 chgrp : 修改文件所属用户组 chown : 修改文件拥有者 chmod : 修改文件权限1 chgrp 命令功能: chgrp命令用来改变文件或目录所属的用户组。该命令用来改变指定文件所属的用户组。其中&#xff0c;组名可以是用户组的id&#xff0c;也可以是用户组的组…...

网络篇---第七篇

系列文章目录 文章目录 系列文章目录前言一、什么是长连接和短连接?二、长连接和短连接的优缺点?三、说说长连接短连接的操作过程前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分…...

Webshell混淆免杀的一些思路

简介 为了避免被杀软检测到&#xff0c;黑客们会对Webshell进行混淆免杀。本文将介绍一些Webshell混淆免杀的思路&#xff0c;帮助安全人员更好地防范Webshell攻击。静态免杀是指通过对恶意软件进行混淆、加密或其他技术手段&#xff0c;使其在静态分析阶段难以被杀毒软件或安…...

MacBook macOs安装RabbitMQ【超详细图解】

目录 一、使用brew安装RabbitMQ 二、安装RabbitMQWeb管理界面 三、启动RabbitMQ 一、使用brew安装RabbitMQ 刚好项目要用到RabbitMQ&#xff0c;安装顺便写下安装步骤记录一下以备用 使用brew命令安装&#xff0c;一般Mac会自带这个命令&#xff0c;如没有&#xff0c;…...

基于格攻击的密钥恢复方法

本篇博文介绍针对椭圆曲线签名算法的基于格攻击的密钥恢复方法&#xff0c;本研究将这种方法应用于椭圆曲线签名算法。针对椭圆曲线算法的攻击研究一般主要集中于算法的两个运算阶段&#xff0c;即标量乘阶段和组合阶段。对于椭圆曲线签名算法&#xff0c;针对标量乘阶段的攻击…...

Redis中的缓存穿透、雪崩、击穿(详细)

目录 一、概念 1. 缓存穿透&#xff08;Cache Penetration&#xff09; 解决方案&#xff1a; 2. 缓存雪崩&#xff08;Cache Avalanche&#xff09; 解决方案&#xff1a; 3. 缓存击穿&#xff08;Cache Breakdown&#xff09; 解决方案&#xff1a; 二、三者出现的根本原…...

iframe

iframe学习 1.iframe是什么&#xff1f; a)iframe是html元素&#xff0c;用于在网页中内嵌另一个网页。 b)iframe默认有一个宽高,存在边界。 c)iframe是一个行内块级元素&#xff0c;可以通过display修改。 2.iframe元素属性有哪些&#xff1f; a)src : 指定内联网页的地…...

rust 基本数据类型

Rust 是 静态类型&#xff08;statically typed&#xff09;语言&#xff0c;也就是说在编译时就必须知道所有变量的类型&#xff0c;基本类型如下 整型 整数 是一个没有小数部分的数字长度有符号无符号8-biti8u816-biti16u1632-biti32u3264-biti64u64128-biti128u128archisi…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...