Sure, here's the translated text in simplified Chinese, keeping the HTML structure intact: ```html

GPT-4o 的 Nl2SQL 盲点:销售 KPI 计算的不准确性

```

Sure, here's the HTML structure with the text translated into simplified Chinese: ```html

毫无疑问,LLM(大型语言模型)知道如何将自然语言翻译成SQL代码(NL2SQL)。过去两年里,基于LLM的NL2SQL框架展示了最先进的性能。显著的例子包括DAIL-SQL、DIN-SQL和C3,它们目前在Spider基准测试中名列前茅¹。

``` Let me know if you need anything else!

在自然语言到商业智能的翻译(NL2BI)领域仍然是一个未被充分探索的领域。

Sure, here's the translated text in simplified Chinese, keeping the HTML structure: ```html

一个 NL2SQL 的主要实际应用是计算常见的销售关键绩效指标,例如:

```
  • 年度同比(YoY):比较与前一年相同指标的指标,有助于识别增长趋势和季节性模式。
  • 周期计算:例如逐周(WoW)或逐日(DoD),这些指标将特定时间段的表现与前一等效时间段进行比较,从而提供对短期趋势和波动的洞察。
  • Sure, here's the translation in simplified Chinese, maintaining the HTML structure: ```html

    年初至今(YTD):从本年年初至今日期的表现,提供了一个累积的进展视图,并有助于跟踪年度目标。

    ```

```html

这些计算构成了对销售、销售单位、转换率等简单解释的骨干。它们对于理解现实世界数据分析中的数据意义至关重要。

```

文献和基准测试未涵盖的一个方面是 GPT-4 在基本销售 KPI 计算方面的极差表现。本文的目的是揭示 LLM 在生成针对常见销售 KPI 的强大 SQL 查询方面的性能。此探索旨在确定主要挑战并建议可能的缓解途径。对于讨论的所有实验,您将能够亲自测试结果。

实验设置

Sure, here's the translated text in simplified Chinese: ```html 为了使实验简单易复制,查询是在我上一篇Medium文章中使用的销售表的简化版本上执行的。该表包括以下字段:日期(purchase_date)、分类数据(product_category)和数值数据(gross_sales)。这种简化使我们能够隔离和专注于实验的特定要素,同时减少LLMs的幻觉。 ```

Sure, here's the translated text in simplified Chinese, keeping the HTML structure: ```html

实验的目标很简单:评估GPT-4o是否能够生成稳健的SQL代码来计算年同比——一项基本的销售KPI指标。所问的问题是:

```

Sure, here's the translated text in simplified Chinese while keeping the HTML structure: ```html

产品营销类别的产品年度销售额是多少?

```

Sure, here's the translated text in simplified Chinese: ```html

英语文本翻译

你可以复制并粘贴下面的提示,自行检查结果。

```

这是基本提示:

You're a specialist in generating SQL code in Google Big Query syntax from business question about the following table:
sales_table('purchase_date','product_marketing_category','gross_sales')

Here are the columns present in along with a descripition:
- purchase_date: The date when the purchase was made.
- product_marketing_category: The marketing category under which the product is classified.
- gross_sales: The total sales amount generated from the order.

Please, generate the SQL code to answer the following question:
Question: "What was the YoY sales by product_marketing_category on daily level?"

Sure, here is "Baseline Prompt" translated to simplified Chinese, while keeping the HTML structure: ```html 基准提示 ``` This HTML snippet ensures the text "Baseline Prompt" is displayed in simplified Chinese.

```html

模型自信地输出以下查询。 这里的主要问题是LLM选择使用LAG函数。 虽然乍一看这似乎是合乎逻辑的,但LAG函数在处理不完整的数据时可能会产生不正确的结果,因为它忽略了NULL值,在现实世界的数据集中非常常见。 在下面的例子中,特别是因为我们正在处理“每日级别”的细粒度,这可能导致完全错误的计算。

