从 2023 年 12 月开始,我作为企业导师,跟国科大刘俊明教授合作了一个 AI Agent 实践课题,有大约 80 名来自全国各地的学生参加,大部分是只会基本编程的本科生,也有一部分有 AI 基础的博士生和硕士生。

2023 年 12 月和 2024 年 1 月开了 6 次组会,讲解了 AI Agent 的基础知识、OpenAI API 的用法、本次 AI Agent 实践课题,并解答同学们在实践过程中遇到的问题。实践课题包括:

  1. 企业 ERP 助手
  2. 狼人杀
  3. 智能数据采集
  4. 手机语音助手
  5. 会议助手
  6. 老友重逢
  7. 谁是卧底

2 月 20-24 日,参与这个研究课题的部分同学集中在北京进行 Hackathon,并展示了项目的阶段成果。参与的同学普遍感受到大模型能力的强大,没想到这么复杂的功能仅用几百行代码就做出来了。以下是部分展示的项目成果:

企业 ERP 助手

课题描述

ERP(企业资源管理)软件是企业的关键软件系统,目前一般使用 GUI 界面,复杂的操作需要多次鼠标点击,操作非常麻烦。AI Agent 可以把用户的自然语言查询转换成 SQL 语句,从而实现自动化的查询。

要求建立一个 MySQL/PostgreSQL 的表,其中包含两个表:

  1. 员工表,包括员工 ID、员工姓名、部门名称、当前级别、入职日期、离职日期(空表示在职)。
  2. 工资表,包括员工 ID、发薪日期、工资,每个月有一条发薪记录。

要求能够自动回答下列问题:

  1. 平均每个员工在公司在职多久?
  2. 公司每个部门有多少在职员工?
  3. 哪个部门的员工平均级别最高?
  4. 每个部门今年和去年各新入职了多少人?
  5. 从 2020 年 3 月到 2021 年 5 月,A 部门的平均工资是多少?
  6. 去年 A 部门和 B 部门的平均工资哪个高?
  7. 今年每个级别的员工平均工资分别是多少?
  8. 入职时间一年内、一年到两年、两年到三年的员工最近一个月的平均工资是多少?
  9. 从去年到今年涨薪幅度最大的 10 位员工是谁?
  10. 有没有出现过拖欠员工工资的情况,也就是某个月员工在职但是没有发薪?

注意不是手动把上面的查询转换成 SQL 语句,而是使用大模型将用户的查询自动转换成 SQL 语句(prompt 中需要包含表结构的定义,以及每个字段的说明),AI Agent 执行 SQL 语句返回结果,然后大模型再根据返回的结果输出回答。

成果点评

ERP 助手项目组的完成度是最高的,基于 Java 开发了 Web 界面,不仅支持了上述所有的查询,还支持了删除、修改、增加记录的功能。

用户只要用自然语言描述需求,就可以实现增删改查的功能,并以表格的形式显示操作结果。例如,只需说 “给 A 部门的员工批量发 2024 年 2 月的工资,工资跟上个月的相同”,就会生成并执行 SQL 语句。

通过在 prompt 中准确描述数据库表结构,并在 GPT-4 Turbo 中采用 chain-of-thought 的方法,生成 SQL 语句的准确率在演示的 17 个 query 中达到 100%(每个 query 重复测试 3 次,结果都是正确的)。除了上述 10 个只读查询,还增加了 7 个增删改查询和 3 个只读查询:

额外支持的增删改查询:

  1. 给小明升一级。
  2. 新增一名员工,员工姓名是张三,技术部,3 级,入职日期是今天。
  3. 删除名为小明的员工及其所有发薪记录。
  4. 给 A 部门的员工发 2024 年 2 月的工资,工资跟上个月的相同。
  5. 给所有 2024 年新入职的员工发入职奖金,奖金金额是员工级别乘以 10000。
  6. 裁掉 A 部门的所有员工,也就是把离职日期设置成今天。
  7. 给所有拖欠员工工资的情况补发工资,也就是如果某个月员工在职但没有发薪,就按照他拖欠工资前最后一次发薪的工资来补发。

