SQL
基于执行的指标
在这些指标中,SQL查询在数据库上执行后,将结果与预期的结果进行比较。
DataCompy 分数
DataCompyScore
指标使用 DataCompy,一个比较两个 pandas DataFrame 的 Python 库。它提供了一个简单的接口来比较两个 DataFrame,并提供详细的差异报告。在这个指标中,response
在数据库上执行,并将结果数据与预期的数据(即 reference
)进行比较。为了进行比较,response
和 reference
都应以逗号分隔值的形式提供,如示例所示。
可以按行或列比较 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
。
非执行的指标
在数据库上执行 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)