27. 말로 걷게 하기 — 로봇은 다 알아들었고, 말귀가 병목이었습니다

시즌 1~2에서 G1은 걷고, 돌고, 밀려도 버티고, 계단을 올랐습니다. 시즌 3에서는 로봇 팔이 말을 알아듣고 큐브를 옮겼습니다. 이 편은 둘을 잇습니다. “천천히 가면서 왼쪽으로 크게 돌아” 같은 말을 G1에게 하면 그대로 걷게 만드는 것입니다. 보행 정책은 하나도 고치지 않았습니다. 사이에 말을 숫자로 바꾸는 얇은 층 하나만 끼웠습니다.


로봇이 알아듣는 말은 숫자 세 개입니다

8편에서 G1에게 방향 전환을 가르칠 때, 보행 정책이 받는 명령은 숫자 세 개였습니다. 16편에서 빠르게 걷게 한 정책 g1-fast도 같은 명령을 받습니다. 이 편에서도 이 정책을 그대로 씁니다.

명령 뜻 g1-fast가 배운 범위
vx 앞으로 가는 속도 0 ~ 1.2 m/s (뒤로는 못 갑니다)
vy 옆으로 가는 속도, 왼쪽이 + −0.2 ~ 0.2 m/s
wz 도는 속도, 왼쪽(시계 반대 방향)이 + −0.6 ~ 0.6 rad/s

그러니 “말로 걷게 한다”는 “문장을 이 세 숫자로 바꾼다”와 같습니다. 바꾸는 층을 변환기라고 부르겠습니다. 변환기가 내놓은 숫자는 마지막에 정책이 배운 범위 안으로 잘라서 넣습니다. “시속 50킬로로 달려”라고 해도 1.2m/s로 뛰는 식입니다.

변환기 세 개

규칙 기반. 대조군입니다. “천천히”면 0.3, “빨리”면 0.9, “왼쪽”과 “돌아”가 같이 있으면 회전 +0.4처럼 낱말과 숫자를 짝지은 규칙 목록입니다. “초속 0.8미터”, “시속 3킬로”, “1초에 30도” 같은 숫자는 정규식(글자 패턴을 찾는 규칙)으로 읽고, “왼쪽 말고 오른쪽”처럼 부정한 쪽은 버립니다.

로컬 언어 모델 둘. Alibaba의 qwen3 8B와 14B를 ollama(언어 모델을 내 PC에서 돌려 주는 프로그램)로 돌렸습니다. 8B, 14B는 모델 크기 (파라미터 80억, 140억 개)입니다. 모델에게는 위 표의 뜻과 범위, 그리고 “보통 걸음은 0.5”, “돌기는 vy가 아니다”, “A 말고 B는 B만 따른다” 같은 안내를 한 문단으로 줍니다. 답은 vx, vy, wz 세 칸짜리 JSON(이름과 값을 짝지어 적는 정해진 글 형식)으로만 하게 강제합니다. 답의 무작위성을 정하는 값인 온도는 0으로 둡니다. 문장 하나 해석에 8B는 0.6초, 14B는 0.8초가 걸렸습니다.

조정 문장과 보류 문장

채점할 문장을 30개 만들었습니다. 기본 명령, 두 가지를 섞은 명령, 숫자와 단위가 든 명령, “말고”로 고쳐 말하는 명령, 영어와 “뒤로 가”처럼 할 수 없는 명령까지 다섯 갈래입니다. 문장마다 성분별로 정답 범위를 정했습니다. 예를 들어 “천천히”는 vx 0.15~0.45, 말하지 않은 성분은 0 근처(±0.05)입니다. 세 성분이 모두 범위 안이어야 맞은 것으로 칩니다. 판정선은 계획서에 미리 적어 둔 대로 30개 중 27개입니다.

그런데 규칙 목록과 모델 안내문을 모두 이 30문장을 보면서 다듬었습니다. 그러면 점수가 부풀 수밖에 없습니다. 그래서 두 변환기를 다 고친 뒤에 새 문장 30개를 따로 썼습니다. “느릿느릿 걸어가”, “좌회전”, “그만 걸어”, “뒷걸음질 쳐”, “step to the right”처럼 뜻은 비슷해도 말은 다르게 했습니다. 이 문장들을 보고는 변환기를 고치지 않았습니다. 앞의 30개를 조정 문장, 뒤의 30개를 보류 문장이라고 부르겠습니다. 판정은 보류 문장으로 합니다.

