🙌

簡単にできる!ChromaDBとLLMを利用したレコメンドシステム入門

に公開

はじめに

近年、様々な場面でレコメンドシステムが活用されています。代表的な例として、Amazonのレコメンデーション機能が挙げられます。Amazonでは、ある商品のページを開くと、「よく一緒に購入されている商品」や「この商品に関連する商品」が表示されていると思います。これは、これまでのAmazon利用ユーザーの属性や行動履歴に基づいて、各ユーザーに最適な商品をレコメンドしているのです。このようなレコメンドシステムは、NetflixやYoutubeなどの動画配信サービスでも広く用いられています。ユーザーの属性や視聴履歴に基づいて、おすすめの映画や動画を薦められたことがある人も少なくないでしょう。このように、レコメンドシステムは今や多くのサービスにおいて欠かせない技術となっています。

私は以前からレコメンドシステムに少し興味を持っていました。また、データベースやベクトルデータベースについて調べる中で、ベクトルデータベースがレコメンドシステムに活用されているということを知り、ベクトルデータベース自体にも興味を持つようになりました。そこで本記事では、楽天トラベルの宿泊施設データを活用し、ChromaDBというベクトルデータベースを用いた簡易的なレコメンドシステムの実装について、自身の検証結果をベースに解説します。

今回の実装では、Rakuten Web serviceの楽天トラベル系APIから宿泊施設データを取得しました。しかし、Rakuten Web serviceには、他にも楽天市場や楽天ブックスなどのAPIも用意されていますし、実装される際は自身の好みで様々なデータをご利用ください。

https://webservice.rakuten.co.jp/documentation

また、本記事では、昨今話題のLLMにも触れています。

本記事の対象は以下の通りです。

  • Python初学者~中級者
  • レコメンドシステムに興味がある方
  • ベクトル検索やベクトルデータベースに興味のある方

用語の説明

ここでは、本記事で扱う重要用語の説明を簡単に行います。

  • レコメンドシステム(推薦システム)
    ユーザーの属性や過去の行動などに基づいて、各ユーザーに最適な商品・サービスを提案する仕組み

  • ベクトル検索
    テキストや画像、音声などのデータをベクトルに変換し、数学的に計算された類似性を元にデータを効率的に検索する手法

  • Embedding(埋め込み)
    テキストや画像などのデータを数値ベクトルに変換する技術

  • ベクトルデータベース
    テキストや画像、音声などのデータをベクトルとして扱い、そのベクトルデータを保存・検索するためのデータベース

  • ChromaDB
    Chromaという会社が提供しているベクトルデータを効率的に保存し、高速に検索するためのデータベース

https://www.trychroma.com/

使用した環境やデータ

今回検証に用いたデータは楽天トラベル系APIを叩いて取得しました。本記事では、このAPIの利用方法などは割愛させていただきますが、参考になるサイトを紹介いたします。
https://note.com/m316jp2/n/n4e6c87fb1e88
https://www.youtube.com/watch?v=58AJA4CqKlc&t=1s

環境はGoogleColabで構築しました。
https://colab.research.google.com/

また、テキスト情報の追加やテキストのEmbeddingには、OpenAIのAPIを利用しました。OpenAIのAPIを使用した理由などは特にありません。GeminiのAPIを利用しても同じことが実現できます。
https://openai.com/ja-JP/api/

実装・結果

1. ライブラリの準備やAPIキーの設定

!pip install chromadb
import requests
import numpy as np
import pandas as pd
import chromadb
from google.colab import userdata
from openai import OpenAI

# 楽天APIのキー設定
REQUEST_URL = 'https://app.rakuten.co.jp/services/api/Travel/SimpleHotelSearch/20170426'
APP_ID = userdata.get('APP_ID')

# OpenAIのキー設定
open_ai_key = userdata.get('OPENAI_API_KEY')
client = OpenAI(api_key=open_ai_key)

APIのキーは各自で発行したキーをご利用ください。

2. データの準備

例えば、大阪府大阪市の宿泊施設情報を取得するには以下のように実装します。

