들어가며
안녕하세요. Cloud AI Platform 팀에서 AI 어시스턴트의 PM 및 기술 리딩을 맡고 있는 한우형입니다. 클라우드 환경에 AI를 도입해 운영 생산성을 높이는 일을 하고 있습니다.
이 글은 LY Corporation의 프라이빗 클라우드 플랫폼인 Flava를 위한 AI 어시스턴트를 개발하면서 겪었던 기술적 난관과 아키텍처 의사결정 과정을 공유하는 '엔터프라이즈 LLM(large language model) 서비스 구축기' 시리즈의 첫 번째 글입니다. 이 시리즈에서는 단순한 기능 구현기를 넘어 '260개 이상의 툴과 수백 페이지의 문서'를 다루는 대규모 LLM 애플리케이션을 만들며 저희가 고민했던 'Why'와 'How'를 깊이 있게 다룰 예정입니다.
LLM 애플리케이션을 개발한다고 하면 많은 분들이 '프롬프트 엔지니어링'을 먼저 떠올립니다. "너는 10년차 전문가야, 답변은 JSON으로 해줘"와 같이 정교하게 명령을 내리면 완벽한 결과를 얻을 수 있을 것이라 기대하죠.
하지만 27개의 클라우드 제품과 260개 이상의 API를 연동해야 한다면 상황은 달라집니다. 아무리 뛰어난 역량을 가진 비서라도 수천 개의 문서를 무작정 건네주며 "알아서 처리해"라고 한다면 성과를 내기 어렵습니다. 이런 환경에서는 AI에게 어떻게 답변해야 하는지 알려주는 '지침'보다는, 상황에 맞는 정보만 골라서 제공하는 '컨텍스트 엔지니어링(context engineering)'이 더 중요합니다.
시리즈의 첫 번째인 이 글에서는 LY Corporation의 사내 클라우드 플랫폼 Flava의 AI 어시스턴트를 구축하며 진행한 컨텍스트 엔지니어링 작업에서 겪었던 시행착오와 그 과정에서 정립한 핵심 전략을 공유하고자 합니다.
단순 검색기를 넘어 내 상태를 아는 비서로
기업용 챗봇을 구축하는 경우 가장 흔한 접근 방법은 RAG(Retrieval-Augmented Generation) 방식입니다. RAG는 위키와 같은 사내 문서를 뒤져서 답을 찾아주는 방식으로, 쉽게 말해 "나 대신 문서 읽고 요약해줘"를 수행하는 도우미인 셈입니다.
그러나 저희가 만든 Flava AI 어시스턴트는 여기서 한 발 더 나아갑니다. Flava 공식 가이드나 그동안 쌓여온 사용자와의 Q&A 같은 문서를 참조하는 것은 기본이고, 다음 그림과 같이 사용자의 권한으로 실제 API를 호출해서 현재 리소스의 상태를 읽어옵니다.

