返回

自然语言到SQL:一个微调ChatGPT-3.5实例的训练数据准备

后端

ChatGPT-3.5:驾驭自然语言到 SQL 查询的训练数据准备

在瞬息万变的技术世界中,自然语言到 SQL(NL-to-SQL)已成为从关系数据库中提取信息的至关重要的工具。借助大型语言模型(LLM)的出现,如 ChatGPT-3.5,这一领域迎来了突破性的进展。然而,这些强大的模型通常需要大量的数据进行微调,这对于许多实际应用而言既昂贵又耗时。

本指南将深入探讨为 ChatGPT-3.5 微调准备高质量训练数据的策略。我们将深入了解启发式方法和检索增强生成(RAG)算法在选择和优化训练样本中的作用。此外,我们将提供宝贵的建议,帮助你针对实际用例训练模型,从而选择正确的表以进行 SQL 查询。

启发式方法:艺术与科学

启发式方法是一种巧妙的策略,旨在通过精心挑选训练样本来有效地微调 LLM。在 NL-to-SQL 领域,我们可以利用启发式方法从数据库中选择表,以创建包含正确表和其他随机表的上下文窗口。

随机选择法: 一种简单的方法是随机选择表,直到达到预定的上下文窗口大小限制。虽然这种方法可能会产生多样化的训练样本,但它也可能会引入无关或冗余的信息。

相关性启发式: 一种更精细的方法是根据相关性选择表。例如,如果数据库包含客户和订单表,我们可以使用客户 ID 将这两个表相关联。然后,我们可以选择一个包含客户表和订单表的上下文窗口,让 LLM 学习关联它们。

检索增强生成:巧妙的增强

检索增强生成(RAG)是一种创新算法,用于微调 LLM,而无需修改基础语言模型。RAG 算法的工作原理是使用检索模型从与给定提示相关的文档中检索信息,然后使用生成模型生成响应。

在 NL-to-SQL 的背景下,我们可以利用 RAG 算法微调 ChatGPT-3.5 实例。检索模型检索与给定自然语言指令相关的数据库表,生成模型生成 SQL 查询。这种方法巧妙地利用了检索和生成能力,避免了直接修改 LLM 的复杂性。

代码示例:实用应用

现在,让我们通过一个代码示例,将启发式方法与 RAG 算法结合起来,针对实际用例训练 ChatGPT-3.5。

import openai
from transformers import AutoTokenizer

# 加载 ChatGPT-3.5
tokenizer = AutoTokenizer.from_pretrained("openai/chat-gpt-3.5")
model = openai.GPT3(engine="chat-gpt-3.5")

# 使用启发式方法创建训练样本
# (示例:使用相关性启发式)
training_samples = []
for customer in customers:
    related_orders = orders.query("customer_id == {}".format(customer.id))
    training_samples.append({
        "context": "客户:{};相关订单:{}".format(customer.name, related_orders),
        "query": "查询订单信息"
    })

# 使用 RAG 算法微调模型
# (示例:检索模型检索表,生成模型生成 SQL 查询)
for sample in training_samples:
    retrieval_model_input = sample["context"]
    retrieval_model_output = retrieval_model.retrieve(retrieval_model_input)
    tables = [table for table in retrieval_model_output]
    generation_model_input = "检索到的表:{}".format(tables)
    generation_model_output = generation_model.generate(generation_model_input, query=sample["query"])
    sql_query = generation_model_output

训练模型以选择正确的表

在实际用例中,模型需要选择正确的表才能执行模式链接并构建有效的 SQL 查询。以下是一些技巧:

  • 使用启发式方法: 根据表的相关性、列匹配或其他因素选择训练样本。
  • 利用 RAG 算法: 微调模型学习选择正确表的模式。
  • 提供显式提示: 在训练样本中包括明确指示模型选择正确表的提示。

结论

通过巧妙地结合启发式方法和 RAG 算法,我们可以有效地准备训练数据并针对实际用例训练 ChatGPT-3.5,从而为 NL-to-SQL 任务实现准确的表选择。借助这些策略,组织能够释放 LLM 的潜力,从其关系数据库中无缝提取信息。

常见问题解答

1. 是否可以使用其他 LLM 来执行 NL-to-SQL 任务?
答:是的,除了 ChatGPT-3.5 之外,还有其他 LLM 也可用于 NL-to-SQL,例如 Codex 和 Gemini。

2. 使用启发式方法选择训练样本是否可靠?
答:启发式方法对于选择高质量的训练样本非常有用,但它们不是万无一失的。精心设计和不断改进启发式方法至关重要。

3. RAG 算法如何提高 NL-to-SQL 模型的准确性?
答:RAG 算法通过利用检索模型的主题知识和生成模型的语言生成能力,有助于模型学习复杂的关系并选择正确的表。

4. 如何优化训练数据以提高模型性能?
答:优化训练数据涉及使用数据增强技术、过滤无关数据以及通过手动验证确保数据质量。

5. NL-to-SQL 模型如何促进数据库的利用?
答:NL-to-SQL 模型允许用户使用自然语言查询数据库,降低了技术门槛,并促进了更广泛的数据库利用。