赞
踩
从自然语言生成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如何计算圆周率到千万位
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。