1. 环境准备终端pip install langchain langchain-openai pymysql2. MySQL建表与填入测试数据use tool_demo; -- 学生表 CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOT NULL, gender VARCHAR(4), student_id VARCHAR(20) UNIQUE NOT NULL ); -- 成绩表 CREATE TABLE score ( id INT PRIMARY KEY AUTO_INCREMENT, subject VARCHAR(20) NOT NULL, exam_batch VARCHAR(20) NOT NULL, score INT NOT NULL, student_id INT NOT NULL, FOREIGN KEY (student_id) REFERENCES student(id) ); -- 插入测试数据 INSERT INTO student(name, gender, student_id) VALUES (张三,男,2026001), (李四,女,2026002); INSERT INTO score(subject, exam_batch, score, student_id) VALUES (数学,2026-01,90,1), (语文,2026-01,85,1), (数学,2026-01,88,2), (英语,2026-01,92,2), (数学,2026-02,96,1), (语文,2026-02,87,1), (数学,2026-02,89,2), (英语,2026-02,96,2);3. 编写带参数的成绩查询 Tooltool.ipynb文件import pymysql from langchain.tools import tool from pydantic import BaseModel,Field # 1.定义数据库连接 def get_db_connection(): return pymysql.connect( hostlocalhost, userroot, password密码, database数据库名, charsetutf8 ) # 2.定义参数结构和描述给大模型查看 class ScoreQueryInput(BaseModel): name: str Field(description学生姓名必填) subject: str Field(defaultNone,description考试科目) exam_batch: str Field(defaultNone,description考试批次) # 3. 定义Tool(核心!) tool def query_student_score(name: str,subject: strNone,exam_batch: strNone): 根据学生姓名科目/批次查询成绩科目和考试批次至少提供一个。 name学生姓名 subject考试科目可选 exam_batch考试批次可选 # 条件至少满足其一 if not subject and not exam_batch: return 请至少提供科目或考试批次 connget_db_connection() cursorconn.cursor(pymysql.cursors.DictCursor) sql SELECT s.name,s.student_id,sc.subject,sc.exam_batch,sc.score FROM student s JOIN score sc ON s.idsc.student_id WHERE s.name%s params[name] #SQL语句中所需的参数列表 #逻辑 if subject: sqlAND sc.subject%s params.append(subject) if exam_batch: sqlAND sc.exam_batch%s params.append(exam_batch) cursor.execute(sql,params) resultscursor.fetchall() conn.close() #关闭连接 if not results: return f未找到【{name}】的成绩 return str(results)4.构建 Agent 自动调用from langchain_openai import ChatOpenAI from langchain.agents import create_openai_tools_agent, AgentExecutor #新版导入 from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder # 1. 初始化LLM llm ChatOpenAI( modelgpt-3.5-turbo, api_keysk-evcXSBiYi5CTf1PspCHTi4Vo2QwDy18uF0d5wH503otiQ4hP, base_urlhttps://yinli.one/v1, ) # 2.Agent tools [query_student_score] # 提示词固定写法 prompt ChatPromptTemplate.from_messages([ (user, {input}), MessagesPlaceholder(variable_nameagent_scratchpad), ]) # 创建新版 agent agent create_openai_tools_agent(llm, tools, prompt) agent_executor AgentExecutor(agentagent, toolstools, verboseTrue) # 3. 测试 result1 agent_executor.invoke({input: 张三 2026-01 的成绩}) print(result1[output]) result2 agent_executor.invoke({input: 李四的英语成绩}) print(result2[output]) result3 agent_executor.invoke({input: 张三 2026-02 的数学成绩}) print(result3[output])5.连接数据库并测试连接6.测试运行得到类似结果则表明我们已经成功 Entering new AgentExecutor chain...Invoking: query_student_score with {name: 张三, exam_batch: 2026-01}[{name: 张三, student_id: 2026001, subject: 数学, exam_batch: 2026-01, score: 90}, {name: 张三, student_id: 2026001, subject: 语文, exam_batch: 2026-01, score: 85}]张三在2026年1月的成绩如下- 数学90分- 语文85分 Finished chain.张三在2026年1月的成绩如下- 数学90分- 语文85分 Entering new AgentExecutor chain...Invoking: query_student_score with {name: 李四, subject: 英语}[{name: 李四, student_id: 2026002, subject: 英语, exam_batch: 2026-01, score: 92}, {name: 李四, student_id: 2026002, subject: 英语, exam_batch: 2026-02, score: 96}]李四的英语成绩如下- 2026年1月考试92分- 2026年2月考试96分 Finished chain.李四的英语成绩如下- 2026年1月考试92分- 2026年2月考试96分 Entering new AgentExecutor chain...Invoking: query_student_score with {name: 张三, subject: 数学, exam_batch: 2026-02}[{name: 张三, student_id: 2026001, subject: 数学, exam_batch: 2026-02, score: 96}]张三在2026年2月的数学成绩是96分。 Finished chain.张三在2026年2月的数学成绩是96分。