빅스비(Bixby) 캡슐 개발

박세건·2024년 10월 28일
0

기술 실습

목록 보기
15/18

용어 설명

캡슐(Capsule)

빅스비의 기능을 구현하고 배포하는 단위 (프로젝트 파일로 만들어진 서비스를 생각)
특정한 작업이나 서비스를 수행하기 위해 필요한 모든 요소를 포함, 빅스비와 상호작용하기위한 로직과 데이터를 정의
Ex. 날씨 정보 캡슐,
의도(Intent) : 오늘 서울 날씨 어때? 라는 요청을 처리하기 위한 의도

Concept Action Network(CAN)

Ex. 이번 주말에 제주공항 근처에 호텔에 예약해줘 라는 요청을 했을때, flight capsule과 geo capsule을 통해서 응답을 제공할 수 있습니다.
이렇게 다양한 캡슐들이 어우러진 컨셉과 액션들로 이루어진 네트워크를 의미합니다.

Concept & Action

Ex. 5더하기 7은 뭐야?
위와같은 예시가 있을때 빅스비 플랫폼은 문장을 이해하기 위한 단위요소로 쪼개서 이해 합니다.
input1 = 5, input2 = +, input3 = 7
output = 12
이처럼 input과 output들을 빅스비에서 Concept이라고 합니다.
또한, input에서 output을 도출하는 과정을 Action이라고 합니다.
결과적으로, 사용자의 요청을 어떻게 이해하여 input, output 컨셉을 잡고 이를 도출하기 위한 액션을 설계하는 행위를 모델링 이라고합니다.

Concept 종류

  • Primitives
  • Structures

HTTP PUT 요청 보내기

현재 진행되는 프로젝트에서 빅스비를 통해 음성으로 재고를 언데이트할 수 있도록 하는 캡슐을 만들어보려고 한다.
put 요청은 baseURL/api/significant
요청을 보내면 DB의 재료 재고를 업데이트를 진행하는 API 이다.

Bixby Studio를 통해 진행하고 New 버튼 -> Create Capsule from Sample -> HTTP API Calls를 선택해 예제 코드를 사용하여 진행해보자

models란

인공지능 모델이나 기계 학습 모델을 의미합니다. 이는 빅스비가 음성 인식, 자연어 처리, 이미지 인식 등 다양한 기능을 수행하기 위해 사용하는 알고리즘이나 시스템을 나타냅니다.

구조

actions

학습시킬 내용에 대한 동작을 매핑
어떤 input이 들어오고 어떤 output이 나가는지 명시(타입도 명시)

concepts

예를 들면, 프로그래밍 언어의 타입
두가지 종류

  • primitive : 기본형, 텍스트 or 숫자
  • structure : C언어의 구조체 느낌, 세부적으로는 primitive 컨셉으로 구성

Concept 생성

예의치 못한 상황에서 재료를 사용해야되는 경우를 음성으로 말해서 지료를 업데이트 시키도록 하고싶기 때문에, 업데이트 API 응답메시지를 받아줄 primitive타입의 ResMessage Concept이랑 structure 구조의 Significant 라는 Concept을 생성한다.
Significant Concept은 필요하지 않을 수 있지만 structure 컨셉을 적용하며 이해하기 위해 생성해본다

models -> concepts 하단에 파일 생성
ResMessage.model.bxb

text (ResMessage) {
  description (API 응답 결과 메시지)
}

Significant.model.bxb

structure (Significant) {//구조체 컨셉의 이름
  description (특이사항 모델 정의)

  property (resMessage){ //프로퍼티의 이름
    type (ResMessage)//primitive 컨셉명
    min(Required)
  } 
}

Action 생성

입출력을 받아줄 수 있는 컨셉을 생성했으니 이제 어떤 동작으로 작동하게 할 것인지 액션을 만들어보자
models -> actions 하위에서 진행

PutSignificant.model.bxb 생성

action (PutSignificant) {
  description (PUT Significant from server)
  type(Search)
  output (Significant)
}

코드 설명

  • type(Search) : 액션이 어떤일을 수행하는지 명시, 기본적으로 Search
  • output(Significant) : 결과값의 타입이 Significant 컨셉이라는 뜻

코드 작성

지금 까지 설정으로 모델링이 끝났고 이제 코드 작업을 진행한다

http put 요청을 보내는 js코드 작성

