Skip to content

ルールに基づく推奨

ルールベースのレコメンデーションエンジンは、ユーザーデータと商品情報を使って、メッセージング内でユーザーに関連アイテムを提案する。LiquidとBrazeカタログまたはコネクテッドコンテンツを使用し、ユーザーの行動や属性に基づいてダイナミックなパーソナライゼーションを行う。

Liquid、カタログ、コネクテッドコンテンツの詳細については、Brazeラーニングコースをチェック:

カタログレコメンデーションエンジンの開発

  1. 製品のカタログを作成します。
  2. 各製品について、推奨製品のリストをデリミタ(パイプのようなもの| )で区切った文字列として、”product_recommendations “という名前のカラムに追加する。
  3. カタログにおすすめを探したい製品IDを渡す。
  4. そのカタログアイテムの product_recommendations 値を取得し、Liquid の分割フィルターを使用して区切り記号で区切ります。
  5. それらの 1 つ以上の ID をカタログに渡して、他の製品の詳細を収集します。

カタログのユースケース

例えば、あなたが健康食品のアプリを持っていて、ユーザーがアプリに登録した期間に応じて異なるレシピを送るコンテンツカードキャンペーンを作りたいとしよう。

  1. 以下の情報を含むカタログをCSVで作成し、アップロードする:
    - id:ユーザーがアプリに登録してからの日数に関連する一意の数字。例えば、3 は3日間に相当する。
    タイプ: comfortfresh などのレシピカテゴリーがある。
    タイトル: 各 ID に送信されるコンテンツカードのタイトル。「今週のランチ用の作り置き」や「タコスについて話そう」などです。
    リンク: レシピ記事へのリンク。
    - image_url: レシピに対応する画像, 写真。

2.カタログが Braze にアップロードされた後、カタログアイテムの一部のプレビューを確認して、情報が正確にインポートされたことを確認してください。プレビューでは項目がランダムになっているかもしれないが、レコメンデーションエンジンの出力には影響しない。

3.コンテンツカードキャンペーンを作成する。作成画面で、キャンペーンの送信先のユーザー、および表示するレシピと画像を決定する Liquid ロジックを入力します。このユースケースで、Braze はユーザーの start_date (または登録日) を取得し、現在の日付と比較します。日数の違いによって、送信されるコンテンツカードが決まります。

Title:

1
2
3
4
5
6
{% assign start_date = {{custom_attribute.${start_date}}} | date: "%s" %}
{% assign current_date = "now" | date: "%s" %}
{% assign diff = {{current_date}} | minus: {{start_date}} | divided_by: 86400 %}
{% assign days = {{diff}} | round %}
{% catalog_items Healthy_Recipe_Catalog_SMB {{days}} %}
{{ items[0].title }}

メッセージ:

1
2
3
4
5
6
7
8
9
10
{% assign start_date = {{custom_attribute.${start_date}}} | date: "%s" %}
{% assign current_date = "now" | date: "%s" %}
{% assign diff = {{current_date}} | minus: {{start_date}} | divided_by: 86400 %}
{% assign days = {{diff}} | round %}
{% catalog_items Healthy_Recipe_Catalog_SMB {{days}} %}
{% if items[0].title != blank %}
{{ items[0].body }}
{% else %}
{% abort_message('no card for today') %}
{% endif %}

画像:

1
2
3
4
5
6
{% assign start_date = {{custom_attribute.${start_date}}} | date: "%s" %}
{% assign current_date = "now" | date: "%s" %}
{% assign diff = {{current_date}} | minus: {{start_date}} | divided_by: 86400 %}
{% assign days = {{diff}} | round %}
{% catalog_items Healthy_Recipe_Catalog_SMB {{days}} %}
{{ items[0].image_url }}

4.On click behaviorセクションで、iOS、Android、Webデバイスでユーザーがコンテンツカードをクリックしたときに、どこにリダイレクトされるべきかのLiquidロジックを入力する。

1
2
3
4
5
6
{% assign start_date = {{custom_attribute.${start_date}}} | date: "%s" %}
{% assign current_date = "now" | date: "%s" %}
{% assign diff = {{current_date}} | minus: {{start_date}} | divided_by: 86400 %}
{% assign days = {{diff}} | round %}
{% catalog_items Healthy_Recipe_Catalog_SMB {{days}} %}
{{ items[0].link }}