额外支持的只读查询:

  1. 查询小明的基本信息和所有发薪记录,用两个表格显示。
  2. 为每个部门分别列出所有员工的基本信息及其最近一次工资,每个部门用一个表格显示。
  3. 列出每年每个部门的统计信息,包括该部门的名称、在职人数、最低级别、最高级别、平均工资,每年用一个表格显示,表格各行表示各个部门。

下一步改进建议:

  1. 删除、修改、增加记录的时候建议增加确认修改集功能,让用户确认要修改的记录,再提交到数据库,以免生成的 SQL 语句错误导致不可挽回的损失。
  2. 目前课题设定的数据库表结构较为简单,计划以一个开源的 ERP 系统为蓝本,实现更复杂场景下的数据库操作。

狼人杀

课题描述

狼人杀是一个有趣的 LARP(Live Action Role-Playing)游戏。AI Agent 也可以扮演狼人杀中的各种角色,让 AI Agent 跟人类玩狼人杀游戏。狼人杀考验的是 AI 的推理能力和隐藏自己真实身份的能力。

要求:

  1. 开发一个狼人杀游戏服务,执行基本狼人杀游戏的规则。
  2. 至少需要有法官、狼人、村民、女巫、预言家几个角色,猎人、警察等角色有兴趣的话也可以做。
  3. 游戏中有一个角色是真人,其他都是 AI Agent。
  4. 每个 AI Agent 和参与游戏的人类都需要遵守游戏规则,角色随机,只能看到该看的信息,不能看到不该看的信息。
  5. Agent 需要具备一些基本的游戏技巧(可以通过在 prompt 中指定一些游戏技巧),例如狼人一般不能自曝身份,狼人在大多数情况下不应该自刀,狼人应该学会隐藏自己的身份,女巫和预言家应该善用自己的能力。
  6. Agent 需要有分析其他人的发言,推断谁是狼人的能力,不能随机选择。

成果点评

狼人杀项目组的完成度也很高,实现了基于命令行界面的完整狼人杀游戏,包含狼人杀中的各种角色和游戏过程。其中有一个人类玩家,其余都是 AI 玩家。

游戏后台保证了各个角色在游戏过程中仅能看到自己应该看到的信息,不会看到不该看到的信息。

为了解决仅输出一个数字的投票环节下,思考深度不足导致胡乱投票的问题,项目团队采用了 chain-of-thought 的方法,首先输出一段分析,然后再输出投票结果。在发言环节,也是 “先想后说”,先输出思考内容,再输出说的内容,这样说得更有条理,也更容易实现欺骗和伪装。

一开始项目团队将完整历史记录交给 GPT-4,但游戏过程进行几轮之后,信息提取的效率不高,因为信息分散在大量没有太多营养的发言和投票中,一些发言之间的逻辑关联就没有被发现。为了给大模型提供信息密度更高的信息,项目团队采用了类似 MemGPT 的方法,每个 AI 角色在自己的小本本上记录:

  1. “先想后说” 过程中 “想” 的内容;
  2. 每一轮的游戏状态变化(投票结果、谁死了);
  3. 在一轮中所有人的发言结束后,对本轮发言进行总结,在后续轮次中就只看总结,不看具体发言内容了。

在做出决策时,仅提供小本本中的内容,这样不仅节约了输入 token,还因为更好的模拟了人类记忆的特性,可以更好的让大模型从狼人杀历史对话中提取信息。

