【Inner Monologue论文阅读】: 首次将大语言模型嵌入机器人控制闭环,实现自我反思和动态行为调整

论文信息


引言:机器人也能"三思而后行"

想象一下,你让机器人去厨房拿一瓶可乐。传统的机器人会怎么做?它会生成一个僵硬的计划:1. 走到厨房 2. 拿起可乐 3. 拿给你。然后就一条路走到黑------如果可乐不在桌子上,它会傻站在那里;如果第一次没拿起来,它会直接放弃;如果冰箱里只有雪碧,它完全不知道该怎么办。

但人类会怎么做?我们会有"内心独白":

"可乐不在桌子上?那看看冰箱里有没有。"

"第一次没拿起来?再试一次。"

"冰箱里只有雪碧?问问用户要不要换雪碧。"

这就是谷歌机器人团队在2022年提出的Inner Monologue(内心独白)的核心思想:让机器人也拥有这种"内心独白"能力,通过自然语言反馈形成闭环,根据环境变化动态调整计划。

之前的工作比如SayCan已经证明了大语言模型(LLM)可以作为机器人的高层规划器,但它们都是开环的------生成计划后就不管执行结果了,一旦中间出问题,整个任务就失败了。而Inner Monologue通过引入三种自然语言反馈源,让LLM能够实时感知环境变化,进行重试、重规划甚至询问用户,大大提升了机器人在复杂动态环境中的鲁棒性。


一、Inner Monologue的核心设计

Inner Monologue的整体框架如图1所示。它的核心思想非常简单:把所有的环境反馈都转换成自然语言,然后和之前的对话历史一起输入给LLM,让LLM根据完整的上下文生成下一步的动作。

图1 Inner Monologue的整体框架(来源:论文Figure1)

从图1可以看到,整个系统由三个核心部分组成:

  1. 大语言模型(LLM):作为高层规划器,负责理解人类指令、生成动作计划、处理环境反馈
  2. 感知模块:负责将视觉信息转换成自然语言反馈,比如"我看到了可乐和雪碧"、"动作执行失败"
  3. 机器人技能库:包含一系列预训练的低级别技能,比如"走到桌子"、"拿起可乐",每个技能都有对应的自然语言描述

1.1 问题陈述

我们的目标是让一个具身机器人执行人类给出的自然语言指令iii。机器人只能执行技能库Π\PiΠ中的预训练技能πk\pi_kπk,每个技能都有对应的自然语言描述ℓk\ell_kℓk。规划器(也就是LLM)需要找到一个技能序列来完成指令iii。同时,规划器可以获取环境的自然语言反馈ooo,比如成功检测、场景描述、人类反馈等。我们的目标是研究LLM如何利用这些反馈来形成闭环,提升规划的鲁棒性。

1.2 三种反馈源

Inner Monologue引入了三种不同类型的自然语言反馈,如图2所示:

图2 三种类型的自然语言反馈(来源:论文Figure2)

(1)成功检测(Success Detection)

这是最基本的反馈,告诉LLM上一个动作是否成功执行。比如"动作执行成功"或"动作执行失败"。

通俗解释:这就像你做完一件事后,自己判断有没有做好。如果没做好,就再试一次。

(2)被动场景描述(Passive Scene Description)

在每一步动作执行后,自动向LLM提供当前场景的语义信息。比如"场景:桌子上有可乐、雪碧和巧克力"。

通俗解释:这就像你环顾四周,告诉自己现在周围有什么东西。

(3)主动场景描述(Active Scene Description)

LLM可以主动向环境或人类提问,获取需要的信息。比如"你想要可乐还是雪碧?",然后根据回答调整计划。

通俗解释:这就像你遇到不确定的事情时,主动问别人的意见。

1.3 闭环规划流程

Inner Monologue的完整规划流程是一个完美的闭环,和人类的思考过程几乎一模一样:

  1. 接收人类指令
  2. LLM根据指令和当前上下文生成下一步动作
  3. 机器人执行这个动作
  4. 感知模块生成自然语言反馈
  5. 将反馈添加到上下文中
  6. 回到步骤2,直到任务完成

二、惊人的实验结果

研究人员在三个完全不同的环境中测试了Inner Monologue的性能,结果都非常惊艳。

2.1 模拟桌面重排任务

第一个实验是在Ravens模拟环境中进行的桌面重排任务,比如"把所有方块放到不匹配颜色的碗里"。实验结果如表1所示:

表1 模拟桌面重排任务的成功率(来源:论文Table1)

任务类型 CLIPort CLIPort+oracle Object+LLM Object+Success Object+Scene
见过的任务 24.0% 74.0% 80.0% 90.0% 94.0%
没见过的任务 0.0% 0.0% 20.0% 70.0% 86.0%

