1/13/2026

아키텍트로 전향하고픈 엔지니어가 알아야 할 사항

이 글을 읽는 개발자 혹은 엔지니어분들은 해당 직무에서 꽤 오랫동안 일해 왔고, 개발 시 필요한 라이브러리 및 모듈에 대해서는 이미 잘 알고 계십니다. 개발 시 발생하는 버그도 디버깅을 통해 다 해결해봤지요. 담당하는 개발 모듈의 세계를 넘어서 더 큰 그림을 보려면 준비해야 할 것이 무엇인지 본 글에서 다룰려고 합니다.

마인드셋의 전환 - “어떻해”에서 “왜”와 “무엇”으로

가장 중요한 점은 관점의 변화입니다. 엔지니어는 주어진 문제를 해결하기 위해 “어떤 기술”을 사용하여 어떻게 구현할 것인가?에 집중합니다. 그러나 아키텍트는 아래의 질문에서 시작해야 합니다.

  1. 비즈니스 목적(Why?): 이 시스템이 왜 필요하지? 비즈니스 목표를 달성하기 위해 가장 중요한 것은 무엇이지?
  2. 트레이드 오프: 모든 기술적 결정에는 대가가 따릅니다. A라는 프레임워크를 선택했을 때 포기해야 하는 B는 무엇이지?
  3. 지속 가능성: 이 구조가 시장 트렌드가 바뀌는 3년 뒤에도 유지가 가능할까?

현실에서는 요구사항을 해소하기에 바쁘긴합니다. 그럼에도 아키텍트가 되려면 “이 요구사항이 전체 시스템의 정합성을 해치지는 않는가?”에 대한 답변을 끊임없이 고민하는 습관을 가져야 합니다.

기술적 깊이와 넓이의 균형

아키텍트는 모든 것을 다 알아야 한다는 압박감을 가질 수 있습니다. 그러나 핵심은 “넓게 알되, 특정 분야에 대해서는 누구보다 깊은 통찰력을 가지는 것”입니다.

그러기 위해서는 첫째, 폭넓은 기술 스택을 탐색해야 합니다. 현 시장에서 많이 쓰고 있는 기술 스택에 대해서 이해해야 합니다. (e.g. Springboot/Java, Python, Nodejs 등)

둘째, 인프라에 대한 이해가 있어야 합니다. AWS, Azure, GCP와 같은 클라우드 환경 및 On-premise 환경에 대한 이해가 필수입니다.

셋째, 데이터 아키텍처를 이해해야 합니다. RDBMS를 넘어 NoSQL과 데이터 파이프라인에 대한 이해가 있어야 합니다.

추가로, 아키텍트는 코딩에 손을 떼면 안됩니다. 어떤 기능을 구현해야 하는 관점보다는 실제 구현의 어려움을 이해하기 위해 프로토타이핑이나 핵심 모듈 개발에 참여해야 하기 때문입니다. 기술적 깊이와 논리없이 입으로만 일하면 엔지니어분들께 신뢰를 얻지 못합니다.

아키텍처 결정

아키텍트의 가장 중요한 산출물은 코드가 아니라 “결정” 입니다.

왜 이 데이터베이스를 선택했는지, 왜 MSA(Microservices Architecture)를 선택했는지등을 기록으로 남겨야 합니다. 이렇게 해야 나중에 멤버가 변경되었을 때나 히스토리를 파악할 때 결정적인 자산이 됩니다.

이런 의사 결정을 할때는 감이나 트렌드에 의존하는 것이 아니라, 명확한 기준(비용, 성능, 개발 생산성, 인력 수급 등)을 바탕으로 결정해야 합니다.

실 업무를 하게 되었을 때, 현실적인 벽에 부딪히기도 합니다. 상급자의 지시나 고객의 무리한 요구가 있을 수 있지요. 그런 상황에서 기술적 근거를 바탕으로 논리적으로 설득 할 수 있는 강력한 무기가 됩니다.

기술과 비즈니스의 가교

아키텍트 역량의 50% 이상이 “소프트 스킬”입니다. 일반적인 엔지니어 분들이 가장 힘들어 하는 부분이기도 하죠. 그 이유는 아래와 같습니다.

  • 시각화 능력: 복잡한 시스템을 이해관계자(기획자, 경영진, 엔지니어, 현업)가 이해할 수 있도록 그림으로 표현해야 합니다.
  • 설득의 기술: 엔지니어에게는 기술적 비전을 제시하고, 경영진에게는 기술 투자가 가져올 비즈니스 가치(비용 절감, 장애 감소, 비즈니스 확장 등)를 설명해야 합니다.
  • 중재자 역할: 프론트 엔드와 백엔드 간의 인터페이스 갈등, 개발팀과 인프라팀 간의 여러 갈등을 해결하는 능력이 필요합니다.

각 환경에 따른 전략

우리가 일하는 IT는 여러 분야로 나눠져 있습니다. 크게 SI, 스타트업/서비스, 레거시 현대화로 나눠보면 각 환경의 특수성을 고려한 전략이 필요합니다.

  • SI: 고객사에서 제공하거나 사용하는 표준 프레임워크의 제약 안에서 어떻게 유연한 설계를 할 것인가가 관건입니다. 여기서는 “표준 준수”와 “성능 최적화” 사이의 균형이 필요합니다.
  • 스타트업/서비스: 빠른 출시(Time-to-Market)가 우선입니다. 아키텍트는 처음부터 완벽한 설계를 하기보다는, 나중에 확장하기 쉬운 “점진적 아키텍처”로 설계해야 합니다.
  • 레거시 현대화: 많은 기업들이 노후화된 시스템을 현대화하려고 합니다. 이때 점진적 전환 전략을 제시할 수 있어야 합니다.

자기계발과 네트워킹

아키텍트로의 전환은 단기간에 이뤄지지 않습니다. 고전과 신간의 기술 서적을 병행해서 읽으면서 공부를 해야 합니다. 또한 오픈 소스에 기여하거나 커뮤니티 활동을 하면서 최신 트렌드를 파악하고 연습을 해보는 것도 중요합니다. 제일 좋은 것은 주변에 시니어 아키텍트가 있다면 멘토로 삼아 그들의 의사결정 과정을 옆에서 지켜보는 것이 가장 빠릅니다.

끝으로,

아키텍트는 완벽한 정답을 내놓는 사람이 아닙니다. 변화하는 비즈니스 환경에 맞춰 시스템을 가장 적절한 방향으로 이끄는 “나침반” 같은 존재이기에 아래의 사항이 중요합니다.

  • 더 큰 그림을 보는 것
  • 기술과 비즈니스 간의 격차를 해소하는 것
  • 제품이 고객의 요구 사항을 실제로 충족하는지 확인 하는 것

이는 기술, 의사소통, 발표, 멘토링이 필수적이라는 것을 의미합니다.

엔지니어에서 아키텍트로 성장하기 위해서는 기술적 탁월함을 기본으로 하되, 비즈니스를 이해하고 이해관계자와 소통하는 능력을 키워야 합니다. 아키텍트는 코드가 아닌 시스템 전체의 건강함을 책임지기에, 이런 시각을 지니고 있다면 이미 아키텍트의 길에 들어선 것입니다. 가장 중요한 것은 열린 마음과 끊임없이 배우고자 하는 호기심이니까요.

1/12/2026

RAG의 환각에 대한 대응