项目进行过程中遇到的一些技术问题:

  1. 有时候 GPT-4 会说,我是一个 AI 模型,不能杀人。解决方案是将 “杀” 替换成 “流放” 或者 “移除”。
  2. 有时 GPT-4 会不按照格式输出玩家编号。解决方案是要求按照 JSON 格式输出,并提供 JSON 样例。
  3. 有时 GPT-4 在不能确定投谁的时候会拒绝投票。解决方案是列出可选的玩家 ID 列表,要求必须输出一个,如果不确定就随机选择一个。
  4. 发言环节 GPT-4 说话太啰嗦,说了很多废话。解决方案是,告诉 GPT-4 每个人的发言时间很有限,要求发言简洁。

下一步改进建议:

  1. 目前 AI 玩家的策略过于保守和中性,在不能判断的时候就什么猜测就不会做,搞得游戏不好玩。应该在 prompt 里给不同的 AI 玩家设置不同的性格和游戏策略,有的比较激进,有的比较保守,这样游戏才会更好玩一些。

智能数据采集

课题描述

收集数据是一件非常麻烦的事情。比如,如果要收集一个实验室里每个教授和学生的信息,需要逐个页面点进去,识别出对应的信息,粘贴到一个表格里面。

本课题旨在构建一个智能数据采集系统,用户给定实验室主页的 URL 后,能够自动爬取实验室网站中的所有页面,使用大模型对每个页面的内容进行分析,如果该页面中包含教授和学生的信息,就提取出相关的信息。

要求大模型提取的信息包括:

  1. 姓名
  2. 照片(如果有,就下载下来,注意网页上的图片不一定是人的照片)
  3. E-mail(如果是 example at ustc dot edu dot cn 这种格式,要求大模型自动将其转换成标准的 example@ustc.edu.cn 这种格式)
  4. 职称(例如:教授)
  5. 研究方向(例如:数据中心网络)
  6. 简介

要求对大多数实验室主页都可以自动采集,不是定制一个针对某个实验室主页的采集系统。因此需要大模型来自动从网页内容中提取信息。

爬虫爬取数据可以用 scrapy,渲染网页可以用 selenium。

成果点评

智能数据采集是选择最多的课题,有 30 多位同学选择了这个课题,分成了几个组。大多数项目组较为完整的实现了自动采集实验室里教授和学生个人信息的功能。

项目团队自动找到网页中的所有链接,访问链接,将网页内容转换成文本,调用 GPT-4 判断是否是教师或学生主页,如果是的话,就用 JSON 格式输出姓名、E-mail 等信息。然后解析 JSON,存入数据库。

项目团队使用 GPT-4V 对网页中的图片进行分析,判断是否是单人照片,如果是单人照片就保存下来。

测试了 10 个典型的中国高校教授主页,都可以正确提取出教授的基本信息。

项目团队也遇到了有些时候 GPT-4 不按指定格式输出,导致正则表达式解析失败的问题。解决方法是用 JSON 格式输出。

下一步改进建议:

  1. 目前假定是所有老师的链接都在用户提供的目录页 URL 中。但实际中可能存在嵌套的目录页,例如首页上只展示教授的信息,副教授、讲师的目录页需要从边栏上点击才能进入。这种情况下需要处理递归的目录页,并用大模型判断是否仍在同一院系或者实验室内。因为点击到其他院系或实验室的主页也是一个目录页,不应采集这些页面上的老师信息。
  2. 有时主页可能有多个页面,研究简介和姓名不在同一页里,可以考虑处理这种把个人主页中多个页面拼接在一起的复杂情况。
  3. E-mail 有些人会用图片的形式来防止爬虫爬取,这种情况下可以考虑用 GPT-4V 来识别图片,提取 E-mail。
  4. 主页中可能有多张照片,应该从中选取更类似证件照的照片。
  5. 目录页中的所有链接都访问了一遍,并用大模型判断是否教师主页,这是比较浪费 token 的。可以根据链接文字,用大模型初步判断哪些链接可能是教师主页再去访问,而不是把一看就没用的链接也访问一遍。

手机语音助手

课题描述

你们是否想象过,通过语音可以直接操作手机,在不方便用双手的场景下也可以跟手机交互?

