解決する課題
コーチや教育者は、動画で説明済みの内容なのに、コメントやDMで同じ質問に毎日答えています。視聴者は適切な動画を見つけられず、クリエイターは個別対応を増やせません。チャンネルチャットボットならクリエイターの言葉で答え、視聴者を元のコンテンツへ誘導できます。
最初のバージョンに含めるべき機能
- クリエイター自身の動画だけを根拠にした回答
- 正確な動画とタイムスタンプへリンクする引用
- 新しい動画の公開時に自動更新
- 質問数に上限のある無料プランと会員向けの有料プラン
- クリエイターのWebサイトやコミュニティに埋め込めるウィジェット
開発手順(ステップごとに解説)
- 01
チャンネルを取り込む
チャンネルまたは厳選した再生リストを解決し、すべての動画IDをformat.paragraphsとformat.timestamp付きで/batchに送信します。
- 02
チャンク化と埋め込み
各段落を動画タイトル、URL、開始時刻とともに保存し、ベクトルデータベースで埋め込みを作成します。
- 03
検索して回答する
質問ごとに最も関連性の高い段落を検索し、それだけを使って動画とタイムスタンプを引用しながら回答するようLLMに指示します。
- 04
最新の状態に保つ
定期的にチャンネルの新しいアップロードを確認し、新しい文字起こしだけをインデックスに追加します。
サンプルコード
このアイデアは「レシピ3:再生リストをナレッジベースに一括登録」パターンをベースにしています。チャンネル、プロンプト、保存先はご自身のものに置き換えてください。
import requests
API = "https://www.youtubetranscript.dev/api/v2"
HEADERS = {"Authorization": "Bearer yt_sk_live_YOUR_KEY"}
playlist = requests.post(f"{API}/playlists/resolve", headers=HEADERS,
json={"playlist_url": "https://www.youtube.com/playlist?list=PLAYLIST_ID",
"limit": 100}).json()
ids = [v["video_id"] for v in playlist["items"]]
batch = requests.post(f"{API}/batch", headers=HEADERS, json={
"video_ids": ids,
"format": {"timestamp": True, "paragraphs": True},
}).json()
# Large batches run async: poll GET /batch/{batch_id} until status is "completed"
for r in batch.get("results", []):
if r["status"] == "completed":
for p in r["data"]["transcript"].get("paragraphs") or []:
store(video_id=r["video_id"], start=p["start"], text=p["text"]) # your vector DB収益化の方法
ホスト型チャットボットの月額料金をクリエイターに課金するか、クリエイターが視聴者に販売する有料プランで収益を分配します。会員制コミュニティや講座販売者は、プレミアム特典としてバンドルできます。
避けるべき失敗
- モデルに一般知識から回答させること:クリエイターらしい回答にするため、検索した文字起こしの一節だけに制限しましょう。
- 文の途中で切れる固定長チャンクを使うこと:段落単位のまとまりなら文脈が保たれます。
- クリエイターの承認なしに公開すること:クリエイター本人の声とコンテンツなので、一緒に作りましょう。
このアイデアに関する質問
YouTubeチャンネルでチャットボットを学習させられますか?
はい。モデルを学習させるのではなく、関連する文字起こしの一節を検索してLLMに回答させます。これを検索拡張生成(RAG)と呼びます。
チャットボットに出典を引用させるには?
文字起こしの各チャンクに動画URLと開始時刻を保存し、回答ごとにそれを含めるようモデルに指示してください。
チャンネル全体をインデックス化する費用は?
既存の字幕がある動画は1本1クレジットです。300本のチャンネルなら初回のインデックス化で約300クレジット、その後は新しいアップロード分だけです。