当前位置:   article > 正文

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

自然语言转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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187

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如何计算圆周率到千万位

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/433458
推荐阅读
相关标签
  

闽ICP备14008679号