Skip to content

SQL

基于执行的指标

在这些指标中,SQL查询在数据库上执行后,将结果与预期的结果进行比较。

DataCompy 分数

DataCompyScore 指标使用 DataCompy,一个比较两个 pandas DataFrame 的 Python 库。它提供了一个简单的接口来比较两个 DataFrame,并提供详细的差异报告。在这个指标中,response 在数据库上执行,并将结果数据与预期的数据(即 reference)进行比较。为了进行比较,responsereference 都应以逗号分隔值的形式提供,如示例所示。

可以按行或列比较 DataFrame。这可以通过 mode 参数进行配置。

如果模式是 row,则按行进行比较。如果模式是 column,则按列进行比较。

\[ \text{Precision } = {|\text{response 和 reference 中匹配的行数}| \over |\text{response 中的总行数}|} \]
\[ \text{Precision } = {|\text{response 和 reference 中匹配的行数}| \over |\text{reference 中的总行数}|} \]

默认情况下,模式设置为 row,指标是 F1 分数,即精确率和召回率的调和平均值。

from ragas.metrics import DataCompyScore
from ragas.dataset_schema import SingleTurnSample

data1 = """acct_id,dollar_amt,name,float_fld,date_fld
10000001234,123.45,George Maharis,14530.1555,2017-01-01
10000001235,0.45,Michael Bluth,1,2017-01-01
10000001236,1345,George Bluth,,2017-01-01
10000001237,123456,Bob Loblaw,345.12,2017-01-01
10000001238,1.05,Lucille Bluth,,2017-01-01
10000001238,1.05,Loose Seal Bluth,,2017-01-01
"""

data2 = """acct_id,dollar_amt,name,float_fld
10000001234,123.4,George Michael Bluth,14530.155
10000001235,0.45,Michael Bluth,
10000001236,1345,George Bluth,1
10000001237,123456,Robert Loblaw,345.12
10000001238,1.05,Loose Seal Bluth,111
"""
sample = SingleTurnSample(response=data1, reference=data2)
scorer = DataCompyScore()
await scorer.single_turn_ascore(sample)
要将模式更改为按列比较,请将 mode 参数设置为 column

scorer = DataCompyScore(mode="column", metric="recall")

非执行的指标

在数据库上执行 SQL 查询可能会耗时且有时不可行。在这种情况下,我们可以使用非执行的指标来评估 SQL 查询。这些指标直接比较 SQL 查询,而无需在数据库上执行它们。

SQL 查询语义等价性

LLMSQLEquivalence 是一个指标,用于评估 response 查询与 reference 查询的等价性。该指标还需要在比较查询时使用的数据库模式,这在 reference_contexts 中输入。该指标是一个二元指标,1 表示 SQL 查询在语义上是等价的,0 表示 SQL 查询在语义上不等价。

from ragas.metrics import LLMSQLEquivalence
from ragas.dataset_schema import SingleTurnSample

sample = SingleTurnSample(
    response="""
        SELECT p.product_name, SUM(oi.quantity) AS total_quantity
        FROM order_items oi
        JOIN products p ON oi.product_id = p.product_id
        GROUP BY p.product_name;
    """,
    reference="""
        SELECT p.product_name, COUNT(oi.quantity) AS total_quantity
        FROM order_items oi
        JOIN products p ON oi.product_id = p.product_id
        GROUP BY p.product_name;
    """,
    reference_contexts=[
        """
        Table order_items:
        - order_item_id: INT
        - order_id: INT
        - product_id: INT
        - quantity: INT
        """,
        """
        Table products:
        - product_id: INT
        - product_name: VARCHAR
        - price: DECIMAL
        """
    ]
)

scorer = LLMSQLEquivalence()
scorer.llm = openai_model
await scorer.single_turn_ascore(sample)