현 거대 언어 모델(LLM)은 지난 몇 년간 급격한 성장을 이루었습니다. 단순히 AI 모델을 사용하는 것을 넘어, 자사의 방대한 내부 데이터를 LLM에 연동하여 실질적인 비즈니스 가치를 창출하고자 하는 요구에 직면해 있습니다. 이런 배경에는 RAG(Retrieval-Augmented-Generation)가 있습니다. RAG는 모델에 없는 최신 정보나 비공개 기업 데이터에 접근할 수 있도록, 데이터베이스에서 관련 내용을 검색하여 프롬프트에 주입하는 기술입니다. 이는 이론적으로 LLM의 가장 큰 약점이었던 환각(Hallucination) 현상을 완화하고, 지식의 최신성을 보장하는 완벽한 솔루션처럼 보였습니다.

Dzone에 언급된 https://dzone.com/articles/rag-illusion-grafting-memory-limitations 내용에 의하면 현재의 RAG 방식이 가진 근본적인 한계를 지적하며 이를 환상적 접목이라는 은유로 설명을 하고 있습니다. “접목”의 사전적 의미는 서로 다른 두 식물의 조직을 연결하여 하나의 개체처럼 자라게 하는 기술이지만, 접목된 두 식물은 기능적으로 공존할 뿐, 유전적으로나 구조적으로 완전히 융합된 것은 아닙니다.

현재의 RAG도 이와 유사합니다. 검색(Retriever)라는 “가지”를 생성 모델(Generator)라는 “나무”에 억지로 붙여놓은 형상입니다. 겉으로 보기에는 LLM이 기업 데이터를 완벽히 이해하고 답변하는 것처럼 보이지만, 실제로는 두 모듈이 서로의 작동 원리를 이해하지 못한 채 단절된 상태로 기능하고 있습니다. 검색 모듈은 생성 모델이 어떤 논리를 필요로 하는지 모른 채 키워드 유사성에만 의존해 결과를 던져주고, 생성 모델은 그 문서가 적절한지 판단할 수 있는 피드백 채널 없이 주어진 텍스트를 앵무새처럼 가공할 뿐입니다. 이런 구조적 분열은 복잡한 추론이 필요한 실 비즈니스 환경에서 심각한 오류와 비효율을 초래할 수 있습니다.

본 글은 RAG 아키텍처의 한계를 살펴보고, 그 대안을 살펴봅니다.

RAG 아키텍처의 구조적 결함

현재 RAG 시스템의 결함은 검색 모듈과 생성 모듈이 서로 다른 목적을 위해서 서로 다른 방식으로 최적화되었다는 점입니다. 이를 “분절된 최적화”라고 표현합니다.

  • 검색: 검색은 주로 유사성을 기준으로 작동합니다. 사용자의 질문과 데이터베이스 내 데이터 간의 벡터 거리를 계산하여 가장 가까운 문서를 찾습니다. 이는 마치 도서관 사서가 책의 내용이 사용자에게 얼마나 도움이 되는지를 판단하는게 아니라, 사용자가 말한 단어가 포함된 책을 무조건 가져다주는 것과 같습니다.
  • 생성: LLM은 인과성과 문맥을 기반으로 다음 단어를 예측하도록 훈련했습니다. LLM은 논리적인 답변을 구성하기 위해 특정 정보가 필요한데, 검색은 문맥적 필요성이 아닌 표면적 유사성만으로 정보를 제공합니다.

위 두 모듈 사이에는 피드백 루프가 존재하지 않습니다. 만약 검색 모듈이 엉뚱한 문서를 가져오더라도, 생성 모듈이 “이 문서는 답변을 만드는 데 쓸모가 없어, 다른 것을 찾아줘!”라고 요청 할 수 없습니다. 그저 주어진 엉뚱한 정보를 바탕으로 그럴듯한 환각을 만들어내거나, 답변을 거부할 뿐입니다. 이는 두 명의 전문가가 서로의 말을 듣지 못한 채 각자 떠드는 것과 같습니다.

RAG의 핵심 저장소인 백테 데이터베이스는 텍스트의 의미를 숫자의 나열 즉, 임베딩 벡터로 변환하여 저장합니다. 그러나 이 방식은 상관관계의 함정에 취약합니다.

검색 알고리즘은 질문과 키워드가 많이 겹치는 문서를 선호합니다. 그러나 복잡한 문제 해결을 위해서는 키워드가 겹치지 않아도 논리적으로 연결된 정보가 필요합니다. 예를 들어서, “프로젝트 A의 지연 원인”을 질문했을 때, 벡터 검색은 “프로젝트 A”, “지연”이라는 단어가 들어간 보고서를 찾습니다. 그러나 진짜 원인이 “공급망 파트너사의 파산”이라는 제목의 이메일이 있고 그 메일에 “프로젝트 A”라는 단어가 명시적으로 없다면., 벡터 검색은 이 결정적인 단서를 놓치게 됩니다. 이는 검색 모듈이 표면적 유사성에 매몰되어 인과적 정보를 무시하기 때문입니다.

더욱 심각한 기술적 문제는 벡터 임베딩이 인간의 언어 논리 중에 “부정”을 제대로 처리하지 못한다는 점입니다. 대부분의 임베딩 모델은 문맥상 함께 자주 등장하는 단어들을 가까운 벡터 공간에 배치합니다. 문제는 긍정과 부정이 대부분의 단어를 공유한다는 점입니다.

  • 문장 A: “이 약은 부작용이 있다.”
  • 문장 B: “이 약은 부작용이 없다.”

위 두 문장은 “이”, “약”, “부작용”이라는 핵심 단어를 공유하며, “있다”와 “없다”의 차이만 존재합니다. 벡터 공간에서 이 두 문장은 매우 가깝게 위치하게 됩니다. 따라서 사용자가 “부작용이 없는 약”을 질의 했을 때, RAG는 “부작용이 있다”는 문서들을 대거 검색해오는 오류를 범할 수 있습니다. 이는 단순한 검색 실패라기보다는 사용자의 의도와 정반대되는 정보를 제공할 수 있는 구조적 결함입니다.

문맥 창(Context Window)를 늘리면 해결될 문제라고 생각할 수 있습니다. 100만 토큰을 처리할 수 있는 모델들이 등장하면서, 모든 문서를 프롬프트에 넣으면 된다는 주장이 있을 수 있습니다. 그러나 문맥(Context)은 기억이 아닙니다.