params = {
    'format': 'json',
    'largeClassCode': 'japan',
    'middleClassCode': 'osaka',
    'smallClassCode': 'shi',
    'detailClassCode': 'B',
    'applicationId': APP_ID,
    'hits': 30    # 1回のリクエストで最大30件しか取得できない。
}

※パラメーターの指定方法に関して、詳しくは公式サイトをご参照ください。
https://webservice.rakuten.co.jp/documentation/simple-hotel-search

1回のリクエストで30件の施設しか取得できないため、for文を回します。

df_list = []

for page in range(1, 3):
    params["page"] = page
    res = requests.get(REQUEST_URL, params)
    if res.status_code == 200:
      result = res.json()
      hotels = result['hotels']
      for i, hotel in enumerate(hotels):
          hotel_info = hotel['hotel'][0]['hotelBasicInfo']
          df_list.append(hotel_info)

    else:
      print(f'Error: API request failed with status code {res.status_code}')
      break

df_osaka = pd.DataFrame(df_list)
df_osaka = df_osaka[['hotelNo', 'hotelName', 'hotelSpecial', 'hotelMinCharge', 'latitude', 'longitude', 'postalCode', 'address1', 
                     'address2', 'telephoneNo', 'access', 'nearestStation', 'reviewCount', 'reviewAverage', 'userReview']]
df_osaka.head(3)
hotelNo hotelName hotelSpecial ・・・
0 16654 ホテル近鉄ユニバーサル・シティ 【楽天トラベルゴールドアワード6年連続受賞】宿泊者特典有り■大阪駅から最短約12分 ・・・
1 172378 リーベルホテル大阪 ≪5年連続楽天トラベルアワード受賞≫2024ゴールドアワード☆ホテル&旅館オブ・ザ・イヤー全国8位☆ ・・・
2 71921 ホテル京阪 ユニバーサル・タワー 駅・USJ徒歩スグのオフィシャルホテル!31階天然展望温泉(有料)は大人気 ・・・

特定の地域に偏ったデータだけでは、多様なクエリに対して適切な推薦結果を得るのが難しいと考えため、大阪府に加え、関西各県(兵庫、京都、滋賀、奈良、和歌山)の宿泊施設情報も、それぞれ60件ずつ取得し、ひとつのデータフレームに統合しました。

df = pd.concat([df_osaka, df_kobe, df_kyoto, df_ootsu, df_nara, df_wakayama], axis=0)
df = df.reset_index(drop=True)

df['address'] = df['address1'] + df['address2']

また、県名と市区町村名が別々になっていたので、一つにまとめました。

3. OpenAIのAPIを用いてhotelSpecialカラムをEmbedding

ここでは、hotelSpecialという宿泊施設の簡単な説明が書いてあるカラムをEmbedding(ベクトル化)します。

# 各施設のhotelSpecialカラムをベクトル化
def get_embedding(text, model="text-embedding-3-small"):
    response = client.embeddings.create(input=text, model=model)
    return response.data[0].embedding

df["embedding_pre"] = df["hotelSpecial"].apply(get_embedding)

4. chromaDBにデータを格納

そして、ベクトル化したデータを格納するために、chromaDBというベクトルデータベースを利用します。アウトプットとしては、ユーザーの入力した希望条件(例:「海に近い宿」「大都市にあるホテル」など)に対して、適切な宿泊施設を複数件レコメンドできるようにすることを目指しています。ここでは精度を図るために、クエリ文の内容に近い宿泊施設を10件出力し、何件がそのクエリ文の条件に適合しているのかを見ています。

以下でベクトルデータベースを作成しています。

chroma_client_pre = chromadb.PersistentClient(path="./chroma_store/hotel_pre")
collection_pre = chroma_client_pre.get_or_create_collection(name='hotel_pre')
collection_pre.add(
    ids=[str(i+1) for i in range(len(df))],
    documents=df['hotelSpecial'].tolist(),
    embeddings=np.vstack(df['embedding_pre'].values).astype('float32'),
    metadatas=df[['hotelName', 'hotelMinCharge', 'address']].to_dict(orient='records')
)