조정 문장과 보류 문장에서의 해석 점수. 규칙 기반은 조정 문장에서 만점이지만 새 문장에서 16으로 무너지고, qwen3 14B만 판정선에 닿습니다

변환기 조정 문장 보류 문장
규칙 기반 30/30 16/30
qwen3 8B 24~25/30 21/30
qwen3 14B 29/30 27/30

규칙 기반은 외웠습니다. 조정 문장 30개를 보고 짰으니 만점은 당연합니다. 새 문장에서는 절반 가까이 틀렸습니다. “좌회전”에는 “왼쪽”도 “돌아”도 없어서 회전을 못 읽고, “그만 걸어”는 “걸”이 들어 있어서 오히려 걷습니다. 규칙은 쓴 사람이 떠올린 말만 압니다.

8B는 틀리는 방식이 일정합니다. “왼쪽으로 돌면서 앞으로 걸어”에 옆 속도를 끼워 넣습니다. 돌라는 말을 옆으로 가라는 말로도 읽는 것입니다. “좌회전”을 오른쪽 회전으로 바꾸는 식의 좌우 부호 실수도 여러 번 했습니다. 안내문에 “돌기는 vy가 아니다”, “왼쪽이 +”라고 적어 두었는데도 그렇습니다.

14B는 판정선에 딱 닿았습니다. 틀린 세 문장은 이렇습니다.

  • “걸으면서 오른쪽으로 방향을 바꿔”를 제자리 회전으로 읽었습니다. “걸으면서”를 놓쳤습니다.
  • “빨리 걸으면서 왼쪽으로 조금 틀어”를 옆걸음으로 읽었습니다. 8B와 같은 종류의 실수입니다.
  • “서지 말고 계속 걸어”를 멈춤으로 읽었습니다. “말고”의 부정을 놓쳤습니다.

하나 더 적어 둡니다. 온도를 0으로, 난수 씨앗까지 고정했는데도 8B는 같은 조정 문장을 두 번 돌려 24와 25가 나왔습니다. “strafe left”의 부호가 한 번은 맞고 한 번은 틀렸습니다. 한 번 돌린 점수를 그대로 믿으면 안 되는 것은 26편의 평가 씨앗과 같습니다.

실제로 걸려 봤습니다

해석이 맞아도 로봇이 그렇게 걷지 않으면 소용이 없습니다. 보류 문장 30개를 G1 30대에 하나씩 맡겨 동시에 8초씩 걷게 했습니다. 앞 3초는 속도가 붙는 구간이라 버리고, 3~8초의 평균 속도를 몸통 기준으로 쟀습니다. 명령은 두 벌을 넣었습니다.

  • 정답 명령: 문장마다 정답 범위의 가운데 값입니다. 해석이 완벽할 때 보행 정책이 따라오는지를 봅니다.
  • 14B 해석 명령: 문장부터 걸음까지 전체를 봅니다.

“명령 추종”은 실제 속도가 명령에서 vx 0.15, vy 0.08, wz 0.15 안에 들어온 것입니다. “문장대로 걸음”은 실제 속도가 그 문장의 정답 범위(성분마다 0.1씩 여유) 안에 들어온 것입니다.

넣은 명령 명령 추종 문장대로 걸음 넘어짐
정답 명령 30/30 30/30 0
qwen3 14B 해석 30/30 27/30 0

보행 정책은 모든 명령을 따랐고 한 번도 넘어지지 않았습니다. 정답 명령을 넣으면 문장대로 30개를 다 걷습니다. 그러니 14B로 틀린 3개는 전부 해석 쪽 실수입니다. 로봇은 다 알아들었고, 병목은 말귀였습니다.

qwen3 14B가 해석한 명령으로 걸린 결과. 전진은 명령대로 따라가고, 회전은 제자리에서 오른쪽으로 돌 때만 모자랍니다

재다 보니 예상하지 못한 것이 하나 나왔습니다. 제자리에서 오른쪽으로 돌 때만 느립니다.

회전 명령 실제 비율
제자리 왼쪽 (“좌회전”, 14B 해석) +0.40 +0.36 89%
제자리 오른쪽 (“우회전 해”, 14B 해석) −0.40 −0.26 64%
걸으면서 왼쪽 (“turn left while walking”, 정답 명령) +0.42 +0.37 86%
걸으면서 오른쪽 (“걸으면서 오른쪽으로 방향을 바꿔”, 정답 명령) −0.42 −0.38 90%

