BTP

Joule 스킬, 코딩 없이 될까? #shorts #SAP #Joule

개요와 목표 체크리스트

이 글은 SAP의 생성형 AI 어시스턴트 Joule에 나만의 업무 기능, 즉 커스텀 스킬(Custom Skill)을 처음 붙여보는 분을 위한 단계별 실전 예제입니다. 가상의 물류팀 시나리오인 "배송 상태 확인" 스킬을 만들며 생성부터 API 연결, 배포·운영까지 전체 흐름을 따라갑니다.

  • Joule 스킬의 구성 요소(트리거, 파라미터, 액션, 응답)를 이해한다
  • Joule Studio에서 스킬을 만들고 시뮬레이터로 테스트한다
  • BTP Destination으로 사내 REST API를 액션으로 연결한다
  • 에러 처리, 권한, 릴리스 관리 등 운영 포인트를 점검한다

미리 알아두면 좋은 배경

코딩 경험이 거의 없어도 따라올 수 있지만, SAP BTP 서브어카운트와 구독 개념, REST API와 JSON의 기본 구조를 알고 있으면 수월합니다. 챗봇의 인텐트·엔티티 개념은 본문에서 비유로 다시 설명합니다.

기존에 IT 부서 상담용 챗봇이나 콜센터 ARS를 다뤄본 경험이 있다면 개념 이해가 훨씬 빠릅니다. 다만 전통적인 챗봇은 "정확히 이 문장이 들어와야만" 반응하는 규칙 기반이 많았던 반면, Joule은 대규모 언어 모델을 사용해 표현이 조금 달라도 의도를 유연하게 해석한다는 차이가 있습니다. 이 차이 때문에 스킬을 설계할 때도 "모든 문장을 나열"하기보다 "무엇을 하는 스킬인지 명확히 설명"하는 쪽에 더 공을 들이게 됩니다. 이 관점을 미리 이해하고 시작하면 뒤에서 트리거 문장을 적게 등록하고도 인식률이 잘 나오는 이유가 자연스럽게 납득됩니다.

환경 구성과 준비물

이 예제는 다음 환경을 기준으로 합니다. 명칭과 화면은 릴리스에 따라 달라질 수 있으니 다르면 릴리스 노트를 확인하는 것이 좋습니다.

  • SAP BTP 엔터프라이즈 계정 (Cloud Foundry 환경, 예: eu10 리전)
  • Joule 엔타이틀먼트 및 서브어카운트 구독
  • SAP Build 구독 — 커스텀 스킬은 일반적으로 SAP Build 로비의 Joule Studio에서 제작합니다
  • SAP Cloud Identity Services(IAS) 테넌트 — 신뢰 설정과 포메이션(Formation) 구성에 사용
  • 스킬이 호출할 대상 API — 이 글에서는 가상의 사내 배송 추적 REST API를 사용합니다

권한은 BTP 서브어카운트 관리자 역할과 SAP Build 프로젝트 생성 역할 컬렉션이 필요합니다.

핵심 개념 — Joule 스킬은 어떻게 동작하나

Joule을 회사 안내 데스크 직원이라고 생각해 보세요. 기본 제공 능력(SAP 표준 애플리케이션 지원)은 이미 교육받은 상태이고, 커스텀 스킬은 우리 회사만의 업무 매뉴얼을 한 장 더 쥐여주는 것과 같습니다. 매뉴얼 한 장(스킬)은 보통 네 부분으로 구성됩니다.

  • 트리거(Trigger): 어떤 질문에 이 스킬을 꺼낼지 정하는 예시 문장 모음. "3049번 배송 어디쯤이야?" 같은 발화가 해당합니다.
  • 파라미터(Parameter): 문장에서 뽑아낼 값. 위 예시의 배송 번호 3049가 파라미터이며, 없으면 Joule이 되물어 수집합니다.
  • 액션(Action): 실제 일을 하는 부분. BTP Destination을 거쳐 API를 호출하고 결과를 받아옵니다.
  • 응답(Response): API 결과를 읽기 좋은 문장이나 카드로 되돌려주는 부분.

사용자 발화 → Joule(의도 분류) → 스킬 선택 → 파라미터 수집 → 액션(Destination → REST API) → 응답 렌더링