例えば、「近くに海がある宿に泊まりたい」というクエリ文を用意し、この内容に近い宿を類似度が高い順に10件検索するには、次のように実行します。

# クエリ文をベクトル化
query = "近くに海がある宿に泊まりたい"
query_vec = get_embedding(query)

# 類似宿を検索
results = collection_pre.query(
    query_embeddings=[query_vec],
    n_results=10
)

# 結果表示
chroma_records_a = []
for distance, metadata, document in zip(results['distances'][0], results['metadatas'][0], results['documents'][0]):
    chroma_records_a.append({
        'ホテル名': metadata.get('hotelName'),
        '住所': metadata.get('address'),
        'hotelSpecial': document,
        '距離': distance,
    })

chroma_result_df1 = pd.DataFrame(chroma_records_a)
chroma_result_df1
ホテル名 住所 hotelSpecial 距離
0 さざなみが聞こえる癒しのお宿 あたらし屋 和歌山県和歌山市加太205 展望大浴場からは四季折々の紀淡海峡が見渡せます。潮風香る癒しのお宿あたらし屋 1.055941
1 アヤハレークサイドホテル 滋賀県大津市におの浜3-2-25 2食付きプランなら朝夕ともに【個室】でご用意★徒歩2分圏内に24時間営業のスーパーもある湖畔の宿 1.060220
2 ジェイホッパーズ琵琶湖ゲストハウス 滋賀県大津市北比良931-1 水遊びや登山に最適の近江舞子!ビーチまで徒歩3分のリゾート系ゲストハウス! 1.092018
3 観鹿荘 奈良県奈良市春日野町10 別名「吸露洞」と呼ばれる、1度は泊まってみたい萬葉の宿。 1.109454
4 旅館 白鳳 奈良県奈良市上三条町4-1 奈良駅前通りに立地するリーズナブルな和室の宿 1.120376
5 和歌の浦温泉 萬波 MANPA RESORT 和歌山県和歌山市新和歌浦2-10 貸切風呂、露付部屋が自慢!全室海側のお部屋から見える海岸美、新和歌浦の夕日を、家族と恋人とゆっくり 1.123497
6 釣り人の宿 旅籠屋 菊水 和歌山県和歌山市加太485 【加太】友ヶ島や海水浴場の近隣。釣り人だけでなく、観光やビジネスにも♪ 無料wi-fi 完備 1.127224
7 旅館 唐橋 滋賀県大津市唐橋町17-6 名橋唐橋、清流瀬田川を庭園に臨む川畔宿。お馴染さんやリピーターの多いリーズナブルで家庭的な旅館です 1.128168
8 和歌山加太温泉 シーサイドホテル加太海月 和歌山県和歌山市加太1905 展望風呂付客室登場!天然温泉、露天風呂から望む夕日百選の絶景の夕日♪鯛・伊勢海老・黒毛和牛会席が人気 1.134488
9 こんぜの里 バンガロー村 滋賀県栗東市観音寺535 琵琶湖を一望!「こんぜの里」にある自炊型の宿泊施設。ご家族連れや仲間同士でアウトドアライフを満喫! 1.135072

指定したクエリ文との類似性が最も高い10件を表示させましたが、うち6件は実際には海から離れた場所にある宿でした。(奈良県や滋賀県には海がない)

また、「大都市のホテルに泊まりたい」というクエリ文も用意しました。

# クエリ文をベクトル化
query = "大都市のホテルに泊まりたい"
query_vec = get_embedding(query)

# 類似宿を検索(距離ベースの近さ)
results = collection_pre.query(
    query_embeddings=[query_vec],
    n_results=10
)

# 結果表示(距離が小さいほど近い)
chroma_records_b = []
for distance, metadata, document in zip(results['distances'][0], results['metadatas'][0], results['documents'][0]):
    chroma_records_b.append({
        'ホテル名': metadata.get('hotelName', ''),
        '住所': metadata.get('address', ''),
        'hotelSpecial': document,
        '距離': distance,
    })