걸으면서 돌 때는 좌우가 비슷합니다. 제자리에서만 오른쪽이 3분의 2에 그칩니다. “초당 20도로 오른쪽으로 돌아”도 −0.35를 명령했는데 −0.22만 돌았습니다. 오른쪽으로 옆걸음을 칠 때는 몸이 왼쪽으로 초당 0.08rad쯤 조금씩 돌아가기도 합니다. 전부 추종 허용 오차 안이라 판정에는 영향이 없습니다. 하지만 12편에서 대칭 보상을 넣어 절뚝임을 고친 정책에 이런 좌우 차이가 남아 있다는 뜻입니다. 짚이는 곳은 있습니다. 13편에서 회전 명령이 클수록 대칭 벌점을 줄이도록 바꿨습니다. 회전 0.4rad/s에서는 벌점이 5분의 1로 줄고, 0.5 이상에서는 아예 없습니다. 도는 속도를 따르라는 보상은 좌우 모두 채점하지만, 돌 때 좌우를 똑같이 움직이라는 압력은 약해지는 셈입니다. 원인은 아직 확인하지 않았습니다.

말로 조종해 보기

마지막으로 아홉 문장을 차례로 말해 36초 동안 조종했습니다. 문장 하나에 4초씩 걷습니다. 화면 위에는 말한 문장과 14B가 해석한 숫자가, 오른쪽 아래에는 위에서 본 발자취가 나옵니다. 해석은 미리 골라 둔 값이 아니라 녹화하는 동안 14B가 그 자리에서 한 것입니다. 아홉 문장 모두 맞게 해석했고, 한 번도 넘어지지 않았습니다.

말로 조종하는 G1.

전체 영상:

세 번째 문장

아직 남은 과제

  • 명령 하나에 동작 하나입니다. “3초 걷다가 멈춰”, “저 문까지 가”처럼 순서나 목표가 있는 말은 아직 못 합니다. 목표가 있는 말은 로봇이 어디에 있는지 보는 눈이 있어야 합니다.
  • 14B는 “걸으면서”, “말고” 같은 말을 가끔 흘립니다. 보류 문장 27/30은 판정선에 딱 닿은 점수라, 문장을 바꿔 다시 재면 판정선 아래로 내려갈 수도 있습니다.
  • 제자리 오른쪽 회전이 느린 이유는 아직 모릅니다. 좌우를 따로 재는 시험을 보행 평가에 넣어야 합니다.
  • 정답 범위는 제가 정했습니다. “빨리”가 0.7인지 0.9인지는 사람마다 다릅니다. 범위를 넉넉히 잡았지만, 채점 기준 자체가 한 사람의 감각입니다.

이번 편에서 남은 것

  • 보행 정책이 숫자 세 개를 받으니, 말로 조종하려면 말을 그 숫자로 바꾸기만 하면 됩니다. 정책은 하나도 고치지 않았습니다.
  • 변환기를 다듬을 때 본 문장으로 채점하면 점수가 부풉니다. 규칙 기반은 그 문장에서 만점, 새 문장에서 16이었습니다.
  • 작은 언어 모델은 좌우 부호와 “돌기”와 “옆걸음”을 헷갈립니다. 14B는 보류 문장 27/30으로 판정선에 닿았습니다.
  • 정답 명령과 해석 명령을 따로 걸려 보면 실수가 어느 쪽인지 갈립니다. 이번에는 전부 말귀 쪽이었습니다.
  • 재다 보면 찾던 것 말고도 나옵니다. 제자리 오른쪽 회전이 명령의 64%, 왼쪽이 89%라는 것은 이번에 처음 알았습니다.

시즌 1의 다리와 시즌 3의 말귀가 이렇게 한 로봇에서 만났습니다. 로봇은 시키는 대로 걷습니다. 다만 오른쪽으로 제자리에서 돌 때는 조금 느긋하게요.


이 시리즈의 전체 글 목록 → 시리즈 목차

댓글 남기기

이 사이트는 Akismet을 사용하여 스팸을 줄입니다. 댓글 데이터가 어떻게 처리되는지 알아보세요.