LlamaIndex YouTube-Transkripte: Frage über eine Reihe von Videos

Eine LlamaIndex YouTube-Transkript-Pipeline ist drei Schritte: Transkripte als Document Objekte abrufen, einen VectorStoreIndex bauen, Fragen über alle Videos auf einmal stellen. Hier ist das Ganze in einem Skript, plus der eine Chunking-Fallstrick, der die meisten ersten Versuche ruiniert.
Transkripte als Dokumente abrufen
Ich führe youtube2text.org, eine REST-API, die YouTube-Transkripte als JSON zurückgibt — kein Kratzen von deiner eigenen IP, was zählt, wenn das überall sonst als auf deinem Laptop läuft (siehe warum lokale Scraper blockiert werden, wenn du neugierig bist). Ein GET pro Video:
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"]},
))
Für einen Schlüssel melde dich mit Google bei youtube2text.org/app/keys an, oder hole den gemeinsamen Demo-Schlüssel von GET https://youtube2text.org/api/demo-key (5 Videos/Monat pro IP — gut für dieses Drei-Video-Beispiel, nicht für einen Kanal).
Der Chunking-Fallstrick: Auto-Untertitel haben keine Interpunktion
Der Standard-Node-Parser von LlamaIndex ist SentenceSplitter, der Chunk-Grenzen an Satzendenungen findet. Manuell hochgeladene Untertitel haben diese. Automatisch generierte Untertitel haben oft nicht — du bekommst vierzig Minuten klein geschriebenen Text ohne Punkte, SentenceSplitter findet nichts zu splitten, und du endest mit aufgeblähten, unbeholfenen Chunks.
Token-basiertes Splitten umgeht das Problem vollständig:
from llama_index.core.node_parser import TokenTextSplitter
splitter = TokenTextSplitter(chunk_size=512, chunk_overlap=64)
512 Token mit 64 Überlappung war der Sweet Spot in meinen Tests: groß genug, dass ein Chunk einen kompletten Gedanken trägt, klein genug, dass Retrieval präzise bleibt.
Baue den Index und frage ihn ab
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"]})')
Weil jedes Document videoId und title in Metadaten trägt, weiß jeder abgerufene Chunk, von welchem Video er kam — source_nodes gibt dir funktionierende Links zurück zu den Quellen. Das verwendet, was immer Embedding-Modell und LLM du in Settings konfiguriert hast; das Standard-OpenAI-Setup funktioniert out-of-the-box, wenn OPENAI_API_KEY gesetzt ist.
Die Begrenzung, die du kennen solltest
Die API gibt Transkripte als reinen Text ohne Zeitstempel zurück, daher werden deine Zitate auf ein Video aufgelöst, nicht auf einen Moment darin. "Dieser Anspruch kam aus dem Q3-Ergebnis-Breakdown-Video" ist erreichbar; "bei 14:32" nicht. Für die meisten Q&A-Use-Cases ist Video-Level-Zuschreibung genug, und ehrlich gesagt, Chunk-Text plus ein Video-Link bekommt eine Person zum richtigen Ort in unter einer Minute.
Beachte auch die zwei Fehlercodes, die es wert sind, in der Fetch-Schleife zu handhaben: TRANSCRIPT_UNAVAILABLE (404, Video hat keine Untertitel — überspringe es) und RATE_LIMIT_EXCEEDED (429, kommt mit retryAfterSeconds im Fehler-Body).
Skalieren über eine Handvoll Videos hinaus
Drei Videos sind eine Demo. Für einen ganzen Kanal du willst den RSS-Feed für Video-Entdeckung, Kontingent-bewusste Abruf, und einen persistenten Vector Store — ich decke diese Pipeline in RAG über einen YouTube-Kanal ab. LangChain-Benutzer statt? Gleiche Loader-Muster, anderes Framework.
Kostenlose Stufe covers 5 Videos pro Monat; der Pro-Plan macht 500 für $9,99, was bequem die meisten Kanäle indexiert. Schlüssel bei youtube2text.org/app/keys.