Сделаем Телеграм бота которому можно кинуть ссылку на 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 сообщений и поддерживать диалог.

Тестируем

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

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

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

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

Комментарии (9)


  1. shchepin
    03.06.2024 21:25
    +8

    Вспомнилась классика :)

    <@insomnia> Нужно выполнить всего три команды, чтобы поставить Gentoo

    <@insomnia> cfdisk /dev/hda && mkfs.xfs /dev/hda1 && mount /dev/hda1 /mnt/gentoo/ && chroot /mnt/gentoo/ && env-update && . /etc/profile && emerge sync && cd /usr/portage && scripts/bootsrap.sh && emerge system && emerge vim && vi /etc/fstab && emerge gentoo-dev-sources && cd /usr/src/linux && make menuconfig && make install modules_install && emerge gnome mozilla-firefox openoffice && emerge grub && cp /boot/grub/grub.conf.sample /boot/grub/grub.conf && vi /boot/grub/grub.conf && grub && init 6

    <@insomnia> это первая


  1. Pol1mus
    03.06.2024 21:25

    Кучу инфы о видео на ютубе в формате json можно получить командой yt-dlp -J URL

    В питоне коде как то так

        proc = subprocess.run(['yt-dlp', '--skip-download', '-J', video_url], stdout=subprocess.PIPE)
        output = proc.stdout.decode('utf-8')
        info = json.loads(output)
        duration = info['duration']

    В этом словаре есть почти всё, описание, теги, просмотры итп. Список субтитров тоже.

    Работает и в линуксе и в венде одинаково если установлен yt-dlp.

    зы Следующий бот - то же самое но вместо ютуб субтитров - файлы с любыми документами какие сможет перевести в текст универсальная открывашка (pandoc например). Кидаем в бота docx с договором и просим переписать третий параграф :)


    1. evg_dc Автор
      03.06.2024 21:25
      +1

      с документами уже RAG начинается с базой данных и прочей пургой, кода будет слишком много


      1. akaz_zaka
        03.06.2024 21:25
        +1

        С документами надо Langchain и еще желательно гибридный поиск. Там проблема больше саму базу сгенерировать, сам поиск по ней небольшое число строк в код добавляет.


        1. sneg2015
          03.06.2024 21:25

          Там больше проблема найти бесплатную нормальную базу для RAG найти.


          1. DrrRos
            03.06.2024 21:25

            Postgres умеет в vector store


          1. evg_dc Автор
            03.06.2024 21:25

            ChromaDB отлично работает, хранит всё в SqLite3, никаких проблем.


      1. Pol1mus
        03.06.2024 21:25
        +1

        Используй gemini. Там до 4млн русских символов можно в запрос засунуть. И получить в ответ 30т русских символов. 1млн токенов в минуту бесплатно.


  1. BURJUY
    03.06.2024 21:25

    Попробуем это вариант, но больше хотелось версию бота с возможностью искать по поисковикам duckGo и google. В прошлой статье упоминали что планируете выложить код...