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

我们刚刚启动了一个开源项目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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】C语言连接数据库

在使用数据库的时候&#xff0c;我们是操作客户端方的&#xff0c;向服务器请求数据。MySQL的端口号-3306 连接mysql需要头文件&#xff1a;#include<mysql/mysql.h> 基础连接步骤&#xff1a; 1.创建连接句柄 MYSQL mysql_con;//连接句柄 2.初始化连接句柄mysql_i…

「OceanBase 4.1 体验」|大厂开始接入的国产分布式数据库,不来了解了解?

OceanBase 4.1 体验 前言OCP Express在线升级功能租户级物理备库TP&#xff08;事务处理&#xff09;和AP&#xff08;分析处理&#xff09;优化TP 性能优化AP 性能优化 结尾 前言 上次我们讲了本人自己亲自上手OceanBase 4.1的初体验&#xff0c;国产的分布式数据库也太太太太…

有哪些好用的AI工具?

现在有很多好用的AI工具&#xff0c;以下是一些常用的&#xff1a; 1. TensorFlow&#xff1a;谷歌开发的深度学习框架&#xff0c;支持多种编程语言&#xff0c;包括Python、C、Java等。 2. PyTorch&#xff1a;Facebook开发的深度学习框架&#xff0c;易于使用&#xff0c;…

Redis源码分析之网络模型

Redis网络模型 阅读源码的初衷Redis源码阅读 阅读源码的初衷 很多网上解释这个Redis为啥这么块&#xff1f;都会说Redis这么快的原因会有一个Redis才用了单线程&使用了多路io复用来检查io事件&#xff0c;单线程可以避免多线程对资源的竞争。如果我们使用了多线程那么就需…

ChatGPT其实并不想让开发人员做这5件事情

前言 ChatGPT已经火爆了快半年了吧&#xff0c;紧接着国内也开始推出了各种仿制品&#xff0c;我甚至一度怀疑&#xff0c;如果人家没有推出ChatGPT&#xff0c;这些仿制品会不会出现。而很多人也嗨皮得不行&#xff0c;利用各种方法开始科学上网&#xff0c;用ChatGPT做各种觉…

[读书笔记] Variational AutoEncoders

小全读书笔记 《Variational AutoEncoders》 1. Generative Model &#xff08;生成式模型&#xff09;简述2. 简单生成模型 AutoEncoders2.1 结构2.2 不足 3. Variational AutoEncoders4. Variational AutoEncoders的数学支持 此读书笔记来自于Joseph Rocca的Understanding Va…

APP 兼容性测试是什么?8年测试老鸟告诉你

1、APP 兼容性测试认识 随着 APP 应用范围越来越广&#xff0c;用户群体越来越大&#xff0c;终端设备的型号也越来越多&#xff0c;移动终端碎片化加剧&#xff0c;使得 APP 兼容性测试成为测试质量保障必须要考虑的环节。 APP 兼容性测试通常会考虑&#xff1a;操作系统、厂…

js执行思维导图

备注&#xff1a; js执行&#xff1a; 执行分为两部分&#xff1a;预执行和执行 预执行&#xff1a;创建好执行上下文 执行&#xff1a;执行栈中执行 js引擎&#xff1a; 读取并执行js 各个浏览器的引擎如下 …

linux学习[10]磁盘与文件系统(1):查看磁盘容量指令df 评估文件系统的磁盘使用量指令 du

文章目录 前言1. df指令2. du指令 前言 TF卡制作的过程中涉及到了磁盘分区格式化等问题&#xff0c;当时对具体的指令理解不是特别深刻&#xff1b;由此引申到我对linux中的整个磁盘与文件系统没有一个全面的认识&#xff0c;这个磁盘与文件系统的系列博客章节就对这些进行记录…

MySQL的主从复制与读写分离

一、MySQL主从复制 1、mysql支持的复制类型 STATEMENT∶基于语句的复制。在服务器上执行sql语句&#xff0c;在从服务器上执行同样的语句&#xff0c;mysql默认采用基于语句的复制&#xff0c;执行效率高。 ROW∶ 基于行的复制。把改变的内容复制过去&#xff0c; 而不是把命…

下载和安装appuploader