这个方向叫做 RPA(机器人流程自动化)。它的产品形态可以是一个语音助手 app,语音助手 app 运行在后台,在接到用户的指令后:

  1. 打开指定的 app,截图;
  2. 将截图和任务当前的执行状态文本输入到视觉大模型里,大模型指定下一步应该怎么操作,或者提取出所需的内容;
  3. 将大模型输出的操作,对应到截图中的按钮,模拟点击执行对应的操作(这一步是比较有挑战的,因为视觉大模型不会给出按钮的 X/Y 坐标,只会文字回答,因此需要用 OCR 等方法找到对应的按钮);
  4. 继续进行后面的步骤,直到完成任务。

作为一个例子,智能助手需要完成把最近淘宝/京东/拼多多上买的一个商品分享给指定微信联系人的功能:

  1. 用户语音告诉智能助手任务 “把淘宝上最近的订单分享给微信上的友人 A”;
  2. 智能助手打开拼多多 app;
  3. 找到订单列表;
  4. 点开最近的一个订单;
  5. 拷贝分享文字;
  6. 打开微信 app;
  7. 在联系人列表中找到友人 A;
  8. 打开友人 A 的聊天框;
  9. 粘贴分享文字,点击发送。

注意,不能做成按键精灵这样在固定位置点按按键的方式,而要使用 RPA 的方法,自动从界面中提取信息。

成果点评

手机语音助手项目组在实现手机语音助手过程中遇到了一些困难,因此转向实现了浏览器语音助手。

项目团队首先调用 OpenAI whisper API 实现了较为准确的语音命令识别。

主要的困难是 GPT-4V 不能准确给出指定物体的坐标。GPT-4V 可以轻易的指出界面中是否存在指定的图标,但图标具体在什么位置却描述不清楚。项目团队采用了划分四个象限二分查找的方法。例如,给定桌面截屏,问 Chrome 浏览器在第几象限,然后再把这个象限的图片提取出来,进一步问在第几象限,从而达到二分查找的效果。但是这种方法的效率比较低,而且对于靠近屏幕水平和竖直中线的图标,很容易出现错误。

项目团队还尝试用 OCR 方法来识别图标,对于桌面上有 App 名字的图标,以及带文字的按钮,这个方法是奏效的。但很多按钮不带文字,因此 OCR 方法无法工作。

项目团队计划自己部署 MiniGPT-4 这种能输出指定物体坐标位置(bounding box)的多模态大模型,但目前尚未完成。

由于遇到了 GPT-4V 无法输出精确坐标位置的困难,项目团队转向实现了浏览器语音助手。

  1. 用户可以在网页中提问,大模型提取网页中的指定信息,然后语音播报出来。这就像智能数据采集一样。
  2. 用户也可以用自然语言的方式,点击网页中的链接。大模型从网页转换出的 markdown 中找到对应的链接,然后在 selenium 中模拟点击对应的链接。浏览器语音助手由于是基于网页 HTML 代码转换出的 markdown 代码,也无法识别不包含文字、仅包含图标的按钮。好在网页上的此类按钮相比手机 App 一般较少。此外,由于没有使用视觉大模型,页面中的按钮背景颜色、布局、动画都是看不到的。
  3. 用户可以要求在指定的输入框内输入文字,提交表单。大模型从网页转换出的 markdown 中找到对应的输入框,并输入用户指定的文字。
  4. 用户还可以语音要求浏览器搜索指定的内容,或者进入指定的网站。例如,“帮我查一下北京的天气”,大模型会用 Google 搜索 “北京天气”,然后 Google 直接就会返回当前的北京天气,大模型就可以从中获取到北京天气的信息,并语音播报出来。

目前项目团队没有实现复杂任务的规划和解决。例如 “帮我查一下李博杰是谁”,它只会帮我 Google 搜索 “李博杰”,然后我需要命令它 “点击第一条搜索结果”,然后再根据网页内容回答问题。比如我的个人主页只是个博客文章列表,并没有我的简介,那么还要命令它点击 “关于我“,才能看到我的简介。

