Process GPT Lite는 화면(Vue)과 작은 중계 서버로 이루어져 있고, 실제 일은 손대지 않은 Process GPT 백엔드가 합니다. 이 장에서는 구성 요소를 한 장의 그림으로 보고, 메시지 하나와 문서 하나가 어디를 지나가는지, 어떤 모델이 무엇을 판단하는지 살펴봅니다.
얇은 화면, 그대로 쓰는 백엔드#
앞 장의 작업실에서 에이전트의 작업 폴더를 직접 열어 보았습니다. 이 장에서는 한 걸음 더 물러나, 그 폴더와 채팅·편집기가 서버 안에서 어떻게 이어져 있는지 봅니다. 사내에 설치·운영하는 담당자를 위한 장이라 구성 요소 이름과 포트가 그대로 나옵니다.
지금까지 쓴 기능은 대부분 Lite가 새로 만든 것이 아닙니다. 에이전트 실행, 스킬, 프로세스 엔진, 문서 생성, 저장소는 오픈소스 Process GPT의 서비스를 고치지 않고 부릅니다. Lite가 직접 가진 것은 두 가지입니다.
| Lite의 부분 | 하는 일 |
|---|---|
| 화면 (Vue 3) | 채팅, 홈, 프로젝트, 폴더, 설정, 작업실. 하늘 배경과 유리 카드 |
| 중계 서버 (Express. 화면 하나만을 위해 백엔드를 대신 불러 주는 서버라 흔히 BFF — Backend for Frontend라고 부릅니다) | 로그인, 대화·카드 저장, 백엔드 호출, 커넥터·문서·ArtCraft의 MCP(에이전트가 외부 도구를 부르는 표준 규약) 관문, 보관함 암호화, 예약 실행, 브라우저 에이전트 |
그래서 Process GPT를 이미 운영하고 있다면 Lite는 그 위에 화면을 하나 더 얹는 셈이고, Process GPT가 좋아지면 Lite도 함께 좋아집니다.
구성도#
브라우저 / Android 앱 (화면 :5180)
│ /api /office /craft
▼
Lite 중계 서버 (:8787)
├─ 채팅 ───▶ context-router (:8895) ── 어느 대화의 후속?
│ │ └─▶ 판단 서버 (:8896) 작은 모델·임베딩
│ ▼
│ deepagents (:8888) ── 에이전트·스킬 ─▶ 샌드박스
│ │ MCP 도구
│ ├─▶ office-mcp (:1192) 문서 만들기
│ ├─▶ office-host (:5390) 편집기·라이브 편집
│ ├─▶ mcp-hub (:8500) 커넥터 등록
│ └─▶ Lite /mcp/* 커넥터·폴더·패널 앱
│ ArtCraft CLI (사용자별)
├─ 프로세스 ─▶ completion (:8099) + polling-service
├─ 작업실 ───▶ cli-agent (:8890) Claude Code · Codex
├─ 마이닝 ───▶ process-miner (:8014)
├─ 개선 분석 (중계 서버 안) 리드타임·병목·크리티컬 패스 계산
├─ 저장 ─────▶ Supabase Postgres · 로그인 · 파일 저장소
└─ 예약 ◀──── pg_cron ─▶ pg_net ─▶ /api/cron/fire
| 구성 요소 | 출처 | 역할 |
|---|---|---|
| deepagents | Process GPT | 대화 한 턴의 실제 작업. 스킬을 고르고, 도구(MCP)를 부르고, 샌드박스에서 코드를 돌려 파일을 만듭니다 |
| context-router | Process GPT | 메시지가 어느 대화의 후속인지 판단해 대화를 나눕니다(4장). 짧은 선택형 판단(/decide)도 맡습니다 |
| 판단 서버 | Process GPT (참조 구현) | 작은 공개 모델(Qwen3-4B)이 선택지 중 하나를 확률로 고릅니다. 같은 서버가 의미 검색용 임베딩(bge-m3)도 냅니다 |
| completion + polling-service | Process GPT | 프로세스 시작·제출과 다음 단계 진행(17장~18장) |
| office-mcp | Process GPT | 한글·워드·엑셀 문서를 만듭니다 |
| office-host | Process GPT (이음오피스) | 문서를 원본 형식 그대로 열고 고칩니다. 열린 문서를 고치는 office_live_* 도구를 냅니다(7장) |
| mcp-hub | Process GPT | MCP 서버 목록과 사용자별 연결을 관리합니다(11장) |
| cli-agent | Process GPT | Claude Code·Codex를 작업 폴더에서 실행합니다(23장) |
| process-miner | Process GPT | 인계 기록에서 반복 흐름을 찾습니다(19장) |
| 개선 분석 | Lite 중계 서버 (Process GPT analytic 서비스의 리드타임 분해 규칙을 옮김) | 프로세스 실행 기록을 원천 표에서 바로 읽어 단계별 리드타임·대기·병목·제약·크리티컬 패스를 계산하고, 에이전트에게는 /mcp/improve 도구로 줍니다. 숫자는 모두 계산 결과이고 모델은 설명만 합니다(20장~22장) |
| Supabase | Process GPT가 쓰는 그대로 | Postgres(대화·카드·프로세스·팀 데이터), 로그인, 파일 저장소, 예약(pg_cron) |
| ArtCraft CLI | storytold 오픈소스 | CAD·벡터·사진·소리·영상 앱의 MCP. Lite가 사용자마다 프로세스를 하나씩 띄워 둡니다(8장) |
Lite가 따로 만든 저장 공간
Lite 전용 데이터는 같은 Postgres의 pro_로 시작하는 표(대화, 카드, 예약, 보관함, 패널 앱 …)에 있습니다. 공유 폴더는 서버의 git 저장소(PRO_FOLDERS_ROOT, 기본 ~/pgpt-folders/<테넌트>/<폴더>)에 있어, 에이전트의 샌드박스는 이력과 다른 변형을 보지 못합니다.
메시지 하나가 지나가는 길#
채팅에 달빛커피 2호점 예산표를 엑셀로 만들어 줘라고 보내면:
- 화면 → 중계 서버: 메시지가 저장되고, 응답은 스트림(SSE — 서버가 글자를 조금씩 밀어 보내는 방식)으로 돌아옵니다.
- 지름길 판단: 중계 서버가 먼저 규칙으로 갈 곳을 봅니다. 스킬 만들기, 패널, 공유 폴더, ArtCraft 앱, 문서 작성 요청은 바로 에이전트로 보냅니다. 그 밖의 말은 작은 모델이 “브라우저 작업인가, 예약인가, 팀원에게 넘기는가, 아니면 에이전트에게 맡길 일인가”를 고릅니다.
- 대화 고르기: 메인 채팅이면 context-router를 거칩니다. 라우터는 최근 대화 후보를 6개 이하로 좁힌 뒤 판단 서버에 “어느 대화의 후속인가, 새 주제인가”를 묻습니다. 확신이 낮으면 다음 방법(언어 모델의 확률 → JSON 답)으로 넘깁니다.
- 에이전트 실행: deepagents가 스킬과 MCP 도구를 써서 일합니다. 엑셀이면 샌드박스에서 코드를 돌려 파일을 만듭니다.
- 카드: 중계 서버가 이번 실행에서 나온 문서를 찾아 파일 저장소에 올리고 파일 카드로 대화에 붙입니다. 답 위에는 어느 대화로 갔는지 알려 주는 “↳ …” 줄이 붙습니다.
도면이나 스킬처럼 긴 작업은 몇 분씩 걸려도 정상입니다. 다만 에이전트가 15분 동안 한 글자도 보내지 않으면(PRO_STREAM_IDLE_MS) 기다리기를 멈추고 다시 보내 달라고 알립니다.
문서 하나가 열리는 길#
파일 카드를 누르면:
- 화면이 같은 출처의
/office/<편집기>/?src=…로 이음오피스 편집기를 띄웁니다. 엑셀은sheets, 한글은hwp, 워드는docs편집기가 엽니다. - 편집기가 준비되면 화면이 중계 서버에 라이브 연결(일회용 티켓으로 여는 웹소켓)을 열고 “이 사람이 이 문서를 열었다”고 알립니다. 머리줄에 「대화와 연결됨」이 뜹니다.
- 그다음 채팅 메시지에는 열린 문서를 고치는 도구(
office_live_*)가 함께 실립니다. 이 도구는 문서가 열려 있는 동안과 그 뒤 잠시(열린 채 보낸 마지막 메시지부터 30분)만 보입니다. 에이전트가 한 번에 쓸 수 있는 도구 수에 한도(110개)가 있기 때문입니다. - 에이전트가 도구를 부르면 중계 서버가 그 사용자의 로그인 토큰을 붙여 office-host로 넘기고, office-host는 그 사람의 화면에 열린 편집기를 찾아 그 자리에서 고칩니다. 사람은 고쳐지는 모습을 봅니다.
- 고친 뒤에는 검수가 돕니다. 고치기 전과 후를 비교해(글 길이, 표·행, 수식, 그림의 선) 빠진 것이 없는지 보고 짧은 메모를 남깁니다(9장).
- 사람이 저장하면 편집본이 원본 옆에 올라가고 카드가 편집본을 가리킵니다.
ArtCraft 앱도 같은 모양입니다. 다만 앱의 CLI가 중계 서버가 연 로컬 포트로 붙고, 요청이 화면 속 앱으로 전달됩니다. 그 포트에는 중계 서버가 띄운 그 CLI 프로세스만 붙을 수 있습니다.
어떤 모델을 무엇에 부르나#
모든 일에 큰 모델을 부르면 느리고 비쌉니다. Lite는 일의 성격에 따라 세 층을 나눠 씁니다.
| 층 | 설정 | 맡는 일 |
|---|---|---|
| 판단 서버 (작은 공개 모델, 선택지의 확률만 계산 — 글을 쓰지 않음) | PRO_JUDGE_URL, 라우터의 DECIDE_JUDGE_URL |
어느 대화의 후속인지(라우터), 브라우저 페이지가 아직 로딩 중인지·목표를 이뤘는지(/decide), 팀 대화 속 업무 요청 감지와 그 종류, 회의 중 “그 견적서 다시 보자”에 띄울 자료, “@” 입력 때 지금 일과 관계된 팀원, 회의 할 일의 종류 |
| 빠른 모델 | PRO_LLM_FAST_MODEL (기본 gpt-4.1-mini) |
메시지의 첫 갈래 나누기, 긴 답의 제목, 프로세스 고르기, 폴더 문서 요약 카드·변경 카드, 스킬 반영 전 검증 시나리오와 채점, 패널의 짧은 질문, 프로세스 개선 분석 결과의 설명(25초 안에 답이 없으면 같은 숫자를 정해진 틀로 보여 줌) |
| 큰 모델 | PRO_LLM_MODEL (기본 gpt-4.1) |
메일 분류와 초안 결정, 평면도 배치 정하기, 패널 앱 설계, 브라우저 에이전트 조작, 회의록 요약, 마이닝 결과 이름 짓기, 편집 뒤 그림 비교 검수 |
| 에이전트 모델 | deepagents·cli-agent 자체 설정 | 대화 한 턴의 실제 작업(문서·도면·스킬·프로세스 만들기) |
| 받아쓰기 | PRO_TRANSCRIBE_MODEL (기본 gpt-4o-mini-transcribe) |
원격 회의 받아쓰기(동의한 사람만) |
자주 일어나는 판단은 큰 모델을 부르지 않습니다
팀 메신저와 회의는 말이 오갈 때마다 판단이 필요합니다. 여기에는 규칙 → 판단 서버 순서만 쓰고, 감지에 큰 모델은 0번 부릅니다(서버가 그 횟수를 따로 셉니다). 판단 서버가 없으면 이런 제안 기능만 조용히 꺼지고, 나머지 기능은 그대로 돕니다.
모델 주소와 키는 OpenAI 호환이면 무엇이든 됩니다(PRO_LLM_BASE_URL, PRO_LLM_API_KEY). 사내 모델로 바꿔도 화면과 흐름은 같습니다.
설치 번들에는 일부만 들어 있습니다
Docker 설치 번들의 기본 lite 프로필에는 context-router·판단 서버, cli-agent, ArtCraft 앱, 프로세스 엔진이 들어 있지 않습니다. 없으면 그 기능만 빠지고 나머지는 돕니다. 프로필로 켜는 것은 1장의 “프로필”을, 따로 붙이는 것은 28장의 “설치했는데 어떤 장의 기능이 안 보입니다”를 보세요.
다음 장에서는 이 구성을 사내에서 운영할 때 챙길 것 — 팀원과 역할, 키가 있는 곳, 보관함 암호화, 백업과 업그레이드 — 을 차례로 봅니다(25장).
확인 문제
- 김민지가 메신저에서 “내일까지 견적서 정리해 주실 수 있어요?”라고 보냈을 때, 이것이 업무 요청인지 판단하는 데 큰 모델이 몇 번 불릴까요? 판단 서버가 꺼져 있으면 어떻게 될까요?
- 엑셀 카드를 열지 않은 채
B열 합계를 넣어 줘라고 보내면, 에이전트가 화면의 문서를 바로 고칠 수 있을까요? 이유를 문서가 열리는 길에서 찾아보세요. - 사내 LLM으로 바꾸려면 어떤 설정을 바꾸면 될까요?
답
- 0번입니다. 규칙(짧은 말·잡담·요청 표현 없음은 건너뜀)을 지나면 판단 서버가 “업무 요청인가”와 “어떤 일인가”를 확률로 고릅니다. 판단 서버가 없으면 제안 카드가 나오지 않을 뿐, 메신저는 그대로 됩니다.
- 아니요.
office_live_*도구는 문서가 편집기에 열려 라이브 연결이 된 동안(과 그 뒤 잠시)만 에이전트에게 보이고, 고치는 대상도 화면에 열린 편집기입니다. 열린 문서가 없으면 에이전트는 카드에서 열어 달라고 안내하는 작은 도구만 봅니다. - 중계 서버의
PRO_LLM_BASE_URL·PRO_LLM_API_KEY·PRO_LLM_MODEL·PRO_LLM_FAST_MODEL, 그리고 deepagents(와 라우터의DECIDE_LLM_*) 쪽 모델 설정을 함께 바꿉니다. OpenAI 호환 주소면 됩니다.