使用 Looker 資料來源的撰寫內容,引導服務專員行為

本頁說明如何編寫有效的提示,以供 Looker 的 Conversational Analytics API 資料代理程式使用。這些提示是您使用 system_instruction 參數定義為字串的撰寫內容。

關於 Looker 中撰寫情境的注意事項

Looker 開發人員也可以使用 LookML 參數,直接在 Looker 模型中定義部分內容。資料代理程式會從這些 LookML 定義中收集適當的脈絡,您不必在系統指令的鍵定義中重新定義這些脈絡。

資料代理程式可從下列 LookML 參數衍生背景資訊:

  • description:這個 LookML 參數只會定義欄位的說明,對應於您可以在 fieldsmeasures 鍵中定義的說明。
  • synonyms:這個 LookML 參數只會定義欄位的同義字,對應於您在 fieldsmeasures 鍵中定義的同義字。
  • relationship:這個 LookML 參數會定義已聯結檢視區塊之間的 join 關係。

系統指令主要元件範例

以下章節提供 Looker 系統指令主要元件的範例。這些鍵包括:

如要瞭解這些重要元件,請參閱「使用撰寫的內容引導代理程式行為」說明文件頁面。

使用 tables 描述資料

下列 YAML 程式碼區塊顯示表格 order_itemstables 鍵基本結構:

- tables:
  - table:
    - name: order_items
    - tags:
      - ecommerce
      - transaction

使用 fields 說明常用欄位

下列 YAML 程式碼範例說明 orders_items 表格的 total_sale_pricetotal_gross_margincreated_month_name30_day_repeat_purchase_ratecount 等重要欄位:

- tables:
  - table:
    - name: order_items
    - synonyms:
        - sales
        - line items
        - items sold
        - orders
    - fields:
      - field:
        - name: total_sale_price
        - description: "The total monetary value from items sold. Corresponds to 'Revenue'."
        - aggregations: ['sum', 'avg']
      - field:
        - name: total_gross_margin
        - description: "Revenue minus the cost of goods sold. Corresponds to 'Profit'."
        - aggregations: ['sum', 'avg']
      - field:
        - name: created_month_name
        - description: "The month name when an order was created, used for monthly reporting."
      - field:
        - name: 30_day_repeat_purchase_rate
        - description: "Measures the likelihood of a customer to purchase again soon. Corresponds to 'Buying Propensity'."
        - aggregations: ['avg']
      - field:
        - name: count
        - description: "A count of order items."
        - aggregations: ['sum']

在本範例中,欄位 synonyms 已在基礎 LookML 中定義,因此不需要在此重新定義。

使用 measures 定義業務指標

舉例來說,您可以將資料表計算 profit 定義為收益減去費用的計算,如下所示:

- tables:
  - table:
    - name: order_items
    - measures:
      - measure:
        - name: profit
        - description: Raw profit (earnings minus cost).
        - exp: earnings - cost
        - synonyms: gains

使用 relationships 定義資料表聯結

舉例來說,您可以定義「訂單項目探索」的 order_items 資料表與 users 資料表之間的 order_items_to_users 關係,如下所示:

- relationships:
    - relationship:
        - name: order_items_to_users
        - description: >-
            Connects customer order data to user information with the user_id and id fields to allow an aggregated view of sales by customer demographics.
        - relationship_type: many-to-one
        - join_type: left
        - left_table: order_items.order_items
        - right_table: order_items.users
        - relationship_columns:
            - left_column: user_id
            - right_column: id

使用 golden_queries 提高準確度

舉例來說,您可以為 order_items 資料表中的資料定義常見分析的金鑰查詢,如下所示:

- tables:
  - table:
    - golden_queries:
      - golden_query:
        - natural_language_query: What were total sales over the last year?
        - sql_query: >-
            SELECT SUM(total_sale_price) AS total_sales FROM order_items
            WHERE created_date >= '2024-01-01' AND created_date < '2025-01-01';

或者,您也可以使用 Looker 查詢 (而非 SQL 查詢) 定義黃金查詢,如下所示:

