openai 的API 从自然语言生成sql语句

从自然语言生成SQL查询是一种常见的任务,通常用于将自然语言指令转换为计算机可以理解和执行的SQL查询。该代码实现了从自然语言生成SQL查询的功能,并使用评估指标对生成的SQL查询进行评估,以提高生成的SQL查询的准确性和可靠性。

具体而言,该代码将使用生成模型从自然语言指令中生成多个SQL查询。然后,将使用不同的评估指标对生成的SQL查询进行评估,以选择最佳的SQL查询。这些评估指标可能包括查询的准确性、反向翻译分数、平均对数概率等。

在评估SQL查询时,该代码可以使用人工标注数据进行评估。具体来说,该代码可以使用已知的自然语言指令和相应的SQL查询来评估生成的SQL查询。评估指标可以包括准确性、召回率、精度等。此外,还可以使用其他方法对生成的SQL查询进行评估,例如在数据库中运行查询并比较结果集等。

最终,该代码可以将生成的SQL查询输出到控制台或保存到文件中,以便进行后续的分析和处理。

from typing import List, Union
from smokey import Smokey
import openai
def get_candidates(
    prompt: str,
    stop: List[str],
    temperature: float,
    priming_prefix: str,
    engine: str,
    n: int = 5,
) -> List[str]:
    """
    基于给定的提示和特定的温度,生成N个候选完成结果。
	在自然语言生成中,温度是一种调节生成文本多样性和创造力的参数。较低的温度值会导致生成的文本更加保守和准确,而较高的温度值则会使得生成的文		本更加随机和多样化。因此,使用不同的温度值可以获得不同的生成效果。
	这段代码会基于给定的提示和温度值生成N个候选完成结果。候选完成结果是一系列根据模型预测而生成的文本片段。根据所选的温度值,这些片段可能会	相似或不同。在生成这些候选结果后,可以从中选择一个或多个来作为最终生成的文本。
	:param prompt: 开始对话的提示语句。
	:param stop: 表示生成结束的标记符号的列表。
	:param temperature: 生成温度。
	:param priming_prefix: 用于生成的前缀。
	:param engine: 用于生成的引擎。
	:param n: 生成的候选项数。
	:return: 一个完成列表。
    """
    response = openai.Completion.create(
        engine=engine,
        prompt=prompt,
        temperature=temperature,
        max_tokens=150,
        top_p=1,
        frequency_penalty=0,
        presence_penalty=0,
        stop=stop,
        n=n,
    )
    responses = [priming_prefix + choice.text for choice in response.choices]
    return responses


def rindex(lst: List, value: str) -> int:
    """
    返回列表中某个值最后一次出现的索引。
	:param lst: 要搜索的列表。
	:param value: 要查找的值。
	:return: 该值最后一次出现的索引。
    """
    try:
        return len(lst) - lst[::-1].index(value) - 1
    except ValueError:
        raise ValueError(f"Answer start token `{value}` not found in the eval template")


def eval_candidate(
    candidate_answer: str,
    original_instruction: str,
    eval_template: str,
    answer_start_token: str,
    engine: str,
) -> float:
    """
    通过计算候选答案与特定评估模板下原始指令的平均对数概率,来评估候选答案的质量。该评估模板旨在重构原始指令。
在自然语言处理中,对数概率是一种常用的度量方式,用于评估模型的性能。在这段代码中,将使用对数概率来评估候选答案的质量。具体来说,该方法将计算原始指令在给定模板下的平均对数概率,然后将其与候选答案的对数概率进行比较。如果候选答案的对数概率高于平均值,则认为该答案比较好。
为了实现这个方法,需要使用特定的评估模板来重构原始指令,并计算重构后指令在模型中的对数概率。然后,将计算出的对数概率求平均值,并将其与候选答案的对数概率进行比较,从而得出候选答案的质量。

	:param candidate_answer: 要评估的候选答案。
	:param original_instruction: 原始指令。
	:param eval_template: 用于评估的模板。
	:param answer_start_token: 用于指示答案开头的标记符号。
	:param engine: 用于评估的引擎。
	:return: 候选答案的评估。
    """
    response = openai.Completion.create(
        engine=engine,
        prompt=eval_template.format(candidate_answer, original_instruction),
        temperature=0,
        max_tokens=0,
        top_p=1,
        frequency_penalty=0,
        presence_penalty=0,
        logprobs=1,
        echo=True,
    )

    answer_start = rindex(
        response["choices"][0]["logprobs"]["tokens"], answer_start_token
    )
    logprobs = response["choices"][0]["logprobs"]["token_logprobs"][answer_start + 1 :]
    return sum(logprobs) / len(logprobs)

