共用方式為


使用 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_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;