最近、開発者チームと私はRevenueCatの東京ハッカソンのためにiOSアプリケーションの開発を始めました。RevenueCatを使用したサブスクリプション機能を備えたアプリケーションを2週間で作成するという課題がありました。私たちのアイデアは、パーソナライズされたアートギャラリー展示会の推薦を作成することでした。ユーザーがアプリケーションに親近感を持ち、価値ある情報を得られれば、毎月のサブスクリプション料金を喜んで支払うだろうという仮説を立てました。
これを実現するために、主な目標として、ユーザーが共感できる東京のアートギャラリー展示会を見つけ、旅行の計画を立て、展示会に関するパーソナライズされた情報を提供することに取り組みました。
アプリケーションをパーソナライズするために、ユーザーの現在の「雰囲気」を理解するための3つの異なるタイプの選択肢を用意しました。これらのタイプは音、質感、色でした。これらの選択を使用して、以下のことを行う方法を見つける必要がありました:
「雰囲気」に基づいてパーソナライズされたギャラリー展示会の説明を作成する。
ユーザーの選択(「雰囲気」)と無関係な展示会をフィルタリングする。
チームのバックエンド開発者が複数のAmazonサービスを使用していたため、AI関連のAPI呼び出しのソースとしてAmazon Bedrockも使用することにしました。BedrockでアクセスできるAnthropicのClaude 3.5モデルを使用することにしました。
このチャットAPIでのプロンプト作成は、主にシステムプロンプトとユーザー入力を使用します。
私たちのアイデアは、ユーザーの雰囲気の選択を使用して、各ギャラリーに対して最初に提供できる基本的な説明に基づいて、新しいギャラリー展示会の説明を作成するプロンプトシステムを作成することでした。
最初の反復は以下のようなものでした:
システムプロンプト
「あなたは、3つのユーザー選択を使用して、以下に元々記述されているアート展示会の新しい説明を書くモバイルアプリケーションです。ユーザーの選択を使用して、ユーザーがギャラリーを好む理由を説明し、展示会とユーザーの選択との関連性を強調してください。」
元の展示会の説明:
「魚は水の中にいることを知らない」は、...(ここに完全な展示会の説明が記載されていました)
そのシステムプロンプトを使用して、アプリでユーザーの選択を取得し、単純にそれらをユーザー入力に以下のように入力しました:
ユーザー入力
「ユーザーの選択:「ピンク色」、「プラスチックの光沢のある質感」、「海の音」」
この設定は非常にうまく機能し、ユーザーの選択に基づいた新しくユニークなギャラリー展示会の説明を生成しました。
次に行うべきことは、ユーザーの選択と無関係なギャラリーをフィルタリングする方法を追加することでした。そのために、システムプロンプトにテキストを追加して、「関連性スコア」と呼ぶものを作成しました。プロンプトのテキストは単純に以下のようなものでした:
「また、ユーザーの選択が展示会の説明にどの程度関連しているかを、100点満点で数字で示してください。」
それは機能し、数字も返されました。次に、APIで読み取り可能にするだけでよかったので、単にJSON形式のレスポンスを要求しました。
「あなたの回答は以下のようなJSON形式でフォーマットされるべきです:
{
newExhibitionDescription: string,
connectednessRating: number,
}
」
そして、新しいパーソナライズされた展示会の説明と、関連性のない展示会をフィルタリングするために使用できる関連性スコアが完成しました。ハッカソンの2週間以内にすべてのプロンプト作成を機能させ、サブスクリプション機能を有効化することができました。達成できるかどうか確信が持てませんでしたが、実現し、今日ではアプリストアでアプリを見つけることができます!
この技術を使用することで、ユーザーが本当に楽しみ、喜んで支払いたいと思うパーソナライゼーションをアプリに組み込むことができました!