langchain整合数据库
文章目录
- 概要
- 案例
- 案例1
- 案例2
- 案例3
概要
本案例介绍在数据库中表格数据上的问答系统的基本方法。将涵盖使用链(chains)和代理(agents)的实现。通过查询数据库中的数据并得到自然语言答案。两者之间的主要区别在于,我们的代理可以根据需要多次循环查询数据库来回答问题
实现思路:
- 1.将问题转换为DSL查询:模型将用户输入转换为SQL查询
- 2.执行SQL查询:执行查询。
- 3.回答问题:模型使用查询结果响应用户输入
案例
案例1
利用大模型生成sql
import os
from langchain.chains.sql_database.query import create_sql_query_chain
from langchain_community.chat_models import ChatZhipuAI
from langchain_community.utilities import SQLDatabase
"""
利用大模型生成sql
"""
# 设置智普 AI 的 API 密钥
os.environ["ZHIPUAI_API_KEY"] = "5eb20f1f19--Kxlr"
# 初始化智普 AI 模型
llm = ChatZhipuAI()
# sglalchemy初始化MySOL数据库的连接A11A1×5
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'test'
USERNAME = 'root'
PASSWORD = 'root'
# mysglclient驱动URL
MYSQL_URI = 'mysql+mysqldb://{}:{}@{}:{}/{}?charset=utf8mb4'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
db = SQLDatabase.from_uri(MYSQL_URI)
# 直接使用大模型和数据库整合,只能根据你的问题生成SQL
sql_chain = create_sql_query_chain(llm, db)
rest = sql_chain.invoke({'question': '请问:部门表有多少数据'})
print(rest)
结果:
E:\learn_work_spaces\PythonProject1\.venv\Scripts\python.exe E:\learn_work_spaces\PythonProject1\数据库\数据库整合.py
``sql
SELECT COUNT(*) AS `department_count` FROM `department`
``
SQLResult:
进程已结束,退出代码为 0
案例2
利用大模型生成sql,并执行sql得到最终结果
import os
from operator import itemgetter
from langchain.chains.sql_database.query import create_sql_query_chain
from langchain_community.chat_models import ChatZhipuAI
from langchain_community.tools import QuerySQLDatabaseTool
from langchain_community.utilities import SQLDatabase
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import RunnablePassthrough
"""
利用大模型生成sql
"""
# 设置智普 AI 的 API 密钥
os.environ["ZHIPUAI_API_KEY"] = "5eb20f1f19--dKxlr"
# 初始化智普 AI 模型,其他模型可能出现执行错误
llm = ChatZhipuAI(model='GLM-4-Plus')
# sglalchemy初始化MySOL数据库的连接A11A1×5
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'test'
USERNAME = 'root'
PASSWORD = 'root'
# mysglclient驱动URL
MYSQL_URI = 'mysql+mysqldb://{}:{}@{}:{}/{}?charset=utf8mb4'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
db = SQLDatabase.from_uri(MYSQL_URI)
# 直接使用大模型和数据库整合,只能根据你的问题生成SQL
sql_chain = create_sql_query_chain(llm, db)
answer_prompt = PromptTemplate.from_template(
"""给定以下用户问题、SQL语句和SQL执行后的结果,回答用户问题。
Question: {question}
SQL Query: {query}
SQL Result:{result}
回答:"""
)
# 创建一个执行sql语句的工具
execute_sql_tool = QuerySQLDatabaseTool(db=db)
# 1、生成sql 2、执行sql
# 模版
chain = (
RunnablePassthrough.assign(query=sql_chain).assign(result=itemgetter('query') | execute_sql_tool)
| answer_prompt
| llm
| StrOutputParser()
)
rest = chain.invoke(input={'question': '请问:部门表有多少条数据?'})
print(rest)
结果:
E:\learn_work_spaces\PythonProject1\.venv\Scripts\python.exe E:\learn_work_spaces\PythonProject1\数据库\数据库整合.py
从您提供的SQL查询和假设的执行结果来看,查询本身是正确的,目的是统计`department`表中的数据条数。假设执行结果为`department_count`值为3,那么可以得出结论:
**Answer: 部门表中有3条数据。**
然而,您提到的错误信息 `(MySQLdb.ProgrammingError) (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '```sql\nSELECT COUNT(*) AS department_count FROM `department`;\n```\n\n假设执行' at line 1")` 表示在执行SQL语句时存在语法错误。
这种错误通常是由于SQL语句的格式问题或额外的无效字符引起的。具体到这个错误,可能是因为在执行SQL语句时,包含了多余的标记或注释,例如```sql```这样的标记通常用于代码块表示,但不应该包含在执行的SQL语句中。
为了确保SQL语句能正确执行,请确保只提交纯净的SQL代码,如下所示:
``sql
SELECT COUNT(*) AS department_count FROM `department`;
``
如果仍然遇到问题,请检查以下几点:
1. 确保SQL语句前后没有多余的字符或注释。
2. 确保使用的工具或环境支持该SQL语法。
3. 检查数据库连接和权限设置是否正确。
希望这能帮助您解决问题!如果有更多细节或需要进一步的帮助,请提供更多信息。
进程已结束,退出代码为 0
案例3
在案例2 的基础上使用代理实现
import os
from langchain_community.agent_toolkits import SQLDatabaseToolkit
from langchain_community.chat_models import ChatZhipuAI
from langchain_community.utilities import SQLDatabase
from langchain_core.messages import SystemMessage, HumanMessage
from langgraph.prebuilt import create_react_agent
"""
利用大模型生成sql
"""
# 设置智普 AI 的 API 密钥
os.environ["ZHIPUAI_API_KEY"] = "5eb20f1--dKxlr"
# 初始化智普 AI 模型,其他模型可能出现执行错误
llm = ChatZhipuAI(model='GLM-4-Plus')
# sglalchemy初始化MySOL数据库的连接A11A1×5
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'test'
USERNAME = 'root'
PASSWORD = 'root'
# mysglclient驱动URL
MYSQL_URI = 'mysql+mysqldb://{}:{}@{}:{}/{}?charset=utf8mb4'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
db = SQLDatabase.from_uri(MYSQL_URI)
# 创建工具
toolkit = SQLDatabaseToolkit(db=db, llm=llm)
tools = toolkit.get_tools()
# 使用agent完成整个数据库的整合
system_prompt = """
您是一个被设计用来与SOL数据库交互的代理。
给定一个输入问题,创建一个语法正确的SQL语句并执行,然后查看查询结果并返回答案
除非用户指定了他们想要获得的示例的具体数量,否则始终将SOL查询限制为最多10个结果
你可以按相关列对结果进行排序,以返回MySQL数据库中最匹配的数据。
您可以使用与数据库交互的工具。在执行查询之前,你必须仔细检查。如果在执行查询时出现错误,请重写查询并重试。
不要对数据库做任何DML语句(插入,更新,删除,删除等)
首先,你应该查看数据库中的表,看看可以查询什么。
不要跳过这一步。
然后查询最相关的表的模式。
"""
system_message = SystemMessage(content=system_prompt)
# 创建代理
agent_sql_tool = create_react_agent(llm, tools=tools)
resp = agent_sql_tool.invoke({'messages': [HumanMessage(content='请问:部门表有多少数据')]})
rest = resp['messages']
print(rest)
print('该响应结果元素个数:', len(rest))
print(rest[len(rest) - 1])
结果:
E:\learn_work_spaces\PythonProject1\.venv\Scripts\python.exe E:\learn_work_spaces\PythonProject1\数据库\代理数据库整合.py
[HumanMessage(content='请问:部门表有多少数据', additional_kwargs={}, response_metadata={}, id='807cb8a7-e6a3-47c4-b25b-0b2ad27095b1'), AIMessage(content='', additional_kwargs={'tool_calls': [{'function': {'arguments': '{}', 'name': 'sql_db_list_tables'}, 'id': 'call_-8891223935282577451', 'index': 0, 'type': 'function'}]}, response_metadata={'token_usage': {'completion_tokens': 7, 'prompt_tokens': 634, 'total_tokens': 641}, 'model_name': 'GLM-4-Plus', 'finish_reason': 'tool_calls'}, id='run-7d059fc4-adbb-4e2f-bc6c-bdb244d6fe94-0', tool_calls=[{'name': 'sql_db_list_tables', 'args': {}, 'id': 'call_-8891223935282577451', 'type': 'tool_call'}]), ToolMessage(content='a, customer_data, department, employee, test1, user', name='sql_db_list_tables', id='81331f8d-15df-4284-8271-e01a268a2849', tool_call_id='call_-8891223935282577451'), AIMessage(content='', additional_kwargs={'tool_calls': [{'function': {'arguments': '{"query": "SELECT COUNT(*) FROM department"}', 'name': 'sql_db_query'}, 'id': 'call_-8891225687629570333', 'index': 0, 'type': 'function'}]}, response_metadata={'token_usage': {'completion_tokens': 15, 'prompt_tokens': 651, 'total_tokens': 666}, 'model_name': 'GLM-4-Plus', 'finish_reason': 'tool_calls'}, id='run-fc5a61de-1c14-485f-b234-dd97cf9931c6-0', tool_calls=[{'name': 'sql_db_query', 'args': {'query': 'SELECT COUNT(*) FROM department'}, 'id': 'call_-8891225687629570333', 'type': 'tool_call'}]), ToolMessage(content='[(4,)]', name='sql_db_query', id='9110469c-b518-4402-961a-49159c8d4211', tool_call_id='call_-8891225687629570333'), AIMessage(content='部门表中有4条数据。', additional_kwargs={}, response_metadata={'token_usage': {'completion_tokens': 9, 'prompt_tokens': 659, 'total_tokens': 668}, 'model_name': 'GLM-4-Plus', 'finish_reason': 'stop'}, id='run-9d2ecc1e-ef7f-4915-8c08-22835389fa06-0')]
该响应结果元素个数: 6
content='部门表中有4条数据。' additional_kwargs={} response_metadata={'token_usage': {'completion_tokens': 9, 'prompt_tokens': 659, 'total_tokens': 668}, 'model_name': 'GLM-4-Plus', 'finish_reason': 'stop'} id='run-9d2ecc1e-ef7f-4915-8c08-22835389fa06-0'
进程已结束,退出代码为 0