构建一个可查询SQL数据的问答系统

引言

构建一个可以在SQL数据库上运行的问答系统,需要通过模型生成查询结构化数据,与查询非结构化文本数据的方法有显著不同。这篇文章将指导你如何在数据库的表格数据上创建问答系统。我们将讨论使用链和代理的实现,这些系统允许我们对数据库中的数据提问并获得自然语言的答案。

主要内容

架构

大致步骤如下:

  1. 将问题转换为DSL查询:模型将用户输入转换为SQL查询。
  2. 执行SQL查询:运行查询。
  3. 回答问题:使用查询结果响应用户输入。

搭建环境

import getpass
import os
from langchain_community.utilities import SQLDatabase

# 安装必要的库
%pip install --upgrade --quiet langchain langchain-community langchain-openai faiss-cpu

# 设置API密钥
if not os.environ.get("OPENAI_API_KEY"):
    os.environ["OPENAI_API_KEY"] = getpass.getpass()

db = SQLDatabase.from_uri("sqlite:///Chinook.db")

使用链

链可以用来支持步骤可预测的应用。它可以把问题转换为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"})

执行和回答

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"})

使用代理

代理提供了更灵活的数据库交互方式,可以处理复杂查询并从多个错误中恢复。

from langchain_community.agent_toolkits import SQLDatabaseToolkit
from langchain_core.messages import SystemMessage

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

system_message = SystemMessage(content=SQL_PREFIX)

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

代码示例

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

常见问题和解决方案

  1. 安全问题:执行由模型生成的SQL查询有固有风险。确保数据库连接权限限制在最小范围。
  2. 查询错误:引入查询检查工具来验证查询的正确性。

总结和进一步学习资源

构建SQL问答系统是AI应用中一个重要的组成部分。可以进一步了解以下方向:

  • 提示策略:高级提示工程技术。
  • 查询检查:添加查询验证和错误处理。
  • 大型数据库:处理大数据集的方法。

参考资料

  • LangChain官方文档
  • OpenAI API文档

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

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值