#反向翻译,从生成的SQL再翻译为自然语言,用于评估生成的语句正确性
def backtranslation(
    prompt_template: str,
    additional_info: str,
    instruction: str,
    eval_template: str,
    priming_prefix: str = "SELECT",
    stop1: List[str] = ["#", ";"],
    answer_start_token: str = "--",
    n: int = 5,
    temperature: float = 0.5,
    return_all_results: bool = False,
    engine: str = "davinci-codex",
) -> Union[str, List[str, float]]:
    """
    根据自然语言指令生成一定数量的SQL查询,并根据使用候选SQL查询作为输入时,解释其结果与原始指令匹配的平均对数概率来选择最佳查询。
在自然语言处理中,将自然语言指令转换为SQL查询是一种常见的任务。在这段代码中,将使用生成模型生成一定数量的SQL查询,并选择其中最佳的一个。
选择最佳的SQL查询需要考虑两个因素:查询的准确性和解释查询结果的能力。因此,将使用平均对数概率来衡量这两个因素。具体来说,该方法将根据自然语言指令生成一定数量的SQL查询,然后针对每个SQL查询,使用自然语言解释该查询的结果。然后,将使用生成模型计算自然语言解释与原始指令匹配的对数概率,并将其求平均值。最后,选择平均对数概率最高的SQL查询作为最佳查询。
这种方法可以用于将自然语言指令转换为SQL查询,并确保生成的查询准确性和易解释性。

	:param prompt_template: 用于生成SQL的提示模板。
	:param additional_info: 要包括在提示中的附加信息(SQL表及其属性)。
	:param instruction: 自然语言中的指令。
	:param eval_template: 用于评估的模板。
	:param priming_prefix: 用于SQL查询启动的前缀。
	:param stop1: 指示生成结束的标记符号列表。
	:param answer_start_token: 用于指示自然答案开始的标记符号。
	:param n: 要生成的候选项数量。
	:param temperature: 生成的温度。
	:param return_all_results: 是否返回所有结果或仅返回最佳结果。
	:param engine: 用于生成和评估的引擎。
	:return: 最佳SQL查询,或所有已评分生成的SQL查询列表。
    """
    prompt_template = prompt_template.format(
        additional_info, instruction, priming_prefix
    )

    candidates = []
    responses = get_candidates(
        prompt_template, stop1, temperature, priming_prefix, engine=engine, n=n
    )
    for i in range(n):
        quality = eval_candidate(
            responses[i],
            instruction,
            eval_template,
            answer_start_token,
            engine=engine,
        )
        candidates.append((responses[i], quality))

    candidates.sort(key=lambda x: x[1], reverse=True)
    if return_all_results:
        return candidates
    return candidates[0][0]


def main(
    nl_query: str = "Return the name of each department that had more than 10 employees in June 2021",
    eval_template: str = "{};\n-- Explanation of the above query in human readable format\n-- {}",
    table_definitions: str = "# Employee(id, name, department_id)\n# Department(id, name, address)\n# Salary_Payments(id, employee_id, amount, date)\n",
    prompt_template: str = "### Postgres SQL tables, with their properties:\n#\n{}#\n### {}\n{}",
    n: int = 3,
    temperature: float = 0.3,
    engine: str = "davinci-codex",
):
    """
   根据自然语言指令生成一定数量的SQL查询,并根据最高的反向翻译分数选择最佳的查询。

在自然语言处理中,将自然语言指令转换为SQL查询是一种常见的任务。在这段代码中,将使用生成模型生成一定数量的SQL查询,并选择其中最佳的一个。

选择最佳的SQL查询需要考虑两个因素:查询的准确性和反向翻译分数。反向翻译分数是指将生成的SQL查询反向翻译回原始自然语言指令的质量。具体来说,该方法将根据自然语言指令生成一定数量的SQL查询,然后将每个查询反向翻译回原始自然语言指令。然后,将使用反向翻译模型计算反向翻译质量得分,并选择得分最高的SQL查询作为最佳查询。

这种方法可以确保生成的SQL查询准确性,并通过反向翻译分数评估查询的自然语言表述能力。
	:param nl_query: 自然语言查询。
	:param eval_template: 用于评估的模板。
	:param table_definitions: 查询中使用的表的定义。
	:param prompt_template: 生成SQL查询的提示模板。
	:param n: 生成的候选项数量。
	:param temperature: 生成时使用的温度。
	:param engine: 用于生成和评估的引擎。
	:return: 最佳SQL查询,或所有得分的生成SQL查询的列表。
    """

    result = backtranslation(
        prompt_template,
        table_definitions,
        nl_query,
        eval_template,
        priming_prefix="SELECT",
        temperature=temperature,
        n=n,
        engine=engine,
    )
    print(result)


if __name__ == "__main__":
    Smokey(main)

openai 的API 从自然语言生成sql语句
openai的API实现代码函数检索
将python代码文件中的函数提取出来
RFID软件协议如何进行自定义
matlab的开源替代软件
科学界类似matlab的工具
为什么很多游戏人物会穿模
3D人物的动作是如何制作出来的
3D人物说话时的嘴部动作与表情与语音如何配合到一起的
3D建模完成以后,如何用编程语言控制这些模型的展示和动画
3D动画,头发随风摆动是如何做到的
python语言有哪些宝藏功能
如何加速计算
python的unittest库如何使用功能
python的Graphviz库生成思维导图
python标准库列表
python的内置函数
OpenAI表示,通过GPT-4更新,AI变得更加智能,更安全,更直观
python的gmpy2库如何使用
python如何计算圆周率到千万位

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

openwin_top

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值