5.テスト」タブに移動し、「ユーザーとしてメッセージをプレビュー」で「カスタムユーザー」を選択する。カスタム属性フィールドに日付を入力し、その日にサインアップしたユーザーに送信されるコンテンツカードをプレビューする。

コネクテッド・コンテンツ・レコメンデーションエンジンの開発

  1. 以下のいずれかの方法でコネクテッド・コンテンツ・エンドポイントを作成する:
    • SheetDPのようなサービスを使って、スプレッドシートをJSON APIエンドポイントに変換する。
    • カスタムビルドの社内エンドポイントを構築し、ホストおよびメンテナンスを行います。
    • Amazon PersonaliseCertonaDynamic Yieldなどの Alloysパートナーなどのサードパーティパートナー経由でレコメンデーションエンジンを購入する。
  2. コネクテッドコンテンツLiquidをメッセージボディまたはコンテンツブロックHTMLエディタに記述し、エンドポイントを呼び出してデータベースを検索する。
  3. ユーザープロファイルで見つけたカスタム属性の値でLiquidを整列させる。
  4. 結果的に正しい推薦を引き出せた。
1
2
3
4
5
6
7
8
{% connected_content YOUR-API-URL :save items %}

{% assign recommended_item_ids_from_user_profile = custom_attribute.${RECOMMENDED_ITEM_IDS} | split: ';' %}

{% for item_id in recommended_item_ids_from_user_profile %}
  {% assign recommended_item = items | where: "ITEM_ID", ITEM_ID | first %}
  recommended_item.item_name
{% endfor %}
属性 交換
YOUR-API-URL 実際のAPIのURLに置き換える。
RECOMMENDED_ITEM_IDS 推奨アイテムのIDを含むカスタム属性の実際の名前に置き換える。この属性は、セミコロンで区切られたIDの文字列であることが期待される。
ITEM_ID アイテムIDに対応するAPIレスポンスの実際の属性名に置き換える。

コネクテッド・コンテンツのユースケース

例えば、Zomato Restaurantsデータベースからお勧めのレストランを取得し、その結果をrestaurants という内部変数として保存したいとしよう。次のコネクテッドコンテンツの呼び出しができます。

