当前位置: 首页 > news >正文

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


相关文章:

  • 深入理解 Java 线程池
  • CSS 盒模型
  • 宇数科技激光雷达L2
  • 设计模式-单一职责
  • 最新!Ubuntu Docker 安装教程
  • 11 Collection集合、Map集合:分类、功能、遍历、底层原理,Stream流:获取、中间方法、终结方法 (黑马Java视频笔记)
  • 电信大带宽服务器的应用场景都有哪些?
  • 21.多态
  • 【JDK17】开源应用服务器大比对
  • redis zset基本介绍以及底层实现
  • Unity音乐内存优化
  • jmeter吞吐量控制器-Throughput Controller
  • 计算机四级 - 数据库原理 - 第9章「数据库应用及安全性」
  • WebLogic XMLDecoder反序列化漏洞(CVE-2017-10271)深度解析与实战复现
  • C/C++蓝桥杯算法真题打卡(Day6)
  • 在群晖DS923+手动安装我Wordpress最新版
  • 小科普《php、jsp、asp和aspx的区别》
  • 使用JSON存储数据的场景
  • 第七章:SELinux
  • DeepSeek R1在医院后勤故障报修工单自动化处理中的路径设计
  • “玉龙雪山脚下长满新娘”,有公司日赚上万
  • 韩国总统选举白热化进行中,中韩青年民间交流促两国友好往来
  • 江苏省人民检察院副检察长丁海涛调任省委政法委副书记
  • 中国预警机雷达有多强?可数百公里外看清足球轨迹
  • 瑞幸首度牵手成都国际非遗节,用一杯饮品将非遗之美推向全国
  • 1至4月国家铁路发送货物12.99亿吨,同比增长3.6%