使用 ai_generate_text() 和 OpenAI 分析客户评价

重要

此功能目前以公共预览版提供。

警告

AI 函数 ai_generate_text() 已弃用。 Databricks 建议在外部模型中使用 ai_query

本文演示如何使用内置的 Azure Databricks SQL 函数 ai_generate_text() 查看客户评价并确定是否需要生成回复。 请参阅 Azure Functions 中的 AI 函数,详细了解此函数。

本指南中的数据集和命令来自 Azure Databricks 演示“使用 Azure Databricks SQL AI 函数大规模对客户评价进行操作”。 该演示使用 OpenAI 生成的假数据来模拟提交到某电商网站的杂货产品的客户评价。

Customer reviews

此示例将引导你完成以下步骤:

  • 将自由格式的客户评价文本分散为其构成实体。
  • 对于每个实体,确定情绪以及是否需要回复客户。
  • 生成回复,在其中提到可能会让客户满意的替代产品。

ai_generate_text data flow

先决条件

提示设计

从 GPT 模型获取有用结果的关键是:

  • 问的问题语言组织清晰。
  • 具体说明你期望得到哪种类型的答案。

若要获取可以轻松存储在表格中的结果格式,可以要求模型以反映 JSON 表示形式的字符串格式返回结果,并指定预期的架构。

下面是这种场景之下的示例提示:

客户留下一条评价。 后续跟进在评价中表达不满的客户。

提取提及的所有实体。 对于每个实体:

  • 将情绪分为[“正面”、“中性”、“负面”]这三类
  • 客户是否需要后续跟进:是或否
  • 需要后续跟进的原因

仅返回 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")
);

下面是为某个客户对“国家优选”零食曲奇的评价生成的示例回复消息。

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;