AI와 Active Job을 활용한 Rails 기능 구축

Building a Rails Feature with AI and Active Job

작성자
Short Ruby
발행일
2025년 08월 14일

핵심 요약

  • 1 Thoughtbot은 내부 Rails 앱에서 CRM 데이터 강화를 위해 기존 서비스를 LLM(ChatGPT)으로 대체하는 방안을 모색했습니다.
  • 2 Ruby OpenAI 젬을 사용하여 ChatGPT의 함수 호출 모드를 통해 구조화된 데이터를 가져오는 기능을 구현하고 TDD 방식으로 테스트했습니다.
  • 3 이 과정에서 데이터 일관성 및 신뢰성 문제를 해결하고, ActiveJob::Performs 젬과 Riffing 개발 기법을 활용하여 효율적인 통합을 달성했습니다.

도입

본 글은 thoughtbot이 내부 Rails 앱인 Hub의 CRM 데이터 강화 서비스를 인공지능(AI) 기반의 대규모 언어 모델(LLM)인 ChatGPT로 대체한 경험을 공유합니다. 기존의 전용 서비스(Apollo) 대신 LLM의 구조화된 데이터 반환 능력을 활용하여 기업 메타데이터를 보강하는 가능성을 탐구했으며, Ruby on Rails 환경에서 LLM 통합의 구체적인 구현 방식과 직면했던 기술적 도전 과제를 다룹니다.

기존 Rails 구조는 OpportunityEnrichmentService를 통해 Apollo API에서 메타데이터를 가져왔습니다. 이를 Ruby OpenAI 젬을 활용, ChatGPT를 호출하는 LlmEnrichment 클래스로 대체하는 것이 목표였습니다. 개발팀은 TDD 방식으로 구현하며, OpenAI의 함수 호출 모드를 활용하여 LLM이 특정 스키마에 따라 구조화된 필드를 반환하도록 정의했습니다. 이 모드는 LLM이 마치 함수를 호출하고 인수를 제공하는 것처럼 작동하여, 애플리케이션이 ChatGPT의 응답을 데이터로 직접 활용할 수 있게 합니다.

개발 과정에서 날짜 형식 불일치, 필드 누락, 응답 신뢰도 부족 등의 문제가 발생했습니다. 이를 해결하기 위해 OpenAI의 required 파라미터와 “strict mode”를 사용하여 응답 형식의 일관성을 확보했습니다. 내용의 일관성은 여전히 개선이 필요했지만, thoughtbot의 설립 연도(2003년)는 정확하게 반환되었습니다.

설계 불확실성 해소를 위해 ‘Riffing’ 기법을 활용했습니다. 이는 임시 파일에서 코드 형태로 아이디어를 자유롭게 구상하는 빠르고 협업적인 방식입니다. 또한, ActiveJob::Performs 젬을 통해 Rails 잡(Job) 구조를 단순화하고 상용구 코드를 줄이는 방법도 소개되었습니다.

결론

이 프로젝트를 통해 thoughtbot의 Hub 앱에 LLM을 성공적으로 통합하여 구조화된 회사 메타데이터를 가져왔습니다. 비록 전용 서비스만큼 결정적이지 않아 신뢰성 확보를 위한 추가 작업이 필요하지만, LLM 통합이 제공하는 풍부한 프롬프트와 상세한 응답의 가능성은 매우 긍정적입니다. 향후 LLM이 신뢰도 값을 제공하거나 ‘알 수 없음’ 옵션을 허용하는 방식으로 신뢰성을 개선할 수 있습니다. 이는 Rails 애플리케이션에서 AI 기술을 활용한 혁신적인 개선 사례를 보여줍니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!