문맥 창에 데이터를 집어넣는 것은 마치 시험 직전에 벼락치기로 내용을 보는 것과 같습니다. 모델은 그 내용을 학습하거나 구조화하여 장기 기억으로 전환하지 않습니다. 매번 질문할 때마다 큰 문서를 다시 읽어야 하기에 연산 비용이 증가하고, 무엇보다 정보의 양이 많아질수록 중간에 위치한 정보를 망각하는 소실 현상이 발생할 수 있습니다. 이는 단순히 양적인 확장이 질적인 추론 능력 향상으로 이어지지 않음을 시사합니다. (참고: https://medium.aiplanet.com/overcome-lost-in-middle-phenomenon-in-rag-using-longcontextretriver-2334dc022f0e, https://arxiv.org/abs/2307.03172)

대안

RAG의 한계를 극복할 대안으로 Apple과 에든버러 대학 연구진이 개발한 CLaRa(Continuous Latent Reasoning) 프레임워크를 제시합니다. CLaRA는 텍스트를 읽는 것이 아니라 의미를 다운로드 하는 방식으로의 패러다임 전환을 의미합니다. (참고: https://github.com/apple/ml-clara)

CLaRa는 데이터를 처리하는 방식이 다릅니다. 기존 RAG는 원본 텍스트를 그대로 잘라서 사용합니다. 반면 CLaRa는 SCP(Salient Compressor Pretraining)라는 과정을 통해 문서를 기억 토큰으로 압축합니다.

SCP의 작동 원리는 모방입니다. 우리가 책을 읽고 나면 책의 모든 문장을 토시 하나도 안틀리고 기억하는 것이 아니라, 핵심 내용과 논리 구조만을 뇌에 저장하지 않나요? SCP는 이 과정을 모방합니다.

또한, 긴 문서를 입력받았기에 불필요한 조사나 반복적인 표현 그리고 문법적 장식 등을 제거하고 오로지 “의미”와 “논리”만을 담은 고밀도 벡터로 압축합니다.

고밀도 벡터는 아래 두 가지 과제를 수행하며 훈련합니다.

  • 질의 응답: 압축된 정보만으로 문서 내용에 대한 질문에 답할 수 있어야 한다.
  • 의역: 문자의 형태가 바뀌더라도 의미는 동일하게 유지해야 한다.

위 과정을 통해 CLaRa는 기존 텍스트 기반 RAG 대비해서 많은 양의 데이터를 줄일 수 있고, 이는 LLM이 처리해야 할 데이터의 양이 줄어들기에 “중간 소실” 현상을 방지하는데 기여합니다.

CLaRa는 검색과 생성을 수학적으로 연결합니다. 앞에서 언급한 “분절” 문제를 해결하기 위해 CLaRa는 검색 과정을 미분 가능한 함수로 만듭니다.

기존 RAG는 검색 -> 분절 -> 생성의 형태로 답변을 했고, 이 플로우에서는 생성 모듈의 오류가 검색 모듈로 전달되지 않았습니다.

CLaRa는 검색 모듈과 생성 모듈이 하나의 연속적인 잠재 공간을 공유합니다. 생성 모듈의 답변이 틀리면, 그 오차를 계산하여 검색 모듈까지 전달합니다. 즉, 생성 모듈이 검색 모듈에게 “너가 전달한 이 압축 벡터는 답변을 만드는데 도움이 안돼. 다음에는 논리적으로 더 적합한 벡터를 전달해줘”라고 수학적인 신호를 보냅니다. 이렇게 피드백 루프가 형성되기에 검색 모듈은 단순한 단어 유사성보다, 답변 생성에 필요한 의미를 기준으로 데이터를 찾도록 피드백을 통해 진화합니다.

이것이 바로 “접목”을 넘어선 “융합”의 개념입니다. 검색과 생성은 더 이상 별개의 작업이 아니라, 하나의 거대한 추론 과정이 되는 것이지요.

비교

조금 더 이해를 돕기위해 세 가지 주요 접근 방식을 표로 비교해봅니다.

항목기존 RAG (접목)긴 문맥 (물량)CLaRa (융합)
철학검색해서 보여주자전부 다 읽어보자핵심만 기억하자
데이터 형태원본 텍스트 조각원본 문서 전체압축된 기억 토큰
연결 방식단절검색 안함미분 가능
한계검색 정확도에 의존중간 소실 현상 발생압축으로 한계 극복
추론 비용높음 (매번 재독해)매우 높음 (토큰당 과금)낮음 (압축 정보 처리)
학습 가능 여부불가능 (검색 모듈 고정)불가능 (Pre-training 고정)가능 (피드백 학습)
예시오픈북 시험책 한권 외우기개념 이해 후 시험

RAG가 실패하고 CLaRa가 성공하는 시나리오를 작성해봤습니다.

#시나리오: 기업 내부 감사

상황: 감사팀이 “2025년 프로젝트 지연의 근본 원인”을 찾고자 한다.

기존 RAG:

  • 사용자 질문: “2025년 프로젝트 지연 원인 알려줘”
  • 벡터 검색: “2025년”, “프로젝트”, “지연”이라는 단어가 포함된 주간 보고서를 찾는다. 보고서에는 “부품 수급 문제로 지연됨”이라고만 적혀 있다.
  • 답변: “부품 수급 문제 때문입니다.” (표면적 원인)

CLaRa:

  • 사용자 질문: “2025년 프로젝트 지연 원인 알려줘”
  • CLaRa는 모든 이메일과 주간 보고서를 압축하여 “기억 토큰”으로 가지고 있습니다.
  • 생성 모델은 “부품 수급 문제”라는 단서를 보고, 그 원인을 찾기 위해 관련된 잠재 벡터를 탐색합니다.
  • 이 과정에서 “2025년”, “지연”이라는 단어는 없지만, “공급사 A 파산 선고”라는 제목의 이메일이 “부품 수급”과 인과적으로 연결되어 있음을 잠재 공간에서 파악합니다.
  • 답변: “직접적인 원인은 부품 수급 문제이나, 근본적으로는 주요 공급사 A의 파산이 영향을 미친 것으로 보입니다.” (심층 추론)

결론

현재의 RAG는 과도기적 기술입니다. 검색 모듈을 통해 LLM에 접목하는 방식은 단순한 사실 검색에는 유용하지만, 고차원적인 문제 해결과 추론에는 한계가 드러납니다.

CLaRa와 같은 프레임워크는 이러한 한계를 극복하기 위해 압축과 통합을 제안합니다.

  • 압축: 방대한 문서를 날것으로 읽지 않고, 핵심 의미로 압축하여 효율성을 높임
  • 통합: 검색과 생성을 별개의 작업이 아닌, 미분 가능한 하나의 활동으로 연결

여기서 얻을 수 있는 시사점은 단순히 어떤 벡터 데이터베이스를 사용할까? 혹은 어떤 LLM을 붙일까?를 고민하는 단계를 벗어나야 한다는 것입니다.

첫째, 단순히 텍스트를 검색하는 것을 넘어, 데이터의 의미를 어떻게 추출하고 압축할 것인가(SCP)에 대한 고민이 필요합니다.

둘째, 검색 정확도만 따질 것이 아니라, 최종 답변의 완결성과 인과 관계 파악 능력도 평가해야 합니다.

셋째, CLaRa와 같은 기술이 어느정도 완성이 되기 전까지는, 벡터 검색의 한계를 보완하기 위해 키워드 검색을 병행하고, 지식 그래프 등을 활용하여 인과성을 보강하는 전략이 필요합니다.

우리는 지금 “책을 펴고 시험보는 RAG”에서 “내용을 이해하고 숙지한” 단계로 진화하는 변곡점에 서 있습니다. “접목”을 넘어 “융합”으로 나아가는 것, 이것이 핵심이지 않을까 합니다.

1/11/2026

레거시 시스템 현대화를 위한 데이터 우선 전략과 기술적 실행 패턴

많은 기업이 레거시 시스템(Legacy System)을 현대화(Modernization)하려 할 때 가장 먼저 직면하는 벽은 분석이 어려운 코드입니다. 오랫동안 쌓인 스파게티 코드와 비즈니스 로직 그리고 파편화된 많은 줄의 코드들은 역공학(Reverse Engineering)을 어렵게 만듭니다.

대부분 현대화 프로젝트들은 코드를 먼저 분석하고 이를 이해하고 접근하는 방식을 취하지만, 이는 실패하거나 막대한 비용이 발생할 수 있습니다. 본 글은 레거시 시스템 현대화의 기술적 복잡성을 해결하려는 아키텍트와 개발 리더들을 위한 가이드라인을 담고 있습니다.


레거시의 진실은?

레거시 시스템은 사용되지 않는 코드와 비즈니스 로직처럼 보이지만 실제 다른 동작을 하는 코드 그리고 로직과는 무관한 주석이 존재할 수 있습니다. 그러나 데이터베이스(Database)에는 실제로 저장된 값이 담겨 있고 이는 비즈니스의 결과를 볼 수 있는 Fact입니다.

여기서 제가 언급하고자 하는 부분은 “데이터 출처 접근 방식” 입니다. 데이터 출처 접근 방식은 레거시 시스템의 DB 스키마를 데이터를 담는 그릇보다는 시스템 현대화를 위한 지도(Map)으로 바라봅니다. 코드를 읽어 내려가는 대신, 데이터베이스에 흐르는 데이터의 패턴, 제약 조건 그리고 In/Out을 분석하여 현대화할 대상과 범위를 정의합니다.


실행 전략

1단계로 데이터 모델링을 하여 현대화를 위한 영토 지도를 만들어야 합니다. 즉, 새로운 코드를 작성하기 전에 현 시스템의 논리적 모델을 분석해야 합니다. 아래의 작업들이 필요합니다.

  • 물리 스키마의 논리화: 실 데이터베이스 테이블 간의 관계를 역공학하여 논리 모델을 구축
  • 제약 조건 추출: 레거시 데이터베이스는 FK(Foreign Key)가 설정되지 않은 경우가 많습니다. 즉, 애플리케이션 로직 속에 숨겨진 데이터 간의 연관 관계를 찾아내서 명시해야 합니다.
  • 불필요한 데이터 식별: UI이나 보고서에 나타나지 않는 컬럼과 테이블은 현대화 대상에서 과감하게 제외합니다.
  • 미래 상태 모델링: 새로운 비즈니스 요구사항을 기반으로 마찰 지점을 파악합니다.

위 작업이 완료되면, 2단계로 데이터 프로파일링을 해야 합니다. 개발/인터페이스/UI 문서에는 특정 필드가 “필수”라고 명시되었지만, 실 데이터는 “옵션”일 수 있습니다. 시스템의 실제 사용 필드를 파악하기 위해 프로파일링을 수행해야 합니다.

  1. 통계 분석: 각 열에 대해 null 비율, 카디널리티를 계산합니다.
  2. 단일 항목 분석: DEFAULT 값 분포를 확인해야 합니다. 해당 열에 DEFAULT 값이 있는 경우가 99.9% 이상이면 이 데이터는 사용되지 않을 가능성이 높습니다.
  3. 상관 분석: 종속성을 감지 해야 합니다. A열의 값에 종속되는 B열의 값을 봐야 합니다.
  4. 문제 추출: 비즈니스에 의미가 없는 데이터를 지정해야 합니다.

3단계에서는 기존 시스템의 일관성 없는 명명 규칙이 없는 찾아봐야 합니다. 예를 들어서 고객 아이디를 cust_id, customer_id, c_id 등으로 지정했을 수 있습니다. 이런 것들을 조사해야 합니다.

  1. 항목 추출: 기존 스키마에서 모든 열 이름을 추출합니다.
  2. 단어 그룹화: 주소, 고객 등의 의미를 가지고 있는 이름들을 그룹화 합니다.
  3. 사전 생성: 표준 용어를 정의합니다. (저는 개인적으로는 영어사전에 있는 full name을 선호합니다.)
  4. 표준 정의: 모든 데이터 요소에 대한 표준을 정의합니다.
  5. 코드 값 정의: 플래그 값들이 존재하면 표준화 합니다.
  6. 매핑: 기존 열의 이름을 새 표준에 맞게 매핑합니다.
  7. 통합: 매핑된 정보를 기준으로 새 표준에 맞게 변경합니다.

그 다음 4단계로 동기화 브릿지를 구축합니다. 레거시 시스템과 현대화 시스템이 공존하는 기간 동안 데이터 일관성을 유지해야 하기 때문입니다.

  • CDC(Change Data Capture) 활용: 레거시 코드를 수정하지 않고도 데이터를 새 시스템으로 실시간 복제합니다.
  • 이벤트 기반 아키텍처: 데이터 변경을 이벤트로 발행하여 새로운 서비스들이 이를 소비하게 하고 이를 통해 각 서비스간 결합도를 낮춥니다.

5단계로 점진적 전환을 해야 합니다. “빅뱅” 방식의 전환은 항상 위험이 도사리고 있습니다. 특정 데이터 영역(고객 정보, 주문 정보 등)을 먼저 분리하여 새 시스템으로 옮기고, 레거시 시스템의 해당 기능을 점진적으로 비활성화합니다.


핵심 기술 패턴

CDC (Change Data Capture)

레거시 코드는 손대기 매우 위험합니다. CDC는 데이터베이스 엔진의 트랜잭션 로그를 직접 읽어 들여 소스 코드 수정 없이도 데이터 흐름을 추적할 수 있게 합니다. 이는 레거시를 현대화된 “이벤트 소스”로 변환하는 방법입니다.


트랜잭셔널 아웃박스 패턴 (Transactional Outbox Pattern)

데이터 우선 접근 방식에서 데이터 일관성을 보장하기 위해 사용됩니다. 로컬 트랜잭션내에서 비즈니스 데이터 업데이트와 이벤트 메시지 저장을 수행함으로써, 시스템 장애 시에도 데이터 유실이나 중복 처리를 방지합니다.


부패 방지 계층 (Anti Corruption Layer)

레거시 데이터 모델이 현대화 시스템의 도메인 모델을 오염시키지 않도록 중간에서 변환 역할을 수행하는 계층입니다. 이를 통해 현대화 시스템은 레거시 데이터 구조에 종속되지 않고 현대적인 설계를 유지할 수 있습니다.


리스크 관리와 성공을 위한 Tip

현대화 프로젝트의 70%는 기술적 난이도보다 데이터 무결성 문제로 어려움을 겪습니다. “데이터 우선” 전략이 성공하기 위해서는 아래의 사항을 기억해야 합니다.

  • 성능 저하 모니터링: CDC나 실시간 동기화가 레거시 데이터베이스의 성능에 미치는 영향을 철저히 테스트해야 합니다.
  • 조직적 협업: 데이터베이스 관리자나 비즈니스 분석가 개발자가 초기 모델링 단계부터 긴밀히 협력해야 합니다.
  • 완벽주의 포기: 모든 레거시 데이터를 가져갈 필요는 없습니다. 현재 비즈니스 가치가 있는 데이터에 집중해야 합니다.

끝으로, 현대화는 단순히 과거 기술 스택을 현대 기술 스택으로 넘어가는 것만이 아니라, 불필요한 것들을 정리할 수 있는 기회이기도 합니다. 코드부터 살펴보면 시스템 작동 방식의 복잡함에 기겁할 수 있습니다. 그러나 데이터부터 살펴보면 시스템이 실제로 무엇을 하는지 이해할 수 있습니다. 현대화 계획이 있다면 먼저 운영 데이터베이스를 프로파일링하세요.

1/09/2026

데이터 엔지니어, 파이프라인이 아닌 제품을 설계하라

과거의 데이터 엔지니어링은 “전달”에 집중했습니다. 소스 시스템에서 데이터를 가져와서 정제하고, 데이터웨어하우스에 적재하는 것만으로도 역할을 다했다고 평가 받았습니다. 하지만 데이터의 양이 폭증하고 비즈니스의 요구사항이 복잡해진 오늘날에는 단순히 데이터를 옮겼다는 것만으로는 충분하지 않습니다.

대부분 기업이 데이터 플랫폼을 구축했지만, 현업에서는 쓸만한 데이터가 없다거나 데이터의 신뢰도가 낮다라는 이야기를 하기도 합니다. 왜 이런 상황이 발생할까요? 이는 데이터 엔지니어가 “주문받는 사람”의 역할에 머물기 때문입니다. 이제 데이터 엔지니어는 스스로를 제품을 만드는 사람으로 재정의해야 합니다.

그래서 Data as a Product라는 개념이 등장합니다. 기존의 데이터는 서비스나 제품에서 나온 부산물로 취급되었습니다. 그러나 데이터를 제품으로 바라보는 관점(Data as a Product)에서는 데이터를 고객에게 가치를 전달하기 위해 설계된 제품으로 정의합니다.

Source: https://www.analytics8.com/blog/building-effective-data-products-a-step-by-step-guide/

왜 이런 개념이 나왔을까요?

데이터 소스가 다양해지면서 파이프라인만으로는 관리 효율이 떨어지게 되었고, 데이터 생산자와 소비자 간의 소통 부재로 인한 소통이 저하되었고, 기술적 성취보다는 비즈니스 성과로 데이터의 존재 가치를 증명해야 하는 시대적 상황이기 때문입니다.

데이터 엔지니어가 제품 관리자처럼 생각한다는 것은 단순히 기획 업무를 한다는 것은 아닙니다. 관점의 변화가 필요합니다.

첫째, 사용자 중심 사고가 필요합니다. PO는 항상 “제품을 누가 사용하는가?” 에 대해서 질문합니다. 데이터 엔지니어도 마찬가지입니다. 그럼 어떤 사고를 해야 할까요?

  • 페르소나 정의: 데이터 분석가, 데이터 사이언티스트, 비즈니스 의사 결정권자, 현업 등 각 사용자별로 데이터를 통해 해결하려는 문제가 무엇인지 파악해야 합니다.
  • 사용자 여정 분석: 사용자가 데이터를 발견하고, 이해하고, 활용하여 인사이트를 얻기까지의 과정에서 겪는 Pain-points를 분석해야 합니다.

둘째, 결과 중심의 사고를 해야 합니다. Output과 Outcome을 명확하게 정의해야 합니다.

  • Output: 10개의 파이프라인을 구축하고 100개의 테이블을 생성
  • Outcome: 마케팅 캠페인 최적화로 인한 매출 15% 상승, 의사 결정 속도 2배 향상 등 기술적 구현(Output)에 매몰되지 않고, 비즈니스에 어떤 영향을 주는지 집중

셋째, 로드맵과 우선순위를 설정해야 합니다.

모든 데이터를 다룰 수는 없습니다. PO처럼 비즈니스 임팩트와 구현 난이도를 고려하여 제품 백로그를 관리해야 합니다.

그럼 실무에는 어떻게 적용을 해야 할까요? 재밌는 점은 데이터 제품도 일반적인 소프트웨어 제품처럼 Life-cycle을 가진다는 것입니다.

첫째, 문제를 발견하고 기획을 해야 합니다. 사용자와 인터뷰를 하면서 “어떤 데이터가 필요해요?”라고 묻기보다는 “어떤 질문에 답을 하고 싶으세요?” 라고 질문해야 합니다. 예시를 들면 “로그 데이터가 필요해요.” 보다는 “고객이 결제 페이지에서 이탈하는 이유를 알고 싶어요.”로 문제를 재정의 해야 합니다.

둘째, 설계 및 Data Contract를 정의해야 합니다. 데이터 생산자와 소비자 간의 약속(스키마, 품질 지표, 갱신 주기 등)을 정의합니다. 이렇게 해야 소스 시스템의 변경으로 인해 파이프라인이 깨지는 현상을 방지할 수 있습니다.

셋째, 개발 및 모니터링을 해야 합니다. 제품이 출시된 후 잘 작동하는지 모니터링 하듯이, 데이터의 건강 상태를 체크해야 합니다. 데이터 가용성/최신성을 보장해야 하고, 구체적인 품질 목표 수치를 설정해야 합니다.

위에서 언급한 것처럼 데이터 엔지니어의 역할 범위가 넓어지게 되면 모든 도메인의 데이터를 이해하고 가공하는 것이 가능할까요? 저는 불가능하다고 생각됩니다. 그래서 중요한 것이 “책임의 분산”입니다.

  • 도메인 중심 소유권: 각 비즈니스 부서가 자신들의 데이터를 제품으로서 책임지고 관리해야 합니다.
  • 셀프 서비스 제공: 데이터 엔지니어는 각 부서가 데이터를 제품화할 수 있는 셀프 서비스 플랫폼을 제공해야 합니다.

위에서 언급한 환경을 어떻게 적용 할 수 있을까요?

데이터 제품도 MVP(Minimum Viable Product)처럼 시작해야 합니다. 처음부터 완벽하게 만들 수는 없습니다. 가장 시급한 문제를 해결하는 작은 데이터부터 제공하며 피드백 교류를 해야 합니다.

데이터 엔지니어가 제품을 잘 만들어도 소비자가 쓰지 못하면 소용 없습니다. 사용자를 대상으로 데이터 구조 및 활용법을 지속적으로 교육해야 합니다.

끝으로,

데이터 엔지니어링의 성공 지표는 “데이터 제품의 채택률”과 “사용자 만족도”가 되어야 합니다. 기술적으로 잘하는 것은 기본입니다. 기본위에 비즈니스와 사용자에 대한 이해라는 옷을 입을 때, 데이터 엔지니어는 단순한 기술 지원 역할을 넘어 비즈니스의 성장을 견인하는 핵심 파트너로 거듭날 수 있습니다.


[Tip] 데이터 엔지니어를 위한 제품 관리자 체크 리스트

데이터 엔지니어가 새로운 파이프라인을 구축하거나 데이터 제품을 기획할 때, 스스로에게 던져야 할 질문을 정리해봤습니다. 참고해주세요.

[ ] 누가 이 데이터를 사용하는가?

[ ] 사용자는 이 데이터로 어떤 비즈니스 문제를 해결하려고 하는가?

[ ] 이 데이터가 생성되지 않거나 틀렸을 때 발생하는 문제점은 무엇이고, 기회비용은 얼마인가?

[ ] 기존에 유사한 데이터가 있는가? (e.g 데이터 중복 방지)

[ ] Data contact이 체결 되었는가?

[ ] 데이터 신선도 기준은 무엇인가? (e.g 매일 오전 8시 업데이트, 실시간 등)

[ ] 민감 정보(개인정보 등)에 대한 비식별화 처리가 되었는가?

[ ] 데이터 파이프라인 가시성이 확보 되었는가? (e.g 장애 발생 시 알림 등)

[ ] 데이터 Lineage가 기록되고 있는가? (e.g 데이터 출처 및 흐름 파악)

[ ] 사용자가 데이터를 찾는데 걸리는 시간이 단축 되었는가?

[ ] 이 데이터 제품의 채택률은 얼마나 되는가?

[ ] 사용자 피드백을 수집할 채널이 준비되어 있는가?

12/30/2025

가독성의 은밀한 비용, 코드 포맷팅이 LLM 예산을 어떻게 소모하는가?

아카이브(arXiv.org)에서 흥미로운 논문을 읽었고 내용을 정리해봅니다.

소프트웨어 엔지니어링 역사에서 “가독성”은 성역과도 같은 가치였습니다. 코드는 컴퓨터가 실행하기 위해 작성되지만, 인간이 읽기 위해서도 작성된다는 이야기가 많았지요. 그래서 개발자들은 들여쓰기 규칙을 놓고 탭과 스페이스 논쟁을 벌이기도 했답니다. 이러한 것들은 결국 “인간의 인지 부하”를 줄이기 위함이었지요.

그러나 LLM이 주도하는 AI기반 코딩의 시대가 도래하면서 예상치 못했던 상황들이 발생하고 있습니다. “우리가 주변 동료를 위해 넣어둔 그 많은 공백과 줄바꿈이 과연 AI에게도 유용한가?”라는 질문에 답을 해야하는 시점입니다. 제가 읽은 논문은 이 질문에 대해 충격적인 답을 내놓습니다. 우리가 코드 가독성을 높이기 위해 사용하는 포맷팅 요소들이, LLM의 관점에서는 아무런 의미 정보가 없는 “노이즈”일 뿐이고, 막대한 토큰 비용을 발생시키고, 추론 속도를 저하시키는 주범이라는 것입니다.

위 그림은 포맷팅된 자바 코드와 포맷팅되지 않은 자바 코드 조각을 비교한 것입니다. 같은 배경색으로 표시된 문자는 동일한 토큰을 나타냅니다. 포맷팅되지 않은 코드는 구문의 정확성을 유지하면서 들여쓰기, 공백 및 줄 바꿈을 제거하여 생성됩니다.

그럼 한번 내용을 상세하게 파헤쳐볼까요?


문제의 정의: 토큰 경제와 공백 문자

현대 개발은 IDE에서 코드를 작성할 때 자동 포맷터를 사용하여 코드를 예쁘게 정렬합니다. 함수 인자가 길어지면 줄을 바꾸고, 블록 사이에서는 빈 줄을 넣어 가독성을 확보합니다. 이런 시각적 구조화는 인간의 뇌가 코드를 패턴으로 인식하는데 필수적입니다.

그러나 LLM은 코드를 2차원 구조가 아닌 1차원 방식으로 인식합니다. LLM에게는 개행이나 공백은 토큰일 뿐입니다. 문제는 이것이 전체 코드의 상당 부분을 차지하고 있다는 점입니다.

LLM의 비용은 토큰 수에 비례합니다. 토큰 수가 늘어날수록 아래와 같은 현상이 발생합니다.

  1. 비용 증가: 불필요한 공백처리에도 비용을 지불해야 합니다.
  2. 지연 시간 증가: 모델이 처리하고 생성해야 할 토큰이 많아지기에 응답 속도가 느려집니다.
  3. 컨텍스트 윈도우 낭비: 제한된 컨텍스트에 더 많은 유효 코드를 담지 못하고 공백으로 채우게 되어, 코드 분석 시 성능 저하를 유발합니다.

이 비효율성의 원인은 BPE(Byte Pair Encoding)와 같은 Tokenizer의 작동 방식에 있습니다. Tokenizer는 자주 등장하는 문자열 패턴을 하나의 토큰으로 압축하려 시도합니다. 하지만 코드의 공백 패턴을 매우 다양하고 불규칙하기에 효율적인 압축이 어렵습니다.

일반적으로 int a = 1; 에 대한 토큰화는 [int], [ a], [ =], [ 1], [;] 이렇게 수행됩니다. 만약에 개행이 있으면 [\n], [\n] 으로 토큰화됩니다.

연구에 따르면, 소스 코드에서 포맷팅 요소를 제거하는 것만으로도 전체 토큰의 약 24.5%를 줄일 수 있다고 합니다. 이는 우리가 LLM에 지불하는 비용의 1/4이 단지 코드를 예쁘게 만들기 위한 포맷팅 처리에 쓰이고 있음을 시사합니다.


연구 분석

논문의 연구팀은 아래의 가설을 검증하기 위해 실증 연구를 수행했습니다. 연구의 핵심 가설은 세 가지 입니다.

  1. RQ1: 포맷팅 제거가 LLM의 성능과 효율성(토큰 감소)에 어떤 영향을 미치는가?
  2. RQ2: 어떤 포맷팅 요소(개행, 들여쓰기)가 가장 큰 영향을 미치는가?
  3. RQ3: LLM이 비정형 코드를 생성하도록 최적화 할 수 있는가?

연구팀은 공정한 평가를 위해 아래의 실험 환경을 구축했습니다.

  • 대상 언어: Java, Python, C++, C#
  • 실험 상용 모델: GPT-4o, Gemini-1.5-pro, Claude-3.5-Sonnet
  • 실험 오픈 모델: DeepSeek-Coder-V2, StarCoder2, CodeLiama
  • 평가 방식: 코드의 중간 부분을 비워두고 LLM이 이를 채우게 하여, 문맥 이해도와 생성 능력을 평가
  • 데이터셋: 각 언어별 대규모 리포지토리 데이터

실험은 원본 코드와 구문적 정확성은 유지하되 모든 시각적 포맷팅을 제거한 코드를 각각 모델에 입력하여 비교하는 방식으로 진행되었습니다.


RQ1: 성능 저하 없는 효율성 증대

실험 결과는 시각적 포맷팅을 제거한 코드를 사용했을 때, LLM의 코드 생성 성능은 떨어지지 않거나, 일부 케이스에서는 향상되었습니다.

  • 토큰 감소 효과: 4개 언어 평균 24.5%의 입력 토큰 감소가 확인되었습니다. 이는 별도의 알고리즘적 압축 없이, 단순히 텍스트 전처리만으로 얻을 수 있는 수치입니다.
  • 성능 유지: GPT-4o나 Gemini-1.5와 같은 모델들은 포맷팅이 없는 코드(한줄로 이어진 코드)를 입력받아도, 그 의미를 완벽하게 파악하고 올바른 코드를 생성했습니다.

위 결과는 LLM에게 코드는 텍스트라기보다 논리적 심볼의 연속이라는 가설을 뒷받침해줍니다. 인간에게는 가독성이 인지적 윤활유 역할을 했지만, LLM에게는 방해물이 될 수 있다는 것입니다.


RQ2: 토큰 낭비의 주범은 개행

연구팀은 어떤 포맷팅 요소가 가장 많은 토큰을 낭비하는지 요소별 제거 실험을 수행했습니다.

  • 개행(Newlines): 토큰 증가의 가장 큰 원인입니다. 특히 함수 선언부, 긴 인자 리스트, 블록 구분을 위한 빈 줄 등이 누적되어 막대한 토큰을 소모합니다.
  • 들여쓰기(Indentation): 토큰 증가 영향도는 높음입니다. 중첩된 루프나 조건문이 많은 코드에서 급격히 증가합니다. Python과 같이 들여쓰기가 강제되는 언어에서는 제거가 제한적일 수 있습니다.
  • 연산자 공백: 토큰 증가 영향도는 낮습니다. a = b + c를 a=b+c로 줄이는 것은 토큰 수에 큰 영향을 주지 않았습니다. 대부분의 Tokenizer가 이를 효율적으로 처리하기 때문입니다.

위의 결과를 보면 개행 문자 제거가 가장 드라마틱한 효과를 보였습니다. 예를 들어 C++ 코드에서 개행을 모두 제거했을 때, Claude 모델에서는 입력 토큰이 약 18.7% 감소했습니다. 이는 코드 스타일 가이드가 권장하는 한 줄에 하나의 명령문 규칙이 LLM 시대에는 비용 효율성을 저해하는 요인이 됨을 시사합니다.


RQ3: 입력뿐만 아니라 출력도 줄일 수 있는가?

입력 토큰을 줄이는 것은 이미 작성된 코드를 전처리하면 되기에 비교적 쉽습니다. 연구팀은 LLM이 생성하는 코드도 포맷팅을 제거하여 비용을 아낄 수 있는지에 대해 두 가지 테스트를 했습니다.


테스트 1: 프롬프트 엔지니어링

프롬프트에 “불필요한 공백이나 줄바꿈을 넣지 말고, 한 줄로 코드를 작성해줘”라고 지시하는 방식입니다. 이는 모델별 편차가 컸고 GPT-4o가 지시를 잘 따르며 토큰을 줄였다고 합니다. Gemini-1.5의 경우, C++ 코드 생성 시 포맷팅을 제거하라는 지시를 과도하게 해석하여 문법적으로 잘못된 코드를 생성했습니다. 이는 프롬프트만으로는 복잡한 문법 규칙을 유지하면서 포맷팅만 제거하는 미묘한 제어를 하기 어렵다는 것을 보여줍니다.


테스트 2: 파인 튜닝

적은양의 비정형 코드 데이터셋으로 모델을 추가 학습 시키는 방식입니다. 결과는 성공적이었고, 단 50개의 비정형 코드 샘플만으로 파인 튜닝을 해도, Gemini-1.5와 GPT-4o 모두 성능 저하없이 출력 토큰을 각각 35.9%, 24.8%를 줄였습니다. 이는 LLM이 코드의 “형태”가 아닌 “의미”를 학습할 수 있는 유연성을 가졌음을 의미합니다. 자체 코딩 모델을 구축할 때, 학습 데이터에서 포맷팅을 제거하는 전처리를 수행하면 추론 속도와 비용면에서 훨씬 유리한 모델을 만들 수 있다는 결론에 도달 합니다.


양방향 코드 변환 도구

본 논문의 결과를 현장에 적용하기 위해서 연구팀은 양방향 코드 변환 도구를 개발하여 공개했습니다. 이 도구는 가독성과 효율성이라는 상충하는 가치를 조화시키는 가교 역할을 합니다.

본 도구는 사람이 읽기 쉽고 형식이 잘 갖춰진 코드와 LLM이 사용하기 편리한 간결한 코드 간의 양방향 변환을 지원합니다.

위 그림에서 볼 수 있듯이, 도구를 사용하면 이중 변환 추론 워크플로우를 구축할 수 있습니다. 이를 통해 LLM은 효율적이고 간결한 코드의 이점을 누리는 동시에 개발자는 익숙한 포맷팅의 코드를 사용할 수 있습니다. 입력 코드에서 서식 요소를 제거하여 LLM이 이해하는데 필요한 토큰 사용량을 줄입니다. 출력에서는 LLM이 생성한 코드의 서식을 복원하여 사람이 읽기 쉽도록 합니다.

연구팀은 MCEval(Massively Multilingual Code Evaluation, 대규모 다국어 코드 평가) 데이터셋을 활용해 도구의 안정성을 검증했습니다.

  • 무결성 검증: 변환 전후 코드의 AST(Abstract Syntax Tree)가 동일함을 100% 검증했습니다. 즉, 로직이 변질될 위험이 없습니다.
  • 처리 속도: 평균 76ms의 지연 시간을 기록했습니다. LLM의 네트워크 왕복 시간이나 추론 시간에 비하면 무시할 수 있는 수준입니다.

시사점

이 연구 결과는 LLM처리에서 코드 가독성의 숨겨진 비용을 밝히고, “인간에게 좋은 것이 반드시 AI에게도 좋은 것은 아니다.”라는 시사점을 줍니다.

  1. 가독성의 비용 인식: 코드의 공백과 줄바꿈은 LLM 예산의 약 1/4을 낭비하고 있습니다. 이를 인지하고 관리해야 합니다.
  2. 안전한 제거: 최신 LLM은 포맷팅이 없어도 코드의 로직을 완벽하게 이해합니다. 두려움 없이 압축해도 됩니다.
  3. 도구의 도입: 양방향 변환 도구를 개발 파이프라인에 통합하는 것을 고려해야 합니다.

우리는 오랫동안 코드를 “인간이 읽기 위한 문학”처럼 다루어 왔습니다. 하지만 AI와 협업하는 시대에 코드는 “AI가 처리할 데이터”의 성격도 동시에 가지게 됩니다. 이제 개발자들은 두 가지 모드를 유연하게 오가야 합니다. 코드를 작성하고 리뷰할 때는 최대한 가독성을 높여야 하지만, 이를 AI에게 넘길 때는 과감하게 군더더기를 덜어내야 합니다.


참고:

12/24/2025

WeKnora v0.2.0 런칭

얼마전 Tencent에서 WeKnora v0.2.0을 런칭했습니다. 그런데 최근의 움직임과 약간 다른 느낌이 들었습니다.

최근 구글의 Gemini나 OpenAI의 모델들이 100만 토큰 이상의 방대한 컨텍스트를 한 번에 처리하기 시작하면서, 이제 RAG(Retrieval-Augmented Generation)의 시대는 끝났다라고 흔히들 얘기하는 시점이니까요. 책 수백 권 분량을 한 번에 AI에게 던질 수 있는데, 왜 굳이 복잡하게 RAG를 거쳐야 하느냐는 논리입니다.

한편으로는 이렇게 생각해볼 수 있습니다. 아무리 큰 바구니(컨텍스트)가 있어도, 그 안에 수많은 데이터를 다 담을 수는 없으며, 매번 수백만 줄의 텍스트를 읽게 하는 것은 비용과 시간을 낭비할 수 있다고 볼 수 있습니다. 이런 배경으로 인해 Tencent가 공개한 WeKnora는 Agentic RAG를 제시한 것이 아닌가 싶네요.

WeKnora를 이해하기 전에 왜 현 시점에서 RAG가 필수적인지 짚고 넘어갈 필요성이 있습니다.

  • 비용 효율성: 100만 토큰을 매번 사용하면서 질문하는 것은 꽤 많은 통행료를 내는 것과 같습니다. RAG는 전체 데이터 중 필요한 것만 찾아 모델에게 전달하기에 비용을 절감할 수 있습니다.
  • 답변 속도: 거대 모델이 방대한 데이터를 읽고 답하는 데는 꽤 오랜 시간이 걸릴 수 있습니다. 그러나 고성능 RAG 엔진은 빠르게 답변을 생성합니다.
  • 환각 증상 방지: 모델이 아무리 똑똑해도 기억에 의존하면 거짓말을 할 수 있습니다. 명확한 근거를 주면 환각 증상을 예방할 수 있습니다.

위 관점에서 WeKnora를 보면, 단순히 문서를 데이터베이스에 저장하는 것을 넘어, AI가 그 문서를 이해하고, 필요한 정보를 찾기 위해 추론하며, 외부 도구를 사용해 검증하는 전 과정을 자동화합니다. 이미 Tencent 내부에서 Dog fooding으로 검증하지 않았을까? 라는 생각이 듭니다.

최근 업데이트된 v0.2.0은 단순한 검색 도구에서 자율형 AI 비서로 격상시켰습니다. 그 이유는 아래와 같습니다.

1) ReACT 에이전트 모드

기존 RAG는 질문을 받으면 검색하고 끝이었습니다. WeKnora의 에이전트 모드는 ReACT(Reason + Act) 알고리즘을 사용합니다.

  • 추론(Reason): 사용자가 우리 회사 작년 매출과 올해 전망을 질문했네? 그럼 작년 결산내역과 올해 사업 계획서 두 개를 찾아야겠다.
  • 행동(Act): 실제로 두 문서를 검색하고, 필요하다면 외부 검색을 통해 경쟁사의 동향까지 파악
  • 결과: 단순 요약이 아니라, 여러 출처의 데이터를 종합한 인사이트를 제공

2) MCP(Model Context Protocol) 지원

