语义代理简介

SemanticAgent(目前处于测试阶段)通过在其结果中添加语义层,扩展了PandasAI库的功能。与标准的Agent不同,SemanticAgent生成一个JSON查询,然后可以用于生成Python或SQL代码。这种方法确保了更准确和可解释的输出。

注意: 在生产环境中使用语义代理需要许可证。更多详情,请参阅许可证文档。 如果您计划在生产环境中使用它,请联系我们

实例化语义代理

创建SemanticAgent的实例类似于创建Agent的实例。

from pandasai.ee.agents.semantic_agent import SemanticAgent

import pandas as pd



df = pd.read_csv('revenue.csv')



agent = SemanticAgent(df, config=config)

agent.chat("What are the top 5 revenue streams?")

语义代理如何工作

语义代理主要在两个步骤中操作:

  1. 模式生成
  2. JSON 查询生成

模式生成

第一步是模式生成,它将数据结构化为语义代理可以用来生成JSON查询的模式。默认情况下,此模式会自动创建,但如果需要,您也可以提供自定义模式。

自动模式生成

默认情况下,SemanticAgent 会考虑传递给它的所有数据框,并生成适当的模式。

自定义模式

要提供自定义模式,请在实例化SemanticAgent时传递schema参数。

salaries_df = pd.DataFrame(

    {

        "EmployeeID": [1, 2, 3, 4, 5],

        "Salary": [5000, 6000, 4500, 7000, 5500],

    }

)



employees_df = pd.DataFrame(

    {

        "EmployeeID": [1, 2, 3, 4, 5],

        "Name": ["John", "Emma", "Liam", "Olivia", "William"],

        "Department": ["HR", "Marketing", "IT", "Marketing", "Finance"],

    }

)



schema = [

    {

        "name": "Employees",

        "table": "Employees",

        "measures": [

            {

                "name": "count",

                "type": "count",

                "sql": "EmployeeID"

            }

        ],

        "dimensions": [

            {

                "name": "EmployeeID",

                "type": "string",

                "sql": "EmployeeID"

            },

            {

                "name": "Department",

                "type": "string",

                "sql": "Department"

            }

        ],

        "joins": [

            {

                "name": "Salaries",

                "join_type":"left",

                "sql": "Employees.EmployeeID = Salaries.EmployeeID"

            }

        ]

    },

    {

        "name": "Salaries",

        "table": "Salaries",

        "measures": [

            {

                "name": "count",

                "type": "count",

                "sql": "EmployeeID"

            },

            {

                "name": "avg_salary",

                "type": "avg",

                "sql": "Salary"

            },

            {

                "name": "max_salary",

                "type": "max",

                "sql": "Salary"

            }

        ],

        "dimensions": [

            {

                "name": "EmployeeID",

                "type": "string",

                "sql": "EmployeeID"

            },

            {

                "name": "Salary",

                "type": "string",

                "sql": "Salary"

            }

        ],

        "joins": [

            {

                "name": "Employees",

                "join_type":"left",

                "sql": "Contracts.contract_code = Fees.contract_id"

            }

        ]

    }

]



agent = SemanticAgent([employees_df, salaries_df], schema=schema)

JSON 查询生成

第二步涉及基于模式生成JSON查询。然后使用此查询生成执行所需的Python或SQL代码。

示例 JSON 查询

这是一个由SemanticAgent生成的JSON查询示例:

{

  "type": "number",

  "dimensions": [],

  "measures": ["Salaries.avg_salary"],

  "timeDimensions": [],

  "filters": [],

  "order": []

}

此查询由语义代理解释并转换为可执行的Python或SQL代码。

深入探讨模式和查询

理解模式结构

SemanticAgent 中的模式是数据的全面表示,包括表、列、度量、维度以及表之间的关系。以下是其组成部分的详细说明:

指标

度量是分析中使用的定量指标,如总和、平均值、计数等。

  • name: 指标的标识符。
  • type: 聚合的类型(例如,count, avg, sum, max, min)。
  • sql: SQL 中用于计算度量的列或表达式。

示例:

