Jump to content

CLOVA Studio 운영자

Administrators
  • 게시글

    272
  • 첫 방문

  • 최근 방문

  • Days Won

    51

Everything posted by CLOVA Studio 운영자

  1. 안녕하세요, @VTS 님, 1. HCX 모델을 튜닝할 때 과적합이 발생하면 원래 모델의 일반적인 성능이 저하될 수 있습니다. 따라서 적절한 epoch과 learningRate 설정을 통해, 학습이 필요할 수 있습니다. 2. 여러 task를 묶어서 진행하는 것보다 개별 task로 진행하며 검증하는 것이 효율적일 것 같습니다. 3. 테스트앱은 모델과 무관하게 하나의 API 키로 이용할 수 있습니다. 과금의 경우 앱과 무관하게 모델별로 실제 처리된 입출력 토큰수에 따라 발생합니다. 서비스 앱의 경우 앱별로 API 키가 발급됩니다. 감사합니다.
  2. AI의 애플리케이션 활용 최근 ChatGPT에 추가된 'Canvas' 기능이 주목받고 있습니다. Canvas는 AI가 글의 일부를 편집하고, 문단 길이를 조절하며, 최종 윤문을 수행할 수 있습니다. 그중에서도 가장 인상적인 기능은 독해 수준을 유치원생부터 대학원생까지 선택하여 텍스트를 변형할 수 있다는 점입니다. 이 외에도 랭체인이 최근 'Open Canvas'라는 오픈 소스를 공개하며 다양한 방식의 다시쓰기(Rewrite) 기능을 제공하고 있습니다. 여러 서비스에서 AI와 인간이 협력해 글을 더욱 정교하게 다듬어가는 과정이 지원되고 있으며, 앞으로 글쓰기 방식과 AI 협업 방식에 큰 변화가 생길 것으로 기대됩니다. 가장 기본적인 생성형 AI 플랫폼의 구조는 사용자가 쿼리를 입력하면, 모델이 응답을 생성해 다시 사용자에게 제공하는 형태입니다. 그러나 더 정교한 AI 에이전트를 구축하려면, 다양한 추가 구성 요소를 통해 복잡성을 더하게 될 것입니다. Huyen Chip, Building A Generative AI Platform, https://huyenchip.com/2024/07/25/genai-platform.html 대규모 언어 모델(LLM)의 활용은 이제 단순히 모델 자체의 성능에 의존하는 것이 아니라, 이를 어떻게 활용하고 전개하느냐에 따라 그 가치가 결정됩니다. 그 중심에는 에이전트의 역할이 있습니다. 에이전트는 LLM을 더 정교하게, 그리고 사용자의 목적에 맞춰 구체화하는 중요한 개념입니다. 단순한 모델 사용을 넘어, 에이전트를 통해 사용자 경험을 어떻게 확장하고 발전시킬 수 있을까요? 이번 글에서는 하이퍼클로바X를 활용해 텍스트의 난이도를 조정하는 작업을 진행해보겠습니다. ① 대학생 수준으로 난이도 높이기 ② 중학생 수준으로 난이도 낮추기 ③ 초등학생 수준으로 매우 쉽게 조정하기 이번 작업을 위해 사용할 사용자 인풋입니다. 평이한 난이도로 작성되어 있습니다. ① 프롬프트 작성 - 대학생 수준으로 난이도 높이기 먼저 대학생 수준의 난이도 조절을 위한 프롬프트 작성 과정을 설명하겠습니다. "논문 수준으로 난이도 높이기", "고급 어휘와 복잡한 문장 구조 사용" 등의 지시를 포함했습니다. 이번 프롬프트에서 중요한 요소는 고급 어휘와 복잡한 문장 구조를 사용하도록 지시하는 것이었으며, 이를 통해 독자가 높은 수준의 이해력을 요구받도록 의도했습니다. 또한 '시작하다'를 '착수하다'로, '도움이 된다'는 '기여하다'로 변환하는 예시를 넣었습니다. ▼ 프롬프트를 통해 하이퍼클로바X에게 글의 난이도를 높이도록 지시한 결과, 원문의 내용은 유지하면서도 상당히 수준 높은 글로 변환되었습니다. '빛'이 '광학'으로, '예전에는'이 '고전 물리학에서는'로 바뀌는 등 학술적 용어의 비중이 높아졌습니다. 이는 단순한 단어 교체를 넘어 주제의 깊이와 과학적 맥락을 강화하는 효과를 가져왔습니다. 예를 들어 빛의 속도는 '30만 km/s' 대신 '299,792,458 m/s'로 더욱 정확하게 명시 되었습니다. ② 프롬프트 작성 - 중학생 수준으로 난이도 낮추기 이번에는 중학생도 쉽게 이해할 수 있도록 글의 난이도를 낮추는 프롬프트를 작성했습니다. 첫 번째로, "글의 난이도를 중학생 수준으로 쉽게 변환하세요"라는 지시를 작성했습니다. 어휘 난이도를 조정하기 위해, 어려운 단어들을 쉽게 바꾸는 예시를 포함했습니다. 예를 들어, '착수하다'를 '시작하다'로, '기여하다'를 '도움이 된다'로 변환했습니다. 이러한 어휘 변환은 복잡한 표현을 쉽게 풀어서 설명하려는 의도로, 단어의 의미를 단순화하면서도 본래의 뜻을 유지하도록 했습니다. 마지막으로, '인간의 존엄성과 자유를 보장하기 위해, 국가는 국민의 기본권을 보호하고, 사회적 약자를 배려하는 정책을 수립해야 한다.'는 문장을 '사람들이 존중받고 자유롭게 살 수 있도록, 나라에서는 사람들의 기본적인 권리를 지키고, 어려운 사람들을 도와주는 계획을 세워야 합니다.'로 비교적 쉬운 어휘를 활용한 예시를 명확히 보여주었습니다. ▼ 중학생들도 쉽게 이해할 수 있는 형태로 출력되었습니다. 예를 들어, '파동과 알갱이'라는 빛의 성질을 설명할 때는 복잡한 물리학 용어 대신, "빛은 흔들리면서 움직이기도 하고, 작은 알갱이처럼 보일 때도 있어"라는 표현을 사용했습니다.이를 통해 학생들이 빛의 복잡한 이론을 직관적으로 이해할 수 있도록 돕습니다. 또한, 반사와 굴절을 설명하는 부분에서는 복잡한 과학적 원리를 피하고 '빛이 거울에 닿거나 물웅덩이를 지나면 방향이 바뀐다'와 같은 일상적인 예시를 사용하여, 독자가 더 쉽게 개념을 잡을 수 있도록 했습니다. ③ 프롬프트 작성 - 초등학생 수준으로 매우 쉽게 조정하기 이 프롬프트는 텍스트를 초등학생도 쉽게 이해할 수 있도록 변환하는 데 중점을 두고 작성되었습니다. 먼저, 글의 난이도를 초등학생 수준으로 낮추라는 명확한 지시를 포함했습니다. 문장 구조에 대해서는 짧고 간단한 문장을 사용하고, 기본적인 주어-동사-목적어 구조를 활용하도록 안내했습니다. 또한 복잡한 문장을 초등학생이 이해할 수 있는 수준으로 변환하는 구체적인 예제를 제시하여, AI가 실제로 어떻게 텍스트를 변환해야 하는지 명확히 보여주었습니다. ▼ 복잡한 과학 용어나 어려운 개념을 배제하고, 학생들이 일상에서 접할 수 있는 친숙한 표현과 비유를 사용해 내용을 쉽게 설명했습니다. 먼저, 빛의 속도를 설명할 때, 과학적 수치나 복잡한 이론 대신 "빛은 빠르게 움직여서 1초에 지구를 7바퀴 반이나 돌 수 있어요"와 같은 구체적이고 직관적인 예시를 사용했습니다. 또한 빛의 성질을 설명할 때 "빛이 물결처럼 움직이는 파동이라고 생각했어요"와 같은 간단한 표현을 사용하여, 학생들이 물리학적 개념을 쉽게 이해할 수 있도록 돕고 있습니다. 마무리하며 지금까지 다양한 난이도 조정 프롬프트를 통해 AI가 텍스트를 어떻게 변환하는지 살펴보았습니다. 대학생 수준부터 초등학생 수준까지, 하이퍼클로바X는 각 독자의 이해 수준에 맞춘 글을 생성해낼 수 있음을 확인했습니다. 이를 통해 AI가 단순한 생성 도구를 넘어, 학습과 교육을 포함한 다양한 분야에서 효과적으로 활용될 수 있다는 가능성을 보여주었습니다. 언어 모델의 가치는 이제 단순한 성능을 넘어, 여러 비즈니스 파트너가 이를 어떻게 애플리케이션 수준으로 발전시켜 활용하는지에 달려있습니다.
  3. 안녕하세요, 클로바 스튜디오 담당자입니다. 먼저, 소중한 피드백과 제안을 보내주셔서 감사드립니다. 네이버 클라우드 플랫폼은 다양한 비즈니스 솔루션을 제공하고 있어, 콘솔을 통한 접근이 필요한 부분이 있습니다. 하지만, 현재 구글에서 clova studio playground 를 검색하시면 해당 메뉴로 바로 진입하실 수 있습니다. 또한, 플레이그라운드(https://clovastudio.ncloud.com/playground) 페이지를 즐겨찾기에 추가하시면 더욱 편리하게 이용하실 수 있습니다. 앞으로도 더 나은 경험을 제공하기 위해 지속적으로 개선해 나가겠습니다. 감사합니다.
  4. 안녕하세요, @다프레님, client의 인증서 확인 중 오류가 발생한 것으로 보입니다. 인증서 관련된 설정을 먼저 살펴보시는 것이 필요해보입니다. 이용하시다가 궁금하신 부분이 있다면, 문의하기를 통해 문의주시면 자세히 안내드릴 수 있도록 하겠습니다. 감사합니다.
  5. 안녕하세요, @pennypost님, 플레이그라운드에서 작업을 저장하시면, 테스트 앱 발행이 가능합니다. 테스트 앱 코드에서 API-KEY를 확인하실 수 있으며, 클로바 스튜디오에서 테스트 앱은 모두 동일한 키를 사용합니다. 테스트앱 생성 안내 https://guide.ncloud-docs.com/docs/clovastudio-playground01 API 가이드 https://api.ncloud-docs.com/docs/ai-naver-clovastudio-summary 감사합니다.
  6. 안녕하세요, @pennypost님, 특정 정의된 형식을 고정으로 출력하려는 것이 맞을까요? 아래와 같은 방법이 있을 것 같습니다. Temperature는 0.03 정도로 낮추는 것과, repetition penalty도 2.0 정도로 조정하는 것이 도움이 될 수 있습니다. 무엇보다 시스템 프롬프트에 정확하게 작업을 명시하는 것이 효과적입니다. 예를들어, "- 특정 범위 내에서만 출력합니다. {긍정, 부정, 중립}" 원하시는 형식에 대한 예제를 프롬프트에 입력하는 것이 좋습니다. 감사합니다.
  7. 안녕하세요, @pennypost님, 이전 문의글에 답변을 추가하였습니다. 플레이그라운드에서 프롬프트를 활용하여 손쉽게 구현이 가능하십니다. 플레이그라운드를 통한 대체 기능 구현 방법 네이버 클라우드 플랫폼 콘솔에서 Services > AI Services > CLOVA Studio 메뉴를 차례대로 클릭해 주십시오. My Product 메뉴를 클릭한 후 [CLOVA Studio 바로가기] 버튼을 클릭해 주십시오. 플레이그라운드 메뉴를 클릭해 주십시오. 화면 왼쪽의 시스템 영역에 모델이 수행할 작업에 대한 구체적인 지시문 또는 예제를 입력해주십시오. [실행] 버튼을 클릭해 주십시오. 감사합니다.
  8. 안녕하세요, @pennypost님, 클로바 스튜디오 담당입니다 앞서 공지에서 다소 불명확하게 안내가 전달된 것 같습니다. 클로바 스튜디오에서는 HyperCLOVA X 언어모델을 활용하여 AI 기반의 서비스를 손쉽게 만들 수 있습니다. 플레이그라운드에서 몇 줄의 프롬프트 입력만으로도 감정 분석을 구현할 수 있습니다. 아래와 같이 프롬프트 작성을 통해 구현을 하실 수 있으며, CLOVA Sentiment 대체 기능 참고 샘플은 아래 경로를 통해 확인하실 수 있습니다. : CLOVA Studio 플레이그라운드 > 불러오기 > 샘플 "감정 분석" CLOVA Studio의 원활한 이용을 위해 사용 가이드 안내 링크를 안내드립니다. https://guide.ncloud-docs.com/docs/clovastudio-overview 이용하시다가 궁금하신 부분이 있다면, 문의하기를 통해 문의주시면 자세히 안내드릴 수 있도록 하겠습니다. 감사합니다.
  9. 안녕하세요, @jhp님, 이용에 불편을 드려 죄송합니다. 현재 확인 결과 저희쪽으로 들어온 문의 내용이 없는데요. https://www.ncloud.com/support/question/service 를 통해서 AI Services > clova studio로 유형 선택하신 후 접수해주신 것이 맞을지 확인 부탁드립니다. 또는 문의하기로 접수하신 이메일 계정을 알려주시면 빠르게 확인해보겠습니다. 감사합니다.
  10. 안녕하세요, @삼앤정님, 1. 플레이그라운드에서 Maximum tokens를 4096을 설정하셨다면, 기입력된 토큰이 있을 것이기 때문에, 아래 캡처와 같이 '최대 토큰을 초과하였습니다.' 토스트가 발생했을 것입니다. 다시 한번 확인을 부탁드리며, 괜찮으시면 플레이그라운드 상단의 '공유' 버튼을 누르신 후, [문의하기]를 통해 작업 URL과 비밀번호를 함께 전달주시면 자세히 살펴보도록 하겠습니다. 1-1. 제가 좀 헷갈리게 말씀드린 것 같습니다. 이해하신대로 4096 토큰을 입력과 출력이 나눠가지는 것이 맞습니다. 앞서 말씀드린 "프롬프트의 길이가 길더라도 출력 결과의 길이는 작업 유형에 따라 달라질 뿐, 짧아지지 않습니다." 은 아래와 같이, 하고자 하는 작업에 따라 출력 길이가 달라진다는 것을 의미합니다. 예를들어, 입력(프롬프트): 긴 문서를 넣고, 출력: 문서의 제목 출력. → 출력 결과는 짧을 것입니다. 입력(프롬프트): 긴 문서를 넣고, 출력: 문서를 번역. → 긴 문서를 번역하는 작업이기 때문에 결과는 길게 나올 것입니다. 2. 네, 맞습니다. 시스템 프롬프트에 지시문(문제 정의)을 입력하는 형태로도 가능하며, 필요에 따라 아래와 같이 시스템 프롬프트에 예시를 넣어주는 것이 필요한 경우도 있습니다. 잘 설명이 되었을지 모르겠습니다. 익스플로러 화면의 샘플 탭에 여러 작업들이 모여있으니, 샘플을 살펴보시는 것도 도움이 될 듯 합니다. 이용하시다가 궁금한 부분이 있다면 언제든 말씀해주세요. 감사합니다.
  11. 안녕하세요, @jhp님, 클로바 스튜디오에 관심을 가져주셔서 감사드립니다. [문의하기]를 통해 상세 정보와 함께 연락주시면 도움드릴 수 있도록 하겠습니다. 감사합니다.
  12. 안녕하세요, @삼앤정님, 괌심을 가지고 클로바 스튜디오를 이용해주셔서 감사드립니다. 문의주신 내용들에 대하여 답변드립니다. 1. 플레이그라운드와 Chat Completions API의 스펙은 동일합니다. HCX의 Context window(토큰 길이)는 입력과 출력을 합쳐 총 4096입니다. 만약 'Text too long' 오류가 발생했다면, 현재 maxTokens 값이 얼마로 설정되어 있는지 확인해주세요. 텍스트가 입력되어 있고, maxTokens 값이 4096으로 설정되어 있다면, maxTokens 값을 줄여야 합니다. https://guide.ncloud-docs.com/docs/clovastudio-info#maximum-tokens https://api.ncloud-docs.com/docs/clovastudio-troubleshoot-c4xx 1-1. 앞서 말씀드린 대로, 시스템 프롬프트와 사용자 입력 모두 포함하여 계산됩니다. 프롬프트의 길이가 길더라도 출력 결과의 길이는 작업 유형에 따라 달라질 뿐, 짧아지지 않습니다. 2. 일반적인 경우, 이전 턴의 대화를 포함할 필요는 없으며, 시스템 프롬프트만 구성하시면 됩니다. 시스템 프롬프트에 대화 예시를 추가하면 도움이 될 수 있습니다. 3. 맞습니다. 말씀하신 대로 튜닝을 통해 예시 답변을 제거하면 비용 절감에 도움이 될 수 있습니다. 하지만 현재 제공되는 튜닝은 지식 주입보다는 형식 구성에 초점을 맞추고 있어, 잘 구성된 시스템 프롬프트만으로도 충분한 성능을 발휘할 수 있습니다. 따라서 데이터셋 구축에 많은 시간과 비용이 소요될 수 있으므로, 튜닝 없이 진행하는 것도 방안이 될 수 있습니다. 4. 하이퍼클로바X 모델의 토큰 길이는 현재 4096 토큰으로 고정되어 있어 늘릴 수 있는 방법은 없습니다. 슬라이딩 윈도우 API를 활용하시거나, 요약 API를 통해서 앞 턴의 대화 내역을 요약시키는 방법도 있을 것 같고, 관련 cookbook 링크를 공유드립니다. 감사합니다.
  13. OpenAI의 경우 Top P를 고정으로 두고(또는 반대로), Temperature를 조정하는 등의 형태로 권장하고 있고, 저희도 샘플링 기준을 잡고 다른 하나를 조정해보는 형태로 권장하고 있습니다. Top P 0.6 또는 0.8을 고정으로 두고, Temperature, Repetition을 세부 조정하면서 최적값을 찾아가면 될 것 같습니다. 감사합니다
  14. 안녕하세요, @성연재님, 작업에 따라 설정을 바꿔가며 최적의 값을 찾아야 합니다. 아래는 그 특징과 권장값입니다. Temperature를 조절하면 토큰 확률 분포에 가중치 변화를 주어 문장의 다양성을 조정할 수 있습니다. 창의적인 문장 생성이 필요한 작업은 0.5~0.8 수준으로 올리는 것이 좋고, 요약, 분류처럼 주어진 인풋을 근거로 답을 해야 하는 경우는 0.1~0.3 수준으로 낮추는 것이 효과적입니다. Repetition Penalty는 토큰에 페널티를 부여하여 반복적인 결과가 생성되지 않도록 하는 설정입니다. 창의적인 문장 생성이 필요한 경우 기본값인 5.0으로 설정하고, 그렇지 않은 경우 1.2 수준으로 낮추는 것이 좋습니다. 반면, HyperCLOVA X 모델로 오면서 하이퍼파라미터에 따른 변화는 두드러지지 않지만, 시스템 프롬프트를 통해 출력 결과의 형태가 크게 달라질 수 있습니다. 사용 가이드: https://guide.ncloud-docs.com/docs/clovastudio-info 감사합니다.
  15. 업무 환경에서 보고서 작성은 필수적인 업무 중 하나입니다. 하지만 많은 직장인들에게 보고서 작성은 시간이 많이 소요되고 부담스러운 작업으로 여겨지기도 합니다. 이번 포스팅에서는 하이퍼클로바X를 Google Slides와 연동하여 보고서 작성 프로세스를 개선하는 방법을 소개하고자 합니다. 보고서 작성 프롬프트 클로바 스튜디오의 플레이그라운드를 이용해 보고서 작성을 도와주는 프롬프트를 만들었습니다. "페이지 제목:"과 "내용:" prefix를 사용해 각 섹션을 구분하도록 구성했습니다. 이러한 구조는 Google Slides와 연동 시 각 슬라이드를 자동으로 채울 수 있어 유용합니다. Apps Script 작성 Chat Completions API를 Google Sheets에 연동하기 위해 Apps Script를 활용합니다. Google Sheets 상단 메뉴에서 '확장 프로그램'을 클릭한 후 'Apps Script'를 선택하면 새 탭에서 Apps Script 편집기가 열립니다. 이제 Google Sheets Apps Script 편집기에서 실제 스크립트를 작성해 보겠습니다. Google Slides의 사용자 인터페이스에 새 메뉴를 추가하는 onOpen 함수는 Google Slides가 실행되면 자동으로 동작하여 '사용자 정의 메뉴'를 만들고, 그 안에 '키워드 기반 보고서 생성'이라는 항목을 추가합니다. 해당 항목을 클릭하면 createReportFromKeyword 함수가 실행되도록 설정되어 있습니다. function onOpen() { SlidesApp.getUi() .createMenu('커스텀 메뉴') .addItem('키워드로 보고서 생성', 'createReportFromKeyword') .addToUi(); } createReportFromKeyword 함수는 보고서 자동 생성의 핵심 기능을 담당합니다. 먼저 사용자로부터 보고서 주제에 해당하는 키워드를 입력받습니다. 이후 입력된 키워드를 기반으로 CLOVA Studio API를 호출하여 보고서 내용을 생성합니다. 첫 번째 슬라이드는 입력된 키워드를 제목으로 하며, API 응답에서 받은 내용을 '페이지 제목:'과 '내용:' 구분자를 기준으로 분리하여 각각의 슬라이드로 구성합니다. 각 슬라이드는 제목과 본문 형식으로 이루어져 있으며, API 응답의 내용이 자동으로 채워집니다. 모든 과정이 완료되면 사용자에게 보고서 생성이 완료되었음을 알리는 알림을 표시합니다. 이 함수를 통해 사용자는 키워드 입력만으로 구조화된 보고서를 자동으로 생성할 수 있습니다. function createReportFromKeyword() { var ui = SlidesApp.getUi(); var keyword = ui.prompt('키워드 입력', '보고서 주제 키워드를 입력하세요:', ui.ButtonSet.OK_CANCEL).getResponseText(); if (keyword === '') return; var response = callClovaStudioAPI(keyword); if (!response) return; try { var parsedResponse = JSON.parse(response); Logger.log('파싱된 응답: ' + JSON.stringify(parsedResponse)); var content = parsedResponse.result.message.content; Logger.log('콘텐츠: ' + content); var presentation = SlidesApp.getActivePresentation(); Logger.log('현재 프레젠테이션 ID: ' + presentation.getId()); // 기존 슬라이드 모두 제거 var slides = presentation.getSlides(); for (var i = slides.length - 1; i >= 0; i--) { presentation.getSlides()[i].remove(); } // 첫 번째 페이지 생성 (키워드를 제목으로) var firstSlide = presentation.appendSlide(SlidesApp.PredefinedLayout.TITLE_AND_BODY); firstSlide.getShapes().forEach(function(shape) { if (shape.getPlaceholderType() === SlidesApp.PlaceholderType.TITLE) { shape.getText().setText(keyword); } else if (shape.getPlaceholderType() === SlidesApp.PlaceholderType.BODY) { shape.getText().setText("'" + keyword + "'에 대한 내용 보고서"); } }); var pages = content.split('페이지 제목:').filter(Boolean); Logger.log('페이지 수: ' + pages.length); pages.forEach(function(page, index) { var parts = page.split('내용:'); if (parts.length === 2) { var pageTitle = parts[0].trim(); var pageContent = parts[1].trim(); Logger.log('슬라이드 ' + (index + 2) + ' - 제목: ' + pageTitle + ', 내용: ' + pageContent); var slide = presentation.appendSlide(SlidesApp.PredefinedLayout.TITLE_AND_BODY); slide.getShapes().forEach(function(shape) { if (shape.getPlaceholderType() === SlidesApp.PlaceholderType.TITLE) { shape.getText().setText(pageTitle); } else if (shape.getPlaceholderType() === SlidesApp.PlaceholderType.BODY) { shape.getText().setText(pageContent); } }); } }); ui.alert(keyword + '에 대한 보고서가 현재 프레젠테이션에 추가되었습니다.'); } catch (error) { Logger.log('오류 발생: ' + error); ui.alert('보고서 생성 실패: ' + error); } } callClovaStudioAPI 함수는 사용자가 입력한 키워드를 기반으로 Chat Completions API 요청을 구성하고 전송합니다. API KEY와 APIGW KEY는 클로바 스튜디오에서 생성한 인증 정보를 입력해 주세요. 응답 코드를 확인하여 정상 응답(200)인 경우 응답 본문을 반환하고, 그렇지 않은 경우 오류 처리합니다. function callClovaStudioAPI(keyword) { var url = 'https://clovastudio.stream.ntruss.com/testapp/v1/chat-completions/HCX-003'; var apiKey = '{API_KEY}'; // API Key를 입력합니다. var apigwKey = '{APIGW_KEY}'; // APIGW API Key를 입력합니다. var requestId = '{requestID}'; // request ID입니다. var payload = { "messages": [ { "role": "system", "content": "- 키워드를 입력하면 보고서를 작성합니다.\n- 각 페이지의 제목과 내용을 작성합니다.\n- 페이지 제목은 3개 이내로 구성합니다.\n###\n페이지 제목:\n내용:" }, { "role": "user", "content": keyword } ], "topP": 0.8, "topK": 0, "maxTokens": 500, "temperature": 0.5, "repeatPenalty": 1.2, "stopBefore": [], "includeAiFilters": true, "seed": 0 }; var options = { 'method': 'post', 'contentType': 'application/json', 'payload': JSON.stringify(payload), 'headers': { 'X-NCP-CLOVASTUDIO-API-KEY': apiKey, 'X-NCP-APIGW-API-KEY': apigwKey, 'X-NCP-CLOVASTUDIO-REQUEST-ID': requestId, 'Content-Type': 'application/json', 'Accept': 'application/json' }, 'muteHttpExceptions': true }; try { var response = UrlFetchApp.fetch(url, options); var responseCode = response.getResponseCode(); var responseBody = response.getContentText(); if (responseCode === 200) { Logger.log('API 응답: ' + responseBody); return responseBody; } else { throw new Error('API 응답 오류: ' + responseCode + ' - ' + responseBody); } } catch (error) { Logger.log('API 호출 실패: ' + error); SlidesApp.getUi().alert('API 호출 실패: ' + error); return null; } } 스크립트 작성이 끝나면 상단의 저장 버튼을 눌러 변경사항을 저장해 주세요. 저장 후에는 '실행' 버튼을 클릭하여 스크립트가 정상적으로 동작하는지 확인할 수 있습니다. 아래와 같이 출력된다면 문제없이 정상 출력되는 것을 의미합니다. 처음 실행할 때 권한 요청 팝업이 나타날 수 있는데, '허용'을 클릭하여 필요한 권한을 부여해 주세요. 보고서 자동 생성하기 Google Slides의 메뉴 우측 상단을 확인합니다. 여기에 새롭게 '커스텀 메뉴'가 추가된 것을 볼 수 있습니다. '커스텀 메뉴'를 선택한 뒤 '키워드로 보고서 생성' 버튼을 클릭합니다. 이후 보고서 주제 키워드를 입력하라는 팝업이 나타나면 원하는 키워드를 입력하면 됩니다. 키워드 입력 후 스크립트가 실행되면 하이퍼클로바X가 보고서 내용을 생성하기 시작합니다. 이 과정은 보고서의 복잡도와 길이에 따라 시간이 소요될 수 있으니 잠시 기다려야 합니다. 작업이 완료되면 알림 팝업이 뜨고, 확인을 누르면 자동으로 생성된 보고서를 확인할 수 있습니다. 확인을 누르면 이렇게 보고서가 생성됩니다. 보고서 완성하기 초기에 생성된 보고서는 기본적인 내용만 담고 있어 단조로울 수 있습니다. 하지만 Google Slides의 기능을 활용해 보고서를 전문적이고 시각적으로 매력적으로 만들 수 있습니다. 먼저 모든 슬라이드의 썸네일을 선택한 후 'Apply layout' 기능을 사용해 원하는 레이아웃을 적용합니다. 이를 통해 보고서의 구조가 정돈되고 일관성 있게 변합니다. 레이아웃 적용 후에는 'Change theme' 버튼을 눌러 적절한 테마를 선택합니다. 테마 적용은 보고서에 통일된 색상과 폰트를 제공해 전문적인 느낌을 더해줍니다. 이러한 과정을 거치면 처음 자동 생성된 기본적인 내용이 보다 세련되고 완성도 높은 프레젠테이션으로 탈바꿈합니다. 글을 마치며 하이퍼클로바X의 강점은 이러한 도구와의 연동을 통해 다양한 분야에서 활용될 수 있다는 점입니다. 클로바 스튜디오에서 적절한 프롬프트를 설정하면 다양한 서비스와 손쉽게 연동해 업무 효율을 크게 높일 수 있습니다. 이는 개인뿐만 아니라 기업의 생산성 향상에도 큰 도움이 될 것입니다. 앞으로 하이퍼클로바X가 어떻게 발전하고 더 많은 영역에서 활용될지 그 잠재력이 무궁무진해 보입니다.
  16. 최근 OpenAI가 'Structured Outputs'라는 새로운 기능을 선보였습니다. 이 기능은 개발자가 제공한 JSON 스키마에 정확히 맞는 모델 출력을 보장합니다. 이는 AI 모델의 출력을 구조화하고 특정 형식에 맞추는 것이 얼마나 중요한지를 잘 보여줍니다. 구조화된 데이터는 다양한 애플리케이션과 시스템에서 더 쉽게 처리되고 활용될 수 있기 때문이죠. 이러한 흐름에 맞춰, 이번 시간에는 Google Sheets를 활용하여 하이퍼클로바X의 구조화된 출력을 자동으로 추출하고 관리하는 방법을 알아보겠습니다. 이를 통해 원하는 데이터를 즉시 스프레드시트에 채울 수 있습니다. 구현 과정은 다음과 같습니다. ① 클로바 스튜디오에서 JSON 형식으로 출력시키는 프롬프트 작성 ② Google Sheets App Script에서 API 연동 및 데이터 처리 함수 구현 ③ Google Sheets에서 함수 연결 및 데이터 표시 JSON 응답 하이퍼클로바X를 활용하여 구조화된 데이터를 얻기 위해, JSON 형식으로 응답하도록 시스템 프롬프트를 설정합니다. 이 프롬프트는 요리 이름을 입력받아 재료 목록, 용량, 조리 방법을 정형화된 형식으로 출력합니다. Apps Script 작성 Chat Completions API를 Google Sheets에 연동하기 위해 Apps Script를 활용합니다. Google Sheets 상단 메뉴에서 '확장 프로그램'을 클릭한 후 'Apps Script'를 선택하면 새 탭에서 Apps Script 편집기가 열립니다. 이제 Google Sheets Apps Script 편집기에서 실제 스크립트를 작성해 보겠습니다. API KEY와 API GW KEY는 클로바 스튜디오에서 생성한 인증 정보를 입력해 주세요. function callCLOVAStudio(prompt) { var apiKey = '{API_KEY}'; // API Key를 입력합니다. var apigwKey = '{APIGW_KEY}'; // APIGW API Key를 입력합니다. var requestId = Utilities.getUuid(); // request ID입니다. // 프롬프트는 문자열 형식으로 작성해주세요. var userPrompt = prompt ? prompt : " "; // 프롬프트가 null이거나 비어있을 경우 공백으로 기본 설정 var data = { "messages": [ {"role": "system", "content": "- 요리를 입력하면 json 형식으로 응답합니다.\n- 요리에 들어가는 재료, 용량, 요리 방법을 알려줍니다.\n- json 응답 구조는 아래와 같습니다.\n{\n \"recipe\": {\n \"name\": \"김치찌개\",\n \"ingredients\": [\n {\"item\": \"김치\", \"amount\": \"300g\"},\n {\"item\": \"돼지고기\", \"amount\": \"200g\"},\n {\"item\": \"두부\", \"amount\": \"1모\"}\n ],\n \"instructions\": [\n \"김치를 적당한 크기로 자른다.\",\n \"돼지고기를 볶는다.\",\n \"물을 붓고 김치를 넣어 끓인다.\",\n \"두부를 넣고 마저 끓인다.\"\n ]\n }\n}\n\n"}, {"role": "user", "content": userPrompt} ], "topP": 0.8, "topK": 0, "maxTokens": 100, "temperature": 0.8, "repeatPenalty": 5.0, "stopBefore": [], "includeAiFilters": true, "seed": 0 }; var options = { 'method': 'post', 'contentType': 'application/json', 'payload': JSON.stringify(data), 'headers': { 'X-NCP-CLOVASTUDIO-API-KEY': apiKey, 'X-NCP-APIGW-API-KEY': apigwKey, 'X-NCP-CLOVASTUDIO-REQUEST-ID': requestId, 'Accept': 'application/json' } }; var response = UrlFetchApp.fetch('https://clovastudio.stream.ntruss.com/testapp/v1/chat-completions/HCX-003', options); var responseJson = JSON.parse(response.getContentText()); return responseJson.result.message.content; } function parseIngredients(jsonString) { try { // JSON 문자열을 정리합니다. jsonString = cleanJsonString(jsonString); var data = JSON.parse(jsonString); var ingredients = data.recipe.ingredients; return ingredients.map(function(ing) { return ing.item + ': ' + ing.amount; }).join('\n'); } catch (e) { // JSON 파싱에 실패한 경우, 텍스트에서 재료 정보 추출 시도 var ingredientsMatch = jsonString.match(/"ingredients":\s*\[([\s\S]*?)\]/); if (ingredientsMatch) { var ingredientsText = ingredientsMatch[1]; var ingredients = ingredientsText.match(/\{[^}]+\}/g); if (ingredients) { return ingredients.map(function(ing) { var item = ing.match(/"item":\s*"([^"]+)"/); var amount = ing.match(/"amount":\s*"([^"]+)"/); return (item ? item[1] : 'Unknown') + ': ' + (amount ? amount[1] : 'Unknown'); }).join('\n'); } } return "재료를 추출할 수 없습니다: " + e.message; } } function parseInstructions(jsonString) { try { // JSON 문자열 정리 jsonString = cleanJsonString(jsonString); var data = JSON.parse(jsonString); return data.recipe.instructions.join('\n'); } catch (e) { // JSON 파싱에 실패한 경우, 텍스트에서 요리 순서 정보 추출 시도 var instructionsMatch = jsonString.match(/"instructions":\s*\[([\s\S]*?)(?:\]|$)/); if (instructionsMatch) { var instructionsText = instructionsMatch[1]; // 쌍따옴표로 둘러싸인 문자열을 찾되, 쌍따옴표가 없는 경우도 포함 var instructions = instructionsText.match(/(?:"([^"]+)")|([^,]+)/g); if (instructions) { return instructions.map(function(inst) { // 쌍따옴표와 앞뒤 공백 제거 return inst.replace(/^["'\s]+|["'\s]+$/g, ''); }).filter(Boolean).join('\n'); } } // 위 방법으로도 실패한 경우, 단순히 "instructions" 이후의 모든 텍스트를 반환 var lastInstructionsIndex = jsonString.lastIndexOf('"instructions":'); if (lastInstructionsIndex !== -1) { return jsonString.slice(lastInstructionsIndex + 15).replace(/^\s*\[|\].*$/g, '').trim(); } return "요리 순서를 추출할 수 없습니다: " + e.message; } } function cleanJsonString(jsonString) { // JSON 문자열에서 줄바꿈, 따옴표 등을 정리 return jsonString.replace(/[\n\r]/g, ' ') .replace(/\s+/g, ' ') .replace(/\\"/g, '"') .replace(/"{/g, '{') .replace(/}"/g, '}') .trim(); } 스크립트 작성이 끝나면 상단의 저장 버튼을 눌러 변경사항을 저장해 주세요. 저장 후에는 '실행' 버튼을 클릭하여 스크립트가 정상적으로 동작하는지 확인할 수 있습니다. 아래와 같이 출력된다면 문제없이 정상 출력되는 것을 의미합니다. 처음 실행할 때 권한 요청 팝업이 나타날 수 있는데, '허용'을 클릭하여 필요한 권한을 부여해 주세요. Google Sheets 실행 Google Sheets에서 하이퍼클로바X API를 활용하여 레시피 정보를 자동으로 불러오는 과정을 살펴보겠습니다. 먼저 스프레드시트를 다음과 같이 구성해 주세요. A 열: '요리' - 조리법을 알고 싶은 요리 이름을 입력합니다. B 열: '재료' - API에서 받아온 재료 정보가 채워질 열입니다. C 열: '요리 순서' - API에서 받아온 조리 방법이 채워질 열입니다. D 열: '출력 결과' - API 호출 결과를 직접 확인할 수 있는 열입니다. 이제 Google Sheets에서 각 요리에 대한 정보를 일괄적으로 불러와 보겠습니다. '출력 결과' 열에 API 호출 결과를 표시하기 위해 첫 번째 셀(예: D2)에 다음 수식을 입력합니다: =callCLOVAStudio(A2) 수식을 입력하고 나면, 잠시 후 API 응답이 셀에 표시됩니다. 이 응답은 JSON 형식의 데이터로 요리의 이름, 재료 목록, 조리 방법 등의 정보를 포함하고 있습니다. 이 수식을 아래로 드래그하여 복사하면 A 열에 나열된 모든 요리에 대해 자동으로 API를 호출하고 결과를 표시할 수 있습니다. 이를 통해 여러 요리의 정보를 한 번에 얻을 수 있어 효율적인 레시피 데이터베이스 구축이 가능해집니다. 클로바 스튜디오는 안정적인 서비스 운영을 위해 이용량 제어 정책을 시행하고 있습니다. CLOVA Studio 이용량 제어 정책 이용량이 설정된 최대치를 초과할 경우 서비스 이용 정책에 따라 429 응답을 받을 수 있으며 이 경우 다시 시도해 주시기를 바랍니다. 프롬프트의 길이가 길거나, Maximum Tokens가 과도하게 높게 설정된 경우 이용량 초과가 발생할 수 있으니 유의해 주세요. A 열에 있는 모든 요리에 대한 API 호출 결과가 '출력 결과' 열에 성공적으로 생성되었습니다. <중요!> 이제 이 결과를 효율적으로 관리하고 불필요한 API 호출을 방지하기 위해 '출력 결과' 열의 내용을 복사하여 새로운 열에 '값만 붙여넣기'(단축키: cmd+shift+v/ctrl+shift+v)를 합니다. 이후 원래의 '출력 결과' 열에서 API 호출 함수를 삭제해 주세요. 이 작업을 하지 않는 경우, Google Sheets에 사용자가 접근할때마다 API가 호출될 수 있습니다. JSON 형식 발라내기 JSON 형식의 API 응답에서 필요한 정보를 추출해 보겠습니다. '재료' 열의 첫 셀에 =parseIngredients(D2)를 입력하고, '요리 순서' 열의 첫 셀에 =parseInstructions(D2)를 입력합니다. 이 함수들은 D2 셀에 있는 JSON 형식의 출력 결과에서 각각 재료와 요리 순서 정보만을 추출하여 표시합니다. JSON 문자열의 줄바꿈, 따옴표 등을 정리하는 로직이 적용되어 있지만 preprocessing 규칙은 작업과 출력 결과에 따라 다를 수 있으므로 필요에 따라 수정해야 할 수 있습니다. function cleanJsonString(jsonString) { // JSON 문자열에서 줄바꿈, 따옴표 등을 정리 return jsonString.replace(/[\\n\\r]/g, ' ') .replace(/\\s+/g, ' ') .replace(/\\\\"/g, '"') .replace(/"{/g, '{') .replace(/}"/g, '}') .trim(); } .replace(/[\\n\\r]/g, ' '): 줄 바꿈 문자를 공백으로 치환합니다. .replace(/\\s+/g, ' '): 연속된 공백을 하나의 공백으로 치환합니다. .replace(/\\\\"/g, '"'): 이스케이프 처리된 따옴표(")를 일반 따옴표(")로 치환합니다. .replace(/"{/g, '{'): 따옴표와 중괄호가 연속된 경우 따옴표('"')를 제거하고 중괄호('{')만 남깁니다. .replace(/}"/g, '}'): 따옴표와 중괄호가 연속된 경우 따옴표('"')를 제거하고 중괄호('}')만 남깁니다. .trim(): 앞뒤 공백을 제거합니다. API 호출과 결과 데이터 추출 자동화하기 이제 입력값을 넣으면 API 호출과 데이터 추출을 한 번에 수행하는 방법을 살펴보겠습니다. 먼저 Apps Script에 두 가지 함수를 추가해야 합니다. 첫 번째 함수는 getRecipeIngredients(dish)로, 요리 이름을 입력하면 API를 호출하고 결과를 추출하여 재료 정보만 반환합니다. 두 번째 함수는 getRecipeInstructions(dish)로 요리 이름을 입력하면 API를 호출하고 결과를 파싱하여 요리 순서 정보만 반환합니다. function getRecipeIngredients(dish) { var apiResponse = callCLOVAStudio(dish); return parseIngredients(apiResponse); } function getRecipeInstructions(dish) { var apiResponse = callCLOVAStudio(dish); return parseInstructions(apiResponse); } 그런 다음 스프레드시트에서 '재료' 열에 =getRecipeIngredients(A2)를 입력하고 '요리 순서' 열에 =getRecipeInstructions(A2)를 입력합니다. 이 방법을 사용하면 '출력 결과' 열을 따로 만들 필요가 없습니다. 수식을 아래로 드래그하면 A 열에 있는 각 요리에 대한 재료와 요리 순서가 자동으로 추출되어 표시됩니다. 이 방법을 통해 여러 요리의 재료와 조리 방법을 한 번에 자동으로 생성할 수 있게 되었습니다. API 호출과 데이터 추출 과정이 단순화되어, 스프레드시트에서 요리 이름만 입력하면 관련 정보가 즉시 채워집니다. 이로써 대량의 레시피 정보를 빠르고 효율적으로 관리할 수 있게 되었고, 스프레드시트의 활용도가 크게 향상되었습니다. 여러 열을 묶어서 인풋 구성하기 CONCATENATE 함수를 사용하면 여러 열에 있는 내용을 하나의 셀에 합칠 수 있습니다. 예를 들어 각각 다른 셀에 있는 '두부', '감자', '된장'을 "재료: 두부, 감자, 된장"과 같은 형태로 하나의 셀에 모아 모델 입력으로 사용할 수 있습니다. 여러 열의 정보를 구조화된 형태로 결합하여 모델에 전달할 수 있어 유용합니다. 이제 아래 함수를 스프레드시트의 적절한 셀에 입력합니다. =CONCATENATE("재료: ", A2, ", ", B2, ", ", C2) 이 함수는 A2, B2, C2 셀에 있는 재료들을 하나의 문자열로 결합합니다. 결과적으로 "재료: [A2의 내용], [B2의 내용], [C2의 내용]" 형태의 텍스트가 생성됩니다. Google Sheets는 다양한 함수를 제공하여 데이터 처리와 분석을 더욱 효율적으로 할 수 있습니다. 제공되는 함수들을 활용하면 스프레드시트의 활용도를 높일 수 있습니다. 구글 앱 스크립트에 대한 자세한 내용은 다음 링크를 참고해 주세요. https://developers.google.com/apps-script 하이퍼클로바 X는 여러 분야에 적용하고 활용할 수 있는 잠재력이 풍부하며 앞으로 더 많은 혁신적인 응용 사례들이 등장할 것으로 기대됩니다.
  17. 대규모 언어 모델(LLM)의 발전과 함께 프롬프트 엔지니어링의 중요성이 부각되고 있습니다. 프롬프트 구성 방식에 따라 AI 모델의 성능이 크게 영향을 받기 때문입니다. 다양한 프롬프트 엔지니어링 기법이 있지만, 이를 효과적으로 활용하기 위해서는 체계적인 평가 과정이 필요합니다. 개별 프롬프트를 입력하고 결과를 판단하는 방식은 신뢰성이 낮고 정확한 성능 평가가 어렵습니다. 따라서 프롬프트의 효과를 정확히 측정하기 위해서는 다양한 입력값을 사용한 반복적 테스트, 결과 분석, 비교 평가가 필요합니다. 이번 포스팅에서는 엑셀 형식의 대량 입력 데이터를 준비하고, 이를 프롬프트에 일괄 적용하여 결과를 효율적으로 출력하는 방법을 소개합니다. 또한 이 결과를 바탕으로 프롬프트를 개선하고 모델의 성능을 지속적으로 향상시키는 체계적인 접근 방법에 대해 설명하겠습니다. 초보자도 Visual Studio Code만 설치되어 있다면 쉽게 따라 할 수 있습니다. ① 엑셀로 입력 데이터셋 준비 ② 파이썬 코드 실행 ③ 출력 결과 엑셀 파일 확인 입력 데이터셋 준비 검증하고자 하는 테스트 데이터셋을 준비합니다. 엑셀 파일에 다음과 같은 열을 포함시킵니다. 입력값의 유형을 다양하게 포함하여 모델의 성능을 폭넓게 평가할 수 있도록 합니다. System: 시스템 프롬프트 User: 사용자 입력 Completion: 모델의 출력 (결과 저장용) 입력 데이터셋 준비가 완료되면, 파일을 저장 후 '성능평가'라는 이름의 폴더에 넣어둡니다. 환경 설정 먼저 Visual Studio Code를 실행하고, 데이터 처리를 위한 pandas 라이브러리를 설치합니다. 이 명령어를 실행하면 Python 패키지 관리자인 pip를 사용하여 pandas를 다운로드하고 설치합니다. pandas는 데이터 분석과 조작을 위한 Python 라이브러리로, 엑셀 형식의 데이터를 쉽게 처리할 수 있게 해줍니다. pip3 install pandas 파이썬 실행 ChatCompletionExecutor 클래스는 클로바 스튜디오 인증 토큰을 갱신하고, API URL을 실행하는 기능을 수행합니다. # -*- coding: utf-8 -*- import requests import pandas as pd import json class CompletionExecutor: 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, completion_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': 'application/json' } response = requests.post(self._host + '/testapp/v1/chat-completions/HCX-003', headers=headers, json=completion_request) if response.status_code == 200: return response.json()['result']['message']['content'] else: return 'Error: ' + response.text 아래 코드의 process_excel 함수는 입력 엑셀 파일을 읽어 API 요청을 수행하고 결과를 출력 엑셀 파일에 저장하는 기능을 수행합니다. 먼저 pandas를 사용하여 입력 파일을 DataFrame으로 읽어옵니다. 'completion' 열이 없다면 새로 생성하고 이미 존재한다면 문자열 타입으로 변환합니다. 함수는 DataFrame의 각 행을 순회하며 'system'과 'user' 열의 내용을 API 요청 데이터로 구성합니다. 이때 Chat Completions API의 파라미터로 세부 값을 설정할 수 있습니다. ChatCompletionExecutor 인스턴스를 통해 API 요청을 실행하고 응답을 'completion' 열에 저장합니다. 이 과정을 통해 대량의 입력 데이터에 대해 일괄적으로 AI 모델의 응답을 얻을 수 있으며 결과는 원본 데이터와 함께 새로운 엑셀 파일로 저장됩니다. def process_excel(input_file, output_file, completion_executor): df = pd.read_excel(input_file) if 'completion' not in df.columns: df['completion'] = '' else: df['completion'] = df['completion'].astype(str) for index, row in df.iterrows(): system_content = row['system'] if 'system' in df.columns else "" user_content = row['user'] if 'user' in df.columns else "" preset_text = [ {"role": "system", "content": system_content}, {"role": "user", "content": user_content} ] request_data = { 'messages': preset_text, 'topP': 0.8, 'topK': 0, 'maxTokens': 256, 'temperature': 0.8, 'repeatPenalty': 5.0, 'stopBefore': [], 'includeAiFilters': True, 'seed': 0 } response = completion_executor.execute(request_data) df.at[index, 'completion'] = response df.to_excel(output_file, index=False) 이용량 제어 정책에 따라 설정된 최대 이용량을 초과하여 사용할 수 없으며 CLOVA Studio 이용량 제어 정책 가이드를 참고해 주시기 바랍니다. 요청량이 과다할 경우 클로바 스튜디오 서비스 이용 정책에 따라 429 응답을 받을 수 있으며 이를 해결하기 위해서는 다시 시도하는 조치가 필요합니다. 에러 발생 시 자체적으로 재시도 로직을 구현하고 싶다면 Exponential backoff를 활용해 보시기 바랍니다. 마지막으로 스크립트의 실행 지점으로, API 인증 정보(CLIENT_KEY, CLIENT_SECRET)와 입출력 파일 경로를 설정합니다. 클로바 스튜디오의 API 정보 화면에서 발급 받은 Client Key, Client Secret을 입력합니다. 입력 데이터셋 파일과 출력 파일의 경로도 지정합니다. if __name__ == '__main__': API_KEY = '{API_KEY}' //API KEY 입력 API_KEY_PRIMARY_VAL = '{API_KEY_PRIMARY_VAL}' //APIGW KEY 입력 REQUEST_ID = '{REQUEST_ID}' //REQUEST ID 입력 INPUT_FILENAME = "/Users/user/Desktop/성능평가/sample_example.xlsx" OUTPUT_FILENAME = "/Users/user/Desktop/성능평가/sample_example_result.xlsx" completion_executor = CompletionExecutor( host='https://clovastudio.stream.ntruss.com', api_key=API_KEY, api_key_primary_val=API_KEY_PRIMARY_VAL, request_id=REQUEST_ID ) process_excel(INPUT_FILENAME, OUTPUT_FILENAME, completion_executor) 스크립트 실행이 완료되면 지정한 출력 경로에 'sample_example_result.xlsx' 파일이 생성됩니다. 결과 파일에는 입력 데이터와 모델의 응답 결과를 함께 포함하고 있어, 입력과 출력을 쉽게 확인할 수 있습니다. 비교 평가 모델의 성능을 비교 평가하는 데는 다양한 방법이 있습니다. 대표적으로 ROUGE와 RAGAS 등의 자동화된 평가 지표가 사용됩니다. ROUGE는 주로 텍스트 요약 작업의 성능을 평가합니다. 생성된 텍스트와 참조 텍스트 간의 중복되는 n-gram의 비율을 측정합니다. RAGAS는 RAG의 성능을 자동으로 평가하는 프레임워크입니다. 이러한 정량적 평가 방법들은 객관적인 수치를 제공하여 모델 간 비교를 용이하게 합니다. 하지만 사람 평가자의 정성적 평가는 자동화된 지표로는 파악하기 어려운 다양한 중요한 측면을 평가하는 데 큰 도움이 됩니다. 정확성, 사실성, 문맥 이해도, 자연스러운 언어 사용, 창의성, 독창성, 윤리적 고려사항 준수, 전반적인 품질과 유용성 등을 사람의 관점에서 세심하게 평가할 수 있기 때문입니다. 자동화된 지표와 인간의 통찰력이 결합되어 함께 활용하면 AI 모델의 성능을 더욱 깊이 있고 종합적으로 측정할 수 있을 것입니다. 맺음말 프롬프트 엔지니어링을 통한 AI 모델 성능 최적화는 반복적이고 체계적인 과정입니다. 단순히 직관에 의존하는 것만으로는 한계가 있으며, 객관적인 데이터를 바탕으로 한 반복적인 평가와 개선 과정이 필요합니다. 프롬프트를 지속적으로 개선하고 모델의 성능을 평가하는 과정을 반복하다 보면, 특정 지점에서 성능 향상의 한계에 도달할 수 있습니다. 이런 경우 프롬프트 엔지니어링만으로는 추가적인 개선이 어려울 수 있으므로, 모델 튜닝(fine-tuning)을 통한 최적화를 고려해볼 시점입니다. 이를 통해 모델이 특정 작업이나 도메인에 더욱 특화되어, 기존의 한계를 한 차례 뛰어넘는 성능 향상을 기대할 수 있습니다.
  18. 안녕하세요, @str0ngmk님, 튜닝 학습은 기존에 튜닝된 작업에 덮어쓰거나 추가되는 형태가 아닌, 새로 학습이 되는 형태입니다. 감사합니다.
  19. 안녕하세요, @ak68님, 튜닝 API를 이용하실 경우 학습 유형을 CLASSIFICATION(분류)로 진행하시면 되겠습니다. 아래 가이드 참고 부탁드립니다. 데이터셋 가이드 https://guide.ncloud-docs.com/docs/clovastudio-instructiondataset 학습 생성 API 가이드 https://api.ncloud-docs.com/docs/clovastudio-posttask 튜닝 학습 진행 시 시스템 프롬프트 열을 추가하여 학습 진행하는 것을 권장합니다. 감사합니다.
  20. ※ 네이버클라우드의 테크 앰버서더 주니어마스터 서현석님의 포스팅입니다. 요즘 AI가 워낙 핫 해지면서 여러 다양한 캐릭터 또는 유명 연예인들의 가치관, 성격, 말투까지 모두 따라하게 만드는 챗봇들을 직접 만들어보는 시도들이 점차 늘어나고 있는데요. 어떻게 이렇게 단 시간안에 수 많은 캐릭터 챗봇들이 쏟아져 나올 수 있게 되었을까요? 그 이유는 바로 LLM(Large Language Model) 이 등장했기 때문입니다. 이전에는 챗봇을 만드려면 직접 질문과 답변을 다 대 다로 매핑해서 일일이 데이터베이스에 저장해놓아야 했기 때문에 굉장히 많은 시간과 비용이 들었지만 이제는 적은 데이터 만으로도 모델 학습을 통해 단 시간안에 실제 캐릭터가 답변하는 듯한 느낌을 줄 수 있는 챗봇을 만들 수 있게 되었습니다. 적은 데이터만으로도 캐릭터 챗봇을 만들 수 있게 된 이유는 LLM에 이미 일상생활에서 일어날 수 있는 수 많은 상황들과 대화들이 학습되어 있기 때문입니다. 따라서 시중에 나와있는 이미 잘 만들어진 모델들 중 하나를 선택하여 만들고자 하는 캐릭터의 가치관, 성격, 말투 등만 조금씩 바꿔주면 누구나 손 쉽게 캐릭터 챗봇을 구축할 수 있습니다. 이번 포스팅에서는 LLM을 활용하여 단 몇 시간 만에 나만의 캐릭터 챗봇 만드는 방법에 대해서 소개해 드리도록 하겠습니다. 목차 모델 선정하기 학습 전략 세우기 데이터셋 구축 자동화 모델 학습하기 1. 모델 선정하기 앞서 AI 캐릭터 챗봇을 빠르게 만들 수 있는 이유가 LLM의 등장이라고 말씀드렸었는데요. 마찬가지로 만들고자 하는 캐릭터를 선정하고 나서 저희가 가장 먼저 해야할 일은 LLM을 선택하는 것입니다. LLM을 선택하는 기준은 여러가지가 있을것 같은데요. 대표적으로 높은 정확도, 낮은 비용 등을 고려하게 됩니다. 특히 LLM마다 고유의 특징과 장점들이 있기 때문에 쇼핑몰에서 물건을 고르듯이 원하는 상품을 고르면 되는데 요즘은 워낙 많은 모델들이 쏟아져 나오고 있기 때문에 솔직히 전부 다 비교하기란 매우 어렵고 많은 시간이 낭비될 수 있습니다. 그래서 시간과 여유가 없고 많은 사람들이 추천한게 무조건 짱이다라고 생각되시면 허깅페이스의 챗봇 아레나 리더보드를 참고하셔서 높은 순위에 위치한 모델을 선택하시는것도 시간을 절약하는 방법 중에 하나입니다. 2024년 07월 15일 기준 사람들이 투표한 리더보드 랭킹 순위 https://huggingface.co/spaces/lmsys/chatbot-arena-leaderboard 이처럼 높은 순위에 있는 모델들로 캐릭터 챗봇을 구성한다면 왠만한 캐릭터 정보들은 이미 학습되어 있는 상태이기 때문에 많은 노력을 들이지 않더라도 캐릭터의 세계관이라던지 가치관에 대해 답변을 잘 만들어 낼 수 있습니다. 단, 주의할 점은 외국 모델들의 단점은 한국어 이해능력과 표현능력 그리고 한국의 문화에 대해 잘 알지 못하기 때문에 가끔씩 문장이 부자연스러울 때가 많습니다. 따라서 캐릭터 챗봇을 만들 때는 한국어 이해능력과 표현력이 뛰어난 국내 모델을 활용하는 것도 좋은 방법입니다. 저는 네이버클라우드의 대규모 언어 모델 HyperCLOVA X를 선택해서 진행해보도록 하겠습니다. 2. 학습 전략 세우기 모델을 선정하고 나면 학습 전략을 세워야 합니다. 학습 전략은 데이터셋을 어떻게 구성해서 학습할 것인지 데이터셋의 범주를 계획하는 것입니다. 예를들어, 만들고자 하는 캐릭터 챗봇의 특징, 세계관, 가치관 등을 생각해보고 이러한 요소들을 바탕으로 어떤 식으로 답변하면 좋을지? 말투는 어떻게 하면 좋을지? 등을 고려해서 데이터셋을 구축하시면 됩니다. 예를들어, 일본 애니메이션인 귀멸의칼날의 ‘카마도 탄지로’ 챗봇을 만든다고 가정한다면 다음과 같은 요소들을 고려해 볼 수 있을것 같습니다. 나이 : 15살 가족 : 동생(네즈코) 배경 가족들이 모두 혈귀(도깨비)들에 의해 몰살 당하고 하나 남은 여동생은 혈귀로 변해서 인간으로 되돌리기 위한 모험을 떠나는 스토리로 시작 시대적 배경은 20세기 초반이기 때문에 이제 막 경제발전을 이루는 상황 성격 누구에게나 상냥하고 정의로운 성격 간단한 특징들만 나열해보았는데 이런식으로 캐릭터의 대략적인 범위를 선정하고 해당 범위 내에서 사용자 질문들을 구성한 뒤 캐릭터의 말투를 입힌 답변으로 데이터셋을 구성하시면 됩니다. 추가적으로 데이터셋을 구성하실 때 고려해야할 점은 시간과 비용인데요. 데이터셋을 직접 구성한다면 답변의 품질은 좋아지지만 시간과 비용이 많이 들 수 밖에 없기 때문에 이 과정은 프롬프트 엔지니어링을 통해 자동으로 데이터셋을 만들어주는 방법도 고려해볼 수 있습니다. 아래의 프롬프트 예시를 한번 살펴보도록 하겠습니다. 프롬프트 예시 당신은 일본애니메이션인 귀멸의칼날에 등장하는 주인공 카마도 탄지로 입니다. 카마도 탄지로가 되어서 사용자와 대화를 진행합니다. 아래의 대화 시점과 대화 패턴을 참고해서 질문에 대해 답변해주세요. ###대화 시점### 탄지로는 현재 최종국면을 마치고 집으로 복귀한 시점이다. ###대화 패턴### - 등장인물들을 자주 언급한다. - 등장인물의 나이가 탄지로보다 높을 경우 ~씨라는 존칭을 붙인다. 예시) 우로코다키씨 - 과거회상을 자주한다. - 답변은 반말로 한다. - 답변을 길게한다. - 감정표현이 풍부하다. - 이모티콘을 사용한다. 예시) 😆😭 - 도깨비라는 단어 대신 혈귀라는 단어를 사용한다. 위 프롬프트는 실제로 애니메이션 귀멸의 칼날 주인공인 ‘카마도 탄지로’처럼 행동하도록 AI에게 지시를 내리는 프롬프트 예시입니다. 이 프롬프트를 답변 생성 프롬프트라고 부르도록 하겠습니다. 답변 생성 프롬프트를 만드는 방법은 역할 부여를 통해 AI가 앞으로 어떻게 행동하면 되는지를 프롬프트로 넣어서 다음 순서에 오는 정보들을 효율적으로 탐색해 올 수 있도록 명시한 뒤 캐릭터의 말투나 답변 포맷을 지정하시면 됩니다. 저는 사용자에게 좀 더 친근감있는 느낌을 줄 수 있도록 반말과 이모티콘을 사용할 수 있도록 요구하였고 추가적으로 과거 회상과 말을 길게 해달라고 하여 사용자로 하여금 실제 애니메이션을 보는듯한 경험을 줄 수 있도록 해보았습니다. 실제로 답변 생성 프롬프트를 시스템 지시문에 추가한 뒤에 사용자 질문을 넣어서 테스트 해보면 다음과 같이 답변 결과가 나타나는 것을 확인해볼 수 있습니다. 답변 생성 프롬프트를 완성하고 나면 이대로 테스트 앱으로 발행해서 사용해도 문제 없지만 저희는 이 답변 생성 프롬프트를 토대로 데이터셋을 구축해서 모델을 학습(튜닝)해야 합니다. 학습을 하는 이유는 매번 무거운 프롬프트를 날리게 된다면 서버에 부하도 많이 가고 장기적으로는 응답속도 및 비용도 많이 들게 됩니다. 만약 저 긴 프롬프트 없이도 모델이 답변을 만들 수 있다면 어떨까요? 다음 예시를 한번 확인해보겠습니다. 어떠신가요? 시스템 지시문없이 사용자 메시지 만으로도 잘 대답하는것을 볼 수 있습니다. 이러한 목적으로 저희는 학습을 통해 모델을 개선시켜서 사용하는것이 장기적으로 보았을 때 효율적이라고 말씀드릴 수 있습니다. 3. 데이터셋 구축 자동화 모델은 어떻게 학습시키는걸까요? HyperCLOVA X 같은 경우에는 질문, 답변 셋으로 구성된 데이터셋을 통해 모델을 학습시킬 수 있습니다. 가이드 문서에 따르면 400개 이상의 데이터셋을 학습시켜야 효과를 볼 수 있다고 가이드 되어있습니다. HyperCLOVA X의 경우 이런식으로 대화 데이터셋을 구축해서 학습을 시켜야 한다. (최소 400 권장) 데이터셋을 직접 구축하는것이 시간과 비용이 많이 든다면 앞서 만들어본 답변 생성 프롬프트를 활용해서 데이터셋을 빠르고 쉽게 구축해볼 수 있습니다. 답변과 마찬가지로 질문도 프롬프트 엔지니어링을 통해 자동으로 구축할 수가 있습니다. 아래 예시를 통해 확인해보도록 하겠습니다. 프롬프트 예시 당신은 일본 애니메이션 귀멸의 칼날을 시청한 상태입니다. 상대방이 탄지로라고 가정하고 질문 생성 방법을 바탕으로 궁금한 점들을 100개 이상 질문하세요. ### 질문 생성 방법 ### - 대화체로 생성한다. - 질문은 전부 반말로 생성한다. - 줄거리와 관련된 질문들을 많이 생성한다. - 질문은 다음과 같은 형식으로 출력한다. [\"첫 번째 질문\", \"두 번째 질문\", ...] 이번에는 답변 생성 프롬프트와 달리 역할을 지정할 때 캐릭터가 아닌 질문자 역할을 부여하였습니다. 질문을 생성할 때는 구어체 또는 대화체로 만들도록 요구하였고 답변 포맷은 리스트 또는 배열 형태로 출력하도록 지시하였습니다. 답변 포맷을 리스트 또는 배열 형태로 지정하는 이유는 일부 프로그래밍 통해 데이터셋 구축 작업을 용이하게 하기 위해서입니다. 질문 생성 프롬프트를 만들 때는 앞서 답변 생성 프롬프트를 만들 때와 달리 추론용 하이퍼파라미터를 조정하는 것이 좋습니다. 하이퍼파라미터를 조정하는 이유는 질문의 다양성을 높이기 위해서 인데요. 매번 생성할 때마다 똑같은 질문만을 생성하는것을 방지하기 위함입니다. 하이퍼파라미터는 Repetition penalty와 Temperature를 조정하면 좋은데 아래 특징과 예시를 통해서 살펴보도록 하겠습니다. Repetition penalty 같은 표현이 반복되는 토큰에 패널티를 부여하는 파라미터 입니다. 높게 설정할 수록 문장 표현력이 다양해지지만 프롬프트를 이해하지 못하는 경우가 생길 수 있습니다. 특징 예시 패널티가 낮은 경우에는 아래와 같이 계속 비슷한 질문들만 생성되는것을 확인하실 수 있습니다. (”탄지로가 도깨비를 상대할 때 물의 호흡…” 이라는 문장이 반복 생성됨) 패널티를 적당히 준 경우 다양한 질문들이 생성되는것을 보실 수 있습니다. 특히, Repetition Panalty를 적게 주었을 때 주의해야할 점은 대화 턴(멀티턴)을 추가할 수록 더 반복되는 표현이 많아져서 질이 안좋아지기 때문에 주의하셔야 합니다. 따라서 질문을 생성할 때는 가급적 멀티턴은 사용하지 않는것이 좋고 Maximum tokens값을 높여서 한 턴에 다양한 문장들이 생성될 수 있도록 만드는것이 좋습니다. Repetition Panalty는 2~7.5 사이의 값을 추천 드립니다. 좀 더 엄밀하게 적용하고 싶으시다면 프롬프트에 포함된 정보량에 따라 조정해보면서 테스트해보는 것이 좋습니다. Temperature 텍스트의 일관성과 창의성을 조정하는 파라미터입니다. HyperCLOVA X의 경우 높게 설정할 수록 감성적이게 되는 특징이 있습니다. 특징 예시 Temperature가 낮은 경우에는 프롬프트를 잘 이해하여 요구한대로 줄거리와 관련된 질문들을 잘 생성해냅니다. Temperature가 높은 경우에는 인물들간의 관계, 기분, 인상 등 주로 감성적인 질문들을 하게 됩니다. 주의할 점은 Temperature가 너무 낮은 경우에는 프롬프트를 잘 이해하지 못하고 생성된 질문들이 단조로워지는 현상이 생기고 너무 높은 경우에는 할루시네이션 현상이 강해집니다. (실제 작중에서 일어나지 않은 일을 질문합니다.) 따라서 Temperature는 0.2에서 0.75 사이의 값을 사용하는 것이 좋습니다. 이 때 Temperature값을 고정하기보다는 랜덤값으로 지정하여 질문 생성에 조금 더 다양성을 두는것도 좋은 방법인것 같습니다. 앞서 만든 질문 생성 프롬프트와 답변 생성 프롬프트를 활용하면 다음과 같은 플로우로 손 쉽게 데이터셋 구축이 가능해집니다. 원하는 만큼 질문 생성 스크립트를 반복 실행하고 또 다시 만들어진 질문 개수만큼 답변 생성 스크립트를 반복 실행하여 질문과 답변으로 구성된 데이터셋을 구축할 수 있게 됩니다. 자동 데이터셋 만들기 코드를 참고하고 싶다면 아래 링크를 통해 확인하시면 좋습니다. 저는 이 자동화 데이터셋 구축 프로그램을 통해 670개 가량의 데이터셋을 만드는데 대략 1시간 정도 소요가 되었습니다. HyperCLOVA X 데이터셋 자동생성기 https://github.com/chucoding/hcx-datasets-auto-generator/tree/main 4. 모델 학습하기 데이터셋이 준비가 되었다면 이제 모델에 데이터셋을 학습시켜야 하는데요. 만들어진 datasets.csv 파일을 네이버클라우드에서 제공중인 오브젝트 스토리지 서비스를 이용해서 업로드 하시면 됩니다. 아래와 같이 네이버클라우드 콘솔에 접속하셔서 [Object Storage] > [tanjiro] 버킷을 생성한 뒤에 datasets.csv를 업로드 하시면 됩니다. 업로드한 뒤에는 CLOVA Studio에 있는 학습 생성 API 가이드에 따라서 튜닝을 시도하시면 됩니다. API는 다음과 같이 호출하시면 학습이 진행됩니다. 물론 Request Header도 같이 넣어주어야 오류 없이 동작합니다. (해당 정보는 생략하도록 하겠습니다. - 클로바 스튜디오 가이드 참조) 학습 진행 상태를 확인하고 싶으시다면 CLOVA Studio 오른쪽 상단에서 프로필을 클릭하시고 [내 작업] > [튜닝] 을 클릭하셔서 확인이 가능합니다. 학습이 완료가 되면 플레이그라운드에서 불러오기로 테스트를 진행해보실 수 있습니다. 학습된 모델로 테스트시 결과가 잘 안나왔다면 데이터셋을 늘려보시거나 학습 생성 API를 호출하실 때 학습률(learningRate)을 높여보는것도 방법입니다. 🌠 정리하기 HyperCLOVA X를 활용한 캐릭터 챗봇 만드는 방법을 함께 살펴보았는데요. 앞선 자동화된 데이터셋 구축 작업을 병행한다면 2시간 안에 누구나 나만의 캐릭터 챗봇을 만들 수 있게 됩니다. 사실 모델이 만들어준 데이터로 데이터셋을 구축하다보면 품질이 떨어질 수 밖에 없기 때문에 캐릭터 챗봇을 제대로 만들고 싶고 시간과 여유가 되신다면 디테일하게 검수를 진행하는 것이 좋고 무엇보다도 시간과 노력을 들여서 데이터셋을 구축하시는것이 가장 좋습니다. 그럼에도 HyperCLOVA X가 생성해준 질문, 답변 퀄리티가 좋았기 때문에 이렇게 자동화된 데이터셋 구축해보는 시도를 가질 수 있었던것 같습니다. 빠르게 캐릭터 챗봇을 제작해보고 싶으신 분들이 계시다면 시도해보셔도 좋을것 같다는 생각이 듭니다. ※ 네이버클라우드의 테크 앰버서더 주니어마스터 서현석님의 포스팅입니다.
  21. @Jay Ahn님, 안녕하세요. 적절한 시점에 안내드릴 수 있도록 하겠습니다. 감사합니다.
  22. 안녕하세요, @sohyeon 님, 문제가 해결 되셨다니 다행입니다. 에러 및 에러 해결 내용 공유주셔서 감사합니다.
  23. 안녕하세요, @성연재님, 관련 정보를 확인하실 수 있는 가이드 링크들을 전달드립니다. 클로바 스튜디오는 보다 안정적인 환경에서 서비스가 운영될 수 있도록 이용량 제어 정책을 시행하고 있습니다. 아래 링크를 통해 테스트 앱과 서비스 앱의 QPM, TPM 차이를 확인하실 수 있습니다. 이용량 제어 정책 https://guide.ncloud-docs.com/docs/clovastudio-ratelimiting 서비스 앱 신청 https://guide.ncloud-docs.com/docs/clovastudio-playground01#서비스-앱-신청 감사합니다.
  24. 안녕하세요, @kooni님, 이용에 불편을 드려 죄송합니다. 최근 슬라이딩 윈도우 API 관련하여 변경이 있었는데, Cookbook상에 반영되지 않은 것을 확인하였습니다. 이제 슬라이딩 윈도우 API는 테스트 앱 생성이 필요하지 않고 바로 사용이 가능하며, 테스트 앱 식별자도 이용하지 않습니다. Cookbook 수정하도록 하겠습니다. 감사합니다.
×
×
  • Create New...