GBT
한국외국어대학교Global Business & Technology
GenAI 특강 · 프로젝트 3 LLM 대시보드
목차 강의 홈 ↗
프로젝트 3 · 대시보드 AGENT

LLM이 컨트롤하는
동적 대시보드

Cloudflare Workers AI(무료 LLM API)로 챗봇을 연결해, 사용자가 말로 지시하면 차트와 데이터 뷰가 실제로 바뀌는 대시보드를 만든다. 정적 앱(프로젝트 1)과 데이터 사이트(프로젝트 2)를 지나 LLM 연동 서비스까지 — 세 프로젝트의 종합편이다.

GenAI 특강 · 메인 실습 트랙Cloudflare Worker + Workers AI명령 프로토콜(JSON)갤러리 제출
1
개요 · 아키텍처

무엇을 만드나

대시보드 옆에 챗봇을 붙인다. LLM은 화면을 직접 그리는 게 아니라, 정해진 JSON 명령으로 화면을 조종하는 컨트롤 신호를 만든다.

GOAL · 완성 모습

말로 조종하는 대시보드

목표는 데이터 차트가 있는 대시보드에 챗봇을 붙이는 것이다. "3개월만 보여줘", "이동평균선 추가해줘" 같은 자연어 지시를 LLM이 해석하면, 화면의 차트와 데이터 뷰가 실제로 바뀐다.

지금까지와 결정적으로 다른 점이 하나 있다. 프로젝트 1(서비스 앱)과 프로젝트 2(위키)는 정적 파일만으로 완결됐지만, 이번엔 서버(Cloudflare Worker)가 필요하다. LLM API 호출을 브라우저에서 직접 하면 API 키가 사용자에게 그대로 노출되기 때문이다. Worker가 챗봇의 백엔드가 되어 브라우저 대신 LLM을 호출한다.

아키텍처

[브라우저]                         [Cloudflare Worker]
차트 + 데이터 뷰                    fetch 핸들러
챗봇 입력창  ── 질문 POST ──▶       env.AI.run(무료 LLM 모델)
     ◀── JSON 명령 응답 ──          {"action":"...", "params":{...}}
화면 갱신 (JS가 명령 실행)

핵심 아이디어는 이렇다. LLM에게 "자연어 → 정해진 JSON 명령"으로 번역하는 역할을 준다. 시스템 프롬프트에 명령 목록을 정의해 두면, LLM은 사용자의 말을 그 목록 중 하나로 번역해 JSON만 반환한다. 프런트 JS는 그 명령만 실행한다. 즉 LLM이 화면을 직접 그리는 게 아니라 컨트롤 신호를 만드는 것이다.

Workers AI란Cloudflare가 제공하는 서버리스 AI 추론이다. 무료 할당량이 있어 별도 API 키 발급이나 과금 없이 실습할 수 있다(무료 한도를 넘으면 요청이 거절될 수 있다). Worker 안에서 env.AI.run(모델명, {messages})로 호출하며, @cf/meta/llama-3.1-8b-instruct 계열 같은 무료 모델을 쓴다.
데이터는 무엇으로공개 데이터면 무엇이든 좋다 — 환율, 금값, 주가 상위 10, 코인 시세, RAM 가격 등(갤러리 제출 사례들과 같은 계열이다). 실시간 API 연동이 어려우면 CSV/JSON 스냅샷으로 시작해도 충분하다.
해설

왜 LLM에게 화면 전체를 맡기지 않고 명령만 만들게 하는가. LLM의 출력은 매번 조금씩 다르고, 자유 텍스트를 그대로 화면에 반영하면 동작을 예측할 수 없게 된다. 반면 명령의 종류를 미리 정해 두고 그중 하나로만 번역하게 하면, LLM이 아무리 창의적으로 답해도 화면에 일어날 수 있는 일은 정해진 몇 가지뿐이다. 자연어의 유연함은 입력 쪽에서 살리고, 실행은 예측 가능한 함수 호출로 좁히는 것 — 이것이 LLM을 제품에 넣을 때의 기본 설계다.

2
준비 · 뼈대 만들기

Worker 프로젝트와 AI 바인딩

화면과 명령은 나중이다. 먼저 Workers AI 바인딩이 붙은 Worker 뼈대가 로컬에서 도는 것까지 확인한다.

SETUP · 프로젝트 생성

Worker 하나에 페이지와 API를 함께 담는다

준비물은 하나다. 메인 실습 흐름(00_flow)의 Cloudflare 연결이 끝나 있어야 한다. 커스텀 토큰을 쓰는 경우라면 Workers Scripts Edit 권한이 토큰에 들어 있어야 한다.

AI에게 뼈대 프로젝트 생성을 맡긴다.

