시속 160km로 신뢰할 수 있는 AI 구축

1. 개요

인공지능은 이제 많은 소프트웨어 시스템의 일부가 되었지만, AI 애플리케이션을 빌드하는 것은 사용자가 신뢰할 수 있는 애플리케이션을 빌드하는 것과 같지 않습니다. 실제 환경에서는 단순히 대답을 생성하는 것만이 문제가 아닙니다. 문제는 시기적절하고, 그라운딩되고, 실행 가능하며, 인간의 전문성과 일치하는 대답을 생성하는 것입니다.

이 Codelab에서는 이러한 아이디어를 구체적이고 흥미로운 방식으로 보여주는 레이싱 코치 시뮬레이터를 빌드합니다. 이 애플리케이션은 가상 레이싱 카의 원격 분석을 사용하여 트랙 주변의 움직임을 애니메이션으로 표시하고 코칭 안내를 생성합니다. 레이싱이 시나리오이지만 신뢰가 중요한 의료, 제조, 물류 및 기타 도메인에도 동일한 아키텍처 아이디어가 적용됩니다.

텔레메트리 데이터의 고속 스트림을 처리하고, AI 추론에 유용하고 효율적인 형태로 변환하고, LLM 기반 출력과 인코딩된 인간의 안내를 결합하여 더 신뢰할 수 있는 대답을 생성합니다.

빌드 대상

이 Codelab에서는 다음을 수행하는 신뢰할 수 있는 AI 프로토타입을 빌드합니다.

  • Google Cloud에서 실행되는 가상 레이싱카의 원격 분석 스트리밍
  • Chrome을 사용하여 레이스트랙을 이동하는 자동차를 시각화
  • 원시 원격 분석을 AI 지원 입력으로 변환
  • Google Gemini 기반 전략 레이어 적용
  • 모델 출력과 인코딩된 인간의 안내 및 안전 규칙 결합
  • 사용자 대상 인터페이스를 통해 코칭 피드백 제공

학습할 내용

이 Codelab을 마치면 다음을 할 수 있습니다.

  • AI 시스템을 더 신뢰할 수 있게 만드는 요소 설명
  • 모듈식 AI 아키텍처의 목적 설명
  • 간단한 시뮬레이션된 원격 분석 파이프라인 만들기
  • LLM에서 사용할 유용한 구조화된 데이터 준비
  • 가드레일 및 사람 주도 규칙을 적용하여 신뢰도 개선
  • 이 아키텍처를 다른 도메인에 적용할 수 있는 방법 평가

2. 필요한 항목

시작하기 전에 필요한 계정, 도구, 서비스가 준비되어 있는지 확인하세요.

기본 요건

다음과 같은 준비가 되어 있어야 합니다.

  • Gmail 주소를 사용하는 개인 Google 계정
  • Google Cloud 액세스 권한 및 CLI에 대한 기본적인 이해
  • 활성 결제 계정 또는 클라우드 크레딧
  • Google Cloud 및 Gemini를 사용한 생성형 AI에 대한 개략적인 이해

Gemini는 최첨단 추론을 기반으로 구축된 Google의 AI 모델로, 어떤 아이디어든 실현할 수 있습니다. 멀티모달 이해, 에이전트형 코딩, 바이브 코딩에 적합한 모델입니다.

Gemini

Google Cloud 사용을 위한 크레딧 획득

크레딧을 사용하려면 이 링크를 방문하여 Gmail 이메일 주소 (gmail.com 도메인)로 로그인하세요. 그런 다음 Google Cloud Platform (GCP) 결제 계정에서 크레딧을 수락하면 계정에 적용됩니다.

3. 신뢰할 수 있는 AI가 중요한 이유

많은 AI 시스템이 유창하고 설득력 있는 대답을 생성할 수 있지만 유창함이 신뢰할 수 있다는 의미는 아닙니다. 실제 시스템에서 사용자는 안전 규칙에 의해 제한되고 도메인 전문 지식에 의해 형성된 근거 있는 적시의 응답을 필요로 하는 경우가 많습니다.

이는 시스템이 빠르게 변화하는 데이터를 처리할 때 특히 중요합니다. 너무 늦게 도착한 대답은 쓸모없을 수 있습니다. 자신감 있는 것처럼 들리지만 중요한 맥락을 무시하는 대답은 오해를 불러일으킬 수 있습니다. 인간의 전문성과 관련이 없는 대답은 아무리 세련되게 들리더라도 신뢰하기 어려울 수 있습니다.

