构建一个能说会做的智能体
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/Class78-Grade2024-CS |
|---|---|
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/Class78-Grade2024-CS/homework/16761 |
| 这个作业的目标 | 使用现代 AI 工具构建一个具备"语言交互(会说)"和"行动执行(会做)"能力的智能体,掌握智能体的基本原理与构建方法,为后续大项目打下基础 |
| 学号 | 林鸿永3124004431,唐嘉璇3124004437 |
基于 MCP 与 DeepSeek 的多模态全能智能助手(Agent)
1. 需求描述
本项目旨在开发一款强大且高度可扩展的命令行 AI 智能助手。传统的 AI 只能进行纯文本对话,而本项目为了解决用户在日常办公、出行规划、创意生成等场景下的痛点,提出了以下核心需求:
- 多模态输入支持:支持文本、语音实时对话(STT)、图片输入(Vision)以及音频文件转录。
- 多工具生态整合:基于 MCP(Model Context Protocol),整合外部工具,实现查火车票(12306)、网页抓取(Fetch)、本地文件读写(Filesystem)以及 AI 生成图片(即梦 Jimeng4.0)。
- 自动化与文件管理:工具生成的图片能够被自动提取并下载到本地
output目录。 - 连续记忆能力:能够记住上下文历史,支持多轮复杂任务的拆解与执行。
- 极速且稳定:采用
deepseek-flash模型,降低延迟;同时具备完善的容错机制,单轮工具调用失败不会导致整个程序崩溃。
2. 业务流描述
本 Agent 的运行流程如下:
- 终端输入解析:程序启动后进入循环监听,用户输入内容后,系统首先进行路由判定:
- 若输入
/voice,调用media_tools.listen()启动麦克风录音并转文字。 - 若输入
/img 路径或直接拖拽图片,调用media_tools.image_message()将图片转为多模态消息格式。 - 若输入
/audio 路径,调用media_tools.transcribe_file()解析音频文件。 - 若是普通文本,直接透传。
- 若输入
- Agent 思考与工具调度:将处理好的多模态消息和
thread_id(用于挂载历史记忆)发送给由 LangGraph 构建的Agent。DeepSeek 模型根据上下文判断是否需要调用 MCP 工具。 - MCP 工具执行:通过
MultiServerMCPClient并行连接 4 个 MCP Server。模型发起tool_calls时,系统底层自动通过stdio调度对应的 MCP 服务(如npx启动的 12306、uvx启动的 fetch 等)。 - 结果回传与流式输出:
- 工具返回结果后,系统专门捕获
type="tool"的消息。 - 图片特殊处理:若检测到即梦工具返回的 JSON 中包含
image_urls,则自动触发download_images函数,将图片保存至本地output目录。 - 遇到工具报错(如参数不对),直接截取错误信息打印,让大模型根据错误信息自行纠正。
- 工具返回结果后,系统专门捕获
- 循环与记忆更新:模型生成最终自然语言回答,流式打印给用户,并利用
MemorySaver保存本轮完整对话记录,等待下一次提问。
3. 实现说明
本项目基于 Python 与 LangChain/LangGraph 生态开发:
- 核心模型:
deepseek-flash。 - MCP 架构:使用
langchain_mcp_adapters中的MultiServerMCPClient。整合了 4 个服务端:12306-mcp(Node.js,查票)mcp-server-fetch(Python/uvx,网页抓取)@modelcontextprotocol/server-filesystemjimeng4-mcp(Node.js,生成图片,配置了鉴权)
- 记忆管理:使用 LangGraph 的
MemorySaver检查点机制,固定thread_id实现多轮持久对话。 - 多媒体处理:依赖自定义模块
media_tools.py,完成语音转文字、图片转 Base64 等前端处理。
4. 使用示例(功能演示)
🤖 助手已就绪!(输入 'quit' 或 'exit' 退出)
看图: /img 图片路径, 或直接把图片拖进终端
说话: /voice, 回车开始录音, 说完再回车
录音文件: /audio 文件路径, 手机录音或微信语音都行
👤 你: 查找广州东站到东莞站的18.到19.的票
🤖 助手思考中... [调用工具] get-current-date 参数: {}
[调用工具] get-station-code-by-names 参数: {'stationNames': '广州东|东莞'}
[调用工具] get-tickets 参数: {'date': '2026-10-23', 'fromStation': 'GGQ', 'toStation': 'RTQ', 'earliestStartTime': 18, 'latestStartTime': 19}
🤖 助手: 已按「今天(2026-10-23)、18:00–19:00 出发、广州东 → 东莞站」查询,结果如下(只列出真正从广州东始发并到达东莞站的车次):
广深线城际(广州东 → 东莞)
| 车次 | 出发 | 到达 | 历时 | 余票(票价) |
|---|---|---|---|---|
| C6813 | 18:08 | 18:38 | 30分 | 二等座 有票 45.5元;一等座 剩5张 50.5元;无座 有票 45.5元 |
| C7091 | 18:15 | 18:46 | 31分 | 商务座 剩1张 119元;特等座 剩8张 74元;无座 有票 41元;二等座、一等座已售完 |
| C7167 | 18:25 | 18:55 | 30分 | 一等座 剩1张 45元;无座 有票 41元;二等座已售完 |
| C7171 | 18:45 | 19:11 | 26分 | 二等座 有票 41元;一等座 有票 45元;无座 有票 41元(余票最充裕) |
| G6561 | 18:50 | 19:19 | 29分 | 二等座 有票 45.5元;一等座 剩1张 50.5元 |
可选替代
- 去东莞南站:C6813(18:08→18:59,二等座74元)、C7167/7091 同车次也可到东莞南,D7597(18:33→19:21)、G6561(18:50→19:52)。
- 去虎门站(高铁,二等座约34.5元):需从广州南出发,例如 G933(18:32)、G1189(18:49)、G399(18:54),不经过广州东。
📌 建议:如果想稳妥买到二等座且不赶时间,可以选 C7171(18:45发);想早走的话,可以选 C6813(18:08发,二等座有票)。
另外说明一下:我把「18.到19.」理解为 18 点到 19 点出发的时段。如果你想查的是明天等其他日期,或者是指“18:00 出发、19:00 前到达”,可以告诉我,我再查一次。
👤 你: 生成一只白色的猫
🤖 助手思考中... [调用工具] jimeng-v40-generate 参数: {'prompt': '一只纯白色的长毛猫,坐在柔和的浅灰色背景前,毛发蓬松细腻,蓝色清澈的眼睛,自然柔光摄影,高清细节,特写肖像', 'width': 1024, 'height': 1024}
[图片已保存] E:\ai agent\output\jimeng_20261023_173715_1.png
🤖 助手: 图片已生成(使用即梦 4.0 模型):
画面是一只纯白色长毛猫,蓝色眼睛,坐在浅灰色背景前,柔光特写肖像。
如果需要调整,比如换成露爪玩耍、猫在阳光下趴卧的姿势,或者改成插画、水彩、国风等风格,告诉我即可重新生成。
👤 你: 查找广东工业大学教务处最近的一条新闻标题
🤖 助手思考中... [调用工具] fetch 参数: {'url': 'https://jwc.gdut.edu.cn/', 'max_length': 6000}
🤖 助手: 我抓取了广东工业大学教务处首页(jwc.gdut.edu.cn)。需要先说明:首页有两个板块,它们的“最近发布”时间并不一致。
一、教务处“教务动态”最新一条(新闻报道类)
《我校承办第二届“建设教育强国·高等教育改革发展论坛”工程教育创新分论坛》
- 发布日期:2026-05-24
- 之后依次是:《专任教师参赛率73%,获奖数24项!我校在省高校教师教学创新大赛中再创佳绩》(2026-05-16)、《紧盯关键环节 强化质量管控——学校召开学期中段本科教学工作会议》(2026-05-10)等。
二、“通知公告”板块最新一条(若按“最新发布”而非“新闻动态”,则应选这条)
《关于2026年春季学期结业换证领取证书的通知(三)》
- 发布日期:2026-09-10
- 该板块次新为《关于2026年春季学期结业换证名单公示(三)》(2026-09-04)、《2026年秋季学期本科结业生重修报名通知》(2026-09-02)。
📌 结论:如果你要的是新闻标题(动态类),就是第一条:《我校承办第二届“建设教育强国·高等教育改革发展论坛”工程教育创新分论坛》;如果要的是全站最新发布的一条公告,则是 2026-09-10 的《关于2026年春季学期结业换证领取证书的通知(三)》。
需要我把这条新闻的正文内容抓下来,或者查某类具体通知(如选课、考试安排)吗?
👤 你: /voice
🎙️ 开始说话,说完按 Enter 结束…
⏳ 加载模型 base(第一次会慢一点)…
📝 识别结果:继续
🤖 助手思考中... [调用工具] fetch 参数: {'url': 'https://jwc.gdut.edu.cn/', 'max_length': 4000, 'raw': True}
[调用工具] fetch 参数: {'max_length': 4000, 'raw': True, 'start_index': 9000, 'url': 'https://jwc.gdut.edu.cn/'}
[调用工具] fetch 参数: {'max_length': 6000, 'raw': True, 'start_index': 15000, 'url': 'https://jwc.gdut.edu.cn/'}
[调用工具] fetch 参数: {'max_length': 5000, 'url': 'https://jwc.gdut.edu.cn/info/1215/4565.htm'}
[调用工具] fetch 参数: {'max_length': 6000, 'raw': True, 'start_index': 12000, 'url': 'https://jwc.gdut.edu.cn/info/1215/4565.htm'}
[调用工具] fetch 参数: {'max_length': 5000, 'raw': True, 'start_index': 18000, 'url': 'https://jwc.gdut.edu.cn/info/1215/4565.htm'}
🤖 助手: 已抓取到这篇新闻的主要正文内容,整理如下:
广东工业大学教务处「教务动态」最新一条
标题: 我校承办第二届"建设教育强国·高等教育改革发展论坛"工程教育创新分论坛
发布时间: 2026-05-24(教务简讯〔2026〕12号)
链接: https://jwc.gdut.edu.cn/info/1215/4565.htm
正文要点
- 背景: 5月22日,第64届中国高等教育博览会在江西南昌开幕。作为展会系列活动,第二届"建设教育强国·高等教育改革发展论坛"工程教育创新分论坛于 5月23日 举办。
- 承办方: 由广东工业大学与中国高等教育学会工程教育专业委员会、浙江大学工程教育创新中心联合承办,华东交通大学协办。
- 参会情况: 学校党委副书记朱蔚蔚出席论坛并作主旨报告;教务处、各学院负责人及骨干教师代表参会学习、交流研讨。
- 主旨报告: 朱蔚蔚以《铸魂育人 立足湾区 产教融合——广东工业大学探索新工科拔尖创新人才培养新路径》为题,系统分享学校新工科建设实践与改革成效。她介绍,广工深耕本科教育 68 载,坚持"与广东崛起共成长,为广东发展作贡献"的办学理念:
- 以产教融合为核心,构建学生成长需求与社会用人需求"双向柔性对接"的人才培养体系;
- 以新工科建设和专业认证为抓手,通过动态优化专业布局、共建现代产业学院、开设校企协同特色班等举措,形成契合湾区产业需求、可复制可推广的新工科拔尖创新人才培养模式。
- 育人做法: 将"东深供水工程"蕴含的家国情怀与攻坚品格融入育人全过程,通过原创剧目、社会实践、课程思政等,构建"理论认知、情感共鸣、行动自觉"的闭环育人体系;同时打造"全链条"双创生态,建设协同创新平台与"工大创谷"载体。
- 未来规划: 以"115 攀登工程"为统领,持续深化产教融合与学科交叉,夯实工程教育内涵建设,打造制造业卓越工程师的摇篮,助力广东建设现代化产业体系与教育科技人才强省。
📌 补充提示:首页「通知公告」栏最新的一条实际上是 2026-09-10《关于2026年春季学期结业换证领取证书的通知(三)》,比这条动态更新。如果你要的是"最新公告",我可以把它的正文也抓给你。需要吗?
👤 你: exit
👋 再见!
5. GitHub 链接
仓库地址:【 https://github.com/pupaname/ai-agent 】
6. 小组分工
- 林鸿永(3124004431):负责 Agent 核心架构设计,LangChain/MCP 适配器接入,
memory及 Prompt 调试,负责外部 MCP Server 的调研与环境配置(12306、即梦环境配置、API Key 管理)。 - 唐嘉璇(3124004437):负责多模态模块开发,编写
media_tools.py,实现语音识别与图片 Base64 转换,负责测试与异常处理,编写download_images文件下载逻辑,及最终文档撰写。
7. 每个小组成员的心得
- 林鸿永(3124004431):通过这次项目,我深刻体会到了 MCP 协议作为“AI 万能插座”的威力。通过标准协议接入不同语言(Node.js/Python)写的工具,大大降低了 Agent 的开发门槛,配置各种 MCP Server 的过程中踩了很多坑(比如
npx的权限问题、Windows 下的路径反斜杠),但也因此锻炼了看官方文档和排查环境问题的能力。 - 唐嘉璇(3124004437):多模态输入在终端环境下的处理比想象中复杂,尤其是终端乱码和路径转义问题。这次实践让我对 Python 的 IO 处理和 Base64 编码有了更深的理解,流式输出(astream)的调试让我明白了大模型底层的执行逻辑,我们需要准确捕获
tool节点的状态,才能给用户呈现出最好的交互体验。

浙公网安备 33010602011771号