יום 10 - פיתוח סוכן AI בתור בוט לטלגרם
עוד ממשק משתמש מעניין לבוטים הוא אפלקיציות המסרים בטלפון. למרות שכולם אוהבים לדבר בווטסאפ כתיבת בוטים לטלגרם זה הרבה יותר קל, נגיש וחינמי ולכן הדוגמה היום היא על טלגרם. בואו נראה איך לכתוב בוט AI שגם ממשיך שיחות ותמיד זמין עבורכם בטלגרם.
1. איך לכתוב בוט לטלגרם
אני חוזר לפייתון ובשביל לכתוב בוט לטלגרם נוכל להשתמש בספריה python-telegram-bot. זו דוגמה לבוט טלגרם ראשון מתוך התיעוד שלהם:
from telegram import ForceReply, Update
from telegram.ext import Application, CommandHandler, ContextTypes, MessageHandler, filters
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
"""Send a message when the command /start is issued."""
user = update.effective_user
await update.message.reply_html(
rf"Hi {user.mention_html()}!",
reply_markup=ForceReply(selective=True),
)
async def echo(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
"""Echo the user message."""
await update.message.reply_text(update.message.text)
def main() -> None:
token = os.environ["TELEGRAM_BOT_TOKEN"]
application = Application.builder().token(token).build()
application.add_handler(CommandHandler("start", start))
application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo))
application.run_polling(allowed_updates=Update.ALL_TYPES)
if __name__ == "__main__":
main()
בשביל שהבוט יעבוד עליי להגדיר משתנה סביבה בשם TELEGRAM_BOT_TOKEN ובו לכתוב את הטוקן של הבוט שלי. לכל בוט בטלגרם יש טוקן שמזהה אותו ואתם מקבלים את הטוקן ביצירת בוט חדש.
איך יוצרים בוט חדש אתם שואלים? הכי קל בעולם, שולחים הודעה ל @BotFather עם הפקודה /newbot עונים על כמה שאלות ומקבלים טוקן. את הטוקן שימו במשתנה סביבה ואז תוכלו להריץ את הבוט בקוד שלמעלה. תראו שזה עובד ואתם יכולים לכתוב לבוט משהו ולקבל בחזרה את אותו טקסט ואז נמשיך לחבר את הסוכן.
2. שילוב AI
בשביל להפוך בוט טלגרם לסוכן AI יש לנו שני אתגרים:
סוכן AI צריך להכיר את ההודעות הישנות. למדנו איך לשמור הודעות ישנות עם אוביקט Session ואפילו איך לשמור את ה sessions האלה בבסיס נתונים. נרצה כזה בסיס נתונים להודעות מהבוט שלנו.
לסוכן AI יכול לקחת זמן לענות. בעבודה ב web ראינו איך להשתמש בממשק הזרמת טקסט כדי להראות את הטקסט נכתב בזמן שהוא נוצר. בטלגרם אין מנגנון הזרמה אבל כן אפשר להציג את האייקון שאומר שהבוט כותב.
נשלב את שני הדברים לפונקציה echo:
async def echo(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
"""Echo the user message."""
chat_id = update.effective_chat.id
session_id = f"chat_{chat_id}"
session = SQLiteSession(session_id, "bot.sql")
await update.message.reply_chat_action(ChatAction.TYPING)
result = await Runner.run(
agent,
update.message.text,
session=session
)
await update.message.reply_text(result.final_output)
כל שיחה בטלגרם מגיעה עם chat_id שמזהה את השיחה. זה בדיוק מזהה טוב לשיחה שלי בבסיס הנתונים. אני מגדיר session מתוך אותו chat_id ושומר אותו בבסיס נתונים בקובץ בשם bot.sql. הפעולה:
await update.message.reply_chat_action(ChatAction.TYPING)
מגדירה לטלגרם שצריך להציג שהבוט מקליד תשובה ובאופן אוטומטי פעולה זו תסתיים כשנשלח את התגובה המסודרת אחרי שהסוכן יסיים לחשב אותה.
3. עכשיו אתם
בעיה אחת בקוד הזה היא שה Sessions יהיו מאוד ארוכים לאורך זמן. ככל שנדבר יותר עם ה AI כך יהיו יותר הודעות ב Session ואז כל הודעה לסוכן תכיל יותר מידע (יותר הודעות ישנות), מה שיגרום למחיר של כל הודעה לעלות ככל שהשיחה מתארכת.
חקרו את בסיס הנתונים בקובץ bot.sql שנוצר. חשבו - איך הייתם מגבילים את מספר ההודעות ב session? כמה הודעות אחרונות לדעתכם כדאי לשמור או לשלוח?