ai_generate_text()
と OpenAI を使用した顧客レビューの分析
重要
この機能はパブリック プレビュー段階にあります。
警告
AI 関数 ai_generate_text()
は非推奨です。 Databricks は、外部モデルで ai_query を使うことをお勧めします。
この記事では、組み込みの Databricks SQL 関数 ai_generate_text()
を使用して顧客レビューを調べ、応答を生成する必要があるかどうかを判断する方法について説明します。 関数の詳細については、「Azure Databricks 上の AI Functions」 を参照してください。
このガイドのデータセットとコマンドは、Databricks のデモ SQL AI Functions を使用した大規模な Databricks アクション カスタマー レビュー に記載されています。 このデモでは、OpenAI によって生成された偽のデータを使用して、電子商取引 Web サイトに送信された食料品製品の顧客レビューを模倣します。
この例では、次の手順を実行します:
- 自由形式の顧客レビュー テキストを構成エンティティに分割する。
- エンティティごとに、センチメントと応答が顧客に返される必要があるかどうかを判断します。
- 顧客を満足させる可能性のある代替製品に言及する応答を生成する。
前提条件
- このガイドのコマンドを実行する場合は、それを実行するためのデータセットが必要です。 AI Functions を使用して偽のデータを生成する ノートブックで、偽のデータセットを作成できます。
- このガイドの SQL コマンドは、Databricks SQL クエリ エディターで実行する必要があります。 対話型クラスターを使用して Azure Databricks ノートブックで直接実行することはできません。
- この
ai_generate_text()
関数は、プロ またはサーバーレス SQL ウェアハウスのパブリック プレビューでのみ使用できます。- パブリック プレビューに登録するには、「AI 関数パブリック プレビュー登録フォーム」に入力して送信してください。
- Azure OpenAI キー。
- キーを Databricks シークレット に格納します。 この例では、API キーを スコープ
tokens
と シークレットazure-openai
に格納します。 ai_generate_text() の設定と考慮事項 を参照してください。
プロンプト デザイン
GPT モデルから有用な結果を取得するための鍵は次のとおりです:
- 適切な形式の質問をします。
- 予想される回答の種類について具体的であること。
テーブルに簡単に格納できるフォームで結果を取得するには、JSON
表現を反映した文字列で結果を返すようにモデルに依頼し、期待されるスキーマを指定します。
このシナリオのプロンプトの例を次に示します:
顧客がレビューを残しました。 不満に思われる人をフォローアップします。
記載されているすべてのエンティティを抽出します。 各エンティティについて:
- センチメントを ["POSITIVE","NEUTRAL","NEGATIVE"] として分類する
- 顧客がフォローアップを必要とするかどうか: Y または N
- フォローアップが必要な理由
JSON のみを返します。 JSON の外部に他のテキストはありません。
JSON 形式:
{
"entities": [{
"entity_name": "entity_name",
"entity_type": "entity_type",
"entity_sentiment": "entity_sentiment",
"followup": "Y or N for follow up",
"followup_reason": "reason for followup"
}]
}
レビュー:
<’insert_review_text_here’>
SQL 関数を作成する
Databricks では、質問を詳細な SQL 関数に分解して、組織内の他のシナリオで再利用できるようにすることをお勧めします。
このセクションでは、エンド ユーザーからの ai_generate_text()
呼び出しの詳細を抽象化し、それらの関数を Azure OpenAI と対話するためのインターフェイスとして使用するために、SQL 関数を作成します。
Azure OpenAI の呼び出しを処理する
次のラッパー関数 prompt_handler()
は、Azure OpenAI へのすべての呼び出しを処理します。 Azure OpenAI API キーは Databricks シークレットに格納され、secret()
関数で参照できます。 また、Azure OpenAI リソース名 (resourceName
) とモデルのデプロイ名 (deploymentName
) を渡すこともできます。
CREATE OR REPLACE FUNCTION PROMPT_HANDLER(prompt STRING)
RETURNS STRING
RETURN AI_GENERATE_TEXT(prompt,
"azure_openai/gpt-35-turbo",
"apiKey", SECRET("tokens", "azure-openai"),
"temperature", CAST(0.0 AS DOUBLE),
"deploymentName", "llmbricks",
"apiVersion", "2023-03-15-preview",
"resourceName", "llmbricks"
);
顧客レビュー データを分析する
annotate_review()
関数は、エンティティ、エンティティセンチメント、フォローアップが必要かどうか、およびその理由を使用してレビューに注釈を付けます。 プロンプトは整形式の json
表現を返すので、Delta テーブルに挿入するなど、ダウンストリームでクエリを実行しやすくするために struct
型を返すように関数に指示できます。
CREATE OR REPLACE FUNCTION ANNOTATE_REVIEW(review STRING)
RETURNS STRUCT<entities: ARRAY<STRUCT<entity_name: STRING, entity_type: STRING, entity_sentiment: STRING, followup: STRING, followup_reason: STRING>>>
RETURN FROM_JSON(
PROMPT_HANDLER(CONCAT(
'A customer left a review. Follow up with anyone who appears unhappy.
Extract all entities mentioned. For each entity:
- classify sentiment as ["POSITIVE","NEUTRAL","NEGATIVE"]
- whether customer requires a follow-up: Y or N
- reason for requiring followup
Return JSON ONLY. No other text outside the JSON. JSON format:
{
entities: [{
"entity_name": <entity name>,
"entity_type": <entity type>,
"entity_sentiment": <entity sentiment>,
"followup": <Y or N for follow up>,
"followup_reason": <reason for followup>
}]
}
Review:
', review)),
"STRUCT<entities: ARRAY<STRUCT<entity_name: STRING, entity_type: STRING, entity_sentiment: STRING, followup: STRING, followup_reason: STRING>>>"
);
顧客レビュー データセットからデータを渡して、annotate_review()
関数が自由形式の顧客レビューを分類する方法を確認できます。
SELECT review_body,
ANNOTATE_REVIEW(review_body) AS review_annotated
FROM dbdemos.openai_demo.fake_reviews
WHERE product_category = "Grocery"
LIMIT 3;
レコメンデーションを使用して応答を生成する
顧客の応答を確認したら、この generate_response()
関数を使用して、苦情に基づいて顧客への応答を生成し、試してみる代替製品のレコメンデーションを含めることができます。
CREATE OR REPLACE FUNCTION GENERATE_RESPONSE(product STRING, entity STRING, reason STRING)
RETURNS STRING
RETURN PROMPT_HANDLER(
CONCAT("What alternative products can you recommend for ", product,
" when a customer had a complaint about ", entity, " because ", reason,
"Give me a response in the tone of an empathetic message back to the customer; only provide the body")
);
次の例では、Country Choice Snacking Cookie に関する顧客のレビューに対するサンプル メッセージ応答を生成します。
SELECT GENERATE_RESPONSE("Country Choice Snacking Cookies", "cookies", "Quality issue") AS customer_response
アドホック クエリ
新しく作成した prompt_handler()
関数を使用してアドホック クエリを作成することもできます。
たとえば、レビューが飲料について説明しているかどうかを理解することに関心がある場合があります。
SELECT review_id,
PROMPT_HANDLER(
CONCAT(
"Does this review discuss beverages? Answer Y or N only, no explanations or notes. Review: ", review_body)
) AS discusses_beverages,
review_body
FROM dbdemos.openai_demo.fake_reviews
WHERE review_id IN ("R9LEFDWWXPDEY", "R27UON10EV9FSV", "R299ZTEFIAHRQD")
ORDER BY discusses_beverages DESC;