見出し画像

LangchainのYoutubeLoaderを使ってYoutubeリサーチをAIにさせてみた

はじめに

LangchainのWebBaseLoaderがとても便利だったので、他のDocumentLoaderはどんな感じか試すシリーズ第一弾です。今回はdiscordのbotを使っていますがdiscord bot開発の説明は省きます。

1.準備

pip install --upgrade youtube-transcript-api
pip install --upgrade pytube
pip install --upgrade langchain_community
pip install discord

読み込むYoutube動画はこちらの動画。


2.discordから入力されたURLの内容をYoutubeLoaderで読み込む

from langchain_community.document_loaders import YoutubeLoader

loader = YoutubeLoader.from_youtube_url(youtube_url=url, add_video_info=True,language=["en"])
content = loader.load()
script = content[0].page_content

日本の動画の場合はlanguage=["ja"]にする必要あり。字幕を読み込んでいるので字幕が対応していない言語は読み込めないので注意。

3.プログラム全文と動作の様子

import os
import discord
from discord.ext import commands
from dotenv import load_dotenv
from langchain_community.document_loaders import YoutubeLoader
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
import re

# メッセージからURLと質問を抽出する関数
def extract_url_and_question(message_content):
        # URLのパターンを定義
        url_pattern = r'https?://[^\s]+'
        # URLを検索
        url_match = re.search(url_pattern, message_content)
        if url_match:
            url = url_match.group()
            # URLをメッセージから取り除き、残りの部分を質問として扱う
            question = message_content.replace(url, '').strip()
            return url, question
        else:
            # URLが見つからない場合は、Noneを返す
            return None, message_content.strip()

# 環境変数をロード
load_dotenv()
TOKEN = os.getenv("TOKEN")
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")

# 使用するモデルとOpenAIの設定
model = "gpt-4-0125-preview"
llm = ChatOpenAI(model=model)
output_parser = StrOutputParser()
prompt = ChatPromptTemplate.from_messages([
    ("system","""
    あなたは動画のスクリプトを読み込んでユーザーの質問に回答するGPTです。
    {scripts}
    """),
    ("user","""
    Q:
    {input}
    """)
])

# Botの設定
bot = commands.Bot(command_prefix="!",intents=discord.Intents.all())

# Botが準備完了したときのイベント
@bot.event
async def on_ready():
    print("Bot is ready!")

# メッセージを受け取ったときのイベント
@bot.event
async def on_message(message: discord.Message):

    if message.author.bot:
        return

    # メッセージからURLと質問を抽出
    url, question = extract_url_and_question(message.content)
    if url:
        # YouTubeのURLから動画のスクリプトをロード
        loader = YoutubeLoader.from_youtube_url(youtube_url=url, add_video_info=True,language=["en"])
        content = loader.load()
        script = content[0].page_content
        # プロンプト、LLM、出力パーサーをチェーンしてレスポンスを生成
        chain = prompt | llm | output_parser
        response = chain.invoke({"scripts":script,"input":question})
        # レスポンスをメッセージとして返信
        await message.reply(response)

# Botを起動
bot.run(TOKEN)

処理の流れ

1.discordのbotを起動
2.メッセージを受信したときにurlと質問を分ける
3.urlの内容を読み込む
4.promptテンプレートに読み込んだ内容と質問を挿入して回答をgpt-4-turboモデルで生成
5.回答をdiscordに返信

実際の動作の様子

あとがき

40分程の長尺動画を読み込ませたところ20000文字辺りで止まっていたので、それが何の上限か解除できるか要検証。英語の動画は文字起こしの性能が良いのか回答の精度が良い感じの印象でした。

参考記事

https://python.langchain.com/docs/integrations/document_loaders/youtube_transcript


この記事が気に入ったらサポートをしてみませんか?