chroma_result_df2 = pd.DataFrame(chroma_records_b)
chroma_result_df2
ホテル名 住所 hotelSpecial 距離
0 和歌山グリーンホテル 和歌山県和歌山市新雑賀町38 市街地中心部のビジネスホテル。全客室20平米越え。出張はもちろん、観光や合宿でもご利用いただけます。 0.984574
1 ビジネスホテルみやま<和歌山県> 和歌山県和歌山市畑屋敷端ノ丁27 ★夜勤明け宿泊歓迎★大浴場&貸切家族風呂有★全室LAN有★26室63名宿泊可能★庶民派ビジネスホテル 1.113489
2 アヤハレークサイドホテル 滋賀県大津市におの浜3-2-25 2食付きプランなら朝夕ともに【個室】でご用意★徒歩2分圏内に24時間営業のスーパーもある湖畔の宿 1.144245
3 WoodHighROOMS 和歌山県和歌山市吉田820 出張も旅行もここで決まり!和歌山の繁華街の宿 1.144906
4 お宿 あしたも 京都府京都市右京区嵯峨野宮ノ元町49-19 最大6名様まで京間畳の広々としたお部屋で団体のご宿泊も広々とお寛ぎ頂けます。 1.155894
5 HOTEL ARROWS ARASHIYAMA(ホテルアローズ嵐山) 京都府京都市右京区梅津中倉町18ー8ー2階 【R1年11月OPEN】全16室ツイン/禁煙の素泊まりホテル♪無料P有◎松尾大社・鈴虫寺・苔寺近く。 1.158087
6 ホテル阪急インターナショナル 大阪府大阪市北区茶屋町19-19 高層階に位置する客室からは大阪の街並みが一望!記念日におすすめなプランも充実♪ 1.163016
7 ラ・ジェント・ホテル大阪ベイ 大阪府大阪市此花区桜島1丁目1番57 明るい雰囲気の気取らないモダンなホテル。ユニバーサルシティエリアにあり大阪市内へのアクセスも◎ 1.164892
8 Guest House 古都音 KYOTO 京都府京都市右京区西京極芝ノ下町10-1 客室 2部屋の小さな宿です 4名様でお泊まり頂くと貸し切りになります。 1.196249
9 神戸牛と有馬温泉 天然金泉・銀泉の宿 有馬御苑 兵庫県神戸市北区有馬町1296 【楽天ゴールド&日本の宿アワード受賞】部屋食プラン多数★温泉街すぐ!金銀2種の温泉と神戸牛が自慢♪ 1.199589

この中で、大都市かつホテルという条件を満たしているのは、10件中3件のみでした。(大阪、神戸、京都を大都市とする)

このことから、hotelSpecialカラムだけでは宿泊施設の特徴を示す情報としては不十分であると考えました。そこで今回はLLM(大規模言語モデル)を活用して、2次情報を付け加えることにしました。

5. LLMを活用して宿泊施設の情報を追加する

以下の処理では、OpenAIのAPI経由でLLMを利用し、宿泊施設に関する情報を追加しています。その追加した情報はdescriptionカラムに格納します。

df['description'] = ""   # 結果を格納する新しい列を作成

for index, row in df.iterrows():
    hotel_name = row['hotelName']
    address = row['address']

    try:
        # APIリクエスト
        response = client.responses.create(
            model='gpt-4o',
            input='以下の宿泊施設の特徴を日本語で100文字程度で要約してください',
            instructions=(
                f'対象の施設は、{address}にある「{hotel_name}」です。'
                '生成する文章には、施設名や地名などの位置情報を絶対含めないでください。'
                '主に宿泊施設の特徴や雰囲気、サービス内容に焦点を当ててください。'
                )
        )

        summary = response.output_text

        df.at[index, 'description'] = summary
        print(f"{index+1}件目完了: {hotel_name}")

    except Exception as e:
          print(f"{index+1}件目エラー: {hotel_name}, エラー内容: {e}")
