برنامه نویسی

ربات خلاصه کننده مکالمه تلگرام با ChatGPT و Flask (Quart)

در حال حاضر همه در مورد ChatGPT صحبت می کنند. هوش مصنوعی فوق‌العاده هوشمند حتی چند ماه پس از انتشار، اینترنت را خیره می‌کند. وجود ChatGPT در وب سایت بسیار عالی است، با این حال، لذت واقعی زمانی شروع می شود که دسترسی به API را به دست آورید. این به شما فرصتی عالی می دهد تا هوش مصنوعی هوشمند را در پروژه ها و برنامه های خود ادغام کنید تا آنها را قدرتمندتر کنید و ویژگی های شگفت انگیزی را معرفی کنید.

این مقاله راهنمای ایجاد ربات تلگرام خود و ادغام ChatGPT با آن، با استفاده از کتابخانه پایتون OpenAI را برای شما به ارمغان می‌آورد. این ممکن است ساده‌ترین کار به نظر برسد، اما بیایید با معرفی دستور summarize، خلاصه‌ای از چندین پست در چت را به شما اضافه کنیم.


این پست فرض می کند که شما دانش اولیه پایتون را دارید. با این حال، توصیه می‌کنم برای کسب اطلاعات بیشتر در مورد Python و توسعه برنامه‌های وب با Flask، تراک‌های Python و Flask Hyperskill را بررسی کنید.

تنظیم همه چیز

قبل از پرش مستقیم به کد، باید مقدماتی را برای به دست آوردن تمام دسترسی های مورد نیاز انجام دهید.

  1. ربات خود را در تلگرام ثبت کنید و توکن دسترسی به تلگرام را بازیابی کنید (با استفاده از botfather@ در تلگرام)
  2. به API هسته تلگرام دسترسی پیدا کنید و آن را بازیابی کنید api_hash و app_id.
  3. در OpenAI ثبت نام کنید و رمز دسترسی API را بازیابی کنید.

آن رشته های مخفی را نجات دهید و با جان خود از آنها محافظت کنید. هیچ غریبه ای نباید به آنها دسترسی داشته باشد: این ممکن است منجر به نقض امنیتی شود.

نوشتن اسکلت

توجه داشته باشید: کد کامل پروژه نهایی (تقسیم به مراحل با commits) در GitHub من موجود است، لطفاً برای جزئیات به اینجا مراجعه کنید: https://github.com/yellalena/telegram-gpt-summarizer

کتابخانه های پایتونی که باید برای این مرحله نصب کنید: flask، pydantic، requests و pyngrok.

بیایید با نوشتن کد ربات بسیار ابتدایی تلگرام شروع کنیم. باید پیام ها را از چت دریافت کند و بتواند به آنها پاسخ دهد.
اول از همه – یک دایرکتوری برای پروژه خود ایجاد کنید و یک محیط مجازی پایتون را مقداردهی اولیه کنید. ضمناً اگر از PyCharm استفاده کنید یک محیط مجازی برای شما ایجاد می کند.

اسکرین شات PyCharm

در این مرحله، هدف به چهار بخش تقسیم می شود:

  1. یک برنامه Flask ساده با یک مسیر ریشه برای مدیریت وب هوک با پیام های تلگرام ایجاد کنید.
  2. یک کلاس برای ربات تلگرام ایجاد کنید و آن را قادر به ارسال پیام به یک چت کنید.
  3. برنامه را برای اینترنت بزرگ قابل مشاهده کنید.
  4. آدرس اپلیکیشن را در تلگرام ثبت کنید.

این چیزی است که main.py در این نقطه به نظر می رسد:

app = Flask(__name__)

