AWS 기술 블로그
KCC의 Amazon Bedrock Tool Use를 활용한 Multi Agent 플랫폼 구축 사례
/* 이 블로그는 KCC 의 박상찬님이 블로그 주요 저자로 작성 해주셨습니다. */
KCC는 건축자재, 도료, 첨단소재(실리콘 등) 분야에서 국내외 시장을 선도하는 대기업으로, 1958년 설립 이후 내장재, 단열재, 도료, 판유리 등 다양한 건축 및 산업자재를 생산하며 업계 1위의 시장지위를 확보하고 있습니다. 최근 KCC는 글로벌 실리콘 기업 인수를 통해 실리콘 사업을 확대하고, 동시에 전기차 등 미래 산업을 위한 첨단소재 분야로도 사업 영역을 확장하고 있습니다.
KCC의 GenAI 도입 배경과 목표
KCC는 부서별로 분산된 정보와 반복적인 의사결정 업무를 효율화하고, 보다 지능적인 데이터 활용 및 업무 자동화 기반을 마련하기 위해 GenAI 서비스를 도입하였습니다. 단순한 질의응답을 넘어, 내부 데이터를 기반으로 분석-계획-실행까지 연계 가능한 Agentic AI 시스템을 구축함으로써, 아래의 가치를 실현하고자 하는 것이 궁극적인 목적입니다.
- 부서 간 업무 지원 체계의 일원화
- 반복 업무의 자동화
- 의사결정의 신속화 및 고도화
- 전사적 디지털 전환(Digital Transformation)의 가속화
KCC의 GenAI 구축 여정: 챗봇에서 Multi Agent 플랫폼으로
KCC는 2024년 AWS와의 전략적 협력을 통해 Bedrock의 GenAI API를 기반으로 한 Narrative AI 챗봇을 성공적으로 구축하였습니다. 이를 통해 사용자 질의에 맞춤형 응답을 제공하고, 업무 효율을 높일 수 있는 기반을 마련하며 GenAI 기술의 가능성과 가치를 확인했습니다.
하지만 이 아키텍처를 재무회계, 인사HR, 생산관리 등 다양한 부서로 확장 적용하고자 했을 때, 부서별로 개별 Agent를 별도로 구성해야 하는 구조적 한계에 직면하게 되었습니다. 이에 KCC는 2025년 AWS EBA(Experience Based Acceleration) 프로그램에 참여하여, 약 6주간의 집중적인 협업을 통해 전사 통합 관점의 멀티 에이전트(Multi Agent) 아키텍처를 도입하였습니다.
이를 통해 전 부서가 하나의 통합 채널 플랫폼에서 각 에이전트와 자동으로 연결되는 구조를 구현함으로써, 단순한 질의응답형 챗봇을 넘어 업무를 자동으로 분석·계획·수행하는 Agentic AI 기반의 프로세스를 구현했습니다. 그 결과 실제 업무 실행까지 지원하는 Action 중심의 Agentic AI 플랫폼으로 진화하며 전사적인 확장성과 실행 효율성을 대폭 높일 수 있었습니다.
이 블로그에서는 KCC의 AI 도입 여정과 함께, Multi Agent 아키텍처 설계 및 구현 과정에서 얻은 실질적인 인사이트와 노하우를 공유합니다.
솔루션 아키텍처
2024년 생성형 AI 챗봇 Narrative AI 아키텍처 리뷰
먼저 손익 데이터를 기반으로 매출과 이익을 분석하고, 이를 자연어 형태로 설명해 주는 KCC Narrative AI 챗봇의 아키텍처를 살펴보겠습니다. 이 시스템은 사용자의 질문에 대해 데이터를 분석하고, LLM을 활용해 인사이트 중심의 서술형 답변을 제공하도록 설계되어 있습니다.
<그림 1> KCC가 2024년 구축한 Narrative Dashboard의 아키텍처
- 데이터 마이그레이션 (사전작업)→ 챗봇 콘텐츠에 필요한 KCC DB 데이터를 AWS PostgreSQL 에 마이그레이션 합니다.
- 사용자 세션ID를 통해 대화 이력 조회→ 사용자가 플랫폼에 접속하면 고유한 세션 ID를 기반으로 과거 대화 내용을 조회하여 문맥을 유지할 수 있도록 합니다.
- API Gateway 웹소켓 통신으로 질문 Request 전달→ 사용자의 질문은 API Gateway의 웹소켓 통신을 통해 서버리스 환경으로 안정적이고 실시간으로 전달됩니다.
- Lambda를 통한 챗봇 AI 로직 실행→ 전달된 질문은 AWS Lambda에서 실행되며, 사용자의 요청을 처리하기 위한 AI 로직이 작동합니다.
- 질문 + 프롬프트 + 테이블 스키마 정보를 Bedrock AI 모델에 전달→ 사용자의 질문과 함께 사전에 구성된 프롬프트 및 관련 테이블 구조 정보를 결합해 Bedrock의 LLM에 전달합니다.
- LLM이 질문을 바탕으로 데이터베이스 쿼리를 생성→ 사용자 질문과 테이블 스키마 정보를 바탕으로 LLM이 적절한 SQL 쿼리를 자동으로 생성합니다.
- 생성된 쿼리의 문법 및 의미 검증 후 실행→ 생성된 쿼리는 문법 오류나 비정상적인 로직이 없는지 사전 검증한 후, PostgreSQL에서 실행하여 결과 데이터를 조회합니다.
- LLM이 질문을 바탕으로 데이터베이스 쿼리를 생성→ 수신된 데이터를 바탕으로 대화형 LLM은 사용자가 이해하기 쉬운 자연어 형태의 서술형(Narrative) 답변을 생성합니다.
- 사용자에게 최종 Response 전달→ 최종적으로 구성된 자연어 답변과 시각화 자료는 실시간으로 사용자에게 응답되어, 질문에 대한 완결된 결과를 제공합니다.
2025년 Multi AI Agent Platform 아키텍처 도입
Multi AI Agent Platform 아키텍처를 위한 사용 솔루션
Amazon Bedrock의 Tool Use는 LLM이 외부 도구(API, 데이터베이스, Lambda 등) 와 연동해 복잡한 사용자 요청을 자동으로 처리할 수 있게 해줍니다. Tool Use는 “function calling”이라고도 하며, 모델이 도구 사용이 필요한 상황을 스스로 판단해 적절한 도구를 호출하도록 합니다. 이 기능은 Converse API 등에서 공식 지원되며, 개발자는 이를 통해 Bedrock 모델이 실제 비즈니스 로직이나 실시간 데이터에 접근하도록 하여, 챗봇이나 자동화 에이전트 등 다양한 AI 서비스에 실질적인 액션을 추가할 수 있습니다.
2. Amazon Nova
Amazon Nova는 AWS Bedrock에서 제공하는 차세대 파운데이션 모델 제품군으로, 텍스트, 이미지, 동영상 등 다양한 멀티모달 입력을 빠르고 정확하게 처리하며, 엔터프라이즈 환경에 최적화되어 있습니다. Nova Micro, Lite, Pro, Premier 등 다양한 모델이 준비되어 있고, Bedrock과 완전히 통합되어 API 사용, 파인튜닝, Knowledge Base 연동, RAG 등 고급 기능을 지원합니다. 높은 성능과 비용 효율성을 동시에 제공하며, 대용량 데이터 처리와 복잡한 AI 작업에도 적합합니다. KCC에서는 Anthropic Claude의 Tool Use 기능과 함께 Nova pro 모델을 text2sql 변환에 활용하였습니다.
Multi AI Agent Platform 아키텍처
아래 그림은 Multi AI Agent Platform 의 간단한 도식도입니다. Agent의 상세 아키텍처는 아래 Profit Agent 설명에서 소개하겠습니다.
<그림 2> Multi AI Agent Platform 도식도
1. 손익 (Profit Agent)
KCC의 월별 손익 데이터를 기반으로 매출, 비용, 이익 등을 분석하며, 전년동기 비교, 시계열 분석, 권한 기반 데이터 응답, 경제 지표 연계 분석 등을 통해 경영 인사이트를 도출하는 역할을 수행합니다. Narrative 응답 외에도 Action 중심의 구조로 고도화되어 연관 질문 생성, 외부 지표 기반 추천, 차트/리포트 자동 생성까지 가능합니다.
2. 재무 (Card Agent)
임직원의 법인카드 사용 내역에 대한 전표 자동 생성 및 상신 업무를 수행합니다. 사용 내역 기반으로 비용 분류, 적절한 계정 및 적요 추천 등의 기능을 통해 회계처리를 자동화합니다.
3. H.R (People+ Agent)
사내 HR 영역을 담당하는 에이전트로 개인 연차 상신, 연장근무 신청, 제증명서 발급 등 수행에 기반한 기능 및 인사 데이터 조회, 복리후생, 담당자 확인, 인사 관련 질의 대응 등 임직원 대상의 다양한 HR 업무를 자동화하고 지원합니다.
4. 생산 (Product Agent)
AI/ML 모델을 활용하여 제품별 생산일자 예측 등의 기능을 수행합니다. 과거 생산 데이터 및 수요 예측 정보를 바탕으로 생산 계획 수립에 활용됩니다.
AI Agent 구현
Profit Agent (손익 Agent)
본 블로그에서는 KCC AI Multi Agent 플랫폼의 다양한 에이전트에서 구현된 기능들을 포괄적으로 구현해 대표성을 갖는 Profit Agent를 중심으로 소개합니다. 이 에이전트를 통해 구현된 주요 기능과 실제 비즈니스 현장에서 활용 사례를 상세히 살펴보고자 합니다. 이를 통해 기업 내 손익 데이터를 기반으로 생성형 AI 에이전트를 활용해 어떻게 의미 있는 인사이트를 도출하고, AI 기반 의사결정 지원 시스템이 구현되었는지를 확인하실 수 있습니다.
Profit Agent 개요
- 법인별, 유형별 손익 정보를 바탕으로 다양한 정보를 취득할 수 있는 AI Agent 입니다.
- KCC에서 생산하는 제품별 매출과 이익 현황, 전년과 당해 연도 매출 · 이익 차이 현황 등 실시간 정보 제공을 통해 사업부 운영에 필요한 인사이트를 제공합니다.
<그림 3> Profit Agent 메인 화면
- 내부 손익 데이터를 기반으로 분석 결과를 도출하고, 차트 및 표와 같은 시각적 요소를 함께 제공함으로써 매출 및 이익 현황에 대한 가시성을 효과적으로 향상시킵니다.
- 내부 손익 데이터를 기반으로 생성된 추천 질문과 외부 경제 지표 데이터를 활용한 연관 질문 콘텐츠를 함께 제공하여, 사용자가 다각적인 관점에서 분석할 수 있도록 지원합니다.
<그림 4> Profit Agent 답변 상세 화면
Profit Agent 아키텍처
먼저 KCC AI Agent 플랫폼의 Profit Agent의 질문 처리 흐름을 설명하는 AWS 기반의 서버리스 아키텍처를 살펴보도록 하겠습니다.
<그림 5> Profit Agent 아키텍처
- 사용자의 질문을 API Gateway를 통해 수신 → KCC AI Agent Advisor가 사용자로부터 질문 또는 실행 지시를 입력하면, API Gateway를 통해 해당 요청이 서버리스 아키텍처로 전달됩니다. 이때부터 각 Lambda 함수들은 AWS Bedrock을 통해 LLM을 호출하며, 질문에 대한 문맥과 일관성을 유지하기 위해 DynamoDB에 저장된 대화 이력을 함께 참조합니다.
- CustomGuardrailForPrompt Lambda를 통해 유해성 여부 판단 → 입력된 질문은 CustomGuardrailForPrompt Lambda를 통해 유해성(욕설, 차별, 혐오 등) 여부를 검사합니다.
- 의도 및 주요 정보 추출을 위한 분석 처리 → 질문이 안전한 경우 IntentAndInfoExtractor Lambda가 실행되어 사용자의 질문으로부터 의도(Intent)와 주요 키워드(정보)를 추출합니다.
- Tool List Definition 전달 → 플랫폼에서 사용할 수 있는 함수들을 Tool로 정의하여 Config 형태의 JSON 객체로 구성하고, 이를 Lambda 함수에 전달하게 됩니다. 이 JSON 객체에는 각 Tool의 이름(name), 설명(description), 입력 파라미터(schema) 등 메타 정보가 포함되어 있으며 이 정보를 바탕으로 이후 LLM이 어떤 Tool을 사용할지 판단할 수 있는 기반을 제공합니다.
- Claude Tool Dispatcher를 통해 적절한 Tool 결정 → ClaudeToolDispatcher Lambda는 추출된 의도와 정보를 기반으로 어떤 Lambda Tool(Function)을 호출해야 할지를 결정하고, Tool 선택 목록을 반환합니다. 이 과정 또한 Bedrock의 Tool Use 기능을 활용하며, 이전 이력을 참조해 적절한 Tool을 판단합니다.
- 선택된 Tool에 대한 실행 지시 생성 및 전달 → Claude가 반환한 Tool 선택 목록을 기반으로, 각 Lambda Tool에 전달할 실행 프롬프트와 파라미터를 구성하여 API Gateway를 통해 실행 명령을 전달합니다.
- 개별 Tool Lambda 함수 실행 및 응답 생성 → 선택된 text2sql_function, chart_function, answer_function, related_function 등 Lambda 함수들이 실행되어 질문에 대한 SQL 생성, 차트 출력, 응답 요약, 연관 질문 등 다양한 형태의 응답을 생성합니다. 이때 각 함수는 AWS Bedrock API를 통해 LLM을 호출하여 응답을 생성하며, 요청에 대한 정확도와 문맥을 높이기 위해 필요 시 DynamoDB에 저장된 대화 이력도 함께 활용합니다.
- 최종 응답을 사용자에게 전달 → Lambda Tool의 실행 결과는 API Gateway를 통해 사용자에게 다시 전달되며, 차트, 표, 설명, 연관 질문 등으로 구성된 AI 응답을 사용자 인터페이스에 출력합니다.
Profit Agent Use Case Diagram
KCC의 Profit Agent는 내부 손익 데이터 분석을 자동화하고, 사용자 질의에 대한 적절한 응답과 인사이트를 제공하는 GenAI 기반 시스템입니다. 본 블로그에서는 Profit Agent의 활용 방식과 내부 동작 흐름을 대표적인 세 가지 사례를 통해 자세히 설명합니다.
Case 1. 제품 유형별 권한 조회
<그림 6> 제품 유형별 권한 조회 사례
- 첫 번째 사례로 사용자가 본인이 접근 가능한 제품 유형에 대한 권한을 조회하고자 하는 경우를 예로 들 수 있습니다. KCC에서는 제품 유형별로 손익 데이터 접근 권한이 개별 담당자에게 부여되어 있기 때문에, 사용자마다 보유한 권한이 상이합니다. 이러한 이유로 권한 확인 기능은 Profit Agent의 핵심 기능 중 하나로, 질의 응답의 첫 단계에서 우선적으로 수행됩니다. 또한, 이 과정을 통해 사용자 질의에 기반한 연관 질문 생성이 이어지도록 설계되어 있습니다.
- 두 번째로 Planning 절차로 사용자의 질의가 접수되면, Profit Agent는 우선 해당 질문을 분석하는 작업을 수행합니다. 이후, 미리 등록된 Tools 내 함수들 중 질문에 적합한 함수들을 자동으로 선별하고, 그 함수들을 배열 형태로 반환합니다. 반환된 함수들은 순차적으로 실행되며, 사용자 요청에 대한 응답을 도출하게 됩니다.
- 워크플로에서는 첫 번째로 권한 조회 함수가 실행됩니다. 이 함수는 KCC의 내부 데이터베이스에서 해당 사용자의 권한 정보를 조회하고, 전체 제품 유형 중 사용자에게 부여된 권한 범위를 파악합니다. 이 결과는 미리 정의된 프롬프트 포맷에 따라 LLM에 전달되며, 사용자는 자연어 형태로 정리된 응답을 받을 수 있습니다.
- 두 번째로 실행되는 함수는 연관 질문 생성 함수입니다. 사용자가 보유한 손익 권한을 바탕으로, 매출, 이익, 영업소별 분석, 거래처별 현황 등 다양한 관점에서 파생될 수 있는 연관 질문들을 자동으로 생성합니다. 이를 통해 사용자는 단편적인 조회를 넘어, 보다 다각도에서 손익 데이터를 분석할 수 있도록 지원받을 수 있습니다.
Case 2. 경제지표 기반 분석
<그림 7> 경제지표 기반 분석 사례
- 두 번째 사례는 사용자가 원자재 가격 변화나 제조업 생산지수 등 경제지표 관련 질문을 제시했을 때의 Profit Agent 활용 방식입니다. 이러한 질문은 외부 공공데이터와의 연계를 통해 정량적 근거를 바탕으로 응답을 제공해야 하므로, 시스템 내에 한국은행의 ‘경제 100대 지표 API’와의 연동이 구현되어 있습니다. 해당 지표 API를 통해 필요한 데이터를 실시간으로 조회하고, 사용자 질문에 적합한 정보를 추출하여 응답을 구성합니다. 또한, 관련된 경제 항목에 대해 추가로 탐색 가능한 연관 질문을 자동 생성하도록 설계되어 있습니다.
- 첫 번째 사례와 동일하게, 사용자의 질문이 접수되면 시스템은 해당 질문을 먼저 분석한 후, 사전에 등록된 Tools 에서 가장 적절한 함수들을 자동으로 선택합니다. 이 함수들은 배열 형태로 반환되며, 순차적으로 실행되어 사용자 응답 생성에 활용됩니다.
- 해당 시나리오에서는 첫 번째로 경제지표 분석 함수가 실행됩니다. 이 함수는 한국은행의 경제 100대 지표 API를 호출하여, 사용자 질문과 관련된 경제 데이터를 수집합니다. 이후 수집된 데이터는 AWS Bedrock API를 사용하여 LLM에 전달되며, 자연어로 정리된 설명과 함께 사용자에게 답변으로 제공됩니다.
- 두 번째로 실행되는 연관 질문 생성 함수는 사용자 질문의 맥락을 바탕으로, 추가로 탐색할 수 있는 관련 질문이나 추천 질문들을 도출합니다. 이를 통해 사용자는 한 가지 지표에 국한되지 않고, 다양한 경제 지표를 연계하여 손익 또는 사업 환경을 보다 폭넓게 분석할 수 있는 기회를 얻게 됩니다.
Case3. 손익 데이터 기반 분석
<그림 8> 손익 데이터 기반 분석 사례
- 세 번째 사례는 사용자가 “2025년 1분기 A제품군의 영업소별 손익 분석을 보여줘”와 같이 내부 손익 데이터를 기반으로 한 비교·분석형 질문을 제시했을 때의 Profit Agent 활용 방식입니다. KCC의 손익 데이터는 제품 유형, 기간, 조직 단위(영업소, 사업부 등)별로 체계화되어 있으며, 이 데이터를 기반으로 사용자의 요청 조건에 맞는 집계 및 비교 분석이 요구됩니다. 이러한 분석은 단순한 수치 제공을 넘어, 손익 구조의 특징을 설명하고 인사이트를 도출하는 Narrative AI의 기능까지 포함하고 있습니다.
- 사용자의 질문이 입력되면 시스템은 먼저 질문의 주요 요소들(기간, 제품군, 분석 단위 등)을 추출합니다. 이후 사전에 등록된 Tools 에서 질문에 부합하는 함수들을 자동 선택하며, 선택된 함수들은 배열로 구성되어 순차적으로 실행됩니다. 이 과정을 통해 손익 데이터의 조회, 분석, 시각화, 내러티브 생성이 유기적으로 연결됩니다.
- 첫 번째로 실행되는 Text2SQL 함수는 사용자의 질문을 기반으로 동적으로 SQL 쿼리를 생성하는 기능을 수행합니다. 이 함수는 미리 정의된 테이블 스키마와 샘플 쿼리를 참고하여, 질문에 해당하는 적절한 쿼리를 생성합니다. 생성된 쿼리는 KCC의 온프레미스 MS SQL Database에서 실행되며, 실행 결과가 Agent 플랫폼으로 반환됩니다. 이 과정에는 Chain of Thought(CoT) 프롬프트 패턴을 적용하여 추론의 정확도를 높였고, 프롬프트 캐싱 기법을 활용해 테이블 스키마와 샘플 쿼리 입력 시 발생하는 토큰 비용을 최소화(90% 이상 절감) 하였습니다.
- 두 번째로 실행되는 연관 질문 생성 함수는 사용자의 질문 문맥과 조회된 데이터의 특징을 바탕으로, 추가로 탐색 가능한 질문을 자동 제안합니다. 예를 들어, “다른 제품군과 비교해 볼까요?”, “2024년 동기와 비교한 추세도 확인해 보시겠습니까?” 등의 질문을 통해 사용자는 더 깊이 있는 분석을 진행할 수 있으며, 반복 질의 없이 자연스럽게 인사이트를 확장해 나갈 수 있습니다.
Multi AI Agent Platform 구축 핵심 포인트
KCC AI Agent 플랫폼의 핵심 기능들을 아키텍처의 질문 처리 흐름 순서대로 정리하였습니다.
1. Guardrail 적용
가드레일을 적용하면 민감한 콘텐츠 필터링, 사용자 정의 정책 설정, 자동화된 위험 탐지 기능 등을 통해 생성형 AI 애플리케이션의 안전하고 책임감 있는 운영을 가능하게 합니다. 이를 통해 AI 모델이 부적절하거나 잠재적으로 유해한 응답을 생성하지 않도록 제어할 수 있으며, 개인정보 보호, 콘텐츠 적절성, 주제 제한 등 다양한 안전 기준을 효과적으로 관리할 수 있습니다.
Profit Agent의 자체 제작한 가드레일에서는 비정상 질문을 10가지 범주로 분류하고, 별도의 한 가지 예외 사항을 포함하여 시스템 프롬프트 지침으로 등록하였습니다. 이를 기반으로 가드레일은 부적절한 질문을 사전에 감지하고 필터링하여, 응답이 안전하고 적절하게 이뤄지도록 제어하는 역할을 수행합니다.
def _get_guardrail_check_prompt(question):
prompt = f"""
당신은 KCC 기업의 손익분석 전문가 입니다. KCC 의 제품유형에 대한 손익정보를 제외한 질문이 들어올 경우 판단해 주세요.
<question> tag 안의 문장이 욕설, 비방, 성적인 표현, 혹은 폭력적인 내용을 포함하는지 판단해 주세요.
아래 10가지 범주 중 해당되는 항목을 모두 표시해 주세요. 만약 적절한 문장이라면 '정상', 범주에 해당하면 '비정상'이라고 응답하세요.
'비정상' 일 경우 답변 마지막에 [※ 입력하신 내용은 기록되며, 서비스 목적에 맞는 질문만 해주시면 더욱 정확한 도움을 드릴 수 있습니다.]
범주:
1. 욕설 또는 비속어 포함
2. 특정 대상에 대한 비방/모욕/차별
3. 성적인 표현 또는 암시
4. 폭력 또는 위협적인 내용
5. 개인정보 요청 또는 노출 (예: 전화번호, 주민등록번호, 계좌번호 등)
6. 회사 정책의 우회 또는 위반 유도 (예: 무단결근, 연차 조작 등)
7. 회사의 보안 또는 운영상 민감 정보에 대한 부적절한 요청 (예: 서버 정보, 내부 시스템 구조, 소스코드 등)
8. 사내 인물의 사생활 또는 루머 관련 질문
9. 비윤리적 업무 요청 (예: 대리 작성, 권한 침해 등)
10. 외부 유출 또는 부정 사용 시도 (예: 이메일로 문서 전송, 외부 공유 등)
11. 단, 정상적인 업무 범위 내의 손익 관련 질의는 허용됩니다.
문장: <question> {question} </question>
응답 형식:
[정상] 또는 [비정상] 형식으로만 응답해주세요.
어느 범주에 속했는지 범주 내용도 같이 표시해주세요.
"""
return prompt
<Code 1> 유해성 질문 필터링 프롬프트
Troubleshooting
Custom Guardrails을 제작하면서, 시스템 프롬프트 내에 자체적으로 정의한 10가지 유해 주제 범주와 1가지 예외 항목을 등록하고, LLM이 해당 항목에 대한 질문을 식별하고 대응할 수 있도록 프롬프트를 구성하여 구현했습니다. 영어 뿐 아니라 한국어 질문에서도 유해한 주제를 인식하고 적절히 응답을 제한할 수 있는 로직을 자체적으로 확보함으로써, 서비스의 안정성과 사용자 경험을 개선할 수 있었습니다.
2. 사용자 질문 해석 및 실행 전략 도출
질문의 적합성 판단이 완료되면, 다음 단계에서는 사용자의 질문으로부터 핵심 정보를 식별하고, 질의 유형, 요청 목적, 출력 형식 등을 분석합니다. 이러한 분석 결과는 후속 실행 계획을 도출하기 위한 시스템 프롬프트로 활용됩니다.
prompt = f"""
당신은 사용자의 질문을 분석하여, AI가 정확하고 유용한 답변을 생성할 수 있도록 질문을 세부 항목으로 분해하는 역할을 합니다.
- 사용자의 질문은 <question> 태그 안에 있습니다.
- 사용자와의 대화 이력은 <history> 태그 안에 있습니다. 해당 내용을 참고하여 질문의 맥락을 추론해야 합니다.
- 날짜 관련 정보는 아래 변수들을 참고하여 보완해야 합니다:
<current_time>: 현재 날짜 (YYYY년 MM월 DD일)
<current_year_month>: 현재 연월 (YYYY년 MM월)
<previous_year_month>: 전년 동월 (YYYY년 MM월)
<previous_month>: 전월 (YYYY년 MM월)
<question> {question} </question>
<history> {history} </history>
<current_time> {current_time} </current_time>
<current_year_month> {current_year_month} </current_year_month>
<previous_year_month> {previous_year_month} </previous_year_month>
<previous_month> {previous_month} </previous_month>
#### 목표:
1. 사용자의 질문에서 다음 항목들을 정확하게 추출하세요:
- 질문 유형 (손익데이터 기반질문, 경제지표관련질문, 사용자보유권한질문)
- 기간 (예: 이번 달, 전월, 전년 동월 등)
- 제품 (명시되지 않은 경우 'KCC 전체'로 처리)
- 수치 정보 또는 요청 데이터 항목 (예: 매출, 이익, 증감 등)
- 비교 대상 (예: 전월 대비, 전년 동월 대비 등)
- 손익데이터 기반질문 인 경우에만 "3. 표시 형식" 을 답변에 포함해주세요.
2. 질문에 날짜 정보가 명시되지 않은 경우, 상황에 따라 적절한 기본값을 적용하세요:
- '이번 달' → <current_year_month>
- '전월' → <previous_month>
- '전년 동월' → <previous_year_month>
- '오늘' → <current_time>
3. 제품 항목은 '제품유형'이라는 단어 없이, 단일명사로만 출력하세요.
4. 결과를 표 또는 차트 중 하나로 출력해야 할 경우, 상황에 맞는 형식을 판단하고:
- 요청내용 또는 결과 내용 컬럼이 3개 이상인 경우 -> 표(Table)
- 요청내용 또는 결과 내용 컬럼이 3개 미만인 경우 -> 차트
- 차트를 선택했다면 차트 종류는 다음 중 하나로 지정하세요: [bar, line, doughnut, polararea, pivotbar]
5. 출력은 반드시 다음 형식을 따라야 합니다:
- <output> 태그 없이 출력
- "Q. 사용자 질문:" 으로 시작
- 항목은 번호로 구분
<output>
Q. 사용자 질문: 이번 달 자동차 도료의 매출과 이익을 알려주고, 전년 대비 차이 내역도 알려줘.
1. 주요 정보 추출:
- 질문유형: 손익데이터 기반질문
- 기간: 2025년 4월 (이번 달)
- 제품: 자동차 도료
2. 요청 내용: 매출, 이익, 전년 대비 차이 분석
3. 표시 형식: 차트(bar)
</output>
"""
<Code 2> 사용자 질문을 분석하고 주요 정보 추출 및 질문유형 분류 작업 수행을 위한 프롬프트
3. Tool Use
Amazon Bedrock의 Tool Use는 생성형 AI 모델이 외부 도구(API 또는 함수 등)에 접근하여, 사용자 요청에 보다 정확하고 실질적인 응답을 생성할 수 있도록 돕는 기능입니다. 예를 들어, 사용자가 특정 라디오 방송국에서 재생 중인 인기곡을 묻는 경우, 모델 자체로는 이를 알 수 없지만, 해당 정보를 제공하는 API가 도구로 연결되어 있다면 이를 호출하여 그 결과를 기반으로 응답할 수 있습니다. 이처럼 Tool Use는 모델이 텍스트 생성 처리에서 나아가, 외부 시스템과 연동된 동적 응답 생성을 가능하게 합니다.
Profit Agent에서는 Tool Use 기능을 효과적으로 활용을 위해, LLM이 적절한 Tool 을 판단하고 선택할 수 있도록 시스템 프롬프트와 Tool 정의 코드를 구성하였습니다. 특히 Amazon Lambda 함수 _get_tool_use_function 로직에서는 각 함수의 역할을 description 필드에 명확히 기술하고, name필드에 지정된 함수 호출에 필요한 Key(예: text2sql) 를 LLM이 반환하도록 설계하였습니다.
#Tool Use 에 사용될 함수 정의
def _get_tool_use_function():
tool_list = [
{
"toolSpec": {
"name": "text2sql",
"description": """질문을 테이블 스키마를 통해 쿼리를 생성하는 함수""",
"inputSchema": {
"json": {
"type": "object",
"properties": {
"question": {
"type": "string",
"description": "사용자질문"
},
},
"required": ["question"]
}
}
}
},
{
"toolSpec": {
"name": "answer",
"description": """쿼리 결과데이터를 기반으로 분석 답변을 생성하는 함수""",
"inputSchema": {
"json": {
"type": "object",
"properties": {
"question": {
"type": "string",
"description": "사용자질문"
},
"sql_result": {
"type": "string",
"description": "쿼리결과데이터"
},
},
"required": ["question","sql_result"]
}
}
}
},
##중략...
]
return tool_list
<Code 3> AWS Bedrock Tool use 옵션 사용을 위한 Lambda Function Definition
아래 코드는 Tool Use 기능을 통해 Tool 리스트를 생성하기 위한 시스템 프롬프트 입니다. 아래 시스템 프롬프트를 통해 Tools 에 등록한 name 값을 배열로 반환받게 됩니다. 반환받은 배열을 순차적으로 수행하는 후속 작업이 이어집니다.
tool_list = common._get_tool_use_function()
tooluse_system_prompt = f"""
당신은 PlanBot이라는 AI입니다. 사용자의 질문을 보고 어떤 도구(tool)를 사용할지 결정합니다.
다음 규칙을 반드시 따르세요:
1. 사용자의 질문은 <question> 태그 안에 있습니다.
2. 이전 대화 내용은 무시하고 현재 질문만 보고 판단하세요.
3. 적절한 도구 이름을 ToolUseList 라는 배열 형태로 출력하세요.
4. 사용된 쿼리 결과로 시각화를 해야 할 경우 "chart" 또는 "table" 중 하나만 포함하세요 (중복 금지).
5. "chart" 또는 "table"을 사용하는 경우에는 반드시 "answer" 다음에 위치해야 합니다.
6. 모든 ToolUseList에는 마지막에 "related_sql" 또는 "related_crawler" 중 하나를 포함해야 합니다.
7. ToolUseList 외에는 어떤 텍스트도 출력하지 마세요 — 설명, 인사말, 주석 등은 포함 금지입니다.
8. 출력 예시는 <example> 태그를 참고하세요.
<question> {question} </question>
<notice>
반드시 아래의 <example> 형식을 따르세요. ToolUseList 배열만 출력해야 하며, 여는 대괄호부터 닫는 대괄호까지 정확히 맞춰야 합니다.
ToolUseList 문구는 제거하고 배열[]만 생성합니다.
</notice>
<example>
ToolUseList: ["text2sql", "answer", "chart", "related_sql"]
</example>
"""
<Code 4> Tool Use List 생성 시스템 프롬프트
아래 코드는 AWS Bedrock의 Tool Use 기능을 활용하여 에이전트를 구성한 구현 예입니다. _get_tool_use_function은 각 Lambda 함수의 역할을 정의하며, 이 정의를 기반으로 해당 Lambda 함수들을 Bedrock에 등록합니다. Amazon Nova 모델은 사용자 질의에 따라 적절한 함수를 자동으로 선택하고 호출하며, 이를 통해 동적인 응답 생성을 수행합니다. 할루시네이션을 최소화하고 정확한 응답을 유도하기 위해 temperature 값은 0으로 설정하였습니다.
##Tool Use 로직
initial_message = {
"role": "user",
"content": [
{"text": question}
],
}
message_list.append(initial_message)
tool_list = common._get_tool_use_function() #Tool Use 리스트 함수
# converse API 사용 필수
tooluse = common.bedrock_client.converse(
modelId=common.claude_model_id, #Claude 3.5 Sonnet LLM 사용
messages=message_list,
inferenceConfig={
"maxTokens": 500,
"temperature": 0.0
},
toolConfig={
"tools": tool_list #Tool Use 리스트 함수
},
system=[{"text": tooluse_system_prompt}] #사용자 질문에 맞는 Tool Use 반환 프롬프트
)
tooluse_result = tooluse['output']['message']['content']
print('※ tooluse_result : \\n\\n', tooluse_result, '\\n')
<Code 5> Claude 3.5 Sonnet 모델을 사용하여 Tool Use 옵션 사용 로직
Troubleshooting
AWS Bedrock Agent의 기본 설정은 범용적인 워크플로를 지원하는 데는 적합하지만, 서비스 특성상 요구되는 세밀한 기능 제어, 결과 처리 포맷, 또는 반응 속도 개선 측면에서는 다소 유연성이 부족했습니다.
보다 정교하고 사용자 맞춤화된 기능 수행을 위해 Tool Use 기능을 도입하였습니다. 이 기능을 활용하면 사전에 정의한 Lambda 함수들을 직접 호출할 수 있어, 원하는 기능을 정확히 구현할 수 있으며 수행 흐름을 세밀하게 제어할 수 있습니다.
4. Text2SQL
Text2SQL은 자연어로 입력된 질문이나 명령을 데이터베이스 질의어(SQL)로 자동 변환해 주는 기술로, 사람이 쓰는 문장을 데이터베이스가 이해할 수 있는 쿼리로 바꿔주는 생성형 AI의 활용 사례라고 할 수 있습니다.
Profit Agent에서 Text2SQL 프롬프트 및 Python 기반 실행 로직은 핵심 기능을 담당하고 있습니다. 프롬프트 엔지니어링 기법 중 Chain of Thought(CoT) 패턴을 적용하였으며, Amazon Nova모델을 통해 사용자 질의에 따라 동적으로 SQL 쿼리를 생성합니다. 또한, 프롬프트 캐싱 옵션을 활용하여 테이블 스키마 및 샘플 쿼리에 대한 반복 입력으로 인한 토큰 비용을 효과적으로 절감하고 응답속도를 높일 수 있도록 구성하였습니다.
한 반복 입력으로 인한 토큰 비용을 효과적으로 절감하고 응답속도를 높일 수 있도록 구성하였습니다.
# 쿼리 생성 스키마, 샘플 예제
schema_txt = open('./table_schema.txt', 'r')
table_info = schema_txt.read()
#--유형별 손익집계표
#CREATE TABLE IF NOT EXISTS kcc_profit_statement (
# YYMM varchar(6),
# BM_CODE varchar(4),
# BM_NM varchar(20),
# 중략...
#);
sql_txt = open('./sql-prompt-example.txt', 'r')
sql_example = sql_txt.read()
#Question: 특정 년월에 대한 모든 제품유형의 매출 정보는?,
#SQL Query: SELECT * FROM kcc_profit_statement WHERE YYMM LIKE '%2407%';
#Question: 특정 제품유형의 매출액 차이(전년 대비 증감)를 조회하려면?,
#SQL Query: SELECT BM_CODE, BM_NM, DF_SALE_AMT FROM kcc_profit_statement WHERE BM_CODE = 'A123';
#Question: 전년도와 당월 매출액이 가장 큰 제품유형은?,
#SQL Query: SELECT BM_CODE, BM_NM, BF_SALE_AMT, AF_SALE_AMT FROM kcc_profit_statement ORDER BY AF_SALE_AMT DESC;
<Code 6> 쿼리를 생성하기 위한 테이블스키마, 샘플 쿼리 예제
# SQL 생성을 위한 프롬프트를 정의합니다.
# - dialect 에는 'sql' 이 들어갑니다.
# - table_info 에는 table 스키마가 들어갑니다.
# - question 에는 사용자 질문이 들어갑니다.
prompt = f"""
당신은 KCC 기업의 MS-SQL Database 전문가입니다.
회사의 데이터베이스에 대한 질문을 하는 사용자와 상호 작용하고 있습니다.
아래의 <Step> tag 들을 참고해서 MS-SQL DataBase SQL 문을 작성해주세요.
<Step0>
한국어로 해석할 때 의미 없는 질문, 한단어 질문 예를 들어 [안녕?, 와우, 뭐야?, 바보] 등등 에 대한 질문이나
손익 데이터 관련 질문이 아닐 때에도 아래 Step 을 전부 무시하고 '해당 질문에 답변을 할 수 없습니다.'라고 답변해 줘.
</Step0>
<Step1>
데이터베이스 스키마는 다음과 같습니다.
<schema> {table_info} </schema>
</Step1>
<Step2>
MS-SQL SQL 쿼리만 작성하고 다른 것은 작성하지 마세요.
MS-SQL SQL 쿼리를 다른 텍스트로 묶지 마세요. 심지어 backtick 으로도 묶지 마세요.
LIKE 구문은 LIKE '%2407%' 와 같이 %%를 두개 사용해서 만들어주세요.
(예: YYMM LIKE '%202503%')
결과 데이터에서 소계와 전체, 합계는 결과값에 포함하지 말아주세요.
LIMIT 문법은 에러가 발생하니 쿼리 답변에 절대 포함하지 말아주세요.
</Step2>
<Step3>
사용자 질문에서의 제품유형코드(BM_CODE)는 <dictionary> tag 안에 있습니다.
제품유형에 해당하는 BM_CODE 를 찾아서 WHERE 조건을 만드세요.
(예: WHERE BM_CODE = 'BAAA')
<dictionary>{bm_dictionary}</dictionary>
</Step3>
<Step4>
예상질문과 쿼리의 예시는 <example> tag 안에 있습니다. 참고해서 SQL쿼리를 작성하세요.
<example>{sql_example}</example>
</Step4>
<Step5>
<format> tag를 참고하여 SQL 쿼리의 출력 포맷을 맞춰주세요.
``` 문자와 sql 문자는 제외해주세요.
<format>
SELECT p.BM_NM, n.NATION_NM, s.SITE_NM, n.AMT_EXP_PER
FROM kcc_profit_statement p
JOIN kcc_nation_actual n ON p.YYMM = n.YYMM AND p.BM_CODE = n.BM_CODE
JOIN kcc_site_actual s ON p.YYMM = s.YYMM AND p.BM_CODE = s.BM_CODE
WHERE 1=1
AND P.YYMM LIKE '%202503%'
AND P.BM_CODE = 'BAAA'
ORDER BY n.AMT_EXP_PER DESC
</format>
</Step5>
Your turn:
Question: {question}
SQL Query:
"""
<Code 7> CoT 패턴을 활용한 Text2Sql 프롬프트
#Amazon Nova Converse API 호출
system = [
{"text": f"{prompt}"},
{
"cachePoint": { # 프롬프트 캐싱 적용
"type": "default"
}
}
]
messages = [
{"role": "user", "content": [{"text": f"Qustion: {question}"}]},
]
inf_params = {"maxTokens": 500, "topP": 0.1, "temperature": 0}
additionalModelRequestFields = {
"inferenceConfig": {
"topK": 20
}
}
model_response = common.bedrock_client.converse(
modelId=common.nova_model_id, #Amazon Nova Pro Model 사용
messages=messages,
system=system,
inferenceConfig=inf_params,
additionalModelRequestFields=additionalModelRequestFields
)
print("\\n[Full Response]")
print(json.dumps(model_response, indent=2))
<Code 8> Amazon Nova Converse API 호출 (프롬프트 캐싱 적용)
Troubleshooting
LLM 기반 Text2SQL 기능을 초기 도입했을 때는 자연어 질문을 SQL 쿼리로 자동 변환해 준다는 점에서 의의가 있었으나, 실제 다양한 실사용 케이스에서 문법 오류, 부정확한 조건, 존재하지 않는 컬럼명을 포함한 쿼리가 생성되는 문제가 반복적으로 발생했습니다.
LLM이 테이블 구조 및 컬럼명, 데이터의 실제 맥락을 충분히 이해하지 못한 상태에서 쿼리를 생성했기 때문에 잘못된 문법이나 비 정확한 컬럼 및 조건이 포함되는 결과로 이어졌습니다. 또한, 실제 쿼리는 MS SQL 기반 문법이 필요했음에도 이를 고려하지 않은 일반적인 SQL 문법이 적용되는 한계도 있었습니다. 이에 다양한 보완 조치를 통해 정확도를 개선하였습니다.
- 테이블 스키마에 컬럼 명칭을 명확히 정의하고
- 도메인 용어사전을 구축하여 LLM이 컬럼과 데이터값의 의미를 정확히 이해하도록 유도했습니다.
- LLM에게는 MS SQL 문법 전문가 역할을 부여하여 생성 쿼리가 실제 운영 DB 환경에 맞도록 조정했습니다.
- 또한, Chain of Thought(COT) 기법을 적용하여 쿼리 생성 과정을 단계별로 안내하고, 세부 조건을 명확히 구성할 수 있도록 했습니다.
이러한 개선을 통해 Text2SQL 기능의 안정성과 정확성이 대폭 향상되었으며, 실제 손익 데이터 분석 쿼리에 효과적으로 활용할 수 있게 되었습니다.
결론 및 전망
솔루션 도입 효과
KCC는 GenAI 기반의 Multi Agent 아키텍처를 도입함으로써, 데이터 중심의 의사결정 체계를 고도화하고 각 부서의 전문성과 업무 맥락에 특화된 AI Agent를 실질 업무에 적용하려 합니다. 이를 통해 단순 반복 업무의 자동화는 물론, 손익 분석, 전략 기획, 리스크 진단 등 복잡한 업무에도 AI가 보조 역할을 수행하며 경영 효율성과 실행력을 동시에 확보하고 있습니다.
또한, LLM 성능 최적화와 프롬프트 캐싱, 도메인 지식 기반의 용어사전 등 다양한 기술적 개선을 통해 응답 정확도 및 처리 속도를 대폭 향상시켰으며, 사용자 경험 또한 크게 개선되었습니다.
이와 같은 기술력은 전사 차원의 다양한 업무 Agent에도 확장 적용되고 있습니다. KCC는 각 부서의 요구와 업무 특성을 반영하여 전략 수립, 데이터 분석, 업무 자동화 등 다양한 영역에 AI Agent를 지속적으로 확대 적용하고 있으며, 이를 통해 전사적 디지털 전환의 속도와 품질을 동시에 제고하고 있습니다.
향후 계획
KCC는 현 Multi Agent 플랫폼의 성과를 바탕으로, 다음의 네 가지 전략 방향으로 전사 AI 플랫폼을 확장하고자 합니다.
- 업무별 Agent 고도화 이미 구축된 Agent들의 정확도와 성능을 지속 개선해 나갈 예정입니다. 사용자 피드백을 반영해 기능을 추가하고, 특정 업무에 최적화된 추천 기능 및 자동화 기능을 강화하여 업무 수행의 효율성과 신뢰성을 더욱 높입니다.
- Agent 관리자 프로그램 개발 각 Agent의 사용 현황, 실행 오류, 성능 등을 통합적으로 관리할 수 있는 프로그램을 개발합니다. 장애 대응 및 모니터링 기능을 추가하여 운영의 안정성과 유지 보수 편의성을 높이고, 기업 내 IT 거버넌스와 연계될 수 있도록 체계를 마련할 계획입니다.
- 업무별 Agent 확장 현재 도입된 4개 도메인 외에도, 각 부서의 니즈를 수렴하여 신규 업무 영역에 특화된 Agent를 지속적으로 개발합니다. 특히, 전사 전략·영업·생산·품질 등 핵심 기능 부서에 대한 AI 지원 확대를 통해 업무 전반의 디지털 전환을 가속화합니다.
- 도메인별 sLLM 구축 각 업무 도메인에 특화된 Small LLM(sLLM)을 구축하여, 질의응답을 넘어 문맥 이해 기반의 전략 제안과 시나리오 중심의 의사결정 지원을 강화합니다. 주요 업무별 데이터셋을 구축하고 파인튜닝하며, 지속적인 평가를 통해 성능을 고도화해 나갈 예정입니다. 이를 통해 전사 AI 플랫폼은 더욱 전문화되고, 현업이 실제 활용 가능한 수준의 ‘지능형 비서’ 역할을 수행하게 될 것입니다.
앞으로도 KCC는 전사 차원의 AI Agent 플랫폼을 지속적으로 고도화하며, 데이터 기반 경영 역량을 강화해 나갈 계획입니다. 이를 통해 변화하는 경영 환경에 민첩하게 대응하고, 보다 전략적인 의사결정 체계를 구축해 나갈 것입니다.