이전에 설정은 액션에 대한 정의 였다면 코드 작성 부분에서는 액션이 어떤 작업을 수행할지 결정합니다.
Code 하위에 js파일을 작성해주는데 주의할점은 파일명은 액션과 동일하게 해줘야한다는 점이다!

PutSignificant.js

var http = require('http')
// var console = require('console')
// var config = require('config')
 
module.exports.function = function findShoe () {
  var response = http.getUrl('${요청 api 주소}', { format: 'json' });
  // console.log ("response = " + response)
  return response;
}

해당 url로 요청을 보내면 포맷은 json데이터로 응답을 받도록 진행한다.

생각해볼점
현재 다른 사람의 블로그를 사용해서 진행하고있는데 해당 블로그는 get으로 진행, 현재 본인은 PUT 메서드를 사용해서 요청을 보내려고합니다. 때문에 해당 블로그는 body에 데이터를 넣는 방식에 대한 내용이 없다.
때문에! 일단 Get 메서드로 진행하고 추후에 body에 데이터를 넣어서 업데이트를 진행해보는 식으로 진행해보자

엔드포인트 설정

액션과 js코드를 연결해주는 엔드포인트를 설정해줍니다.
현재 동작을 정의하는 액션을 만들어주고 해당 액션이 어떤 기능을 하는지에 대한 js코드를 작성해주었다. 하지만! 현재 액션과 코드가 연결되어있지 않기때문입니다.

resources/base/endpoints.bxb 파일에서 진행한다

endpoints {

  action-endpoints {
    action-endpoint (PutSignificant){
      accepted-inputs ()
      local-endpoint (PutSignificant.js)
    }
    // action-endpoint (FindShoe) {
    //   accepted-inputs ()
    //   local-endpoint (FindShoe.js)
    // }
    
    // action-endpoint (FindShoeFiltering) {
    //   accepted-inputs (type)
    //   local-endpoint (FindShoeFiltering.js)
    // }
    
    // action-endpoint (FindShoeRemoteEndpoint) {
    //   accepted-inputs ()
    //   remote-endpoint ("https://my-json-server.typicode.com/bixbydevelopers/capsule-samples-collection/shoes") {
  }
}

빅스비 학습

이제 본격적으로 작성된 내용에 맞게 빅스비를 학습 시켜보자

capsule.bxb 파일에서 진행된다.

target 한국 설정

target 부분의 코드를 한국 부분으로 수정해준다
target (bixby-mobile-ko-KR) //타겟을 한국으로 설정

capsule {
  id (example.http)
  version (1.1.0)
  format (3)
  targets {
    target (bixby-mobile-ko-KR) //타겟을 한국으로 설정
  }
  runtime-version (8) {
    overrides {
      no-fallback-dialog-in-views (false)
      auto-on-click-for-list-of(true)
    }
  }
  capsule-imports {
    import (viv.money) {
      as (money)
      version (2.22.51)
    }
  }
  store-countries {
    all
  }
  store-sections {
    section (EducationAndReference)
  }
}

Training 진행

트레이닝 과정을 통해서 직접 입력값을 입력해보고 액션을 선택해서 학습을 시킬 수 있다.

Training Source 변경

en-US로 설정되어있는 Training Source를 한국을 추가해준다.




여기서는 학습시킬 문구를 입력한다. 즉, 해당 문구가 음성으로 입력되었을때를 확인하기위함이다.

이전에 만들어놓았던 액션을 GOAL부분에 넣어준다
여기서 GOAL이란, 입력한 문구가 입력되었을때 어떤 액션을 실행할지를 정하는 부분이다.
본인은 PutSignificant.model.bxb 선택하고 Save하여 학습을 저장

위처럼 Not Compiled가 있다면 아직 학습하지 않았음을 의미합니다.
Compile NL Model을 눌러 학습을 진행합니다.

정상적으로 학습을 완료했음을 확인

Views 만들기

모델링과 코드작성, 학습까지 완료했다면 거의다 완성한것이다.
이제 내부 동작을 구현했다면 그 데이터를 어떻게 빅스비에서 보여줄 것인지를 구현해야한다. 이것을 Views라고 한다.

resources/base/views 하위에서 진행한다.
코드를 먼저 보고 설명하겠다.

View 만들기

Significant_Result.view.bxb

