构建一个能说会做的智能体

这个作业属于哪个课程 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 的运行流程如下:

  1. 终端输入解析:程序启动后进入循环监听,用户输入内容后,系统首先进行路由判定:
    • 若输入 /voice,调用 media_tools.listen() 启动麦克风录音并转文字。
    • 若输入 /img 路径 或直接拖拽图片,调用 media_tools.image_message() 将图片转为多模态消息格式。
    • 若输入 /audio 路径,调用 media_tools.transcribe_file() 解析音频文件。
    • 若是普通文本,直接透传。
  2. Agent 思考与工具调度:将处理好的多模态消息和 thread_id(用于挂载历史记忆)发送给由 LangGraph 构建的 Agent。DeepSeek 模型根据上下文判断是否需要调用 MCP 工具。
  3. MCP 工具执行:通过 MultiServerMCPClient 并行连接 4 个 MCP Server。模型发起 tool_calls 时,系统底层自动通过 stdio 调度对应的 MCP 服务(如 npx 启动的 12306、uvx 启动的 fetch 等)。
  4. 结果回传与流式输出:
    • 工具返回结果后,系统专门捕获 type="tool" 的消息。
    • 图片特殊处理:若检测到即梦工具返回的 JSON 中包含 image_urls,则自动触发 download_images 函数,将图片保存至本地 output 目录。
    • 遇到工具报错(如参数不对),直接截取错误信息打印,让大模型根据错误信息自行纠正。
  5. 循环与记忆更新:模型生成最终自然语言回答,流式打印给用户,并利用 MemorySaver 保存本轮完整对话记录,等待下一次提问。

3. 实现说明

本项目基于 Python 与 LangChain/LangGraph 生态开发:

  • 核心模型:deepseek-flash。
  • MCP 架构:使用 langchain_mcp_adapters 中的 MultiServerMCPClient。整合了 4 个服务端:
    • 12306-mcp (Node.js,查票)
    • mcp-server-fetch (Python/uvx,网页抓取)
    • @modelcontextprotocol/server-filesystem
    • jimeng4-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 节点的状态,才能给用户呈现出最好的交互体验。
posted @ 2026-10-23 18:00  pupaname  阅读(15)  评论(0)    收藏  举报