저희 방식이 어떤 차이를 만들어 낼까요? 예를 들어 사용자가 "내 서버에 접속되지 않는 원인을 찾아줘"라고 질문했다면 다음과 같이 답변이 달라집니다.
- 일반 RAG 챗봇: "서버 접속이 안 되면 네트워크 상태나 VPC ACL을 확인해 보세요" → 일반론적인 가이드
- Flava AI 어시스턴트: "API를 통해 확인해 보니 현재 서버가 속한 네트워크의 VPC ACL이 열려 있지 않네요. ACL을 여는 방법을 알려드릴까요?" → 내 상황에 맞는 진단
Flava AI 어시스턴트는 단순히 일반적인 가이드를 알려주는 게 아니라 실제 내 리소스 상태를 직접 확인해서 해결책을 제시합니다. 사용자가 번거롭게 콘솔을 탐색할 필요 없이 AI가 대신 상황을 파악해 주는 것이죠.
그런데 이런 '똑똑한' 친구를 만들려니 다뤄야 할 정보의 양이 폭발적으로 늘어났습니다.
- 27개의 제품군(VM, Kubernetes, Object Storage 등)
- 260여개의 API(각 제품의 목록, 상태 조회 등)
- 수백 페이지의 문서(Flava 공식 가이드, 과거 사용자 Q&A)
이 방대한 정보와 도구를 LLM이라는 '두뇌'에 어떻게 집어넣어야 할까요? 여기서 우리는 '컨텍스트 엔지니어링'이라는 개념을 마주합니다.
컨텍스트 엔지니어링이란?
'프롬프트 엔지니어링(prompt engineering)'은 LLM에게 입력하는 '지시 사항'입니다. "전문가처럼 행동해, JSON 형식으로 답변해"와 같은 것이죠. 반면 '컨텍스트 엔지니어링'은 LLM에게 '필요한 정보만 선별해서 제공하는 것'입니다.
개발자 온보딩을 예로 들어볼게요. 신입 개발자에게 10년 치 문서를 던져주며 "읽어보고 일하세요"라고 하면 어떻게 될까요? 아마 큰 혼란에 빠질 것입니다. 필요한 순간에 필요한 문서만 딱 집어서 주는 사수가 좋은 사수죠.
AI도 똑같습니다. "요즘 LLM은 컨텍스트 윈도우(기억 용량)가 수십만 토큰이라던데 문서를 다 줘도 괜찮지 않나요?"라고 물으실 수 있지만, 다음 두 가지 연구 결과를 보면 생각이 달라지실 겁니다.
첫 번째, 양(quantity)이 많아지면 성능이 떨어진다
2025년 10월에 발표된 Context Length Alone Hurts LLM Performance Despite Perfect Retrieval 논문에서는 컨텍스트의 길이에 따라 LLM의 성능이 어떻게 떨어지는지 연구한 결과를 발표했습니다. 연구진은 GPT-4o와 Claude-3.5-Sonnet 등 주요 모델을 대상으로 실험을 진행했는데요. 질문에 답변하기 위해 필요한 핵심 정보를 모두 컨텍스트로 제공하면서, 핵심 정보 외에 아무 의미 없는 공백이나 관련 없는 텍스트를 함께 넣었습니다. 그 결과, 모델이 지원하는 컨텍스트 길이 이내에서도 단지 입력 길이가 길어졌다는 이유만으로 최대 13.9%에서 85%까지 성능이 하락했습니다.
실제 RAG에서의 연구 결과도 이를 증명합니다. Databricks의 연구 결과(Long Context RAG Performance of LLMs)에 따르면, GPT-4나 Llama-3.1 같은 모델에서도 컨텍스트가 특정 구간(32K~64K 토큰)을 넘어가면 RAG 성능이 하락하기 시작했습니다. 즉, 아무리 똑똑한 모델이라도 컨텍스트가 길어지면 성능이 떨어진다는 것입니다.
참고로, 64K개의 토큰은 A4 용지로 70페이지에 달하는 크기입니다. 따라서 '이 정도면 꽤 많은 입력을 받을 수 있네?'라고 생각할 수도 있는데요. 여기에는 함정이 있습니다. LLM은 기본적으로 상태가 없습니다. 스테이트리스(stateless), 즉 이전 대화를 스스로 기억하지 못하기 때문에 대화의 맥락을 유지하려면 지금까지 누적된 모든 대화 내용과 정보를 모두 입력으로 제공해야 합니다. 특히 Flava AI 어시스턴트처럼 API 응답을 다루는 경우 토큰 소모 속도는 훨씬 빨라집니다. 예를 들어 "서버 목록 알려줘"라는 한마디에 수백 개의 JSON 데이터가 반환된다면 어떨까요? 사용자와 대화를 몇 번만 주고받아도 64K개의 토큰을 순식간에 사용하게 될 것입니다.
두 번째, 질(quality) 낮은 정보(노이즈)가 섞이면 판단력이 흐려진다
Context Rot: How Increasing Input Tokens Impacts LLM Performance이라는 연구 리포트에서는 '질'에 주목했습니다. 이 연구에서는 '정답과 유사하지만 관계없는 정보를 섞었을 때 컨텍스트가 길어질수록 방해 요소에 영향을 받아 오답을 내는 비율이 급격히 증가'한다는 결과를 발표했습니다. 특히 GPT 계열에서는 '오답임에도 불구하고 매우 당당하게 가짜 정보를 생성'하는 오류가 발생하기도 했습니다.
결국 모델의 컨텍스트 윈도우가 아무리 커져도 '필요한 것을 골라내는 기술'이 반드시 필요합니다.
Flava AI 어시스턴트의 전략: 점진적 공개
위와 같은 이유로 저희는 '점진적 공개' 전략을 택했습니다. 처음부터 모든 정보를 제공하는 대신, 사용자의 질문이나 현재 진행 상태에 따라 필요한 정보만 적절히 선택해서 AI에게 제공하는 방식입니다. 전체적인 흐름은 다음과 같습니다.

- 질문 분석: 사용자가 무엇을 묻는지 파악
- 도구 선별: 260개 도구 중 필요한 도구만 선택
- 가이드 주입: 질문과 도구에 맞는 매뉴얼만 골라서 제공
- 실행 및 포맷팅: 툴 실행 결과에는 필요한 맥락만 제공
각 단계를 조금 더 자세히 살펴보겠습니다.