Build an AI YouTube Video Summarizer with LangChain and Next.js
A working YouTube summarizer built with LangChain and Next.js: fetch the transcript, chunk it with a text splitter, summarize each chunk, then combine the results into one final summary - full code for every step.
00:08:00 · SEP 26, 2026
Hızlı yanıt
LangChain'i kurun
Bu eğitim, LangChain JS'in güncel paket ayrımını kullanır - çekirdek ilkeller, OpenAI entegrasyonu ve text splitter'lar her biri kendi paketinde yaşar:
npm install langchain @langchain/core @langchain/openai @langchain/textsplittersTranskripti alın
panelden bir anahtar alın (100 ücretsiz kredi, kart gerekmez), ardından bir Next.js route handler'ından transkript endpoint'ini çağırın:
// app/api/summarize/route.ts
import { NextResponse } from 'next/server';
async function fetchTranscript(videoId: string) {
const res = await fetch(
`https://getyoutubetranscript.com/api/v1/transcript?v=${videoId}`,
{ headers: { Authorization: `Bearer ${process.env.GETYOUTUBETRANSCRIPT_API_KEY}` } }
);
const json = await res.json();
if (!json.success) throw new Error(json.message);
// json.data.transcript is the full plain-text transcript,
// json.data.word_count is its length in words.
return json.data as { transcript: string; word_count: number; title: string };
}transcript, tam düz metin transkripttir ve word_count onun uzunluğudur - kısa bir videoda parçalama adımını tamamen atlayıp atlamamaya karar vermek için yararlıdır.
Transkripti parçalara bölün
Uzun bir transkript, tek bir promptta bir LLM'e göndermek için rahat olan miktarı kolayca aşabilir, bu yüzden önce bölün. RecursiveCharacterTextSplitter önce paragrafta, sonra cümlede, sonra kelimede bölmeyi dener, bu sırayla - böylece parçalar cümlenin ortasından kesilmek yerine okunabilir kalır:
import { RecursiveCharacterTextSplitter } from '@langchain/textsplitters';
const splitter = new RecursiveCharacterTextSplitter({
chunkSize: 4000,
chunkOverlap: 200,
});
const chunks = await splitter.splitText(transcript);
// A 20-minute video is usually 1-2 chunks; a 2-hour one might be 8-10.chunkOverlap, bir parçanın sonundaki bağlamın biraz bir sonraki parçanın başında da kalmasını sağlar, böylece sınırda bölünen bir cümle her iki parçadan da kaybolmaz.
Her parçayı özetleyin
ChatPromptTemplate + bir model + StringOutputParser'ı birbirine bağlamak (LangChain'in ifade dili, LCEL) bir chain oluşturmanın güncel, kararlı yoludur - her parça paralel olarak kendi kısa özetini alır:
import { ChatOpenAI } from '@langchain/openai';
import { ChatPromptTemplate } from '@langchain/core/prompts';
import { StringOutputParser } from '@langchain/core/output_parsers';
const model = new ChatOpenAI({ model: 'gpt-4.1-mini', temperature: 0 });
const chunkPrompt = ChatPromptTemplate.fromTemplate(
'Summarize this part of a video transcript in 3-4 sentences, keeping any concrete facts, numbers, or names:\n\n{chunk}'
);
const chunkChain = chunkPrompt.pipe(model).pipe(new StringOutputParser());
const chunkSummaries = await Promise.all(
chunks.map((chunk) => chunkChain.invoke({ chunk }))
);Bunları Promise.all ile paralel çalıştırmak gecikme için önemlidir: 10 parçalık bir transkripti tek tek özetlemek, 10'unu aynı anda özetlemekten 10 kat daha uzun sürer.
Parça özetlerini tek bir özette birleştirin
Parça özetleri artık tek bir promptta birlikte sığacak kadar kısa, bu yüzden ikinci bir chain bunları nihai sonuçta birleştirir:
const finalPrompt = ChatPromptTemplate.fromTemplate(
'These are summaries of consecutive parts of the same video transcript, titled "{title}".\n' +
'Combine them into one coherent summary (a short paragraph, then 3-5 key takeaways as bullet points):\n\n{summaries}'
);
const finalChain = finalPrompt.pipe(model).pipe(new StringOutputParser());
const summary = await finalChain.invoke({
title,
summaries: chunkSummaries.join('\n\n'),
});
return NextResponse.json({ summary });Bu iki aşamalı yapı (önce parçaları özetle, sonra özetleri özetle), LangChain'in kendi map-reduce deseninin arka planda tam olarak yaptığı şeydir - burada eski bir yardımcı chain kullanmak yerine açıkça yazılmıştır, çünkü summarization-chain yardımcı API'leri LangChain sürümleri arasında değişmiştir ve sade LCEL ilkelleri üzerine inşa etmek için daha kararlı bir temeldir.
Kendiniz scrape etmek yerine transkripti bir API'den almanın nedeni
Yukarıdaki transkript alma adımı, bu pipeline'da üretimde gerçekten zorlaşan tek kısımdır - kendi barındırılan scraping kütüphaneleri, bir bulut sunucusuna dağıtılır dağıtılmaz genellikle engellenir. Barındırılan bir YouTube Transkript API, tam olarak bu adımı çalışır durumda tutmak için tasarlanmıştır, böylece pipeline'ın geri kalanının bunu düşünmesine gerek kalmaz.
Tam endpoint referansı, kimlik doğrulama ve hız limitleri API belgelerinde yer alır. Bunu baştan sona denemek için panelden 100 ücretsiz kredi içeren bir anahtar alın.
LangChain özetleyici SSS
Kısa videoları da parçalara bölmem gerekir mi?
Şart değil - önce transkript yanıtındaki word_count'a bakın. 10 dakikalık bir videonun transkripti genellikle modern tek bir LLM promptunun kaldırabileceğinden çok daha azdır, bu yüzden doğrudan tek bir özetleme çağrısına geçip parçalama/birleştirme adımlarını tamamen atlayabilirsiniz.
Sabit karakter bölme yerine neden RecursiveCharacterTextSplitter?
Sabit bölme, karakter sayısı nereye denk gelirse orada keser, muhtemelen cümlenin veya kelimenin ortasından. RecursiveCharacterTextSplitter önce paragraf kesmelerini, sonra cümleleri, sonra kelimeleri dener, yalnızca zorunda kaldığında sert bir kesime başvurur - böylece parçalar modelin özetlemesi için tutarlı kalır.
OpenAI yerine farklı bir LLM sağlayıcısı kullanabilir miyim?
Evet - LangChain'in chat model sınıfları aynı arayüzü paylaşır, bu yüzden ChatOpenAI'ı başka bir sağlayıcının LangChain entegrasyonuyla (Anthropic, Google, vb.) değiştirmek pipeline'da başka hiçbir şeyi değiştirmez.
LLMChain kullanmak yerine neden bir prompt, model ve output parser'ı birbirine bağlıyoruz?
LLMChain, LangChain'in daha eski chain oluşturma API'sidir. Bağlı/LCEL tarzı (prompt.pipe(model).pipe(parser)) şu anda önerilen desendir - daha öngörülebilir şekilde birleşir ve LangChain'in daha yeni belgeleri bunun üzerine inşa edilir.
Bunu çalıştırmanın maliyeti nedir?
İki maliyet vardır: LLM çağrıları (parça başına bir, artı birleştirmek için bir - model sağlayıcınız tarafından faturalandırılır) ve API'den her transkript almada 1 kredi. Test sırasında alma tarafını 100 ücretsiz kredi karşılar.
Videonun hiç transkripti yoksa ne olur?
Transkript endpoint'i boş bir dize yerine net bir hata kodu döndürür (TRANSCRIPT_DISABLED veya TRANSCRIPT_NOT_FOUND) - text splitter'a herhangi bir şey vermeden önce success: false olup olmadığını kontrol edin, çünkü boş bir transkripti özetlemek bir LLM çağrısını boşa harcar.
İlgili
- YouTube API Quota Exceeded: Causes and Fixes
- YouTube Transcript API Rate Limit: What It Is and How to Handle 429s
- YouTube Transcript MCP Server: Setup Guide for Claude and Other AI Tools
- YouTube Transcripts in n8n: HTTP Request Workflow Guide
- Migrating from Supadata: A Field Guide
- How to Get YouTube Transcripts in Python
- Migrating from TranscriptAPI.com: A Field Guide
- GetYouTubeTranscript ve TranscriptAPI karşılaştırması
- GetYouTubeTranscript ve youtubetotranscript.com karşılaştırması
- GetYouTubeTranscript ve youtube-transcript.io karşılaştırması
- GetYouTubeTranscript vs NoteGPT