Browsing Tag

Skill Trainer

NCLOUD

[NCLOUD] CLOVA Studio 스킬 트레이너 활용 가이드

안녕하세요. MANVSCLOUD 김수현입니다.

올해 4월부터 준비하여 6월에 진행됐던 ‘AI 막차 탑승 : HyperCLOVA X 프로젝트 챌린지’가 지난 주에 정상적으로 종료되었는데요.

해당 챌린지를 기획하고 운영하며 참가자들에게 가장 많은 질문을 받았던 내용이 CLOVA Studio 스킬 트레이너에 대한 사용법이었습니다.

스킬 트레이너의 경우 가이드를 보고 진행해도 잘 되지 않고 사용하기 어렵다는 반응이 많았습니다. 따라서 CLOVA Studio 스킬 트레이너를 쉽게 활용할 수 있는 가이드를 만들어보았습니다.


CLOVA Studio 스킬 트레이너를 활용하기 위해서는 다양한 데이터 소스를 탐색하고 필요한 데이터를 제공하는 API를 찾는 것이 중요합니다. OpenAPI를 통해 데이터를 제공하는 대표적인 곳으로는 다음과 같은 플랫폼이 있습니다.

  1. 공공데이터 포털: 한국 정부와 지자체에서 제공하는 다양한 공공 데이터를 쉽게 접근할 수 있습니다.
  2. 네이버 오픈 API: 검색, 뉴스, 쇼핑, 블로그 등 네이버에서 제공하는 다양한 데이터를 활용할 수 있습니다.
  3. 문화데이터 광장: 문화재, 박물관, 공연 등 문화와 관련된 데이터를 제공하는 플랫폼입니다.
  4. 공간정보 오픈플랫폼: 공간정보와 관련된 다양한 데이터를 제공하여 지도 및 위치 기반 서비스 개발에 유용합니다.

이 외에도 다양한 API 제공처들이 존재하며 원하는 데이터를 제공하는 API를 찾아 CLOVA Studio 스킬 트레이너에 적용할 수 있습니다.

  • 공공데이터 포털
    이 가이드에서는 공공데이터 포털에서 얻은 OpenAPI를 이용하여 진행됩니다.

– 공공데이터 포털 URL : https://www.data.go.kr

공공데이터 포털은 다양한 공공 데이터를 제공하는 대표적인 플랫폼으로, 필요한 데이터를 API 형식으로 제공받을 수 있습니다.

먼저 위 링크에 접속하여 로그인을 해줘야하는데 만약 회원가입이 되어있지 않다면 홈페이지 상단의 ‘회원가입’ 버튼을 클릭하여 회원가입을 절치를 먼저 진행해줍니다.

로그인이 완료되었다면 홈페이지 상단의 [마이페이지]를 클릭하여 Open API를 사용하기 위한 인증키를 발급해줍니다.

인증키까지 발급이 완료되었다면 이제 공공데이터 포털에서 제공하는 Open API를 활용할 수 있습니다. 이제 원하는 데이터를 찾아봅시다.


위 사진과 같이 [데이터찾기] – [데이터목록]에서 원하는 데이터를 찾고 [활용신청]을 진행해줍시다. 이 가이드에서는 “한국식품안전관리인증원_HACCP 인증업체정보 API”를 활용해서 HACCP 인증이된 업체를 확인해보고자 합니다.

[활용신청]을 클릭하면 **활용 목적을 작성하고 **이용허락범위에 대해 동의 후 활용신청을 진행할 수 있게됩니다.

여기까지 완료되었다면 이제 여러분은 스킬 트레이너를 위해 데이터까지 구한 것입니다. 데이터를 얻었다면 이 데이터를 활용할줄 알아야하는데요.

이제 이 데이터를 활용하기 위해 OpenAPI를 이해해야합니다.


위 단계까지 진행이 완료되었다면 이제 신청 완료된 ‘오픈API 상세’ 페이지로 접속해 활용 명세를 살펴봅니다. (‘홈 – 마이페이지 – 데이터 활용 – Open API – 활용신청 현황’에서 활용신청한 OpenAPI를 선택 후 [상세설명]을 클릭하면 쉽게 접속할 수 있습니다.)

