レコメンデーションシステム

OpenAI API ではじめる Embeddings 入門

Emmanuel Pire

Senior Software Engineer, DataCamp

埋め込みを使ったレコメンデーションシステム

 

  • セマンティック検索と非常に似ています!

 

プロセス:

  1. 候補データとデータポイントを埋め込む

ベクトル空間上の1つの青いデータポイントと複数の赤いデータポイント。

OpenAI API ではじめる Embeddings 入門

埋め込みを使ったレコメンデーションシステム

 

  • セマンティック検索と非常に似ています!

 

プロセス:

  1. 候補データとデータポイントを埋め込む
  2. コサイン距離を計算する

ベクトル空間上の1つの青いデータポイントと複数の赤いデータポイント。各赤点と青点の間にコサイン距離を示す線がある。

OpenAI API ではじめる Embeddings 入門

埋め込みを使ったレコメンデーションシステム

 

  • セマンティック検索と非常に似ています!

 

プロセス:

  1. 候補データとデータポイントを埋め込む
  2. コサイン距離を計算する
  3. 最も近いアイテムを推薦する

最も近い3つの赤いポイントがハイライトされている。

OpenAI API ではじめる Embeddings 入門

例:おすすめ記事

articles = [
    {"headline": "Economic Growth Continues Amid Global Uncertainty",
     "topic": "Business",
     "keywords": ["economy", "business", "finance"]},
    ...
    {"headline": "1.5 Billion Tune-in to the World Cup Final",
     "topic": "Sport",
     "keywords": ["soccer", "world cup", "tv"]}
]

current_article = {"headline": "How NVIDIA GPUs Could Decide Who Wins the AI Race", "topic": "Tech", "keywords": ["ai", "business", "computers"]}
OpenAI API ではじめる Embeddings 入門

特徴量の結合

def create_article_text(article):
  return f"""Headline: {article['headline']}
Topic: {article['topic']}
Keywords: {', '.join(article['keywords'])}"""
article_texts = [create_article_text(article) for article in articles]
current_article_text = create_article_text(current_article)
print(current_article_text)
Headline: How NVIDIA GPUs Could Decide Who Wins the AI Race
Topic: Tech
Keywords: ai, business, computers
OpenAI API ではじめる Embeddings 入門

埋め込みの作成

def create_embeddings(texts):
  response = openai.Embedding.create(
    model="text-embedding-3-small",
    input=texts
  )
  response_dict = response.model_dump()

  return [data['embedding'] for data in response_dict['data']]
current_article_embeddings = create_embeddings(current_article_text)[0]
article_embeddings = create_embeddings(article_texts)
OpenAI API ではじめる Embeddings 入門

最も類似した記事の検索

def find_n_closest(query_vector, embeddings, n=3):
  distances = []
  for index, embedding in enumerate(embeddings):
    dist = spatial.distance.cosine(query_vector, embedding)
    distances.append({"distance": dist, "index": index})
  distances_sorted = sorted(distances, key=lambda x: x["distance"])
  return distances_sorted[0:n]
hits = find_n_closest(current_article_embeddings, article_embeddings)

for hit in hits: article = articles[hit['index']] print(article['headline'])
OpenAI API ではじめる Embeddings 入門

最も類似した記事の検索

Tech Giant Buys 49% Stake In AI Startup
Tech Company Launches Innovative Product to Improve Online Accessibility
Scientists Make Breakthrough Discovery in Renewable Energy
OpenAI API ではじめる Embeddings 入門

ユーザー履歴の追加

user_history = [
    {"headline": "How NVIDIA GPUs Could Decide Who Wins the AI Race",
     "topic": "Tech",
     "keywords": ["ai", "business", "computers"]},
    {"headline": "Tech Giant Buys 49% Stake In AI Startup",
     "topic": "Tech",
     "keywords": ["business", "AI"]}
]
OpenAI API ではじめる Embeddings 入門

複数データポイントへのレコメンデーション

埋め込まれた記事のプロット。ユーザーの履歴にある記事は青、未読の記事は赤で表示されている。

OpenAI API ではじめる Embeddings 入門

複数データポイントへのレコメンデーション

 

プロセス:

  • 平均を取って複数ベクトルを1つに結合する
  • コサイン距離を計算する

2つのベクトルの平均から算出されたポイントが、2点の間に追加されている。

OpenAI API ではじめる Embeddings 入門

複数データポイントへのレコメンデーション

 

プロセス:

  • 平均を取って複数ベクトルを1つに結合する
  • コサイン距離を計算する
  • 最も近いベクトルを推薦する

最も近い赤いポイントがレコメンデーション対象としてハイライトされている。

OpenAI API ではじめる Embeddings 入門

複数データポイントへのレコメンデーション

 

プロセス:

  • 平均を取って複数ベクトルを1つに結合する
  • コサイン距離を計算する
  • 最も近いベクトルを推薦する

最も近いポイントが青色に変わり、既読記事を除外すべきことを示している。

OpenAI API ではじめる Embeddings 入門

複数データポイントへのレコメンデーション

 

プロセス:

  • 平均を取って複数ベクトルを1つに結合する
  • コサイン距離を計算する
  • 最も近いベクトルを推薦する
    • 未読であることを確認する

今度はやや遠い赤いポイントがハイライトされている。

OpenAI API ではじめる Embeddings 入門

複数データポイントへのレコメンデーション

def create_article_text(article):
  return f"""Headline: {article['headline']}
Topic: {article['topic']}
Keywords: {', '.join(article['keywords'])}"""

history_texts = [create_article_text(article) for article in user_history]
history_embeddings = create_embeddings(history_texts)

mean_history_embeddings = np.mean(history_embeddings, axis=0)
articles_filtered = [article for article in articles if article not in user_history]
article_texts = [create_article_text(article) for article in articles_filtered] article_embeddings = create_embeddings(article_texts)
OpenAI API ではじめる Embeddings 入門

複数データポイントへのレコメンデーション

hits = find_n_closest(mean_history_embeddings, article_embeddings)

for hit in hits: article = articles_filtered[hit['index']] print(article['headline'])
Tech Company Launches Innovative Product to Improve Online Accessibility
New Social Media Platform Has Everyone Talking!
Scientists Make Breakthrough Discovery in Renewable Energy
OpenAI API ではじめる Embeddings 入門

練習しましょう!

OpenAI API ではじめる Embeddings 入門

Preparing Video For Download...