共用方式為


使用 ai_generate_text() 和 OpenAI 分析客戶評論

重要

這項功能處於公開預覽狀態

警告

AI 函式 ai_generate_text() 已被取代。 Databricks 建議將 ai_query 與外部模型搭配使用。

本文說明如何使用內建的 Databricks SQL 函式來 ai_generate_text() 檢查客戶檢閱,並判斷是否需要產生回應。 請參閱 使用 Azure Databricks AI Functions 將數據套用 AI,以獲取有關該函式的更多詳細資訊。

本指南中的數據集和命令來自 Databricks 部落格,使用 Databricks SQL AI Functions 大規模處理客戶評論

客戶評論

此範例會逐步引導您完成:

  • 將自由格式客戶檢閱文字細分為其組成實體。
  • 針對每個實體,判斷情感,以及是否需要回應回客戶。
  • 產生回應,提及可能滿足客戶的替代產品。

AI生成文字資料流

必要條件

提示設計

從 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")
);

下列會生成針對客戶在 Country Choice Snacking Cookies 上評論的回應範例訊息。

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;