ステップバイステップ: Claude Code で YouTube リサーチエージェントを構築する
YouTube を見続けて午後を無駄にし、保存する価値のある動画を忘れてしまった経験はありませんか? それはあなただけではありません。最高の動画を見つけ、要約を抽出し、重要な引用を抜き出し、タイムスタンプ付きの洞察を抽出し、オンデマンドでソースを返す、疲れを知らないアシスタントを想像してみてください。それがまさに YouTube リサーチエージェントができることです。このステップバイステップガイドでは、ノイズよりもシグナルを求めるクリエイター、アナリスト、学生、熱心な学習者向けに設計された、Claude Code を使用した実用的な YouTube リサーチエージェントを構築します。
実用的かつ直接的な方法(アーキテクチャ、コード、プロンプト、ガードレール)を取ります。その過程で、後で交換できる独自の選択を行います。最終的には、YouTube を検索し、トランスクリプトを収集し、複数の動画にわたって推論し、明確なリサーチブリーフを作成できる、動作するエージェントが完成します。
構築するもの(とその重要性)
- 目標: 次のことができる YouTube リサーチエージェント:
- トランスクリプトを取得(自動キャプションまたはサードパーティ)
- Claude Code を使用して、複数動画からの洞察を統合
- 構造化されたメモを出力: 要約、主張、タイムスタンプ、引用、参考文献
- 主なキーワード: "Claude Code で YouTube リサーチエージェントを構築する"
- 形式: 実行可能なコードとプロンプトを含むステップバイステップのチュートリアル
- 出力: プログラムで使用するための Markdown リサーチブリーフ + JSON
なぜ重要なのか: YouTube は、講演、レッスン、デモ、討論に関する最大の公開ナレッジベースです。しかし、ノイズが多いのも事実です。Claude Code で YouTube リサーチエージェントを構築すると、優位性が得られます。数時間ではなく数分で、数十本の動画から洞察を集約できます。
アーキテクチャの概要
最初のバージョンはシンプルかつ堅牢に保ちます。
- 入力: リサーチクエリ (例: "LLM エージェントアーキテクチャ 2025")、オプションの制約 (日付範囲、チャンネル、期間)
- YouTube 検索: YouTube Data API v3 (または SerpAPI フォールバック)
- トランスクリプト: YouTube Transcript API。利用できない場合は ASR (例: Whisper) にフォールバック
- チャンク化: 文単位のセグメンテーション (約 800〜1,200 トークン)
- 埋め込み: ローカルまたはホストされている埋め込みモデルを使用 (例:
text-embedding-3-large, nomic-embed-text, または bge-large)
- ベクターストア: 速度のためにローカルの
FAISS。 Pinecone, Weaviate, または Qdrant に交換可能
- 推論: 制御されたループ内でのオーケストレーション、ツール使用、合成、およびコード実行のための Claude Code
- 出力: 引用、タイムスタンプ、およびスコアを含む Markdown レポート + JSON インデックス
データフロー: クエリ → 検索 → メタデータの取得 → トランスクリプト → チャンク → 埋め込み → 上位 K 件の検索 → Claude Code 合成 → レポート。
前提条件とセットアップ
- API キー:
YOUTUBE_API_KEY, ANTHROPIC_API_KEY (Claude Code 用)
- オプション:
OPENAI_API_KEY またはローカル埋め込み
google-api-python-client, youtube-transcript-api
faiss-cpu, numpy, pandas, tiktoken (または sentencepiece)
requests, pydantic, tenacity
pip install google-api-python-client youtube-transcript-api faiss-cpu numpy pandas requests pydantic tenacity anthropic tiktoken
環境変数:
export YOUTUBE_API_KEY=YOUR_YT_KEY
export ANTHROPIC_API_KEY=YOUR_ANTHROPIC_KEY
ステップ 1: フィルタを使用した YouTube 検索
YouTube を検索し、構造化されたメタデータ(タイトル、チャンネル、公開日、期間、視聴回数 (利用可能な場合)、および videoId)を返します。
# file: yt_search.py
from googleapiclient.discovery import build
import os
YOUTUBE_API_KEY = os.environ — channel, date\n\n"
"---\n"
"JSON schema: {\"claims\":[{\"claim\":str,\"support\":[{\"video_id\":str,\"start\":float,\"end\":float}]}]}\n"
)
def call_claude(goal: str, passages: list[dict]):
passages_str = "\n\n".join(
f"[rank {p['rank']} | score {p['score']:.3f}] (vID={p.get('video_id','?')}, {p.get('start',0):.1f}-{p.get('end',0):.1f})\n{p['text']}"
for p in passages
)
msg = client.messages.create(
model="claude-3-5-sonnet-20240620",
max_tokens=1800,
temperature=0.2,
system=SYSTEM_PROMPT,
messages=[
{"role": "user", "content": USER_TEMPLATE.format(goal=goal, passages=passages_str)}
])
return msg.content[0].text
Claude Code で YouTube リサーチエージェントを構築する際のプロンプトのヒント:
- 人間が読める形式と機械が読める形式の両方で構造化された出力を要求する
ステップ 6: すべてをまとめる
クエリ → 検索 → トランスクリプト → チャンク → 埋め込み → 検索 → 合成を接続しましょう。
# file: run_agent.py
from yt_search import search_youtube
from transcripts import fetch_transcript
from chunking import transcript_to_docs
from embeddings import VectorStore
from orchestrator import call_claude
from datetime import datetime
def build_corpus(query: str, max_videos=8):
results = search_youtube(query, max_results=max_videos)
corpus_docs = []
for r in results:
tx = fetch_transcript(r["video_id"]) or []
if not tx:
continue
docs = transcript_to_docs(tx)
for d in docs:
d.update({
"video_id": r["video_id"]
"title": r["title"]
"channel": r["channel"]
"url": r["url"]
})
corpus_docs.extend(docs)
return corpus_docs
def research(query: str, k=12):
corpus = build_corpus(query)
if not corpus:
return "No transcripts available."
vs = VectorStore
vs.add(corpus)
passages = vs.search(query, k=k)
md = call_claude(query, passages)
timestamp = datetime.utcnow.isoformat
return f"<!-- generated {timestamp} UTC -->\n\n" + md
if __name__ == "__main__":
print(research("LLM agents for YouTube research"))
Claude Code を使用した YouTube リサーチエージェントのこのベースラインバージョンは、引用を使用して複数動画からの洞察を検索、取得、および合成します。埋め込みをアップグレードし、キャッシュを追加して、本番環境に対応できるようにします。
優れたものにするための 7 つのアップグレード
- 高品質の埋め込みに交換し、BM25 キーワード検索を追加します。ハイブリッドにより、ニッチな用語でのリコールが向上し、抽象的なトピックでの精度が向上します。
- コメント、いいね/低評価の比率、およびチャンネルの権限を取得します。上位 100 件の候補に対して、再ランカー(クロスエンコーダー)を追加します。
- Claude Code を使用して、リサーチ計画を提案します。サブ質問、仮説、およびカバレッジチェック。カバレッジのしきい値が満たされるまで反復的に実行します。
- 各主張について、支持および矛盾するスニペットをログに記録します。両方をレポートに表示します。信頼スコアを追加します。
- 字幕または Whisper の単語タイミングを介してシーン検出を使用します。コンテキストの希薄化を避けるために、グローバル合成の前にセクションごとに要約します。
- クエリごとにトランスクリプト、埋め込み、およびレポートを保存します。ユーザーがフィルターを調整するときに再利用します。動画 ID で重複排除を追加します。
- Markdown、PDF、および JSON をエクスポートします。メールまたは Slack で配信します。タイムスタンプを
?t=mmss のクリック可能なリンクとしてレンダリングします。
再利用できるプロンプト
Claude Code で YouTube リサーチエージェントを構築する際は、これらのテンプレートを使用してください。
システム: あなたは細心の注意を払うリサーチエージェントです。複数の YouTube トランスクリプトにわたって合成します。[vID @ mm:ss] でインラインで引用し、URL を含むソースセクションを含めます。タイムスタンプ付きのサポートを含むクレームの Markdown ブリーフと JSON ペイロードの両方を返します。
ユーザー: リサーチの目標: {topic}
制約: {audience or scope} に焦点を当てます。{date range} 内のソースを優先します。意見の不一致を含めます。
候補となるパッセージ (ランク付け):
{retrieved_passages}
出力: 要約 → 主な洞察 (箇条書き) → 注目すべき引用 (タイムスタンプ付き) → 矛盾とギャップ → ソース。次に JSON {"claims": ...}
ガードレールと倫理
- クリエイターの権利を尊重する: 元の動画へのリンクを貼り、大きな逐語的なトランスクリプトの公開は避けてください。
- 透明性を確保する: タイムスタンプと動画 ID を使用して、クレームの出典を示します。
- 過度の要約は避ける: ニュアンスを保持します。キャプションが自動生成されており、ノイズが多い可能性が高い場合はフラグを立てます。
- 機密性の高いトピックは慎重に扱う: 不確実性を強調し、多様なソースを探します。
トラブルシューティング: よくある問題と修正
- Whisper にフォールバックします。別の言語を試してください。動画が地域でブロックされているかどうかを確認してください。
- 埋め込みをアップグレードします。BM25 を追加します。チャンクのオーバーラップを増やします。上位 K 件のパラメーターを調整します。
- 厳密な引用スキーマを強制します。サポートされていないクレームにペナルティを科します。取得されたチャンクに存在する正確なタイムスタンプを要求します。
- 積極的にキャッシュします。
max_results を減らします。リクエストをバッチ処理します。tenacity でバックオフを追加します。
- セクションごとに要約します。最大トークンを制約します。明示的なアウトラインを含む計画プロンプトを使用します。
品質の測定
- ラベル付きセットに対する、取得されたチャンクの Precision@K
- 忠実度: 検証可能なタイムスタンプ付きのサポートがあるクレームの割合
例: "ベクターデータベースの説明" のリサーチ
- クエリ: "開発者向けベクターデータベースの説明 2025"
- フィルター: 2023 年以降の動画、期間 6〜30 分
- 結果: エージェントは 6 本の動画を引用し、HNSW と IVF-PQ のトレードオフを強調し、コスト/リコールについて議論し、ベンチマークにリンクします。矛盾セクションでは、ベンダーの主張とオープンソースの結果を比較します。
ところで: ワークフロー内での自動化
ドキュメントとコードをまたいで作業する場合は、最後のマイルを自動化する価値があります。小さな CLI で毎晩クエリを実行し、Markdown ブリーフをナレッジベースにドロップできます。スプリントリサーチのために、課題テンプレートに接続することもできます。
注目すべき点: ワークフローがすでにブラウザのサイドバーまたは AI アシスタントに存在する場合、Sider.AI のようなツールを使用すると、リサーチのループを効率化できます。トピックを選択し、検索を実行し、トランスクリプトをキャプチャし、作業場所で Claude を利用した要約をドラフトできます。これにより、コンテキストの切り替えを節約し、チームにとって Claude Code で YouTube リサーチエージェントを構築することがさらに実用的になります。 主な注意点
- Claude Code で YouTube リサーチエージェントを構築することは、動画を実行可能なブリーフに変えるための影響力の高い方法です。
- 最小限のスタック: YouTube API + トランスクリプト + チャンク化 + 埋め込み + FAISS + Claude 合成。
- アップグレードパス: ハイブリッド検索、再ランキング、計画ループ、および厳密な引用追跡。
- シンプルに始めて、忠実度を測定し、信頼性に向けて反復します。
次のステップ
- 実際的な埋め込みモデルとハイブリッド検索を実装する
- トピックを毎週更新するスケジュールされたジョブを作成する
- CLI および軽量な Web UI としてパッケージ化する
FAQ
Q1:Claude Code で YouTube リサーチエージェントの構築を開始するにはどうすればよいですか?
YouTube 検索から始め、トランスクリプトを取得し、コンテンツをチャンク化し、ベクターストアに埋め込み、Claude Code を使用して結果を合成します。上記のガイドでは、動作するパイプラインを組み立てるためのステップバイステップのコードを提供しています。
Q2:YouTube リサーチエージェントに最適なライブラリは何ですか?
検索には YouTube Data API、キャプションには youtube-transcript-api、ベクトル検索には FAISS、Claude Code の呼び出しには Anthropic SDK を使用します。OpenAI、Nomic、または BGE で埋め込みを交換できます。
Q3:正確な引用とタイムスタンプを保証するにはどうすればよいですか?
チャンク化中に開始/終了タイムスタンプを保持し、Claude Code に [video_id @ mm:ss] を引用するように要求します。公開する前に、引用されたタイムスタンプが取得されたチャンクに存在することを確認します。
Q4:このエージェントを非公開または非表示の動画に使用できますか?
はい、アクセス権があり、トランスクリプトを取得するか、ローカル ASR (例: Whisper) を実行できる場合。常に許可を尊重し、著作権で保護されたコンテンツの配布は避けてください。
Q5:この YouTube リサーチエージェントをチーム向けに拡張するにはどうすればよいですか?
キャッシュ、共有ベクターストア、ジョブキュー、およびスケジュールされた実行を追加します。Slack または Wiki と統合し、Sider.AI のようなブラウザベースのアシスタントを検討して、リサーチ担当者のワークフローを効率化します。