结果分析

  • 传统的CLIPort在没见过的任务上成功率为0,完全无法泛化
  • 只加入物体识别(Object+LLM),未见任务成功率提升到20%
  • 加入成功检测(Object+Success),成功率飙升到70%
  • 再加入任务进度场景描述(Object+Scene),成功率达到了惊人的86%!

这充分证明了闭环反馈的重要性。特别是在未见任务上,Inner Monologue的泛化能力远超传统方法。

2.2 真实桌面重排任务

第二个实验是在真实的UR5e机器人上进行的桌面重排任务,包括3块积木堆叠和食物/调味品分类。实验结果如表2所示:

表2 真实桌面重排任务的成功率(来源:论文Table2)

任务 Object LLM Object Success Object+Success
完成3块积木堆叠 20% 40% 40% 100%
分类水果和瓶子 20% 50% 40% 80%
平均 20% 45% 40% 90%

结果分析

  • 开环的Object LLM平均成功率只有20%
  • 单独加入物体识别或成功检测,成功率提升到40-45%
  • 同时加入两种反馈,平均成功率达到了90%!

在真实环境中,由于感知噪声和执行误差,开环方法的表现非常差。而Inner Monologue通过闭环反馈,能够自动重试失败的动作,大大提升了鲁棒性。

2.3 真实厨房移动操作任务

第三个实验是在真实的办公室厨房中进行的移动操作任务,使用的是谷歌的Everyday Robots机器人。这个实验对比了Inner Monologue和之前的SayCan方法,结果如表3所示:

表3 真实厨房移动操作任务的成功率(来源:论文Table3)

方法 无干扰 有干扰
SayCan 65% 0%
Inner Monologue (w/ Success) 75% 50%
Inner Monologue (w/ Success+Object) 80% 75%

结果分析

  • 在没有干扰的情况下,Inner Monologue已经比SayCan表现更好
  • 在有干扰的情况下(比如故意让动作失败),SayCan的成功率直接降到了0%,因为它没有重试机制
  • 而Inner Monologue通过成功检测和物体识别反馈,能够自动重试和重规划,成功率仍然保持在75%!

这是最令人震撼的结果。在真实的动态环境中,干扰是不可避免的。开环的SayCan在遇到干扰时完全无能为力,而Inner Monologue却能像人类一样灵活应对。

2.4 令人惊喜的涌现能力

除了基本的重试和重规划能力,Inner Monologue还涌现出了很多论文中没有明确提到的能力,如图5所示:

图5 Inner Monologue的涌现能力(来源:论文Figure5)

这些能力完全是大语言模型自带的,不需要任何额外的训练:

  1. 持续适应新指令:在任务执行过程中,人类可以随时改变目标,机器人会自动调整计划。比如你让机器人拿可乐,中途说"算了,拿雪碧吧",机器人会立刻切换目标。
  2. 自我提出目标:当原目标无法实现时,机器人会主动提出替代方案。比如"紫色方块太重了,我拿蓝色方块可以吗?"
  3. 多语言交互:机器人可以理解多种语言的指令,比如中文、英文等。
  4. 交互式场景理解:任务完成后,你可以问机器人"碗里有什么?",它会根据之前的动作和反馈回答你的问题。

三、核心代码实现(简化版)

下面是一个极度简化的Inner Monologue实现,展示了它的核心闭环逻辑:

python 复制代码
import openai
import time

class InnerMonologueRobot:
    """
    简化版Inner Monologue机器人
    核心逻辑:LLM规划 -> 执行动作 -> 获取反馈 -> 更新上下文 -> 重新规划
    """
    def __init__(self, openai_api_key):
        openai.api_key = openai_api_key
        self.context = []  # 对话上下文,存储所有的指令、动作和反馈
        
        # 系统提示词,告诉LLM它的角色和任务
        self.system_prompt = """
        你是一个机器人规划器。你的任务是根据人类的指令和环境反馈,生成下一步的动作。
        你可以执行以下动作:
        - go_to(location): 走到指定位置
        - pick_up(object): 拿起指定物体
        - put_down(object, location): 把物体放到指定位置
        - ask(question): 向人类提问
        - done(): 任务完成
        
        每次只生成一个动作。如果动作执行失败,重试一次;如果还是失败,考虑其他方案或询问人类。
        """
        
    def add_to_context(self, role, content):
        """添加内容到上下文"""
        self.context.append({"role": role, "content": content})
        
    def call_llm(self):
        """调用大语言模型生成下一步动作"""
        messages = [{"role": "system", "content": self.system_prompt}] + self.context
        response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=messages,
            temperature=0
        )
        return response.choices[0].message.content.strip()
    
    def execute_action(self, action):
        """执行动作并返回反馈(这里用模拟的反馈)"""
        print(f"执行动作: {action}")
        time.sleep(1)
        
        # 模拟动作执行结果,有30%的概率失败
        import random
        if random.random() < 0.3:
            return "动作执行失败"
        else:
            if action.startswith("go_to"):
                location = action.split("(")[1].split(")")[0]
                return f"成功到达{location}"
            elif action.startswith("pick_up"):
                obj = action.split("(")[1].split(")")[0]
                return f"成功拿起{obj}"
            elif action.startswith("put_down"):
                obj, location = action.split("(")[1].split(")")[0].split(", ")
                return f"成功把{obj}放到{location}"
            elif action.startswith("ask"):
                question = action.split("(")[1].split(")")[0]
                print(f"机器人问: {question}")
                return input("你的回答: ")
            elif action == "done()":
                return "任务完成"
            else:
                return "未知动作"
    
    def run(self, instruction):
        """运行机器人,执行给定的指令"""
        self.add_to_context("user", instruction)
        print(f"收到指令: {instruction}")
        
        while True:
            # 调用LLM生成下一步动作
            action = self.call_llm()
            self.add_to_context("assistant", action)
            
            # 如果动作是done(),任务结束
            if action == "done()":
                print("任务完成!")
                break
            
            # 执行动作并获取反馈
            feedback = self.execute_action(action)
            self.add_to_context("user", feedback)
            print(f"反馈: {feedback}")