‘Open API 명세 확인 가이드’를 참고한다면 이해하는 데 더욱 도움이 될 수 있습니다.

아래 그림과 같이 Base URL로 apis.data.go.kr/B553748/CertCompanyListService2 가 있고 그 아래로 API 목록이 있습니다.

당연히 Base URL은 각 Open API마다 다릅니다.

위 API 목록에서 /getCertCompanyListService2는 HACCP 인증업체정보를 조회하는데 사용된다고 합니다. 이때 HACCP 인증업체정보를 조회를 하려면 주소는 아래와 같이 작성이 되어야합니다.

apis.data.go.kr/B553748/CertCompanyListService2/getCertCompanyListService2

Base URL(apis.data.go.kr/B553748/CertCompanyListService2)과 API URI(/getCertCompanyListService2)가 합쳐진 것입니다.

하지만 위 주소만으로는 API를 호출할 수 없습니다. 각 API 항목마다 요구되는 Parameters가 있습니다.

위 사진에서 보시다시피 HACCP 인증업체정보를 조회 API는 ServerKey(공공데이터포털에서 받은 인증키), appointno(HACCP인증업체별로 부여된 고유번호) 등이 존재하는데 ServerKey의 경우 *required 라고 표기가 되어있는데요. 이 값의 경우 필수적으로 입력되어야하는 것입니다. 다른 OpenAPI도 필수 또는 선택 Parameters가 존재하는데 필수값의 경우 반드시 포함되어야합니다. ServerKey는 공공데이터포털에서 받은 인증키이므로 처음 이 가이드가 작성되며 발급받았던 인증키가 들어가는 부분입니다.

[OpenAPI 실행 준비]를 클릭하고 ServerKey에 발급받은 인증키를 추가 후 [OpenAPI 호출]을 클릭해봅시다. 다른 Parameters에도 값을 넣어보며 테스트할 수 있습니다. HACCP인증업체별로 부여된 고유번호나 업체명은 당장 어떻게 등록되어있는지 알 수 없으니 페이지 번호와 한 페이지 결과 수를 임의로 입력해보고 [OpenAPI 호출]을 클릭해보겠습니다.

정상적으로 실행되었다면 위와 같이 Response body가 나올 것입니다.

만약 SERVICE_KEY_IS_NOT_REGISTERED_ERROR 등 같이 인증키 에러가 발생한다면 API 환경 또는 API 호출 조건에 따라 인증키가 적용되는 방식이 다르므로 Encoding 인증키가 아닌 Decoding 인증키로 추가하여 테스트해보시기 바랍니다.


스킬 트레이너는 특화된 지식을 모델에 학습시키는 기능으로 스킬을 통해 특화 지식 학습 가능합니다. 특정 서비스에 필요한 여러 스킬을 구성하여 이를 모델에 학습시켜 모델의 성능을 높일 수 있고, 스킬 트레이너를 활용하면 사용자에게 최신 정보나 신뢰할 수 있는 정보 제공이 가능하며 많은 양의 데이터를 매번 학습하기 어려운 한계를 보완하여 효율적으로 모델의 지식을 업데이트할 수 있습니다.

📌 해당 내용은 개인적인 의견이므로 참고만 부탁드립니다.

스킬 트레이너를 어떻게 활용하면 좋을지 고민을 해보았는데 스킬 트레이너를 사용한다고 해도 데이터가 많으면 응답 시간이 길어질 수 있고, 100% 할루시네이션이 없을 것이라 생각되진 않았습니다.
데이터의 양과 질도 중요하지만 개인적으로 사용하기 적합한 데이터와 필요한 데이터의 분리가 중요할 것이라 봅니다.

예를 들어 스킬 트레이너를 이용하여 ‘고기 종류별 조리법’을 만든다고 가정해보았습니다.

1) 돼지고기, 닭고기, 소고기 등 모든 요리의 레시피가 담긴 API를 이용하여 스킬을 생성하고 ‘고기 종류별 조리법’ 만들기

2) 돼지고기 요리 레시피가 담긴 API, 닭고기 요리 레시피가 담긴 API 등 분리된 API를 이용하여 각각의 스킬을 생성하고 [돼지고기 요리], [닭고기 요리] 등 탭으로 나누어 ‘고기 종류별 조리법’ 만들기

