HomeBlogTranscribePlansAPI Keys

LlamaIndex YouTube 转录文本:查询一组视频

从多个 YouTube 视频转录文本构建的 LlamaIndex 向量索引,回答问题

一个 LlamaIndex YouTube 转录文本管道是三个步骤:获取转录文本作为 Document 对象、构建 VectorStoreIndex、一次在所有视频中提出问题。这是一个脚本中的整个东西,加上毁掉大多数首次尝试的一个分块陷阱。

作为 Documents 获取转录文本

我运行 youtube2text.org,一个 REST API,它返回 YouTube 转录文本作为 JSON——没有从你自己的 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 个视频——对这个三个视频示例很好、对频道不是)。

分块陷阱:自动字幕没有标点符号

LlamaIndex 的默认节点解析器是 SentenceSplitter,它在句子结尾找到块边界。手动上传的字幕有那些。自动生成的字幕经常没有——你得到四十分钟的小写文本,没有句号、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_API_KEY,默认 OpenAI 设置开箱即用。

你应该知道的限制

API 返回没有时间戳的纯文本转录文本,所以你的引用解析为一个视频,而不是其内的一刻。"这个声明来自 Q3 收益分解视频"是可实现的;"在 14:32"不是。对于大多数问答用例,视频级别的归因就足够了,老实说,块文本加一个视频链接让人在不到一分钟内到达正确的地点。

还要注意获取循环中值得处理的两个错误代码:TRANSCRIPT_UNAVAILABLE(404、视频没有字幕——跳过它)和 RATE_LIMIT_EXCEEDED(429、在错误主体中带 retryAfterSeconds)。

扩展过去少数视频

三个视频是一个演示。对于整个频道,你想要用于视频发现的 RSS 提要、配额感知获取和持久向量存储——我在对 YouTube 频道的 RAG中覆盖那个管道。LangChain 用户代替?相同加载器模式、不同框架

免费层涵盖每月 5 个视频;pro 计划为 9.99 美元做 500,它舒适地索引大多数频道。密钥在 youtube2text.org/app/keys