转载&#xff1a;下载和安装appuploader IOS开发工具官网地址 Appuploader home -- A tool improve ios develop efficiency such as submit ipa to appstore and manage ios certificate 最新版本已经优化了没支付688给apple的账号登录流程&#xff0c;无需再安装其他软件。…

微服务保护(线程隔离、降级、熔断)

线程隔离 线程隔离有两种方式实现: 线程池隔离信号量隔离 线程池隔离 假设服务A依赖于服务B和服务C&#xff0c;那么服务A就会分别对服务B和服务C创建线程池&#xff0c;当有请求进来时不会使用服务A本身的线程&#xff0c;而是到对应的线程池中取一个线程来调用feign的客户…

AMBER分子动力学模拟之TOP准备-- HIV蛋白酶-抑制剂复合物(1)

AMBER分子动力学模拟之TOP准备-- HIV蛋白酶-抑制剂复合物(1) 我们以HIV蛋白酶-抑制剂复合物为例子&#xff0c;跑Amber动力学模拟 下载1phv 从PBD下载文件&#xff1a;https://www.rcsb.org/ PDB文件预处理 我们以 “protein(water) ligandcomplex” 为例来说一下如何处…

力扣82删除排序链表中的重复元素 II:思路分析+代码实现+方法总结(三指针法快慢指针法【双指针】递归法)

文章目录 第一部分&#xff1a;题目描述第二部分&#xff1a;代码实现2.1 三指针法2.2 快慢指针法&#xff08;双指针&#xff09;2.3 递归 第一部分&#xff1a;题目描述 &#x1f3e0; 链接&#xff1a;82. 删除排序链表中的重复元素 II - 力扣&#xff08;LeetCode&#xf…

ChatGPT热门资料汇总,绝对不割韭菜

前言 ChatGPT 的出现&#xff0c;AI圈子一下就热闹起来了&#xff0c;各个公司争先恐后地出自己的产品&#xff0c;百度的文心一言、谷歌的Bard、阿里的通义千问等等&#xff0c;有很多人借此机会已经赚到百万&#xff0c;很多卖课搞培训的都是互为合伙人&#xff0c;大家都懂…

如何注册appuploader账号​

如何注册appuploader账号​ 我们上一篇讲到appuploader的下载安装&#xff0c;要想使用此软件呢&#xff0c;需要注册账号才能使用&#xff0c;今​ 天我们来讲下如何注册appuploader账号来使用软件。​ 1.Apple官网注册Apple ID​ 首先我们点击首页左侧菜单栏中的“常见网…

【更新日志】填鸭表单TduckPro v5.1 更新

hi&#xff0c;各位Tducker小伙伴。 填鸭表单pro迎来了v5.1版本&#xff1b;本次我们进行了许多的功能新增和优化&#xff0c;能够让我们在日常使用中获得更好的体验。 让我们一起来康康新功能吧。 01 新增Pro功能 新增登录后才能填写表单。 新增表单卡片一键发布。 新增矩…

【STM32CubeMX】F103窗口看门狗

前言 本文记录了我学习STM32CubeMX的过程&#xff0c;方便以后回忆。我们使用的开发板是基于STM32F103C6T6的。本章记录了窗口看门狗的使用配置。要学习的话&#xff0c;注意流程一说&#xff0c;省略的内容。 基础 窗口看门狗(WWDG)属于APB1上外设。窗口看门狗(WWDG)的时钟源…

JUC并发编程16 | CAS自旋锁

CAS自旋锁 是什么&#xff0c;干什么&#xff0c;解决了什么痛点&#xff1f;如何解决&#xff0c;如何使用。 原子类&#xff1a;java.util.concurrent.atomic 在没有CAS之前&#xff0c;多线程环境不使用原子类保证线程安全i等操作&#xff0c;会出现数据问题&#xff0c;…

Day968.如何开启一个遗留系统现代化项目? -遗留系统现代化实战

如何开启一个遗留系统现代化项目&#xff1f; Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于如何开启一个遗留系统现代化项目&#xff1f;的内容。那如何启动一个遗留系统现代化项目。 一、项目背景 说来有点唏嘘&#xff0c;国内遗留系统的重灾区&#xff0c;恰恰…