Сделаем Телеграм бота которому можно кинуть ссылку на YouTube видео и поговорить с ним о содержимом этого видео.
За основу возьмем бота работающего на Llama 3-70b из моей прошлой статьи. Можно использовать и любую другую языковую модель включая ChatGPT или локальную запущенную на Ollama.
Что нужно
Создать Телеграм бота и получить его токен (как это сделать, смотрите инструкции на просторах интернета, например здесь).
Зарегистрироваться на 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)
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 с договором и просим переписать третий параграф :)
evg_dc Автор
03.06.2024 21:25+1с документами уже RAG начинается с базой данных и прочей пургой, кода будет слишком много
akaz_zaka
03.06.2024 21:25+1С документами надо Langchain и еще желательно гибридный поиск. Там проблема больше саму базу сгенерировать, сам поиск по ней небольшое число строк в код добавляет.
Pol1mus
03.06.2024 21:25+1Используй gemini. Там до 4млн русских символов можно в запрос засунуть. И получить в ответ 30т русских символов. 1млн токенов в минуту бесплатно.
BURJUY
03.06.2024 21:25Попробуем это вариант, но больше хотелось версию бота с возможностью искать по поисковикам duckGo и google. В прошлой статье упоминали что планируете выложить код...
shchepin
Вспомнилась классика :)