```

Sure, here's the translated text in simplified Chinese while keeping the HTML structure: ```html 想象一下,如果目标是比较2024年6月9日与去年同一日期(2023年6月9日)的情况——换句话说是年同比增长,但实际上它与之前的一个随机日期进行了比较。这正是在下面的查询中发生的情况。当存在空值时,LAG函数简单地忽略行(不计算它们),因为它计算的是行数而不是实际日期。 ```

WITH daily_sales AS (
SELECT
purchase_date,
product_marketing_category,
SUM(gross_sales) AS total_sales
FROM
sales_table
GROUP BY
purchase_date,
product_marketing_category
),
daily_sales_with_prev_year AS (
SELECT
ds.purchase_date,
ds.product_marketing_category,
ds.total_sales AS current_year_sales,
LAG(ds.total_sales, 365) OVER (PARTITION BY ds.product_marketing_category ORDER BY ds.purchase_date) AS prev_year_sales
FROM
daily_sales ds
)
SELECT
purchase_date,
product_marketing_category,
current_year_sales,
prev_year_sales,
((current_year_sales - prev_year_sales) / prev_year_sales) * 100 AS YoY_growth_percentage
FROM
daily_sales_with_prev_year
ORDER BY
purchase_date,
product_marketing_category;

在 HTML 结构中添加一个特定指令以生成健壮的 SQL 代码。

解决这个问题的一个明显方法是添加一条明确的指导,指导模型编写健壮的 SQL 代码。因此,在基线提示的末尾添加了以下指令。

You must write robust SQL code capable of handling missing values \
and avoiding syntax errors.

Sure, here's the translated text in simplified Chinese while keeping the HTML structure: ```html

生成的 SQL 代码看起来比第一个还要糟糕。它仍然使用 LAG 函数,并且由于某种原因避免使用 CTEs,这使得查询更加难以理解和阅读。因此,仅仅添加一个指令并没有解决问题。

```
SELECT
CURRENT_DATE() AS run_date,
DATE(purchase_date) AS purchase_date,
product_marketing_category,
gross_sales,
gross_sales - LAG(gross_sales) OVER (
PARTITION BY product_marketing_category, EXTRACT(MONTH FROM purchase_date), EXTRACT(DAY FROM purchase_date)
ORDER BY purchase_date
) AS yoy_sales_change,
SAFE_DIVIDE(
gross_sales - LAG(gross_sales) OVER (
PARTITION BY product_marketing_category, EXTRACT(MONTH FROM purchase_date), EXTRACT(DAY FROM purchase_date)
ORDER BY purchase_date
),
LAG(gross_sales) OVER (
PARTITION BY product_marketing_category, EXTRACT(MONTH FROM purchase_date), EXTRACT(DAY FROM purchase_date)
ORDER BY purchase_date
)
) AS yoy_sales_change_pct
FROM (
SELECT
purchase_date,
product_marketing_category,
COALESCE(gross_sales, 0) AS gross_sales
FROM
sales_table
)
WHERE
EXTRACT(YEAR FROM purchase_date) BETWEEN EXTRACT(YEAR FROM CURRENT_DATE()) - 1 AND EXTRACT(YEAR FROM CURRENT_DATE())
ORDER BY
purchase_date,
product_marketing_category;

Sure, here's the translation of "Adding a specific instruction to not use LAG functions" in simplified Chinese while keeping the HTML structure: ```html 添加一个具体指示,不要使用LAG函数 ```

```html

