用chatgpt和烧瓶(夸脱)的电报对话摘要机器人机器人
#网络开发人员 #教程 #python #flask

每个人现在都在谈论chatgpt。即使在发布后几个月,AI异常聪明的AI都会使互联网眼花azz乱。但是,在网站上可用的ChatGPT很棒,但是,当您获得API访问时,真正的乐趣开始了。这为您提供了一个很好的机会,可以将Smart AI集成到您的项目和应用程序中,以使其更强大并介绍惊人的功能。

本文为您带来了有关如何使用OpenAi的Python库来创建自己的电报机器人并将Chatgpt集成的指南。这听起来像是最简单的事情,但是让我们通过介绍摘要命令来为您提供一些摘要,以使您对聊天中的几个帖子进行摘要。


帖子假设您对Python有基本知识。但是,我建议您查看Hyperskill的PythonFlask曲目,以了解有关Python的更多信息,并使用烧瓶开发Web应用程序。

设置一切

直接跳入代码之前,您需要做一些准备以获取所有必需的访问。

  1. 在电报中注册您的机器人并检索电报访问令牌(在电报中使用@botfather
  2. 获取访问Telegram Core API并检索api_hashapp_id
  3. 注册到OpenAI并检索API访问令牌。

保存那些秘密的琴弦,并以您的生活来保护它们。没有陌生人应该访问他们:这可能会导致违反安全性。

写骨骼

注意:完整的最终项目代码(分为阶段,提交阶段)可在我的github上找到,请参阅此处的详细信息:https://github.com/yellalena/telegram-gpt-summarizer

python库您需要安装此步骤:烧瓶,pydantic,请求和pyngrok。

让我们从编写非常基本的电报机器人的代码开始。它应该从聊天中接收消息并能够回复它们。
第一件事首先 - 为您的项目创建目录并初始化Python虚拟环境。顺便说一句,如果您使用pycharm,它将为您创建虚拟环境。

PyCharm screenshot

在此阶段,目标分为四个部分:

  1. 创建一个带有一条根路由的简单烧瓶应用程序,用电报消息处理Webhook。
  2. 为电报机器人创建类,并使其能够将消息发送到聊天。
  3. 使大型互联网可见申请。
  4. 在电信中注册申请地址。

这就是 main.py 在这一点上的样子:

app = Flask(__name__)

@app.route('/', methods=["GET", "POST"])
def handle_webhook():
    update = Update(**request.json)
    chat_id = update.message.chat.id

    response = f"This is a response for message: {update.message.text}"
    app.bot.send_message(chat_id, response)

    return "OK", 200

def run_ngrok(port=8000):
    http_tunnel = ngrok.connect(port)
    return http_tunnel.public_url

def main():
    app.bot = TelegramBot(Config.TELEGRAM_TOKEN)
    host = run_ngrok(Config.PORT)
    app.bot.set_webhook(host)
    app.run(port=Config.PORT, debug=True, use_reloader=False)

if __name__ == "__main__":
    main()

几件事需要澄清:

  • 我喜欢将所有配置内容都放在一个地方,因此我创建了 config.py.py 文件,该文件将收集和存储我们的令牌和其他有用的信息。
  • 电报将更新作为嵌套的JSON发送,所以让我们创建一组Pydantic模型以解析输入以稍后更方便。
  • 要将应用程序公开到网络上,我使用ngrok。它使您的当地主机的特定端口可见其他所有人,并为其提供了临时的公共地址。这就是为什么要确保您公开与您运行的烧瓶应用程序相同的端口很重要的原因。
  • 最后,我初始化了机器人并将网络钩设置为Ngrok的公共URL,以便该机器人知道它必须在收到任何消息时与此URL通信。

要设置Webhook,您需要将请求发送到使用您获得的秘密令牌构建的机器人的Telegram API地址。电报机器人代码如下:

import requests
from config import Config

class TelegramBot:
    def __init__(self, token):
        self.token = token
        self.bot_api_url = f"{Config.TELEGRAM_API}/bot{self.token}"

    def set_webhook(self, host):
        host = host.replace("http", "https")
        set_webhook_url = f"{self.bot_api_url}/setWebhook?url={host}"
        response = requests.get(set_webhook_url)
        response.raise_for_status()

    def send_message(self, chat_id, message):
        send_message_url = f"{self.bot_api_url}/sendMessage"
        response = requests.post(send_message_url, json={"chat_id": chat_id,
                                                          "text": message})
        response.raise_for_status()

现在一切都准备就绪(别忘了我省略了一些基本代码,您可以在回购中找到它),在环境变量中导出bot令牌,然后点击该“运行”!

Telegram chat screenshot
耶!还活着!

添加一个大脑

令人惊讶的是,现在下一步应该在我们的智能机器人中添加少量的智能。使用PIP安装官方的OpenAi的Lib for Python:pip install openai
之后,我们将能够创建一个辅助课程以与AI进行通信。

import openai

class OpenAiHelper:
    def __init__(self, token, model="gpt-3.5-turbo"):
        openai.api_key = token
        self.model = model

    def get_response(self, message_text):
        response = openai.ChatCompletion.create(model=self.model,
                                                messages=[{"role": "user", "content": message_text}])
        return response.choices[0].message.content

API suggests用于您的项目的各种型号。当然,最受欢迎的是GPT。 GPT-4是最近发出最大噪音的一种,但是(因此)它的访问范围有限,因此为了更轻松的测试目的,我选择GPT-3。没什么大不了的,您可以随时选择最喜欢哪个,只需将您传递给助手的字符串名称更改。

不要忘记将OPENAI_TOKEN属性添加到配置中,让我们在代码中使用助手。

首先,在main()方法中实例化:

Initializing the OpenAI helper in main

然后从视图功能打电话给这个人,就像这样:

response = app.openai_helper.get_response(update.message.text)

哇!魔术正在发生!

Telegram chat screenshot with OpenAI response

总结一下!

python库将在此步骤中安装:夸脱,Telethon。

我敢打赌,您已经去过那里 - 您已经与一群喜欢讨论有趣的事情或分享一些新闻或想法的朋友聊天。您有很多事情要做,并且错过了聊天中的所有乐趣。接下来,您会看到一百个未读的消息。如果有人可以简要概述那里发生的事情而不是阅读所有内容,那不是很好吗?好吧,GPT可以做到这一点。我们只需要问它。

这是乐趣开始的地方。由于某种原因,Telegram的机器人API不允许bot读取对话历史记录。我们有Webhooks,并且具有显式getupdates()方法,但是只有在有人提到该机器人的情况下,它们才能起作用。另一个选择是使该机器人作为管理员添加所有更新,但此方法也有一些缺点。首先,您需要为消息设置整个存储。其次,如果您想总结在机器人添加到聊天之前正在进行的对话怎么办?不是我们的情况。

显然,这不是放弃的原因。电报提供了核心API,并且可以帮助检索聊天历史记录。唯一的是它是异步的。而且最受欢迎的Python库Telethon也是异步的。烧瓶是同步的。嗯。

这就是标题中提到的神秘的Quart来到舞台上的地方。夸脱是使用异步,等待和ASGI Web服务器(而不是同步和WSGI)重新实现的烧瓶API。在我们的情况下,它的主要优点是该语法基本上是相同的。让我们快速进行代码重组。

更改很简单。首先,将导入调整并更改每个 flask 夸脱
Image description

然后,使所有Web应用程序的方法异步。并等待现在已成为异步的所有属性和方法:
Image description

如果您不确定什么是异步Python,我鼓励您检查Telethon documentation on the asyncio basics的这一部分。

我还搬了Ngrok和Telegrambot,以用@app.before_serving装饰的单独方法启动它们。这是一个夸脱的内置装饰器,可以确保此方法中的所有内容都将在Web应用程序启动和服务之前运行。需要与主要应用程序相同的事件循环中初始化机器人和助手。

@app.before_serving
async def startup():
    host = run_ngrok(Config.PORT)
    app.bot = TelegramBot(Config.TELEGRAM_TOKEN)
    app.bot.set_webhook(host)
    app.openai_helper = OpenAiHelper(Config.OPENAI_TOKEN)

运行该应用程序也有些变化,但并不多。 HyperCorn是用于异步运行夸脱的ASGI服务器,如果我们要指定应用程序的端口,我们需要在配置中进行。请注意,main()现在也是异步的,并且使用asyncio运行:

async def main():
    quart_cfg = hypercorn.Config()
    quart_cfg.bind = [f"127.0.0.1:{Config.PORT}"]
    await hypercorn.asyncio.serve(app, quart_cfg)

if __name__ == "__main__":
    asyncio.run(main())

就是这样。让我们检查一下我们的机器人的更改是否顺利进行。运行,文字,输入:
Image description

这是在说话。伟大的。现在,获取聊天历史记录以供AI总结。让我们在Telethon Lib的帮助下使用Telegram的核心API。在那里,我们将需要您所拥有的最后两个秘密字符串 - 将它们导出为环境变量。

Telegrambot在__init__方法中有轻微的变化:它将需要拥有一个新的core_api_client属性,该属性初始化了Telethon的客户端,当然,您需要将核心API秘密作为参数。
Image description

这种微小的方法将负责检索历史:

async def get_chat_history(self, chat_id, limit=30):
        if not self.core_api_client:
            return []
        history = await self.core_api_client.get_messages(chat_id, limit)
        result = [f"{message.sender.first_name} {message.sender.last_name}: {message.message} \n"
                  for message in history if not message.action]
        result.reverse()
        return '\n'.join(result)

Telethon的get_messages有更多不同的参数,您可以在limit旁边传递。例如,它可以扭转历史记录,或者按日期而不是消息数量限制。玩游戏很有趣,您可以以任何希望的方式调整自己的机器人。

好吧,我们快要完成了。最后的触摸是将摘要选项添加到Webhook处理程序中。这就是得到答案的样子:

# process "summarize" command
    if update.message.text.startswith("/summarize"):
        history = await app.bot.get_chat_history(chat_id)
        response = app.openai_helper.get_response("Please, briefly summarize the following conversation history:\n" +\
                                                  history)
    else:
        response = app.openai_helper.get_response(update.message.text)

    app.bot.send_message(chat_id, response)

让我们看看它开花!

第一次运行应用程序后,它将要求您登录电报。没关系:需要访问消息历史记录和核心API必须为我们提供的其他私人数据。输入您用来访问Telegram Core API的相同电话号码。您将在应用程序中收到验证代码,之后您很高兴去。
Image description

将机器人添加到与朋友的对话中,并要求摘要:
Image description

就是这样!您可以继续进行无休止的事情:添加处理其他类型的消息,除文本外,配置许多消息要从聊天中总结等等。快乐的编码!:)

不要忘记跳到Hyperskill网站,以继续学习有关使用Python和Flask开发Web应用程序的信息。以下是指向某些主题的链接,您可能会发现这些主题对此项目完全有用:

  • Error handlers:如果您无法正确处理错误,则应用程序在运行时失败或向用户显示丑陋的追溯很高。为了避免这种情况,请阅读有关错误类型以及如何在烧瓶应用中处理它们的类型。
  • Logging:在测试和调试应用程序时,这是最重要的事情之一。对于软件开发人员来说,编写有意义且可读的日志是必须的。检查此主题以学习如何在Python中执行登录。
  • Intro to SQLAlchemy:当您决定要存储一些应用程序数据时,无论是任何用户信息还是对话历史记录,都需要与数据库进行通信。此主题向您介绍了Sqlalchemy的基础知识,该基础使使用数据库的工作变得容易方便。

Hyperskill是一个基于项目的学习平台,提供个性化课程和各种曲目,可帮助来自不同背景的人们通过在线教育获得与市场相关的技能。这不仅为您提供了坚实的理论,而且可以立即练习技能 - 实践使学习变得完美。


您发现这篇文章有帮助吗?击中拍手,然后跟随Hyperskill和我稍后阅读更多内容:)