히얼러스
Side-project

히얼러스

2024.09 - 진행중 히얼러스

힘들 때 마음을 털어놓고 위로받을 수 있는 나만의 AI 인터랙티브 상담 서비스

역할

Backend
Infra
Plan

사용 기술







*현재 앱 기반 v2 출시를 위해 기존 MVP 웹 서비스는 종료되었습니다. (10월 중 재출시 예정)

프로젝트 소개

서비스 소개 영상

히얼러스는 “힘들어도 기대거나 털어놓지 못하고 혼자 곪는 사람들”을 위해 심리 상담 이론에 근거한 AI 상담사를 통해 편하게 마음을 털어놓을 곳을 제공해주고자 시작하였습니다.

DevKor에서 함께 프로젝트를 진행했던 팀원들과 함께 피버팅 후 새로 시작한 서비스로, 매쉬업벤처스-구글 클라우드 주최 ‘GenAI Sprint’ 해커톤에서 우승하여 받은 2만 달러 상당의 GCP 크레딧을 재정적 기반으로 하여, “각 팀원들의 역량 향상을 우선 목표로 한 사이드 프로젝트”로 활동하고 있습니다.

저는 이 프로젝트에서 백엔드 개발을 리드하며 팀원들의 기술적 성장을 이끌고 있습니다. 특히 학부생 수준에서 접하기 어려운 기술을 실전에 적용하는 것에 목표를 두고, Protobuf, gRPC, Kafka를 활용한 MSA 시스템을 설계하고 구축해 나가고 있습니다. 또한, LangChain, Agentic AI 기술을 도입하여 서비스의 핵심 경쟁력을 확보하는 역할을 맡고 있습니다. 직접 백엔드 팀원을 모집하고 기술 교류를 주도하며 함께 성장하는 개발 문화를 만들어가고 있습니다.

깃허브 링크

주요기능

심리 이론 기반 사용자 맞춤형 상담 경험 설계

효과적인 AI 상담 경험을 제공하기 위해, 사용자와 상담사 간의 모든 채팅은 심리 상담 이론에 기반한 정교한 파이프라인을 통해 이루어집니다. 이 파이프라인은 대화의 시작부터 마무리까지, 실제 상담 세션과 유사한 흐름을 따르도록 설계된 모듈의 조합으로 구성됩니다.

히얼러스는 ‘공감 전문가’, ‘현실적 조언가’ 등 각기 다른 강점을 지닌 페르소나의 상담사를 제공합니다. 사용자가 채팅을 시작하면, 대화의 주제와 사용자의 성향을 파악하여 적합한 는 대화 파이프라인을 가동시킵니다. 실제 상담 기법 사이클에 최대한 흡사한 경험을 유저에게 선사해주려 합니다.

안정적 AI 운영을 위한 프롬프트 형상 관리 및 배포 시스템 구축

프롬프트 엔지니어링의 결과물은 시스템 프롬프트, AI 모델, 페르소나별 지침 등 복잡한 요소들의 미세한 변경에도 매우 민감하게 반응합니다. 이는 안정적인 서비스 운영과 빠른 개선 사이의 균형을 맞추는 데 큰 어려움으로 작용했습니다.

이를 해결하기 위해 AI 모델, 시스템 프롬프트, 그리고 개별 상담사 페르소나 프롬프트까지 하나의 집합으로 묶어 관리하는 ‘프롬프트 버전 관리 시스템’을 직접 설계하고 구축했습니다.

이 시스템의 핵심은 버전의 원자성(Atomicity)을 보장하는 것입니다. 각 ‘프롬프트 버전’은 특정 시점의 AI 모델과 모든 프롬프트의 완전한 스냅샷으로 정의됩니다. 모든 상담 세션은 생성될 때 당시의 ‘활성화된 버전’을 참조하므로, 운영 중에 새로운 버전이 배포되더라도 기존에 진행 중이던 상담의 일관성을 완벽하게 유지할 수 있습니다.

또한, 안전한 개발 및 테스트 환경을 위해 현재 작업 중인 프롬프트를 ‘임시 버전’으로 저장하여 운영 환경에 영향을 주지 않고 성능을 테스트할 수 있는 Staging 기능을 구현했습니다. 모든 과거 버전의 히스토리가 기록되기 때문에, 문제가 발생했을 때 검증된 이전 버전으로 즉시 롤백하여 서비스 안정성을 확보할 수 있습니다.

단순한 롤백을 넘어, 특정 과거 버전의 환경으로 새로운 상담을 생성하여 당시의 결과물을 그대로 재현하고 현재 버전과 성능을 비교 분석하는 것도 가능합니다.

결과적으로 이 시스템을 통해 프롬프트 수정 및 배포에 대한 리스크를 최소화했으며, 엔지니어링 확신을 갖고 더 빠르고 섬세한 프롬프트 개선 작업을 수행할 수 있는 기반을 마련했습니다.

상태 머신과 전이함수로 구현한 인간다운 AI

단순히 선형적으로 상담 기법을 전환하는 형식으로 개발 후 테스트를 해보니 하니, 정해진 시나리오대로 로봇처럼 작동하는 상담사가 되어 여러 요구사항을 지닌 사용자의 센티멘탈한 부분을 케어하기 어려움이 있었습니다.

따라서 더 사람답게 반응하는 인공지능을 구현하기 위해, 실제 대화 맥락에 맞춰 다양한 상담 기법이 유연하게 전이되도록 설계할 필요가 있었습니다.

이를 위해 컴퓨터 과학에서 사용되는 유한 상태 머신(Finite State Machine) 개념을 차용하였습니다. 상담 세션이 진행되면, 사이클 전반의 컨텍스트를 정량적으로 수치화 하여 수집합니다. 각 기법 간 전이함수를 정의하여, 현재 기법이 특정 기준을 충족하면 적절한 다음 기법으로 전이하도록 상태 머신을 설계했습니다.

개인 기여 활동

BE 팀 리크루팅 및 아키텍처 컨셉 설계

프로젝트 초기, 저는 FE 개발자 두 분과 함께 Next.js 풀스택으로 MVP를 개발하는 유일한 백엔드 담당자였습니다. 이 MVP를 통해 약 500명의 사용자에게 서비스의 가치를 성공적으로 검증받았지만, 동시에 AI 엔지니어링을 고도화하기에는 현재 구조가 지닌 기술적 한계가 명확하다는 것을 깨달았습니다. AI를 다루는 만큼 시스템단의 중요성이 컸기에, React 기반의 프론트엔드와 서버를 완전히 분리하여 새롭게 구축하고 백엔드 엔지니어를 충원해야 한다고 판단했습니다.

이 과정에서 저는 대학생과 주니어 개발자들이 사이드 프로젝트에서 흔히 겪는 딜레마에 대해 고민하게 되었습니다. 첫 프로젝트는 경험 부족으로 성공까지 이끌기 어려운 경우가 많고, 반대로 어느 정도 경험이 쌓인 후에는 ‘어차피 또 CRUD만 만들겠지’라는 생각에 쉽게 동기와 재미를 잃어버리곤 합니다. 저 또한 이 시점에서 단순 기능 구현을 넘어선 새로운 기술적 성장에 대한 강한 갈증을 느끼고 있었습니다.

마침 팀은 넉넉한 인프라 자원을 보유하고 있었고, ‘성장’이라는 사이드 프로젝트의 본질을 충족시키고 싶었습니다. 이러한 배경 속에서 저와 비슷한 갈증을 느끼는 동료들을 모아 도전적인 과제인 MSA(마이크로서비스 아키텍처)를 도입해보면 어떨까? 라는 생각에 이르게 되었습니다.

MSA 도입을 결정하고 학회에서 직접 뜻이 맞는 팀원들을 모집하며, 팀 리더로서 막중한 책임감을 느꼈습니다. 저는 모든 MSA 기술을 한 번에 도입하는 것은 비현실적이라고 판단했고, 팀원들의 성장에 실질적인 도움이 될 gRPC, Kafka와 같은 핵심 기술을 선정하는 데 집중했습니다.

단순히 기술을 정하는 것을 넘어, 리크루팅 기간 동안 이 기술들을 직접 코드로 구현하며 기술적 검증을 마치는 데 많은 시간을 쏟았습니다. 나아가 팀원들이 합류하자마자 방황 없이 바로 개발에 집중할 수 있는 환경을 만드는 것이 최우선이라 생각했습니다. 이를 위해 가이드 코드가 담긴 레포지토리를 만들고, 협업이 가능한 초기 인프라 환경을 구축했으며, 이 모든 과정을 상세한 온보딩 문서로 꼼꼼하게 정리하는 등 모든 길을 미리 닦아두었습니다.

이러한 노력의 결과물들을 통해 팀원들의 온보딩을 성공적으로 이끌었고, 시스템을 게이트웨이, 유저, 채팅 서비스 도메인으로 나누어 각자의 역할과 책임(R&R)을 명확히 부여하며 백엔드 팀이 잘 협업할 수 있게 리딩하였습니다.

protobuf IDL - gRPC / Kafka 협업 구조 하위 레벨 설계

API Gateway, User Service, Counseling Service 각각의 서비스에서 protobuf를 관리하고, 각 언어에 맞게 생성할 수 있도록 하였습니다.

Git Submodule을 통해 버전 관리를, Buf를 통해 린팅, 포매팅, 의존성 관리를 수행하였습니다.

Gradle 빌드와 통합된 Proto 코드 생성 및 모듈화

API Gateway 서버는 Gradle 멀티 모듈 프로젝트 기능과 Buf의 빌드 도구 통합을 활용하여 Gradle 빌드 시점에 코드를 Java/Kotlin으로 생성하고 이를 하나의 모듈로 구성해 다른 adapter, api 단에서 사용하도록 하였습니다.

모듈러 모놀리틱 gRPC 서비스

User Service, Counseling Service는 하나의 nest.js repository에서 환경변수에 따라 모놀리틱 모드 혹은 각각의 서비스 모드로 부팅 방식을 정할 수 있게 하였습니다.

모놀리틱 모드로 부팅하여도 각각의 서비스 모듈은 개별 컨슈머 그룹으로 카프카에 조인되며 서로의 코드를 사용할 수 없도록 린팅을 응용하여 import 제한을 하였습니다.

바이너리로 직렬, 역직렬화된 kafka 메시지

protobuf의 바이너리 직렬화 기능을 활용하여 카프카 메시지 페이로드를 바이너리 형태로 전송하고, 역직렬화하여 사용하도록 개발하였습니다.