Pemuat Transkrip YouTube LangChain yang Selamat Diproduksi

Setiap tutorial transkrip YouTube LangChain menunjukkan tiga baris yang sama: YoutubeLoader.from_youtube_url(), muat, selesai. Kemudian Anda digunakan ke box cloud dan itu diam-diam mengembalikan tidak ada yang. Di bawah ini adalah pemuat yang mengembalikan objek Document yang tepat dari API yang dihosting alih-alih — sekitar 20 baris, ditambah rantai ringkasan untuk membuktikan itu berfungsi end to end.
Mengapa YoutubeLoader bawaan mati di server
YoutubeLoader tidak memanggil API resmi. Itu mengorek caption internal endpoints YouTube dari mesin apa pun kode Anda berjalan. Dari IP perumahan yang sebagian besar bekerja. Dari AWS, GCP, atau Hetzner IP mendapat diblokir atau disajikan respons kosong, karena YouTube memperlakukan traffic data center sebagai traffic bot. Saya menulis detail dalam mengapa scraping transkrip YouTube rusak di cloud IPs — versi singkatnya adalah bahwa kegagalan adalah lingkungan, jadi itu melewati setiap tes lokal dan mati tepat di mana hal itu penting.
youtube2text.org melakukan pengambilan di sisinya dan memberi Anda JSON, yang mengubah pemuat Anda menjadi panggilan HTTP biasa.
Pemuat
import requests
from langchain_core.documents import Document
API_KEY = "yt_your_key_here"
def load_youtube_transcript(url: str, max_chars: int = 150000) -> Document:
resp = requests.get(
"https://youtube2text.org/api/transcribe",
params={"url": url, "maxChars": max_chars},
headers={"x-api-key": API_KEY},
timeout=90,
)
resp.raise_for_status()
r = resp.json()["result"]
return Document(
page_content=r["content"],
metadata={
"videoId": r["videoId"],
"title": r["title"],
"pubDate": r["pubDate"],
"source": url,
},
)
API mengembalikan videoId, title, pubDate, content, contentSize, dan flag truncated. Teks transkrip masuk ke page_content, semuanya masuk ke metadata — bentuk yang persis downstream chains dan vector stores harapkan.
Tidak ada kunci lagi? Ambil kunci demo bersama:
curl https://youtube2text.org/api/demo-key
Itu terbatas pada 5 video per bulan per IP, yang cukup untuk menguji pemuat.
Rantai ringkasan
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains.combine_documents import create_stuff_documents_chain
llm = ChatOpenAI(model="gpt-4o-mini")
prompt = ChatPromptTemplate.from_template(
"Summarize this video transcript in five bullet points:\n\n{context}"
)
chain = create_stuff_documents_chain(llm, prompt)
doc = load_youtube_transcript("https://www.youtube.com/watch?v=dQw4w9WgXcQ")
print(chain.invoke({"context": [doc]}))
create_stuff_documents_chain mengisi seluruh transkrip ke dalam satu prompt, yang berfungsi karena maxChars menutup payload pada 150.000 karakter secara default. Untuk podcast yang panjang di model konteks kecil, berikan maxChars lebih rendah ke pemuat atau beralih ke pola map-reduce.
Apa yang harus ditangani dalam kode nyata
Dua mode kegagalan layak ditangkap secara eksplisit. Video dengan caption dinonaktifkan mengembalikan HTTP 404 dengan kode kesalahan TRANSCRIPT_UNAVAILABLE — tidak ada retry atau library swap yang memperbaikinya, teks tidak ada. Dan RATE_LIMIT_EXCEEDED (429) termasuk retryAfterSeconds dalam kesalahan JSON, jadi baca dan kembali alih-alih mengganggu:
if resp.status_code == 429:
wait = resp.json()["error"].get("retryAfterSeconds", 60)
Satu batasan jujur: content adalah teks biasa tanpa timestamp. Itu baik untuk ringkasan dan pengambilan, tetapi jika Anda membutuhkan tautan dalam "lompat ke 12:34", Anda harus puas dengan atribusi tingkat video melalui videoId dalam metadata.
Kemana pergi dari sini
Objek Document yang sama turun lurus ke toko vektor — saya berjalan melalui pipa penuh dalam RAG di atas seluruh channel YouTube. Jika tumpukan Anda adalah LlamaIndex daripada LangChain, setup yang setara sama pendeknya.
Ketika 5 video kunci demo berhenti cukup, dapatkan kunci Anda sendiri — tingkat gratis disertakan, paket berbayar dari $5,99 untuk 50 video per bulan.