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

【智能体Agent】学生成绩查询 Tool + Agent

1. 环境准备(终端)
pip install langchain langchain-openai pymysql

2. 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. 编写带参数的成绩查询 Tool

tool.ipynb文件

import pymysql from langchain.tools import tool from pydantic import BaseModel,Field # 1.定义数据库连接 def get_db_connection(): return pymysql.connect( host='localhost', user='root', password='<密码>', database='<数据库名>', charset='utf8' ) # 2.定义参数结构和描述,给大模型查看 class ScoreQueryInput(BaseModel): name: str = Field(description="学生姓名,必填") subject: str = Field(default=None,description="考试科目") exam_batch: str = Field(default=None,description="考试批次") # 3. 定义Tool(核心!) @tool def query_student_score(name: str,subject: str=None,exam_batch: str=None): """ 根据学生姓名+科目/批次查询成绩,科目和考试批次至少提供一个。 name:学生姓名 subject:考试科目(可选) exam_batch:考试批次(可选) """ # 条件至少满足其一 if not subject and not exam_batch: return "请至少提供科目或考试批次" conn=get_db_connection() cursor=conn.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.id=sc.student_id WHERE s.name=%s """ params=[name] #SQL语句中所需的参数列表 #逻辑 if subject: sql+="AND sc.subject=%s" params.append(subject) if exam_batch: sql+="AND sc.exam_batch=%s" params.append(exam_batch) cursor.execute(sql,params) results=cursor.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( model="gpt-3.5-turbo", api_key="sk-evcXSBiYi5CTf1PspCHTi4Vo2QwDy18uF0d5wH503otiQ4hP", base_url="https://yinli.one/v1", ) # 2.Agent tools = [query_student_score] # 提示词(固定写法) prompt = ChatPromptTemplate.from_messages([ ("user", "{input}"), MessagesPlaceholder(variable_name="agent_scratchpad"), ]) # 创建新版 agent agent = create_openai_tools_agent(llm, tools, prompt) agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True) # 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分。

http://www.jsqmd.com/news/674421/

相关文章:

  • GraalVM Native Image内存优化终极清单(含JFR+Native Memory Tracking双栈诊断流程):覆盖Spring Boot 3.x + Jakarta EE 9+全生态
  • 如何在 CSS 中实现元素的绝对定位,使其不受窗口尺寸变化影响
  • 别再手动录入药品说明书了!用PaddleHub的OCR模型5分钟搞定信息提取
  • 别再被“一键生成”忽悠了!好写作AI教你重新定义什么叫“好用的AI写作软件”
  • GoalFlow:端到端自动驾驶中的多模态轨迹生成
  • 2026年知名的彩钢厂房源头工厂推荐 - 品牌宣传支持者
  • TFT 彩屏 GUI 开发
  • 3步搞定Spotify广告拦截:BlockTheSpot完全配置指南
  • 写论文还在“单打独斗”?好写作AI的“学术副驾”模式,让你的研究灵魂不再被机器吞噬
  • 2026年评价高的钢结构雨棚厂家对比推荐 - 品牌宣传支持者
  • 【Java Loom响应式转型终极指南】:2026企业级落地的5大避坑法则与性能实测数据(JVM 21.0.4+ Project Loom GA深度验证)
  • 手把手教你用STM32和OpenMV实现两板通信(附完整代码解析)
  • 全球半导体行业展会哪家好?优选全球半导体行业展会推动产业互联 - 品牌2026
  • EMQX数据转发踩坑实录:为什么我的Webhook收不到数据?规则引擎SQL与Servlet参数解析全攻略
  • Spring Boot 4.0 Agent-Ready架构深度横评:JVM字节码增强、OpenTelemetry原生支持、eBPF热插拔能力——这5项关键指标决定你明年架构选型!
  • 卷积改进与轻量化:自适应任意采样:AKConv(可改变核卷积)在 YOLOv11 中的实战,应对极度形变目标
  • 实测9款AI论文写作工具:好写作AI凭什么脱颖而出?
  • Gemini 科研示意图 / 流程图生成,一键出图
  • 「码动四季·开源同行」python语言:字符编码
  • STM32L431睡眠模式实测:从15mA降到9mA,我的代码踩坑与优化全记录
  • Yocto项目实战:用BitBake 1.49.0构建你的第一个‘软件包’(附完整配置文件解析)
  • mfc140.dll文件丢失损坏怎么办? 免费下载方法分享
  • FanControl传感器计数异常深度解析:从硬件检测到软件修复的完整技术方案
  • 算法训练营Day 8|88.合并两个有序数组
  • SRS 4.0服务器改造实录:如何用两行代码让它支持H265的RTMP推流与分发
  • 保姆级教程:在Debian 10上手动搭建T-POT 20.06蜜罐平台(含Docker加速与常见问题修复)
  • 价值20万的机器人做大奖!创想三维携手智元,加速3D打印破圈
  • 2026年AI编程革命:一键生成Python与Java代码
  • 告别人工调参!用PyTorch+PPO+GNN搞定车间调度,一个模型通吃不同规模任务
  • C#怎么使用Timer定时器_C#如何执行周期性任务【干货】