HomeBlogTranscribePlansAPI Keys

LlamaIndex YouTube トランスクリプト: ビデオのセットをクエリする

複数のYouTube ビデオトランスクリプトから構築されたLlamaIndex ベクトルインデックス(質問に答える)

LlamaIndex YouTubeトランスクリプトパイプラインは3つのステップです: 文字起こしをDocumentオブジェクトとしてフェッチし、VectorStoreIndexを構築し、すべてのビデオ間で一度に質問を尋ねます。ここに全体が1つのスクリプトにあります。プラス、ほとんどの最初の試みを台無しにする1つのチャンキングの落とし穴。

文字起こしをドキュメントとしてフェッチ

youtube2text.orgを実行します。YouTubeトランスクリプトをJSONとして返すREST API―独自のIPからのスクレイピングなし。これがラップトップ以外のどこかで実行される瞬間に重要です(ローカルスクレイパーがブロックされる理由を見てください。興味があれば)。ビデオあたり1つのGET:

import requests
from llama_index.core import Document, VectorStoreIndex

API_KEY = "yt_your_key_here"

VIDEOS = [
    "https://www.youtube.com/watch?v=VIDEO_ID_1",
    "https://www.youtube.com/watch?v=VIDEO_ID_2",
    "https://www.youtube.com/watch?v=VIDEO_ID_3",
]

def fetch_transcript(url: str) -> dict:
    resp = requests.get(
        "https://youtube2text.org/api/transcribe",
        params={"url": url},
        headers={"x-api-key": API_KEY},
        timeout=90,
    )
    resp.raise_for_status()
    return resp.json()["result"]

docs = []
for url in VIDEOS:
    r = fetch_transcript(url)
    docs.append(Document(
        text=r["content"],
        metadata={"videoId": r["videoId"], "title": r["title"]},
    ))

キーの場合、youtube2text.org/app/keysでGoogleサインインするか、GET https://youtube2text.org/api/demo-keyから共有デモキーをプルします(月5ビデオあたりIP―このビデオの例3つに問題ありませんが、チャネルではないです)。

チャンキングの落とし穴: 自動字幕には句読点がありません

LlamaIndexのデフォルトノードパーサーはSentenceSplitterで、文の終わりのチャンク境界を見つけます。手動アップロード字幕は持っています。自動生成字幕は頻繁にそれを持ちません―40分間の句読点のない小文字のテキストを取得し、SentenceSplitterは分割するものを見つけませんが、膨らんで奇妙なチャンクで終わります。

トークンベースの分割は問題を完全に回避します:

from llama_index.core.node_parser import TokenTextSplitter

splitter = TokenTextSplitter(chunk_size=512, chunk_overlap=64)

512トークンと64オーバーラップが私のテストの甘い場所: チャンクが完全な考えを運ぶのに十分大きく、検索が正確なままであるのに十分小さい。

インデックスを構築してクエリします

index = VectorStoreIndex.from_documents(docs, transformations=[splitter])
query_engine = index.as_query_engine(similarity_top_k=4)

response = query_engine.query("What did they say about pricing changes?")
print(response)

for node in response.source_nodes:
    meta = node.metadata
    print(f'- {meta["title"]} (https://www.youtube.com/watch?v={meta["videoId"]})')

すべてのDocumentはメタデータにvideoIdtitleを運ぶため、各取得されたチャンクはどのビデオから来たかを知ります―source_nodesはソースへの動作リンクを与えます。これはSettingsで設定したどのような埋め込みモデルとLLMを使用しても構いません。デフォルトのOpenAIセットアップはOPENAI_API_KEYが設定されていれば既に機能しています。

あなたが知っておくべき制限

API はタイムスタンプのないプレーンテキストとしてトランスクリプトを返すため、引用はビデオ内の瞬間ではなくビデオに解決します。「この主張はQ3収益内訳ビデオから来ました」は達成可能; 「14:32」はそうではありません。ほとんどのQ&Aユースケースでビデオレベルの属性で十分であり、正直なところ、チャンクテキストとビデオリンクは人間を1分以内に正しい場所に取得します。

また、フェッチループで処理する2つのエラーコードに注意してください: TRANSCRIPT_UNAVAILABLE(404、ビデオに字幕がない―スキップ)とRATE_LIMIT_EXCEEDED(429、エラー本体のretryAfterSecondsを付属)。

ビデオ一握りを過ぎてスケーリング

3つのビデオはデモです。チャネル全体については、ビデオ検出用のRSSフィード、クォーター認識フェッチ、および永続ベクトルストアが必要です―YouTubeチャネルのRAGでそのパイプラインをカバーしています。LangChainユーザーの代わりに? 同じローダーパターン、異なるフレームワーク

無料ティアは月5ビデオをカバーし、プロプランは500を$9.99で行います。ほとんどのチャネルのインデックスを快適に行います。キーはyoutube2text.org/app/keysにあります。