十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

n8n YouTube Assistant:用 n8n + Supabase 构建可检索的 YouTube 视频知识库 Agent

n8n YouTube Assistant:用 n8n + Supabase 构建可检索的 YouTube 视频知识库 Agent n8n YouTube Assistant用 n8n Supabase 构建可检索的 YouTube 视频知识库 Agent【免费下载链接】ottomator-agentsAll the open source AI Agents hosted on the oTTomator Live Agent Studio platform!项目地址: https://gitcode.com/GitHub_Trending/ot/ottomator-agents导读本文围绕 n8n-youtube-agent 展开它是由 Dominik Fretz 编写、托管在 oTTomator Live Agent Studio 平台上的一个开源 n8n Agent 工作流只需粘贴一个 YouTube 链接工作流便会自动抓取视频字幕、调用大模型生成摘要/要点/行动项/金句/标签并把全文与向量化切片一并写入 Supabase之后你就可以像聊天一样对它提问——获取单个视频的总结、追问题或跨视频语义搜索。读完本文你将掌握该工作流从 Webhook 入口、意图分类、字幕抓取、向量入库到检索问答的完整节点链路能够将其导入自己的 n8n 实例、配置四类凭证并落地运行。一、Agent 概览它是如何工作的根据 README该 Agent 的核心职责是根据视频 URL 加载 YouTube 字幕将字幕写入向量存储vector store同时生成摘要、关键要点、引文等信息并存入 Supabase 数据库。在此基础上你可以与已入库的视频对话请求摘要、针对特定视频追问或跨视频检索例如之前哪个视频讲到过某本书/某个工具/某个人。从 YouTube_Agent.json 的节点清单可以看到工作流共包含56 个节点其中既有n8n-nodes-base的基础节点Webhook、HTTP Request、Code、Switch、Set、Merge、XML、Supabase也有n8n/n8n-nodes-langchain的 AI 编排节点AI Agent、Structured Output Parser、Vector Store、Embeddings、Text Splitter、Buffer Memory、Chat Model整体可拆解为四条主流程流程关键节点职责入口与意图识别Webhook → Prep Input Fields → AI Agent分类器→ Switch接收请求把用户输入分类为add / summarize / search / respond添加视频addCode 提取 ID → 查重 → 抓取字幕 → 生成摘要/标签 → 写入 videos 表与向量库把新视频完整入库总结视频summarize按 videoId 查 videos 表 → AI Agent1 → Gather output data基于已存摘要回答追问搜索视频searchSearch Agent Supabase Vector Store检索工具向量检索历史视频并作答二、依赖与凭证运行前需要准备什么README 明确列出了四项核心依赖Claude HaikuAnthropic——负责所有 LLM 推理任务OpenAI Embedding Model——生成文本向量Supabase——关系表 向量存储 检索函数Supadata——第三方 YouTube 字幕抓取 API。对应的必须配置的凭证见 README Required configuration setupYouTube Data API 凭证用于 Fetch video details 节点抓取视频标题、描述、频道名节点使用youTubeOAuth2Api凭证类型Supadata 凭证用于https://api.supadata.ai/v1/youtube/transcript接口HTTP Headerx-api-keyOpenAI 凭证用于embeddingsOpenAi节点生成向量Anthropic Claude 凭证用于 5 个 Agent 节点共用的lmChatAnthropic聊天模型。此外还需通过supabase.table.sql在 Supabase 中建表。值得注意的是除 Supadata 路径外工作流还内置了一套备用字幕获取方案见 Sticky Note 说明直接请求https://www.youtube.com/watch?v{video_id}页面从 HTML 中解析captionsJSON 得到字幕 baseUrl再抓取字幕 XML 并解析拼接。该方案的优势是不依赖第三方 API但工作流作者在 Sticky Note 中明确警告如果你这样用得太多可能会被迫登录以证明你不是机器人——因此建议优先使用 Supadata。三、数据库设计videos 表与向量检索函数supabase.table.sql 定义了整套数据层分为三个部分。3.1 videos 表视频结构化信息create table public.videos ( id bigint generated by default as identity not null, created_at timestamp with time zone not null default now(), video_id text null, title text null, description text null, summary text null, keypoints text[] null, actionable text[] null, quotes text[] null, tags text[] null, channel text null, transcript text null, constraint videos_pkey primary key (id) ) TABLESPACE pg_default;这张表是添加视频分支的落点字段与 LLM 输出一一对应video_id去重主键依据、title/channel/description来自 YouTube Data API、summary/keypoints/actionable/quotes/tags来自 Claude 的结构化输出、transcript完整字幕文本。3.2 youtube_agent_data 表向量存储create table youtube_agent_data ( id bigserial primary key, content text, -- 对应 Document.pageContent metadata jsonb, -- 对应 Document.metadata embedding vector(1536) -- 1536 维适配 OpenAI 嵌入模型按需修改 );这张表存的是字幕切片的向量化结果。注释明确说明content对应 LangChain 的Document.pageContent、metadata对应Document.metadata——与 n8n 的 Supabase Vector Store 节点tableName: youtube_agent_data直接对接。vector(1536)是 OpenAI 默认嵌入text-embedding-3-small 等的输出维度若更换其他嵌入模型如 3072 维的 text-embedding-3-large需同步调整。3.3 match_youtube_data 函数语义检索create function match_youtube_data ( query_embedding vector(1536), match_count int default null, filter jsonb DEFAULT {} ) returns table ( id bigint, content text, metadata jsonb, similarity float ) language plpgsql as $$ #variable_conflict use_column begin return query select id, content, metadata, 1 - (youtube_agent_data.embedding query_embedding) as similarity from youtube_agent_data where metadata filter order by youtube_agent_data.embedding query_embedding limit match_count; end; $$;这是 pgvector 标准的余弦距离检索函数为余弦距离1 - distance得到相似度metadata filter支持按 JSONB 元数据过滤limit match_count控制返回条数。n8n 的 Vector Store 节点Insert / Retrieve都通过queryName: match_youtube_data引用该函数。四、入口与意图分类把人话变成结构化指令4.1 Webhook 入口工作流以 HTTP Webhook路径invoke-youtube-agentPOST 方法headerAuth认证接收外部请求。下游 Prep Input Fields 节点从{{ $json.body }}中提取四个字段字段表达式说明query{{ $json.body.query }}用户问题文本user_id{{ $json.body.user_id }}用户标识request_id{{ $json.body.request_id }}请求唯一 IDsession_id{{ $json.body.session_id }}会话标识用于对话记忆同时Add User Message to DB 节点会把用户消息以 LangChainHumanMessage的 JSON 结构type: human、content写入messages表作为会话历史持久化。4.2 分类 Agent结构化输出 分支路由分类 AgentAI Agent 节点的 System Prompt 非常关键它把用户输入归类为四类动作{ action_type: add|summarize|search|respond, video_url: url or null, video_title: title or null, search_query: search terms or null, confidence: 0.0-1.0, response: response }规则如下用户只给 YouTube 链接 →add用户针对某视频带 URL 或标题询问内容 →summarize用户想从历史视频中找特定信息 →search能直接回答的问题 →respond此时必须返回response字段给用户。Prompt 中给出了 8 个示例覆盖了直接贴链接带指令添加要求总结按主题回忆视频询问能力等典型场景。该 Agent 通过 Structured Output Parser 节点jsonSchemaExample定义了action_type / video_url / video_title / search_query / confidence / response字段强制输出合法 JSON随后由 Switch 节点按action_type值分发到四条分支add、respond、summarize、search。五、Add 流程从链接到完整知识库条目这是工作流最复杂的部分Sticky Note 将其标注为 # Add由多个子阶段串联而成。5.1 提取视频 ID 并查重Code 节点内置了getYouTubeVideoId()函数用正则匹配四种 URL 形态const patterns [ /(?:youtube\.com\/watch\?v|youtu\.be\/|youtube\.com\/embed\/)([^?/])/, /youtube\.com\/v\/([^?/])/, /youtube\.com\/shorts\/([^?/])/ ];即支持youtube.com/watch?v、youtu.be/、youtube.com/embed/、youtube.com/v/、youtube.com/shorts/五种常见链接格式。拿到videoId后Check if video exists 节点以 Rest 风格查询 Supabasehttps://[Your Supabase Project ID].supabase.co/rest/v1/videos?video_ideq.{{ $json.videoId }}selectidlimit1若记录已存在If row exists 判断则直接返回提示The video with the id xxx is already in the database.避免重复入库。5.2 抓取视频信息与字幕未重复的视频进入 Get Video ID 节点并行触发两个请求Fetch Video Details调用 YouTube Data APIhttps://www.googleapis.com/youtube/v3/videos?partsnippetid{video_id}使用 YouTube OAuth2 凭证再经 Extract video details 节点取出title、description、channelName分别对应响应的items[0].snippet.title / description / channelTitleGet transcript from SUPADATA调用https://api.supadata.ai/v1/youtube/transcript?texttruevideoId{video_id}Header 携带x-api-keySupadata API key返回纯文本字幕经 Join transcript in code1 节点整理为{ transcript }。两条结果在 Merge1 节点汇合后分别喂给两个并行的 AgentSummarize agentSystem Prompt 要求作为 YouTube 字幕专家输出四要素 JSON——summary摘要、keypoints关键要点、actionable-tasks可执行任务、extracted-quotes原文金句配套的 Structured Output Parser2 的 schema 示例与此一致Tag generator agent要求生成至少 10 个标签用于后续分类检索System Prompt 明确只返回 JSON不要任何多余文字配套 Structured Output Parser1 的 schema 为{ tags: [tag] }。两个 Agent 的输出经 Merge 节点按索引合并Summarize 在 index 0、Tag 在 index 1再统一写入 Supabase。5.3 结构化入库与向量化切片Add video to supabase 节点把 10 个字段写入videos表其中 summary/keypoints/actionable/quotes/tags 直接来自 Merge 合并后的结构化输出title/channel/description 来自 YouTube APIvideo_id/transcript 来自前面节点——字段名与 supabase.table.sql 中的列严格对应。与此同时向量入库链路由四个 LangChain 节点协作完成节点配置作用Recursive Character Text SplitterchunkOverlap: 100递归字符切分器切片间保留 100 字符重叠以维持上下文连续性Default Data LoaderjsonData: {{ $json.data }}metadata 携带video_id把字幕文本包装成带元数据的 DocumentEmbeddings OpenAI默认配置生成 1536 维向量Insert documentstableName: youtube_agent_dataqueryName: match_youtube_data写入 Supabase 向量表注意 metadata 中的video_id被注入到每个切片的metadata字段——这正对应match_youtube_data函数中metadata filter的过滤能力使得后续检索可以按视频维度精确定位。入库成功后Generate output message 节点拼接成功提示The video {title} by {channelName} was added successfully!最终所有分支的输出统一经 Add AI Message to DB以 LangChainAIMessage结构写入messages表→ Prep Output Fields包装成success: truemessage.content→ Respond to Webhook 返回给调用方。六、Summarize / Search 流程与知识库对话6.1 按视频总结summarizeCode1 节点复用同一个getYouTubeVideoId()函数解析 URL随后 Supabase 节点按video_id查询videos表由 Gather fields 节点把title / description / summary / keypoints / actionable / channel / query / videoId / session_id组装起来交给AI Agent1。该 Agent 的 Prompt 把已入库的结构化信息以 XML 标签的形式注入title{{ $json.title }}/title channel{{ $json.channel }}/channel description{{ $json.description }}/description summary{{ $json.summary }}/summary key-points{{ $json.keypoints }}/key-points tasks{{ $json[actionable-tasks] }}/tasks human{{ $json.query }}/humanPrompt 同时约束了输出风格直接回答用户问题不要提Based on the provided summary。这意味着 summarize 分支不再重复调用 LLM 分析长字幕而是基于入库时已生成的摘要做轻量推理响应更快、成本更低。6.2 跨视频语义搜索search搜索分支由Search Agent驱动它挂载了两个工具Supabase Vector Storeretrieve-as-tool 模式工具名video_transcript_query描述为使用搜索词从向量库中检索相关视频topK: 6每次检索返回最多 6 条最相关切片Embedding 同样来自 OpenAIget_video_by_videoIdsupabaseTool通过$fromAI(videoId)让 Agent 自行决定按视频 ID 查询结构化记录。Search Agent 的 Prompt 会把分类器输出的search_query传入Use your tool to search for relevant videos and respond to the human并要求在回答后把命中的video_id以video_ids标签列表返回每项前缀 YouTube URL——这样用户不仅能看到答案还能拿到原始视频链接例如video_ids video_idhttps://www.youtube.com/watch?vxyz123/video_id /video_ids6.3 会话记忆Window Buffer Memory 节点使用自定义会话键{{ $json.session_id }}挂载到分类 Agent 与 AI Agent1 上为多轮对话提供滑动窗口式上下文记忆配合messages表的持久化Agent 可以在跨请求的会话中保持连贯。七、如何部署到自己的 n8n 实例参照 README 的说明部署步骤可以归纳为准备依赖服务注册并准备 Supabase 项目、Anthropic API Key、OpenAI API Key、YouTube Data API OAuth2 凭证、Supadata API Key初始化数据库在 Supabase SQL Editor 中执行 supabase.table.sql一次性创建videos表、youtube_agent_data向量表与match_youtube_data检索函数需启用 pgvector 扩展导入工作流在 n8n 中新建 Workflow → Import from File选择 YouTube_Agent.json配置凭证为 Supabase、OpenAI、Anthropic、YouTube OAuth2、SupadataHTTP Header分别创建 Credential并替换各节点 URL 中的[Your Supabase Project ID]占位符与x-api-key值激活 Webhook启动工作流后向POST /webhook/invoke-youtube-agent发送包含query及可选user_id / request_id / session_id的 JSON 请求即可调用。八、源码级细节与可扩展方向备用字幕方案的代价工作流内置的从 YouTube 页面 HTML 解析字幕分支Extract transcript url → Fetch transcript → XML → Join transcript in code会先做多重错误判断——检测到g-recaptcha时返回 Too Many Requests、缺少playabilityStatus返回 Transcript unavailable、无captionTracks时返回 Transcript disabled——作者在 Sticky Note 中建议仅在 Supadata 不可用时启用避免触发反爬限制。去重是设计的默认行为Check if video exists 的selectidlimit1与 If row exists 分支保证了同一视频不会被重复抓取与重复向量化避免知识库膨胀。可扩展方向match_youtube_data的filter jsonb参数已具备按元数据如video_id、未来可加的channel过滤检索的能力vector(1536)维度、topK: 6、chunkOverlap: 100均可按嵌入模型与业务场景调整分类 Agent 的 System Prompt 也可扩展更多动作类型如翻译字幕导出笔记。该 Agent 是 oTTomator agents 集合的一部分完整的源码级工作流定义见 YouTube_Agent.json数据库脚本见 supabase.table.sql整体能力说明与配置清单见 README。【免费下载链接】ottomator-agentsAll the open source AI Agents hosted on the oTTomator Live Agent Studio platform!项目地址: https://gitcode.com/GitHub_Trending/ot/ottomator-agents创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表