WeKnora는 앤트로픽이 주도하는 MCP 규격을 채택했습니다. 이는 WeKnora가 구글 드라이브, 슬랙, 깃허브 등 다양한 외부 서비스 및 앱과 연결될 수 있음을 의미합니다. 지식이 문서내에서만 머물지 않고, 여러 서비스 및 도구를 통해 추출됩니다.

3) GraphRAG

단순 키워드 검색은 관련 단어가 없으면 답을 못합니다. WeKnora는 지식 그래프(Knowledge Graph) 기술을 도입해 단어와 단어 사이의 관계를 파악합니다. “A 프로젝트 담당자가 누구야?” 라는 질문에 “그 담당자가 작년에 쓴 B 문서에 따르면…” 식으로 연관도니 모든 정보를 캐낼 수 있습니다.

WeKnora의 새로운 기능은 아래와 같습니다.

WeKnora는 모듈 방식을 채택하여, 문서에 대한 이해와 검색 파이프라인 구축을 지원합니다.

ReACT 에이전트 모드

  • 내장 도구를 사용하여 지식 기반을 검색할 수 있는 새로운 에이전트 모드
  • MCP 도구 및 웹 검색을 호출하여 외부 서비스에 엑세스
  • 종합적인 요약 보고서를 위한 여러번의 반복 및 숙고
  • 교차 지식 기반 검색 지원

