Bloga dönEntegrasyonlar

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

Transkripti barındırılan bir API üzerinden alın, LangChain'in text splitter'ıyla parçalara bölün, her parçayı özetleyin, sonra parça özetlerini tek bir nihai özette birleştirin - sadece 5 dakikalık değil, 3 saatlik bir videoda da çalışmaya devam eden aynı map-reduce deseni.
01

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/textsplitters
02

Transkripti 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.

03

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.

04

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.

05

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.

06

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

Q01

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.

Q02

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.

Q03

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.

Q04

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.

Q05

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.

Q06

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