HomeBlogTranscribePlansAPI Keys

RAG YouTube-kanavan päälle: RSS:stä lähdeviitattuihin vastauksiin

Putki YouTube-kanavan RSS-syötteestä transkriptioiden ja upotusten kautta lähdeviitattuihin vastauksiin

RAG:n rakentaminen YouTube-kanavan päälle tarkoittaa vastaamista kysymykseen "mitä tämä sisällöntuottaja on sanonut aiheesta X, ja missä videossa?" — kaiken heidän julkaisemansa yli. Putki on neljä vaihetta: löydä videot RSS:llä, hae transkriptiot, pilko ja upota, vastaa lähdeviittein. Tässä jokainen vaihe ajokelpoisena Pythonina, mukaan lukien osat, jotka useimmat kirjoitukset ohittavat: kiintiönhallinta ja se, miltä lähdeviittaus rehellisesti näyttää ilman aikaleimoja.

Vaihe 1: videotunnisteet kanavan RSS-syötteestä

YouTube tarjoaa yhä oikean RSS-syötteen kanavaa kohden, ilman API-avainta:

import requests
import xml.etree.ElementTree as ET

CHANNEL_ID = "UCxxxxxxxxxxxxxxxxxxxxxx"
NS = "{http://www.youtube.com/xml/schemas/2015}"

feed = requests.get(
    f"https://www.youtube.com/feeds/videos.xml?channel_id={CHANNEL_ID}",
    timeout=30,
).text
video_ids = [el.text for el in ET.fromstring(feed).iter(f"{NS}videoId")]

Varaus: syöte palauttaa vain noin 15 uusinta latausta. Aktiivisella kanavalla aja tämä ajastettuna ja kerää id:t tiedostoon tai tauluun; sitä vanhempi takakatalogi vaatii YouTube Data API:n tai kertaluonteisen manuaalisen listan. Indeksin tuoreena pitämiseen RSS on kuitenkin täydellinen — se on myös kanavasta uutiskirjeeksi -putken selkäranka.

Vaihe 2: hae transkriptiot, kunnioita kiintiötä

import time

API_KEY = "yt_your_key_here"

def fetch(video_id: str) -> dict | None:
    resp = requests.get(
        "https://youtube2text.org/api/transcribe",
        params={"url": f"https://www.youtube.com/watch?v={video_id}"},
        headers={"x-api-key": API_KEY},
        timeout=90,
    )
    if resp.status_code == 404:
        return None  # TRANSCRIPT_UNAVAILABLE — no captions, skip
    if resp.status_code == 429:
        time.sleep(resp.json()["error"].get("retryAfterSeconds", 30))
        return fetch(video_id)
    resp.raise_for_status()
    return resp.json()["result"]

transcripts = [t for vid in video_ids if (t := fetch(vid))]

Tee laskutoimitus omasta paketistasi ennen kuin silmukoit kanavan yli: ilmainen taso on 5 videota kuukaudessa, mikä kattaa proof of conceptin eikä mitään muuta. Basic (5,99 $) ostaa 50, pro (9,99 $) ostaa 500 — pro on realistinen lähtötaso kanavan ja sen jatkuvien latausten indeksointiin.

Vaihe 3: pilko ja upota

Mikä tahansa vektorikanta käy; Chroma pitää esimerkin lyhyenä. Automaattitekstityksistä puuttuu usein välimerkitys, joten pilkon sanamäärän mukaan lauseiden sijaan:

import chromadb

def chunk(text: str, size: int = 300, overlap: int = 50):
    words = text.split()
    for i in range(0, len(words), size - overlap):
        yield " ".join(words[i:i + size])

client = chromadb.PersistentClient(path="./channel_index")
col = client.get_or_create_collection("channel")

for t in transcripts:
    for i, piece in enumerate(chunk(t["content"])):
        col.add(
            ids=[f'{t["videoId"]}-{i}'],
            documents=[piece],
            metadatas=[{"videoId": t["videoId"], "title": t["title"]}],
        )

Vaihe 4: vastaa lähdeviittein — rehellinen versio

API palauttaa pelkkää tekstiä ilman aikaleimoja, joten sanon suoraan: tästä datasta ei voi viitata "kohdassa 23:41". Sen mitä voit tehdä — ja mikä yleensä riittää — on lohkotason videoattribuutio: jokainen haettu lohko tuntee oman videoId- ja title-arvonsa, joten vastaukset viittaavat siihen, missä videossa asia sanottiin, toimivalla linkillä.

hits = col.query(query_texts=["what's their take on electric trucks?"], n_results=5)

context = "\n\n".join(
    f'[{m["title"]}] (https://www.youtube.com/watch?v={m["videoId"]})\n{doc}'
    for doc, m in zip(hits["documents"][0], hits["metadatas"][0])
)
prompt = (
    "Answer using only the excerpts below. After each claim, "
    f"cite the video title in brackets.\n\n{context}\n\nQuestion: ..."
)

Syötä prompt mille tahansa LLM:lle — paikallinen malli toimii tässä hyvin, sama asetelma kuin Ollama-tiivistysputkessa.

Kokoamishuomiot

Framework-väki: tämä kuvautuu yksi yhteen LlamaIndexiin tai LangChainiin, jos et halua käsin väsätä pilkkomista. Joka tapauksessa transkriptiokerros on identtinen, ja se on ainoa osa, jossa on mittari — nappaa avain osoitteesta youtube2text.org/app/keys ja aloita ilmaisella tasolla putken validoimiseksi ennen kuin osoitat sen 300 videoon.