다중 유형 지식 기반

  • FAQ 및 문서 지식 기반 유형 지원
  • 폴더 가져오기, URL 가져오기, 태그 관리
  • 온라인 지식 입력 가능
  • FAQ 항목 일괄 가져오기 및 삭제

MCP 도구 통합

  • MCP 프로토콜을 통해 에이전트 기능을 확장
  • 내장형 uvx 및 npx MCP 런처
  • Stdio, HTTP Streamable, SSE 전송 지원

웹 검색 통합

  • 확장 가능한 웹 검색 엔진
  • DuckDuckGo 내장 검색 기능

대화 전략 설정

  • 에이전트 모델과 일반 모드 모델을 별도로 구성
  • 구성 가능한 검색 임계값
  • 온라인 프롬프트 구성
  • 다중 턴 대화 동작에 대한 정밀한 제어

새롭게 디자인된 UI

  • 대화 인터페이스에서 상담원 모드/일반 모드 전환 기능
  • 툴 호출 실행 프로세스 표시
  • 시간 순서대로 그룹화된 세션 목록
  • 지식 기반 페이지의 탐색 경로

인프라 업그레이드

  • MQ 기반 비동기 작업 관리
  • 버전 업그레이드 시 데이터베이스 자동 마이그레이션
  • 빠른 개발 모드 지원