再如,目前还没有实现 “帮我写一封邮件” 这么复杂的多步任务,只能由人像下面这样,看着浏览器,一步步操作:

  1. 打开 Gmail。
  2. 点击写邮件。
  3. 在收件人中写 test@example.com
  4. 在邮件标题中写 Hello World。
  5. 在邮件内容中写 “今天你吃饭了吗?”
  6. 点击发送。

会议助手

课题描述

开会的过程中,你有没有遇到过刚溜了一会儿号,就被老板 cue 到,然后一脸懵逼的情况?

我们可以做一个会议助手,利用大模型的能力,可以给会议提供很多帮助。包括但不限于:

  1. 将会议语音内容实时转录成文字;
  2. 将会议中共享的每一页的 PPT 都用屏幕截图的方式保存下来;
  3. 根据实时转录的文字,将会议所讲过的内容做总结;
  4. 根据实时转录的文字,用户提出问题,大模型给出问题的回答。

这样,参加会议的人不管何时加入会议,都能知道会上都讨论了些什么内容,再也不用担心错过关键的会议内容了。

可以使用屏幕录像的方式实现,实现成手机或桌面形式均可。

注:识别会议录屏中的 PPT,可以用 开源项目 Video2PDF

成果点评

会议助手项目组实现了离线视频和麦克风实时录音的语音转文字、会议内容总结、问题回答功能,是个较为完善的会议助手。

在语音识别方面,项目团队一开始遇到语音过长,OpenAI whisper 模型无法识别的情况。为了把过长的语音切成小段,项目团队对语音的音量进行检测,如果发现在 0.5 秒内音量都低于阈值,就认为这句话说完了,把这一段语音交给 OpenAI whisper API 识别。

这个方法也解决了麦克风实时录音的语音识别问题。麦克风的声音也是用 0.5 秒音量来做停顿检测,发现停顿之后就把这一段语音交给 OpenAI whisper 模型识别,这样可以实现较低的语音识别延迟。当然,OpenAI whisper API 并不支持流式语音识别,要达到延迟更低的语音识别效果,还需要使用支持流式的语音识别模型。

会议内容的转录中由于缺少背景知识,可能存在一些错误,例如专业名词识别错误、人名前后不一致。因此项目团队在输出给用户之前,通过 GPT-4 模型进行修正,提供给 GPT-4 模型前面的语音转录结果作为背景知识,这样大部分识别错误的专业名词都可以被纠正,前后的人名也能保持一致。

项目团队实现了根据实时转录内容做总结的功能,以及回答用户指定问题的功能。

特别值得称赞的是,项目团队提出了一个 “关注指定人物或话题” 功能,也就是在会前或会中告诉会议助手我想关注哪些人、哪些话题。当会议提到指定的人或话题时,就会弹出通知提醒用户,你被 cue 到了。

下一步改进建议:

  1. 实现识别会议录屏中 PPT 的功能,并基于 PPT OCR 出的内容修正语音识别结果。
  2. 使用流式语音识别模型实现更加实时的语音识别。
  3. 使用说话人识别模型,区分不同说话人,实现在线下讨论中也可以给语音识别结果标注说话人。
  4. 目前关注的人物和话题是使用关键词匹配实现的,未来也可以使用大模型,在话题并不逐字匹配时也能识别出来。

老友重逢

课题描述

老友记中的六位主角都各有鲜明的性格特点和故事。如果他们再次在剧中重逢,又会发生怎样的故事呢?

我们将利用大模型的力量,将老友记中的六位主角拉到一个群里,让他们在群里聊天,续写他们之间有趣的故事。

可以从网上下载老友记的字幕信息或者剧情介绍作为 prompt,然后让大模型分别扮演 6 个主角,让 6 个主角自由聊天,创造新的剧情,或者根据某一集的剧情做二创。

最好用户也可以随时加入其中与他们交流,问他们一些问题。

