paint-brush
具現化された会話型 AI の構築: ロボットに理解、移動、対話を教える方法@vineethvatti
450 測定値
450 測定値

具現化された会話型 AI の構築: ロボットに理解、移動、対話を教える方法

Vineeth Reddy Vatti8m2025/03/09
Read on Terminal Reader

長すぎる; 読むには

Alexa Prize SimBot Challenge では、具現化された会話エージェントの構築が行われました。BERT、強化学習、マルチモーダル機械学習を使用しました。AI は指示を理解し、環境内を移動し、オブジェクトと対話し、応答することができました。
featured image - 具現化された会話型 AI の構築: ロボットに理解、移動、対話を教える方法
Vineeth Reddy Vatti HackerNoon profile picture
0-item

ロボットに「ねえ、キッチンから赤いカップを取ってここに持ってきなさい」と頼むところを想像してください。


簡単そうに聞こえますね。しかし、AI の場合、言語を理解し、空間を移動し、物体を認識し、フィードバックをすべてリアルタイムで提供する必要があります。


これはまさに私がAlexa Prize SimBot Challengeで取り組んだことであり、そこで私たちは指示を理解し、環境内を移動し、オブジェクトと対話し、コミュニケーションを返すことができる具現化された会話エージェントを構築しました。


ここでは、BERT、強化学習、マルチモーダル機械学習を使用してこれをどのように実現したかを説明します。さまざまな問題と、それぞれの問題にどのように取り組んだかを見ていきましょう。

BERT で言語を理解する

自然言語は乱雑で、非常に複雑になることがあります。私たち人間は「冷蔵庫へ行け」と言うこともできますが、「冷蔵庫を探して開けろ」と言うこともできます。ロボットはさまざまな言い回しから意味を抽出しなければなりません。


これを実現するために、BERT (Bidirectional Encoder Representations from Transformers) を使用してテキスト命令を構造化コマンドに変換し、命令を順番に実行しやすくしました。


仕組み

  1. ユーザーは指示を話すか入力します。
  2. BERT はテキストを処理して意図を抽出します。
  3. AI はこれを、 navigate_to(fridge)pick(red_cup)などの実行可能なアクションに変換します。


以下は、BERT ベースの命令パーサーのコアです。

 import torch import torch.nn as nn import torch.optim as optim from transformers import BertTokenizer, BertModel class InstructionEncoder(nn.Module): """ Fine-tunes BERT on domain-specific instructions, outputs a command distribution. """ def __init__(self, num_commands=10, dropout=0.1): super(InstructionEncoder, self).__init__() self.bert = BertModel.from_pretrained("bert-base-uncased") self.dropout = nn.Dropout(dropout) self.classifier = nn.Linear(self.bert.config.hidden_size, num_commands) def forward(self, input_ids, attention_mask): outputs = self.bert(input_ids=input_ids, attention_mask=attention_mask) pooled_output = outputs.pooler_output pooled_output = self.dropout(pooled_output) logits = self.classifier(pooled_output) return logits #Suppose we have some labeled data: (text -> command_id) tokenizer = BertTokenizer.from_pretrained("bert-base-uncased") model = InstructionEncoder(num_commands=12) model.train() instructions = ["Go to the fridge", "Pick up the red cup", "Turn left"] labels = [2, 5, 1] input_encodings = tokenizer(instructions, padding=True, truncation=True, return_tensors="pt") labels_tensor = torch.tensor(labels) optimizer = optim.AdamW(model.parameters(), lr=1e-5) criterion = nn.CrossEntropyLoss()

結果と主な成果

  • ユーザーの指示をロボットのタスクにマッピングする際に92% の精度を達成しました
  • ルールベースの NLP よりも複雑な言い回しのバリエーションをうまく処理しました
  • ドメイン適応型の微調整により、環境固有の用語(「冷蔵庫」、「カウンター」、「ソファ」)の理解が向上しました。
  • 同義語や小さな構文の違い(「grab」、「pick」、「take」)に対して堅牢です
  • コマンドのリアルタイム解析が可能になりました (クエリあたり 100 ミリ秒未満)。



経路計画によるナビゲーション (A* と強化学習)

ロボットがどこに行くべきか理解したら、そこに到達する方法が必要です。構造化された環境 (マップなど) にはA *検索を使用し、動的空間には強化学習 (RL) を使用しました。

ナビゲーションシステムのトレーニング方法

  • * 静的経路探索の検索: 構造化された空間内の事前計算されたルート。
  • 動的動作のための RL : ロボットは報酬を使用して試行錯誤から学習しました。


これが、パスファインディングのための A* 検索実装の実装方法です。

 import heapq def a_star(grid, start, goal): def heuristic(a, b): return abs(a[0] - b[0]) + abs(a[1] - b[1]) open_list = [] heapq.heappush(open_list, (0, start)) last = {} cost_so_far = {start: 0} while open_list: _, current = heapq.heappop(open_list) if current == goal: break for dx, dy in [(-1, 0), (1, 0), (0, -1), (0, 1)]: #4 directions neighbor = (current[0] + dx, current[1] + dy) if neighbor in grid: #Check if it's a valid position new_cost = cost_so_far[current] + 1 if neighbor not in cost_so_far or new_cost < cost_so_far[neighbor]: cost_so_far[neighbor] = new_cost priority = new_cost + heuristic(goal, neighbor) heapq.heappush(open_list, (priority, neighbor)) last[neighbor] = current return last