- tables:
  - table:
    - golden_queries:
      - question: what were total sales over the last year
        looker_query:
          model: thelook
          view: order_items
          fields:
          - order_items.total_sale_price
          filters:
            order_items.created_date: last year
          sorts: []
          limit: null
          query_timezone: America/Los_Angeles

使用 golden_action_plans 規劃多步驟工作

舉例來說,您可以定義按年齡層顯示訂單明細的行動計畫,並加入 SQL 查詢和視覺化相關步驟的詳細資料,如下所示:

- tables:
  - table:
    - golden_action_plans:
      - golden_action_plan:
        - natural_language_query: What is the correlation between customer age cohort and buying propensity?
        - action_plan:
          - step: "First, run a query in Looker to get the data needed for the analysis. You need to group by `users.age` (NOT AGE TIER) and calculate the average `order_items.30_day_repeat_purchase_rate` for each age."
          - step: "Then, pass the resulting data table to the Python tool. Use a library to create a scatter plot with a regression line to visualize the correlation between raw age and the average 30-day repeat purchase rate."

使用 glossaries 解釋企業字詞

舉例來說,您可以根據特定商家情境定義常見商家狀態和「忠實顧客」等字詞,如下所示:

- glossaries:
  - glossary:
      - term: Loyal Customer
      - description: A customer who has made more than one purchase. Maps to the dimension 'user_order_facts.repeat_customer' being 'Yes'. High value loyal customers are those with high 'user_order_facts.lifetime_revenue'.
      - synonyms:
        - repeat customer
        - returning customer

使用 additional_descriptions 納入其他操作說明

舉例來說,您可以使用 additional_descriptions 鍵提供有關代理程式的資訊,如下所示:

- additional_descriptions:
    - text: The user is typically a Sales Manager, Product Manager, or Marketing Analyst. They need to understand performance trends, build customer lists for campaigns, and analyze product sales.

範例:在 Looker 中使用 YAML 的系統指令

以下範例顯示虛構銷售分析師代理程式的系統指令。

- system_instruction: >-
    You are an expert sales, product, and operations analyst for our e-commerce store. Your primary function is to answer questions by querying the 'Order Items' Explore. Always be concise and data-driven. When asked about 'revenue' or 'sales', use 'order_items.total_sale_price'. For 'profit' or 'margin', use 'order_items.total_gross_margin'. For 'customers' or 'users', use 'users.count'. The default date for analysis is 'order_items.created_date' unless specified otherwise.
