使用 ai_generate_text()
和 OpenAI 分析客戶評論
重要
這項功能處於公開預覽狀態。
警告
AI 函 ai_generate_text()
式已被取代。 Databricks 建議搭配外部模型使用ai_query。
本文說明如何使用內建的 Databricks SQL 函式來 ai_generate_text()
檢查客戶檢閱,並判斷是否需要產生回應。 如需函式的詳細資訊,請參閱 Azure Databricks 上的 AI Functions。
本指南中的數據集和命令來自 Databricks 示範動作客戶大規模檢閱與 Databricks SQL AI Functions。 此示範會使用 OpenAI 所產生的假數據,模擬提交至電子商務網站的雜貨店客戶評論。
此範例會逐步引導您完成:
- 將自由格式客戶檢閱文字細分為其組成實體。
- 針對每個實體,判斷情感,以及是否需要回應回客戶。
- 產生回應,提及可能滿足客戶的替代產品。
必要條件
- 如果您想要在本指南中執行命令,您需要資料集才能執行。 您可以在使用 AI Functions 筆記本產生假數據中建立假數據集。
- 本指南中的 SQL 命令必須在 Databricks SQL 查詢編輯器中執行。 無法使用互動式叢集直接在 Azure Databricks Notebook 中執行。
- 函
ai_generate_text()
式僅適用於 Pro 或無伺服器 SQL 倉儲的公開預覽版。- 若要在公開預覽版中註冊,請填入並提交 AI Functions 公開預覽註冊窗體。
- 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 函式,以便將其重複使用於組織內的其他案例。
在本節中,您會建立 SQL 函式,以便從使用者擷取呼叫的詳細 ai_generate_text()
數據,並使用這些函式作為與 Azure OpenAI 互動的介面。
處理對 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
表示法,因此您可以指示函式傳回 struct
類型,以便更容易查詢下游,例如將它插入 Delta 資料表。
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")
);
下列會針對客戶在國家/地區選擇零食 Cookie 上的評論產生範例訊息回應。
SELECT GENERATE_RESPONSE("Country Choice Snacking Cookies", "cookies", "Quality issue") AS customer_response
Adhoc 查詢
您也可以使用新建立 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;