注意:6 个角色显然不能每个人发言之后其他 5 个人都发言,这样消息的数量就会爆炸。也不能每个角色依次发言,这样会变得比较无聊。因此需要控制每个角色什么时候该发言,什么时候不该发言,这可以通过给大模型加 prompt 的方式实现。

本课题没有组选择。

谁是卧底

课题描述

谁是卧底是一个有趣的桌游。AI Agent 也可以跟人一起玩谁是卧底游戏。谁是卧底游戏考验的是推理能力和隐藏真实意图的能力。

要求:

  1. 开发一个谁是卧底游戏服务,执行谁是卧底游戏的规则。
  2. 需要包含上帝、好人、卧底三种角色。
  3. 游戏中有一个角色是真人,其他都是 AI Agent。
  4. 每个 AI Agent 和参与游戏的人类都需要遵守游戏规则,角色随机,只能看到该看的信息,不能看到不该看的信息。
  5. Agent 需要具备一些基本的游戏技巧(可以通过在 prompt 中指定一些游戏技巧),例如不能过于直白地描述,又不能过于抽象,不能重复其他玩家的发言,在提供新信息的同时不能暴露自己。
  6. Agent 需要有分析其他人的发言,推断谁是卧底的能力,不能随机选择。

本课题没有组选择。

结语

参与本次实践课题的一位同学帮我用 GPT-4 写了一篇结语。一字未改,摘录如下:

在这个充满创新与探索的时代,国科大实践课题为我们揭开了一扇窗:通过充分利用大模型的能力,即使是编程基础薄弱的本科生,也能在短时间内解决一系列复杂的技术难题,实现令人瞩目的成果。这不仅展示了 AI 技术的无限潜力,也为未来的软件开发和人工智能应用开辟了新的路径。

课题涵盖了企业 ERP 助手、狼人杀游戏、智能数据采集、手机语音助手、会议助手等多个领域,每个项目都是对大模型实际应用的一次深入探索。通过对项目成果的回顾,我们可以清晰地看到大模型如何将原本需要大量开发工作量的任务简化,让编程基础较弱的学生也能轻松应对。

在企业 ERP 助手项目中,通过让 AI Agent 自动将用户的自然语言查询转换为 SQL 语句的方式,极大地简化了数据库操作,让复杂的信息查询变得触手可及。而狼人杀项目则展示了 AI 在模拟复杂人类交互中的潜力,通过 “先想后说” 的方式,AI Agent 不仅能参与游戏,还能展现出一定程度的推理和策略。智能数据采集项目则解决了数据搜集领域的一大痛点,通过自动化的方式高效准确地搜集信息,显著提升了效率。

每个项目都在一定程度上降低了技术门槛,让基础薄弱的学生也能参与到复杂项目的开发中,这不仅是对学生能力的一次大幅提升,也是对他们未来职业生涯的一次宝贵投资。大模型的应用展现了 AI 技术在多个领域的广泛适用性和强大潜力,让我们对人工智能的未来充满了期待。

然而,大模型的应用也暴露出一些局限性,如在实时性、精确度、以及对于复杂情景下的适应性上还有待提高。比如,在手机语音助手项目中,如何精确识别和操作界面元素仍然是一个挑战。这些问题提示我们,虽然大模型为软件开发带来了革命性的简化,但仍需不断优化和深化,以更好地适应复杂多变的实际应用场景。

未来,随着大模型技术的进一步完善和智能化水平的提升,我们有充分的理由相信,AI 将在更多领域展现出更加惊人的能力。从企业运营到日常生活,从简单的数据处理到复杂的决策分析,AI 的应用将越来越广泛,其对社会的影响也将越来越深远。我们期待着更多像国科大实践课题这样的探索和实践,它们不仅为学生提供了宝贵的学习机会,也为整个社会的进步贡献了力量。在这个由数据和智能驱动的新时代,让我们携手共进,共同开创 AI 的美好未来。

Comments