모두를 위한 용어집, BH-Glossary 개발기

밸런스히어로의 BH-Glossary: LLM과 RAG를 활용해 슬랙에서 실시간으로 사내 용어를 검색하고 한글/영어로 답변을 제공하는 AI 봇 개발기. 개발 계기, 구현 방법, 운영 전략까지 소개합니다.
Gon Song's avatar
Jun 27, 2025
모두를 위한 용어집, BH-Glossary 개발기

안녕하세요. 프론트엔드팀의 Gon입니다. 저는 2024년 9월에 LLM과 RAG를 활용하여 사내 용어를 편하게 물어볼 수 있는 BH-Glossary라는 봇을 개발하였는데요, 이 글에서는 봇을 만들게 된 계기와 방법을 소개하려고 합니다.

입사 초기에 겪은 언어 장벽 이야기

밸런스히어로는 국내에서 인도+핀테크라는 굉장히 독보적인 분야를 개척하고 있는 회사입니다. 그만큼 평소에 접해보지 못한 약어와 전문 용어들이 회의를 가득 채우곤 하는데요, 저도 회사에 처음 입사했을 당시 아무리 집중해보려고 해도 영어+전문용어가 가득한 회의에서 맥락을 놓치기 일쑤였습니다.

그러던 와중 밸런스히어로의 오랜 조상님이 남겨주신 용어집을 발견했지만, 여느 문서가 그렇듯 굉장히 오랜 기간 업데이트가 되지 않아 부족한 내용이 많았습니다. 부족한 최신 단어들을 채우긴 했으나, 용어집에서 내가 원하는 단어를 찾기 위해 오래된 위키에 로그인하고, 커맨드+F를 이용해 제가 원하는 단어를 찾아야 했는데 이 과정 자체도 너무 복잡하고 귀찮았습니다.

또 하나의 문제는 이 문서는 한글로만 작성되어있기 때문에 인도 구성원들은 접근할 방법도 없고, 접근한다해도 번역이라는 추가적인 과정을 거쳐야했습니다.

AI로 해결하는 용어 검색의 불편함

지금도 인기가 뜨거운 LLM과 RAG등의 AI 기술이 발전하면서 이를 활용한 가능성이 열리게 되었습니다. 이 신기술들을 활용하면 복잡한 구현 없이도 (1) 자료 접근/검색의 불편함, (2) 한글/영어 동시 제공이라는 두가지 문제를 동시에 해결할 수 있을 것 같았습니다. 그래서 유저들에게 친숙한 슬랙으로 인터페이스를 제공하고, LLM을 이용해 번역/검색 을 대신하는 방식으로 접근하기로 하였습니다.

최근에는 AWS의 Bedrock을 활용한 사례가 많이 소개되고 있지만, 당시에는 빠른 PoC와 피드백 수집을 위해 이미 사내에서 자주 쓰고 있던 OpenAI 플랫폼을 활용하기로 하였습니다. OpenAI 플랫폼에서는 LLM, RAG, RAG를 위한 벡터 스토어를 간단하게 설정할 수 있도록 제공해주어 굉장히 빠르게 설정할 수 있었습니다.

진짜로 써보면 이런 느낌!

슬랙에서 사용자가 /ask what is Cibil? 명령어를 입력하면 Python 서버를 통해 OpenAI Assistant에 요청이 전달되는 시스템 아키텍처 다이어그램
BH-Glossary 프로젝트의 구조

/ask {질문} 형태로 슬랙에서 커맨드를 입력하면, 소켓모드로 연결된 파이썬 서버가 사용자의 질문을 LLM에 질의합니다. LLM은 답변을 생성할 때, Vector Storage에 올려둔 용어집 pdf파일에 기반하여 답변을 생성합니다.

실제로 사용했을 때 유져에게 보여지는 인터페이스의 스크린샷을 가져와보았습니다.

슬랙에서 BH-Glossary 봇이 /ask 커맨드로 입력된 질문에 대해 다국어 답변을 제공하고 사용자 경험 피드백 링크를 포함한 응답 화면 스크린샷
BH-Glossary 봇의 사용자 화면

짜잔! 이렇게 회사 모든 직원들이 언어에 관계없이, 슬랙을 이용해서 모르는 단어를 쉽게 검색할 수 있게 되었습니다. 

PoC부터 프로덕션까지

프로젝트를 처음 시작했을 때는 챗 지피티의 GPTs 를 이용해서 간단하게 PoC를 진행보았습니다. 문서가 길지 않아서 청킹(Chunking) 등의 전처리 과정 없이도 괜찮은 응답이 나오는지 확인해보고 싶었기 때문입니다. 몇 가지 질문으로 테스트해본 결과 만족스러운 응답이 나와 별도의 전처리과정 없이 바로 사용할 수 있을 것 같았습니다.

그래서 바로 OpenAI Platform의 대시보드에서, 몇번의 클릭과 업로드로 쉽게 AI Assistant를 설정할 수 있었습니다.

OpenAI Assistant 설정 화면에서 BH-Glossary 봇의 이름, 시스템 지침, gpt-4o-mini 모델, 파일 서치 벡터 스토어 설정이 표시된 모습
BH-Glossary의 AI Assistant 설정화면

BH-Glossary, 앞으로 이렇게 진화합니다

1.더 풍부한 데이터로 확장

현재로서는 단순한 문서 파일 하나에서 정보를 얻고 있지만, 향후에는 사내 데이터팀에서 몇달 전 소개해주신 OpenMetadata라는 플랫폼을 활용해 각종 단어의 정의, 관련된 데이터베이스 스키마 정보를 연결할 수 있도록 확장할 계획입니다. 이렇게 되면 단어의 정의 뿐 아니라 그 단어가 실제로 쓰인 문맥이나 어떤 테이블을 참고해서 정보를 확인할 수 있는지 제안할 수 있을 거에요. 예를 들어 Penny Drop이라는 계좌 인증 프로세스를 질의하면, 우리 시스템에 어떻게 저장되고 있는지 확인할 수 있는 쿼리 예시까지 함께 제안하는 것이죠.
 

2.팀 간 시너지를 위한 통합

현재는 별도의 슬랙 봇으로 동작하지만, AI/데이터 팀의 Hyun께서 지라 Integration이나 AI 관련된 기능을 제공하기 위해 만드신 봇(Aya)이 있는데요, 이 플랫폼에 통합하여 하나의 코드베이스에서 일관된 스타일로 유지보수를 할 수 있을 거라 생각합니다. 이 과정에서 팀 간에 새로운 지식과 노하우 등을 공유할 수 있는 긍정적 효과를 기대할 수 있겠죠?
 

3.지속 가능한 운영 전략

AI 시스템은 만들고 끝이 아니라, 데이터의 지속적인 업데이트와 비용 관리, 모델 성능 개선이 중요합니다. BH-Glossary도 마찬가지인데요.

  1. 구글 닥스의 파일을 일정 주기마다 불러와 Vector Storage에 업데이트 한다던가

  2. 너무 비싸거나 자주 물어보는 질문은 답변 기록을 저장해 응답 속도 및 비용을 절감하는 등

이런 전략들을 점차 도입하면서, 더 효율적이고 안정적인 시스템으로 진화해 나갈 예정입니다.

작은 봇이 만들어낸 큰 연결

BH-Glossary는 단순한 봇이 아니라, 지식 격차를 줄이기 위한 작지만 의미 있는 한걸음이라고 생각합니다. 

특히 언어와 문화를 넘는 협업이 중요한 밸런스히어로에서는, 누구나 같은 문장을 같은 의미로 이해할 수 있는 환경을 만드는 것이 매우 중요하다고 느꼈어요.

이 프로젝트는 혼자만의 힘으로 완성된 것이 아닙니다. 🥹

초기 용어집을 작성해주신 구성원들, 용어 하나하나의 의미를 알려주신 분들, 그리고 “이거 슬랙에 넣으면 어때요?” 라고 제안해주신 분들까지... BH-Glossary는 정말 많은 분들의 손을 거쳐 만들어졌습니다.

덕분에 우리는 같은 언어를 말하게 되었고, 이제는 더 중요한 이야기를 나눌 수 있게 되었어요.

이 작은 봇이 더 큰 연결을 만들어나가길 바랍니다.

P.S. 설정을 위한 가이드를 찾으시는 분은 아래의 AI Assitant 설정을 위한 튜토리얼을 참고해주세요.

참고) 나만의 AI Assistant 설정하고 슬랙과 연결하기

Step 1. AI Assitant 설정하기

https://platform.openai.com/assistants에 접속해 + Create버튼을 누릅니다.

OpenAI Assistant Playground에서 Assistant ID, 시스템 지침, 선택된 gpt-4o 모델, File Search 및 응답 포맷 설정 옵션이 표시된 화면
AI Assistant 설정하기 1 - Name, System instructions, Model

1 : 봇의 고유 식별자입니다. asst_로 시작합니다. API 호출 시에 사용됩니다.

  1. 봇에게 받고 싶은 도움을 설정합니다. 페르소나나 원하는 응답 등을 묘사합니다.
    2-1: 이 버튼을 이용해 AI의 도움을 받아 작성할 수도 있습니다.

  2. 원하는 모델을 지정합니다. Open AI 의 모델만 지정 가능하고, 모델별로 가격, 응답속도, 응답이 다르다는 점을 고려하여 설정해주시면 됩니다. 저는 빠른 응답이 필요했고, mini모델의 성능만으로 충분하여 4o-mini 모델을 사용하였습니다.

OpenAI Assistant 설정 화면에서 File Search, Code Interpreter, 응답 포맷(text, json_object, json_schema) 옵션을 설정하는 모습
AI Assistant 설정하기 2 - TOOLS, MODEL CONFIGURATION
  1. 저는 이 File Search를 활성화 하고, 파일을 추가하여 봇이 단어장을 탐색할 수 있게 하였습니다.

  2. 응답 포맷은 text로 된 설명을 그대로 제공하는 것이 단어장의 설명을 일관된 톤으로 제공하는 역할을 해주어서 text로 지정하였는데, 만약 정형화된 응답이나 오용을 방지하고 싶은 경우 지정한 json 포맷으로 받는 것도 가능합니다.

Step 2. 슬랙 앱 설정하고 연결하기

(슬랙 앱 설정 중 중요한 부분만 설명하도록 하겠습니다)

  1. Socket Mode 활성화

Slack 앱 설정에서 Socket Mode 활성화 화면, 소켓 모드를 통한 슬랙 앱과 서버 간 실시간 연결 설정 모습
소켓 모드 활성화
  1. SLACK_APP_TOKEN(App Level Token)

    write-token 텍스트를 클릭해 토큰을 확인할 수 있습니다

    Slack App-Level Tokens 설정 화면에서 write-token이 connections:write 권한으로 생성된 모습
    App Level Token 확인
  2. SLACK_BOT_TOKEN(OAuth Token)

    Slack OAuth & Permissions 설정 화면에서 Bot User OAuth Token 생성 상태가 표시된 모습
    OAuth Token 확인

  3. 소켓 모드로 봇을 실행시키기 위한 예시 코드 (Python)

저는 .env파일로 credential을 관리하기로 하였습니다. OpenAI의 API Key는 아래 링크에서 생성/조회 할 수 있습니다.

https://platform.openai.com/api-keys

import logging  # 표준 로깅 모듈 임포트
from os import getenv  # 환경 변수 접근 함수 임포트

from dotenv import load_dotenv  # .env 파일에서 환경 변수 로드
from slack_bolt import App  # Slack 봇 프레임워크
from slack_bolt.adapter.socket_mode import SocketModeHandler  # 소켓 모드 핸들러

from gpt_assistance.bot import OpenAIChatbot  # OpenAI 챗봇 래퍼 임포트 (사용자 정의)

load_dotenv()  # .env 파일의 환경 변수 로드

# 환경 변수 로드
SLACK_APP_TOKEN = getenv("SLACK_APP_TOKEN")  # 슬랙 앱 토큰
SLACK_BOT_TOKEN = getenv("SLACK_BOT_TOKEN")  # 슬랙 봇 토큰
API_KEY = getenv("API_KEY")  # OpenAI API 키
ASSISTANT_ID = getenv("ASSISTANT_ID")  # OpenAI Assistant ID
GOOGLE_FORM_URL = getenv("GOOGLE_FORM_URL")  # 피드백용 구글 폼 URL

# 로깅 설정: 파일로 로그 저장
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
file_handler = logging.FileHandler('./logs/slack_bot.log')  # 로그 파일 경로
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)

# Slack 앱 인스턴스 생성
app = App(token=SLACK_BOT_TOKEN)
# OpenAI 챗봇 인스턴스 생성
bot = OpenAIChatbot(api_key=API_KEY, assistant_id=ASSISTANT_ID)

# /ask 슬래시 커맨드 핸들러 등록
@app.command("/ask")
def ask_command(ack, body, respond):
    ack()  # 슬랙에 커맨드 수신 응답
    user_id = body['user_id']  # 요청한 유저 ID
    user_question = body['text']  # 유저가 입력한 질문

    logger.info(f"/ask command used by {user_id}. Question: {user_question}")  # 로그 기록
    respond(f"Please hold on, <@{user_id}>! I'm processing your question.")  # 처리 중 안내

    response = bot.ask_question(user_question)  # OpenAI 챗봇에 질문 전달

    logger.info(f"Response to {user_id}: {response}")  # 응답 로그 기록
    respond(f"Q: {user_question}\n\nA: {response}\n\n <{GOOGLE_FORM_URL}|Let us know your experience!>")  # 답변 전송

# 앱 실행 (메인 진입점)
if __name__ == "__main__":
    SocketModeHandler(app, SLACK_APP_TOKEN).start()  # 소켓 모드로 앱 실행 

Share article