使用 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 生成的假数据来模拟提交到某电商网站的杂货产品的客户评价。
此示例将引导你完成以下步骤:
- 将自由格式的客户评价文本分散为其构成实体。
- 对于每个实体,确定情绪以及是否需要回复客户。
- 生成回复,在其中提到可能会让客户满意的替代产品。
先决条件
- 需要一个数据集才能运行本指南中的命令。 可在“使用 AI 函数生成假数据”笔记本中创建一个假数据集。
- 本指南中的 SQL 命令必须在 Databricks SQL 查询编辑器中运行。 它们不能使用交互式群集直接在 Azure Databricks 笔记本中运行。
- 函数
ai_generate_text()
仅在专业版或无服务器 SQL 仓库上以公共预览版提供。- 要注册公共预览版,请填写并提交 AI Functions 公共预览版注册表。
- Azure OpenAI 密钥。
- 将密钥存储在 Databricks 机密中。 在此示例中,将 API 密钥存储在范围
tokens
和机密azure-openai
中。 请参阅 ai_generate_text() 的设置和注意事项。
提示设计
从 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;