SQL 问题回答基准测试:Chinook
在这里,我们将介绍如何对 SQL 数据库上的问题回答任务进行性能基准测试。
强烈建议您在进行任何评估/基准测试时启用追踪功能。请参阅这里以了解追踪是什么以及如何设置。
# 如果您没有使用追踪,请注释此行
import os
os.environ["LANGCHAIN_HANDLER"] = "langchain"
加载数据
首先,让我们加载数据。
from langchain.evaluation.loading import load_dataset
dataset = load_dataset("sql-qa-chinook")
Downloading readme: 0%| | 0.00/21.0 [00:00<?, ?B/s]
Downloading and preparing dataset json/LangChainDatasets--sql-qa-chinook to /Users/harrisonchase/.cache/huggingface/datasets/LangChainDatasets___json/LangChainDatasets--sql-qa-chinook-7528565d2d992b47/0.0.0/0f7e3662623656454fcd2b650f34e886a7db4b9104504885bd462096cc7a9f51...
Downloading data files: 0%| | 0/1 [00:00<?, ?it/s]
Downloading data: 0%| | 0.00/1.44k [00:00<?, ?B/s]
Extracting data files: 0%| | 0/1 [00:00<?, ?it/s]
Generating train split: 0 examples [00:00, ? examples/s]
Dataset json downloaded and prepared to /Users/harrisonchase/.cache/huggingface/datasets/LangChainDatasets___json/LangChainDatasets--sql-qa-chinook-7528565d2d992b47/0.0.0/0f7e3662623656454fcd2b650f34e886a7db4b9104504885bd462096cc7a9f51. Subsequent calls will reuse this data.
0%| | 0/1 [00:00<?, ?it/s]
dataset[0]
{'question': '有多少员工?', 'answer': '8'}
设置链
这使用了示例的 Chinook 数据库。
要设置它,请按照 https://database.guide/2-sample-databases-sqlite/ 上的说明,将 .db
文件放在此存储库根目录下的 notebooks 文件夹中。
请注意,这里我们加载了一个简单的链。如果您想尝试更复杂的链或代理,请以不同的方式创建 chain
对象。
from langchain import OpenAI, SQLDatabase, SQLDatabaseChain
db = SQLDatabase.from_uri("sqlite:///../../../notebooks/Chinook.db")
llm = OpenAI(temperature=0)
现在我们可以创建一个 SQL 数据库链。
chain = SQLDatabaseChain.from_llm(llm, db, input_key="question")
进行预测
首先,我们可以逐个数据点进行预测。以这种粒度进行预测允许我们详细探索输出,并且比多个数据点运行更便宜。
chain(dataset[0])
{'question': '有多少员工?', 'answer': '8', 'result': ' 共有 8 名员工。'}
进行多个预测
现在我们可以进行多个预测。请注意,我们添加了 try-except,因为此链有时可能会出错(如果 SQL 编写不正确等)。
predictions = []
predicted_dataset = []
error_dataset = []
for data in dataset:
try:
predictions.append(chain(data))
predicted_dataset.append(data)
except:
error_dataset.append(data)
评估性能
现在我们可以评估预测结果。我们可以使用语言模型对其进行编程评分。
from langchain.evaluation.qa import QAEvalChain
llm = OpenAI(temperature=0)
eval_chain = QAEvalChain.from_llm(llm)
graded_outputs = eval_chain.evaluate(
predicted_dataset, predictions, question_key="question", prediction_key="result"
)
我们可以将评分输出添加到 predictions
字典中,然后计算分级的数量。
for i, prediction in enumerate(predictions):
prediction["grade"] = graded_outputs[i]["text"]
from collections import Counter
Counter([pred["grade"] for pred in predictions])
Counter({' CORRECT': 3, ' INCORRECT': 4})
我们还可以将数据点过滤为不正确的示例并查看它们。
incorrect = [pred for pred in predictions if pred["grade"] == " INCORRECT"]
incorrect[0]
{'question': '有多少员工也是顾客?', 'answer': 'None', 'result': ' 59 名员工也是顾客。', 'grade': ' INCORRECT'}