{

  "name": "avg_salary",

  "type": "avg",

  "sql": "Salary"

}

维度

维度是用于切片和切块数据的分类变量。

  • name: 维度的标识符。
  • type: 数据类型(例如,字符串,日期)。
  • sql: SQL中用于引用维度的列或表达式。

示例:

{

  "name": "Department",

  "type": "string",

  "sql": "Department"

}

连接

连接定义了表之间的关系,指定了在查询中它们应该如何连接。

  • name: 相关表的名称。
  • join_type: 连接类型(例如,left, right, inner)。
  • sql: 执行连接的SQL表达式。

示例:

{

  "name": "Salaries",

  "join_type": "left",

  "sql": "Employees.EmployeeID = Salaries.EmployeeID"

}

理解查询结构

JSON查询是请求的结构化表示,指定了要检索的数据以及如何处理它。以下是其字段的详细说明:

类型

查询的类型决定了结果的格式,例如单个数字、表格或图表。

  • type: 可以是“number”、“pie”、“bar”、“line”。

示例:

{

  "type": "number",

  ...

}

维度

用于分组数据的列。在SQL GROUP BY子句中,这些将是列出的列。

  • dimensions: 一个维度标识符的数组。

示例:

{

  ...,

  "dimensions": ["Department"]

}

指标

用于计算数据的列,通常涉及聚合函数如求和、平均值、计数等。

  • measures: 一个包含度量标识符的数组。

示例:

{

  ...,

  "measures": ["Salaries.avg_salary"]

}

时间维度

用于按时间分组数据的列,通常涉及日期函数。每个timeDimensions条目指定一个时间段及其粒度。dateRange字段允许各种格式,包括特定日期如["2022-01-01", "2023-03-31"],相对时间段如“上周”、“上个月”、“本月”、“本周”、“今天”、“今年”和“去年”。

示例:

{

  ...,

  "timeDimensions": [

    {

      "dimension": "Sales.time_period",

      "dateRange": ["2023-01-01", "2023-03-31"],

      "granularity": "day"

    }

  ]

}

过滤器

用于过滤数据的条件,相当于SQL WHERE子句。每个过滤器指定一个成员、一个操作符和一组值。允许的操作符包括:“equals”(等于)、“notEquals”(不等于)、“contains”(包含)、“notContains”(不包含)、“startsWith”(以...开始)、“endsWith”(以...结束)、“gt”(大于)、“gte”(大于或等于)、“lt”(小于)、“lte”(小于或等于)、“set”(设置)、“notSet”(未设置)、“inDateRange”(在日期范围内)、“notInDateRange”(不在日期范围内)、“beforeDate”(在日期之前)和“afterDate”(在日期之后)。

  • filters: 一个过滤条件的数组。

示例:

{

  ...,

  "filters": [

    {

      "member": "Ticket.category",

      "operator": "notEquals",

      "values": ["null"]

    }

  ]

}

订单

用于排序数据的列,相当于SQL ORDER BY子句。order数组中的每个条目指定一个标识符和排序方向。排序方向可以是“asc”表示升序,或“desc”表示降序。

  • order: 一个排序规范的数组。

示例:

{

  ...,

  "order": [

    {

      "id": "Contratti.contract_count",

      "direction": "asc"

    }

  ]

}

组合组件

当这些组件结合在一起时,它们形成了一个完整的查询,语义代理可以解释并执行。以下是一个结合所有元素的示例:

{

  "type": "table",

  "dimensions": ["Department"],

  "measures": ["Salaries.avg_salary"],

  "timeDimensions": [],

  "filters": [

    {

      "member": "Department",

      "operator": "equals",

      "values": ["Marketing", "IT"]

    }

  ],

  "order": [

    {

      "measure": "Salaries.avg_salary",

      "direction": "desc"

    }

  ]

}

此查询转换为如下SQL语句:

SELECT Department, AVG(Salary) AS avg_salary,

FROM Employees

JOIN Salaries ON Employees.EmployeeID = Salaries.EmployeeID

WHERE Department IN ('Marketing', 'IT')

GROUP BY Department

ORDER BY avg_salary DESC;