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

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はメタデータにvideoIdとtitleを運ぶため、各取得されたチャンクはどのビデオから来たかを知ります―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にあります。