Как подружить Llama-3 и YouTube имея всего 40 строк кода

Сделаем Телеграм бота которому можно кинуть ссылку на YouTube видео и поговорить с ним о содержимом этого видео.

За основу возьмем бота работающего на Llama 3–70b из моей прошлой статьи. Можно использовать и любую другую языковую модель включая ChatGPT или локальную запущенную на Ollama.

Что нужно

  1. Создать Телеграм бота и получить его токен (как это сделать, смотрите инструкции на просторах интернета, например здесь).

  2. Зарегистрироваться на Groq и получить api key (нужен VPN).
    Заходим по этой ссылке, регистрируем аккаунт, генерим ключ. Платежная карта не требуется.

Код

# pip install pyTelegramBotAPI groq youtube-transcript-api
import telebot
import sys
from groq import Groq
from urllib.parse import urlparse, parse_qs
from youtube_transcript_api import YouTubeTranscriptApi
from youtube_transcript_api.formatters import TextFormatter

client = Groq(api_key="GROQ_API_KEY")
bot = telebot.TeleBot("TELEGRAM_BOT_TOKEN")
messages = []


@ bot.message_handler(content_types=['text'])
def get_text_messages(message):
    global messages
    messages.append({"role": 'user', "content": f"{message.text}\n\nОтветь на русском языке."})
    video_id = transcription = None
    for word in message.text.split():
        parsed_url = urlparse(word)
        if parsed_url.netloc.find('youtu.be') != -1:
            video_id = parsed_url.path.replace("/", "")
        if parsed_url.netloc.find('youtube') != -1:
            video_id = parse_qs(parsed_url.query)['v'][0]
        if video_id:
            transcript = YouTubeTranscriptApi.get_transcript(video_id, languages=('ru', 'en'))
            transcription = TextFormatter().format_transcript(transcript)
        else:
            continue
        if transcription:
            messages.append({"role": "function", "name": "get_youtube_transcription",
                            "content": f"YouTube transcription:\n\n{transcription}"})
    if len(messages) > 6:  # 6 - это количество сообщений в памяти, можно менять
        messages = messages[-6:]
    response = client.chat.completions.create(model='llama3-70b-8192', messages=messages, temperature=0)
    bot.send_message(message.from_user.id, response.choices[0].message.content)
    messages.append({"role": 'assistant', "content": response.choices[0].message.content})


bot.polling(none_stop=True, interval=0, timeout=0)

Замените в коде GROQ_API_KEY на api ключ полученный в Groq и TELEGRAM_BOT_TOKEN на токен телеграм бота, все должно быть в кавычках.

Как это работает

После получения сообщения от пользователя ищем в тексте сообщения ссылку на YouTube видео. Делаем это перебирая все слова и проверяя их на наличие URL. Если ссылка на видео найдена, используя библиотеку youtube-transcript-api забираем транскрипцию.

Далее, полученную транскрипцию подставляем языковой модели в виде сообщения от функции. Здесь мы немного обманываем модель, потому что такой функции нет, но лучше делать так чем ставить транскрипцию в системное сообщение. Модель заточена под работу с функциями и все правильно поймет.

Как и в предыдущей версии, бот будет запоминать последние 6 сообщений и поддерживать диалог.

Тестируем

Запускаем скрипт и в Телеграм боте задаем вопрос со ссылкой на видео:

bb6dfc3dea3e0e1ac97704a233dd6705.png

Моя версия бота

Посмотреть как это работает можно в YouTubeGPT.

a4121e2cccdc098ecb3a7e58dffb2a0f.png

Еще есть НашGPT — это как ChatGPT только модель Llama 3–70b.

© Habrahabr.ru