产品简介
有灵平台 是实时人机协作线上任务平台,支持用户发布任务,AI智能体与人类智能体协作帮助用户完成任务。
平台上有海量AI智能体 和丰富的人类智能体 ,AI智能体包括最新的AI大模型和算法,人类智能体通过群体智能被组织起来,人机协作高效完成任务。有灵平台的核心技术是AOP(Agent-Oriented-Programming,面向智能体编程) 。
那我们为什么要设计并推广AOP,使用AOP的好处是什么? 简单来说,随着老龄化和用工荒的加剧,大量工作都需要机器人或AI技术来替换原有人力劳动。但现有的机器人或AI技术都存在着明显的能力缺陷,在很多任务场景下,我们无法将所有的工作内容都交给机器处理,更多时候机器扮演的还是一个辅助人工的角色。基于此,我们希望AOP从智能体的角度出发,统一AI和人工的表示方式,用一致的接口或服务来供任务方使用,并自动构建数据闭环让智能体具备自主进化能力。

基本概念
任务和智能体
任务: 对应日常生活或工作上的任务。如到达某地、完成某项工作,都可以被理解为完成任务。
智能体: 一个任务可以由单个或多个智能体协作完成,智能体可以是人类或者机器(AI)。单个智能体可同时具备多个能力。
智能体的能力
感知: 是智能体通过各种传感器,如人类眼睛、耳朵、鼻子、皮肤,机器人的摄像机、麦克风等从环境中获取信息的过程。
认知: 是智能体对已有的信息,在大脑中做加工处理,推断出更多信息的过程。
决策: 是智能体基于直接的感知信息或间接的认知信息,决定要执行的动作,从而改变状态,实现某种目标、获取某种收益的过程。
行动: 是智能体通过各类执行器(如手、腿、口等)根据决策执行动作的过程。