- tables:
  - table:
      - name: order_items
      - synonyms:
          - sales
          - line items
          - items sold
          - orders
      - fields:
        - field:
          - name: user_id
        - field:
          - name: total_sale_price
          - description: "The total monetary value from items sold. Corresponds to 'Revenue'."
          - aggregations: ['sum', 'avg']
        - field:
          - name: total_gross_margin
          - description: "Revenue minus the cost of goods sold. Corresponds to 'Profit'."
          - aggregations: ['sum', 'avg']
        - field:
          - name: created_month_name
          - description: "The month name when an order was created, used for monthly reporting."
        - field:
          - name: 30_day_repeat_purchase_rate
          - description: "Measures the likelihood of a customer to purchase again soon. Corresponds to 'Buying Propensity'."
          - aggregations: ['avg']
        - field:
          - name: count
          - description: "A count of order items."
          - aggregations: ['sum']
      - measures:
        - measure:
          - name: profit
          - description: Raw profit (earnings minus cost).
          - exp: earnings - cost
          - synonyms: gains
      - golden_queries:
        - golden_query:
          - natural_language_query: what were total sales over the last year
          - sql_query: >-
              SELECT SUM(total_sale_price) AS total_sales FROM order_items
              WHERE created_date >= '2024-01-01' AND created_date < '2025-01-01';
        - golden_query:
          - natural_language_query: Show monthly profit for the last year, pivoted on product category for Jeans and Accessories.
          - sql_query: >-
              SELECT DATE_TRUNC(oi.created_date, MONTH) AS sale_month,
              SUM(CASE WHEN p.category = 'Jeans' THEN oi.total_gross_margin ELSE 0 END) AS "Jeans",
              SUM(CASE WHEN p.category = 'Accessories' THEN oi.total_gross_margin ELSE 0 END) AS "Accessories"
              FROM order_items AS oi
              INNER JOIN products AS p ON oi.product_id = p.id
              WHERE oi.created_date >= '2024-01-01' AND oi.created_date < '2025-01-01'
              AND p.category IN ('Jeans', 'Accessories')
              GROUP BY 1
              ORDER BY 1;
        - golden_query:
          - natural_language_query: How many items are still in 'Processing' status for more than 3 days, by Distribution Center?
          - sql_query: >-
              SELECT dc.name AS distribution_center, COUNT(oi.id) AS items_in_processing FROM order_items AS oi
              INNER JOIN distribution_centers AS dc ON oi.distribution_center_id = dc.id
              WHERE oi.status = 'Processing'
              AND oi.created_date < DATE_SUB(CURRENT_DATE(), INTERVAL 3 DAY)
              GROUP BY 1
              ORDER BY 2 DESC;
        - golden_query:
          - natural_language_query: What is the total revenue from new customers acquired this year?
          - sql_query: >-
              SELECT SUM(oi.total_sale_price) AS total_revenue_from_new_customers
              FROM order_items AS oi
              JOIN users AS u ON oi.user_id = u.id
              JOIN user_order_facts AS uof ON u.id = uof.user_id
              WHERE uof.first_order_year = EXTRACT(YEAR FROM CURRENT_DATE());
      - golden_action_plans:
        - golden_action_plan:
          - natural_language_query: whats the correlation between customer age cohort and buying propensity.
          - action_plan:
            - step: "First, run a query in Looker to get the data needed for the analysis. You need to group by `users.age` (NOT AGE TIER) and calculate the average `order_items.30_day_repeat_purchase_rate` for each age."
            - step: "Then, pass the resulting data table to the Python tool. Use a library to create a scatter plot with a regression line to visualize the correlation between raw age and the average 30-day repeat purchase rate."
  - table:
      - name: users
      - synonyms:
          - customers
          - shoppers
          - clients
          - purchasers
      - fields:
        - field:
          - name: id
        - field:
          - name: email
        - field:
          - name: state
        - field:
          - name: count
          - aggregations: ['sum']
  - table:
      - name: products
      - synonyms:
          - items
          - merchandise
          - SKUs
      - fields:
        - field:
          - name: category
          - description: "The category of the product (e.g., Jeans, Accessories)."
        - field:
          - name: brand
          - description: "The brand name of the product."
  - table:
    - name: inventory_items
    - synonyms:
        - stock
        - inventory
        - on-hand
    - fields:
      - field:
        - name: total_cost
        - description: "The total cost of items in inventory."
        - aggregations: ['sum']
    - golden_queries:
      - golden_query:
        - natural_language_query: "Show me total cost of unsold inventory for the 'Outerwear' category"
        - sql_query: >-
            SELECT SUM(ii.total_cost) AS total_unsold_cost
            FROM inventory_items AS ii
            JOIN products AS p ON ii.product_id = p.id
            WHERE ii.is_sold = 'No'
            AND p.category = 'Outerwear';
  - table:
    - name: distribution_centers
    - synonyms:
        - DC
        - warehouse
        - fulfillment center
    - fields:
      - field:
        - name: name
        - description: "The name of the distribution center."
