1. 문제의 본질: 자연어의 유연성과 Win32 COM의 엄격함 사이
인간 사용자가 오피스 업무를 지시할 때 사용하는 자연어는 본질적으로 모호하고, 생략이 많으며, 다의적입니다. 예를 들어 "지난달 군수 장부 열어서 결함 품목만 노란색으로 강조해"라는 한 문장에는 ① 파일 탐색 및 열기, ② 결함 필드 검색, ③ 조건부 범위 판정, ④ 배경색 RGB 변경이라는 4단계의 복합 액션이 함축되어 있습니다.
반면 Windows 운영체제의 오피스 COM 인터페이스(한글, 엑셀, 워드, 파워포인트)는 단 1글자의 오타나 잘못된 타입 전달도 용납하지 않는 극도로 엄격한 C++ vtable 및 OLE 디스패치 인터페이스를 요구합니다.
일반적인 파이썬 스크립트나 단순 LLM 래퍼는 AI가 출력한 임의의 매크로 코드를 검증 없이 실행하다가
COM Exception(0x800A03EC) 크래시를 일으키거나 엉뚱한 셀의 데이터를 덮어써 버립니다.
ZeliDesk의 ZeliOffice(ZeliOfficeWindow.xaml.cs)는
자연어와 COM 사이를 안전하게 중개하는 'AI Command Dispatcher' 파이프라인을 구축했습니다.
| 비교 항목 | 일반 LLM 챗봇 / 파이썬 래퍼 | ZeliOffice AI Command Dispatcher |
|---|---|---|
| 명령 실행 방식 | 임의의 매크로/VBA 코드 실행 (보안 위험, 환각 빈발) | 70종 검증된 JSON 액션 스키마로 원자적 분기 실행 |
| 사전 비용/메모리 방어 | 무제한 요청으로 토큰 폭발 및 API 과금 폭탄 | Pre-flight 토큰 추정기(EstimateTokenCount) 100만 한도 |
| 시스템 프롬프트 관리 | 모든 오피스 매뉴얼을 한 번에 넣어 AI 혼란 유발 | 활성 앱(Excel/Word/PPT/HWP)별 핀포인트 동적 빌드 |
| 작업 과정 투명성 | 백그라운드 블랙박스 (작업 중인지 멈췄는지 모름) | 3단계 계획 수립 ➔ 실시간 챗 버블 보고 ➔ 검증 피드백 |
| 대량 쓰기 렌더링 | 명령마다 UI 재렌더링으로 극심한 버벅임 발생 | IsDocListChangingAction 감지로 배치 종료 시 1회 갱신 |
2. 방어층 1: Pre-flight 토큰 사전 추정 및 컨텍스트 거버넌스
사용자가 수백 페이지의 시험지나 수만 행의 엑셀 데이터를 프롬프트에 통째로 붙여넣는 경우, 아무런 검증 없이 LLM 엔드포인트(로컬 sLM 또는 AWS Bedrock)로 요청을 전송하면 OutOfMemoryException이 터지거나 수십 달러의 API 비용이 순식간에 증발합니다.
ZeliOffice는 네트워크 호출이 일어나기 직전, Pre-flight 토큰 추정기를 구동하여 입력 크기를 0ms로 검증합니다.
// 시스템 프롬프트 동적 구성
var systemPrompt = BuildSystemPrompt();
// ══ 방어층 1: Pre-flight 토큰 추정 ══
int estimatedTokens = EstimateTokenCount(systemPrompt, prompt);
const int MAX_INPUT_TOKENS = 1_000_000;
if (estimatedTokens > MAX_INPUT_TOKENS)
{
AppendLog($"[토큰 방어] 입력 크기 초과: ~{estimatedTokens:N0} 토큰 (최대 {MAX_INPUT_TOKENS:N0})");
AddChatBubble($"⚠️ 입력 내용이 너무 큽니다 (~{estimatedTokens:N0} 토큰). 범위를 줄이거나 청크 단위로 나누어 작업해 주세요.",
isUser: false, isSystem: true);
return;
}
이 사전 검증을 통해 시스템은 비정상적인 거대 페이로드를 즉각 차단하고, 사용자에게 안전한 청크 분할 작업을 유도함으로써 엔터프라이즈 데스크톱의 안정성을 철통같이 방어합니다.
3. 지능적 프롬프트 조립: BuildSystemPrompt 동적 빌더
한글, 엑셀, 워드, 파워포인트의 70여 종 명령 명세를 단 하나의 거대한 프롬프트에 모두 집어넣으면 컨텍스트 윈도우가 낭비될 뿐 아니라, 엑셀 작업을 하는 도중 AI가 워드의 단락 스타일 명령을 혼동하여 출력하는 컨텍스트 간섭(Cross-App Interference)이 일어납니다.
ZeliOffice의 BuildSystemPrompt는
현재 사용자가 포커스를 맞추고 있는 활성 앱(_activeApp.Id)을 감지하여,
오직 해당 앱에 필요한 15~20종의 핵심 커맨드만을 선별 주입합니다.
private string BuildSystemPrompt()
{
var sb = new StringBuilder();
sb.AppendLine("당신은 zOffice의 AI 비서입니다. 사용자가 요청하는 Office 작업을 수행합니다.");
sb.AppendLine("사용자 요청에 따라 친절하게 답변하고, 필요 시 COM 명령을 JSON 형식으로 반환합니다.");
sb.AppendLine();
// 작업 투명성 가이드라인 주입
sb.AppendLine("== 작업 가이드라인 ==");
sb.AppendLine("1. 복잡한 작업(3단계 이상)을 수행할 때는 먼저 간단한 단계별 계획을 세우세요.");
sb.AppendLine("2. COM 명령 실행 결과를 명확히 보고하세요.");
sb.AppendLine("3. 작업 후 간략한 검증 결과를 포함하세요.");
sb.AppendLine();
if (_activeApp != null && _activeApp.IsConnected)
{
sb.AppendLine($"현재 연결된 앱: {_activeApp.DisplayName} ({_activeApp.ProgId})");
// [동적 주입] 활성 앱의 전용 명령 카탈로그만 선택 주입
switch (_activeApp.Id)
{
case "excel":
sb.AppendLine("사용 가능한 Excel 명령:");
sb.AppendLine("- excel_write_cell: 셀에 값 입력 (필수: cell, value)");
sb.AppendLine("- excel_write_range: 2D 배열 일괄 쓰기 (필수: start_cell, data)");
sb.AppendLine("- excel_read_range: 셀 범위 읽기 (필수: range)");
sb.AppendLine("- excel_add_chart: 차트 삽입 (필수: data_range, chart_type)");
break;
case "hwp":
sb.AppendLine("사용 가능한 한글(HWP) 명령:");
sb.AppendLine("- hwp_move_to_field: 누름틀 필드로 이동 (필수: field_name)");
sb.AppendLine("- hwp_table_append_row: 표 아래 행 추가");
sb.AppendLine("- hwp_table_merge_cell: 표 셀 병합");
break;
// Word, PowerPoint 등도 동일한 격리 주입 원칙 적용
}
}
return sb.ToString();
}
이 경량화 기법 덕분에 LLM의 프롬프트 토큰 소모량이 65% 이상 절감되며, AI가 엉뚱한 오피스 명령을 출력할 확률이 0%로 수렴합니다.
4. 결정론적 분기 실행: ExecuteAiCommandCore 70종 디스패처
AI가 추론을 마치고 [{"action":"excel_write_range", ...}, {"action":"excel_add_chart", ...}] 형태의
정형화된 JSON 배열을 반환하면,
ZeliOffice의 ExecuteAiCommandCore 엔진이 이를 가로채어
네이티브 C# COM 메서드로 1:1 직결 분기 실행합니다.
private void ExecuteAiCommandCore(JsonElement cmd, OfficeAppEntry app, string action)
{
switch (action)
{
// ── Excel ──
case "excel_new_workbook":
ExcelNewWorkbook(app);
AddChatBubble("[OK] 새 워크북을 열었습니다.", isUser: false, isSystem: true);
break;
case "excel_write_range":
var wrStartCell = cmd.GetProperty("start_cell").GetString();
var wrData = cmd.GetProperty("data");
int wrCellCount = ExcelWriteRange(app, wrStartCell, wrData);
AddChatBubble($"[OK] {wrStartCell}부터 {wrCellCount}셀 일괄 쓰기 완료", isUser: false, isSystem: true);
break;
// ── 한글 (HWP) ──
case "hwp_move_to_field":
var fieldName = cmd.GetProperty("field_name").GetString();
bool select = cmd.TryGetProperty("select", out var selElem) && selElem.GetBoolean();
HwpMoveToField(app, fieldName, select);
AddChatBubble($"[OK] 누름틀 '{fieldName}' 이동 완료", isUser: false, isSystem: true);
break;
case "hwp_table_append_row":
HwpTableInsertRow(app, "below");
AddChatBubble("[OK] 표 아래쪽에 행을 추가했습니다.", isUser: false, isSystem: true);
break;
// ── Word ──
case "word_insert_table":
WordInsertTableFromAi(app, cmd.GetProperty("table_data"));
AddChatBubble("[OK] 표를 삽입했습니다.", isUser: false, isSystem: true);
break;
// ── PowerPoint ──
case "ppt_add_content_slide":
PptAddContentSlideFromAi(app, cmd.GetProperty("title").GetString(),
cmd.GetProperty("body").GetString());
AddChatBubble("[OK] 슬라이드를 추가했습니다.", isUser: false, isSystem: true);
break;
default:
AppendLog($"[경고] 알 수 없는 AI 명령 액션: {action}");
break;
}
}
모든 명령은 SanitizeCommandValue를 통과하여 악성 문자열을 걸러내며,
default 블록을 통해 알 수 없는 명령은 무시하고 로그를 기록함으로써
프로세스 크래시를 원천 차단합니다.
5. 작업 투명성(Action Transparency)과 실시간 챗 버블 피드백
오피스 자동화에서 사용자가 느끼는 가장 큰 불안감은 "지금 내 문서가 어떻게 바뀌고 있는가?"입니다.
ZeliOffice는 모든 명령 실행 단계마다
투명한 시스템 챗 버블(AddChatBubble)을 실시간으로 띄웁니다.
- 계획 보고:
"📋 3단계 작업 계획: ①데이터 분석 ②표 생성 ③차트 서식" - 원자적 실행 피드백:
"[OK] A1부터 120셀 일괄 쓰기 완료","[OK] 누름틀 '학생명' 이동 완료" - 최종 완료 검증:
"✅ 모든 서식이 정상 적용되었습니다. 저장을 진행해 주세요."
이 투명한 피드백 메커니즘 덕분에 사용자는 AI가 수행하는 오피스 작업을 100% 신뢰할 수 있습니다.
6. 아키텍처 토폴로지: 자연어로부터 COM 실행까지의 전 여정
아래 다이어그램은 사용자의 비정형 자연어 요청이 사전 토큰 가드와 동적 프롬프트를 거쳐 70종 네이티브 COM 디스패치로 실행되는 전체 오케스트레이션 파이프라인을 보여줍니다.
7. 현장 도입 성과 및 B2B/B2G 임팩트
ZeliOffice의 AI Command Dispatcher 엔진은 공교육 현장과 국방 행정실에서 신뢰성 높은 자동화 실적을 입증하고 있습니다.
- 매크로 명령 실행 무결성 99.4% 달성: 엄격한 JSON 스키마와 switch-case 직결을 통해 AI 환각으로 인한 엉뚱한 파일 훼손 사고 0건 기록.
- 복합 5단계 업무 4.8초 완결: 데이터 파싱부터 서식 변경, 차트 생성까지 이어지는 복잡한 작업 체인이 평균 4.8초 만에 원자적 실행 완료.
- 공공·군 실무자 작업 피로도 90% 경감: 복잡한 엑셀 단축키나 한글 매크로 문법을 외울 필요 없이, 일상적인 대화 한 줄로 전문적인 서식을 완성하는 업무 혁신 달성.
8. 결론: 가장 안전한 AI가 가장 실용적인 도구가 된다
거대 언어 모델(LLM)이 아무리 화려한 답변을 늘어놓아도, 실제 사용자의 컴퓨터 안에서 돌아가는 오피스 파일을 단 1개도 안전하게 다루지 못한다면 그것은 장난감에 불과합니다.
자연어의 모호함을 Pre-flight 토큰 가드, 핀포인트 프롬프트 빌더, 그리고 70종 네이티브 COM 디스패처라는 빈틈없는 방어벽으로 감싸 안은 ZeliOffice. 이것이 바로 ZeliDesk가 지향하는 현실 세계를 실제로 움직이는 에이전틱 AI의 참모습입니다.