AI 모델 자체가 똑똑해지는 것보다 더 중요한 것은 “모델이 데이터를 얼마나 정확하게 알고 있는가?” 입니다. WeKnora는 Long Context LLM이 줄 수 없는 경제성, 정확성 그리고 확장성을 제공합니다.

에이전틱 RAG가 궁금하면 한번 경험해보세요.

WeKnora 기술 스택

  • Backend: Go
  • Frontend: Vue.js (중국이다보니…)
  • 백터 데이터베이스: PostgreSQL(pgvector), Elasticsearch
  • LLM 지원: Qwen, DeepSeek, Ollama 등
  • 지식 그래프: Neo4j (선택 사항)

설치 참고: https://github.com/Tencent/WeKnora


12/22/2025

DevOps의 한계와 대안 탐색

약 15년전 등장한 DevOps는 철학이 매우 좋았습니다. 자동화, 지속적 통합(CI), 지속적 배포(CD)는 마치 모든 것을 해결해 줄 것처럼 여겨졌습니다. 하지만, 요즘은 DevOps는 실패했다. 혹은 DevOps는 허구다. 라는 냉소적인 목소리가 나오고 있습니다. 무엇이 잘못되었을까요?

DevOps의 본질은 “문화”와 “협업”이었지 “직무”가 아니었습니다. DevOps는 개발자에게 “코딩부터 배포, 모니터링, 운영”까지 직접하라고 요구합니다. 그러나 이는 인간의 인지 능력을 너무 높게 평가한 것 같습니다. 이유는 Full-stack을 넘어 Full-lifecycle을 요구받는 형태이고 이는 결국 개발 생산성 저하와 번아웃으로 이어질 수 있습니다.