위 두 가지 방법 중 어느 방법이 더 가볍고 할루시네이션을 최소화할 수 있는 방법이라 생각되십니까?

저는 2)번의 방법이 조금 더 빠르고 신뢰도가 높은 답변을 받을 수 있을 것같습니다.

개인 의견

스킬셋은 특정 분야에 필요한 여러 스킬의 묶음입니다. 즉 하나의 스킬셋에 여러개의 스킬을 생성할 수 있습니다.

스킬셋에서 답변 형식과 답변 포맷도 설정할 수 있으나 이 가이드에서는 스킬을 생성하고 테스트하는 방법에 조금 더 초점을 맞추기 위해 생략하도록 하겠습니다.


많은 분들이 어려워하는 스킬 생성 부분입니다. 대부분의 유저들은 API Spec 작성에 실패하거나 API Spec 및 Manifest 작성을 잘못하여 이어 진행되는 [데이터 수집] 단계도 실패하게 됩니다.

API Spec과 Manifest의 경우 위 ‘OpenAPI 이해하기’ 부분에서 API를 잘 이해했다면 API Spec 작성에 큰 어려움이 없을 것입니다. 먼저 제가 작성한 API Spec과 Manifest를 공유드릴 것입니다.

API Spec에서 {이곳에 인증키를 추가합니다.} 부분과 Manifest – Description for model의 {인증키} 부분을 위 공공데이터 포털에서 얻은 인증키로 작성해줍니다.
API 환경 또는 API 호출 조건에 따라 인증키가 적용되는 방식이 다르므로 Encoding 인증키가 아닌 Decoding 인증키로 추가하여 테스트 되어야한다는 점을 잊지 마십시오.

API Spec 영역에 API 스펙을 JSON 타입의 OAS 3.0 버전으로 작성해야하며, 위 가이드를 참고할 수도 있겠지만 조금의 이해와 생성형 AI만 활용한다면 크게 어렵지 않습니다. 아래 작성된 API Spec에서 “paths” 부분이 위 ‘OpenAPI 이해하기’부분에서 확인했던 /getCertCompanyListService2 가 추가되어있다는 점 그리고 “parameters” 항목이 있고 그 아래 “name”으로 우리가 위에서 봤던 ServerKey(공공데이터포털에서 받은 인증키), appointno(HACCP인증업체별로 부여된 고유번호) 등이 나열되고 있습니다.

전부 ‘OpenAPI 이해하기’ 과정에서 OpenAPI를 호출해보며 확인했던 Response body의 항목들이 포함되어있고 각 해당하는 영역마다 어떤 부분인지 설명이 되어있는 것이 끝입니다. 이해가 되었다면 코드 아래로 내려갑시다.