이 Codelab에서 사용된 레이싱 자동차 시나리오에서 문제는 AI가 흥미로운 말을 할 수 있는지 여부가 아닙니다. 문제는 시스템이 유용하고 안전하며 시기적절하고 상황에 적합한 조언을 제공할 수 있는지입니다.

작은 원격 분석 샘플을 살펴보고 가능한 두 가지 출력을 비교해 보겠습니다.

Racing Car Telemetry Data
{
   "speedMph": 118,
   "throttle": 91,
   "frontGrip": "nominal",
   "rearGrip": "low",
   "trackPosition": "Turn 1 Entry"
}

순진한 AI 대답

"Stay aggressive on the throttle and carry your speed into Turn 1"

신뢰 기반 대답

"Rear grip is low at Turn 1 entry. Reduce your throttle slightly and prioritize a stable corner entry"

차이점을 확인하셨나요?

단순한 AI 대답에만 의존하면 어떻게 될까요?

첫 번째 대답은 자신감 있는 것처럼 들리지만 위험을 무시합니다. 두 번째 대답은 맥락과 제약 조건을 반영하므로 더 유용합니다.

LLM을 전체 시스템으로 취급하는 대신 신뢰성을 높이기 위해 더 광범위한 아키텍처의 한 부분으로 취급해야 합니다. 또한 레이싱카, 의료 절차, 항공, 전력망, 거래 시스템, 해상 항해 등 조치를 취할 수 있을 만큼 빠른 조언이 필요한 애플리케이션도 많습니다.

이제 이러한 아키텍처를 만드는 방법을 알아보겠습니다.

4. 고속 AI 및 모듈식 신뢰할 수 있는 아키텍처 이해

일부 AI 시스템에는 매우 다른 종류의 동작이 필요합니다. 변화하는 조건에 신속하게 대응해야 하며, 더 느리고 신중한 추론도 지원해야 합니다.

모듈식 아키텍처는 이러한 책임을 별도의 경로로 분리합니다. 한 경로는 수신 신호의 즉각적이고 시간에 민감한 해석을 처리할 수 있습니다. 다른 경로는 전략에 중점을 두어 더 높은 수준의 추론과 더 맥락에 맞는 의사 결정을 지원할 수 있습니다. 다른 경로에서는 다른 유형의 기능을 타겟팅합니다.

아키텍처 다이어그램

일부 결정은 실시간으로 이루어져야 합니다. 일부 결정은 더 긴 사고를 통해 이점을 얻을 수 있습니다.

신뢰할 수 있는 AI에는 둘 다 필요한 경우가 많습니다.

이러한 아키텍처 분리를 통해 시스템은 응답성을 유지하면서도 더 풍부한 AI 기반 안내를 지원할 수 있습니다. 또한 사람이 안내하는 제약 조건과 도메인 지식을 도입할 명확한 위치를 만듭니다.

이 작은 프로그램에는 Python 함수로 구현된 반사 경로와 전략 경로가 있습니다.

const telemetry = {
  speed: 147,
  grip: 0.68,
  corner_type: "sharp",
  lap_trend: "entering_corners_too_fast",
};

function reflexPath(event: typeof telemetry): string {
  if (event.grip < 0.70) {
    return "REFLEX: Reduce throttle now";
  }
  return "REFLEX: No urgent issue";
}

function strategyPath(event: typeof telemetry): string {
  if (event.lap_trend === "entering_corners_too_fast") {
    return "STRATEGY: Brake earlier and prioritize corner exit";
  }
  return "STRATEGY: Driving pattern looks stable";
}

console.log(reflexPath(telemetry));
console.log(strategyPath(telemetry));

두 함수는 동일한 원격 분석 데이터가 주어지면 다르게 작동합니다. 리플렉스 기능은 즉각적인 경고입니다. 전략 기능은 규칙에 따라 코칭 조언을 제공합니다.

이 로직을 분리하는 것이 유용하다고 생각하는 이유는 무엇인가요?

이제 재미있는 멀티 파트 애플리케이션을 빌드하고 이 아키텍처가 빠른 반응과 심층적인 추론을 실제로 경험할 수 있는 신뢰할 수 있는 AI 시스템으로 어떻게 전환되는지 살펴보겠습니다.

5. 원격 분석 스트리밍 서버 빌드

이제 아키텍처 목표를 이해했으므로 애플리케이션을 구동하는 데이터 파이프라인을 빌드할 차례입니다.

이 섹션에서는 가상 레이싱카를 위한 간단한 원격 분석 스트림을 만듭니다. 데이터는 GPS 또는 트랙 위치 데이터가 포함된 CSV 소스에서 가져오며, 애플리케이션은 이를 UI와 AI 레이어가 사용할 수 있는 라이브 스트림으로 변환합니다.