비즈니스의 목적은 “가치 전달”이지 “파이프라인 구축”이 아닙니다. 실용적인 플랫폼을 지향해야 함에도, 필요 이상으로 복잡한 시스템을 구축하며 이를 “DevOps”의 성과라고 착각할 수 있습니다. 고객에게 필요한 기능을 하나 더 만드는 것보다, K8S 클러스터를 얼마나 더 세련되게 구축하느냐에 집중되는 우려가 있을 수 있습니다.

그렇다고 DevOps는 나쁜 개념은 아닙니다. 모든 상황에 적합하지 않을 뿐입니다. 현대적인 DevOps 도구를 적용하기 힘든 오래된 시스템에 억지로 DevOps를 도입하려다가 문제가 발생할 수 있습니다. 그리고 아주 작은 스타트업이나 제품일 경우에는 복잡한 CI/CD 환경을 구축하는 것보다 단순한 배포가 비용 대비 훨씬 효율적일 수 도 있습니다.

위에서 언급한 한계를 극복하기 위해 요즘은 “플랫폼 엔지니어링”이 언급되고 있습니다. 쉽게 말해서 개발자가 인프라 걱정 없이 코드에만 집중할 수 있도록 편의 시설이 다 갖춰진 맞춤형 작업 공간을 만들어주는 일이라고 이해하면 됩니다.