{
  "info": {
    "title": "한국식품안전관리인증원_HACCP 인증업체정보 API",
    "version": "1.0.0",
    "description": "한국식품안전관리인증원의 HACCP 인증을 받은 업체들의 정보를 제공합니다."
  },
  "tags": [
    {
      "name": "HACCP-cert-company-info",
      "description": "HACCP 인증 업체 데이터 접근."
    }
  ],
  "paths": {
    "/getCertCompanyListService2": {
      "get": {
        "tags": [
          "HACCP-cert-company-info"
        ],
        "summary": "HACCP 인증 업체 목록 검색",
        "responses": {
          "200": {
            "content": {
              "application/xml": {
                "schema": {
                  "$ref": "#/components/schemas/CertCompanyResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CertCompanyResponse"
                }
              }
            },
            "description": "성공적인 응답입니다."
          }
        },
        "parameters": [
          {
            "in": "query",
            "name": "ServiceKey",
            "schema": {
              "type": "string"
            },
            "required": true,
            "description": "{이곳에 인증키를 추가합니다.}"
          },
          {
            "in": "query",
            "name": "appointno",
            "schema": {
              "type": "string"
            },
            "description": "각 인증 업체에 부여된 고유 HACCP 인증 번호입니다."
          },
          {
            "in": "query",
            "name": "company",
            "schema": {
              "type": "string"
            },
            "description": "업체명입니다."
          },
          {
            "in": "query",
            "name": "returnType",
            "schema": {
              "type": "string",
              "default": "xml"
            },
            "description": "응답 형식, 'xml' 또는 'json' 옵션이 있습니다."
          },
          {
            "in": "query",
            "name": "pageNo",
            "schema": {
              "type": "string",
              "default": "1"
            },
            "description": "결과 페이지 번호입니다."
          },
          {
            "in": "query",
            "name": "numOfRows",
            "schema": {
              "type": "string",
              "default": "10"
            },
            "description": "페이지당 결과 수입니다."
          }
        ],
        "description": "HACCP 인증을 받은 업체의 상세 정보 및 인증 상태를 포함한 정보를 반환합니다.",
        "operationId": "getCertifiedCompanies"
      }
    }
  },
  "openapi": "3.0.0",
  "servers": [
    {
      "url": "http://apis.data.go.kr/B553748/CertCompanyListService2"
    }
  ],
  "components": {
    "schemas": {
      "CompanyItem": {
        "type": "object",
        "properties": {
          "rnum": {
            "type": "string",
            "description": "기록 번호입니다."
          },
          "area1": {
            "type": "string",
            "description": "도 또는 특별시입니다."
          },
          "area2": {
            "type": "string",
            "description": "시 또는 군입니다."
          },
          "ceoname": {
            "type": "string",
            "description": "대표자 이름입니다."
          },
          "company": {
            "type": "string",
            "description": "업체명입니다."
          },
          "appointno": {
            "type": "string",
            "description": "고유 HACCP 인증 번호입니다."
          },
          "issuedate": {
            "type": "string",
            "description": "인증 발급일입니다."
          },
          "productGb": {
            "type": "string",
            "description": "제품 유형입니다."
          },
          "worksaddr": {
            "type": "string",
            "description": "업체 주소입니다."
          },
          "companykind": {
            "type": "string",
            "description": "업체 분류 코드입니다."
          },
          "businessitem": {
            "type": "string",
            "description": "사업 항목 코드입니다."
          },
          "businesstype": {
            "type": "string",
            "description": "사업 유형 코드입니다."
          },
          "issueenddate": {
            "type": "string",
            "description": "인증 만료일입니다."
          },
          "companykindNm": {
            "type": "string",
            "description": "업체 분류 명칭입니다."
          },
          "businessitemNm": {
            "type": "string",
            "description": "사업 항목 명칭입니다."
          },
          "businesstypeNm": {
            "type": "string",
            "description": "사업 유형 명칭입니다."
          }
        }
      },
      "CertCompanyResponse": {
        "type": "object",
        "properties": {
          "body": {
            "type": "object",
            "properties": {
              "items": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/CompanyItem"
                }
              },
              "pageNo": {
                "type": "string",
                "description": "현재 페이지 번호입니다."
              },
              "numOfRows": {
                "type": "string",
                "description": "페이지당 행 수입니다."
              },
              "totalCount": {
                "type": "string",
                "description": "전체 레코드 수입니다."
              }
            }
          },
          "header": {
            "type": "object",
            "properties": {
              "resultCode": {
                "type": "string",
                "description": "API 호출 결과 코드입니다."
              },
              "resultMessage": {
                "type": "string",
                "description": "결과 설명입니다."
              }
            }
          }
        }
      }
    }
  }
}

저는 사실 이 API Spec을 모두 작성하라고 말씀드리고 싶지 않습니다. 간단하게 작성할 수 있는 팁을 드리자면 HyperCLOVA X, ChatGPT, Claude 등 생성형 AI를 이용하십시오.

https://guide.ncloud-docs.com/docs/clovastudio-skill#api-spec-작성-예시

위 API Spec 작성 예시 가이드를 이용하여 ChatGPT에 질문을 하고 위와 같은 API Spec을 만드는 방법을 공유드리겠습니다. 실제로 저는 위에 작성된 API Spec을 직접 작성하지 않았고 몇번의 질문만으로 제가 원하는 API Spec을 얻었습니다.

