本處使用Agent+數據庫,可以直接執行SQL語句。可以多次循環查詢問題
前文通過chain去聯系數據庫并進行操作; 通過鏈的不斷內嵌組合,生成SQL在執行SQL再返回。
?初始化
import os
from operator import itemgetterimport bs4
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain.chains.history_aware_retriever import create_history_aware_retriever
from langchain.chains.retrieval import create_retrieval_chain
from langchain.chains.sql_database.query import create_sql_query_chain
from langchain_chroma import Chroma
from langchain_community.agent_toolkits import SQLDatabaseToolkit
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.tools import QuerySQLDataBaseTool
from langchain_community.utilities import SQLDatabase
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder, PromptTemplate
from langchain_core.runnables import RunnableWithMessageHistory, RunnablePassthrough
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langgraph.prebuilt import chat_agent_executoros.environ['http_proxy'] = '127.0.0.1:7890'
os.environ['https_proxy'] = '127.0.0.1:7890'os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_PROJECT"] = "LangchainDemo"
os.environ["LANGCHAIN_API_KEY"] = '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'
# os.environ["TAVILY_API_KEY"] = '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'# 聊天機器人案例
# 創建模型
model = ChatOpenAI(model='gpt-4-turbo')# sqlalchemy 初始化MySQL數據庫的連接
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'test_db8'
USERNAME = 'root'
PASSWORD = '123123'
# mysqlclient驅動URL
MYSQL_URI = 'mysql+mysqldb://{}:{}@{}:{}/{}?charset=utf8mb4'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)db = SQLDatabase.from_uri(MYSQL_URI)
創建工具和Agent
Agent的核心——langchain_community下的Tool;
在Agent中,不需要同chain一樣在PromptTemplate中定義過多參數,Agent會自動生成并執行SQL語句。
# 創建工具 toolkit = SQLDatabaseToolkit(db=db, llm=model) tools = toolkit.get_tools()# 使用agent完整整個數據庫的整合 system_prompt = """ 您是一個被設計用來與SQL數據庫交互的代理。 給定一個輸入問題,創建一個語法正確的SQL語句并執行,然后查看查詢結果并返回答案。 除非用戶指定了他們想要獲得的示例的具體數量,否則始終將SQL查詢限制為最多10個結果。 你可以按相關列對結果進行排序,以返回MySQL數據庫中最匹配的數據。 您可以使用與數據庫交互的工具。在執行查詢之前,你必須仔細檢查。如果在執行查詢時出現錯誤,請重寫查詢SQL并重試。 不要對數據庫做任何DML語句(插入,更新,刪除,刪除等)。首先,你應該查看數據庫中的表,看看可以查詢什么。 不要跳過這一步。 然后查詢最相關的表的模式。 """ system_message = SystemMessage(content=system_prompt)# 創建代理 agent_executor = chat_agent_executor.create_tool_calling_executor(model, tools, system_message)# resp = agent_executor.invoke({'messages': [HumanMessage(content='請問:員工表中有多少條數據?')]}) # resp = agent_executor.invoke({'messages': [HumanMessage(content='那種性別的員工人數最多?')]}) resp = agent_executor.invoke({'messages': [HumanMessage(content='哪個部門下面的員工人數最多?')]})result = resp['messages'] print(result) print(len(result)) # 最后一個才是真正的答案 print(result[len(result)-1])
HumanMessage、AIMessage、ToolMessage、additional_kwargs、