「大手と同じ推薦機能」は小規模OTTでも作れる

NetflixやAmazon Prime Videoが何年もかけて構築したコンテンツ推薦システムを、小規模OTTサービスがゼロから再現しようとするのは現実的ではない。しかしユーザーに「あなたへのおすすめ」を表示する機能は、既存のオープンソースライブラリとLLM APIを組み合わせれば、エンジニア1〜2名でも実装できる時代になった。

K社(国内の特定ジャンル特化型OTTサービス、月間会員1.5万人)が取り組んだコンテンツ推薦機能の内製化について、最小構成での実装手順を紹介する。

推薦システムの全体設計

K社が採用したのは「協調フィルタリング+LLMによる説明文生成」の2層構造だ。

  • 推薦候補の計算:協調フィルタリング(行列分解)
  • 推薦理由の生成:Claude API
  • 表示するタイミング:ホーム画面、視聴完了後の次作品提案

なぜ協調フィルタリングを選んだか

協調フィルタリングは「あなたと似た視聴傾向を持つユーザーが見た作品をおすすめする」手法だ。コンテンツの内容分析(コンテンツベースフィルタリング)より精度が高く、ジャンルの枠を超えたサプライズ的な推薦ができる点が優れている。

K社では視聴完了率(完走した作品は高評価とみなす)と視聴時間を組み合わせて「暗黙の評価スコア」を計算し、これをPythonのsurpriseライブラリで行列分解している。

LLMで「なぜこの作品をすすめるか」を説明する

アルゴリズムが推薦作品を出しても、ユーザーに「なぜこれがおすすめなのか」が伝わらないと視聴率は上がりにくい。K社ではClaude APIを使って推薦理由の文章を自動生成している。

recommendation_prompt = f"""
以下の情報をもとに、この作品のおすすめ理由を50字以内で生成してください。
ユーザーの最近の視聴:{recent_watched_titles}
おすすめ作品:{recommended_title}(ジャンル:{genre}、あらすじ:{synopsis})
「〜が好きな方に」「〜に続けて見たい」のような自然な理由で。
"""

この文章を「あなたへのおすすめ」カードの下部に表示することで、クリック率が向上した。

実装ステップ

ステップ1: 視聴データの収集と前処理

まず必要なのは視聴履歴データだ。最低限以下のデータがあれば協調フィルタリングは動く。

  • user_id(ユーザーID)
  • item_id(コンテンツID)
  • rating(視聴完了率や視聴時間から計算したスコア)

K社では視聴完了率が70%以上なら5.0、30〜70%なら3.0、30%未満なら1.0という変換式を使っている。

ステップ2: 行列分解モデルの学習

from surprise import SVD, Dataset, Reader
from surprise.model_selection import train_test_split

reader = Reader(rating_scale=(1, 5))
data = Dataset.load_from_df(df[['user_id', 'item_id', 'rating']], reader)
trainset, testset = train_test_split(data, test_size=0.2)

algo = SVD(n_factors=50, n_epochs=20)
algo.fit(trainset)

学習は週1回バッチで実行し、推薦候補はキャッシュとして保持する。リアルタイムで計算するとAPIのレイテンシに影響するため、事前計算が基本だ。

ステップ3: ユーザーごとの推薦リスト生成

学習済みモデルを使って、未視聴コンテンツの中から予測評価スコアが高いものを10件取り出す。これが推薦候補リストになる。

ステップ4: Claude APIで推薦理由を生成

ステップ3で得た推薦候補トップ5件について、それぞれClaude APIに推薦理由文を生成させる。これもバッチで処理し、RedisやDynamoDBにキャッシュする。

ステップ5: フロントエンドへの表示

キャッシュから取り出した推薦リストと理由文をAPIで返す。フロントエンドはこれを「あなたへのおすすめ」セクションに表示する。

コストと精度

K社の場合(月間会員1.5万人)、Claude APIの推薦理由生成にかかるコストは月額約15,000〜20,000円程度だ。サードパーティの推薦エンジンSaaSの費用(同規模で月10〜30万円が多い)と比べてはるかに安い。

精度については「冷スタート問題」がある。新規ユーザーや視聴数が少ないユーザーには協調フィルタリングが機能しない。K社では視聴数が5件未満のユーザーには人気コンテンツランキングを代わりに表示している。

運用3か月の結果

  • 推薦セクションのクリック率:導入前比+34%
  • 推薦経由の視聴完了率:他の動線比+18%(推薦の精度が高い)
  • 会員あたりの月間視聴タイトル数:1.8本 → 2.4本

まとめ

小規模OTTサービスでもコンテンツ推薦AIの内製化は現実的だ。協調フィルタリングとClaudeの組み合わせなら、エンジニア1名が2〜3週間かければ動くものを作れる。重要なのは「推薦候補の選択」と「推薦理由の説明」を分けて設計することで、ユーザーの視聴継続率向上に直接つながる機能になる。