これは、動的動きに RL を使用する方法の実装です。


 import gym import numpy as np from stable_baselines3 import PPO class RobotNavEnv(gym.Env): """ A simplified environment mixing a partial grid with dynamic obstacles. Observations might include LiDAR scans or collision sensors. """ def __init__(self): super(RobotNavEnv, self).__init__() self.observation_space = gym.spaces.Box(low=0, high=1, shape=(360,), dtype=np.float32) self.action_space = gym.spaces.Discrete(3) self.state = np.zeros((360,), dtype=np.float32) def reset(self): self.state = np.random.rand(360).astype(np.float32) return self.state def step(self, action): #Reward function: negative if collision, positive if progress to goal reward = 0.0 done = False if action == 2 and np.random.rand() < 0.1: reward = -5.0 done = True else: reward = 1.0 self.state = np.random.rand(360).astype(np.float32) return self.state, reward, done, {} env = RobotNavEnv() model = PPO("MlpPolicy", env, verbose=1).learn(total_timesteps=5000)


結果と主な成果

  • A* 検索は制御された環境ではうまく機能しました。
  • 障害物にリアルタイムで適応する RL ベースのナビゲーション。
  • ナビゲーション速度が標準アルゴリズムより40%向上

物体認識とインタラクション

目的地に到着したら、ロボットは物体を視認して操作する必要があります。そのためには、物体の位置を特定するためのコンピューター ビジョンが必要です。


カップ、ドア、家電製品などのオブジェクトを認識するようにYOLOv8モデルをトレーニングしました。


 import torch from ultralytics import YOLO import numpy as np #load a base YOLOv8 model model = YOLO("yolov8s.pt") #embeddings object_categories = { "cup": np.array([0.22, 0.88, 0.53]), "mug": np.array([0.21, 0.85, 0.50]), "bottle": np.array([0.75, 0.10, 0.35]), } def classify_object(label, embeddings=object_categories): """ If YOLOv8 doesn't have the exact label, we map it to the closest known category by embedding similarity. """ if label in embeddings: return label else: best_label = None best_sim = -1 for cat, emb in embeddings.items(): sim = np.random.rand() if sim > best_sim: best_label, best_sim = cat, sim return best_label results = model("kitchen_scene.jpg") for r in results: for box, cls_id in zip(r.boxes.xyxy, r.boxes.cls): label = r.names[int(cls_id)] mapped_label = classify_object(label)


結果と主な成果

  • 30 FPS でのリアルタイム検出。
  • 一般的な家庭用品の識別精度は 97% です。
  • 「青い本を手に取って」のような自然なやりとりが可能

ループを閉じる – 自然言語による AI フィードバック

さて、ロボットは次のようになります。

  • 指示を理解する(BERT)
  • 目的地までナビゲートします(A / RL)
  • オブジェクトを見つけて操作する (YOLOv8)


ユーザーにどのように応答するかを理解する必要があります。このフィードバック ループはユーザー エクスペリエンスにも役立ちます。これを実現するために、動的応答にGPT ベースのテキスト生成を使用しました。


 from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("EleutherAI/gpt-j-6B") model_gpt = AutoModelForCausalLM.from_pretrained("EleutherAI/gpt-j-6B").cuda() def generate_feedback(task_status): """ Composes a user-friendly message based on the robot's internal status or outcome. """ prompt = (f"You are a helpful home robot. A user gave you a task. Current status: {task_status}.\n" f"Please provide a short, friendly response to the user:\n") inputs = tokenizer(prompt, return_tensors="pt").to("cuda") outputs = model_gpt.generate(**inputs, max_length=60, do_sample=True, temperature=0.7) response_text = tokenizer.decode(outputs[0], skip_special_tokens=True) return response_text.split("\n")[-1] print(generate_feedback("I have arrived at the kitchen. I see a red cup."))


結果と主な成果

  • 適応型 AI フィードバックによりユーザー エンゲージメントが向上しました。
  • テストユーザーの98%が、応答が自然だと感じた。
  • タスク完了率が35%向上

結論

高度な NLP、堅牢な経路計画、リアルタイムの物体検出、生成言語の相乗効果により、協働ロボットの新たな領域が開かれました。当社のエージェントは、微妙なコマンドを解釈し、動的な環境をナビゲートし、驚くほど正確に物体を識別し、自然に感じられる応答を返すことができます。


これらのロボットは、単純なタスクの実行を超えて、明確な質問をしたり、行動を説明したり、即座に適応したりしながら、真の双方向のコミュニケーションを行います。これは、機械が単なるサービス以上のものを提供する未来を垣間見るものです。機械は、私たちの日常生活の中で真のパートナーとして協力し、学習し、会話するのです。

いくつかのテクニックに関するさらなる情報