본문
단순 검색으로는 찾을 수 없는 레거시 코드, '맥락'을 이해하는 AI 코딩 Agent 구축 기술
일반적인 Python이나 Java 환경이라면 훌륭한 코딩 툴이 많지만, 사내 고유의 Customized Proframe 환경은 사정이 달랐습니다. 개발 생산성을 높여보고자 하는 마음으로 AWS 서비스를 활용해 '사내 맞춤형 코딩 Agent' 만들기에 도전했습니다.
과정은 쉽지 않았습니다. 특히 LLM이 학습하지 못한 데이터를 다룰 때는, 데이터를 어떻게 가공해서 전달하느냐가 결과물의 품질을 좌우한다는 것을 배웠습니다.
비슷한 고민을 하시는 분들께 조금이나마 도움이 되기를 바라며, AWS Glue와 OpenSearch 등을 활용해 검색 품질을 개선해 나갔던 과정을 정리해 보았습니다.

1. 청킹(Chunking): 코드의 논리적 완결성 확보
RAG(검색 증강 생성) 구현 시 가장 흔히 사용하는 '고정 크기(Fixed-size)' 청킹은 코드의 논리를 끊어버릴 위험이 큽니다. 우리는 문서와 소스코드의 성격에 맞춰 전략을 이원화했습니다.
A. 가이드/매뉴얼 (Unstructured Text)
- 구조 기반 청킹 (Structure-aware Chunking): 가이드 문서는 대주제 > 소주제 > 예제의 위계를 가집니다. 단순 텍스트 분할 대신 Markdown 헤더(#)나 HTML 태그를 기준으로 잘라 의미 단위를 보존했습니다.
- 테이블 데이터 보존: '에러 코드표'나 '파라미터 정의' 같은 표 데이터는 줄 단위로 나뉘면 정보 가치를 잃습니다. 표 전체를 하나의 청크로 유지하거나, Key: Value 형태의 텍스트로 변환하여 임베딩했습니다.
B. 소스코드 (Structured Code)
- AST 및 구문 기반 분할: 소스 코드는 라인 수가 아닌 논리 단위가 중요합니다. 함수(Function), 프로시저(Procedure), 클래스 단위로 청킹했습니다.
- Regex 활용: 전용 Parser가 부재한 상황에서는 AWS Glue 스크립트 내에서 정규식(Regex)을 활용해 BEGIN-PROC ~ END-PROC 블록을 인식하고 이를 하나의 단위로 처리했습니다.
2. 의미부여(Enrichment): 코드에 의미를 더하자
소스코드만 그대로 벡터화하면, "재고 조회 기능 찾아줘"라는 자연어 질문에 RETR_STCK_MT 같은 약어 함수명을 매칭하기 어렵습니다. 이 간극을 메우는 것이 핵심입니다.
- Code-to-Text 요약 (Key Strategy):
- 방법: Glue ETL 파이프라인 중간에 Amazon Bedrock (LLM)을 호출합니다.
- 프롬프트: "이 Proframe 코드가 수행하는 기능을 한글로 요약해 줘."
- 적용: [생성된 요약문 + 코드 본문]을 결합하여 임베딩합니다. 이로써 자연어 검색과 코드 검색 모두에서 높은 정확도를 확보했습니다.
- 메타데이터 필터링:
- OpenSearch 인덱스에 version, module_type (UI/DB/Batch), file_path 등을 메타데이터로 별도 저장하여, 쿼리 시 불필요한 범위를 사전에 제거(Pre-filtering)했습니다.
3. 검색 전략: 하이브리드 검색으로 정확도 극대화
개발자의 질문은 구체적인 에러 코드 검색부터 추상적인 기능 구현 방법까지 다양합니다. 다양한 니즈를 모두 충족하기 위해 Hybrid Search 전략을 채택했습니다.
- 벡터 검색 (Semantic Search): "화면 갱신 로직 알려줘"와 같이 맥락과 의도를 파악해야 할 때 사용합니다. (Titan Embeddings v2 활용)
- 키워드 검색 (Lexical Search - BM25): 특정 API 이름(set_data_store)이나 에러 코드(ERR-001)처럼 정확한 명칭을 찾아야 할 때 사용합니다.
최종적으로 OpenSearch의 Hybrid Search 기능을 통해 두 검색 점수를 결합(Normalization & Combination)하여 최적의 결과를 제공합니다.
- Semantic Search:
- 확한 함수명이나 키워드를 몰라도, 구현하고자 하는 기능의 의도를 자연어로 검색하여 필요한 로직을 찾습니다.

- Lexical Search (BM25):
- 특정 변수명이나 에러 코드(ERR-DB-009) 등 정확한 키워드 매칭을 보완합니다.

Glue ETL 워크플로우
- S3 Load: 원본 소스 및 가이드 문서 로드
- Cleaning: 주석 정리(선택적) 및 불필요한 공백 제거
- Splitting: 정규식 기반의 로직 단위 청킹 (Python Shell)
- Enrichment: Bedrock API를 호출하여 코드 설명(주석) 생성 (Batch 처리)
- Embedding: 텍스트 데이터를 벡터로 변환
- Upsert: OpenSearch에 벡터 및 메타데이터 Bulk Insert
댓글