1
2
3
4
{% connected_content https://developers.zomato.com/api/v2.1/search?entity_id={{city_id}}&entity_type=city&count=20&cuisines={{food_type}}&sort=rating:headers{“user-key”:“USER_KEY”} :save restaurants %}

{{city_food.restaurants[0]}}

次に、ユーザーの市区町村と食べ物の種類に基づいて、お勧めのレストランを引き出したいとしよう。ユーザーの市区町村と料理の種類のカスタム属性を呼び出しの冒頭にダイナミックに挿入し、restaurants の値を変数 city_food.restaurants に代入することで、これを行うことができます。

コネクテッド・コンテンツの呼び出しは次のようになる:

1
2
3
4
5
6
7
8
{% assign city_id = {{custom_attribute.${city_id} | default: ‘306’}} %}
{% assign food_type = {{custom_attribute.${food_type} | default: ‘471’}} %}

{%- connected_content https://developers.zomato.com/api/v2.1/search?entity_id={{city_id}}&entity_type=city&count=20&cuisines={{food_type}}&sort=rating:headers{“user-key”:“USER_KEY”} :save restaurants %}

{% assign restaurants = city_food.restaurants %}

{{city_food.restaurants[0]}}

レストラン名と評価だけを取得するようにレスポンスを調整したい場合は、次のようにフィルターを呼び出しの最後に追加することができる:

1
2
3
4
5
6
7
8
{% assign city_id = {{custom_attribute.${city_id} | default: ‘306’}} %}
{% assign food_type = {{custom_attribute.${food_type} | default: ‘471’}} %}

{%- connected_content https://developers.zomato.com/api/v2.1/search?entity_id={{city_id}}&entity_type=city&count=20&cuisines={{food_type}}&sort=rating:headers{“user-key”:”USER_KEY”} :save restaurants %}
{% assign restaurants = city_food.restaurants %}

{{city_food.restaurants[0].restaurant.name}}
{{city_food.restaurants[0].restaurant.user_rating.rating_text}}

最後に、お勧めのレストランを評価別にまとめたいとしよう。次の手順を実行します。

  1. assign 、「素晴らしい」、「非常に良い」、「良い」の評価カテゴリー用の空白の配列を作成する。
  2. for 、リスト内の各レストランの評価を調べるループを追加する。
    • 評価が「優れている」場合は、レストラン名を excellent_restaurants 文字列の後に追加し、各レストラン名を区切る * 文字を最後に追加します。
    • 評価が “Very Good “の場合、very_good_restaurants の文字列にレストラン名を追加し、最後に*を追加する。
    • 評価が “Good “の場合、good_restaurants の文字列にレストラン名を追加し、最後に*を追加する。
  3. 返されるおすすめレストランの数を各カテゴリで 4 店に制限します。

最終的な呼び出しは次のようになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
{% assign city_id = {{custom_attribute.${city_id} | default: ‘306’}} %}
{% assign food_type = {{custom_attribute.${food_type} | default: ‘471’}} %}
{%- connected_content https://developers.zomato.com/api/v2.1/search?entity_id={{city_id}}&entity_type=city&count=20&cuisines={{food_type}}&sort=rating:headers{“user-key”:”USER_KEY”} :save restaurants %}
{% assign restaurants = city_food.restaurants %}
{% assign excellent_restaurants = “” %}
{% assign very_good_resturants = “” %}
{% assign good_restaurants = “” %}
{% for list in restaurants %}
{% if {{list.restaurant.user_rating.rating_text}} == `Excellent` %}
{% assign excellent_restaurants = excellent_restaurants | append: list.restaurant.name | append: `*` %}
{% elseif {{list.restaurant.user_rating.rating_text}} == `Very Good` %}
{% assign very_good_restaurants = very_good_restaurants | append: list.restaurant.name | append: `*` %}
{% elseif {{list.restaurant.user_rating.rating_text}} == `Good` %}
{% assign good_restaurants = good_restaurants | append: list.restaurant.name | append: `*` %}
{% endif %}
{% endfor %}
{% assign excellent_array = excellent_restaurants | split: `*` %}
{% assign very_good_array = very_good_restaurants | split: `*` %}
{% assign good_array = good_restaurants | split: `*` %}

Excellent places
{% for list in excellent_array %}

{{list}}
{% assign total_count = total_count | plus:1 %}
{% if total_count >= 4 %}
{% break %}
{% endif %}
{% endfor %}

Very good places
{% for list in very_good_array %}

{{list}}
{% assign total_count = total_count | plus:1 %}
{% if total_count >= 4 %}
{% break %}
{% endif %}
{% endfor %}

Good places
{% for list in good_array %}

{{list}}
{% assign total_count = total_count | plus:1 %}
{% if total_count >= 4 %}
{% break %}
{% endif %}
{% endfor %}

ユーザー端末でのレスポンシブの表示例については、以下のスクリーンショットを参照のこと。

考慮事項

どのレコメンデーションエンジンが、あなたの利用可能なリソースやユースケースに適しているかを決める際には、この検討表を参考にしてほしい:

考慮事項 Liquid カタログCSV カタログ API コネクテッドコンテンツ
データポイントを消費しない サポートされていない 対応 対応 対応
コードソリューションなし サポートされていない Liquid 事前生成されている場合にサポートされる サポートされていない サポートされていない
多くの場合、高度な Liquid が必要 対応 サポートされていない サポートされていない 対応
製品フィードのデータ更新 サポートされていない 推奨事項が頻繁に更新されない場合はサポートされる 推奨事項が1時間ごとに更新される場合はサポートされる サポートされており、おすすめがリアルタイムまで更新される
Braze UI内で推薦文を生成する 対応 対応 対応 Braze以外で生成された場合はサポートされない。
推奨データのホスティング、マネージャー、トラブルシューティングがない 対応 対応 対応 サポートされていない
「このページはどの程度役に立ちましたか?」
New Stuff!