pd.set_option('display.max_colwidth', None)
df[['hotelName', 'hotelSpecial' ,'description']].head(3)
hotelName hotelSpecial description
0 ホテル近鉄ユニバーサル・シティ 【楽天トラベルゴールドアワード6年連続受賞】宿泊者特典有り■大阪駅から最短約12分 この宿泊施設は、テーマパークに隣接しアクセスが便利で、家族連れや友人同士の旅行に最適です。客室はゆったりとした空間を提供し、パークをテーマにした装飾が施されています。快適な滞在をサポートする多彩なサービスが魅力です。
1 リーベルホテル大阪 ≪5年連続楽天トラベルアワード受賞≫2024ゴールドアワード☆ホテル&旅館オブ・ザ・イヤー全国8位☆ ホテルは、洗練された内装と快適な客室が魅力で、ゲストに贅沢な滞在を提供します。レストランでは多彩な料理が楽しめ、温泉やフィットネス施設も充実しています。アクセスの良さと親切なスタッフのサービスが好評です。
2 ホテル京阪 ユニバーサル・タワー 駅・USJ徒歩スグのオフィシャルホテル!31階天然展望温泉(有料)は大人気 この宿泊施設は、テーマパークに近く、アクセスが良いのが魅力です。ラグジュアリーな雰囲気を持ち、大浴場やレストランも充実しています。家族連れやカップルに適しており、快適な滞在が期待できます。

6. LLMで追加した情報(description)をEmbedding

# 各施設のhotelSpecialカラムをベクトル化
def get_embedding(text, model="text-embedding-3-small"):
    response = client.embeddings.create(input=text, model=model)
    return response.data[0].embedding

df["embedding_post"] = df["description"].apply(get_embedding)

7. 6でEmbeddingしたデータをchromaDBに格納

chroma_client_post = chromadb.PersistentClient(path="./chroma_store/hotel_post")
collection_post = chroma_client_pre.get_or_create_collection(name='hotel_post')
collection_post.add(
    ids=[str(i+1) for i in range(len(df))],
    documents=df['description'].tolist(),
    embeddings=np.vstack(df['embedding_post'].values).astype('float32'),
    metadatas=df[['hotelName', 'hotelMinCharge', 'address']].to_dict(orient='records')
)

4で実施した「近くに海がある宿に泊まりたい」というクエリ文を再度用意し、この内容に近い宿を類似度が高い順に10件検索します。

# クエリ文をベクトル化
query = "近くに海がある宿に泊まりたい"
query_vec = get_embedding(query)

# 類似宿を検索
results = collection_post.query(
    query_embeddings=[query_vec],
    n_results=10
)

# 結果表示
chroma_records_c = []
for distance, metadata, document in zip(results['distances'][0], results['metadatas'][0], results['documents'][0]):
    chroma_records_c.append({
        'ホテル名': metadata.get('hotelName'),
        '住所': metadata.get('address'),
        'description': document,
        '距離': distance,
    })