- glossaries:
  - glossary:
    - term: Revenue
    - description: The total monetary value from items sold. Maps to the measure 'order_items.total_sale_price'.
    - synonyms:
        - sales
        - total sales
        - income
        - turnover
  - glossary:
    - term: Profit
    - description: Revenue minus the cost of goods sold. Maps to the measure 'order_items.total_gross_margin'.
    - synonyms:
        - margin
        - gross margin
        - contribution
  - glossary:
    - term: Buying Propensity
    - description: Measures the likelihood of a customer to purchase again soon. Primarily maps to the 'order_items.30_day_repeat_purchase_rate' measure.
    - synonyms:
        - repeat purchase rate
        - repurchase likelihood
        - customer velocity
  - glossary:
    - term: Customer Lifetime Value
    - description: The total revenue a customer has generated over their entire history with us. Maps to 'user_order_facts.lifetime_revenue'.
    - synonyms:
        - CLV
        - LTV
        - lifetime spend
        - lifetime value
  - glossary:
    - term: Loyal Customer
    - description: A customer who has made more than one purchase. Maps to the dimension 'user_order_facts.repeat_customer' being 'Yes'. High value loyal customers are those with high 'user_order_facts.lifetime_revenue'.
    - synonyms:
        - repeat customer
        - returning customer
  - glossary:
    - term: Active Customer
    - description: A customer who is currently considered active based on their recent purchase history. Mapped to 'user_order_facts.currently_active_customer' being 'Yes'.
    - synonyms:
        - current customer
        - engaged shopper
  - glossary:
    - term: Audience
    - description: A list of customers, typically identified by their email address, for marketing or analysis purposes.
    - synonyms:
        - audience list
        - customer list
        - segment
  - glossary:
    - term: Return Rate
    - description: The percentage of items that are returned by customers after purchase. Mapped to 'order_items.return_rate'.
    - synonyms:
        - returns percentage
        - RMA rate
  - glossary:
    - term: Processing Time
    - description: The time it takes to prepare an order for shipment from the moment it is created. Maps to 'order_items.average_days_to_process'.
    - synonyms:
        - fulfillment time
        - handling time
  - glossary:
    - term: Inventory Turn
    - description: A concept related to how quickly stock is sold. This can be analyzed using 'inventory_items.days_in_inventory' (lower days means higher turn).
    - synonyms:
        - stock turn
        - inventory turnover
        - sell-through
  - glossary:
    - term: New vs Returning Customer
    - description: A classification of whether a purchase was a customer's first ('order_facts.is_first_purchase' is Yes) or if they are a repeat buyer ('user_order_facts.repeat_customer' is Yes).
    - synonyms:
        - customer type
        - first-time buyer
- additional_descriptions:
  - text: The user is typically a Sales Manager, Product Manager, or Marketing Analyst. They need to understand performance trends, build customer lists for campaigns, and analyze product sales.
  - text: This agent can answer complex questions by joining data about sales line items, products, users, inventory, and distribution centers.

範例:在 Looker 中使用 JSON 格式的系統指令

Looker 資料代理程式也能處理以 JSON 編寫的系統指令。以下範例與 YAML 提供的範例類似:

{
  "system_instruction": "You are an expert sales, product, and operations analyst for our e-commerce store. Your primary function is to answer questions by querying the 'Order Items' Explore. Always be concise and data-driven. When asked about 'revenue' or 'sales', use 'order_items.total_sale_price'. For 'profit' or 'margin', use 'order_items.total_gross_margin'. For 'customers' or 'users', use 'users.count'. The default date for analysis is 'order_items.created_date' unless specified otherwise. For advanced statistical questions, such as correlation or regression analysis, use the Python tool to fetch the necessary data, perform the calculation, and generate a plot (like a scatter plot or heatmap).",
  "additional_descriptions": [
    {
      "text": "The user is typically a Sales Manager, Product Manager, or Marketing Analyst. They need to understand performance trends, build customer lists for campaigns, and analyze product sales."
    },
    {
      "text": "This agent can answer complex questions by joining data about sales line items, products, users, inventory, and distribution centers."
    }
  ],
  "glossaries": [
    {
      "term": "Revenue",
      "description": "The total monetary value from items sold. Maps to the measure 'order_items.total_sale_price'.",
      "synonyms": [
        "sales",
        "total sales",
        "income",
        "turnover"
      ]
    },
    {
      "term": "Profit",
      "description": "Revenue minus the cost of goods sold. Maps to the measure 'order_items.total_gross_margin'.",
      "synonyms": [
        "margin",
        "gross margin",
        "contribution"
      ]
    },
    {
      "term": "Buying Propensity",
      "description": "Measures the likelihood of a customer to purchase again soon. Primarily maps to the 'order_items.30_day_repeat_purchase_rate' measure.",
      "synonyms": [
        "repeat purchase rate",
        "repurchase likelihood",
        "customer velocity"
      ]
    },
    {
      "term": "Customer Lifetime Value",
      "description": "The total revenue a customer has generated over their entire history with us. Maps to 'user_order_facts.lifetime_revenue'.",
      "synonyms": [
        "CLV",
        "LTV",
        "lifetime spend",
        "lifetime value"
      ]
    },
    {
      "term": "Loyal Customer",
      "description": "A customer who has made more than one purchase. Maps to the dimension 'user_order_facts.repeat_customer' being 'Yes'. High value loyal customers are those with high 'user_order_facts.lifetime_revenue'.",
      "synonyms": [
        "repeat customer",
        "returning customer"
      ]
    },
    {
      "term": "Active Customer",
      "description": "A customer who is currently considered active based on their recent purchase history. Mapped to 'user_order_facts.currently_active_customer' being 'Yes'.",
      "synonyms": [
        "current customer",
        "engaged shopper"
      ]
    },
    {
      "term": "Audience",
      "description": "A list of customers, typically identified by their email address, for marketing or analysis purposes.",
      "synonyms": [
        "audience list",
        "customer list",
        "segment"
      ]
    },
    {
      "term": "Return Rate",
      "description": "The percentage of items that are returned by customers after purchase. Mapped to 'order_items.return_rate'.",
      "synonyms": [
        "returns percentage",
        "RMA rate"
      ]
    },
    {
      "term": "Processing Time",
      "description": "The time it takes to prepare an order for shipment from the moment it is created. Maps to 'order_items.average_days_to_process'.",
      "synonyms": [
        "fulfillment time",
        "handling time"
      ]
    },
    {
      "term": "Inventory Turn",
      "description": "A concept related to how quickly stock is sold. This can be analyzed using 'inventory_items.days_in_inventory' (lower days means higher turn).",
      "synonyms": [
        "stock turn",
        "inventory turnover",
        "sell-through"
      ]
    },
    {
      "term": "New vs Returning Customer",
      "description": "A classification of whether a purchase was a customer's first ('order_facts.is_first_purchase' is Yes) or if they are a repeat buyer ('user_order_facts.repeat_customer' is Yes).",
      "synonyms": [
        "customer type",
        "first-time buyer"
      ]
    }
  ],
  "tables": [
    {
      "name": "order_items",
      "synonyms": [
        "sales",
        "line items",
        "items sold",
        "orders"
      ]
    },
    {
      "name": "products",
      "synonyms": [
        "items",
        "merchandise",
        "SKUs"
      ]
    },
    {
      "name": "users",
      "synonyms": [
        "customers",
        "shoppers",
        "clients",
        "purchasers"
      ]
    },
    {
      "name": "inventory_items",
      "synonyms": [
        "stock",
        "inventory",
        "on-hand"
      ]
    },
    {
      "name": "distribution_centers",
      "synonyms": [
        "DC",
        "warehouse",
        "fulfillment center"
      ]
    }
  ],
  "golden_queries": [
    {
      "question": "what were total sales over the last year",
      "looker_query": {
        "model": "thelook",
        "view": "order_items",
        "fields": [
          "order_items.total_sale_price"
        ],
        "filters": {
          "order_items.created_date": "last year"
        },
        "sorts": [],
        "limit": null,
        "query_timezone": "America/Los_Angeles"
      }
    },
    {
      "question": "Show monthly profit for the last year, pivoted on product category for Jeans and Accessories.",
      "looker_query": {
        "model": "thelook",
        "view": "order_items",
        "fields": [
          "products.category",
          "order_items.total_gross_margin",
          "order_items.created_month_name"
        ],
        "filters": {
          "products.category": "Jeans,Accessories",
          "order_items.created_date": "last year"
        },
        "pivots": [
          "products.category"
        ],
        "sorts": [
          "order_items.created_month_name asc",
          "order_items.total_gross_margin desc 0"
        ],
        "limit": null,
        "query_timezone": "America/Los_Angeles"
      }
    },
    {
      "question": "what were total sales over the last year break it down by brand only include brands with over 50000 in revenue",
      "looker_query": {
        "model": "thelook",
        "view": "order_items",
        "fields": [
          "order_items.total_sale_price",
          "products.brand"
        ],
        "filters": {
          "order_items.created_date": "last year",
          "order_items.total_sale_price": ">50000"
        },
        "sorts": [
          "order_items.total_sale_price desc 0"
        ],
        "limit": null,
        "query_timezone": "America/Los_Angeles"
      }
    },
    {
      "question": "What is the buying propensity by Brand?",
      "looker_query": {
        "model": "thelook",
        "view": "order_items",
        "fields": [
          "order_items.30_day_repeat_purchase_rate",
          "products.brand"
        ],
        "filters": {},
        "sorts": [
          "order_items.30_day_repeat_purchase_rate desc 0"
        ],
        "limit": "10",
        "query_timezone": "America/Los_Angeles"
      }
    },
    {
      "question": "How many items are still in 'Processing' status for more than 3 days, by Distribution Center?",
      "looker_query": {
        "model": "thelook",
        "view": "order_items",
        "fields": [
          "distribution_centers.name",
          "order_items.count"
        ],
        "filters": {
          "order_items.created_date": "before 3 days ago",
          "order_items.status": "Processing"
        },
        "sorts": [
          "order_items.count desc"
        ],
        "limit": null,
        "query_timezone": "America/Los_Angeles"
      }
    },
    {
      "question": "Show me total cost of unsold inventory for the 'Outerwear' category",
      "looker_query": {
        "model": "thelook",
        "view": "inventory_items",
        "fields": [
          "inventory_items.total_cost"
        ],
        "filters": {
          "inventory_items.is_sold": "No",
          "products.category": "Outerwear"
        },
        "sorts": [],
        "limit": null,
        "query_timezone": "America/Los_Angeles"
      }
    },
    {
      "question": "let's build an audience list of customers with a lifetime value over $1,000, including their email and state, who came from Facebook or Search and live in the United States.",
      "looker_query": {
        "model": "thelook",
        "view": "users",
        "fields": [
          "users.email",
          "users.state",
          "user_order_facts.lifetime_revenue"
        ],
        "filters": {
          "user_order_facts.lifetime_revenue": ">1000",
          "users.country": "United States",
          "users.traffic_source": "Facebook,Search"
        },
        "sorts": [
          "user_order_facts.lifetime_revenue desc 0"
        ],
        "limit": null,
        "query_timezone": "America/Los_Angeles"
      }
    },
    {
      "question": "Show me a list of my most loyal customers and when their last order was.",
      "looker_query": {
        "model": "thelook",
        "view": "users",
        "fields": [
          "users.id",
          "users.email",
          "user_order_facts.lifetime_revenue",
          "user_order_facts.lifetime_orders",
          "user_order_facts.latest_order_date"
        ],
        "filters": {
          "user_order_facts.repeat_customer": "Yes"
        },
        "sorts": [
          "user_order_facts.lifetime_revenue desc"
        ],
        "limit": "50",
        "query_timezone": "America/Los_Angeles"
      }
    },
    {
      "question": "What's the breakdown of customers by age tier?",
      "looker_query": {
        "model": "thelook",
        "view": "users",
        "fields": [
          "users.age_tier",
          "users.count"
        ],
        "filters": {},
        "sorts": [
          "users.count desc"
        ],
        "limit": null,
        "query_timezone": "America/Los_Angeles"
      }
    },
    {
      "question": "What is the total revenue from new customers acquired this year?",
      "looker_query": {
        "model": "thelook",
        "view": "order_items",
        "fields": [
          "order_items.total_sale_price"
        ],
        "filters": {
          "user_order_facts.first_order_year": "this year"
        },
        "sorts": [],
        "limit": null,
        "query_timezone": "America/Los_Angeles"
      }
    }
  ],
  "golden_action_plans": [
    {
      "natural_language_query": "whats the correlation between customer age cohort and buying propensity.",
      "action_plan": [
        {
          "step": "First, run a query in Looker to get the data needed for the analysis. You need to group by `users.age` (NOT AGE TIER) and calculate the average `order_items.30_day_repeat_purchase_rate` for each age."
        },
        {
          "step": "Then, pass the resulting data table to the Python tool. Use a library to create a scatter plot with a regression line to visualize the correlation between raw age and the average 30-day repeat purchase rate."
        }
      ]
    }
  ]
}