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

一个 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 在元数据中携带 videoId 和 title,每个检索的块知道它来自哪个视频——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。