중요한 점은 Joule이 대규모 언어 모델로 발화를 해석하므로 트리거 문장을 전부 나열할 필요가 없다는 것입니다. 대표 문장 몇 개와 명확한 스킬 설명(description)을 주면 유사 표현도 일반적으로 잘 매칭됩니다. 반대로 설명이 모호하면 비슷한 스킬끼리 충돌하므로, 설명을 "무엇을 언제 쓰는지" 기준으로 구체적으로 쓰는 것이 권장됩니다.

대화가 한 번의 질문-응답으로 끝나지 않는 경우도 자주 있습니다. 예를 들어 사용자가 "배송 상태 알려줘"라고만 말하면 배송 번호가 없으므로 Joule은 파라미터 정의에 등록된 prompt 문구로 되묻고, 사용자가 번호만 답하면 그 값을 이전 맥락의 파라미터로 이어 붙여 액션을 호출합니다. 이 "멀티턴" 흐름은 별도로 코딩할 필요 없이 파라미터를 required: true로 선언하는 것만으로 Joule이 자동으로 처리해 준다는 점이 실무적으로 유용합니다. 다만 되묻는 질문이 두 번, 세 번 반복되면 사용자가 이탈할 수 있으므로, 파라미터는 꼭 필요한 값만 필수로 지정하고 나머지는 선택값과 기본값 조합으로 설계하는 편이 대화 완주율에 좋습니다.

실전 예제 — 3단계로 완성하는 배송 상태 확인 스킬

1단계: 기본 스킬 만들기

SAP Build 로비에서 Create → Joule Studio → Skill을 선택하고 프로젝트 이름을 logi-assistant로 만듭니다. 첫 스킬은 API 없이 정적 응답만 돌려주며 구조를 익힙니다. 스킬 뼈대를 JSON으로 표현하면 다음과 같습니다.

{
  "skill": "checkShipmentStatus",
  "description": "사내 물류 시스템에서 배송 번호로 현재 상태와 도착 예정일을 조회",
  "triggerSentences": [
    "3049번 배송 지금 어디야?",
    "배송 상태 알려줘",
    "내 출고 건 도착 예정일 확인해줘"
  ],
  "parameters": [
    {
      "name": "shipmentNo",
      "type": "string",
      "required": true,
      "prompt": "확인할 배송 번호를 알려주세요."
    }
  ],
  "response": {
    "type": "text",
    "template": "{{shipmentNo}}번 배송 조회 기능을 준비 중입니다."
  }
}

저장 후 우측 시뮬레이터에서 "배송 상태 알려줘"라고 입력해 보세요. 배송 번호를 되묻고, 입력 시 템플릿 응답이 출력되면 성공입니다.

2단계: 실무 시나리오 — Destination 액션 연결과 에러 처리

