HomeBlogTranscribePlansAPI Keys

LlamaIndex YouTube 스크립트: 비디오 세트 쿼리

여러 YouTube 비디오 스크립트에서 구축된 LlamaIndex 벡터 인덱스가 질문에 답함

LlamaIndex YouTube 스크립트 파이프라인은 3단계: 스크립트를 Document 개체로 가져오기, VectorStoreIndex 구축, 한 번에 모든 비디오에 걸쳐 질문합니다. 한 스크립트의 전체 사항과 대부분의 첫 시도를 망치는 하나의 청킹 함정입니다.

스크립트를 Documents로 가져오기

나는 youtube2text.org를 실행하고 있으며, YouTube 스크립트를 JSON으로 반환하는 REST API입니다. 자신의 IP에서 스크래핑하지 않습니다. 이는 랩톱이 아닌 다른 곳에서 실행되는 순간 중요합니다 (로컬 스크래퍼가 차단되는 이유를 참조하세요. 비디오당 하나의 GET:

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"]},
    ))

키의 경우 youtube2text.org/app/keys에서 Google으로 로그인하거나 GET https://youtube2text.org/api/demo-key에서 공유 데모 키를 가져오세요 (IP당 월 5개 비디오 - 이 3비디오 예에는 좋지만 채널에는 좋지 않음).

청킹 함정: 자동 캡션에는 구두점이 없습니다

LlamaIndex의 기본 노드 파서는 SentenceSplitter이며, 문장 끝에서 청크 경계를 찾습니다. 수동으로 업로드된 캡션이 있습니다. 자동 생성된 캡션은 자주 하지 않습니다. 40분의 소문자 텍스트가 마침표가 없으면 SentenceSplitter는 분할할 것이 없고 결국 부풀어진 어색한 청크가 됩니다.

토큰 기반 분할은 문제를 완전히 우회합니다:

from llama_index.core.node_parser import TokenTextSplitter

splitter = TokenTextSplitter(chunk_size=512, chunk_overlap=64)

512토큰과 64개의 겹침은 내 테스트에서 달콤한 지점입니다: 청크가 완전한 생각을 수행할 수 있을 정도로 큽니다. 검색이 정밀하게 유지될 정도로 충분히 작습니다.

인덱스를 구축하고 쿼리하기

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"]})')

모든 Document는 메타데이터에서 videoIdtitle을 수행하기 때문에 각 검색된 청크는 어느 비디오에서 왔는지 알고 있습니다. source_nodes는 소스로의 작동 링크를 제공합니다. 이는 Settings에서 구성한 임베딩 모델 및 LLM을 사용합니다. 기본 OpenAI 설정은 OPENAI_API_KEY가 설정된 경우 기본적으로 작동합니다.

알아야 할 제한

API는 타임스탬프 없는 평문으로 스크립트를 반환하므로 인용이 비디오가 아닌 순간으로 해석됩니다. "이 주장은 Q3 수익 분석 비디오에서 나왔습니다"는 달성 가능합니다. "14:32에서"는 아닙니다. 대부분의 Q&A 사용 사례의 경우 비디오 수준의 속성은 충분하고 정직하게 청크 텍스트와 비디오 링크는 사람을 한 분 안에 올바른 지점에 도달하게 합니다.

또한 fetch 루프에서 처리할 가치가 있는 2개의 오류 코드를 참조하세요: TRANSCRIPT_UNAVAILABLE (404, 비디오에 캡션이 없음 - 건너뛰기) 및 RATE_LIMIT_EXCEEDED (429, 오류 본문의 retryAfterSeconds가 포함됨).

한 줌 비디오를 넘어 확장

3개의 비디오는 데모입니다. 전체 채널의 경우 비디오 발견을 위한 RSS 피드, 할당량 인식 가져오기, 영구 벡터 저장소가 필요합니다. YouTube 채널 위의 RAG에서 파이프라인을 다룹니다. LangChain 사용자 대신? 동일한 로더 패턴, 다른 프레임워크.

무료 계층은 월 5개 비디오를 포함합니다. pro 계획은 $9.99를 위해 500을 합니다. 편안하게 대부분의 채널을 인덱싱합니다. 키는 youtube2text.org/app/keys에 있습니다.