用YouTube视频构建金融RAG
基于RAG的聊天机器人,利用YouTube频道作为知识库。
微信 ezpoda免费咨询:AI编程 | AI模型微调| AI私有化部署
AI模型价格对比 | AI工具导航 | ONNX模型库 | Tripo 3D | Meshy AI | ElevenLabs | KlingAI | ArtSpace | Phot.AI | InVideo
如果你曾经试图在一段很长的YouTube视频中找到特定的金融答案,你一定知道那种痛苦。
个人理财创作者通常发布数百小时的内容,涵盖房贷、投资策略、税务规划和退休建议。知识就在那里——但被埋没了。观众被迫拖动时间线、重新观看整个视频,或者干脆放弃。
这个问题对于房贷顾问等专业人士来说更为突出。
他们反复被问到同样的问题:
- 现在最好的房贷策略是什么?
- 我应该再融资还是续贷?
- 新移民应该如何在加拿大规划财务?
在这种情况下,像Grow with Nav这样的金融创作者已经在数百个YouTube视频中记录了答案——但客户没有时间去搜索,创作者也没有时间重复回答,除了逐案审查。
尽管拥有丰富的知识库,信息仍然是实际上无法访问的。
1、想法:让视频按意义而非时间可搜索
我不想构建另一个假装给出金融建议的聊天机器人。
相反,我想解决一个更具体的问题:
如果你能提出一个问题,并立即获得直接来自现有YouTube视频的答案——而无需观看它们会怎样?
这促使我构建了一个检索增强生成(RAG)聊天机器人:
- 转录YouTube频道上的每个视频
- 将内容转换为语义知识库
- 仅使用视频中已有的信息回答问题
- 当内容不存在时明确说"我不知道"
结果是AI驱动的金融问答系统,而不是金融顾问——它能在几秒钟内从真实内容中提取真实答案。
2、这个项目实际做什么(不吹嘘)
- 📚 将400多个YouTube视频变成可搜索的知识库
- 🔍 基于语义相似度而非关键词查找答案
- 🧠 通过强制仅上下文响应防止幻觉
- 💻 在16GB RAM机器上本地运行
- 💸 总API成本:约5美元
过去需要30分钟视频搜索现在只需约3秒。
3、技术栈
我选择了平衡功能和实用性的工具——一切都在16GB RAM的机器上本地运行:
- yt-dlp:从YouTube视频下载音频(我们不需要视频本身,节省大量空间)
- OpenAI Whisper:以惊人的准确性将音频转换为文本,本地运行
- Sentence Transformers (all-MiniLM-L6-v2):生成嵌入(文本的数值表示)用于语义搜索
- FAISS:Facebook的闪电般快速向量搜索库
- GPT-4o-mini:OpenAI的经济型模型,用于生成对话式答案
4、工作原理:4步流水线
步骤1:获取数据
首先,我使用yt-dlp下载频道上每个视频的音频。由于我们只需要音频进行转录,与下载完整视频相比这节省了大量磁盘空间。
步骤2:用Whisper转录
接下来,我将音频文件输入OpenAI的Whisper模型生成转录文本。这里有个关键问题:你不能直接把1小时的转录文本丢给AI模型——它会达到token限制并崩溃。
解决方案?分块。我将每个转录文本分割成1000字符的重叠块,重叠200字符。重叠确保我们不会在块边界处丢失上下文。
def chunk_text(text, chunk_size=1000, overlap=200):
"""
Memory-efficient text chunking using generator pattern.
Yields chunks instead of building a list in memory.
"""
L = len(text)
start = 0
while start < L:
end = min(start + chunk_size, L)
chunk = text[start:end].strip()
if chunk:
yield chunk
start = end - overlap
if start >= L or (end == L and start + overlap >= L):
break
这种生成器模式以流方式处理文本,在处理数百个视频时避免内存过载。
步骤3:构建"大脑"(向量索引)
这里变得有趣了。我使用SentenceTransformer将每个文本块转换为384维向量。可以把它想象成将人类语言翻译成计算机可以比较的数学。
这些向量存储在FAISS索引中——本质上是一个用于概念而非关键词的超快速查找表。就像在书后创建索引,但不是按字母顺序,而是按意义组织。
# Generate embeddings with normalization for cosine similarity
embeddings = model.encode(
texts,
convert_to_numpy=True,
normalize_embeddings=True # Critical for accurate similarity
)
# Build FAISS index for fast search
index = faiss.IndexFlatIP(embedding_dim) # IP = Inner Product
index.add(embeddings.astype('float32'))
IndexFlatIP使用内积相似度,配合归一化嵌入可以给我们余弦相似度——完美用于查找语义相关内容。
步骤4:聊天机器人界面
当用户提问时,发生以下步骤:
- 用户提问:"新移民最好的房贷策略是什么?"
- 检索:系统将问题转换为向量,在FAISS索引中搜索最相关的前5个块
- 上下文构建:这些块被组合成上下文字符串
- 生成:GPT-4o-mini接收上下文+问题,并严格基于该上下文生成答案
def generate_response(self, query: str, conversation_history: List[Dict] = None):
# Retrieve relevant chunks
relevant_chunks = self.retrieve_relevant_chunks(query)
# Build context from chunks
context = self.build_context(relevant_chunks)
# Send to GPT with strict instructions
messages = [
{
"role": "system",
"content": """You are a helpful mortgage advisor.
Answer based ONLY on the provided context from video transcripts.
If the context doesn't contain the answer, say so clearly."""
},
{
"role": "user",
"content": f"Context:\n{context}\n\nQuestion: {query}"
}
]
response = openai.chat.completions.create(
model="gpt-4o-mini",
messages=messages,
temperature=0.7
)
return response.choices[0].message.content
系统提示词至关重要——它通过强制AI坚持提供的上下文来防止"幻觉"答案。
5、技术挑战
5.1 RAM瓶颈
我最大的挑战是在16GB RAM限制下处理一切。处理400多个视频的嵌入很容易让系统崩溃。
解决方案:批处理。我以10个为一组处理视频,批次之间进行垃圾回收:
for idx, video in enumerate(videos):
# Process video chunks
process_video_chunks_streaming(video)
# Clean up memory every 10 videos
if (idx + 1) % 10 == 0:
gc.collect()
5.2 防止幻觉
AI模型喜欢编造东西。为防止这种情况,我:
- 使用严格的系统提示词,要求仅上下文答案
- 添加来源引用,让用户可以验证信息
- 用
temperature=0.7限制模型的创造力
聊天机器人现在会回复"知识库中没有该信息"而不是编造答案。
6、结束语
这个基于终端的聊天机器人运行良好,但我有更大的计划:
- Web UI:构建React/Next.js界面以便于访问
- 时间戳链接:添加直接跳转到视频中特定时刻的链接
- 代理工具:让聊天机器人执行房贷计算或拉取实时利率数据
- 可扩展存储:迁移到Pinecone或Weaviate用于生产级向量搜索
过去需要30分钟视频搜索现在只需3秒。我可以问"如果我是自雇人士应该如何规划房贷?"这样的复杂问题,并立即从Nav的专业知识中获得有来源的答案。
这个项目证明了,有了正确的工具和一些巧妙的工程,你可以将任何视频库变成交互式知识库。最棒的部分?一切都在本地运行,成本接近零。
原文链接: How I Turned 400+ YouTube Videos into an AI-Powered Financial Q&A Bot
汇智网翻译整理,转载请标明出处