result-view {
  // 결과 뷰의 정의 시작
  match: Significant(significant) // significant한 항목을 매칭합니다.

  message (안뇽안뇽) // 사용자에게 표시할 메시지입니다.

  render {
    // 렌더링 과정 시작
    list-of (significant){ // significant 항목의 목록을 생성합니다.
      where-each (item){ // 각 항목에 대해 반복합니다.
        macro (significant-summary-macro){ // significant 요약 매크로를 호출합니다.
          param (significant){ // significant 매개변수를 정의합니다.
            expression (item) // 현재 항목을 표현합니다.
          }
        }
      }
    }
  }

  // confirm-options {
  //   label (__CONFIRM_BUTTON_LABEL__) // 확인 버튼의 레이블을 정의하는 주석입니다.
  // }

  // abort-options {
  //   label (__ABORT_BUTTON_LABEL__) // 중단 버튼의 레이블을 정의하는 주석입니다.
  // }
}
  • match : 특정한 action이 significant라고하는 콘셉으로 응답했다면 해당 result-view는 Significant를 연결했기때문에, 해당 result-view를 응답하게된다. 즉 Significant라는 콘셉으로 받아서 들어온다.
  • render : 어떤 뷰가 보여질지 결정
  • list-of : 리스트를보여줄 수 있도록 설정
  • where-each : 반복해서 macro를 보여주기 위함
  • macro : 반복되는 코드 조각을 의미, 만들어진 macro 객체를 주입

Layout 만들기


위 구조가 될 수 있도록 resource/base 하위에 디렉토리 구조를 만들어준다.

significant-summary-macro.macro.bxb 파일 생성

macro-def(significant-summary-macro) {
  // significant-summary-macro 매크로 정의 시작
  params {
    // 매크로에 전달될 매개변수 정의
    param (significant) { // significant 매개변수
      type (Significant) // 매개변수의 타입은 Significant입니다.
      min (Required) // 최소 요구 사항: 필수입니다.
      max (One) // 최대 요구 사항: 하나만 허용됩니다.
    }
  }

  content {
    // 매크로의 콘텐츠 정의 시작
    title-card { // 제목 카드 생성
      title-area { // 제목 영역 정의
        slot1 { // 슬롯 1 정의
          text { // 텍스트 블록 정의
            value { // 값 정의
              template ("#{value (significant.resMessage)}") // significant의 resMessage 값을 템플릿으로 표현
            }
          }
        }
      }
    } 
  }
}

Views에서는 어떻게 보여질 화면을 정의할 것인지 작성하고, Layout에서 구체적으로 보여지는 구조를 생성한다.

테스트

작성된 파일로 테스트를 진행해보려고한다 하지만 제대로 인식하지 못하는 에러 발생
Get Method로 요청을 보냈는데 해당 응답값이 빅스비 스튜디오에서 만들어놓은 모델이랑 일치않아서 발생했던 문제라고 생각

스프링부트 컨트롤러에서 해당 빅스비 모델명이랑 알맞게 수정

    /*
     *   JSON을 통한 빅스비 테스트
     * */
    @GetMapping("/bixbyByJson")
    public ResponseEntity<?> bixbyByJson() {
        TestBixby testBixby = TestBixby.builder()
                .resMessage("JSON을 통한 테스트입니다!")
                .build();
        return ResponseEntity.ok(testBixby);
    }


정상적으로 스프링부트의 응답이 빅스비 스튜디오에서 응답되는 것을 확인

이전에 빅스비 스튜디오에서 models에서 concepts를 만들어주었고 Signficants와 그안에 ResMessage concepts를 갖도록 구현하였다.
때문에,

structure (Significant) {//구조체 컨셉의 이름
  description (특이사항 모델 정의)
  property (resMessage){ //프로퍼티의 이름
    type (ResMessage)//primitive 컨셉명
    min(Required)
  } 
}

와 같이 작성했다면 http 응답에 대한 Json값에서 속성이 서로 일치해야함
Ex.

{
    "resMessage": "JSON을 통한 테스트입니다!"
}

위의 Significant Concepts과 위의 해당 값을 응답하는 컨트롤러와 일치


정상적인 메시지 응답

Get Method 방식을 빅스비와 연동을 성공했다면 이제 Patch를 통해 서버에 들어있는 정보를 수정해볼 수 있는 빅스비 기능을 구현해보자

profile
멋있는 사람 - 일단 하자

0개의 댓글