Cloudflare Worker로 배포할 대시보드 프로젝트를 만들어줘.
- 폴더: dashboard_agent
- wrangler 설정 파일에 Workers AI 바인딩을 추가해줘 (binding 이름: AI)
- Worker 하나가 두 역할을 하게 해줘:
  1) GET / : 대시보드 HTML 페이지를 반환
  2) POST /chat : {message, state}를 받아 Workers AI로 처리하고 JSON 명령을 반환
- 아직 화면과 명령은 비워두고, 뼈대만 만들어서 로컬에서 실행되는 것까지 확인해줘
  • dashboard_agent 폴더가 만들어지고 wrangler 설정에 AI 바인딩이 보인다
  • 로컬 실행 시 GET / 에서 (빈) 페이지가 뜬다
  • POST /chat 경로가 응답을 돌려준다
해설

페이지와 API를 Worker 하나에 담으면 배포 주소 하나로 끝난다. GET /은 대시보드 HTML을 돌려주는 정적 서버 역할, POST /chat은 LLM을 호출하는 API 역할을 같은 fetch 핸들러가 나눠 맡는다. 06_regbot의 사내 규정 챗봇과 같은 구조라서, 그 실습을 해봤다면 뼈대가 낯설지 않을 것이다.

3
STEP 1 · 화면과 데이터

대시보드 화면 만들기

버튼으로 되는 조작을 먼저 완성한다. 챗봇은 그 조작을 "말로 호출"하는 레이어일 뿐이다.

STEP 1 · 차트 + 조작 버튼 + 챗봇 패널

모든 조작을 함수로 분리해 둔다

화면은 왼쪽에 차트, 오른쪽에 챗봇 패널이다. 이 단계의 요점은 기간 선택·지표 토글 같은 조작을 전부 함수로 분리해 두는 것 — 다음 단계에서 챗봇 명령이 바로 그 함수들을 호출한다.

대시보드 화면을 구현해줘.
- 주제: [예: 최근 1년 달러 환율] — 데이터는 data.json으로 프로젝트에 포함
- 왼쪽: 시계열 라인 차트 (외부 라이브러리 없이 SVG로 직접 그려줘)
- 차트 위: 기간 선택(1개월/3개월/1년), 지표 토글(이동평균선) 버튼
- 오른쪽: 챗봇 패널 (대화 목록 + 입력창)
- 화면의 모든 조작(기간, 지표)은 함수로 분리해줘 — 나중에 챗봇 명령이 같은 함수를 호출할 거야
  • 차트가 data.json의 데이터로 그려진다
  • 기간 버튼(1개월/3개월/1년)을 누르면 차트가 바뀐다
  • 이동평균선 토글이 동작한다
  • 챗봇 패널(대화 목록 + 입력창)이 자리를 잡았다 — 아직 응답은 없어도 된다
해설

순서가 중요하다. 버튼으로 되는 조작을 먼저 완성한다. 챗봇은 그 조작을 말로 호출하는 layer일 뿐이다. 버튼이 부르는 함수와 챗봇 명령이 부르는 함수가 같으면, 챗봇 연결 단계에서 새로 만들 로직이 거의 없다. 거꾸로 챗봇부터 만들면 "명령을 받았는데 실행할 함수가 없는" 상태가 되어 두 배로 헤맨다.

4
STEP 2 · 명령 프로토콜

LLM 컨트롤 연결

시스템 프롬프트로 명령 목록을 정의하고, LLM의 응답은 JSON 명령만 통과시킨다. 이 페이지의 심장이다.

STEP 2 · 자연어 → JSON 명령

번역기로서의 LLM: 명령 프로토콜을 정의한다

이제 POST /chat에 Workers AI를 연결한다. 시스템 프롬프트에서 LLM의 역할을 "대시보드 컨트롤러"로 못박고, 반환할 수 있는 JSON 명령의 목록을 정의한다. 사용자의 어떤 말도 이 목록 중 하나로 번역되어 돌아온다.

POST /chat에서 Workers AI를 호출해 챗봇이 대시보드를 컨트롤하게 해줘.
시스템 프롬프트에 이렇게 정의해:
- 너는 대시보드 컨트롤러다. 사용자의 요청을 아래 JSON 명령 중 하나로 번역해서 JSON만 반환한다.
- 명령 목록:
  {"action":"set_range","months":1|3|12}
  {"action":"toggle_ma","on":true|false}
  {"action":"answer","text":"..."}  ← 데이터에 대한 질문이면 현재 화면 상태(state)를 참고해 답변
- 명령으로 번역할 수 없는 요청이면 {"action":"answer","text":"할 수 있는 것 안내"}를 반환한다.
프런트에서는 응답 JSON의 action에 따라 이미 만들어둔 함수를 호출하고,
answer면 챗봇 말풍선으로 표시해줘.
LLM 응답이 JSON 형식이 아닐 때를 대비해 파싱 실패 처리도 넣어줘.

