LlamaIndex YouTube Transkriptiot: Kysy video-sarjalta

LlamaIndex YouTube-transkription putki on kolme vaihetta: hae transkriptiot Document-objekteiksi, rakenna VectorStoreIndex, kysy kysymyksiä kaikista videoista kerralla. Tässä on koko asia yhdessä skriptissä, sekä yksi chunking-sudenkuoppa, joka tuhoaa useimmat ensimmäiset yritykset.
Hae transkriptiot Document-objekteiksi
Ajon youtube2text.org, REST API, joka palauttaa YouTube transkriptiot JSON:na — ei kaavintaa omasta IP:stäsi, mikä on tärkeä, kun tämä ajaa missä tahansa muualla kuin kannettavallasi (katso miksi paikalliset kaavijat päätetään, jos olet utelias). Yksi GET per 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"]},
))
Avainta varten, kirjaudu Googlella youtube2text.org/app/keys, tai vedä jaettu demonäppäin GET https://youtube2text.org/api/demo-key (5 videota/kuukausi per IP — kunnossa tälle kolme-video esimerkkiin, ei kanavalle).
Chunking sudenkuoppa: automaatti-kuvatekstit eivät ole välimerkeillä
LlamaIndex:n oletussolmun jäsentäjä on SentenceSplitter, joka löytää chunk-rajat lauseiden loppujen kohdalla. Manuaalisesti ladatut kuvatekstit ovat olemassa. Automaattisesti luodut kuvatekstit usein eivät — saat neljäkymmentä minuuttia pieniä kirjaimia teksti ilman pisteitä, SentenceSplitter ei löydä mitään jakaa, ja päädyt paksunksi, hankalaksi chunkkeiksi.
Token-pohjainen jakaminen sivuuttaa ongelman kokonaan:
from llama_index.core.node_parser import TokenTextSplitter
splitter = TokenTextSplitter(chunk_size=512, chunk_overlap=64)
512 tunnistetta 64 päällekkäisyydellä on ollut makeapiste testauksessani: tarpeeksi iso, että chunk kantaa täydellinen ajatus, tarpeeksi pieni, että haku pysyy tarkka.
Rakenna indeksi ja kysy se
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"]})')
Koska jokainen Document kantaa videoId ja title metatieto, jokainen haettu chunk tietää mihin videoon se tuli — source_nodes antaa sinulle työskentelyn linkkejä takaisin lähteihin. Tämä käyttää mitä tahansa upotus-mallia ja LLM, jonka olet konfiguroinut Settings:ssä; OpenAI-oletusasennus toimii laatikoista, jos OPENAI_API_KEY on asetettu.
Rajoitus, jonka sinun tulisi tietää
API palauttaa transkriptiot tavallisena tekstinä ilman aikaleimoja, joten sitatäsi ratkeavat videoksi, ei hetken sisällä. "Tämä vaatimus tuli Q3-tulosten hajoitusvideoista" on saavutettavaa; "klo 14:32" ei. Useimmissa Q&A-käyttötapauksissa videon tason attribuutio on riittävä, ja rehellisesti, chunk-teksti sekä video linkki saa ihmisen oikeaan paikkaan minuutin alle.
Huomaa myös kaksi virhe-koodia, joiden arvoisesti käsitellä fetch-silmukassa: TRANSCRIPT_UNAVAILABLE (404, videolla ei ole kuvatekstejä — ohita se) ja RATE_LIMIT_EXCEEDED (429, tulee retryAfterSeconds virhe runko).
Skaalaus mennessä muutaman videon yli
Kolme videota on demo. Koko kanavalle haluat RSS-syötteen videohakemiseen, kiintiö-tietoiseen hakemiseen ja pysyvään vektorikauppaan — katso tämä putki kohdassa RAG YouTube-kanavan yli. LangChain-käyttäjä sen sijaan? Sama lataus-kuvio, eri kehys.
Ilmainen taso kattaa 5 videota kuukaudessa; pro-suunnitelma tekee 500:n 9,99 dollarilla, mikä indeksoi mukavasti useimmat kanavat. Avaimet youtube2text.org/app/keys.