@app.route("https://dev.to/", 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 فایل، که توکن‌های ما و سایر اطلاعات مفید را از متغیرهای محیط صادر شده جمع‌آوری و ذخیره می‌کند.
  • تلگرام به‌روزرسانی‌ها را به‌عنوان یک JSON تودرتو ارسال می‌کند، بنابراین بیایید مجموعه‌ای از مدل‌های pydantic ایجاد کنیم تا ورودی را تجزیه کنیم تا بعدا راحت‌تر باشیم.
  • برای نمایش برنامه در وب، از ngrok استفاده می کنم. این پورت خاص لوکال هاست شما را برای دیگران قابل مشاهده می کند و به آن یک آدرس عمومی موقت می دهد. به همین دلیل مهم است که مطمئن شوید همان پورتی را که برنامه Flask خود را روی آن اجرا می کنید، در معرض دید قرار دهید.
  • در نهایت، من ربات را مقداردهی اولیه می‌کنم و یک webhook را روی URL عمومی ngrok تنظیم می‌کنم، به طوری که ربات می‌داند که هر زمان که پیامی دریافت کرد باید با این URL ارتباط برقرار کند.

برای راه اندازی وب هوک، باید درخواستی را به آدرس 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()
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون که همه چیز آماده است (فراموش نکنید که برخی از کدهای اصلی را حذف کرده ام، می توانید آن را در مخزن پیدا کنید)، توکن ربات خود را در یک متغیر محیطی صادر کنید و روی “Run” کلیک کنید!

اسکرین شات چت تلگرام
آری زنده است!

اضافه کردن مغز

شگفت انگیز است، قدم بعدی در حال حاضر باید افزودن کمی هوش به ربات هوشمند ما باشد. یک lib رسمی OpenAI برای پایتون با استفاده از pip نصب کنید: pip install openai.
پس از آن، ما قادر خواهیم بود یک کلاس کمکی برای ارتباط با هوش مصنوعی ایجاد کنیم.

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 مدل های مختلفی را برای استفاده برای پروژه خود پیشنهاد می کند. البته محبوب ترین آنها GPT ها هستند. GPT-4 یکی از مواردی است که اخیراً بیشترین نویز را ایجاد کرده است، اما (و به همین دلیل) اکنون دسترسی محدودی دارد، بنابراین برای اهداف آزمایش آسان تر، به جای آن GPT-3 را انتخاب می کنم. چیز مهمی نیست، همیشه می توانید هر کدام را که بیشتر دوست دارید انتخاب کنید، فقط نام رشته ای را که به کمک کننده منتقل می کنید تغییر دهید.

فراموش نکنید که اضافه کنید OPENAI_TOKEN ویژگی پیکربندی و اجازه دهید از کمک کننده در کد استفاده کنیم.

البته ابتدا آن را در main() روش:

راه اندازی راهنما OpenAI در اصلی

و سپس این مرد را از تابع view فراخوانی کنید، دقیقاً مانند این:

response = app.openai_helper.get_response(update.message.text)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اوهوش! جادو اتفاق می افتد!

اسکرین شات چت تلگرام با پاسخ OpenAI

خلاصه کنید!

کتابخانه های پایتون برای نصب برای این مرحله: quart، telethon.

شرط می بندم که آنجا بوده اید – به گپ با گروهی از دوستانتان اضافه شده اید که دوست دارند در مورد چیزهای جالب بحث کنند یا اخبار یا ایده هایی را به اشتراک بگذارند. شما کارهای زیادی برای انجام دادن داشته اید و تمام سرگرمی های چت را از دست داده اید. چیز بعدی که می بینید – صد پیام خوانده نشده وجود دارد. آیا خوب نیست اگر کسی بتواند به جای خواندن همه آن، یک مرور مختصر از آنچه در آنجا اتفاق افتاده است به شما ارائه دهد؟ خوب، GPT می تواند این کار را انجام دهد، البته. فقط باید بپرسیم

این جایی است که سرگرم کننده آغاز می شود. بنا به دلایلی، API ربات تلگرام به ربات‌ها اجازه نمی‌دهد تا تاریخچه مکالمه را بخوانند. ما webhooks داریم و متد ()GetUpdates صریح را داریم، اما آنها فقط در صورتی کار می کنند که کسی ربات را ذکر کرده باشد. گزینه دیگر این است که اگر ربات به‌عنوان ادمین اضافه شود، تمام به‌روزرسانی‌ها را دریافت کند، اما این رویکرد دارای چند معایب نیز هست. ابتدا باید کل فضای ذخیره سازی پیام ها را تنظیم کنید. دوم، اگر بخواهید مکالمه ای را که قبل از اضافه شدن ربات به چت در جریان بود، خلاصه کنید؟ مورد ما نیست

بدیهی است که این دلیلی برای تسلیم شدن نیست. تلگرام Core API را ارائه می کند و این می تواند به بازیابی تاریخچه چت کمک کند. تنها چیزی که وجود دارد این است که ناهمزمان است. و محبوب ترین کتابخانه پایتون برای آن، Telethon، نیز ناهمزمان است. و Flask همگام است. اوه اوه

و اینجاست که کوارت اسرارآمیز ذکر شده در عنوان روی صحنه می آید. Quart یک Flask API است که با استفاده از وب سرور async، await و ASGI (به جای همزمان و WSGI) دوباره پیاده سازی شده است. مزیت اصلی آن در مورد ما این است که نحو اساساً یکسان است. بیایید یک سازماندهی مجدد کد سریع انجام دهیم.

تغییرات ساده هستند. ابتدا، واردات را تنظیم کنید و هر کدام را تغییر دهید فلاسک به کوارت:
توضیحات تصویر

سپس، همه روش های برنامه وب را ناهمگام کنید. و منتظر تمام ویژگی ها و روش هایی باشید که اکنون ناهمزمان شده اند:
توضیحات تصویر

اگر در مورد Python async مطمئن نیستید، توصیه می‌کنم این بخش از مستندات Telethon را در مبانی asyncio بررسی کنید.

من همچنین ngrok و TelegramBot را برای راه اندازی آنها به روشی جداگانه و تزئین شده منتقل کرده ام @app.before_serving. این یک دکوراتور داخلی Quart است که اطمینان حاصل می کند که همه چیز در این روش قبل از راه اندازی و ارائه برنامه وب اجرا می شود. لازم است تا ربات و کمک کننده هر دو در همان حلقه رویداد به عنوان برنامه اصلی مقداردهی شوند.

@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 است که برای اجرای Quart به صورت ناهمزمان استفاده می شود و اگر بخواهیم پورت یک برنامه را مشخص کنیم، باید آن را در یک پیکربندی انجام دهیم. توجه داشته باشید که main() اکنون نیز async است و با استفاده از 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())
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خودشه. بیایید بررسی کنیم که آیا تغییرات برای ربات ما به راحتی انجام شده است یا خیر. اجرا، پیامک، وارد کنید:
توضیحات تصویر

