본문 바로가기
AI/AI 서비스 개발

[1편] 자바 개발자의 AI Agent 구축기: 설계, 기술 스택, 학습

by 워니 wony 2025. 6. 13.

 

요즘 AI가 워낙 핫하다 보니, 챗GPT로 개발에 도움받아 본 적 없는 개발자는 이제 거의 없지 않을까 싶다.

나도 개발하다 막히면 자연스럽게 AI의 도움을 받게 되고, 덕분에 AI 관련 기술과 서비스 설계 쪽에도 관심이 생겨서, 온라인 강의나 블로그도 종종 찾아보면서 기본적인 AI 개념들을 조금씩 익히고 있던 중이었다.

공부만으로는 한계가 있다고 느끼던 시점이라, 언젠가 실무에서 직접 경험해 보고 싶다는 생각이 들 무렵 회사에서 내가 담당하고 있던 서비스에 AI 기반 기능을 도입하려고 담당자를 배정한다는 얘기가 들렸다.

기존에 하던 프로젝트가 바쁜 편이었지만, LLM 기반 서비스 설계와 개발을 직접 해볼 수 있는 기회는 이번뿐이라는 생각이 들었다.

무엇보다 내가 맡고 있던 서비스 도메인을 가장 잘 이해하고 있다는 자신감도 있었고, 실무 경험을 통해 지금까지 공부만 해왔던 AI 개발을 제대로 배울 수 있는 기회라는 점이 가장 크게 다가왔다.

기회를 놓치고 싶지 않아 적극적으로 관련 경험과 학습 상황을 어필했고, AI 기능 개발 업무까지 추가로 맡게 됐다.

 

그렇게 시작한 AI 기반 에이전트 설계와 개발.

참고로 나는 Java 백엔드 개발자다.

AI 프로젝트에 처음 투입됐을 때 Python은 크롤링 정도만 할 줄 아는 수준이었다.

그런 상태에서 AI Agent 설계, RAG 검색 시스템 구축까지 맡게 되면서 쉽지 않은 순간도 많았다.

그래도 요즘은 AI 도구들도 많고, 커뮤니티에도 좋은 정보가 많아서 생각보다 빠르게 개발 해볼 수 있었고, 기능 오픈을 목표로 짧은 기간 동안 빠르게 개발을 진행하면서 시행착오도 많고 배운 것도 정말 많았다.

 

혹시 나처럼 "AI 개발은 처음인데 백엔드 개발자인 내가 해도 괜찮을까?" 고민하는 분들이 있다면, 이 글이 조금이나마 참고가 됐으면 한다.

이번 글에서는 내가 어떻게 구조를 설계했고, 적용하면서 어떤 어려움과 시행착오를 겪었는지 그 경험을 솔직하게 풀어보려한다.

 

[참고] 본문에 등장하는 서비스 예시는 실제 내가 담당한 서비스와는 다른 예시 도메인을 사용하고 있다. 실무 코드 및 도메인을 그대로 공개할 수 없는 관계로, 이해를 돕기 위해 유사한 예시로 각색하여 작성하였다.

 


AI Agent 도입 배경과 목표

내가 담당하고 있는 서비스에서는 여러 가지 업무 프로세스 데이터를 다루고 있지만, 기술적/설계적 한계로 인해 본문, 첨부파일 검색이 불가능한 상황이었다. 문서 본문뿐 아니라 첨부파일 내용도 검색 대상에 포함되지 못했기 때문에, 사용자 입장에서는 필요한 정보를 찾기가 쉽지 않은 구조였다.

이 문제를 해결하기 위해 기존 문서 데이터와 첨부파일을 벡터화하여 RAG 기반 검색 시스템 및 AI Agent 서비스 구축하기로 결정하게 되었다.

 

프로젝트 목표는 다음과 같다.

기존 서비스에서 검색 불가했던 문서 본문 및 첨부파일 내용을 벡터화하여 RAG 기반 검색 기능 제공
  - 다양한 문서/파일까지 포함한 자연어 기반 고도화된 검색 경험 제공

사용자가 자연어로 요청한 업무를 AI Agent가 처리할 수 있도록 지원
  - 단순 검색을 넘어, 자연어 기반으로 업무 처리까지 이어지는 흐름 구현

AI Agent가 단순 챗봇이 아니라 업무를 자동으로 지원하고 처리하는 형태로 서비스 차별화
  - 자연스러운 대화형 업무 처리 경험 제공으로 기존 서비스 대비 경쟁력 확보

궁극적으로 업무 효율성과 사용자 경험을 개선하고 서비스 가치를 높이는 것

프로젝트 초기 구성

프로젝트 초기에는 다음과 같은 서비스 범위를 구성했다.

  • 기존 문서 데이터를 벡터 DB로 전처리하여 RAG 기반 검색 시스템 구축
  • AI Agent 기반 서비스 개발
    • 사용자 질의 Intent 분석
    • 멀티턴 흐름 설계
    • Short-term Memory 기반 상태 관리
  • 요청 처리 (예: 예약 요청 처리 등)
  • 권한 검증
  • 사용자 정보 조회 기능 제공

기술 스택 선정과 학습 방법

프로젝트 시작 단계에서는 다음과 같은 기술 스택을 선택했다.

처음 실무로 도입하는 기술의 프로젝트였기 때문에 커뮤니티 레퍼런스가 풍부하고 검증된 기술 스택을 중심으로 구성했다.