chroma_result_df3 = pd.DataFrame(chroma_records_c)
chroma_result_df3
ホテル名 住所 description 距離
0 釣り人の宿 旅籠屋 菊水 和歌山県和歌山市加太485 海辺に位置し、釣り好きに最適なロケーションの宿です。家庭的な雰囲気と温かなサービスが魅力で、地元の新鮮な海の幸を使った料理も楽しめます。開放的な空間でリラックスした滞在が可能です。 0.917567
1 漁火の宿 シーサイド観潮 和歌山県和歌山市田野82 海辺に位置するこの宿泊施設は、リラックスした雰囲気の中で新鮮な海の幸を楽しむことができます。客室からは美しい海の景色が広がり、温かいおもてなしと共に心地よい時間を提供します。 0.936695
2 神戸須磨シーワールドホテル 兵庫県神戸市須磨区若宮町1-3-5 海と自然に囲まれた宿泊施設で、家族連れやカップルに最適です。水族館が併設されており、海洋生物を身近に感じられる体験が魅力。リラックスできる部屋と地元の食材を使った料理を楽しめるレストランも完備しています。 0.990643
3 和歌の浦 木村屋 和歌山県和歌山市新和歌浦2-2 海辺に位置し、美しい景観が楽しめる宿泊施設です。落ち着いた和の雰囲気が漂い、伝統的なおもてなしが魅力です。新鮮な地元の食材を使った料理も堪能でき、心温まる滞在が実現します。 0.997139
4 和歌の浦温泉 萬波 MANPA RESORT 和歌山県和歌山市新和歌浦2-10 海を望む穏やかな宿泊施設で、心身を癒す温泉が魅力です。客室からの絶景や地元食材を使った料理が楽しめ、贅沢でリラックスできるひとときを提供します。優雅な雰囲気と心温まるサービスで、訪れる人々に特別な時間を約束します。 1.008215
5 和歌山加太温泉 シーサイドホテル加太海月 和歌山県和歌山市加太1905 海に面した宿泊施設で、美しい景色と天然温泉が魅力です。新鮮な海の幸を使った料理が楽しめ、リラックスした雰囲気が漂います。心温まるサービスで、穏やかな滞在を提供します。 1.036404
6 潮風荘 和歌山県和歌山市雑賀崎613-2 この宿泊施設は、心地よい潮風を感じられる立地にあり、海を望む絶景が魅力です。家庭的な雰囲気と丁寧なサービスで、リラックスした時間を提供します。新鮮な海の幸を使った料理も楽しめます。 1.037221
7 resora RAINBOW(リソラ レインボー) 和歌山県和歌山市加太北浜場内 この宿泊施設は、海辺の美しい景観が広がる場所に位置し、リラックスした雰囲気を提供します。心地よく整えられた客室や親しみやすいサービスが特徴で、訪れる人に落ち着いた時間を提供します。 1.038157
8 和歌山マリーナシティホテル 和歌山県和歌山市毛見1517 地中海を思わせるデザインが特徴の宿泊施設で、海の絶景を楽しめる客室を備えています。リゾート気分を満喫できる充実したサービスや設備が整っており、快適なステイを提供します。 1.052384
9 神戸みなと温泉 蓮 兵庫県神戸市中央区新港町1-1 天然温泉を楽しめる宿泊施設で、海を望む絶景が魅力です。和の雰囲気を重視した客室があり、リラクゼーション施設や本格的なレストランも充実しています。心身ともにリフレッシュできる環境が整っています。 1.066753

上記の検索結果から、10件中10件の宿が実際に海の近くに位置していることがわかります。

また、再度「大都市のホテルに泊まりたい」というクエリ文も用意しました。

# クエリ文をベクトル化
query = "大都市のホテルに泊まりたい"
query_vec = get_embedding(query)

# 類似宿を検索(距離ベースの近さ)
results = collection_post.query(
    query_embeddings=[query_vec],
    n_results=10
)

# 結果表示(距離が小さいほど近い)
chroma_records_d = []
for distance, metadata, document in zip(results['distances'][0], results['metadatas'][0], results['documents'][0]):
    chroma_records_d.append({
        'ホテル名': metadata.get('hotelName', ''),
        '住所': metadata.get('address', ''),
        'description': document,
        '距離': distance,
    })

