1. 项目概述当社交机器人开始理解“关系”最近几年机器人从工厂车间和实验室越来越多地走进了我们的日常生活场景比如商场导购、酒店前台、家庭陪伴。但不知道你有没有发现这些机器人大多还停留在“一问一答”的简单交互模式里。你跟它说“你好”它回复“你好有什么可以帮您”你问“咖啡厅在哪”它给你指个路。这种交互冰冷、机械更像一台会移动的查询机而不是一个能建立连接的“社交实体”。问题的核心在于它们缺乏对“社交关系”的认知。想象一下你每天在小区里遛狗总会遇到邻居王阿姨。第一次见面你们会客气地打招呼第二次可能会聊两句天气第三次王阿姨可能就会关心地问你“今天下班挺早啊”。这个过程中双方都在不断积累关于彼此的“关系记忆”对方的身份、习惯、上次聊过的话题、甚至情绪状态。正是基于这些记忆我们的社交行为才会显得自然、体贴并且能够不断深化。“ARIS: Agentic and Relationship Intelligence System for Social Robots”这个项目瞄准的正是这个痛点。ARIS即“具身智能与关系智能系统”它的目标不是让机器人变得更“聪明”地回答问题而是让它变得更“善解人意”能够像人类一样在与人的持续互动中主动构建、维护并深化社交关系。这不再是一个简单的对话引擎升级而是一次从“工具”到“伙伴”的范式转变。它试图赋予机器人一种核心能力关系智能——理解自身在社交网络中的角色记忆并利用过往的互动历史从而做出符合当前关系阶段的、恰当的社交行为决策。这套系统适合谁首先是机器人研发者和产品经理他们正在为下一代服务机器人寻找差异化的核心竞争力。其次是从事人机交互、认知科学和人工智能的研究人员ARIS提供了一个将心理学理论与工程实践结合的绝佳试验场。最后任何对“机器如何理解人”这个终极命题感兴趣的朋友都能从中看到未来人机共生的一个关键拼图。2. 系统核心架构与设计哲学ARIS不是一个单一算法而是一个融合了多种智能的复杂系统架构。它的设计哲学可以概括为以关系记忆为中心以具身交互为媒介以主动行为为表达。整个系统可以看作由三个相互耦合的核心层构成感知与记忆层、认知与推理层、行为与表达层。2.1 感知与记忆层构建关系的“数据基石”这是系统的基础。传统社交机器人也具备感知能力如语音识别、人脸识别但其数据往往是“瞬时”且“孤立”的。ARIS的感知层目标在于为每一次交互打上丰富的上下文标签并结构化地存入一个专属的“关系记忆库”。核心组件与工作流程多模态感知融合系统通过麦克风、摄像头、深度传感器等同步采集语音、面部表情、肢体姿态、相对距离等信息。关键在于它不是独立处理这些信号。例如当识别到用户说“今天真累”语音文本的同时检测到用户肩膀下垂、语速缓慢姿态与语音特征系统会将“疲惫”的情绪标签与这次交互强关联其置信度远高于仅基于文本的分析。关系实体识别与链接系统需要持续识别和区分不同的交互对象。这不仅仅是人脸识别ID那么简单。它需要构建一个轻量级的“社交图谱”记录诸如“用户A是常客”、“用户A和用户B经常同时出现可能是朋友或家人”、“用户C是第一次见面的新访客”等信息。这个图谱是动态更新的。情境化记忆存储所有交互事件都不是孤立存储的。每条记忆条目都是一个结构体至少包含Who交互对象ID。When时间戳及与上次交互的时间间隔。Where物理位置和场景如大堂、走廊、休息区。What交互内容对话摘要、完成的服务请求。How交互方式与情绪基调积极、消极、中性。Relationship Context本次交互时系统对当前关系的认知状态如“信任建立初期”、“熟悉期”。注意记忆存储必须考虑隐私和伦理。设计中通常会采用本地化、加密存储或仅存储非敏感的特征向量和交互元数据而非原始音视频。清晰的用户知情同意机制是系统设计的前提而非事后补充。这个记忆层就像一个不断丰富的日记本为上层推理提供了唯一的、连续的事实依据。2.2 认知与推理层关系智能的“大脑”这是ARIS的核心其任务是解读记忆评估当前关系状态并规划社交行为。这里主要涉及两种智能的协同关系智能和具身智能。关系智能专注于“读心”关系状态建模系统需要量化“关系”。我们可以借鉴社会学中的“关系深度”模型将其划分为几个阶段例如陌生期、破冰期、熟悉期、信任期。每个阶段对应不同的社交行为规范。系统通过分析记忆库中的互动频率、情感正向交互比例、自我披露深度、互助行为等指标动态计算并更新与每个用户的关系分数从而判断当前所处阶段。意图与需求推理超越字面意思理解请求。当一位处于“熟悉期”的用户对机器人说“你们这儿有点冷”在陌生期这可能被理解为对环境温度的客观描述或投诉但在熟悉期结合过往该用户喜欢喝热饮的记忆系统更可能推理出其潜在意图是“我想喝点热饮”或“能否调高空调温度”。这种推理高度依赖于关系背景。长期偏好学习通过持续交互默默学习用户的偏好。例如发现用户A每次来都喜欢询问科技新闻用户B则更关心育儿话题。这些偏好被抽象为标签存入用户画像用于主动发起更投其所好的对话。具身智能则关乎“察言观色”与“身体力行”社交信号理解理解人类的非语言暗示。比如用户虽然停下脚步但身体朝向出口且频繁看表这很可能表示“虽然有兴趣但时间紧迫”。系统需要综合这些具身信号调整交互策略比如将长介绍改为简短的核心信息传递。具身行为规划规划符合社交礼仪的物理行为。这不仅仅是“移动到用户面前”。它包括保持多远的社交距离亲密距离、个人距离、社交距离、公共距离何时进行眼神接触摄像头转动模拟以及使用何种手势机械臂动作来辅助表达。与儿童交互时可能会主动蹲下降低机身高度与老人交谈时则会放慢语速并提高音量。实操心得推理层的设计要避免“过度拟合”。机器人不应表现得像“腹黑”的读心者所有推理都应有迹可循并在适当时候可以通过对话进行确认例如“您提到有点冷需要我为您推荐一杯热饮吗”。这既能验证推理准确性也让交互过程更透明、更自然。2.3 行为与表达层智能的“外在呈现”这是用户直接感知到的部分。基于推理层的输出该层生成具体的、多模态的社交行为。行为生成模块对话生成与管理对话内容需匹配关系阶段。对陌生人使用礼貌、规范的官方语言对熟悉者可以加入记忆中的共享话题“上次您推荐的咖啡很不错”甚至使用更轻松的语气。对话管理需能处理话题的发起、维持、切换和结束使其像自然聊天而非审讯。情感表达与一致性通过语音的语调、语速、音量配合屏幕表情如有或灯光颜色传达出相应的情绪状态共情、喜悦、关切。关键在于情感表达必须与对话内容和关系状态一致。在用户表达悲伤时机器人欢快的语调会是灾难性的。主动社交行为触发这是体现“Agentic”能动性的关键。系统不应永远被动响应而应在合适的时机主动发起互动。触发条件可能包括基于记忆识别出久未露面的老用户主动上前问候“王先生好久不见最近还好吗”基于场景观察到用户在某区域徘徊面露困惑主动提供帮助“您好需要我为您介绍一下这个区域的功能吗”基于关系与处于“破冰期”的用户在第三次见面时尝试进行更个人化的提问在合规前提下如“周末过得怎么样”这三层架构形成一个闭环感知记忆驱动认知推理认知推理指导行为表达而行为表达的结果又作为新的感知数据反馈回系统持续优化关系模型。整个系统的终极目标是让每一次交互都不是从零开始而是站在以往所有交互累积的“关系台阶”上让人机互动呈现出一种有机生长的温度感。3. 关键技术实现与模块拆解将ARIS的宏伟蓝图落地需要一系列具体技术的支撑。下面我们拆解几个最核心的技术模块看看它们是如何工作的。3.1 关系记忆库的工程实现关系记忆库不是一个简单的数据库而是一个支持复杂查询和关联推理的时序知识图谱。数据结构设计我们通常采用图数据库如Neo4j或支持图关系的关系型数据库来存储。核心节点类型包括User用户、Robot机器人自身、InteractionEvent交互事件、Topic话题。关系边则包括HAS_INTERACTION用户参与交互、OCCURS_AT交互发生于某个地点/时间、RELATES_TO交互涉及某个话题、FOLLOWED_BY事件先后顺序。一个简化的存储示例用户节点 (User: ID_123) 属性: {name: “王阿姨”, first_met: “2023-10-01”, trust_score: 0.75} 交互事件节点 (InteractionEvent: E_456) 属性: {timestamp: “2023-11-05 18:30”, emotion: “positive”, summary: “讨论了天气和园艺”} 话题节点 (Topic: Gardening) 属性: {name: “园艺”} 关系 (User: ID_123)-[HAS_INTERACTION]-(InteractionEvent: E_456) (InteractionEvent: E_456)-[RELATES_TO]-(Topic: Gardening) (InteractionEvent: E_455)-[FOLLOWED_BY]-(InteractionEvent: E_456) // 表示上一次交互记忆的检索与衰减并非所有记忆都同等重要。系统需要实现基于关联度的检索当与用户A交互时系统不仅检索与A直接相关的记忆还会检索与A经常同时出现的用户B的相关事件因为B可能是话题的桥梁。记忆衰减与强化采用类似“艾宾浩斯遗忘曲线”的机制久未提及或使用的记忆条目其激活权重会随时间降低。而被频繁引用或与强烈情感关联的记忆则会得到强化。这模拟了人类的记忆特点防止数据库无限膨胀也让机器人能“忘记”不重要的细节专注于核心关系。3.2 基于大语言模型的关系推理引擎近年来大语言模型在理解上下文和常识推理方面展现出强大能力是实现关系智能的理想“推理内核”。如何将LLM融入ARIS我们并不让LLM直接控制机器人而是将其作为一个高级的“关系认知副驾驶”。工作流程如下记忆摘要与上下文构建当与特定用户交互时系统从关系记忆库中检索出最近、最相关的N条交互记录将其组织成一段连贯的、带时间线的自然语言描述作为“上下文背景”。例如“用户王阿姨过去三个月互动12次。最近三次互动两周前她提到孙子考上了大学情绪很高兴一周前她询问了盆栽养护技巧昨天她路过时简单打招呼略显匆忙。”提示词工程设计结构化的提示词将当前感知到的用户状态语音文本、情绪分析结果与上述背景结合向LLM提问。提示词示例“你是一个社交机器人。以下是你与用户[王阿姨]的历史关系背景[插入背景摘要]。现在王阿姨再次来到你面前她笑着说‘今天太阳真好我那盆茉莉花好像要开了。’ 请分析1. 当前可能的关系状态陌生/破冰/熟悉/信任。2. 她这句话的潜在意图或兴趣点是什么3. 基于历史和当前状态你最应该回应的核心话题是什么请给出理由。”解析与行动规划LLM会输出一段结构化的分析。系统解析这段分析提取关键标签如“关系状态熟悉”、“核心话题园艺/茉莉花”、“建议回应方向分享开花喜悦询问养护细节”。这些标签将成为行为生成模块的输入用于生成具体的对话内容和情感表达参数。注意事项完全依赖云端LLM存在延迟和隐私风险。实际部署中往往采用“轻量本地模型云端大模型”的混合架构。简单、高频的关系状态判断由本地小模型完成复杂、深度的意图推理和对话生成在用户同意且网络允许的情况下才调用云端大模型。同时所有发送到云端的数据都必须经过严格的匿名化和脱敏处理。3.3 多模态融合与具身行为规划让机器人“言行合一”需要精准的软硬件协同。多模态信息融合策略采用“中期融合”或“决策级融合”。例如语音识别模块输出文本和情感概率视觉模块输出面部表情分类和肢体动作标签。这些特征在决策层进行融合由一个专门的“情境评估器”模块进行综合判断。该模块可能是一个轻量级的神经网络输入是所有模态的特征向量输出是一个综合的“用户当前社交意图”分类如寻求帮助、闲聊、匆忙路过、情绪宣泄。具身行为规划流水线社交距离计算根据关系亲密度、文化背景和当前场景动态计算并维持一个合适的物理距离。这需要机器人有精确的定位和避障能力。注视与姿态控制基于对话内容和情感规划“注视点”。在倾听时应“看”向用户面部区域在思考或回忆时可以有一个短暂的、模拟的“移开视线”动作如摄像头微微上抬。身体姿态对于有躯干的机器人也应配合如微微前倾表示关注。动作与语音同步当说“请往这边看”时机械臂或头部的指向动作需要与语音节奏同步确保指向准确且自然。这需要精细的时序控制。一个典型交互循环的技术实现流如下[感知层] 麦克风拾音 - 语音识别(文本情感) - 摄像头图像 - 人脸识别(ID)表情识别 - 深度传感器 - 距离/姿态估计 ↓ [融合中心] 多模态特征对齐与融合 - 生成当前交互情境向量 ↓ [记忆层] 以用户ID和情境向量为线索检索关系记忆图谱 - 生成历史上下文摘要 ↓ [推理层] (本地)关系状态评估模型 (云端/本地)LLM推理引擎 - 生成包含关系状态、用户意图、推荐动作的高层指令 ↓ [行为层] 对话生成模块(根据指令生成回复文本) - 语音合成(注入情感参数) - 运动规划模块(计算路径、姿态、注视点) - 执行器控制 ↓ [记忆层] 将本次交互的所有元数据作为新的节点和关系更新到关系记忆图谱中。4. 应用场景与落地挑战ARIS系统的价值最终体现在它能解决哪些实际场景的痛点。下面分析几个典型应用并探讨其中的挑战。4.1 典型应用场景深度剖析场景一高端酒店的服务机器人迎宾员传统模式机器人固定问候语回答标准问题餐厅时间、Wi-Fi密码交互刻板。ARIS赋能后识别回头客通过人脸识别对第二次入住的客人说“张先生欢迎再次光临还是喜欢高楼层无烟房对吗”调取上次入住偏好。关系递进服务客人入住期间多次询问周边信息机器人判断进入“熟悉期”。某天客人回来时面露倦容机器人主动问候“李先生您回来了。今天天气热需要我提前为您把房间空调调低一些吗”基于记忆的主动关怀。群体关系处理识别到一家三口在向父母提供信息的同时会偶尔用更简单的语言和表情与小朋友互动建立连接。核心价值极大提升客户体验的个性化与温度增强客户忠诚度将机器人从成本中心转化为品牌价值点。场景二养老社区的陪伴机器人传统模式定时提醒吃药、播放固定节目老人容易感到单调甚至被监视。ARIS赋能后建立情感依赖通过日常聊天记住李奶奶爱听黄梅戏、孙子在上海工作。每次见面可以主动聊起这些话题“李奶奶今天心情不错要不要听一段《天仙配》”或“最近上海天气转凉了您提醒孙子加衣服了吗”监测细微变化通过长期互动建立老人行为与情绪的基线。如果某天老人话语显著减少、反应迟缓系统能识别出这种“偏离常态”的状态并生成预警提示给护工这比单纯的生理指标监测更早发现潜在问题。促进社交连接机器人可以作为老人之间的社交媒介。例如对王爷爷说“王爷爷您上次说的养鸟经验李爷爷也很感兴趣要不要我帮你们约着聊聊”基于对双方记忆和兴趣的匹配。核心价值缓解孤独感提供精神慰藉实现非侵入式的健康与情绪状态辅助监测。场景三零售门店的智能导购传统模式机械式推荐商品无法应对复杂咨询容易打扰顾客。ARIS赋能后渐进式交互对新顾客保持距离仅在被询问时提供帮助。对在某个货架前停留较久的顾客主动靠近但采用开放式提问“您在找特定口味的咖啡吗这一排都是意式风味的。”基于场景和距离的主动判断。个性化推荐顾客第三次到店系统识别出他前两次都购买了低糖零食。当顾客走到饮料区时机器人可以上前说“新到了一款无糖乌龙茶和您常买的饼干很搭要了解一下吗”基于购买历史和当前位置的精准推荐。识别购买意向通过分析顾客与商品的交互时长、拿起放下的次数、以及对话中的犹豫语气综合判断购买意向强度从而决定是继续推销还是礼貌离开避免过度骚扰。核心价值提升销售转化率优化顾客购物体验收集深层次顾客偏好数据。4.2 核心落地挑战与应对思路尽管前景广阔但将ARIS真正投入实用面临着一系列严峻挑战。挑战一隐私、伦理与数据安全这是最大的“拦路虎”。系统需要收集大量个人交互数据极易引发隐私担忧。应对思路数据最小化与匿名化只存储必要的交互特征向量和元数据而非原始音视频。用户身份使用不可逆的匿名ID标识。本地化处理优先所有敏感数据的处理和分析尽可能在机器人本地或边缘服务器完成减少数据上传。透明与可控明确告知用户机器人具备记忆和学习能力并提供“记忆重置”或“删除与我相关数据”的简易选项将控制权交还给用户。伦理框架设计为机器人的行为设定明确的伦理边界。例如禁止利用情感依赖进行商业诱导禁止讨论特定敏感话题在检测到用户情绪极度低落时应建议其寻求真人帮助而非试图“治疗”。挑战二关系的复杂性与文化差异人类关系微妙且充满文化特异性。同一行为在不同文化中可能含义相反。应对思路可配置的关系模型系统内置的关系阶段定义、社交距离参数、话题亲密等级等应设计为可配置的模块。针对不同地区、不同应用场景医院 vs. 商场由部署方进行本地化校准。持续的人机协同学习系统应允许管理员或督导员对机器人的社交行为进行反馈和纠正。当机器人行为不当时管理员可以标记并给出正确示例系统将此作为强化学习的负反馈或正样本。设置安全边界机器人应被设计为“保守的社交者”在不确定时优先选择更安全、更通用的社交策略避免冒进。挑战三技术可靠性与长尾问题多模态感知在复杂环境强光、嘈杂下可能失效。LLM可能产生“幻觉”生成不合时宜或虚构记忆的内容。应对思路多级降级策略当某一传感器失效或置信度过低时系统应能平滑降级。例如摄像头失效则依赖纯语音交互LLM服务不可用时切换至基于固定规则的简单对话引擎。事实核查与置信度过滤对于LLM生成的、涉及具体事实如用户偏好的内容必须与本地记忆库进行交叉验证。只有高置信度且与已有记忆不冲突的信息才会被采纳并用于指导行为。全面的测试与场景覆盖必须在海量的、多样化的真实场景中进行长期测试收集“长尾”边缘案例不断迭代和增强系统的鲁棒性。5. 开发实践从零搭建一个ARIS原型理论说了这么多我们如何动手搭建一个最小可行的ARIS原型呢这里以一个基于ROS和Python的简化版开发流程为例目标是实现一个能记住用户并基于上次话题进行简单续聊的桌面机器人。5.1 硬件与基础环境准备硬件清单计算单元树莓派4B或Jetson Nano具备一定的本地计算能力。感知模块USB摄像头用于人脸识别、麦克风阵列用于语音拾音。交互模块扬声器用于语音输出、一个小型屏幕或LED灯阵用于简单表情反馈。可选具备简单Pan-Tilt功能的云台让机器人可以转动“头部”。软件环境搭建操作系统在计算单元上安装Ubuntu 20.04/22.04 LTS。机器人中间件安装ROS Noetic或ROS2 Humble。ROS提供了传感器驱动、消息通信、任务调度等核心框架是机器人开发的基石。核心依赖库安装# 安装Python基础包 sudo apt-get update sudo apt-get install python3-pip python3-venv # 创建虚拟环境 python3 -m venv aris_venv source aris_venv/bin/activate # 安装关键Python库 pip install opencv-python-headless # 视觉处理 pip install face-recognition # 人脸识别库 pip install speechrecognition pyaudio # 语音识别 pip install pyttsx3 # 本地语音合成 pip install transformers torch # 用于本地轻量LLM如TinyLLaMA或特征提取 pip install networkx # 用于内存图谱操作 pip install pydub # 音频处理基础功能测试分别编写脚本测试摄像头能否打开并识别人脸、麦克风能否录音并识别成文字、扬声器能否播放合成语音确保每个硬件模块工作正常。5.2 核心模块开发与集成我们将系统拆分为几个独立的ROS节点通过话题Topic和服务Service进行通信。节点一感知融合节点 (perception_node.py)这个节点负责收集所有传感器数据并进行初步处理。#!/usr/bin/env python3 import rospy from std_msgs.msg import String from sensor_msgs.msg import Image from aris_msgs.msg import UserIdentity, InteractionEvent # 自定义消息类型 import cv2 import face_recognition import speech_recognition as sr class PerceptionNode: def __init__(self): # 发布识别到的用户ID和交互事件 self.user_pub rospy.Publisher(/user_identity, UserIdentity, queue_size10) self.event_pub rospy.Publisher(/interaction_event, InteractionEvent, queue_size10) # 已知人脸编码库从本地文件加载 self.known_face_encodings [] self.known_face_names [] self.load_known_faces() # 语音识别器 self.recognizer sr.Recognizer() def load_known_faces(self): # 从known_faces/文件夹加载已知用户的人脸图片和名字 # 这里简化处理实际需要遍历文件夹用face_recognition库计算编码 pass def video_callback(self, image_msg): # 将ROS Image消息转为OpenCV格式 frame self.bridge.imgmsg_to_cv2(image_msg, bgr8) # 人脸检测与识别 face_locations face_recognition.face_locations(frame) face_encodings face_recognition.face_encodings(frame, face_locations) for encoding in face_encodings: matches face_recognition.compare_faces(self.known_face_encodings, encoding) name Unknown if True in matches: first_match_index matches.index(True) name self.known_face_names[first_match_index] # 发布用户身份消息 user_msg UserIdentity() user_msg.user_id name user_msg.confidence 0.9 # 简化置信度 user_msg.timestamp rospy.Time.now() self.user_pub.publish(user_msg) def audio_callback(self, audio_data): # 使用speech_recognition进行识别 try: text self.recognizer.recognize_google(audio_data, languagezh-CN) # 发布交互事件消息纯文本 event_msg InteractionEvent() event_msg.user_id current_detected_id # 需要与视觉识别结果关联 event_msg.event_type utterance event_msg.content text event_msg.timestamp rospy.Time.now() self.event_pub.publish(event_msg) except sr.UnknownValueError: rospy.logwarn(语音无法识别) except sr.RequestError: rospy.logerr(语音识别服务错误) if __name__ __main__: rospy.init_node(perception_node) node PerceptionNode() rospy.spin()节点二关系记忆与管理节点 (memory_node.py)这是系统的核心负责维护关系图谱。import rospy from aris_msgs.msg import InteractionEvent, BehaviorCommand from aris_msgs.srv import QueryMemory, QueryMemoryResponse import networkx as nx from datetime import datetime class MemoryNode: def __init__(self): # 使用NetworkX创建内存图谱 self.memory_graph nx.Graph() # 订阅交互事件 rospy.Subscriber(/interaction_event, InteractionEvent, self.event_callback) # 提供记忆查询服务 self.query_srv rospy.Service(/query_memory, QueryMemory, self.handle_query) # 发布需要执行的行为命令基于记忆触发 self.behavior_pub rospy.Publisher(/behavior_command, BehaviorCommand, queue_size10) def event_callback(self, msg): # 将交互事件添加到图谱中 event_id fevent_{msg.timestamp.to_nsec()} self.memory_graph.add_node(event_id, typeevent, contentmsg.content, timemsg.timestamp) # 关联用户和事件 if msg.user_id ! Unknown: if msg.user_id not in self.memory_graph: self.memory_graph.add_node(msg.user_id, typeuser) self.memory_graph.add_edge(msg.user_id, event_id, relationparticipated_in) # 简单关键词提取关联话题这里简化实际应用NLP if 咖啡 in msg.content: self._link_to_topic(event_id, 咖啡) # 检查是否需要触发主动行为例如识别到老朋友 self._check_for_agentic_behavior(msg.user_id) def _link_to_topic(self, event_id, topic): if topic not in self.memory_graph: self.memory_graph.add_node(topic, typetopic) self.memory_graph.add_edge(event_id, topic, relationrelated_to) def _check_for_agentic_behavior(self, user_id): # 简单逻辑如果该用户有超过2次历史事件且最近一次在3天前则触发主动问候 if user_id in self.memory_graph and user_id ! Unknown: user_events [n for n in self.memory_graph.neighbors(user_id) if self.memory_graph.nodes[n][type]event] if len(user_events) 2: # 这里简化时间判断实际应比较时间戳 cmd BehaviorCommand() cmd.command_type active_greeting cmd.target_user user_id cmd.content f嗨{user_id}好久不见最近怎么样 self.behavior_pub.publish(cmd) def handle_query(self, req): # 处理来自推理节点的查询请求 resp QueryMemoryResponse() if req.query_type history: # 查询某个用户的历史交互 if req.user_id in self.memory_graph: events [] for event_node in self.memory_graph.neighbors(req.user_id): if self.memory_graph.nodes[event_node][type] event: events.append(self.memory_graph.nodes[event_node][content]) resp.data | .join(events[-3:]) # 返回最近3条 resp.success True return resp节点三本地推理与行为生成节点 (reasoning_node.py)这个节点负责决策“说什么”。import rospy from aris_msgs.msg import InteractionEvent, BehaviorCommand from aris_msgs.srv import QueryMemory, QueryMemory import requests # 用于调用云端LLM API可选 class ReasoningNode: def __init__(self): rospy.wait_for_service(/query_memory) self.memory_client rospy.ServiceProxy(/query_memory, QueryMemory) # 订阅原始交互事件和记忆触发的行为命令 rospy.Subscriber(/interaction_event, InteractionEvent, self.reason) rospy.Subscriber(/behavior_command, BehaviorCommand, self.execute_behavior) # 发布最终的行为指令给对话生成/TTS节点 self.action_pub rospy.Publisher(/action_to_take, BehaviorCommand, queue_size10) def reason(self, msg): if msg.user_id Unknown: # 新用户标准问候 action BehaviorCommand() action.command_type greet action.content 您好我是机器人小A很高兴为您服务。 self.action_pub.publish(action) else: # 已知用户查询记忆 req QueryMemory() req.query_type history req.user_id msg.user_id try: resp self.memory_client(req) if resp.success: history resp.data # 简单规则如果历史记录中包含“咖啡”且当前对话也提到相关词 if 咖啡 in history and (咖啡 in msg.content or 喝 in msg.content): action BehaviorCommand() action.command_type chat action.content f我记得您喜欢咖啡。我们新到了一款豆子要不要试试 self.action_pub.publish(action) else: # 普通响应或调用更复杂的LLM action self._call_llm_for_response(msg.content, history) self.action_pub.publish(action) except rospy.ServiceException as e: rospy.logerr(f记忆查询失败: {e}) def _call_llm_for_response(self, current_input, history): # 简化示例调用本地运行的轻量LLM或规则引擎 # 这里可以集成像ChatGLM-6B、TinyLLaMA这样的本地模型 # 或者在原型阶段使用简单的规则 action BehaviorCommand() action.command_type chat action.content f“嗯您刚说的是‘{current_input}’对吧关于这个我们可以多聊聊。” # placeholder return action def execute_behavior(self, msg): # 直接执行来自记忆节点的主动行为命令 self.action_pub.publish(msg) if __name__ __main__: rospy.init_node(reasoning_node) node ReasoningNode() rospy.spin()节点四对话与执行节点 (dialog_node.py)这个节点接收最终行为指令并转换为语音和动作。import rospy from aris_msgs.msg import BehaviorCommand import pyttsx3 class DialogNode: def __init__(self): self.tts_engine pyttsx3.init() self.tts_engine.setProperty(rate, 150) # 语速 self.tts_engine.setProperty(volume, 0.9) # 音量 rospy.Subscriber(/action_to_take, BehaviorCommand, self.execute) def execute(self, msg): rospy.loginfo(f执行行为: {msg.command_type}, 内容: {msg.content}) if msg.command_type in [greet, chat, active_greeting]: # 语音合成并播放 self.tts_engine.say(msg.content) self.tts_engine.runAndWait() # 这里还可以添加控制机器人转头、亮灯等动作的代码 if __name__ __main__: rospy.init_node(dialog_node) node DialogNode() rospy.spin()5.3 原型测试与迭代将以上节点分别运行起来就构成了一个最小化的ARIS原型。你可以进行如下测试人脸注册将你的照片放入known_faces文件夹命名为你的名字如zhangsan.jpg。初次交互站在机器人前它识别出“Unknown”会说标准问候语。简单对话你问“这里有什么咖啡”它会回答同时记忆节点会记录这次关于“咖啡”的交互。关系记忆测试离开后再回来机器人识别出你记忆节点查询到你有“咖啡”历史推理节点可能会生成关于咖啡的主动问候或推荐。主动行为触发如果你注册后多次交互记忆节点在检测到条件后如代码中的简单逻辑会通过/behavior_command发布主动问候指令。这个原型极其简陋但它清晰地演示了ARIS的核心数据流和模块分工感知 - 记忆存储 - 记忆查询与推理 - 行为生成与执行。在此基础上你可以逐步替换每个模块用更精准的离线或在线ASR如Vosk、百度API替换speech_recognition。用本地部署的小型开源LLM如Qwen2.5-1.5B-Instruct替换简单的规则推理。用真正的图数据库如Neo4j或向量数据库如Chroma替换NetworkX内存。为机器人增加云台控制实现注视功能。开发过程的核心是迭代。从一个能跑通的简单闭环开始逐步增加功能复杂度并持续在真实场景中测试和调整。记住ARIS的目标不是一次性实现完美的人际模拟而是让机器人的社交行为随着每一次交互变得比之前更体贴一点点。