현 Cloud 서비스는 강력함과 복잡함을 지니고 있습니다. 또한 범용 도구라 회사 보안 규정이나 배포 방식을 모릅니다. IDP는 회사 내부 정책을 미리 심어둡니다. 또한 Cloud는 실수를 하여 자원을 삭제할 가능성이 있지만, 잘 설계된 IDP는 안전한 범위내에서 활동하도록 제공됩니다.

DevOps와의 차이점은 아래와 같습니다.

1. 플랫폼을 “제품(Product)”로 인지

플랫폼 엔지니어는 단순히 도구를 설치하는 사람이 아닙니다. 내부 개발자를 “고객”으로 생각하고, 그들이 겪는 불편함을 해결해주는 제품을 만듭니다. 이를 위해 개발자들의 피드백을 받고 지속적으로 개선하지요.

2. 셀프 서비스 기반

개발자가 서버 리소스가 필요할때마다 요청을 보내고 기다릴 필요가 없습니다. 플랫폼에 접속해서 직접 생성하면 됩니다.

3. Golden Path 제공

모든것을 자유롭게 하세요. 라는 것은 막막할 수 있습니다. 플랫폼 엔지니어링은 현 조직에서 가장 안전하고 효율적이라고 검증된 표준경로를 제공합니다. 개발자는 이 길만 따라가면 보안, 성능 걱정없이 배포할 수 있습니다.

플랫폼 엔지니어링을 보면 Cloud와 같은 것 아냐? 라고 생각할 수 있습니다. 차이가 좀 있는데, Cloud는 원재료를 파는 거대한 마트라면, 내부 개발자 플랫폼(IDP)는 그 재료들을 모아 우리 회사 입맛에 맞게 만든 밀키트라고 보시면 됩니다. 그래서 손이 덜 가는 것이겠죠.

결론적으로 DevOps는 사라지지 않았습니다. 다만, 우리가 가졌던 “환상”은 어느정도 사라져야 합니다. 현재 시점은 개발자에게 모든 부담을 주는 대신, 개발자가 편하게 배포할 수 있는 플랫폼 엔지니어링으로 나아가고 있습니다. 중요한 것은 “어떤 도구를 쓰는가?” 가 아니라 “우리 조직이 고객에게 가치를 전달하는데 무엇이 병목인가?”를 객관적으로 직시하는 실용주의 태도라고 생각합니다.

즉, 개발자가 모든 것을 알아야 한다는 상황에서 개발자가 가치를 만드는데 방해되는 병목을 제거한다로 진화하고 있다고 생각합니다.