먼저 위 API Spec 작성 예시 가이드 URL에 접속해서 예시 Json을 먼저 학습시켰습니다.

  • 질문 #1
{
    "openapi": "3.0.0",
    "info": {
        "version": "v0",
        "title": "국내 항공기 운행 스케줄 검색"
    },
    "servers": [
        {
            "url": "http://test.airport.co.kr/service/rest/TestFlightScheduleList"
        }
    ],
    "tags": [
        {
            "name": "open-ai-product-endpoint",
            "description": "Open AI Product Endpoint. Query for products."
        }
    ],
    "paths": {
        "/getDflightScheduleList": {
            "get": {
                "tags": [
                    "open-ai-product-endpoint"
                ],
                "summary": "국내 항공기 운행 스케줄을 검색합니다.",
                "operationId": "productsUsingGET",
        "parameters" : [  {
          "name" : "serviceKey",
          "in" : "query",
          "description" : "serviceKey는 반드시 2FMD를 쓰세요",
          "required" : true,
          "schema" : {
            "type" : "string",
            "default" : "1"
          }},
          {
          "name" : "schDate",
          "in" : "query",
          "description" : "검색 일자. 반드시 8자리의 숫자로 입력하세요. 예를 들어 2022년 4월 1일이면 20220401",
          "required" : false,
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "schDeptCityCode",
          "in" : "query",
          "description" : "도착 도시 코드. 예를 들어 서울을 나타내는 GMP를, 도착도시코드는 제주도를 나타내는 CJU, 부산은 PSU",
          "required" : false,
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "schArrvCityCode",
          "in" : "query",
          "description" : "출발 도시 코드. 예를 들어 서울을 나타내는 GMP를, 도착도시코드는 제주도를 나타내는 CJU, 부산은 PSU",
          "required" : false,
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }
                ],
                "responses": {
                    "200": {
                        "description": "Products found",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Rss"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "one or more services are unavailable"
                    }
                },
                "deprecated": false
            }
        }
    },
    "components": {
        "schemas": {
            "Rss": {
                "type": "object",
                "properties": {
                    "airlineKorean": {
                        "type": "string",
                        "description": "항공사(국문)"
                    },
                    "arrivalcity": {
                      "type": "string",
                      "description": "도착 공항"
                    },
                    "domesticArrivalTime": {
                      "type": "integer",
                      "description": "도착 시간"
                    },
                    "domesticEddate": {
                      "type": "string",
                      "format": "date-time",
                      "description": ""
                    },
                    "domesticFri": {
                      "type": "string",
                      "description": "금요일"
                    },
                    "domesticMon": {
                      "type": "string",
                      "description": "월요일"
                    },
                    "domesticNum": {
                      "type": "string",
                      "description": "항공편명"
                    },
                    "domesticSat": {
                      "type": "string",
                      "description": "토요일"
                    },
                    "domesticStartTime": {
                      "type": "integer",
                      "description": "출발 시간"
                    },
                    "domesticStdate": {
                      "type": "string",
                      "format": "date-time",
                      "description": ""
                    },
                    "domesticSun": {
                      "type": "string",
                      "description": "일요일"
                    },
                    "domesticThu": {
                      "type": "string",
                      "description": "목요일"
                    },
                    "domesticTue": {
                      "type": "string",
                      "description": "화요일"
                    },
                    "domesticWed": {
                      "type": "string",
                      "description": "수요일"
                    },
                    "startcity": {
                      "type": "string",
                      "description": "출발 공항"
                    },
                    "numOfRows": {
                      "type": "integer",
                      "description": "열 숫자"
                    },
                    "pageNo": {
                      "type": "integer",
                      "description": "페이지 번호"
                    },
                    "totalCount": {
                      "type": "integer",
                      "description": "데이터 총계"
                    }
                }
            }
        }
    }
}

위 Json은 국내 항공기 운행 스케줄 검색 API Spec입니다. 위 json 틀을 응용하여 새로운 API Spec을 생성해야합니다. 새로운 API Spec 생성 요청을 드려도 될까요?

위와 같이 질문하면 API Spec을 만들기 위해 세부적인 내용을 달라고 할겁니다. 그냥 공공데이터 포털에 작성된 OpenAPI의 정보만 알려줍니다. 실행 결과로 나오는 Response body를 예시로 제공하면 API Spec을 생성하는데 도움이 됩니다.

  • 질문 #2
