Text-to-SQL提示工程【Prompt Engineering】

news2024/12/26 14:07:58

我们刚刚启动了一个开源项目pg-text-query,目标是为文本到 SQL 制作生产就绪的大型语言模型 (LLM) 提示。 我们的目标是 利用 LLM、我们自己对 PostgreSQL 数据库的深入了解以及严格的测试来开发一流的文本到 SQL 的翻译。
在这里插入图片描述

推荐:用 NSDT设计器 快速搭建可编程3D场景。

1、文本到 SQL:基础知识

SQL 是第三大最常用的编程语言。 它是许多有抱负的开发人员学习的第一门语言。 我们刚刚在 bit.io 中发布了 AI 支持的文本到 SQL 翻译,以降低学习和使用 SQL 的入门门槛,让用户能够专注于查询的底层逻辑,而不是语法。

你现在可以在 bit.io 上使用它。 在 bit.io 查询编辑器或查询 API 中,将以下内容放在第一行: #!translate:text。 在下一行,以问题形式输入你的简单语言请求,例如, What record with provider ‘aws’ has the lowest latency? , 它将转换为您可以编辑或运行的查询。

我们的文本到 SQL 功能利用 OpenAI 的 Codex 模型将文本和数据库模式信息(“提示”)发送到 OpenAI LLM。 该模型生成请求的 SQL 并将其返回给用户,然后用户可以编辑(如果需要)并执行查询。
在这里插入图片描述

这听起来可能很简单,就像我们只是将文本发送到第三方 API 并返回结果一样。 当然,OpenAI 的LLM在这里承担着繁重的工作。 但是,在确保模型返回可用结果并快速、高效和安全地返回结果方面涉及很多细微差别。 这就是我们集中精力的地方。 模型选择、超参数值和提示内容等决策都会对返回结果的质量产生巨大影响。

2、最先进的技术(到目前为止)

我们的文本到 SQL 翻译功能运行良好。 我们花了很多时间处理初始提示,比较几个不同的模型,并调整模型超参数。 到目前为止,对提示的大部分改进都是通过反复试验完成的:我们阅读了很多有关提示工程的文章,编写了很多提示,并对有效的提示进行了迭代。 我们还利用现有的模式汇总功能将模式详细信息与提示一起传递,从而允许 OpenAI 模型返回具有正确标识符的 SQL。

当前提示相当简单。 它首先传递三个注释:第一个指定语言(PostgreSQL); 第二个传递模式详细信息(模式、表、列、类型); 第三个指定所需的输出,包含用户的自然语言查询。 提示的最后一行 SELECT 1 , 表明我们不想接收作为注释的输出 SQL,而是希望接收准备执行的 SQL。

-- Language PostgreSQL
-- Table penguins, columns = [species text, island text, bill_length_mm double precision, bill_depth_mm double precision, flipper_length_mm bigint, body_mass_g bigint, sex text, year bigint]
-- A PostgreSQL query to return 1 and a PostgreSQL query for {natural language query}
SELECT 1;

有了这个提示,给定一个明确指定的简单语言查询,OpenAI 模型通常:

  • 返回对应于用户纯文本查询的工作代码,
  • 返回与 Postgres 兼容的 SQL 代码,而不是来自其他语言或其他 SQL 变体的代码,并且
  • 包括与数据库模式对应的正确(但并非总是格式正确;见下文)标识符

在这里插入图片描述

3、挑战

仍有改进的机会。

主要障碍之一是向 Codex 模型发送简明提示,同时仍提供足够的模式信息。 我们希望提供有关数据库架构的足够信息以获得可用的查询,而不会在提示中发送过多的令牌并可能增加使用 OpenAI 模型 API 的成本。

正确格式化和引用一些标识符是另一个挑战。 大多数情况下输出是正确的,但在某些情况下,除“public”之外的模式中的表格式不正确,并且未在引号中返回带有大写或特殊字符的表名。 SQL 语法的这些特定细微差别需要小心处理以确保输出准确。

通过提示注入防止文本到 SQL 转换功能的滥用是另一个重要挑战,对于维护用户对系统的信任至关重要。 防止滥用有助于我们缩小关注范围,并确保我们不会产生不必要的成本或暴露通用代码翻译工具的风险。 例如,目前可以(虽然不方便)利用以下方法生成其他语言的代码:

