스마트 홈 어시스턴트 데모
데모 코드: TypeSafe를 사용해 사용자 요청을 평가하는 스마트 홈 어시스턴트입니다.
실제 동작 확인하기
작동 방식
투기적 팬아웃
여기서 시연하는 핵심 패턴은 투기적 팬아웃입니다. 각 사용자 요청은 긴 질문 목록에 대해 평가되며, 그중 상당수는 대부분의 요청에서 결국 무관하게 됩니다.
다음 사용자 요청을 생각해 봅시다:
“집 안의 모든 조명을 꺼줘”
이것은 매우 단순한 요청이며, 우리 코드는 다음 질문들의 답변만 고려하면 됩니다:
- “이 요청은 어떤 범주입니까?” (스마트홈 명령)
- “이 요청은 어느 도메인을 대상으로 합니까?” (집 전체)
- “이 요청은 어떤 유형의 기기를 대상으로 합니까?” (조명)
- “조명에 어떤 조치를 취해야 합니까?” (끄기)
마지막 질문은 사용자가 조명에 명령을 내린다고 가정하고 작성되었으며, 사용자가 실제로 무엇을 요청하는지 알기 전에 이 질문을 던진다는 점에 주목하십시오. 이것이 바로 “추측 질문”입니다. 관련이 있는지조차 알기 전에 질문을 던짐으로써 모든 질문을 병렬로 평가하고, 나중에 무관한 결과를 코드로 걸러낼 수 있습니다. 이것은 하나의 질문 집합으로 다양한 사용자 요청을 처리할 수 있는 시스템을 구축하는 핵심 패턴입니다.
잘못된 방식: 순차적 API 호출
잘못된 방식은 질문을 여러 API 호출로 나누어, 답변이 확실히 필요해진 뒤에야 질문을 던지는 것입니다:
- “이 요청은 어떤 범주입니까?” (스마트홈 명령)
그다음, 스마트홈 명령임을 안 뒤에만:
- “이 요청은 어느 도메인을 대상으로 합니까?” (집 전체)
- “이 요청은 어떤 유형의 기기를 대상으로 합니까?” (조명)
그다음, 조명을 대상으로 함을 안 뒤에만:
- “조명에 어떤 조치를 취해야 합니까?” (끄기)
이 접근 방식은 질문 수를 최소화하는 데 최적화되어 있지만, 모든 질문을 한 번의 선제적 API 호출에 배칭하는 것보다 훨씬 느리고 비쌉니다.
TypeSafe와 LLM 페어링
이 데모는 때때로 문자열 생성 단계가 필요한 시스템을 처리하기 위해 TypeSafe를 LLM과 어떻게 짝지을 수 있는지도 보여줍니다:
복합 사용자 요청 나누기: 이 데모의 질문 중 하나는 사용자 요청이 서로 다른 두 개 이상의 동작을 요구하는지 식별하는 Noul 질문입니다. 이것이 참이면 시스템은 LLM을 사용해 요청을 원자적 명령 목록으로 나눕니다. 나뉜 요청은 그다음 TypeSafe로 개별 평가됩니다.
대화형 LLM으로 폴백: TypeSafe가 사용자 질의를 일반 정보나 대화 요청으로 판단하면, 시스템은 LLM을 호출해 자유 형식 응답을 생성합니다. 이를 통해 대화형 시스템은 알려진 결정적 동작을 가진 요청을 빠르고 비용 효율적으로 처리하면서, 필요할 때 생성형 LLM이 제공하는 유연성도 유지할 수 있습니다. 초기 TypeSafe 응답은 LLM 응답에 비해 워낙 빨라서 전체 시스템에 지연 시간을 거의 더하지 않습니다.
직접 실행하기
이 데모는 TypeSafe API를 사용해 사용자 요청을 평가하는 단순한 Vite/React 단일 페이지 앱입니다. 전체 소스 코드는 릴리스 시 GitHub에서 제공될 예정입니다. README에는 데모를 로컬에서 실행하는 방법과 소스 코드의 어느 부분이 데모의 어느 부분을 담당하는지에 대한 개요가 담겨 있습니다.