chroma_result_df4 = pd.DataFrame(chroma_records_d)
chroma_result_df4
ホテル名 住所 description 距離
0 ダイワロイネットホテル神戸三宮 兵庫県神戸市中央区御幸通5-1-6 この宿泊施設は、快適さと利便性を追求した都市型ホテルです。広々とした客室と充実したアメニティが用意され、ビジネスや観光の拠点として最適です。落ち着いた雰囲気と丁寧なサービスで、心地よい滞在が楽しめます。 1.095406
1 ホテルランドマーク和歌山 和歌山県和歌山市手平2-1-2和歌山ビッグ愛10F この宿泊施設は、都会的で上品な雰囲気を持ち、家族旅行やビジネス出張にも適した快適な空間を提供しています。充実したサービスと心温まるおもてなしが特徴で、多様な観光や出張ニーズに応えます。 1.114166
2 ダイワロイネットホテル和歌山 和歌山県和歌山市七番丁26-1 市の中心部に位置するこの宿泊施設は、モダンで快適な客室と充実したアメニティを提供しています。ビジネスにも観光にも便利で、レストランや会議室などの施設も完備。親切なスタッフによるサービスが魅力です。 1.116757
3 ホテル法華クラブ大阪 大阪府大阪市北区兎我野町12-19 宿泊施設は、快適さと利便性を兼ね備えた都市型ホテルです。シンプルで心地よい客室や充実したアメニティが特徴で、観光やビジネスに最適なアクセス環境を提供します。スタッフの行き届いたサービスで安心の滞在が可能です。 1.124893
4 神戸ベイシェラトンホテル&タワーズ 兵庫県神戸市東灘区向洋町中2-13 瀟洒な宿泊施設で、上質な快適さと温泉を楽しめます。様々なダイニングオプションが魅力的で、エレガントな客室からは素晴らしい眺望が広がります。都市の喧騒から離れたリラックスできる環境が魅力です。 1.128473
5 ホテルヴィスキオ尼崎byGRANVIA 兵庫県尼崎市潮江1-4-1 スタイリッシュで快適な宿泊施設で、公共交通機関へのアクセスが便利です。広々とした客室と充実したアメニティが特徴で、ビジネスや観光での滞在に最適です。リラックスできるおもてなしが魅力です。 1.136903
6 都ホテル 尼崎(旧:都ホテルニューアルカイック) 兵庫県尼崎市昭和通2-7-1 この宿泊施設は、洗練されたデザインと快適さを兼ね備えた都市型ホテルです。上質な客室と豊富なダイニングオプションがあり、ビジネス利用にも最適な会議施設が充実しています。都市の利便性を活かした滞在が楽しめます。 1.141239
7 天然温泉 浪漫湯 ドーミーイン神戸元町(ドーミーイン・野乃グループ) 兵庫県神戸市中央区栄町通2-5-1 この宿泊施設は、都会の中でリラックスできる天然温泉を提供します。快適な客室と心温まるおもてなしが魅力で、ビジネスや観光で訪れる人々にとって、癒しと便利さを兼ね備えた滞在先となっています。 1.153776
8 ANAクラウンプラザホテル大阪 大阪府大阪市北区堂島浜1-3-1 都会の中心に位置し、優雅で洗練された雰囲気を持つ高級ホテルです。快適な客室と充実した施設を備え、ビジネスや観光に最適です。レストランやバーも多彩で、質の高いサービスを提供しています。 1.161104
9 ホテル阪急インターナショナル 大阪府大阪市北区茶屋町19-19 豪華で洗練された空間が広がる宿泊施設です。快適な客室と質の高いサービスが特徴で、レストランやフィットネス施設も充実しています。都会の隠れ家のような静かで優雅な雰囲気を提供します。 1.164552

この中で、大都市かつホテルという条件を満たしているのは、10件中6件でした。

考察・まとめ

本記事では、楽天トラベルAPIを用いて取得した宿泊施設データをもとに、ベクトルデータベースであるChromaDBとLLMを活用した、簡易的なレコメンドシステムの構築を実施しました。

特に注目すべき点として、LLMによって宿泊施設情報を補足・追加することがレコメンド精度の向上に有効であるということを確認できました。

ここからは私の見解になるのですが、最初のhotelSpecialカラムと、LLMによって追加されたdescriptionカラムの情報の質的な違いが、検索結果の精度に大きな違いを与えていたのではないかと考えています。hotelSpecialカラムでは、施設側が発信するプロモーション的な情報や表面的な施設の特徴が中心に書かれていました。一方で、LLMによって生成されたdescriptionカラムには、客観的な特徴だけでなく、顧客の体験やどの人たちに向いているかなど、主観ベースに説明が書かれていました。このように、検索対象の情報にユーザー視点が加わることで、検索クエリとの接点が増え、結果としてレコメンド精度向上につながったのではないかと考えます。

ベクトルデータベースは、レコメンドシステム以外にもRAGの構築などに活用されています。自分自身もベクトルデータベースについてもっと学びたいと思いました。

宣伝

弊社ではデータ基盤やLLMのご相談や構築も可能ですので、お気軽にお問合せください。
https://solution.rounda.co.jp/

また、中途採用やインターンなど随時募集中です!

https://www.wantedly.com/companies/company_5576351/projects

Discussion