#!translate:text
return a string defining a python function for adding two numbers

此查询返回:

SELECT 'def add(x, y): return x + y'

有更简单的方法来获取 AI 生成的 Python 代码; 并且有充分的理由将代码片段存储在数据库中。 简单地阻止这种使用模式并不能解决问题,但预测和准备可能的意外使用模式仍然很有价值。

最后,防止用户意外修改或删除数据非常重要。 任何人都不应在未经审查的情况下执行 LLM 生成的代码。 但我们也想非常清楚用户何时可能运行可能导致数据修改或丢失的查询。

例如,(相当不明确的)提示:

#!translate:text
update the table to make it clear that all of the islands in the table are in Antarctica.

返回如下 SQL:

UPDATE penguins SET island = 'Antarctica' WHERE island IS NOT NULL

用南极洲覆盖“岛屿”列可能不是用户的意图。 也许意图是添加一个“continent”列,或者将“(南极洲)”附加到岛屿列中的每个条目,尽管提示中的意图并不明确。 无论如何,采取适当的保护措施以防止用户盲目地执行此类查询和意外更改数据将很有用。

当然,我们指出这些挑战并不是为了好玩。 我们有解决这些问题的计划。

4、pg-text-query 开源项目

我们正在不断改进文本到 SQL 的翻译功能。 我们想分享。 我们正在开发一个用于提示、配置和测试的开源项目,以与社区互动并收集反馈,并广泛分享我们的发现。 LLM经常被用作多面手:他们擅长将任何语言转换成任何其他语言并响应任意文本提示。 我们想了解如何制作最好的文本到 SQL 翻译器。

你可以立即开始使用一些关键功能:这些工具使你可以立即着手改进用于文本到 SQL 转换的提示。

5、提示词游乐场

克隆这个仓库; 使用 pip install streamlit.py 安装 streamlit; 然后,从根目录运行 streamlit run playground/app.py。 这将打开一个交互式的“提示词游乐场”,你可以在其中试验提示和模式详细信息的不同组合。

在这里插入图片描述

这对于快速测试和迭代不同的提示想法以及建立关于什么有效什么无效的直觉很有用。 你可以设置“初始化提示”(最终用户无权访问); 用户的简单语言查询和模式详细信息,并查看查询的这些不同部分如何相互交互。 然后可以生成 SQL,甚至可以在实时数据库上执行它。 请确保在执行之前仔细检查所有生成的 SQL,以确保你不会意外删除或修改数据。
在这里插入图片描述

6、架构详细信息实用程序

db_schema.py 模块包括用于从 Postgres 数据库中提取结构化模式数据的实用程序。 提供足够的模式信息以使模型能够包含正确的标识符是很有用的。 然而,太多的模式信息可能会占用大量的令牌,从而产生不必要的成本,并且可能留下太少的令牌,使模型无法成功生成所需的 SQL。

你可以按如下方式使用该模块:

import os
from pprint import pprint

import bitdotio
from dotenv import load_dotenv
from pg_text_query import get_db_schema

DB_NAME = "bitdotio/palmerpenguins"
b = bitdotio.bitdotio(os.getenv("BITIO_KEY"))

# Extract a structured db schema from Postgres
with b.pooled_cursor(DB_NAME) as cur:
db_schema = get_db_schema(cur, DB_NAME)
pprint(db_schema)

7、提示和查询生成

你可以使用 prompt.py 模块生成提示(基于我们迄今为止的提示工程工作),该模块提供帮助程序来准备 Postgres 查询提示。

# Construct a prompt that includes text description of query
prompt = get_default_prompt(
"most common species and island for each island",
db_schema,
)

# Note: prompt includes extra `SELECT 1` as a naive approach to hinting for
# raw SQL continuation
print(prompt)

返回以下提示:

-- Language PostgreSQL
-- Table penguins, columns = [species text, island text, bill_length_mm double precision, bill_depth_mm double precision, flipper_length_mm bigint, body_mass_g bigint, sex text, year bigint]
-- A PostgreSQL query to return 1 and a PostgreSQL query for most common species and island for each island
SELECT 1;

