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

    この投稿をXにポストするこの投稿をFacebookにシェアするこのエントリーをはてなブックマークに追加

はじめに

近年、様々な場面でレコメンドシステムが活用されています。代表的な例として、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の利用方法などは割愛させていただきますが、参考になるサイトを紹介いたします。

環境は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)
hotelNohotelNamehotelSpecial・・・
016654ホテル近鉄ユニバーサル・シティ【楽天トラベルゴールドアワード6年連続受賞】宿泊者特典有り■大阪駅から最短約12分・・・
1172378リーベルホテル大阪≪5年連続楽天トラベルアワード受賞≫2024ゴールドアワード☆ホテル&旅館オブ・ザ・イヤー全国8位☆・・・
271921ホテル京阪 ユニバーサル・タワー駅・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-252食付きプランなら朝夕ともに【個室】でご用意★徒歩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-252食付きプランなら朝夕ともに【個室】でご用意★徒歩2分圏内に24時間営業のスーパーもある湖畔の宿1.144245
3WoodHighROOMS和歌山県和歌山市吉田820出張も旅行もここで決まり!和歌山の繁華街の宿1.144906
4お宿 あしたも京都府京都市右京区嵯峨野宮ノ元町49-19最大6名様まで京間畳の広々としたお部屋で団体のご宿泊も広々とお寛ぎ頂けます。1.155894
5HOTEL ARROWS ARASHIYAMA(ホテルアローズ嵐山)京都府京都市右京区梅津中倉町18ー8ー2階【R1年11月OPEN】全16室ツイン/禁煙の素泊まりホテル♪無料P有◎松尾大社・鈴虫寺・苔寺近く。1.158087
6ホテル阪急インターナショナル大阪府大阪市北区茶屋町19-19高層階に位置する客室からは大阪の街並みが一望!記念日におすすめなプランも充実♪1.163016
7ラ・ジェント・ホテル大阪ベイ大阪府大阪市此花区桜島1丁目1番57明るい雰囲気の気取らないモダンなホテル。ユニバーサルシティエリアにあり大阪市内へのアクセスも◎1.164892
8Guest 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)
hotelNamehotelSpecialdescription
0ホテル近鉄ユニバーサル・シティ【楽天トラベルゴールドアワード6年連続受賞】宿泊者特典有り■大阪駅から最短約12分この宿泊施設は、テーマパークに隣接しアクセスが便利で、家族連れや友人同士の旅行に最適です。客室はゆったりとした空間を提供し、パークをテーマにした装飾が施されています。快適な滞在をサポートする多彩なサービスが魅力です。
1リーベルホテル大阪≪5年連続楽天トラベルアワード受賞≫2024ゴールドアワード☆ホテル&旅館オブ・ザ・イヤー全国8位☆ホテルは、洗練された内装と快適な客室が魅力で、ゲストに贅沢な滞在を提供します。レストランでは多彩な料理が楽しめ、温泉やフィットネス施設も充実しています。アクセスの良さと親切なスタッフのサービスが好評です。
2ホテル京阪 ユニバーサル・タワー駅・USJ徒歩スグのオフィシャルホテル!31階天然展望温泉(有料)は大人気この宿泊施設は、テーマパークに近く、アクセスが良いのが魅力です。ラグジュアリーな雰囲気を持ち、大浴場やレストランも充実しています。家族連れやカップルに適しており、快適な滞在が期待できます。

※注意

LLMによって生成された情報には、ハルシネーション(事実とは異なる内容)が含まれる可能性があります。情報の取り扱いには十分ご注意ください。


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
7resora 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
8ANAクラウンプラザホテル大阪大阪府大阪市北区堂島浜1-3-1都会の中心に位置し、優雅で洗練された雰囲気を持つ高級ホテルです。快適な客室と充実した施設を備え、ビジネスや観光に最適です。レストランやバーも多彩で、質の高いサービスを提供しています。1.161104
9ホテル阪急インターナショナル大阪府大阪市北区茶屋町19-19豪華で洗練された空間が広がる宿泊施設です。快適な客室と質の高いサービスが特徴で、レストランやフィットネス施設も充実しています。都会の隠れ家のような静かで優雅な雰囲気を提供します。1.164552

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


考察・まとめ

本記事では、楽天トラベルAPIを用いて取得した宿泊施設データをもとに、ベクトルデータベースであるChromaDBとLLMを活用した、簡易的なレコメンドシステムの構築を実施しました。
特に注目すべき点として、LLMによって宿泊施設情報を補足・追加することがレコメンド精度の向上に有効であるということを確認できました。


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


宣伝

弊社ではデータ基盤策定からLLMまで、お客様にあったプロセスでの提案とご支援が可能です、お気軽にお問合せください。

また、中途採用やインターンの問い合わせもお待ちしています!

お問い合わせ・資料請求

プロジェクトに関するご質問や詳細な情報が必要な場合は、お気軽にお問い合わせください。

サービス紹介資料

当社のサービスや実績について詳しく解説した資料をご覧いただけます。

資料をダウンロード

無料相談・お問い合わせ

お持ちの課題について、広くお問い合わせを受け付けています。

問い合わせをする
    この投稿をXにポストするこの投稿をFacebookにシェアするこのエントリーをはてなブックマークに追加

関連記事

「生成AI ≠ これまでのAI」 としてプロジェクトを進めるためのマインド
「生成AI ≠ これまでのAI」 としてプロジェクトを進めるためのマインド
記事を読む
Nemo Guardrailsを用いたLLMガードレールの適用
Nemo Guardrailsを用いたLLMガードレールの適用
記事を読む
Claudeを使って有価証券報告書(PDF)の情報をDWHに蓄積する
Claudeを使って有価証券報告書(PDF)の情報をDWHに蓄積する
記事を読む