새로 생성할 API Spec은 한국식품안전관리인증원_한국식품안전관리인증원_HACCP 인증업체정보에 대한 API Spec입니다. 참고 정보는 아래와 같습니다.

* Base URL: apis.data.go.kr/B553748/CertCompanyListService2
* Parameters 정보
ServiceKey(string) : 국내 항공권 조회 API Spec의 ServiceKey와 동일
appointno(string) : HACCP인증업체별로 부여된 고유번호
company(string) : 업체명
returnType(string) : 결과 응답 형식
pageNo(string) : 페이지 번호
numOfRows(string) : 한 페이지 결과 수

* Response body 예시
<response>
  <header>
    <resultCode>OK</resultCode>
    <resultMessage>success</resultMessage>
  </header>
  <body>
    <numOfRows>2</numOfRows>
    <pageNo>2</pageNo>
    <totalCount>38137</totalCount>
    <items>
      <item>
        <rnum>3</rnum>
        <appointno>2024-애완-70</appointno>
        <productGb>축산물</productGb>
        <company>주식회사 봄봄</company>
        <ceoname>조*희</ceoname>
        <worksaddr>경기도 파주시 소라지로 264 (송촌동)</worksaddr>
        <area1>경기도</area1>
        <area2>파주시</area2>
        <companykind>BIZ049</companykind>
        <companykindNm>사료</companykindNm>
        <businesstype>66</businesstype>
        <businesstypeNm>배합사료</businesstypeNm>
        <businessitem>762</businessitem>
        <businessitemNm>그 밖의 동물·어류용 배합사료(애완용동물)</businessitemNm>
        <issuedate>2024-03-12</issuedate>
        <issueenddate>2500-12-31</issueenddate>
      </item>
      <item>
        <rnum>4</rnum>
        <appointno>2024-배합-113</appointno>
        <productGb>축산물</productGb>
        <company>농업회사법인 (주)디에스피드 이천공장</company>
        <ceoname>배*형</ceoname>
        <worksaddr>경기도 이천시 설성면 진상미로 728</worksaddr>
        <area1>경기도</area1>
        <area2>이천시</area2>
        <companykind>BIZ049</companykind>
        <companykindNm>사료</companykindNm>
        <businesstype>66</businesstype>
        <businesstypeNm>배합사료</businesstypeNm>
        <businessitem>734</businessitem>
        <businessitemNm>양축용배합사료(돼지)</businessitemNm>
        <issuedate>2024-01-26</issuedate>
        <issueenddate>2500-12-31</issueenddate>
      </item>
    </items>
  </body>
</response>

* Example Value
{
  "header": {
    "resultCode": "string",
    "resultMessage": "string"
  },
  "body": {
    "numOfRows": "string",
    "pageNo": "string",
    "totalCount": "string",
    "items": {
      "item": {
        "rnum": "string",
        "appointno": "string",
        "productGb": "string",
        "company": "string",
        "companyNo": "string",
        "ceoname": "string",
        "worksaddr": "string",
        "area1": "string",
        "area2": "string",
        "companykind": "string",
        "companykindNm": "string",
        "businesstype": "string",
        "businesstypeNm": "string",
        "businessitem": "string",
        "businessitemNm": "string",
        "issuedate": "string",
        "issueenddate": "string"
      }
    }
  }
}

위와 같이 질문하면 API Spec을 만들어서 제공받을 수 있을 것입니다. 만약 Json 형태가 아니라면 Json 형태로 만들어달라고 추가 질문을 하십시오.