도움이 필요할 때 참고할 수 있는 자료가 많아야 빠르게 적용하고 개선할 수 있다고 판단했기 때문이다.

  • Gemini 2.0
    • 고성능 LLM 기반 텍스트 처리에 사용
    • 당시 성능과 응답 속도 측면에서 적합하다고 판단해 선택했으며, 회사에서도 사용 권장 모델이었음
  • Python 기반 API 개발
    • AI 서비스 로직은 Python으로 구성했고, Fast API로 구현해서 개발 속도와 유연성 확보(Agent API 레퍼런스가 많았음)
  • 기존 Java 시스템과는 REST API 기반으로 연계
    • 기존 서비스와 통합을 고려해 REST API 기반 연계를 기본 구성
  • 벡터 검색 시스템은 RAG (Retrieval-Augmented Generation) 기반으로 구성
    • 기존 서비스에서 본문 및 첨부파일 검색이 불가했기 때문에 RAG 기반으로 고도화된 검색 기능을 도입하기로 함

 

기술 학습 과정에서는 처음 접하는 영역이 많았기 때문에 빠르게 개발하기 위해 '기초 학습 → 빠른 실습 적용 → 결과 확인 → 반복 개선' 형태로 진행했다.

가능한 빠르게 프로토타입을 만들어보고 테스트를 반복하면서 학습 효과를 높이는 방식으로 접근했다.

  • Gemini 2.0 관련 문서와 블로그를 참고해 모델 사용법과 특징을 학습
  • LangChain 관련 강의를 수강하며 이미 알려진 사례와 구조를 빠르게 학습하고, LLM 기반 서비스 설계 방법을 직접 구현해 보며 구조에 대한 이해를 높임
  • Prompt Engineering은 처음 경험하는 영역이라 강의를 통해 기초부터 실습하며 LLM을 효과적으로 활용할 수 있는 패턴과 설계 방법을 학습

 

RAG 시스템은 직접 구축/설계를 담당하지는 않고, 다른 개발자와 함께 설계를 논의하고 필요한 데이터를 추출하는 협업 수준으로 참여했다.

  • RAG 시스템 설계와 적용 실험
  • 벡터화 파이프라인 구성, 검색 품질 튜닝 등을 반복 테스트하며 팀원들과 협업

 

이번 프로젝트에서 가장 크게 체감한 학습 방법은 직접 부딪혀 보는 경험, 즉 삽질이었다.

문서나 예시를 참고해 구현했더라도 실제 적용 시 예상과 다르게 동작하는 경우가 많았고, 그때마다 문제를 파악하고 해결해 나가는 과정에서 빠르게 습득할 수 있었다. 특히 챗GPT와 협업이라는 표현이 어울릴 정도로 자주 활용하면서 빠르게 개선 작업을 진행했다.(예시 및 코드 설계, 개선 방향 논의 시 실제적으로 많은 도움이 됨)

정해진 기간 동안 개발을 완료하기 위해 부지런히 달려온 결과로, 막연했던 Python 기반 AI 서비스 구성 및 LLM 활용에 대한 이해도가 크게 향상됐다.


초기 설계

나는 이번 프로젝트에서 AI Agent 설계 및 개발을 담당했다.

초기에는 LangChain 기반 Agent 구조로 빠르게 프로토타입을 구성했다.

Tool 기반으로 AI가 직접 검색/업무요청 Tool을 호출하도록 설계했다.

 

초기 설계 목표

  • LLM 기반 Agent가 사용자 질의를 이해하고 적절한 Workflow를 자동으로 구성
  • 필요한 경우 Business 정책 기반 검증과 요청 흐름 지원
  • 자연어 기반으로 단계적 Workflow를 지원하는 구조 설계

초기 구성은 다음과 같은 흐름이었다.

사용자 질의 → LLM 기반 Intent 분석 → Tool 직접 호출 → LLM을 활용한 결과 응답 구성 → 사용자 결과 응답
  1. 사용자 질의
    • 사용자가 자연어로 요청을 입력
    • 예: ‘00호텔’ 정보 검색해줘
  2. LLM 기반 Intent 분석
    • LLM이 이 질의를 분석해 "검색" 요청임을 판단하고, 내부에 연결된 search_tool 을 호출해야 한다고 결정
  3. Tool 직접 호출
    • Agent는 판단된 결과에 따라 직접 search_tool(keyword=’00호텔’) 같은 형식으로 내부 메서드를 호출
    • 구조화된 데이터 형태로 반환
  4. LLM을 활용한 결과 응답 구성
    • 구조화된 데이터 결과를 별도의 LLM Prompt 통해 자연어로 변환
  5. 결과 응답
    • LLM이 구성한 자연어 응답을 사용자에게 전달
    • 예: 00호텔 관련 문서는 3건 입니다. 제목: 00호텔 객실 …

이 구조는 단순한 질의에서는 매우 안정적으로 동작했다.

 


초기 성공 경험

초기에는 Tool 기반으로 AI Agent가 검색/업무 요청 Tool을 직접 호출하는 방식으로 구성했다.

다음과 같은 단순한 요청 및 질의는 안정적으로 처리되었다.

"AI호텔 객실 관련 문서 보여줘"
→ 벡터 검색을 통해 적절한 문서 목록을 응답

"예약 취소해줘"
→ 권한 검증 후 처리 Tool을 호출하여 처리 완료

 

이렇게 기본적인 흐름에서는 AI Agent가 충분히 실용적인 수준으로 동작했고, 실제로 서비스에 적용해볼 수 있는 가능성을 확인할 수 있었다.


초기 성공 후 문제 상황

하지만 대화 흐름이 길어지거나 사용자 확인이 필요한 경우, 그리고 권한 검증이 필요한 상황에서는 여러 문제가 드러나기 시작했다. 대화가 길어질 수록 에이전트가 예상한 대로 동작하지 않고, 아예 다른 응답을 하거나 요청을 맘대로 처리하기도 했다.

 

다음 편에서는 이러한 문제 상황과 그로부터 얻은 결과 및 내용을 상세하게 공유하려 한다.

반응형

댓글