前言
上篇文章介绍Langchain框架如何连接数据库
这篇文章将带领大家编写一个Agent数据库智能体
一、开发环境
版本:Python 3.10.4 版本(注:Python版本至少3.9以上,最好是3.10版本) MySQL8.0
我这里用到的是MySQL数据库
二、编写代码
1.调用API、连接数据库
这部分代码在上一篇文章已经做过详细介绍了,这里就不过多讲述了
# 调用AI检测平台(langSmith)
import os
import sys
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = 'xxxxxxxxxx'
os.environ["LANGCHAIN_PROJECT"] = "智谱AI"
#调用智谱AI API
os.environ["ZHIPUAI_API_KEY"] = "xxxxxxxx"
#调用第三方库
from langchain_community.chat_models import ChatZhipuAI
from langchain_community.utilities import SQLDatabase
from langchain_community.agent_toolkits import SQLDatabaseToolkit
from langchain_core.messages import SystemMessage, HumanMessage
from langgraph.prebuilt import chat_agent_executor
#调用大语言模型
model = ChatZhipuAI(model_name='glm-4-flash')
HOSTNAME = '127.0.0.1'
PORT='3306'
DATABASE = 'langchain'
USERNAME = 'root'
PASSWORD = 'root'
MYSQL_UEL = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(USERNAME,PASSWORD,HOSTNAME,PORT,DATABASE)
db = SQLDatabase.from_uri(MYSQL_UEL)
2.创建工具
toolkit = SQLDatabaseToolkit(db=db,llm=model)
tools = toolkit.get_tools()
-
SQLDatabase Toolkit:LangChain生态系统中的一个重要组件,专门设计用于帮助AI代理与SQL数据库进行交互。它提供了一系列工具,使得AI系统能够执行诸如查询数据、检查数据库结构、验证SQL语句等操作。
-
db:连接的数据库
-
llm:调用的大语言模型
-
.get_tools:返回了当前工具包中所有可用工具的列表。这些工具随后可以被用于构建智能代理
3.定义提示词模板
system_prompt="""
你是一个被设计用来与SQL数据库交互的代理。
给定一个输入问题,创建一个语法正确的SQL语句并且执行,然后查看查询结果并且返回答案。
除非用户指定了他们想要获得的实例的具体数量,否则始终将SQL查询限制为最多10个结果。
你可以按相关列对结果进行排序,以返回MySQL数据库中最匹配的数据。
你可以使用与数据库交互的工具。在执行查询之前,你必须仔细检查。如果执行查询时出现错误,请重新查询并重试。
不要对数据库做任何的DML语句(插入,更新,删除等)。
首先,你应该查看数据库中的表,看看能查询什么。
不要跳过这个一步。
然后查询最相关表的模式。
"""
system_message = SystemMessage(content=system_prompt)
4.创建代理Agent
agent = chat_agent_executor.create_tool_calling_executor(model,tools,prompt=system_message)
-
chat_agent_executor.create_tool_calling_executor:创建一个支持工具调用的聊天代理执行器,使代理(Agent)能够在对话过程中动态调用外部工具(如API、函数等),从而增强其处理复杂任务的能力。
-
这个方法里面一共有三个参数 model调用的大模型 tools创造的工具 以即提示词模板
5.运行部分
def run():
question = input('请输入你的问题')
question = '"' + question + '"'
resp = agent.invoke({'messages':[HumanMessage(content=question)]})
result = resp['messages']
#最后一个才是真正的答案
print(result[len(result)-1].content)
num = int(input('请输入你的选择 1.提问 2.退出系统'))
if num == 1:
run()
else:
sys.exit()
if __name__ == "__main__":
print('--------欢迎来到数据库智能体---------')
run()
6.运行结果
7.完整代码
# 调用AI检测平台(langSmith)
import os
import sys
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = 'xxxxxxxx'
os.environ["LANGCHAIN_PROJECT"] = "智谱AI"
#调用智谱AI API
os.environ["ZHIPUAI_API_KEY"] = "xxxxxxxxxxx"
#调用第三方库
from langchain_community.chat_models import ChatZhipuAI
from langchain_community.utilities import SQLDatabase
from langchain_community.agent_toolkits import SQLDatabaseToolkit
from langchain_core.messages import SystemMessage, HumanMessage
from langgraph.prebuilt import chat_agent_executor
#调用大语言模型
model = ChatZhipuAI(model_name='glm-4-flash')
HOSTNAME = '127.0.0.1'
PORT='3306'
DATABASE = 'langchain'
USERNAME = 'root'
PASSWORD = 'root'
#pymysql驱动URL 这里也可以选其他的
MYSQL_UEL = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(USERNAME,PASSWORD,HOSTNAME,PORT,DATABASE)
#langchain连接数据库
db = SQLDatabase.from_uri(MYSQL_UEL)
#创建工具
toolkit = SQLDatabaseToolkit(db=db,llm=model)
tools = toolkit.get_tools()
system_prompt="""
你是一个被设计用来与SQL数据库交互的代理。
给定一个输入问题,创建一个语法正确的SQL语句并且执行,然后查看查询结果并且返回答案。
除非用户指定了他们想要获得的实例的具体数量,否则始终将SQL查询限制伟最多10个结果。
你可以按相关列对结果进行排序,以返回MySQL数据库中最匹配的数据。
你可以使用与数据库交互的工具。在执行查询之前,你必须仔细检查。如果执行查询时出现错误,请重新查询并重试。
不要对数据库做任何的DML语句(插入,更新,删除等)。
首先,你应该查看数据库中的表,看看能查询什么。
不要跳过这个一步。
然后查询最相关表的模式。
"""
system_message = SystemMessage(content=system_prompt)
agent = chat_agent_executor.create_tool_calling_executor(model,tools,prompt=system_message)
def run():
question = input('请输入你的问题')
question = '"' + question + '"'
resp = agent.invoke({'messages':[HumanMessage(content=question)]})
result = resp['messages']
# print(result)
# print(len(result))
#最后一个才是真正的答案
print(result[len(result)-1].content)
num = int(input('请输入你的选择 1.提问 2.退出系统'))
if num == 1:
run()
else:
sys.exit()
if __name__ == "__main__":
print('--------欢迎来到数据库智能体---------')
run()