이제 가상의 사내 배송 추적 API를 연결합니다. BTP 콕핏에서 Destination LOGI_TRACKER_API를 만들고(URL 예: https://logi.internal.example.com/api, 인증 OAuth2ClientCredentials), Joule Studio의 Action 프로젝트에서 이 Destination을 지정해 액션을 정의합니다.

{
  "action": "getShipmentById",
  "destination": "LOGI_TRACKER_API",
  "request": {
    "method": "GET",
    "path": "/v1/shipments/{{shipmentNo}}",
    "timeoutMs": 8000
  },
  "output": {
    "status": "$.currentStatus",
    "carrier": "$.carrierName",
    "eta": "$.estimatedArrival"
  },
  "onError": [
    { "httpStatus": 404, "message": "{{shipmentNo}}번 배송을 찾지 못했습니다." },
    { "httpStatus": "5xx", "message": "물류 시스템 지연 중입니다. 잠시 후 다시 시도해 주세요." }
  ]
}

응답 템플릿은 액션 출력값을 쓰도록 바꿉니다: "{{shipmentNo}}번 배송은 현재 {{status}} 상태, {{carrier}} 편으로 {{eta}} 도착 예정입니다." 연결 전 API 응답 스키마를 로컬에서 미리 검증해 두면 좋습니다.

const res = await fetch(
  "https://logi.internal.example.com/api/v1/shipments/3049",
  { headers: { Authorization: `Bearer ${token}` } }
);
if (!res.ok) {
  console.error(`[logi-api] ${res.status} shipmentNo=3049`);
  throw new Error("shipment lookup failed");
}
console.log(await res.json()); // currentStatus, carrierName, estimatedArrival

404·타임아웃 같은 실패 경로를 스킬 안에서 사용자 친화적 문장으로 변환해 두면 "에러 코드만 뜨는 챗봇"이 되는 것을 막을 수 있습니다.

3단계: 프로덕션 — 릴리스, 보안, 테스트

  • 릴리스·배포: 프로젝트를 Release로 버전 고정(예: 1.0.0) 후 대상 Joule 테넌트에 Deploy. 수정은 새 버전으로만 반영해 롤백 지점을 남깁니다.
  • 포메이션: IAS에서 Joule·SAP Build·대상 애플리케이션을 하나의 포메이션으로 묶어야 스킬이 실제 Joule 화면에 노출됩니다.
  • 보안: Destination 기술 사용자에게 조회 권한만 부여(최소 권한). 시크릿은 Destination 서비스에 위임하고 스킬 정의에 하드코딩하지 않습니다.
  • 성능: 타임아웃 명시(예제 8초), 응답이 큰 API는 ?fields=currentStatus,estimatedArrival처럼 서버 측 필터로 페이로드 축소.
  • 테스트: 정상/없는 번호/파라미터 누락 3가지 케이스를 배포 전마다 시뮬레이터로 검증하고, 사용자 발화 로그를 주기 검토해 트리거를 보강합니다.

운영 전환 시 놓치기 쉬운 부분은 "권한이 있는 사용자와 실제로 스킬을 보는 사용자가 다를 수 있다"는 점입니다. 포메이션에 애플리케이션을 연결했다고 해서 모든 사용자에게 자동으로 노출되는 것은 아니며, 역할 컬렉션이 사용자 그룹에 매핑되어 있어야 실제 화면에 스킬이 나타납니다. 배포 직후에는 관리자 계정으로만 테스트하기 쉬운데, 실제 현업 사용자 계정으로도 한 번 더 확인하는 습관을 들이면 "왜 나만 스킬이 안 보이냐"는 문의를 크게 줄일 수 있습니다.

흔한 실수와 트러블슈팅 FAQ

Q1. 배포했는데 Joule 대화창에서 스킬이 호출되지 않아요.

대부분 포메이션 미구성 또는 역할 누락입니다. IAS 포메이션에 Joule과 스킬 프로젝트가 함께 포함됐는지, 사용자에게 스킬 사용 역할이 매핑됐는지 확인하세요. 배포 후 반영까지 수 분 걸리는 경우도 일반적입니다.

Q2. 비슷한 질문인데 엉뚱한 스킬이 실행됩니다.

스킬 설명이 겹치는 경우입니다. "배송 조회"와 "출고 요청 승인"처럼 설명 첫 문장에서 용도와 대상 데이터를 구분하고, 트리거에 각 스킬 고유 표현("도착 예정일", "승인해줘")을 넣어 재배포하세요.

Q3. 액션 호출이 401/403으로 실패합니다.

OAuth 시크릿 만료, 토큰 URL 오타, 기술 사용자 권한 부족이 3대 원인입니다. 콕핏의 "Check Connection"으로 1차 확인 후, 같은 자격 증명으로 2단계 fetch 스니펫을 직접 실행해 API 쪽 문제인지 분리 진단하세요.

Q4. 파라미터를 자꾸 못 알아듣습니다.

prompt를 "배송 번호(숫자 4자리)를 알려주세요"처럼 형식 힌트를 포함해 구체화하면 수집 성공률이 올라갑니다.

Q5. 개발 환경에서는 잘 되는데 운영 환경에 배포하니 응답이 느립니다.

운영 Destination이 개발용보다 지리적으로 먼 리전을 바라보고 있거나, 운영 API 서버가 더 많은 트래픽을 받아 지연이 생기는 경우가 흔합니다. 먼저 액션의 timeoutMs를 넉넉히 잡아 타임아웃 자체를 원인에서 배제한 뒤, API 서버 쪽 응답 로그로 실제 처리 시간을 확인하세요. 그래도 느리다면 자주 조회되는 값은 짧은 캐시(예: 30초)를 두어 반복 호출을 줄이는 방법도 고려할 만합니다.

이어서 살펴볼 주제

  • Joule 에이전트(Agent): 여러 도구를 스스로 조합해 다단계 업무를 처리하는 자율 에이전트 구성
  • SAP Build Process Automation 연계: 스킬에서 승인 워크플로 직접 트리거
  • Grounding: 사내 문서를 근거로 답변하는 지식형 시나리오
  • SAP AI Core / Generative AI Hub: 모델 오케스트레이션 심화

더 깊이 볼 자료

댓글 0

아직 댓글이 없습니다.