API Spec을 모두 직접 작성할 필요는 없지만 우리는 위 과정에서 API Spec을 이해하기 위해 API Spec의 전체적인 틀을 확인했습니다. 따라서 이제 작성된 API Spec에서 paths가 정확한지(/getCertCompanyListService2), 각 Parameters 값이 모두 잘 들어갔는지 필수 파라미터의 경우 “required”: true가 포함되었는지, “url”은 정확한지(http://apis.data.go.kr/B553748/CertCompanyListService2) 검토만 해주면 됩니다.
(저 같은 경우에는 url이 CertCompanyListService2가 아니라 CertCompanyListService로 되어있어 수정해줬습니다.)

추가로 Json 코드에서 “operationId” 값이 없다면 operationId가 빠져있으니 추가해달라고 하거나 description 부분을 한국어로 모두 번역해달라거나 추가적인 질문을 해서 Json 코드를 조금 더 변경시킬 수도 있겠습니다.

참고로 “operationId”가 없을 경우 [데이터 수집] 단계를 진행할 수 없습니다.

이제 Manifest를 작성해야합니다.
Manifest는 자세히 작성될수록 좋습니다.
특히 Description for model의 경우 제가 작성해놓은 틀과 같이 작성한다면 실패하는 일은 없을 겁니다.

Description for model에 작성된 {인증키} 부분은 실제 인증키 값으로 작성해주세요.

  • Manifest

1. Name for model :

    HACCPCertCompany

    2. Description for human :

    이 API는 한국식품안전관리인증원에서 HACCP 인증을 받은 업체의 상세 정보를 조회하는 기능을 제공합니다. 사용자는 인증 번호, 업체명 등의 조건을 이용해 특정 인증업체에 대한 정보를 검색할 수 있으며, 응답으로는 업체명, 대표자 이름, 주소, 사업 유형 등이 포함된 상세 데이터를 받습니다.

    3. Description for model :

    Base URL: http://apis.data.go.kr/B553748/CertCompanyListService2
    Path /getCertCompanyListService2:
    역할: HACCP 인증을 받은 업체들의 목록을 조회합니다.
    사용법: API 경로에 ServiceKey, appointno(인증 번호), company(업체명), returnType(응답 형식), pageNo(페이지 번호), numOfRows(페이지당 결과 수)와 같은 쿼리 파라미터를 추가하여 요청합니다.
    응답: 성공적인 요청의 경우, 업체의 상세 정보가 포함된 목록을 XML 또는 JSON 형식으로 받습니다. 각 업체 정보에는 인증 번호, 제품 유형, 업체명, 대표자 이름, 업체 주소 등이 포함됩니다.
    /serviceKey는 반드시 (발급받은 open api 키)를 사용합니다.
    예시:  https://apis.data.go.kr/B553748/CertCompanyListService2/getCertCompanyListService2?ServiceKey={인증키}&pageNo=2&numOfRows=2

    데이터 수집은 사용자의 질문에 적절한 답을 주기 위해 모델이 생각하고 판단하는 과정으로 데이터 수집 및 데이터 검토를 통해 모델의 사고 과정을 수정할 수 있습니다.

    데이터 수집은 쿼리 분석, 스킬 호출, 최종 답변의 순서로 실행됩니다. 각 데이터 수집 단계에서 수행하는 작업을 알 수 있어 이 과정을 통해 인증키가 잘못되지 않았는지, 정상적으로 작업이 동작하는지, 원하는 결과를 얻을 수 있는지 확인도 가능합니다.

    User Query에 원하는 질문을 추가 후 [실행] 버튼을 클릭해보세요. 호출 옵션과, 답변 형식을 ‘Setting’에서 설정할 수도 있습니다.

    실행 시 쿼리 분석이 진행되고 아래 사진과 같이 최종 답변을 만들어냅니다. 최종 답변까지 나와야 [작업 완료]가 가능하며, 만약 최종 답변 단계가 나오지 않는다면 인증키가 맞는지, 프로토콜은 잘 입력되었는지, API Spec이 적절히 작성되었는지 확인하세요.

    저 역시 한번 최종 답변을 받지 못한 케이스가 있는데 API Spec에 작성된 URL의 프로토콜이 https로 있어 최종 답변을 얻지 못했었습니다.

    웹에서 https로 접속이 가능했으나 http로 변경해줘야 최종 답변을 얻을 수 있었습니다. 따라서 이 부분도 http, https 둘 다 변경해보며 트러블슈팅에 참고하시기 바랍니다.

    최종 답변을 얻은 후 [작업 완료]를 클릭하면 이후 [불러오기]에서 전체 작업들 중 작업이 완료된 작업으로 확인할 수 있습니다.


    스킬의 내용을 업데이트하거나 데이터 학습을 할 때마다 버전이 변경됩니다. [자세히] 버튼을 눌러 버전별로 내용의 차이를 확인할 수 있고 [테스트 앱]을 이용하여 버전별 테스트가 가능합니다.


    아래 코드는 생성한 테스트 앱으로 질문 및 답변을 해볼 수 있는 예시 코드입니다.

    {API_KEY}, {API_KEY_PRIMARY_VAL}, {REQUEST_ID}는 개인 환경에 맞게 변경해주세요.
    (위 값은 테스트 앱에서 [보기]를 클릭하면 해당 값을 쉽게 얻을 수 있습니다.)

    import requests
    import json
    
    class SkillSetFinalAnswerExecutor:
        def __init__(self, host, api_key, api_key_primary_val, request_id):
            self._host = host
            self._api_key = api_key
            self._api_key_primary_val = api_key_primary_val
            self._request_id = request_id
    
        def execute(self, skill_set_cot_request):
            headers = {
                'X-NCP-CLOVASTUDIO-API-KEY': self._api_key,
                'X-NCP-APIGW-API-KEY': self._api_key_primary_val,
                'X-NCP-CLOVASTUDIO-REQUEST-ID': self._request_id,
                'Content-Type': 'application/json; charset=utf-8',
                'Accept': 'text/event-stream',
            }
    
            with requests.post(self._host + '/testapp/v1/skillsets/00vd24gw/versions/4/final-answer',
                               headers=headers, json=skill_set_cot_request, stream=True) as r:
                lines = r.iter_lines()
                for line in lines:
                    if line:
                        decoded_line = line.decode("utf-8")
                        if 'event:final_answer' in decoded_line:
                            
                            next_line = next(lines).decode("utf-8")
                            if 'data:' in next_line:
                                data = json.loads(next_line.split("data:", 1)[1])
                                print(data['finalAnswer'])
    
    if __name__ == '__main__':
        final_answer_executor = SkillSetFinalAnswerExecutor(
            host='https://clovastudio.stream.ntruss.com',
            api_key='{API_KEY}',
            api_key_primary_val='{API_KEY_PRIMARY_VAL}',
            request_id='{REQUEST_ID}'
        )
    
        request_data = json.loads("""{
          "query": "(주)낭만푸드 업체가 HACCP 인증이 되었는지 알려줘.",
          "tokenStream": "False"
        }""")
    
        final_answer_executor.execute(request_data)

    사용자 질문은 “(주)낭만푸드 업체가 HACCP 인증이 되었는지 알려줘.”이며, 실행 시 아래와 같이 답변을 얻을 수 있습니다.
    (질문을 원하는 경우 “query” 부분의 값만 변경해주면 됩니다.)

    그렇다면 스킬을 사용하지 않고 기본 HCX-003을 사용할 경우 어떤 답변을 얻을 수 있는지 비교해봅시다. 동일한 질문을 했을 때 해당 업체의 HACCP 인증 여부를 확인할 수 없음을 알 수 있습니다.

    따라서 스킬을 잘 이용한다면 답변의 신뢰도를 높일 수 있다는 것을 확실히 알 수 있습니다.


    데이터 학습은 서비스에 특화된 지식을 모델에 학습시키는 것을 의미합니다. 모델이 더 정확하고 정교한 답변을 생성할 수 있도록 스킬셋을 학습시키고 학습한 내역을 관리할 수 있습니다.

    데이터 학습을 진행하려면 위 [데이터 수집]에서 [작업 완료]가 된 데이터가 1개 이상 존재해야합니다. 데이터 학습을 통해 모델이 더 정확한 답변을 생성할 수 있도록 수집한 데이터를 모델에 학습시킵니다.

    데이터 학습이 진행되면 아래 사진과 같이 [학습 대기 중]으로 변경되며, 대기가 끝나면 [학습 중], 학습이 끝나면 [학습 완료], 실패하면 [학습 실패]의 결과를 얻을 수 있습니다. 별도로 본인이 학습을 중단할 경우 [학습 중단] 상태가 됩니다.


    이 포스팅이 CLOVA Studio에서 스킬 트레이너를 사용하는 사용자들에 많은 도움이 되길 바랍니다.

    긴 글 읽어주셔서 감사합니다.