# 测试代码
if __name__ == "__main__":
    robot = InnerMonologueRobot("你的OpenAI API密钥")
    robot.run("帮我从厨房拿一瓶可乐")

代码说明

  • 这个简化版实现了Inner Monologue的核心闭环逻辑
  • 用OpenAI的GPT-3.5-turbo作为LLM规划器
  • 动作执行和反馈是模拟的,实际使用时可以替换成真实的机器人控制代码和感知模块
  • 当动作执行失败时,LLM会自动重试,这完全是它自己学会的,不需要任何额外的提示!

四、局限性与未来展望

虽然Inner Monologue取得了非常好的效果,但它仍然有一些局限性:

  1. 依赖高质量的自然语言反馈:目前的场景描述和成功检测还需要人工标注或专门训练的模型。未来可以用更强大的视觉语言模型(比如GPT-4V)来自动生成高质量的自然语言反馈。
  2. LLM可能会忽略反馈:在某些情况下,LLM可能会忽略环境反馈,继续执行原来的计划。这可以通过更好的提示词工程或微调来改善。
  3. 上下文长度限制:目前的LLM上下文长度有限,无法处理非常长的任务。未来随着上下文长度的增加,这个问题会得到解决。
  4. 低级别技能的限制:机器人的最终表现还是受限于低级别技能的能力。如果低级别技能本身无法完成某个动作,再聪明的规划器也没用。

未来的研究方向包括:

  • 用视觉语言模型完全替代人工标注的反馈
  • 让LLM能够学习新的低级别技能
  • 引入强化学习,让机器人通过试错来改进自己的规划
  • 提升LLM的长上下文推理能力

五、总结

Inner Monologue是机器人领域的一个重要突破。它证明了用自然语言作为机器人的"内心独白",可以让大语言模型成为一个强大的闭环规划器

通过引入简单的自然语言反馈,Inner Monologue解决了之前开环规划方法的鲁棒性问题,让机器人能够在复杂动态的真实环境中灵活应对各种情况。更重要的是,它不需要任何额外的训练,只需要用少量的提示词就能让LLM具备这种能力。

这篇论文向我们展示了通用基础模型在机器人领域的巨大潜力。未来,随着基础模型能力的不断提升,我们离真正的通用机器人会越来越近。

相关推荐
AI帮小忙3 小时前
Debian/Ubuntu 系linux操作系统Kali Linux 2026 里安装 Hermes Agent
人工智能
乌恩大侠3 小时前
基站正在成为 AI 计算节点:NVIDIA Aerial 推动 RAN 架构重构
人工智能·重构·架构
钓了猫的鱼儿3 小时前
基于深度学习+AI的水下目标目标检测与预警系统(Python源码+数据集+UI可视化
人工智能·深度学习·智能手机
Ting-yu3 小时前
Spring AI Alibaba零基础速成(6) ---- 向量化
数据库·人工智能
YUDAMENGNIUBI3 小时前
day29_NLP概念与文本预处理
人工智能·自然语言处理
南屹川3 小时前
【安全】代码安全审计与防护实践
人工智能
深开鸿3 小时前
福田区全栈式鸿蒙AI数智机关入选全市首批OR示范应用项目,深开鸿筑牢政务安全底座
人工智能·openharmony·政务
进度猫3 小时前
八款项目管理软件对比:功能、局限与适用团队
人工智能·项目管理·产品经理·甘特图·项目管理软件
Cosolar4 小时前
收藏备用!2026 年所有主流 RAG 开源项目都在这里了
人工智能·面试·llm