테스트 시나리오

  • "3개월만 보여줘" → 차트 기간이 3개월로 바뀐다 (set_range)
  • "이동평균선 켜줘" → 지표가 토글된다 (toggle_ma)
  • "최근에 제일 많이 오른 날이 언제야?" → answer로 데이터에 근거한 답변이 온다
  • "피자 주문해줘" → 할 수 있는 것을 안내하는 답변이 온다
해설

이것이 8H에서 배운 구조화 출력(JSON 강제)의 실전 사용처다. LLM의 자유 텍스트를 그대로 믿지 않고, 정해진 명령만 통과시키는 것이 안정적인 LLM 제품의 기본 설계다. 명령 목록에 없는 요청("피자 주문해줘")조차 answer라는 정해진 형식으로 떨어지게 해 두면, 프런트 JS는 예외 없이 action 분기 하나로 모든 응답을 처리할 수 있다.

마지막 줄의 파싱 실패 처리도 장식이 아니다. LLM이 JSON 앞뒤에 설명 문장을 붙이거나 형식을 어기는 일은 실제로 일어난다. 그때 화면이 조용히 멈추는 대신 "다시 말해달라"로 회복하게 만드는 것까지가 이 단계다. 03_receipt의 Structured Output, 06_regbot의 정책 우선 원칙과 같은 줄기에 있는 이야기다.

5
STEP 3 · 마무리

배포와 갤러리 제출

workers.dev 주소가 생기면, 다른 기기에서 챗봇 지시로 화면이 바뀌는 것까지 확인하고 제출한다.

STEP 3 · DEPLOY & SUBMIT

배포 주소 하나로 페이지와 AI 백엔드가 함께 열린다

Worker 배포는 명령 하나다. 커넥터를 연결해 뒀다면 대화로 배포를 지시해도 된다. 배포가 끝나면 .workers.dev 주소가 생긴다.

npx wrangler deploy
  1. 배포 후 확인 — 다른 기기(스마트폰)에서 배포 주소에 접속해, 챗봇에게 지시했을 때 화면이 실제로 바뀌는지 확인한다.
  2. progress.html 최종 갱신 — 전 단계를 완료 상태로 갱신하고, 결과물과 함께 배포한다. 개발 과정 자체가 포트폴리오가 된다.
  3. 갤러리 제출cf-board.juhonov.workers.dev에서 [과제 제출] → 분반·회차 선택 → 제목·작성자 → 결과물 링크(.workers.dev 주소) → 설명 → 비밀번호 입력.
  • 배포 주소가 열리고 챗봇이 응답한다
  • 스마트폰에서 챗봇 지시 → 화면 변화 확인
  • progress.html이 전 단계 완료 상태로 함께 배포됐다
  • 갤러리에 제출 카드가 보인다
해설

제출 설명란에 "챗봇에게 시켜볼 수 있는 명령 예시"를 적어 두자. "3개월만 보여줘 / 이동평균선 켜줘"처럼 두세 줄이면 된다. 동료들이 링크를 열자마자 바로 체험할 수 있고, 좋아요와 댓글도 그만큼 잘 붙는다. 배포 절차의 상세(토큰 문제, 프로젝트 이름 규칙 등)는 부록 11_deploy를 참고하라.

6
정리

핵심 정리

정적 앱에서 LLM 연동 서비스까지 — 세 프로젝트가 하나의 여정이었다.

WRAP-UP

LLM은 화면을 그리지 않는다, 명령을 만든다

핵심 정리

하나. 세 프로젝트는 한 계단씩 올라왔다. 정적 앱(P1) → 데이터 사이트(P2) → LLM 연동 서비스(P3). 이번에 처음으로 서버(Worker)가 필요해진 이유는 단 하나, API 키를 브라우저에 노출하지 않기 위해서다.

둘. LLM은 화면을 그리는 게 아니라 명령을 만든다. 시스템 프롬프트로 JSON 명령 목록을 정의하고, 프런트는 그 명령만 실행한다. 자연어의 유연함과 실행의 예측 가능성을 동시에 얻는 설계다.

셋. Worker 하나로 페이지 + AI 백엔드가 완결된다. GET /은 화면, POST /chat은 두뇌 — 배포 주소 하나면 동료가 바로 체험할 수 있는 서비스가 된다.

더 나아가기무엇을 얻나
07_secragRAG를 붙여 데이터에 대한 설명·답변을 강화한다 — 임베딩과 벡터 검색.
09_briefing데이터 자동 수집을 연결한다 — 스냅샷 대신 살아 있는 데이터로.
10_curator에이전트식 개발로 확장한다 — 스스로 수집·판단·갱신하는 서비스.
한국외국어대학교 Global Business & Technology · GenAI 특강 · 메인 실습 트랙 프로젝트 3.
이 자료는 단일 HTML 파일로 배포된다. 프롬프트 블록의 [ ] 부분은 각자의 주제로 바꿔 사용한다.