이 섹션에서 수행할 작업은 다음과 같습니다.

  • 스트리밍 서버 및 애플리케이션을 위한 Google Cloud에 새 프로젝트 만들기
  • 원격 분석 데이터를 내보내는 소규모 서버 만들기
  • 이러한 이벤트를 브라우저 UI 또는 콘솔로 스트리밍

1. Cloud Shell 열기

A. Google Cloud 콘솔로 이동합니다.
B. 이 Codelab의 새 프로젝트를 만듭니다. 상단의 프로젝트 드롭다운 메뉴를 클릭합니다.

Google Cloud Console

프로젝트를 만들 때 결제 계정을 연결하는 것이 좋습니다.
결제 계정 연결

프로젝트를 이미 만든 경우 왼쪽 패널을 열고 Billing를 클릭하여 결제 계정이 이 GCP 계정에 연결되어 있는지 확인할 수 있습니다.

C. Gemini API 키 얻기

Google Cloud 크레딧을 사용 설정한 후 Google Cloud에서 Gemini에 액세스하려면 Gemini API 키가 필요합니다.

Gemini API 키를 만들려면 Google Vertex AI Studio를 사용하여 키를 생성해야 합니다.

Vertex AI Studio에서 왼쪽 하단의 '문서' 위에 있는 'API 키 가져오기'를 클릭합니다. Gemini용 API 키를 만듭니다 (무작위로 보이는 긴 문자열). 이 키를 안전한 위치에 저장합니다. 6단계 '레이싱 자동차 시뮬레이터 빌드'에서 이 API 키를 사용하여 Google Cloud의 Gemini에 대한 액세스를 인증합니다.

D. 상단 바에서 Cloud Shell 아이콘 (터미널 아이콘)을 클릭하여 브라우저 기반 터미널을 엽니다.
Cloud Shell

E. 터미널 세션이 시작될 때까지 기다립니다.

터미널 세션

2. 코드 가져오기

마스터 저장소를 클론합니다.

git clone https://github.com/ocupop/trustable-ai-codelab.git
cd trustable-ai-codelab

이 저장소에는 'koru-application' (웹 애플리케이션)과 'streaming-telemetry-server' (시뮬레이션된 실시간 레이스카 텔레메트리)라는 두 개의 폴더가 있습니다. 이 단계에서는 'streaming-telemetry-server'를 설명합니다. 다음 단계에서는 'koru-application'을 사용합니다.

3. 필요한 API 사용 설정

프로젝트당 한 번 실행합니다.

# Set Project ID
gcloud config set project YOUR_PROJECT_ID
# Enable APIs
gcloud services enable \
  run.googleapis.com \
  cloudbuild.googleapis.com \
  artifactregistry.googleapis.com

YOUR_PROJECT_ID를 실제 프로젝트 ID로 바꿉니다 (프로젝트가 이미 설정된 경우 첫 번째 줄은 건너뛰어도 됨).

프로젝트 목록에서 YOUR_PROJECT_ID를 확인할 수 있습니다.

터미널 세션

4. Cloud Run에 백엔드 배포

저장소 루트에서 다음을 실행합니다 (즉, trustable-ai-codelab 폴더에 있는지 확인).

gcloud run deploy streaming-telemetry-server \
  --source streaming-telemetry-server \
  --platform managed \
  --region us-central1 \
  --allow-unauthenticated

메시지가 표시되면 'Y'를 눌러야 할 수도 있습니다.

  • 처음 실행하면 API를 사용 설정하거나 Artifact Registry 저장소를 만들라는 메시지가 표시될 수 있습니다. 필요에 따라 수락하세요.
  • us-central1 이외의 리전을 사용하는 경우 --region을 사용하여 해당 리전을 지정합니다.
  • 배포가 완료되면 gcloud가 service-URL을 출력합니다. 이 URL을 원격 분석 서버의 전체 엔드포인트로 사용하려면 이 URL에 'events'를 추가하면 됩니다.

5. 스트림 URL 사용

이제 원격 분석 서버는 다음과 같은 형식의 엔드포인트에서 서버 전송 이벤트 (SSE)를 사용하여 시뮬레이션된 원격 분석 데이터를 내보냅니다.

service-URL/events		// service-URL - the last line displayed by "deploy"

브라우저에서 테스트: Chrome을 사용하여 이 스트림 엔드포인트 URL을 방문합니다. 브라우저에 스트리밍되는 데이터가 표시됩니다. 이는 레이싱 자동차의 센서에서 방출되는 데이터를 시뮬레이션한 것입니다.

브라우저 탭의 스트림 엔드포인트 출력

브라우저 탭을 닫아 연결을 종료할 수 있습니다.

curl로 테스트:

이제 셸 명령줄에서 테스트해 보겠습니다.

curl -N service-URL/events		# Replace service-URL with actual deployment endpoint

클라우드 셸 창에 스트리밍된 수신 데이터가 표시됩니다.

셸 명령줄을 통한 스트리밍 엔드포인트의 출력

이 원격 분석 데이터를 사용하여 레이싱카의 센서에서 방출되는 데이터를 시뮬레이션합니다. Codelab의 나머지 부분에서는 이 데이터를 사용합니다. 터미널 창에서 CTRL-C를 입력하여 curl 프로그램을 종료할 수 있습니다.

알아두어야 할 사항

이 섹션을 작성할 때는 수신 데이터의 특성에 유의하세요. 원시 원격 분석은 양이 많고 시간에 민감하며 AI 추론에 즉시 적합하지 않은 경우가 많습니다. 프런트엔드 애플리케이션을 빌드한 후에는 LLM이 빠르게 처리할 수 있는 효율적인 형식으로 원시 데이터를 필터링해야 합니다.

먼저 데이터를 시각화하는 웹 프런트엔드를 빌드해 보겠습니다.

6. 레이싱 자동차 시뮬레이터 빌드

이 섹션에서 수행할 작업은 다음과 같습니다.

  • 레이싱 자동차 시뮬레이션 빌드
  • 원격 분석 서버를 레이싱카 웹 애플리케이션에 연결
  • 시뮬레이션된 레이스 보기

이제 클라우드에서 실행되는 레이싱 자동차의 원격 분석 시뮬레이션이 작동합니다. 이제 로컬 머신에서 실행되고 Google Cloud에 연결되며 데이터를 시각화하는 애플리케이션을 빌드해 보겠습니다.

Google의 신뢰할 수 있는 AI 애플리케이션은 Google Cloud 서비스의 강력한 기능과 유연성, Chrome에서 실행되는 로컬 인텔리전스를 모두 사용합니다.

스트리밍 원격 분석 서비스는 Google Cloud에서 실행되지만 레이싱 자동차 애플리케이션은 로컬 머신에서 실행됩니다. 즉, 이번에는 노트북이나 데스크톱 컴퓨터에 저장소를 다시 클론해야 합니다.

간단하게 하기 위해 동일한 저장소에 스트리밍 서버와 레이싱카 애플리케이션의 코드가 모두 포함되어 있습니다.

GitHub에서 프런트엔드 애플리케이션을 클론합니다.

git clone https://github.com/ocupop/trustable-ai-codelab.git
cd trustable-ai-codelab

노트북이나 데스크톱에 저장소를 클론한 후 애플리케이션을 실행해 보겠습니다.

cd koru-application		# racing car simulation app
npm install
npm run dev

VITE