gen_query.py 模块是 openai.Completion.create 的包装器,它处理向 OpenAI API
发送请求。

# Using default OpenAI request config, which can be overriden here w/ kwargs
query = generate_query(prompt)
print(query)

从上面的提示中返回:

SELECT species, island, COUNT(*) FROM penguins GROUP BY species, island

8、下一步计划

这个项目还处于起步阶段,但我们有几个主要方向想要探索:

  • 该项目将包括一个测试套件,其中包含不同类型的查询和所需的文本以测试不同的提示。
  • 使用这个测试套件,我们计划比较不同的模型、超参数和提示。 有些比其他的更准确吗? 我们能否通过更短的提示达到相同的准确性? 我们能否在不牺牲准确性的情况下使用更快或更高效的模型?
  • 我们计划记录模型滥用的任何途径,以及缓解策略。
  • 从长远来看,我们还将微调大量 SQL 查询和翻译的模型。

原文链接:Text-to-SQL提示工程 — BimAnt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/539348.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

T-GCN:用于交通流预测的时序图卷积网络

1.文章信息 本次介绍的文章是2020年发表在IEEE 智能交通系统汇刊上的《T-GCN: A Temporal Graph Convolutional Network for Traffic Prediction》。 2.摘要 为了同时捕获空间和时间依赖性,本文提出了一种新的基于神经网络的交通流预测方法——时间图卷积网络(T-GCN…

Java中的Socket通信和HTTP通信有什麽不同

文章目录 Socket通信HTTP通信两者之间的区别总结 Java中的Socket通信和HTTP通信是两种不同的网络通信方式。Socket通信是一种面向连接的通信协议,而HTTP通信则是基于TCP/IP协议的无连接的应用层协议。在本文中,我将会简要介绍两者的区别,并且…

开放原子训练营(第三季)inBuilder低代码开发实验室初体验

一、活动介绍 开放原子训练营开启inBuilder低代码实验室活动。无论您是计算机行业相关从业者、低代码开发爱好者还是普通用户,都可以基于inBuilder低代码开发平台社区版(基于UBML开源项目的一个可以广泛使用的发行版),体验向导式、…

基于FPGA的车牌识别

基于FPGA进行车牌识别 基于FPGA进行车牌识别 1. 文件说明2. 程序移植说明3. 小小的编程感想 本项目的原理讲解视频已经上传到B站“基于FPGA进行车牌识别”。 本项目全部开源,见我本人的Github仓库“License-Plate-Recognition-FPGA”。 1. 文件说明 小技巧&…

chatgpt赋能Python-pyecharts_雷达图

Pyecharts雷达图:最佳数据可视化工具 Pyecharts是一个流行的Python库,用于创建美观、交互式和动态数据可视化。其中一个强大的工具是雷达图,它可以帮助你更好地理解数据趋势和关系。 现在,我们将深入研究Pyecharts雷达图&#xf…

深度学习 - 49.SIM 搜索兴趣网络 GSU 与 Soft Search 简单实现 By Keras

目录 一.引言 二.GSU 结构分析 1.Input Layer 输入层 2.Embedding Layer 嵌入层 3.Pooling Layer 池化层 4.MLP 深层网络 5.Soft Search 软搜索 三.GSU 结构实现 1.Init 初始化 2.Build 构建 3.call 调用 4.GSU Layer 完整代码 四.GSU 模型训练 1.Input Layer …

日语文法PPT截图1-15

B站课程链接 aspect 关注事件的流动 相当于英语中现在进行时 这些是简体,是不能表达对听话人的礼貌的。 格助词一般只能接在名词后面,表达名词在句子中所做的成分。 副助词除了可以接在名词的后…

UDP和TCP详解

1. UDP 1.1 UDP协议段格式 16位UDP长度, 表示整个数据报(UDP首部UDP数据)的最大长度, 即数据报最大大小为2^16byte 64KB如果校验和出错, 就会直接丢弃 1.2 UDP特点 1.2.1 无连接不可靠 无连接 知道对端的IP和端口号就直接进行传输, 不需要建立连接不可靠 没有确认机制, 没有…

小型双轮差速底盘实现触须避障

1. 功能说明 在R023d机器人车体上安装2个 触须传感器 ,实现机器人小车避障功能。 2. 电子硬件 在这个示例中,我们采用了以下硬件,请大家参考: 主控板 Basra主控板(兼容Arduino Uno)‍ 扩展板 Bigfish2.1扩展…

netstat 连接通信的信息和状态

netstat t 只显示tcpu只显示udpnnum 数字形式显示地址和端口号l listen 显示监听端口 pprogram 显示进程aall 所有连接和监听r显示路由表 netstat -lnp 显示服务监听端口tcpudpsocket ,socket 文件也用来同一台服务器的进程之间通信的。 netsta…

12.2RAC 实例State 为 UNKNOWN

去年10月份接手一个12.2 RAC环境,使用crsctl status res -t查看,发现有个实例状态是UNKNOWN。一直都没有停机维护时间,在测试环境中也没有模拟不出来,原以为删除实例再添加可以解决了。就一直等待维护机会来处理, ASM…

114个ChatGPT全网最热话题

前言 当你使用ChatGPT时,你可能有很多问题需要回答。ChatGPT是一个非常强大的自然语言处理工具,可以用于许多不同的任务,包括聊天机器人、智能客服、文本生成和语言翻译等。 在这篇博客中,我将介绍一些关于如何问ChatGPT的技巧和…

RS-485收发器MS2552可pin对pin兼容THVD1552

THVD15xx 是一系列抗噪 RS-485/RS-422 收发器,专用于在恶劣的工业环境中运行。这些器件的总线引脚可耐受高级别的 IEC 电气快速瞬变 (EFT) 和 IEC 静电放 电 (ESD) 事件,从而无需使用其他系统级保护组件。每个器件由 5V 单电源供电。该系列中的器件具有扩…

【手机建站】安卓Termux+cpolar内网穿透,搭建外网可以访问的网站 - 无公网IP

文章目录 概述1.搭建apache2.安装cpolar内网穿透3.公网访问配置4.固定公网地址5.添加站点 概述 Termux是一个Android终端仿真应用程序,用于在 Android 手机上搭建一个完整的Linux 环境,能够实现Linux下的许多基本操作,不需要root权限Termux就…

常见的dos操作命令

创建abc目录文件(md abc),进入abc文件(cd abc),删除abc文件(rd abc) dir c:\测试 显示指定路径下所有文件和目录的信息 copy c:\测试.txt c:\测试 复制文件命令 ren c:\…

彻底弄懂Java中的toString方法

在Java中,所有的类都默认显式或者隐式继承自Object类,包括你定义的类。而Object类本身有一个toString()方法,用于返回一个表示该对象的字符串,该方法返回的是一个字符串类型的值。 如果你的类没有重写该方法,那么它就会…

【C++】21.智能指针

1.为什么需要智能指针 C无gc new/malloc出来的资源 是需要我们去手动释放 1.忘记释放 2.发生异常安全问题 new/malloc fun()://throw 异常 delete/free 最终都导致资源的泄漏 利用智能指针更好的去解决此类问题 2.智能指针 1RAII RAII(Resource Acquisit…

javaIO之各种流的分类与实际应用

目录 1、初识 Java IO2、传输方式划分3、操作对象划分3.1文件3.2数组(内存)3.3管道3.4基本数据类型3.5缓冲3.6打印3.7对象序列化/反序列化3.8转换 1、初识 Java IO IO,即in和out,也就是输入和输出,指应用程序和外部设备…

Java BIO 和 NIO 使用,有什么区别

Java 中的 I/O 操作主要有两种方式:BIO 和 NIO。BIO(Blocking I/O)是同步阻塞 I/O 模型,而 NIO(Non-Blocking I/O)是异步非阻塞 I/O 模型。这两种 I/O 模型在编写网络应用程序时有着不同的优缺点&#xff0…

Intel® ZTNA RA 23.03 release

摘要 传统的防火墙、入侵检测系统都是基于物理边界的,默认墙内安全,墙外不安全。随着应用程序和用户现在更可能在外围而不是内部,这种安全模型已经不再适用于当今复杂的网络场景。而“零信任”脱离了这种传统的安全模型,不再区别对…