언어 모델을 라우터로 사용하기

언어 모델을 라우터로 사용하기 (Language Models as Routers)

생성형 사용자 인터페이스(generative user interfaces)와 언어 모델을 라우터로 사용하는 개념을 설명하는 문서예요.

출처: 문서

본문

언어 모델은 생성 결과의 일부로 사용자 인터페이스를 렌더링할 수 있으므로, 그 결과 생성된 모델의 생성물을 생성형 사용자 인터페이스(generative user interfaces)라고 해요.

이 섹션에서는 생성형 사용자 인터페이스와 그것이 AI 애플리케이션을 구축하는 방식에 미치는 영향에 대해 더 알아볼게요.

결정적 라우트와 확률적 라우팅 (Deterministic Routes and Probabilistic Routing)

생성형 사용자 인터페이스는 모델의 생성 출력에 의존하기 때문에 본질적으로 결정적(deterministic)이지 않아요. 이 생성은 확률적이기 때문에, 매 사용자 질의마다 다른 사용자 인터페이스가 나올 수 있어요.

사용자는 여러분의 애플리케이션에서 예측 가능한 경험을 기대하므로, 비결정적 사용자 인터페이스는 처음에는 좋지 않은 아이디어처럼 들릴 수 있어요. 하지만 언어 모델은 함수 호출 기능을 사용해 생성을 특정 출력 집합으로 제한하도록 설정할 수 있어요.

언어 모델에 함수 정의 집합을 제공하고 사용자 질의에 따라 그 중 어떤 것을 실행하라고 지시하면, 모델은 다음 두 가지 중 하나를 수행해요:

  • 사용자 질의에 가장 관련 있는 함수를 실행한다.
  • 사용자 질의가 사용 가능한 함수 집합의 범위를 벗어나면 어떤 함수도 실행하지 않는다.
const sendMessage = (prompt: string) =>
  generateText({
    model: __MODEL__,
    instructions: 'you are a friendly weather assistant!',
    prompt,
    tools: {
      getWeather: {
        description: 'Get the weather in a location',
        inputSchema: z.object({
          location: z.string().describe('The location to get the weather for'),
        }),
        execute: async ({ location }: { location: string }) => ({
          location,
          temperature: 72 + Math.floor(Math.random() * 21) - 10,
        }),
      },
    },
  });

sendMessage('What is the weather in San Francisco?'); // getWeather is called
sendMessage('What is the weather in New York?'); // getWeather is called
sendMessage('What events are happening in London?'); // No function is called

이렇게 하면 모델이 내리는 선택은 여전히 확률적이지만, 생성 결과가 결정적이라는 것을 보장할 수 있어요.

언어 모델이 사용자 질의에 따라 함수를 실행할지 말지를 선택하는 이 창발적 능력은 모델이 "추론(reasoning)"을 모방하는 것으로 여겨져요.

결과적으로, 언어 모델이 어떤 함수를 실행할지 추론하는 능력과 동시에 사용자 인터페이스를 렌더링하는 능력의 조합 덕분에, 언어 모델을 라우터로 사용하는 애플리케이션을 구축할 수 있게 돼요.

언어 모델을 라우터로 (Language Models as Routers)

역사적으로 개발자들은 애플리케이션의 서로 다른 부분을 사용자가 탐색하고 특정 작업을 완료할 수 있게 연결하는 라우팅 로직을 작성해야 했어요.

오늘날 웹 애플리케이션에서 대부분의 라우팅 로직은 라우트(route) 형태로 이루어져요:

  • /login 은 로그인 폼이 있는 페이지로 이동시켜요.
  • /user/john 은 존에 대한 프로필 정보가 있는 페이지로 이동시켜요.
  • /api/events?limit=5 는 이벤트 데이터베이스에서 가장 최근 5개의 이벤트를 표시해요.

라우트는 애플리케이션의 서로 다른 부분을 원활한 사용자 경험으로 연결하는 웹 애플리케이션을 만드는 데 도움이 되지만, 애플리케이션의 복잡성이 커짐에 따라 이를 관리하는 것이 부담이 될 수도 있어요.

Next.js는 다음을 도입해 라우트로 개발할 때의 복잡성을 줄이는 데 도움을 줬어요:

  • 파일 기반 라우팅 시스템
  • 동적 라우팅
  • API 라우트
  • 미들웨어
  • App Router 등

언어 모델이 추론에서 더 나아짐에 따라, 개발자는 핵심 애플리케이션별 컴포넌트만 작성하고 모델이 애플리케이션에서의 사용자 상태에 따라 이를 라우팅하는 미래가 있을 것이라고 믿어요.

생성형 사용자 인터페이스로 언어 모델은 애플리케이션에서의 사용자 상태에 따라 어떤 사용자 인터페이스를 렌더링할지 결정해 줘서, 미리 정의된 일련의 라우트를 탐색하는 대신 대화형 방식으로 애플리케이션과 상호작용할 수 있는 유연성을 사용자에게 제공해요.

매개변수로 라우팅 (Routing by parameters)

다음과 같은 동적 데이터에 의존하는 세그먼트가 있는 라우트의 경우:

  • /profile/[username]
  • /search?q=[query]
  • /media/[id]

언어 모델이 올바른 매개변수를 생성하고 사용자 인터페이스를 렌더링할 수 있어요.

예를 들어 검색 애플리케이션에서 서로 다른 아티스트의 작품을 검색하도록 언어 모델에 요청할 수 있어요. 언어 모델은 아티스트 이름을 매개변수로 검색 함수를 호출하고 검색 결과를 렌더링해요.

시퀀스로 라우팅 (Routing by sequence)

서로 다른 라우트를 탐색하며 완료해야 하는 일련의 단계가 필요한 액션의 경우, 언어 모델이 사용자 요청을 충족하기 위해 완료해야 하는 올바른 라우트 시퀀스를 생성할 수 있어요.

예를 들어 캘린더 애플리케이션에서 친구들과 해피아워 저녁을 예약하도록 언어 모델에 요청할 수 있어요. 그러면 언어 모델이 여러분의 요청을 이해하고 다음 작업을 위한 올바른 툴 호출 시퀀스를 수행해요:

  1. 내 캘린더 조회
  2. 친구들의 캘린더 조회
  3. 모두에게 가장 좋은 시간 결정
  4. 근처 해피아워 장소 검색
  5. 이벤트 생성 후 친구들에게 초대 보내기

연락처를 조회하고, 캘린더에서 이벤트를 가져오고, 근처 장소를 검색하는 함수를 정의하기만 하면, 모델이 여러분을 위해 라우트를 순차적으로 탐색할 수 있어요.

더 자세히 알아보려면 streamUI 함수를 사용해 언어 모델의 응답을 기반으로 생성형 사용자 인터페이스를 클라이언트로 스트리밍하는 이 예제들을 확인하세요.

더 알아보기 (Learn more)