داره حرف میزنه عالی. اکنون، تاریخچه چت را برای خلاصه کردن هوش مصنوعی دریافت کنید. بیایید از Core API تلگرام با کمک Telethon lib استفاده کنیم. در آنجا، به دو رشته مخفی آخری که دارید نیاز خواهیم داشت – آنها را به عنوان متغیرهای محیطی نیز صادر کنید.

TelegramBot تغییرات جزئی در __init__ روش: باید یک روش جدید داشته باشد core_api_client ویژگی که کلاینت Telethon را مقداردهی اولیه می کند و البته، باید رمزهای Core API را به عنوان آرگومان منتقل کنید.
توضیحات تصویر

و این روش کوچک مسئول بازیابی تاریخچه خواهد بود:

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)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

get_messages Telethon دارای پارامترهای بسیار متفاوت دیگری است که می توانید در کنار آنها عبور دهید limit آنهایی که به عنوان مثال، می تواند تاریخچه را معکوس کند یا به جای تعداد پیام ها، آن را بر اساس تاریخ محدود کند. بازی با آن سرگرم کننده است و می توانید ربات خود را به هر شکلی که دوست دارید تنظیم کنید.

خوب، ما تقریباً تمام شدیم. آخرین لمس اضافه کردن یک گزینه خلاصه سازی به کنترل کننده وب هوک است. دریافت پاسخ به این صورت است:

# 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)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ببینیم گل میده!

بعد از اینکه برای اولین بار برنامه را اجرا کردید، از شما می خواهد که وارد تلگرام شوید. اشکالی ندارد: برای دسترسی به تاریخچه پیام و سایر داده های خصوصی که Core API به ما ارائه می دهد، لازم است. همان شماره تلفنی که برای دسترسی به Telegram Core API استفاده کردید را وارد کنید. شما یک کد تأیید را در داخل برنامه خود دریافت خواهید کرد و پس از آن می توانید بروید.
توضیحات تصویر

ربات را به مکالمه با دوستان اضافه کنید و خلاصه بخواهید:
توضیحات تصویر

خودشه! لیست بی‌پایانی از چیزهایی وجود دارد که می‌توانید با آن‌ها ادامه دهید: به غیر از متن، انواع دیگری از پیام‌ها را پردازش کنید، تعدادی پیام را برای خلاصه کردن از چت پیکربندی کنید، و غیره. این کار را انجام دهید و فراموش نکنید که کد خود را در GitHub فشار دهید. کد نویسی مبارک! 🙂

فراموش نکنید که برای ادامه یادگیری در مورد توسعه برنامه های کاربردی وب با پایتون و فلاسک، به وب سایت Hyperskill بروید. در اینجا پیوندهایی به چند موضوع وجود دارد که ممکن است دقیقاً برای این پروژه مفید باشد:

  • کنترل کننده خطا: اگر خطاها را به درستی مدیریت نکنید، احتمال زیادی وجود دارد که برنامه شما در زمان اجرا از کار بیفتد یا ردیابی های زشتی را به کاربر نشان دهد. برای جلوگیری از آن، در مورد انواع خطاها و نحوه مدیریت بهتر آنها در برنامه Flask مطالعه کنید.

  • ورود به سیستم: این یکی از مهمترین چیزها در مورد آزمایش و اشکال زدایی برنامه شما است. نوشتن گزارش های معنی دار و خوانا برای یک توسعه دهنده نرم افزار ضروری است. برای یادگیری نحوه ورود به سیستم در پایتون، این مبحث را بررسی کنید.

  • مقدمه ای برای SQLAlchemy: وقتی تصمیم می گیرید که می خواهید برخی از داده های برنامه را ذخیره کنید، خواه اطلاعات کاربر یا تاریخچه مکالمه باشد، باید با پایگاه داده ارتباط برقرار کنید. این مبحث شما را با اصول اولیه SQLAlchemy آشنا می کند که کار با پایگاه های داده را آسان و راحت می کند.

Hyperskill یک پلت فرم یادگیری مبتنی بر پروژه است که یک برنامه درسی شخصی و مسیرهای متنوعی را ارائه می دهد تا به افراد با پیشینه های مختلف کمک کند تا مهارت های مرتبط با بازار را از طریق آموزش آنلاین به دست آورند. این نه تنها به شما قطعات تئوری محکمی می دهد، بلکه به شما امکان می دهد فوراً مهارت ها را تمرین کنید – و تمرین یادگیری را کامل می کند.


آیا این پست برای شما مفید بود؟ clap را بزنید و Hyperskill و من را دنبال کنید تا بعداً بیشتر آنها را بخوانید 🙂

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا