📋 요약
kt cloud AI SERV NPU를 활용하여 고객 문의 응답 보조 시스템을 구축한 사례를 소개합니다.
GPU 대비 비용 효율적인 NPU 환경에서 LLM 모델을 최적화하고 문서 기반 자동 응답 시스템을 구현하는 방법을 다룹니다.
#NPU #AI응답시스템 #LLM최적화 #문서검색 #비용효율
AI 서비스에 대한 수요는 최근 몇 년 사이 급격히 증가하고 있습니다. 그에 따라 자연스럽게 GPU 기반 인프라에 대한 수요도 함께 높아지고 있으며, 특히 클라우드 환경에서는 다양한 AI 모델 학습 및 추론 워크로드를 처리하기 위한 GPU 자원의 확보가 중요한 과제가 되었습니다. 하지만 AI 모델의 크기와 복잡성이 커질수록 GPU 자원은 더욱 부족해지고 있으며, 사용자 요구사항 역시 단순한 연산 자원 제공을 넘어서 모델 정의, 서비스 등록, 추론 환경 구성 등 점점 더 세분화되고 복잡해지고 있습니다.
문제는 AI 서비스가 복잡해지면서 고객의 문의도 급증하고 있다는 것입니다. 그중에는 정말로 긴급하고 복잡한 문제도 있지만, 생각보다 많은 비율이 단순하거나 매뉴얼에 명확히 기술된 내용을 묻는 경우입니다. 예컨대 "모델 정의 파일은 어떻게 작성하면 되나요?" 또는 "서비스 등록할 때 필수로 입력해야 하는 값은 무엇인가요?" 같은 질문은 사실 매뉴얼만 확인하면 누구나 금방 찾을 수 있는 내용입니다.
하지만 현실적으로는 이런 문의조차도 엔지니어가 직접 내용을 파악하고 매뉴얼을 참고해 답변을 준비해야 하는 상황이 빈번했습니다. 엔지니어의 업무 시간이 단순한 문서 확인과 응답 작성에 지나치게 소모되는 것은 조직의 자원 효율 측면에서 매우 큰 낭비였습니다.
AI 기반의 자동화 응답 시스템 도입
이 문제를 근본적으로 해결하기 위해 우리가 선택한 방법은 AI 기반 자동 응답 시스템을 구축하는 것이었습니다. 기본 아이디어는 매우 간단했습니다. 매뉴얼과 문서를 AI가 미리 학습하고, 고객의 질문이 들어오면 AI가 자동으로 그 질문을 이해하고 응답을 생성하도록 하는 것입니다. 운영자는 AI가 만들어낸 응답을 간단히 검토하고 필요한 부분만 수정하여 고객에게 보내기만 하면 됩니다.
이 과정에서 AI 모델이 동작하는 추론 환경을 꼭 GPU로 구성할 필요는 없었습니다. 대부분의 문의 응답 시스템은 긴 텍스트나 복잡한 추론보다는 간단하고 명료한 답변을 요구하는 경우가 많기 때문에 GPU가 제공하는 강력한 계산 능력이 꼭 필수적인 것은 아니었습니다. 오히려 비용 효율성이 뛰어난 NPU를 활용하여 AI 추론을 수행하는 것이 더욱 합리적인 결정이었습니다.
NPU를 이용한 경량 AI 추론 모델 구축
실제 구축한 시스템은 AI SERV NPU를 기반으로 합니다. AI SERV에서는 리벨리온 사의 NPU인 Atom 디바이스를 제공하고 있습니다. GPU 대비 전력 효율이 높고, 비용이 저렴한 NPU는 경량 AI 모델 추론에 매우 적합합니다.
우리는 대표적인 LLM을 Atom에 맞춰 컴파일하여, GPU 대비 낮은 전력 소모와 높은 병렬 처리 효율을 확보했습니다. 전체 구성 아키텍처는 다음과 같습니다.
먼저 고객으로부터 들어온 문의는 웹 포털 또는 이메일과 같은 여러 채널을 통해 접수됩니다. 접수된 문의는 즉시 자동화 Flow 단계로 전달되어 Embedding DB에서 유사한 컨텍스트를 검색하는 단계로 넘어갑니다. Embedding DB는 사전에 매뉴얼과 FAQ 문서의 내용을 임베딩 벡터 형태로 미리 저장하고 있으며, 이를 통해 빠르고 정확하게 관련 정보를 찾을 수 있습니다.
검색된 컨텍스트는 다시 NPU 환경에서 구동되는 LLM 모델로 전달됩니다. NPU 기반의 LLM은 Embedding DB에서 제공받은 컨텍스트 정보를 바탕으로 자연스러운 응답 문장을 생성합니다.
이렇게 생성된 응답 곧바로 고객에게 전달되지 않고, 운영자 검토 및 수정 단계를 거칩니다. 운영자는 AI가 생성한 응답의 정확성, 표현, 추가적인 맥락 등을 검토하고 필요한 부분만 수정하여 최종 답변으로 고객에게 전송합니다.
AI SERV NPU를 활용한 LLM API 구축
AI SERV NPU 환경에서 효율적인 LLM 기반 자동 응답 시스템을 구현하기 위해, 모델을 최적화하고 NPU 기반 추론 환경에 맞춰 컴파일하는 과정이 필요합니다. 이를 위해 optimum.rbln을 활용하여 최신 LLM 모델을 최적화했습니다.
아래는 실제 모델 최적화 및 컴파일 과정에 사용된 코드입니다.
import os
from optimum.rbln import RBLNLlamaForCausalLM
def main():
model_id = "K-intelligence/Midm-2.0-Base-Instruct"
# Compile and export
model = RBLNLlamaForCausalLM.from_pretrained(
model_id=model_id,
export=True, # export a PyTorch model to RBLN model with optimum
rbln_batch_size=1,
rbln_max_seq_len=32768, # default "max_position_embeddings"
rbln_tensor_parallel_size=8,
rbln_attn_impl="flash_attn",
rbln_kvcache_partition_len=8192, # Length of KV cache partitions for flash attention
)
# Save compiled results to disk
model.save_pretrained(os.path.basename(model_id))
if __name__ == "__main__":
main()
이 과정을 통해 원본 PyTorch 모델을 NPU 환경에서 최적으로 수행될 수 있는 형태로 변환했습니다. 특히, flash attention 메커니즘과 tensor 병렬화를 활용하여 추론 속도를 향상하고 메모리 사용량을 최적화했습니다.
다음으로, AI SERV에서 서비스로 제공하기 위한 모델 정의 파일을 작성했습니다. 모델 정의 파일은 서비스가 로드될 때 어떤 명령으로 모델을 기동할지와 같은 정보를 명시적으로 제공합니다.
models:
- name: "LLM-API"
model_path: "/models"
service:
start_command: ["python3", "-m", "vllm.entrypoints.openai.api_server", "--model", "Midm-2.0-Base-Instruct", "--device", "rbln", "--max-num-seqs", "1", "--max-num-batched-tokens", "32768", "--max-model-len", "32768","--block-size", "32768"]
port: 8000
health_check:
path: /health
max_retries: 10
모델 서비스 배포가 성공적으로 완료되면, 다음과 같은 형태로 접근 가능한 엔드포인트가 자동 생성됩니다.
https://proxy1.aiserv.ktcloud.com:{port}
이 엔드포인트를 통해 표준 OpenAI API 규격을 활용한 AI 추론 요청이 가능합니다.
API 호출의 예시는 다음과 같습니다.
curl https://proxy1.aiserv.ktcloud.com:{port}/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Midm-2.0-Base-Instruct",
"messages": [
{
"role": "system",
"content": "당신은 kt cloud AI 서비스의 문의 응답 시스템입니다."
},
{
"role": "user",
"content": "모델 정의 파일 작성법을 알려주세요."
}
],
"stream": true
}'
여기서 system role은 kt cloud의 AI 서비스 문의 응답 시스템의 역할과 행동 방식을 정의하며, user role은 실제 사용자들이 AI 서비스에 문의를 보내는 형태로 질문을 전달합니다.
이 요청이 처리되면, NPU에 배포된 LLM은 사용자의 문의 내용을 분석하고, 미리 준비된 embedding DB에서 관련 정보를 참조하여 가장 적절한 응답을 생성하여 스트리밍 형태로 사용자에게 제공합니다. 운영자는 필요할 경우 해당 응답을 추가로 검토하거나 수정한 후 최종적으로 사용자에게 전달할 수 있습니다.
Embedding 모델의 NPU 기반 배포
문의 응답 시스템이 효과적으로 작동하기 위해서는 사용자의 질문과 가장 유사한 문서를 빠르게 검색하는 것이 중요합니다. 이를 위해 Embedding 기반의 문서 유사도 검색 모델을 사용하며, 이 또한 리벨리온 NPU 환경에 배포하여 더욱 효율적인 처리를 가능하게 했습니다.
리벨리온 NPU는 다양한 NLP 모델과 함께 Sentence Similarity(문장 유사도) 모델도 최적화된 컴파일을 제공하며, 이를 활용해 보다 빠른 문서 검색을 수행할 수 있습니다.
아래는 Embedding 모델을 NPU 환경에 최적화하고 컴파일하는 예시 코드입니다.
import os
from optimum.rbln import RBLNBertModel
def main():
model_id = "snunlp/KR-SBERT-V40K-klueNLI-augSTS"
# Compile and export
model = RBLNBertModel.from_pretrained(
model_id=model_id,
export=True, # export a PyTorch model to RBLN model with optimum
rbln_batch_size=1,
rbln_max_seq_len=512, # default "max_position_embeddings"
)
# Save compiled results to disk
model.save_pretrained(os.path.basename(model_id))
if __name__ == "__main__":
main()
이 과정을 통해 PyTorch 기반의 원본 Embedding 모델을 NPU에서 효율적으로 실행될 수 있는 형태로 변환합니다. 이후 실제 문장 임베딩 추출 및 유사도 검색 작업은 기존의 사용법과 동일하게 다음과 같이 sentence_transformers 라이브러리를 통해 수행할 수 있습니다.
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('KR-SBERT-V40K-klueNLI-augSTS')
sentences = ["모델 정의 파일 작성법을 알려주세요.", "모델 파일 작성 방법을 설명해주세요."]
embeddings = model.encode(sentences)
이처럼 리벨리온 NPU에서 Embedding 모델을 배포하면, 비용과 속도의 효율성을 극대화할 수 있으며, 문서 검색 단계에서 더욱 빠르고 정확한 처리가 가능해져 AI 문의 응답 시스템의 전반적인 성능 향상에 기여합니다.
우리는 AI 문의 응답 시스템의 효율성과 정확성을 높이기 위해 서비스의 매뉴얼과 자주 묻는 질문(FAQ) 자료를 미리 Embedding 벡터 형태로 인코딩하여 저장해 두었습니다. 이 과정에서 각 문서와 FAQ 항목은 미리 설정된 Embedding 모델을 통해 고정된 차원의 벡터로 변환됩니다.
이렇게 생성된 임베딩 벡터는 데이터베이스에 저장되어 빠르게 검색할 수 있도록 준비됩니다. 이후 실제 고객의 문의가 들어오면 해당 질문도 동일한 Embedding 모델을 이용하여 실시간으로 벡터로 변환됩니다. 변환된 문의 벡터는 사전에 구축된 Embedding 데이터베이스에서 가장 유사한 내용을 빠르게 검색하여 최적의 컨텍스트 정보를 찾아냅니다. 이 단계에서 유사도를 기준으로 가장 관련성이 높은 문서나 FAQ 항목을 선택하게 됩니다.
이렇게 추출된 유사한 컨텍스트 정보는 다시 NPU 기반으로 최적화된 LLM API로 전달됩니다. LLM API는 이 컨텍스트 정보를 바탕으로 사용자의 질문 의도를 정확히 이해하고 자연스러운 형태의 응답을 생성합니다.
실제 AI SERV 매뉴얼을 기반으로 답변을 생성한 예시는 다음과 같습니다.
문의 내용: nginx 로 파일 호스팅을 하고싶은데 어떻게 해야 하나요?
답변 내용: AI SERV 모델 서빙 기능을 이용하여 Nginx로 파일을 호스팅하고자 하시는 경우, 아래와 같은 방식으로 모델 정의 파일(model-definition.yml)을 구성하시면 됩니다.
Nginx 모델 정의 예시
models: - name: "nginx-server" model_path: "/models" service: pre_start_actions: - action: run_command args: command: ["apt", "update"] - action: run_command args: command: ["apt", "install", "-y", "nginx"] start_command: - nginx - "-g" - "daemon off;" port: 80 health_check: path: / max_retries: 3
이렇게 하면:
- Nginx가 컨테이너 시작 시 자동 설치되고
- 기본 설정(/var/www/html/index.nginx-debian.html)으로 서빙이 되며
- 80번 포트로 접속하면 Nginx 기본 페이지가 뜹니다
정적 파일을 커스터마이징하거나 설정파일을 바꾸고 싶다면 그때 추가 작업을 넣으면 됩니다.
이후 생성된 응답은 엔지니어의 검토 후 문의 답변 작성에 활용되고 있습니다.
결론
LLM 기반의 응답 보조 시스템을 실제 운영 환경에 적용하기 위해 고려해야 할 요소는 단순한 모델 성능만이 아닙니다. 이 시스템은 최종 응답을 자동으로 전달하기 위한 것이 아니라, 반복적이고 문서 기반의 문의에 대해 참고 가능한 응답 초안을 자동으로 생성함으로써, 엔지니어의 업무 부담을 줄이는 데 목적이 있습니다. 따라서 응답의 절대 속도보다는 답변 품질의 일관성, 정보 재구성 능력, 그리고 운영자 검토를 전제로 한 효율성이 더 중요한 기준이 됩니다.
이번 프로젝트에서는 이러한 관점에서 NPU 기반의 추론 환경을 도입했습니다. 고성능 GPU에 비해 절대적인 처리 속도는 낮을 수 있지만, 이와 같은 문의 답변 구성 시스템에서는 응답의 지연이 중요하지는 않습니다. 오히려 NPU는 낮은 전력 소모와 높은 안정성, 그리고 복잡한 스케줄링 없이도 병렬 서비스를 구성할 수 있다는 점에서 실용적인 장점을 제공합니다.
특히 NPU는 단일 디바이스 기준으로 약 54W 수준에서 안정적으로 작동하며, 이는 A100과 같은 GPU 대비 훨씬 낮은 수준입니다. 단순 추론 서버 한 대만 보더라도, 운영비용과 열 설계, 공간 자원의 부담을 모두 줄일 수 있어 대규모 GPU 인프라 없이도 LLM 응답 시스템을 구성할 수 있습니다.
또한 이번 시스템처럼 문서 기반의 RAG 구조에서는 초당 수천 토큰을 처리하는 고성능이 필요한 것이 아니라, 적절한 컨텍스트에 기반한 정확한 문장 생성이 핵심입니다. 이때 NPU는 비용과 전력 측면에서 “과하지 않게, 필요한 만큼”만 추론할 수 있는 경량 추론 노드로서 유효했습니다.
결론적으로 이번 시스템은 서비스 환경 전체의 운영 효율을 최적화하는 구조를 고민한 결과이며, NPU는 그 과정에서 충분히 실용적이고 합리적인 선택이 될 수 있었습니다.
❓ 자주 묻는 질문 (FAQ)
Q. 문서 기반 AI 응답 시스템을 구축할 때 핵심 고려사항은 무엇인가요? |
A. 문서 기반 AI 응답 시스템에서 가장 중요한 것은 정확한 문서 검색과 일관된 답변 생성입니다. 이를 위해 다음과 같은 요소를 중점적으로 고려해야 합니다.
|
📚 관련/출처
kt cloud AI SERV https://cloud.kt.com/product/productDetail?prodId=P000000004 AI SERV 모델 서빙 매뉴얼 https://manual.cloud.kt.com/kt/ai-serv-serving RBLN SDK 유저 가이드 https://docs.rbln.ai/ko/index.html |
'Tech Story > AI Cloud' 카테고리의 다른 글
[기술 가이드] AI 워크로드를 위한 NVIDIA GPU 서버 단계별 구성 노하우: 드라이버부터 딥러닝 프레임워크까지 (0) | 2025.06.12 |
---|---|
[Performance Testing] kt cloud AI : 가상화 환경별 GPU 기반 AI 워크로드 성능 비교 (0) | 2025.04.14 |
[kt cloud] GPU 파워의 AI Train 고속열차 타고 AI 학습의 종착역으로 (3) | 2025.02.10 |
[튜토리얼] kt cloud AI로 배우는 RAG 개념 구현하기: FAISS로 시작하는 첫걸음 (0) | 2025.02.06 |
GPU 1,000장 모니터링 하기: NVIDIA DCGM 활용 전략 (13) | 2024.11.07 |