Chrome에서 로컬 머신의 포트 (위 예와 같이 http://localhost:5173)를 엽니다. 'AI Motorsport Coaching' 애플리케이션의 방문 페이지가 표시됩니다.

나만의 코치

'대시보드 열기 ->' 버튼을 클릭합니다. 그러면 애플리케이션의 UI가 시작됩니다.

Koru 대시보드

이제 Google Cloud에서 시뮬레이션된 레이싱카 원격 분석을 생성하는 원격 분석 서버와 해당 데이터를 시각화하고 LLM에 연결할 수 있는 로컬 웹 애플리케이션이 있습니다. 이러한 서비스를 연결하고 Gemini LLM 서비스에도 연결해 보겠습니다.

애플리케이션의 오른쪽 상단에서 톱니바퀴 아이콘 (설정)을 클릭합니다.

Koru 설정

2단계에서 생성한 Gemini API 키를 입력합니다. 이렇게 하면 Google Cloud의 Gemini 서비스에 액세스할 수 있습니다.

애플리케이션이 API 키를 기억하도록 '저장'을 클릭합니다.

이제 애플리케이션을 원격 분석 서버에 연결해 보겠습니다. 애플리케이션 대시보드에서 '실시간 세션'을 클릭합니다.

Koru SSE 스트림 입력

'SSE URL or .txt file path'이라고 표시된 텍스트 필드에 클라우드 기반 원격 분석 서버의 특정 URL (5단계)을 입력합니다. Google SSE URL은 다음과 같은 형식이었습니다.

https://streaming-telemetry-server-${PROJECT_NUMBER}.${REGION}.run.app/events

원격 분석 서버 엔드포인트 URL을 입력한 후 텍스트 필드 오른쪽에 있는 '연결'을 클릭합니다. URL 끝에 'events'를 잊지 마세요.

이제 시뮬레이션된 데이터를 시각화하는 애플리케이션이 표시됩니다.

스피커 볼륨을 높이면 다양한 유형의 코치로부터 자동차 경주 관련 조언을 들을 수 있습니다. 코치마다 성격이 다릅니다. 다양한 코치를 선택하여 다양한 레이스 조언과 음성 스타일을 확인해 보세요. 필요한 경우 스피커 아이콘을 클릭하여 오디오를 사용 중지할 수 있습니다.

실행 중인 애플리케이션의 예

이제 작동하는 애플리케이션이 있으므로 LLM의 효율적인 처리를 위해 데이터를 준비한 방법과 전체 시스템의 신뢰성을 높이기 위해 추가 기능을 추가하는 방법을 살펴보겠습니다.

7. AI 추론을 위한 원격 분석 준비

원시 원격 분석은 시뮬레이션에 유용하지만 일반적으로 너무 상세하고 너무 자주 전송되어 LLM에 직접 전송하기에는 적합하지 않습니다. 모든 원격 분석 데이터를 변경하지 않고 전송하면 지연 시간이 늘어나고 노이즈가 발생하며 결과 안내의 품질이 저하될 수 있습니다.

이 섹션에서는 원격 분석을 더 유용한 형태로 리셰이핑합니다.

이 섹션에서 수행할 작업은 다음과 같습니다.

  • 원시 원격 분석 JSON 검사
  • 추론과 가장 관련성이 높은 필드 식별
  • 데이터 필터링 또는 요약
  • 불필요한 세부정보 줄이기
  • 운전 상태의 AI 친화적 표현 준비

이는 신뢰할 수 있는 AI를 구축하는 데 중요한 단계입니다. 대답의 품질은 모델뿐만 아니라 모델이 수신하는 데이터의 구조와 관련성에도 따라 달라집니다.

이제 레이싱 자동차의 구체적인 데이터를 살펴보겠습니다. 애플리케이션에서 특정 값을 변경하고 다시 로드한 후 결과를 관찰하여 실험할 수 있습니다.

../src/services/telemetryStreamService.ts near line 180

// Clamp G-forces
gLat = Math.max(-3, Math.min(3, gLat));		// sideways G-force
gLong = Math.max(-3, Math.min(3, gLong));	// front/back G-force

자동차의 G-force는 가속 또는 감속을 측정합니다. 레이싱카에서 G-force를 이해하면 자동차의 핸들링과 전반적인 성능에 도움이 됩니다. 애플리케이션에 이 정보가 없으면 운전자에게 조언을 제공하기 어렵습니다. 이 두 줄을 주석 처리하고 gLatgLong 값을 모두 0.0으로 설정한 후 애플리케이션을 다시 실행합니다.

자동차가 모퉁이에 접근할 때는 조언이 제공되지 않습니다. 레이스 운전자에게는 별로 도움이 되지 않습니다.

그런 다음 변경사항을 실행취소하고 애플리케이션을 다시 실행합니다. 자동차가 모퉁이에 도달하면 유용한 오디오 조언이 표시되나요? G-force 데이터 포인트는 운전자에게 조언을 제공하는 데 중요합니다.

이제 자동차의 속도를 여유로운 속도인 시속 30마일로 인위적으로 제한해 보겠습니다. 이 속도로는 레이스에서 이길 수 없지만, 우리가 받는 코칭의 유형을 확실히 보여줄 수 있습니다.

동일한 파일 (telemetryStreamService.ts)의 158번째 줄 근처에서 processPoint() 함수를 찾습니다. 이 함수에서 속도를 제한합니다.

변경:

private processPoint(point: GpsSSEPoint) {
...
 const speedKmh = point.speed > 200 ? point.speed : point.speed * 3.6;
...

받는사람:

private processPoint(point: GpsSSEPoint) {
...
 let speedKmh = point.speed > 200 ? point.speed : point.speed * 3.6;
 speedKmh = Math.min(speedKmh, 48);   // 48 kmh is approx 30 mph
...

애플리케이션을 다시 실행합니다. 이제 어떤 유형의 코칭 조언을 받을 수 있나요? 여유롭게 운전한다면 많은 것이 필요하지 않습니다.

이제 이러한 변경사항을 되돌리고 애플리케이션을 다시 실행합니다.

자동차의 속도는 분명히 가치 있는 데이터 포인트입니다. 유용한 조언을 제공하는 데 어떤 데이터가 중요한지 파악하는 것이 매우 중요합니다. 관련 없는 데이터를 평가하는 것도 마찬가지로 중요합니다.

여기에서 안전과 신뢰에 대해서도 생각해 봐야 합니다. 잘 준비된 입력을 사용하더라도 신뢰할 수 있는 답변이 보장되지는 않습니다. 여전히 사람의 안내를 받는 규칙과 명시적인 제약 조건을 도입해야 합니다.

데이터 준비는 전처리 단계일 뿐만 아니라 이는 신뢰 전략의 중요한 부분입니다. 입력이 깔끔할수록 더 집중적이고 신뢰할 수 있는 출력이 생성되는 경우가 많습니다.

8. 가이드라인 및 인코딩된 인간 전문성 추가

신뢰할 수 있는 AI 시스템은 모델 출력에만 의존해서는 안 됩니다. 대부분의 경우 가장 신뢰할 수 있는 시스템은 대규모 언어 모델 추론과 명시적 규칙, 도메인 지식, 인간이 안내하는 제약 조건을 결합합니다.

이 섹션에서는 해당 레이어를 추가합니다.

이 레이어를 인코딩된 코칭 지식으로 생각하면 됩니다. 여기에는 시스템이 그라운딩되고 유용하게 유지되도록 지원하는 선호하는 대답 패턴, 검증 규칙, 안전 검사 또는 구조화된 안내가 포함될 수 있습니다.

이 섹션에서 수행할 작업은 다음과 같습니다.

  • 모델 동작을 형성하는 응답 규칙 도입
  • 안전 검사를 적용하여 오해의 소지가 있는 조언 줄이기
  • 인코딩된 인간 전문성을 파이프라인에 통합
  • 이러한 추가 전후의 응답 비교

도메인 전문성이 애플리케이션에 어떻게 추가되는지 살펴보겠습니다.

LLM은 일반적으로 레이싱이나 레이싱카 성능의 물리학에 대해 학습하지 않습니다. 애플리케이션에 도메인 전문성이 포함되어 있다면 사용자는 안내를 더 신뢰할 수 있습니다. 이 안내는 인간의 전문성을 기반으로 한 규칙, 즉 도메인 전문성 레이어에서 제공됩니다.

../src/utils/coachingKnowledge.ts near line 115

...
export const RACING_PHYSICS_KNOWLEDGE = `
CORE PRINCIPLES:
1. **The Friction Circle:** A tire has 100% grip. If you use 100% for braking, you have 0% for turning.
  - *Error:* Turning while 100% braking = Understeer (Plowing).
  - *Fix:* "Trail braking" (releasing brake pressure as steering angle increases).

2. **Weight Transfer:**
  - Braking shifts weight forward (Front grip UP, Rear grip DOWN).
  - Accelerating shifts weight backward (Front grip DOWN, Rear grip UP).
  - *Error:* Lifting off throttle mid-corner shifts weight forward abruptly -> Oversteer (Spin risk).

3. **The racing line:**
...

이러한 레이싱 자동차 원칙은 신뢰할 수 있는 출력을 제공하는 데 중요한 요소입니다. 이러한 전문성이 없다면 어떻게 될까요? 지금부터 알아보겠습니다.

RACING_PHYSICS_KNOWLEDGE를 삭제하고 레이싱 관련 조언을 살펴보겠습니다.

export const RACING_PHYSICS_KNOWLEDGE = ``;

애플리케이션을 다시 실행합니다. 이제 어떤 유형의 코칭 조언을 받을 수 있나요?

일반적인 조언을 확인하세요.

마찰, 무게 이동, 출구 속도 등에 관한 세부정보를 더 이상 확인할 수 없습니다. 이 정보가 없으면 신뢰도가 낮아집니다. 레이싱 전문성을 복원하고 애플리케이션을 다시 실행합니다.

이 단계는 신뢰할 수 있는 AI 시스템의 중요한 측면입니다. 더 강력한 프롬프트로 신뢰가 마법처럼 생성되지는 않습니다. 신뢰는 시스템 설계와 비판적 사고에서 비롯됩니다.

LLM은 솔루션의 일부이지만 전체 솔루션은 아닙니다. 명시적인 인간 지식에 따라 AI 출력이 안내되면 신뢰도가 향상됩니다.

9. 코칭 페르소나 및 사용자 환경 설계

추론 파이프라인이 마련되면 다음 질문은 시스템이 사용자와 어떻게 소통해야 하는지입니다.

이 섹션에서는 전략 레이어가 운전자와 소통하는 방식을 정의하여 코칭 환경을 구성합니다. 코칭 페르소나 중 하나의 시스템 프롬프트를 개선하고 명확하고 시기적절하며 가장 중요한 것은 실행 가능하도록 안내를 제공하는 방법을 고려합니다.

이 섹션에서 수행할 작업은 다음과 같습니다.

  • 코칭 페르소나의 시스템 프롬프트 만들기 또는 개선
  • 다양한 코칭 스타일 실험
  • 프롬프트 변경이 대답에 미치는 영향 관찰
  • 신뢰할 수 있는 의견에 대한 UI 요구사항 정의
  • 긴급 및 긴급하지 않은 메시지에 대한 텍스트 음성 변환 (TTS) 지원 이해하기

애플리케이션에는 여러 코칭 페르소나가 포함되어 있습니다. 각 코치는 서로 다른 유형의 코칭 조언을 제공합니다.

PERSONA

특성

Tony

동기 부여, 감정 기반

레이첼

기술, 물리학 중심

AJ

직접적이고 단도직입적인 명령

Garmin

데이터 중심 델타 최적화

Super AJ

적응형, 오류 유형별로 전환

이러한 페르소나는 ../src/utils/coachingKnowledge.ts 파일에 정의되어 있습니다.

이 파일에는 문자열 키를 CoachPersonas와 연결하는 객체 맵 (COACHES)이 있습니다. CoachPersona에는 각 유형의 코치의 속성이 포함됩니다. 중요한 속성 중 하나는 systemPrompt입니다. 각 페르소나에는 LLM이 대답하는 방식을 안내하는 자체 systemPrompt가 있습니다.

이러한 system prompts 중 하나를 변경하여 LLM이 어떻게 반응하는지 살펴보겠습니다.

31번 줄 근처에 조언이 매우 직설적이고 솔직한 'AJ'의 systemPrompt가 표시됩니다. AJ가 지나치게 공손하도록 systemPrompt를 변경해 보겠습니다.

systemPrompt: `You are AJ, a race engineer that is excessively polite. 
	Use telemtry terminology.  Be actionable
	Examples: 	"Lat G settling. please throttle", 
				"Brake when its convenient."
	Keep responses under 12 words. Never explain  just command.`

애플리케이션을 다시 실행하고 AJ를 코치로 선택하여 생성되는 응답의 유형을 확인합니다.

이제 원래 systemPrompt을 복원하고 애플리케이션을 다시 실행합니다. 시스템 프롬프트는 LLM이 페르소나에 맞는 대답을 제공하도록 안내하는 데 매우 중요합니다.

신뢰는 정확성뿐만 아니라 또한 배송에 관한 내용도 포함됩니다. 기술적으로 정확한 조언이라도 불분명하거나, 시기가 적절하지 않거나, 주의를 산만하게 한다면 효과가 없을 수 있습니다.

신뢰할 수 있는 시스템은 커뮤니케이션이 원활해야 합니다. 사용자 경험은 신뢰 아키텍처의 일부입니다.

10. 엔드 투 엔드 아키텍처 검토

이제 시스템의 주요 부분을 빌드했습니다. 이제 한발 물러서서 이 두 가지가 어떻게 함께 작동하는지 검토할 시간입니다.

이제 애플리케이션에 다음 구성요소가 포함됩니다.

  • 원격 분석 스트림
  • 시각화 레이어
  • AI 지원 데이터 변환 단계
  • 추론 LLM으로 구동되는 전략 구성요소
  • 가드레일 및 인코딩된 인간 안내
  • 사용자 대상 코칭 환경

이러한 구성요소의 전체 흐름을 이해하는 유용하고 간단한 방법은 애플리케이션에 로깅을 추가하는 것입니다.

경로를 통해 흐르는 텔레메트리 데이터를 볼 수 있도록 로깅을 추가합니다.

먼저 원격 분석 데이터를 확인해 보겠습니다. telemetryStreamService.ts에서 212번 줄 근처 (this.emit(frame) 전)에 속도, 횡방향 G-force (측면 가속도), 운전자가 브레이크 페달을 누르는 강도를 표시하는 줄을 추가합니다.

console.log('FRAME', { 
    speed: frame.speed.toFixed(1), 
    gLat: frame.gLat.toFixed(2),
    brake: frame.brake.toFixed(0) }
);

애플리케이션을 새로고침합니다. 애플리케이션을 실행하기 전에 Chrome DevTools에서 콘솔을 열어 이 디버깅 정보를 확인해 보겠습니다.

DevTools 콘솔

애플리케이션에서 원격 분석 엔드포인트를 입력하고 '연결'을 클릭합니다. 이제 수신되는 원격 분석 데이터를 확인할 수 있습니다.

이제 리플렉스 경로와 전략 경로에 로깅을 추가해 보겠습니다.

../src/services/coachingService.ts에서 this.emit() 앞의 71번째 줄 근처에 reflex 경로의 로깅 줄을 추가합니다.

console.log('Reflex', { 
	action: rule.action, 
	text, 
	coach: this.coachId }
);

같은 파일의 287번째 줄 근처에 있는 this.emit() 앞에 strategy 경로에 대한 유사한 로깅 줄을 추가합니다 (Gemini API에서 반환된 코칭 응답 text 추가).

console.log('Strategy', { 
	coach: coach.id, 
	chars: text.length, 
	preview: text.slice(0, 60) }
);

애플리케이션을 다시 실행합니다. 콘솔에서 원본에서 이러한 경로를 통해 원격 분석 데이터가 흐르는 방식을 확인할 수 있습니다. 들어오는 스트림은 필터링되어 LLM으로 전송되고, 신뢰할 수 있는 인간 전문가의 검증을 거쳐 적절한 사용자 인터페이스를 사용하여 사용자에게 표시됩니다.

신뢰할 수 있는 AI라는 더 큰 목표를 달성하기 위해 다양한 기술 구성요소를 연결했습니다. 아키텍처의 가치는 어떤 한 구성요소에만 있는 것이 아닙니다. 이 값은 부분이 서로 강화하는 방식에서 비롯됩니다.

신뢰할 수 있는 AI는 단일 기능이 아닌 아키텍처의 결과입니다.

해체 (서비스 삭제)

더 이상 필요하지 않은 서비스는 삭제해야 합니다. 애플리케이션과 함께 원격 분석 서버 테스트를 완료한 후 Cloud Run 서비스를 삭제하고 요금 청구를 중지해야 합니다.

gcloud run services delete streaming-telemetry-server \
  --region us-central1 \
  --platform managed

필요한 경우 us-central1을 배포 시 사용한 리전으로 바꾸세요. 메시지가 표시되면 확인합니다.

11. 과제

이제 핵심 애플리케이션이 작동하고 다양한 구성요소를 이해했으므로 설계를 확장해 보세요.

추천 챌린지

  • 코칭 로직을 더 많이 에지로 이동
  • 비 또는 감소된 견인력을 지원하도록 시뮬레이션 수정
  • 모델 조정 또는 미세 조정으로 성능을 개선하는 방법 살펴보기
  • 의료, 제조, 물류와 같은 다른 도메인에 맞게 아키텍처를 조정합니다.

예를 들어 이 실습에서 배운 내용을 다른 도메인에 적용할 때는 다음 질문을 고려하세요.

  • 레이싱 원격 분석(즉, 연속 데이터)에 해당하는 다른 분야는 무엇인가요?
  • 어떤 결정은 즉각적으로 내려야 하고 어떤 결정은 더 전략적인가요?
  • 어떤 유형의 인간 전문 지식을 인코딩해야 할까요?
  • 사용자가 시스템을 신뢰할 수 있다고 생각하려면 어떤 정보가 표시되어야 할까요?

이러한 과제를 통해 레이싱 예시를 넘어 이 Codelab의 신뢰성 뒤에 있는 더 광범위한 설계 패턴을 인식할 수 있습니다.

12. 마무리 및 다음 단계

이 Codelab에서는 레이싱 데모 이상의 것을 빌드했습니다. 신뢰할 수 있는 AI 시스템을 설계하는 방법에 관한 구체적인 예를 제시했습니다.

원시 원격 분석으로 시작하여 LLM에 유용한 형식으로 변환하고, AI 추론을 적용하고, 인코딩된 인간의 안내와 응답 제약 조건으로 출력을 강화했습니다. 이 과정에서 신뢰는 모델 출력만이 아니라 아키텍처에서 비롯된다는 것을 알게 되었습니다.

신뢰할 수 있는 AI 시스템은 다음을 결합하는 경우가 많습니다.

  • 구조화된 실시간 데이터
  • 모델 기반 추론
  • 인코딩된 도메인 전문성
  • 명시적 가드레일
  • 세심한 사용자 환경 디자인

레이싱 시나리오를 통해 이러한 아이디어를 구체화할 수 있었지만, AI 추천이 적시에 제공되고 실행 가능하며 신뢰할 수 있어야 하는 모든 곳에서 동일한 접근 방식을 사용할 수 있습니다.

결승선