执行此计算的正确方法之一是使用JOIN,这可以确保针对每一天正确执行预期的计算(年度对比)。因此,在提示的底部添加了以下指令:
```
**Avoid Using the LAG Function**: The LAG function can lead to inaccurate \
results when there are missing values in the data. \
Consider using alternative methods, such as JOINs that better handle gaps \
in the data set.

Sure, here's the translation: 生成的查询再次是错误的。尽管它选择不使用LAG函数,但查询显示了一系列的缺陷:

  • ```html

    DATE_SUB()逻辑错误:如果你仔细分析,SQL代码实际上并没有计算任何东西 —— 年度增长始终为0,这毫无意义。这是因为,在previous_year_sales CTE中,SQL代码使用了DATE_SUB(purchase_date, INTERVAL 1 YEAR)。当这个CTE稍后在最终的SELECT语句中与EXTRACT(YEAR FROM p.previous_purchase_date) + 1进行LEFT JOIN时,它只是创建了一个列的副本。

    ```
  • 有缺陷的连接选择:模型决定使用左连接。左连接保留左表的所有记录,并匹配右表中可用的记录。然而,更健壮的方法是使用全连接。这可以确保即使当前年份的销售数据为NULL,但是,去年的销售数据(如果不为NULL)仍然会显示在最终的选择语句中。
  • Sure, here is the translated text in simplified Chinese while keeping the HTML structure: ```html
    除零操作:更糟糕的是,生成的SQL代码没有使用SAFE_DIVIDE()。显然,这远非执行此类计算的健壮方式。当我在生产数据库上执行查询时,遇到了以下错误:
    ```
WITH daily_sales AS (
SELECT
purchase_date,
product_marketing_category,
SUM(gross_sales) AS daily_gross_sales
FROM
sales_table
GROUP BY
purchase_date,
product_marketing_category
),
current_year_sales AS (
SELECT
purchase_date,
product_marketing_category,
daily_gross_sales,
EXTRACT(YEAR FROM purchase_date) AS year,
EXTRACT(MONTH FROM purchase_date) AS month,
EXTRACT(DAY FROM purchase_date) AS day
FROM
daily_sales
),
previous_year_sales AS (
SELECT
DATE_SUB(purchase_date, INTERVAL 1 YEAR) AS previous_purchase_date,
product_marketing_category,
daily_gross_sales AS previous_daily_gross_sales
FROM
daily_sales
)
SELECT
c.purchase_date,
c.product_marketing_category,
c.daily_gross_sales AS current_year_sales,
p.previous_daily_gross_sales AS previous_year_sales,
(c.daily_gross_sales - p.previous_daily_gross_sales) / p.previous_daily_gross_sales * 100 AS yoy_growth_percentage
FROM
current_year_sales c
LEFT JOIN
previous_year_sales p
ON
c.product_marketing_category = p.product_marketing_category
AND c.month = EXTRACT(MONTH FROM p.previous_purchase_date)
AND c.day = EXTRACT(DAY FROM p.previous_purchase_date)
AND c.year = EXTRACT(YEAR FROM p.previous_purchase_date) + 1
ORDER BY
c.purchase_date,
c.product_marketing_category;

结论

```html

ChatGPT-4o在生成SQL代码执行年度对比(YoY)计算方面遇到了很大困难,这是一个基本的销售关键绩效指标。即使给出明确的指导,模型也无法生成可用的查询。然而,还有其他策略可考虑,比如使用少量提示工程和RAG,以便将响应引导到正确的方向。

```

以下只是一个非常简单的例子;在生产数据库中,该模型可能会更加困难。此外,还有其他多个销售关键绩效指标,例如其他周期计算(WoW,QoQ)和年度至今(YTD),在这些指标上,LLM可能也会遇到困难。希望这能为问题提供一些启示,并激发您的一些想法。

请随时与我分享,如果您成功解决了这个问题!

Sure, here's the translation: ```html 参考资料 ```

Sure, here's the HTML structure with the translated text in simplified Chinese: ```html

[1] — Li, B., Luo, Y., Chai, C., Li, G., & Tang, N. (2024). 自然语言转SQL的黎明:我们已经完全准备好了吗? http://arxiv.org/abs/2406.01265.

```

Sure, here's how you would write "Reach out" in simplified Chinese while keeping the HTML structure intact: ```html 联系我们 ``` In this HTML snippet: - `` is used to mark up the text. - `lang="zh-CN"` indicates the language is simplified Chinese. - "联系我们" translates to "Reach out" in Chinese.

  • LinkedIn: https://www.linkedin.com/in/giovannigg/
  • Sure, here's the translated text in simplified Chinese, while keeping the HTML structure: ```html

    电子邮件:guerreiro.giovanni@gmail.com

    ```

2024-06-11 03:46:18 AI中文站翻译自原文