智能体的观察、状态、动作、奖励
观察: 智能体通过各种传感器从环境中获取的信息
状态: 智能体对信息在大脑中做加工处理,推断出的更多信息。状态是某一时间点对该世界的描述。
动作: 智能体基于直接的观察信息或间接的状态信息,选择要执行的动作
奖励: 智能体执行动作后,环境对智能体的反馈,包括正反馈和负反馈
为什么要面向智能体编程?
一个出行的例子
假如我是一个乘客,要从A出发到目的地B ,我希望一个智能体Agent能作为司机驾驶车辆,帮我完成这个任务。伪代码示例如下:
now = start = A
target = B
driver = DriverAgent()
while now != target:
now = driver.drive()
从上面的代码中我们可以看到,我需要一个司机来载着我从A到B。但我真的是需要一个真人司机从头到尾开到底吗?其实不是的,我只是需要一个抽象的智能体driver ,能帮我完成这个任务。这个driver可以是一个司机,也可以是一个有能力辅助驾驶的AI。
以目前的辅助驾驶为例,这个driver可能在大多数时候是AI,而在一些极端情况时则变成了司机。但我作为一个乘客,其实我并不关心这个过程,对我来说我只是需要一个"driver"。
那到AOP中,核心就变成了我们提供一个抽象driver 给对方使用,其本质在driver这个对象的实现上,如何更好地结合人机协作并对外隐藏掉这个过程。
class DriverAgent():
def drive(self):
observation = self.get_observation() # 获得实时的路况信息
if self.can_ai_drive(observation):
# 如果当前路况AI能处理,则让AI处理
operation = self.ai_driver_drive(observation)
else:
# 控制权交给司机,让司机处理
operation = self.human_driver_drive(observation)
# 车辆执行操作指令
next_position = self.car.execute(operation)
return next_position
因为我们要做的是线上任务,所以跟目前常见的辅助驾驶不同,我们的人机协作主要指的是线上任务的人机协作。以网易伏羲正在做的远程挖机为例,我们的人类司机并没有坐在挖机上,而是通过视频、三维重建地图等信息远程地观察工地,并通过APP等方式远程操控挖机。
这样通过网易伏羲的有灵众包 ,我们可以让每个工作者不出家门,就可以在线上工作。接下来为了更好地理解这个例子,对上面的辅助驾驶稍作修改,远程操作控制智能挖掘机。
class ExcavatorDriverAgent():
def drive(self):
observation = self.get_observation() # 获得实时的工地情况
if self.can_ai_drive(observation):
# 如果当前AI能处理,则让AI处理
operation = self.ai_driver_drive(observation)
else:
# 控制权交给司机,让众包的远程司机处理
operation = self.crowdsourcing_human_driver_drive(observation)
# 挖掘机执行操作指令
self.excavator.execute(operation)
数据闭环
在AOP中,我们既然天然支持人机协作 ,自然就要充分利用人机协作时“人”的数据,并通过这些数据不断提升“机”的能力。在AOP中,人机协作的人类智能体通过有灵众包实现。在AOP中,我们将自动对“人”的数据进行持久化,也就是通过数据的接口把数据自动存储下来,以便进一步提升AI能力。
class ExcavatorDriverAgent():
def crowdsourcing_human_driver_drive(self, observation):
# 把任务发给众包,告诉众包系统当前任务以及任务相关的信息
operation = self.request_crowdsourcing(self.task_id, observation)
# 伪代码,数据接口自动存储
shuyuansdk.save(observation, operation)
return operation
主动学习
有了持久化的数据,我们就可以让AI进一步学习。目前常见的学习方式分成三种,监督学习、无监督学习和强化学习。
通过"人"的输入输出数据,我们可以通过模仿学习 (监督学习的一种形式),让AI模仿“人”的认知和决策方式;通过记录环境的数据,我们可以使用无监督学习 ,学习环境的状态转移、隐状态表示等;通过直接跟环境交互,我们也可以使用强化学习 让AI直接学习策略。
为了支撑这些能力,AOP中提供一套AI开发的工具,来管理和使用数据。通过AOP定义的主动学习相关信息,AI开发系统将自动获取持久化的数据,并通过调用默认的算法或者AI算法研究员提供的算法来进行主动学习。对于模型管理这块,AI开发系统将提供模型训练、模型评估、模型发布和模型更新的能力。
IDL简介
AOP使用IDL(接口描述语言,Interface description language) 描述任务要素,要素包括数据结构类型、任务目标、环境、智能体基本要素和各项能力等,本身不包含执行逻辑的部分。当前主要用Python来表示任务的运行逻辑及智能体的运行,以下是一个IDL定义图片分类任务以及对应智能体的示例:
class CatCategory (IntEnum):
狗 = 0
猫 = 1
class Aop_Zhongbao(Task):
''' 定义任务 '''
class Aop_Agent(Agent):
''' 定义智能体 '''
a: Observation[Image]
b: MemState[CatCategory]
@cognition(
category = "Human",
input = ['a'],
output = ['b'],
persistent = True,
tasktype = '动漫风格图片二分类'
)
def annotate():
''' 定义能力'''
AOP IDL示例说明
关键字和数据结构
基本数据结构 int,float,double,string,bool,long,dict, list,matrix,tensor
复杂数据结构
- enum:枚举
- struct:结构体/类
- typedef:自定义类型(别名)
关键字
- task:任务
- agent:智能体
- env:环境
- name:名字
- desc:描述
- type:类型
- version:版本
- observation:观察
- state:状态
- action:动作
- cognition:认知能力
- policy:决策能力
- reward:奖惩
任务定义
定义一个任务的类,继承自Task任务父类,在任务中定义智能体
class Aop_Zhongbao(Task):
''' 定义任务 '''
智能体定义
定义一个智能体的类,继承自Agent智能体父类,在智能体中定义能力Capability
class Aop_Agent(Agent):
''' 定义智能体 '''
智能体能力
能力的定义使用了Python装饰器,@cognition定义认知能力,@policy定义决策能力,用户可按此格式定义能力
- category支持"Ai"、"Human"、"logic"
- input、output用来定义能力的输入和输出参数
- persistent为是否要将输入输出的参数持久化
- "Human"类型的众包能力需要定义tasktype任务类型,"Ai"、"logic"则不需要定义tasktype
@cognition(
category = "Human",
input = ['a'],
output = ['b'],
persistent = True,
tasktype = '动漫风格图片二分类'
)
def annotate():
''' 定义能力'''