logo
emoji
검색하기
어제 가장 많이 검색된 기술
emoji
가장 많이 읽은 글
logo
NEW
macOS에 Homebrew TAP을 통해 bottle 패키지 배포하기 : 4편
Homebrew는 macOS를 위한 오픈 소스 패키지 관리자로, 개발자들 사이에서 필수 도구로 자리 잡았습니다.CLI 인터페이스를 통해 다양한 소프트웨어를 쉽게 설치, 업데이트, 관리할 수 있게 해주며, 의존성 문제도 자동으로 해결됩니다.이러한 편의성 덕분에 Homebrew는 macOS 사용자들, 특히 개발자들에게 없어서는 안 될 도구가 되었습니다.이번 글에서는 이전에 소개한 ALN(Amazing Lucky Numbers) 라이브러리를 macOS용 Homebrew 패키지로 만들고, TAP을 통해 bottle로 배포하는 과정을 상세히 다루겠습니다.Formula 작성, bottle 빌드, TAP 저장소 설정, 그리고 최종적으로 사용자들이 쉽게 설치할 수 있도록 패키지를 배포하는 방법까지 단계별로 설명하겠습니다.Homebrew는 맥주 양조에서 영감을 받아 이름이 지어졌으며, 많은 용어들이 맥주 제조 과정과 관련이 있습니다.실제로 명령으로 패키지를 설치할 때 터미널에 맥주 아이콘이 표시됩니다.각 용어에 대해 Homebrew에서의 의미와 맥주 양조에서의 의미를 함께 설명하면 다음과 같습니다.• None• None 가정에서 직접 만드는 수제 맥주• None Brew: 패키지를 설치하거나 관리하는 주요 명령어• None 맥주를 만드는 과정 자체• None• None 맥주 제조를 위한 재료와 방법을 기술한 레시피• None Cellar: Homebrew가 패키지를 설치하는 디렉토리 (기본 위치: Intel mac - /usr/local/Cellar, Apple Silicon Mac - /opt/homebrew/Cellar)• None 맥주를 저장하고 숙성시키는 공간• None• None 맥주를 저장하고 서빙하는 데 사용되는 통• None Tap: 공식 저장소 외에 사용자가 추가하여 사용할 수 있는 Formula 저장소• None 맥주를 따르는 데 사용되는 밸브나 꼭지• None Cask: GUI 애플리케이션을 관리하기 위한 Homebrew의 확장 기능• None 대량의 맥주를 저장하고 운반하는 데 사용되는 큰 통• None Bottle: 미리 컴파일된 패키지 버전으로, 설치 시간을 크게 단축시킴• None 맥주를 담아 판매하거나 보관하는 유리병Homebrew 기반의 패키지를 만들어서 배포하는 과정을 맥주 용어로 다시 설명하면 아래와 같습니다.• None• None 맥주 제조를 위한 재료와 방법을 기술한 레시피(Formula) 작성• None• None 맥주를 제조한 후 유리병(Bottle)에 담아 준비• None Github 저장소를 이용해 Tap 추가 및 패키지 설치• None 맥주 양조장을 통해 맥주를 받아옴(Tap). 병으로 바로 받거나(Bottle) 레시피(Formula)로 직접 제조Apple Silicon Mac 기준으로 Homebrew는 디렉토리를 사용하는데, 세부 디렉토리는 아래와 같습니다.• None (Git 저장소): 이 디렉토리는 Homebrew의 루트 디렉토리이며, 동시에 Git 저장소입니다. 이를 통해 Homebrew 자체의 업데
github
githubaction
9/10/2024
logo
macOS에 Homebrew TAP을 통해 bottle 패키지 배포하기 : 4편
NEW
Homebrew는 macOS를 위한 오픈 소스 패키지 관리자로, 개발자들 사이에서 필수 도구로 자리 잡았습니다.CLI 인터페이스를 통해 다양한 소프트웨어를 쉽게 설치, 업데이트, 관리할 수 있게 해주며, 의존성 문제도 자동으로 해결됩니다.이러한 편의성 덕분에 Homebrew는 macOS 사용자들, 특히 개발자들에게 없어서는 안 될 도구가 되었습니다.이번 글에서는 이전에 소개한 ALN(Amazing Lucky Numbers) 라이브러리를 macOS용 Homebrew 패키지로 만들고, TAP을 통해 bottle로 배포하는 과정을 상세히 다루겠습니다.Formula 작성, bottle 빌드, TAP 저장소 설정, 그리고 최종적으로 사용자들이 쉽게 설치할 수 있도록 패키지를 배포하는 방법까지 단계별로 설명하겠습니다.Homebrew는 맥주 양조에서 영감을 받아 이름이 지어졌으며, 많은 용어들이 맥주 제조 과정과 관련이 있습니다.실제로 명령으로 패키지를 설치할 때 터미널에 맥주 아이콘이 표시됩니다.각 용어에 대해 Homebrew에서의 의미와 맥주 양조에서의 의미를 함께 설명하면 다음과 같습니다.• None• None 가정에서 직접 만드는 수제 맥주• None Brew: 패키지를 설치하거나 관리하는 주요 명령어• None 맥주를 만드는 과정 자체• None• None 맥주 제조를 위한 재료와 방법을 기술한 레시피• None Cellar: Homebrew가 패키지를 설치하는 디렉토리 (기본 위치: Intel mac - /usr/local/Cellar, Apple Silicon Mac - /opt/homebrew/Cellar)• None 맥주를 저장하고 숙성시키는 공간• None• None 맥주를 저장하고 서빙하는 데 사용되는 통• None Tap: 공식 저장소 외에 사용자가 추가하여 사용할 수 있는 Formula 저장소• None 맥주를 따르는 데 사용되는 밸브나 꼭지• None Cask: GUI 애플리케이션을 관리하기 위한 Homebrew의 확장 기능• None 대량의 맥주를 저장하고 운반하는 데 사용되는 큰 통• None Bottle: 미리 컴파일된 패키지 버전으로, 설치 시간을 크게 단축시킴• None 맥주를 담아 판매하거나 보관하는 유리병Homebrew 기반의 패키지를 만들어서 배포하는 과정을 맥주 용어로 다시 설명하면 아래와 같습니다.• None• None 맥주 제조를 위한 재료와 방법을 기술한 레시피(Formula) 작성• None• None 맥주를 제조한 후 유리병(Bottle)에 담아 준비• None Github 저장소를 이용해 Tap 추가 및 패키지 설치• None 맥주 양조장을 통해 맥주를 받아옴(Tap). 병으로 바로 받거나(Bottle) 레시피(Formula)로 직접 제조Apple Silicon Mac 기준으로 Homebrew는 디렉토리를 사용하는데, 세부 디렉토리는 아래와 같습니다.• None (Git 저장소): 이 디렉토리는 Homebrew의 루트 디렉토리이며, 동시에 Git 저장소입니다. 이를 통해 Homebrew 자체의 업데
2024.09.10
github
githubaction
emoji
좋아요
emoji
별로에요
logo
〈Gen.View | FE - #0〉 비개발 직군의 Frontend 업무 적용 스토리
Frontend 개발자가 아닌데 굳이 해당 분야를 공부해야 할 필요가 있을까요?개인적으로는 불과 몇년전까지 Frontend 분야에 대하여 막연히 Web Site 를 만드는 직군으로서, Backend 나 AI 관련 직무와는 업무적으로 서로 크게 관여할 일이 많지 않을 것이라고 생각했었습니다.또한 제대로 공부해보지는 않았었지만, 굉장히 지루해 보였던 HTML 과 CSS 를 다루며 다른 개발 직군과는 다소 거리가 있는 직군이라는 편견을 가지고 있었습니다.이로 인해, ML/DL 모델링 직군으로 입사했던 상황에서 Frontend 분야는 커리어 관점에서나, 회사에서의 업무 관점에서 크게 접할 계기가 없을 것이라는 판단을 했었습니다.SKT 입사 이후, 담당하고 있는 대부분의 프로젝트가 Frontend 분야와 직간접적으로 연결되어 있다는 것을 깨닫는 데는 긴 시간이 걸리지 않았습니다.단순하게는 속해 있는 프로젝트의 성공이 Web/App 완성도에 따라 좌지우지될 수 있을 정도로 서비스 관점에서 큰 영향력을 가지고 있었고,직접 개발한 ML/DL 기반 모델의 추천 정보가 최종적으로 고객에게 더 효과적으로 전달될 수 있도록 모델 API 및 화면 Spec 을Frontend 개발자분들과 협의하는 과정을 수차례 경험하며 해당 분야에 자연스럽게 관심을 가지기 시작했습니다.또한, 고객에게 직접적으로 노출되는 서비스 화면이 아니더라도,사내 구성원들이 사용하는 크고 작은 Admin Web 은 서비스를 안정적으로 운영해야하는 백오피스 관점에서 빼놓고 생각할 수 없는 요소였습니다.Frontend 분야에 처음 관심이 생긴 이후, 초기에는 Python 기반의 간단한 Library 를 학습하며 업무에 조금씩 적용하기 시작했습니다.전통적인 Web 개발 방식과는 다소 거리가 있었지만, 익숙한 개발 언어를 사용하며 단기간에 원하는 기능을 화면에 적용하는 경험을 하며 한동안 재밌게 이것저것 만들어 봤던 것 같습니다.구체적으로는, Streamlit 이라는 Library 를 사용했고 Frontend 기초 지식 학습을 병행하며,Hydralit 을 통해 GNB (Global Navigation Bar) 기반의 Multi-page 구조를 구현하며 그럴듯해 보이는 Admin Web 을 구축해보기도 했습니다.해당 Admin Web 은 추후 기능이 고도화되며 A. 큐피드 서비스에 활용되는 주요 모델들의 버젼 및 배포 관리에 핵심적으로 활용되었습니다.Streamlit 이나 Gradio 와 같은 Python 기반 Web Library 는 쉽고 빠르게 필요한 화면을 개발할 수 있다는 큰 장점을 가지고 있지만,반대로 Web-application 개발 측면에서 여러가지 치명적인 단점을 가지고 있습니다.UI 컴포넌트가 제한되어 있고 커스터마이징하기 어려울 뿐 아니라, 복잡한 Web-application 을 구현하거나 Js 기반 고도화된 기능을 구현하기에는 적합하지 않았습니다.이로 인해, Svelte 라는 Js 기반 Web Framework 에 대한 학습을 본격적으로 시작하였습니다.많은 화면 개발 경험을 해본 상
9/9/2024
logo
〈Gen.View | FE - #0〉 비개발 직군의 Frontend 업무 적용 스토리
Frontend 개발자가 아닌데 굳이 해당 분야를 공부해야 할 필요가 있을까요?개인적으로는 불과 몇년전까지 Frontend 분야에 대하여 막연히 Web Site 를 만드는 직군으로서, Backend 나 AI 관련 직무와는 업무적으로 서로 크게 관여할 일이 많지 않을 것이라고 생각했었습니다.또한 제대로 공부해보지는 않았었지만, 굉장히 지루해 보였던 HTML 과 CSS 를 다루며 다른 개발 직군과는 다소 거리가 있는 직군이라는 편견을 가지고 있었습니다.이로 인해, ML/DL 모델링 직군으로 입사했던 상황에서 Frontend 분야는 커리어 관점에서나, 회사에서의 업무 관점에서 크게 접할 계기가 없을 것이라는 판단을 했었습니다.SKT 입사 이후, 담당하고 있는 대부분의 프로젝트가 Frontend 분야와 직간접적으로 연결되어 있다는 것을 깨닫는 데는 긴 시간이 걸리지 않았습니다.단순하게는 속해 있는 프로젝트의 성공이 Web/App 완성도에 따라 좌지우지될 수 있을 정도로 서비스 관점에서 큰 영향력을 가지고 있었고,직접 개발한 ML/DL 기반 모델의 추천 정보가 최종적으로 고객에게 더 효과적으로 전달될 수 있도록 모델 API 및 화면 Spec 을Frontend 개발자분들과 협의하는 과정을 수차례 경험하며 해당 분야에 자연스럽게 관심을 가지기 시작했습니다.또한, 고객에게 직접적으로 노출되는 서비스 화면이 아니더라도,사내 구성원들이 사용하는 크고 작은 Admin Web 은 서비스를 안정적으로 운영해야하는 백오피스 관점에서 빼놓고 생각할 수 없는 요소였습니다.Frontend 분야에 처음 관심이 생긴 이후, 초기에는 Python 기반의 간단한 Library 를 학습하며 업무에 조금씩 적용하기 시작했습니다.전통적인 Web 개발 방식과는 다소 거리가 있었지만, 익숙한 개발 언어를 사용하며 단기간에 원하는 기능을 화면에 적용하는 경험을 하며 한동안 재밌게 이것저것 만들어 봤던 것 같습니다.구체적으로는, Streamlit 이라는 Library 를 사용했고 Frontend 기초 지식 학습을 병행하며,Hydralit 을 통해 GNB (Global Navigation Bar) 기반의 Multi-page 구조를 구현하며 그럴듯해 보이는 Admin Web 을 구축해보기도 했습니다.해당 Admin Web 은 추후 기능이 고도화되며 A. 큐피드 서비스에 활용되는 주요 모델들의 버젼 및 배포 관리에 핵심적으로 활용되었습니다.Streamlit 이나 Gradio 와 같은 Python 기반 Web Library 는 쉽고 빠르게 필요한 화면을 개발할 수 있다는 큰 장점을 가지고 있지만,반대로 Web-application 개발 측면에서 여러가지 치명적인 단점을 가지고 있습니다.UI 컴포넌트가 제한되어 있고 커스터마이징하기 어려울 뿐 아니라, 복잡한 Web-application 을 구현하거나 Js 기반 고도화된 기능을 구현하기에는 적합하지 않았습니다.이로 인해, Svelte 라는 Js 기반 Web Framework 에 대한 학습을 본격적으로 시작하였습니다.많은 화면 개발 경험을 해본 상
2024.09.09
emoji
좋아요
emoji
별로에요
logo
에이닷은 어떻게 먼저 말을 걸어 오는 걸까?
에이닷을 사용하는 사용자에 필요한 정보를 제공하는 가장 좋은 방법에는 어떤 것 들이 있을까요?여러 가지 방법들이 있겠지만 그 중 하나는 사용자의 요청이 없어도 먼저 말을 걸어 알려 주는 방법을 생각해 볼 수 있습니다.하지만 사용자의 직접 적인 요청이 없어도 잘 제공할 수 있을까요?이를 위해 어떻게 하면 먼저 말을 잘 걸 수 있을지 고민하고 개발한 내용을 소개해 드리도록 하겠습니다.새롭게 개편된 에이닷을 사용해 보면 에이닷이 먼저 말을 걸어 옵니다.정해진 말만 하는 것은 아닐까 하는 생각이 들 수도 있지만 조금만 에이닷을 사용해 보면 다양한 내용으로 말을 걸어 오는 것을 볼 수 있습니다.우선 우리는 에이닷이 말을 먼저 거는 기능을 '선톡'으로 부르며 다음과 같은 종류로 나누었습니다.• None - 개인 정보(통화, 수면, 일정, 위치 등등)을 활용해서 정보를 알려 주며 말 걸기• None - 개인적인 관심사, 좋아하는 음악 등에 대해서 말 걸기개발의 방향은 필요한 정보를 Context로 구성하고 개인화 Agent에서 이를 활용하여 선톡을 Offering 하는 구조를 기본으로 하고 있습니다.Offering 을 효율적으로 하면서 고도화도 유연하게 하기 위해 다음과 같이 Context 영역과 Agent 영역을 구분했습니다.주요 기능들은 아래와 같은 모듈들이 담당하고 있습니다.선톡의 시작은 사용자의 Context에서 시작 됩니다. Context에 대해서 다음과 같이 3가지 영역으로 문제를 정의하고 개발을 하였는데 수집부터 활용까지 하나씩 알아 보도록 하겠습니다.• None Context 가공 - LLM Prompting에 활용하기 좋은 형태로 가공필요한 Context를 정의하고 수집하는 단계로 아래 표는 대표적인 Context의 예시 입니다.그 밖에도 전화, 라디오 정보 등 다양한 Context가 있고 하루 하루 계속 추가가 되고 있습니다.다만 수집된 Context 정보는 아래 예시와 같이 약어로 표기된 필드명과 알기 어려운 단순한 숫자 값으로 되어 있는데이는 개인화 Agent (LLM 활용)에 바로 사용하기 어려운 경우가 많습니다.필요한 항목만 선택하여 LLM이 이해하기 쉬운 형태로 아래와 같이 변경을 합니다.Context는 UPS에 저장되어 있는데 선톡에서 원하는 Context를 쉽게 조회 할 수 있도록 API를 제공하고 있습니다.해당 API에서는 원하는 Context 항목을 선정하고 세부 조건을 설정합니다.아래와 같이 개인화 Agent의 LLM Prompt에 적합한 형태로 사용하게 되고,개인화 Agent는 아래와 같이 선톡을 생성합니다.Context의 종류는 매우 많고 앞으로는 더욱 더 많아 질 것이기 때문에 해당 Context를 기반으로 제공할 수 있는 수 많은 선톡 중에서 어떤 선톡을 선택해서 제공할 지가 Agent의 핵심 요소입니다.우리는 최적의 선톡을 선택하기 위해 평가 시스템 (Evaluation System)을 다음과 같이 만들었습니다.가장 처음에 하는 일은 선톡의 종류에 따른 우선 순위를 정하는 것입니다. 기본적으로 아래와 같은
9/9/2024
logo
에이닷은 어떻게 먼저 말을 걸어 오는 걸까?
에이닷을 사용하는 사용자에 필요한 정보를 제공하는 가장 좋은 방법에는 어떤 것 들이 있을까요?여러 가지 방법들이 있겠지만 그 중 하나는 사용자의 요청이 없어도 먼저 말을 걸어 알려 주는 방법을 생각해 볼 수 있습니다.하지만 사용자의 직접 적인 요청이 없어도 잘 제공할 수 있을까요?이를 위해 어떻게 하면 먼저 말을 잘 걸 수 있을지 고민하고 개발한 내용을 소개해 드리도록 하겠습니다.새롭게 개편된 에이닷을 사용해 보면 에이닷이 먼저 말을 걸어 옵니다.정해진 말만 하는 것은 아닐까 하는 생각이 들 수도 있지만 조금만 에이닷을 사용해 보면 다양한 내용으로 말을 걸어 오는 것을 볼 수 있습니다.우선 우리는 에이닷이 말을 먼저 거는 기능을 '선톡'으로 부르며 다음과 같은 종류로 나누었습니다.• None - 개인 정보(통화, 수면, 일정, 위치 등등)을 활용해서 정보를 알려 주며 말 걸기• None - 개인적인 관심사, 좋아하는 음악 등에 대해서 말 걸기개발의 방향은 필요한 정보를 Context로 구성하고 개인화 Agent에서 이를 활용하여 선톡을 Offering 하는 구조를 기본으로 하고 있습니다.Offering 을 효율적으로 하면서 고도화도 유연하게 하기 위해 다음과 같이 Context 영역과 Agent 영역을 구분했습니다.주요 기능들은 아래와 같은 모듈들이 담당하고 있습니다.선톡의 시작은 사용자의 Context에서 시작 됩니다. Context에 대해서 다음과 같이 3가지 영역으로 문제를 정의하고 개발을 하였는데 수집부터 활용까지 하나씩 알아 보도록 하겠습니다.• None Context 가공 - LLM Prompting에 활용하기 좋은 형태로 가공필요한 Context를 정의하고 수집하는 단계로 아래 표는 대표적인 Context의 예시 입니다.그 밖에도 전화, 라디오 정보 등 다양한 Context가 있고 하루 하루 계속 추가가 되고 있습니다.다만 수집된 Context 정보는 아래 예시와 같이 약어로 표기된 필드명과 알기 어려운 단순한 숫자 값으로 되어 있는데이는 개인화 Agent (LLM 활용)에 바로 사용하기 어려운 경우가 많습니다.필요한 항목만 선택하여 LLM이 이해하기 쉬운 형태로 아래와 같이 변경을 합니다.Context는 UPS에 저장되어 있는데 선톡에서 원하는 Context를 쉽게 조회 할 수 있도록 API를 제공하고 있습니다.해당 API에서는 원하는 Context 항목을 선정하고 세부 조건을 설정합니다.아래와 같이 개인화 Agent의 LLM Prompt에 적합한 형태로 사용하게 되고,개인화 Agent는 아래와 같이 선톡을 생성합니다.Context의 종류는 매우 많고 앞으로는 더욱 더 많아 질 것이기 때문에 해당 Context를 기반으로 제공할 수 있는 수 많은 선톡 중에서 어떤 선톡을 선택해서 제공할 지가 Agent의 핵심 요소입니다.우리는 최적의 선톡을 선택하기 위해 평가 시스템 (Evaluation System)을 다음과 같이 만들었습니다.가장 처음에 하는 일은 선톡의 종류에 따른 우선 순위를 정하는 것입니다. 기본적으로 아래와 같은
2024.09.09
emoji
좋아요
emoji
별로에요
logo
SK플래닛 개발자들의 GitHub Copilot 활용기(AI-assisted Coding과 개발 생산성 향상 #2)
여러분은 업무에서 GitHub Copilot(이하 '코파일럿'으로 명명) 등 AI-assisted Software를 얼마나 많이 사용하고 계신지요? :)SK플래닛에서도 이미 작년부터 코파일럿을 업무에 도입한 개발자들이 있었지만, 직무와 연차, 활용 용도에 따라 상이하게 사용하고 있었고 각자의 만족도도 달랐습니다. 따라서 당사는 2024년 4월부터 8월까지, 다양한 개발 업무에서 개발 생산성 향상 실험 및 사례 발굴 등의 활동을 진행하였습니다. 본 글은 이 활동을 회고/정리하는 '코파일럿 활용기' 성격으로 작성하였사오니 함께 참고 부탁드립니다.참고로 SK플래닛에서 사용한 코파일럿 버전은 'Copilot for Business' 이며, 당사의 사업 및 개발 분야는 아래를 참조하시기 바랍니다.이번 '코파일럿 활용'의 목표는 (1) 코파일럿의 다양한 활용 사례를 정리하여 구성원에게 공유하는 것과 (2) 코파일럿이 개발업무 생산성에 미치는 영향을 정량적으로 측정/비교 실험을 포함하였습니다(좀 어려웠...). 또한 (3) 많이 사용되는 백엔드, 프론트엔드 개발 외에도 데이터, 인프라, 블록체인 개발자에 대한 피드백을 함께 받아 실용성을 높이고자 하였습니다.이를 위해 먼저, 3월에 외부 전문가를 초빙하여 생성형 AI 기반 Coding에 대해 최근 기술 트렌드를 공유하고 눈높이를 맞추었습니다(주제: 실리콘밸리 개발자가 바라보는 AI 생산성 툴 및 개발 방식의 변화, 연사: 한기용 Upzen 대표). 본 세미나에 대한 요약은 다음 글을 참고하시기 바랍니다 => https://techtopic.skplanet.com/genai-productivity/4월에는 Kick-off meeting을 통해 취지를 설명하고 2개의 내부 사용자 그룹을 구성하여 업무 도입 및 활용 사례를 정기적으로 공유하였습니다. 그룹 1은 SDE(백엔드, 프론트엔드, Android/iOS 앱 개발), Web3 개발 중심으로 구성하였고, 그룹 2는 Data Engineer, 인프라 개발자 중심으로 총 30명의 사내 개발자가 참여하였습니다.코파일럿은 아시는 것처럼 생성형 AI 기반 코드 작성 도구로, 코드 자동완성 및 추천, 언어간 전환 기능, 코드 수정 기능(리팩토링, 오류 수정), 코드 설명 등의 다양한 개발 업무에 도움을 줄 수 있습니다. 이를 전통적인 자동 완성 기능과 비교할 경우 다음과 같은 차이가 있습니다.(1) 자동 완성은 사전(dictionary)을 참조하는 Syntax 기반의 자동 완성으로, 문법의 오류를 방지하고 타이핑을 줄여주는 정도의 수준입니다. 글쓰기에 비유하면 '맞춤법 검사기 + 단어 자동완성' 수준으로 볼 수 있습니다.(2) 반면 코파일럿은 개발자의 의도에 따른 소스 코드 생성, 자연어 프롬프트 기반의 로직 생성 및 개발자 의도 예측에 따른 로직 생성이 가능합니다. 글쓰기에 비유하면 '스토리를 스스로 생성하는 수준' 으로 볼 수 있습니다.그럼 좀더 자세히 활용 사례를 보도록 할까요? :)코파일럿에서 가장 직관적이고 많이 활용하는 기능 중 하나는 '자연어 to C
github
9/8/2024
logo
SK플래닛 개발자들의 GitHub Copilot 활용기(AI-assisted Coding과 개발 생산성 향상 #2)
여러분은 업무에서 GitHub Copilot(이하 '코파일럿'으로 명명) 등 AI-assisted Software를 얼마나 많이 사용하고 계신지요? :)SK플래닛에서도 이미 작년부터 코파일럿을 업무에 도입한 개발자들이 있었지만, 직무와 연차, 활용 용도에 따라 상이하게 사용하고 있었고 각자의 만족도도 달랐습니다. 따라서 당사는 2024년 4월부터 8월까지, 다양한 개발 업무에서 개발 생산성 향상 실험 및 사례 발굴 등의 활동을 진행하였습니다. 본 글은 이 활동을 회고/정리하는 '코파일럿 활용기' 성격으로 작성하였사오니 함께 참고 부탁드립니다.참고로 SK플래닛에서 사용한 코파일럿 버전은 'Copilot for Business' 이며, 당사의 사업 및 개발 분야는 아래를 참조하시기 바랍니다.이번 '코파일럿 활용'의 목표는 (1) 코파일럿의 다양한 활용 사례를 정리하여 구성원에게 공유하는 것과 (2) 코파일럿이 개발업무 생산성에 미치는 영향을 정량적으로 측정/비교 실험을 포함하였습니다(좀 어려웠...). 또한 (3) 많이 사용되는 백엔드, 프론트엔드 개발 외에도 데이터, 인프라, 블록체인 개발자에 대한 피드백을 함께 받아 실용성을 높이고자 하였습니다.이를 위해 먼저, 3월에 외부 전문가를 초빙하여 생성형 AI 기반 Coding에 대해 최근 기술 트렌드를 공유하고 눈높이를 맞추었습니다(주제: 실리콘밸리 개발자가 바라보는 AI 생산성 툴 및 개발 방식의 변화, 연사: 한기용 Upzen 대표). 본 세미나에 대한 요약은 다음 글을 참고하시기 바랍니다 => https://techtopic.skplanet.com/genai-productivity/4월에는 Kick-off meeting을 통해 취지를 설명하고 2개의 내부 사용자 그룹을 구성하여 업무 도입 및 활용 사례를 정기적으로 공유하였습니다. 그룹 1은 SDE(백엔드, 프론트엔드, Android/iOS 앱 개발), Web3 개발 중심으로 구성하였고, 그룹 2는 Data Engineer, 인프라 개발자 중심으로 총 30명의 사내 개발자가 참여하였습니다.코파일럿은 아시는 것처럼 생성형 AI 기반 코드 작성 도구로, 코드 자동완성 및 추천, 언어간 전환 기능, 코드 수정 기능(리팩토링, 오류 수정), 코드 설명 등의 다양한 개발 업무에 도움을 줄 수 있습니다. 이를 전통적인 자동 완성 기능과 비교할 경우 다음과 같은 차이가 있습니다.(1) 자동 완성은 사전(dictionary)을 참조하는 Syntax 기반의 자동 완성으로, 문법의 오류를 방지하고 타이핑을 줄여주는 정도의 수준입니다. 글쓰기에 비유하면 '맞춤법 검사기 + 단어 자동완성' 수준으로 볼 수 있습니다.(2) 반면 코파일럿은 개발자의 의도에 따른 소스 코드 생성, 자연어 프롬프트 기반의 로직 생성 및 개발자 의도 예측에 따른 로직 생성이 가능합니다. 글쓰기에 비유하면 '스토리를 스스로 생성하는 수준' 으로 볼 수 있습니다.그럼 좀더 자세히 활용 사례를 보도록 할까요? :)코파일럿에서 가장 직관적이고 많이 활용하는 기능 중 하나는 '자연어 to C
2024.09.08
github
emoji
좋아요
emoji
별로에요
logo
LLM, 더 저렴하게, 더 빠르게, 더 똑똑하게
안녕하세요. 카카오 기술전략 소속의 로빈입니다.현재 저는 카카오의 AI 교육 자문 활동 맡아 AI 교육 커리큘럼 설계 및 감수를 진행하고 있으며, AI Native Company로의 여정을 위해 AI를 활용하는 사내 시스템을 구축하고 있습니다. 또한 사내의 ChatGPT 커뮤니티를 운영하며, 생성형 AI와 관련한 다양한 트렌드와 소식을 사내 크루들에게 전달하고 있기도 합니다.많은 분들이 AI 서비스를 구현할 때 가장 고민되는 것 중에 하나가 바로 '...
9/8/2024
logo
LLM, 더 저렴하게, 더 빠르게, 더 똑똑하게
안녕하세요. 카카오 기술전략 소속의 로빈입니다.현재 저는 카카오의 AI 교육 자문 활동 맡아 AI 교육 커리큘럼 설계 및 감수를 진행하고 있으며, AI Native Company로의 여정을 위해 AI를 활용하는 사내 시스템을 구축하고 있습니다. 또한 사내의 ChatGPT 커뮤니티를 운영하며, 생성형 AI와 관련한 다양한 트렌드와 소식을 사내 크루들에게 전달하고 있기도 합니다.많은 분들이 AI 서비스를 구현할 때 가장 고민되는 것 중에 하나가 바로 '...
2024.09.08
emoji
좋아요
emoji
별로에요
logo
AI와 함께 생일 축하 카드를 만들어보자(feat.Claude, Adobe Firefly)
1. 고객과의 거리를 좁혀보자 - 생일 축하 문자SK텔레콤과 고객과의 거리가 점점 멀어지는 것 같습니다.그저 제 개인적인 생각이라면 다행인데, 언론에서 통신사를 다루는 이야기나그것에 대한 여론을 보면 저만의 느낌만은 아닌 것 같아 안타깝습니다.그래서, 고객과의 거리를 좁히고자 고객이 기뻐하는 Event에 함께 축하 하는 문자 메세지를 제작해서 보내기로 했어요.가장 먼저 생각난 Event는 '생일'이었고, 고객의 생일에 진심으로 기뻐하고 함께 축하하는 감성적인 문자 메시지를 기획했습니다.아래와 같은 고려 사항들을 생각하면서 하나씩 재료들을 모으고, 만들어 갔습니다.1. Mass 형태의 동일한 메세지는 지양하고, LLM을 통해 최대한 다양한 감성적인 메세지를 생성한다2. 기존 문자 메시지의 포맷에서 벗어나, 편지지/이미지를 생성해서 조합한다(이미지 생성)일단 가장 먼저 한 작업은 고객이 생일에 어떤 행동 패턴을 보이는지 확인하기 위해 데이터를 분석하는 작업이었어요.이 작업부터 한 이유는 생일 행동을 유형화해놓아야, 각 유형에 소구할 수 있는 메시지 프롬프트를 만들 수 있기 때문입니다.생일 행동 패턴을 유형화하기 위해 분석해 본 도메인 중 하나는 T멤버십입니다.생일에 특히 많이 사용(할인/적립) 하는 멤버십 브랜드를 통해 고객의 생일 관련 행동을 유추해볼 수 있기 때문입니다.생일 고객과 생일이 아닌 고객의 이전월/생일월의 멤버십 사용을 비교해보니 아래와 같은 점이 눈에 띄더군요.대체로 생일 고객은 생일이 아닌 때보다 생일이 있는 시기에 멤버십 사용이 늘어났고,이 늘어난 정도는 여성 고객에서 더욱 두드러졌습니다.생일에 특히 많이 사용되었던 멤버십 브랜드는 서울스카이, 야놀자, 아웃백 등 외부활동/외식에 포함된 브랜드였고,더 적게 사용된 브랜드는 편의점/카페 등 평소에도 사용량이 많은 브랜드였습니다.이와 같은 분석을 통해 생일에 드러난 행동 패턴을 유형화하여 아래와 같이 나누었습니다.일단 연령대로 고객군을 크게 나눈 다음, 각각의 유형에 고객군이 할당 되도록 셋팅했습니다.연령대부터 나누는 것이 바람직한지는 아직까지도 고민이기는 한데(저보다 힙하고 트렌디한 60대 분들도 많이 계시니..),기본적으로는 나눠놓는 것이 메세지 생성에 도움이 되는 것 같아 구분지었습니다.3. 감동과 정성을 담아... - 메세지 생성가장 메인 작업이자 핵심인 메세지 생성에서 제가 원하는 것은 아래와 같았습니다.[감성적]인 축하 메시지를 [SKT가 제공하는 가치]와 부합되게 LLM이 생성하는 것.생일 축하 메시지인 만큼 형식적이거나 딱딱함 보다는 감성적이었으면 좋겠고,가능하면, SKT가 고객에게 제공하는 가치들(통화, 문자, AI, 연결 등등)이 축하 메시지에함축적으로 담겨 있으면 좋겠다고 생각했어요.회사 내용이 너무 많이 들어가면 광고 문자처럼 보일 수도 있지만,SKT가 제공하는 가치는 분명 고객 삶에서 함께 하기에 완전 동떨어진 내용처럼보이지는 않을 것 같았습니다.그런데, 이렇게 적어놓은 순간 머리에 몇몇 문구가 떠오르더군요.3. 사랑을 연결하는 가장 진화한 방법넵, 모두 SKT CF속에서 나오는 대사/카피들입니다.생각해보니 제가 하고 있는 고민들은 모두 SKT 광고에 포함된 내용들이었습니다.그래서 우선, 그동안 SKT CF의 모든 카피들을 모으는 작업부터 하였습니다.처음 선택한 방법은 whisper API를 활용하여 유튜브에 있는 SKT 광고 카피들을 모으는 것이었습니다.whisper는 오디오 파일에서 텍스트를 생성하는 모델인데, 꽤 성능이 좋았습니다.아래와 같은 코드를 통해서 만들었는데, 문제는 SKT 광고들이 유튜브에 별로 없더군요.그래서 다른 방법을 찾아보니 TVCF(https://tvcf.co.kr/) 사이트에 기업별로 광고들이 정리되어 있더군요.🙃😭그래서 방법을 바꾸어 이 사이트에서 아래와 같이 SKT 광고 카피들을 모았습니다.이제 모은 재료들을 바탕으로 메시지 생성을 위한 기본 프레임워크를 만들 차례입니다프롬프트에는 고객유형별로 MMS 생성 가이드라인을 준수하면서 작성하되,감성적인 문구는 SKT 광고 카피에서 참고하여 작업하라는 내용을 담았습니다.LLM 모델은 처음 n개의 메시지는 'azure/openai/gpt-4o-2024-05-13'와 'anthropic/claude-3-5-sonnet-20240620'모두 사용해서 비교해봤고, claude의 작명 실력이 월등히 좋아 claude 모델만 사용하고 있습니다.프롬프트 엔지니어링은 여러 기법들이 있지만, 가장 가시적으로 효과가 좋았던 방법은 해야할 일을step별로 쪼개는 것과((Least-To-Most), 예시를 보여주는 few-shot이었습니다.• None N-Shot Prompting: 다양한 예시를 제공하여 LLM의 답변 정확도를 높이는 기법• None Chain-Of-Thought Prompting: 단계별 추론 과정을 통해 문제 해결 능력을 향상시키는 기법• None Least-To-Most Prompting: 복잡한 문제를 단순한 하위 문제로 분해해 해결하는 기법• None Self Consistency Prompting: 다양한 추론 경로를 생성하여 가장 일관된 답변을 선택하는 기법• None Generated Knowledge Prompting: LLM이 자체적으로 배경 지식을 생성해 더 깊이 있는 답변을 제공하는 기법output 형식을 지정해줄 수 있는 langchain의 response schema도 잘 활용했습니다.사실 감성적인 문구만을 모아 vector DB로 만드는 RAG을 이용할까도 했지만,RAG은 최신정보/정확한 정보를 가져오는 것에 더 맞는 방법론인 것 같아서 감성적인 문구를 만드는 데에는 프롬프트를 다듬는 데에만 집중했습니다.이렇게 생성된 메시지들은 팀에서 직접 확인하여 선별하고,선별된 메시지는 검토하는 팀(고객언어연구팀)의 검수도 한번 더 받습니다.이외에도, 개인화의 수준은 SKT에서 준수하고 있는 고객 데이터 AI 활용의 가이드 라인을 따랐습니다.가이드 라인은 고객의 비식별화된 개인정보 또한 프롬프트에 명시적으로 활용할 수 없고,프롬프트에 가능한 정보는 높은 수준의 가명처리를 해야 된다는 등 혹시나 오용될
9/6/2024
logo
AI와 함께 생일 축하 카드를 만들어보자(feat.Claude, Adobe Firefly)
1. 고객과의 거리를 좁혀보자 - 생일 축하 문자SK텔레콤과 고객과의 거리가 점점 멀어지는 것 같습니다.그저 제 개인적인 생각이라면 다행인데, 언론에서 통신사를 다루는 이야기나그것에 대한 여론을 보면 저만의 느낌만은 아닌 것 같아 안타깝습니다.그래서, 고객과의 거리를 좁히고자 고객이 기뻐하는 Event에 함께 축하 하는 문자 메세지를 제작해서 보내기로 했어요.가장 먼저 생각난 Event는 '생일'이었고, 고객의 생일에 진심으로 기뻐하고 함께 축하하는 감성적인 문자 메시지를 기획했습니다.아래와 같은 고려 사항들을 생각하면서 하나씩 재료들을 모으고, 만들어 갔습니다.1. Mass 형태의 동일한 메세지는 지양하고, LLM을 통해 최대한 다양한 감성적인 메세지를 생성한다2. 기존 문자 메시지의 포맷에서 벗어나, 편지지/이미지를 생성해서 조합한다(이미지 생성)일단 가장 먼저 한 작업은 고객이 생일에 어떤 행동 패턴을 보이는지 확인하기 위해 데이터를 분석하는 작업이었어요.이 작업부터 한 이유는 생일 행동을 유형화해놓아야, 각 유형에 소구할 수 있는 메시지 프롬프트를 만들 수 있기 때문입니다.생일 행동 패턴을 유형화하기 위해 분석해 본 도메인 중 하나는 T멤버십입니다.생일에 특히 많이 사용(할인/적립) 하는 멤버십 브랜드를 통해 고객의 생일 관련 행동을 유추해볼 수 있기 때문입니다.생일 고객과 생일이 아닌 고객의 이전월/생일월의 멤버십 사용을 비교해보니 아래와 같은 점이 눈에 띄더군요.대체로 생일 고객은 생일이 아닌 때보다 생일이 있는 시기에 멤버십 사용이 늘어났고,이 늘어난 정도는 여성 고객에서 더욱 두드러졌습니다.생일에 특히 많이 사용되었던 멤버십 브랜드는 서울스카이, 야놀자, 아웃백 등 외부활동/외식에 포함된 브랜드였고,더 적게 사용된 브랜드는 편의점/카페 등 평소에도 사용량이 많은 브랜드였습니다.이와 같은 분석을 통해 생일에 드러난 행동 패턴을 유형화하여 아래와 같이 나누었습니다.일단 연령대로 고객군을 크게 나눈 다음, 각각의 유형에 고객군이 할당 되도록 셋팅했습니다.연령대부터 나누는 것이 바람직한지는 아직까지도 고민이기는 한데(저보다 힙하고 트렌디한 60대 분들도 많이 계시니..),기본적으로는 나눠놓는 것이 메세지 생성에 도움이 되는 것 같아 구분지었습니다.3. 감동과 정성을 담아... - 메세지 생성가장 메인 작업이자 핵심인 메세지 생성에서 제가 원하는 것은 아래와 같았습니다.[감성적]인 축하 메시지를 [SKT가 제공하는 가치]와 부합되게 LLM이 생성하는 것.생일 축하 메시지인 만큼 형식적이거나 딱딱함 보다는 감성적이었으면 좋겠고,가능하면, SKT가 고객에게 제공하는 가치들(통화, 문자, AI, 연결 등등)이 축하 메시지에함축적으로 담겨 있으면 좋겠다고 생각했어요.회사 내용이 너무 많이 들어가면 광고 문자처럼 보일 수도 있지만,SKT가 제공하는 가치는 분명 고객 삶에서 함께 하기에 완전 동떨어진 내용처럼보이지는 않을 것 같았습니다.그런데, 이렇게 적어놓은 순간 머리에 몇몇 문구가 떠오르더군요.3. 사랑을 연결하는 가장 진화한 방법넵, 모두 SKT CF속에서 나오는 대사/카피들입니다.생각해보니 제가 하고 있는 고민들은 모두 SKT 광고에 포함된 내용들이었습니다.그래서 우선, 그동안 SKT CF의 모든 카피들을 모으는 작업부터 하였습니다.처음 선택한 방법은 whisper API를 활용하여 유튜브에 있는 SKT 광고 카피들을 모으는 것이었습니다.whisper는 오디오 파일에서 텍스트를 생성하는 모델인데, 꽤 성능이 좋았습니다.아래와 같은 코드를 통해서 만들었는데, 문제는 SKT 광고들이 유튜브에 별로 없더군요.그래서 다른 방법을 찾아보니 TVCF(https://tvcf.co.kr/) 사이트에 기업별로 광고들이 정리되어 있더군요.🙃😭그래서 방법을 바꾸어 이 사이트에서 아래와 같이 SKT 광고 카피들을 모았습니다.이제 모은 재료들을 바탕으로 메시지 생성을 위한 기본 프레임워크를 만들 차례입니다프롬프트에는 고객유형별로 MMS 생성 가이드라인을 준수하면서 작성하되,감성적인 문구는 SKT 광고 카피에서 참고하여 작업하라는 내용을 담았습니다.LLM 모델은 처음 n개의 메시지는 'azure/openai/gpt-4o-2024-05-13'와 'anthropic/claude-3-5-sonnet-20240620'모두 사용해서 비교해봤고, claude의 작명 실력이 월등히 좋아 claude 모델만 사용하고 있습니다.프롬프트 엔지니어링은 여러 기법들이 있지만, 가장 가시적으로 효과가 좋았던 방법은 해야할 일을step별로 쪼개는 것과((Least-To-Most), 예시를 보여주는 few-shot이었습니다.• None N-Shot Prompting: 다양한 예시를 제공하여 LLM의 답변 정확도를 높이는 기법• None Chain-Of-Thought Prompting: 단계별 추론 과정을 통해 문제 해결 능력을 향상시키는 기법• None Least-To-Most Prompting: 복잡한 문제를 단순한 하위 문제로 분해해 해결하는 기법• None Self Consistency Prompting: 다양한 추론 경로를 생성하여 가장 일관된 답변을 선택하는 기법• None Generated Knowledge Prompting: LLM이 자체적으로 배경 지식을 생성해 더 깊이 있는 답변을 제공하는 기법output 형식을 지정해줄 수 있는 langchain의 response schema도 잘 활용했습니다.사실 감성적인 문구만을 모아 vector DB로 만드는 RAG을 이용할까도 했지만,RAG은 최신정보/정확한 정보를 가져오는 것에 더 맞는 방법론인 것 같아서 감성적인 문구를 만드는 데에는 프롬프트를 다듬는 데에만 집중했습니다.이렇게 생성된 메시지들은 팀에서 직접 확인하여 선별하고,선별된 메시지는 검토하는 팀(고객언어연구팀)의 검수도 한번 더 받습니다.이외에도, 개인화의 수준은 SKT에서 준수하고 있는 고객 데이터 AI 활용의 가이드 라인을 따랐습니다.가이드 라인은 고객의 비식별화된 개인정보 또한 프롬프트에 명시적으로 활용할 수 없고,프롬프트에 가능한 정보는 높은 수준의 가명처리를 해야 된다는 등 혹시나 오용될
2024.09.06
emoji
좋아요
emoji
별로에요
logo
개인화 보이스 생성 기술 소개
AI 연구가 급속히 발전함에 따라, 개인화 기술이 실생활에 점점 더 깊숙이 스며들고 있습니다.그 중에서도 음성 합성 기술은 이제 단순히 기계적이고 로봇 같은 음성을 생성하는 것을 넘어서, 개개인의 목소리를 그대로 재현해 내는 수준에 이르렀습니다.이러한 혁신의 중심에 서 있는 것이 바로 개인화 보이스 생성 기술입니다.Voice Cloning 기반 음성합성 기술을 통해, 소량의 샘플 음성만으로도 사용자 고유의 목소리를 매우 유사하게 복제할 수 있습니다.이번 글에서는 SKT의 개인화 보이스 생성 기술의 상세 작동 원리와 응용 가능성에 대해 살펴보겠습니다.개인화 보이스 생성 기술은 최근 음성 합성 분야에서 가장 혁신적이고 주목받는 기술 중 하나입니다.이 기술의 핵심 목표는 사용자의 음성 특징을 반영한 맞춤형 음성을 생성하는 것으로, 사용자의 고유한 억양, 음색, 발음 스타일 등을 복제하여 자연스러운 대화를 가능하게 합니다.기존의 개인화 음성 합성 기술은 대체로 대규모 데이터셋과 꽤 긴 학습 시간을 필요로 했고, 비교적 적은양의 데이터셋을 사용하면 품질이 뛰어난 개인화 음성을 얻기가 어려웠습니다.그러나 최근 SSL(Semi-Supervised Learning) 및 AudioLM(Audio Language Model)과 같은 최신 AI모델 및 기술들을 활용하여,소량의 데이터로도 높은 품질의 개인화 음성을 생성할 수 있는 Voice Cloning 학습 기술들이 등장했습니다.이러한 개인화 보이스 생성 기술은 수 초에서 수 십초 분량의 음성 샘플만으로도 사용자의 음성 패턴을 학습하고, 이를 바탕으로 상당히 자연스럽고 유사한 음성을 생성할 수 있습니다.SKT의 개인화 보이스 생성 기술은 타겟 음성의 데이터셋 규모 및 학습 방식에 따라 Instant, Custom, Professional 의 3가지 Voice Cloning 기술로 구분할 수 있습니다.해당 기술들의 상세내용은 다음 챕터에서 기술합니다.이 기술은 특히 개인화된 사용자 경험을 제공하는 데 큰 장점을 가지고 있습니다.예를 들어, 개인화된 가상 비서, 맞춤형 교육 도구, 캐릭터의 음성 등 다양한 응용 분야에서 사용자에게 더욱 친밀한 인터페이스를 제공할 수 있습니다.또한, 기존의 음성 합성 기술이 가지고 있던 한계,예를 들어 스튜디오에서 대량으로 녹음한 학습 데이터가 필요하던 단점을 극복하여, 소량의 음성으로 타겟 화자와 유사한 음성을 생성할 수 있습니다.이와 같은 개인화 보이스 생성 기술은 앞으로 더 많은 분야에서 활용될 것이며, 사용자에게 더욱 풍부하고 개인화된 경험을 제공할 것입니다.SKT의 개인화 보이스 생성 기술은 타겟 음성의 데이터셋 규모 및 학습 방식에 따라 크게 3가지 기술로 구분할 수 있습니다.개인화 보이스의 품질은 타겟 음성의 양과 모델 학습 시간에 비례합니다.따라서 합성음이 사용될 목적이나 서비스 종류에 따라 적절한 기술을 선택하는 것이 중요합니다.아래는 해당 기술들의 상세내용을 기술합니다.Instant Voice Cloning 기술은 약 5~60초의 짧은 음성 샘플을 사용하여 실시간으로 개인화된 음성을 생성합니다.2가지 세부 모델이 있으며, 첫번째 모델인 Voice Model은 타겟 음성과 텍스트를 입력받아,타겟 음성에서 스타일을 추출한 후(Style Extraction), 입력된 텍스트를 기반으로 타겟 음성의 스타일이 반영된 speech token을 생성하는 단계입니다.T2S (Text to Speech tokens)라고도 부르며, 이 speech token은 pretrained SSL모델의 피처로써, 음성에서 의미와 운율 정보를 추출한 token을 말합니다.Style Extraction 모듈은 pretrained SSL모델의 latent값이 피쳐로 사용하여 타겟 음성의 음향정보 보다는 타겟 화자 고유의 운율, 발성 스타일을 추출합니다.T2S 훈련에는 음성 데이터와 해당 음성에 상응하는 텍스트 전사 정보가 반드시 쌍으로 필요합니다.SKT의 T2S 기술은 Non-AR(auto-regressive) 모델과 AR(auto-regressive) 모델의 2가지 기술을 보유하고 있습니다.Non-AR 모델의 경우, 병렬 연산이 가능하여 빠른 실시간 합성음 생성이 가능하고 안정적인 운율을 가진 합성음 생성이 가능합니다.AR 모델의 경우 순차적 연산으로 Non-AR 대비 생성이 느린 스트리밍 출력의 특성을 갖지만, 보다 다양한 운율 변화를 가지는 자연스러운 합성음 생성이 가능합니다.두번째 모델인 Vocoder는, 타겟 음성에서 음색을 추출하고(Timbre Extraction), 이전 단계에서 생성한 speech token을 활용하여 개인화 음성을 생성하는 단계입니다.Timbre Extraction 모듈은 음향정보가 많이 포함된 멜 스펙트로그램을 피쳐로 사용하여 타겟 화자의 음색을 추출하여 최종 합성음에 반영 되도록 합니다.Vocoder 훈련에는 텍스트 전사 정보는 필요하지 않고 음성 데이터만 필요로 하기 때무에 T2S 훈련 대비 좀 더 대용량의 훈련 데이터를 사용할 수 있습니다.SKT의 Vocoder 모델은 flow와 GAN기반 보코더가 결합된 구조를 사용하고 있습니다.일반적인 Instant Voice Cloning 기술은 소량의 음성을 사용해 비훈련 방식으로 실시간 개인화 음성을 생성할 수 있다는 장점이 있지만,다른 개인화 보이스 생성 기술에 비해 합성 음성이 다소 불안정할 수 있습니다.이로 인해 주로 Fun한 호기심용이나 데모용으로 주로 사용되고 있습니다.그러나 SKT의 Instant Voice Cloning 기술은 약 25,000명 이상의 화자를 사용한 대용량 모델을 기반으로 하며,클린한 음성 뿐 아니라, 노이즈가 포함된 훈련 방식을 통해 새로운 화자 및 녹음 환경에 대한 강건성을 높여 안정적인 cloning 성능을 제공할 수 있도록 실제 상용화 가능한 기술을 개발하고 있습니다.Custom Voice Cloning 기술은 1분~10분 가량의 타겟 화자 음성 신호가 있을 때, 타겟 화자 피쳐 추출 후, 실시간으로 개안회 보이스를 생성하는 기술입니다.이 기술에서는 타겟 화자의 특징이 반영된 화자 피쳐를 추출하는게 중요한 기
9/6/2024
logo
개인화 보이스 생성 기술 소개
AI 연구가 급속히 발전함에 따라, 개인화 기술이 실생활에 점점 더 깊숙이 스며들고 있습니다.그 중에서도 음성 합성 기술은 이제 단순히 기계적이고 로봇 같은 음성을 생성하는 것을 넘어서, 개개인의 목소리를 그대로 재현해 내는 수준에 이르렀습니다.이러한 혁신의 중심에 서 있는 것이 바로 개인화 보이스 생성 기술입니다.Voice Cloning 기반 음성합성 기술을 통해, 소량의 샘플 음성만으로도 사용자 고유의 목소리를 매우 유사하게 복제할 수 있습니다.이번 글에서는 SKT의 개인화 보이스 생성 기술의 상세 작동 원리와 응용 가능성에 대해 살펴보겠습니다.개인화 보이스 생성 기술은 최근 음성 합성 분야에서 가장 혁신적이고 주목받는 기술 중 하나입니다.이 기술의 핵심 목표는 사용자의 음성 특징을 반영한 맞춤형 음성을 생성하는 것으로, 사용자의 고유한 억양, 음색, 발음 스타일 등을 복제하여 자연스러운 대화를 가능하게 합니다.기존의 개인화 음성 합성 기술은 대체로 대규모 데이터셋과 꽤 긴 학습 시간을 필요로 했고, 비교적 적은양의 데이터셋을 사용하면 품질이 뛰어난 개인화 음성을 얻기가 어려웠습니다.그러나 최근 SSL(Semi-Supervised Learning) 및 AudioLM(Audio Language Model)과 같은 최신 AI모델 및 기술들을 활용하여,소량의 데이터로도 높은 품질의 개인화 음성을 생성할 수 있는 Voice Cloning 학습 기술들이 등장했습니다.이러한 개인화 보이스 생성 기술은 수 초에서 수 십초 분량의 음성 샘플만으로도 사용자의 음성 패턴을 학습하고, 이를 바탕으로 상당히 자연스럽고 유사한 음성을 생성할 수 있습니다.SKT의 개인화 보이스 생성 기술은 타겟 음성의 데이터셋 규모 및 학습 방식에 따라 Instant, Custom, Professional 의 3가지 Voice Cloning 기술로 구분할 수 있습니다.해당 기술들의 상세내용은 다음 챕터에서 기술합니다.이 기술은 특히 개인화된 사용자 경험을 제공하는 데 큰 장점을 가지고 있습니다.예를 들어, 개인화된 가상 비서, 맞춤형 교육 도구, 캐릭터의 음성 등 다양한 응용 분야에서 사용자에게 더욱 친밀한 인터페이스를 제공할 수 있습니다.또한, 기존의 음성 합성 기술이 가지고 있던 한계,예를 들어 스튜디오에서 대량으로 녹음한 학습 데이터가 필요하던 단점을 극복하여, 소량의 음성으로 타겟 화자와 유사한 음성을 생성할 수 있습니다.이와 같은 개인화 보이스 생성 기술은 앞으로 더 많은 분야에서 활용될 것이며, 사용자에게 더욱 풍부하고 개인화된 경험을 제공할 것입니다.SKT의 개인화 보이스 생성 기술은 타겟 음성의 데이터셋 규모 및 학습 방식에 따라 크게 3가지 기술로 구분할 수 있습니다.개인화 보이스의 품질은 타겟 음성의 양과 모델 학습 시간에 비례합니다.따라서 합성음이 사용될 목적이나 서비스 종류에 따라 적절한 기술을 선택하는 것이 중요합니다.아래는 해당 기술들의 상세내용을 기술합니다.Instant Voice Cloning 기술은 약 5~60초의 짧은 음성 샘플을 사용하여 실시간으로 개인화된 음성을 생성합니다.2가지 세부 모델이 있으며, 첫번째 모델인 Voice Model은 타겟 음성과 텍스트를 입력받아,타겟 음성에서 스타일을 추출한 후(Style Extraction), 입력된 텍스트를 기반으로 타겟 음성의 스타일이 반영된 speech token을 생성하는 단계입니다.T2S (Text to Speech tokens)라고도 부르며, 이 speech token은 pretrained SSL모델의 피처로써, 음성에서 의미와 운율 정보를 추출한 token을 말합니다.Style Extraction 모듈은 pretrained SSL모델의 latent값이 피쳐로 사용하여 타겟 음성의 음향정보 보다는 타겟 화자 고유의 운율, 발성 스타일을 추출합니다.T2S 훈련에는 음성 데이터와 해당 음성에 상응하는 텍스트 전사 정보가 반드시 쌍으로 필요합니다.SKT의 T2S 기술은 Non-AR(auto-regressive) 모델과 AR(auto-regressive) 모델의 2가지 기술을 보유하고 있습니다.Non-AR 모델의 경우, 병렬 연산이 가능하여 빠른 실시간 합성음 생성이 가능하고 안정적인 운율을 가진 합성음 생성이 가능합니다.AR 모델의 경우 순차적 연산으로 Non-AR 대비 생성이 느린 스트리밍 출력의 특성을 갖지만, 보다 다양한 운율 변화를 가지는 자연스러운 합성음 생성이 가능합니다.두번째 모델인 Vocoder는, 타겟 음성에서 음색을 추출하고(Timbre Extraction), 이전 단계에서 생성한 speech token을 활용하여 개인화 음성을 생성하는 단계입니다.Timbre Extraction 모듈은 음향정보가 많이 포함된 멜 스펙트로그램을 피쳐로 사용하여 타겟 화자의 음색을 추출하여 최종 합성음에 반영 되도록 합니다.Vocoder 훈련에는 텍스트 전사 정보는 필요하지 않고 음성 데이터만 필요로 하기 때무에 T2S 훈련 대비 좀 더 대용량의 훈련 데이터를 사용할 수 있습니다.SKT의 Vocoder 모델은 flow와 GAN기반 보코더가 결합된 구조를 사용하고 있습니다.일반적인 Instant Voice Cloning 기술은 소량의 음성을 사용해 비훈련 방식으로 실시간 개인화 음성을 생성할 수 있다는 장점이 있지만,다른 개인화 보이스 생성 기술에 비해 합성 음성이 다소 불안정할 수 있습니다.이로 인해 주로 Fun한 호기심용이나 데모용으로 주로 사용되고 있습니다.그러나 SKT의 Instant Voice Cloning 기술은 약 25,000명 이상의 화자를 사용한 대용량 모델을 기반으로 하며,클린한 음성 뿐 아니라, 노이즈가 포함된 훈련 방식을 통해 새로운 화자 및 녹음 환경에 대한 강건성을 높여 안정적인 cloning 성능을 제공할 수 있도록 실제 상용화 가능한 기술을 개발하고 있습니다.Custom Voice Cloning 기술은 1분~10분 가량의 타겟 화자 음성 신호가 있을 때, 타겟 화자 피쳐 추출 후, 실시간으로 개안회 보이스를 생성하는 기술입니다.이 기술에서는 타겟 화자의 특징이 반영된 화자 피쳐를 추출하는게 중요한 기
2024.09.06
emoji
좋아요
emoji
별로에요
logo
Flutter Web을 활용해 제품 개발 환경 개선하기
안녕하세요. ABC Studio에서 Demaecan(出前館, 이하 데마에칸) 앱을 개발하고 있는 김종식입니다. 데마에칸은 2000년부터 서비스를 시작한 일본 최대 규모의 음식 배달 서비스로 ABC Studio는 2021년 봄부터 프로덕트 개선에 참여하고 있습니다.Flutter 전환의 마침표 - 일본 1위 배달 앱, 세 번째 Recode 글을 통해 데마에칸의 소비자용 앱(이하 ConsumerApp) 서비스를 Flutter 기술로 전환한 작업을 소개 드린 적이 있습니다. Flutter는 단일 코드 베이스를 활용해 다양한 플랫폼의 애플리케이션을 개발할 수 있는 강력한 크로스 플랫폼 프레임워크입니다. 처음 등장한 후 모바일 앱뿐만 아니라 PC나 웹 환경에서도 활용되면서 점점 개선되고 있습니다.사장님용 앱인 MerchantApp과 ManagerApp은 이미 제품 개선 단계에서 Flutter를 이용해 웹 버전을 활용하고 있었습니다. 특히 ManagerApp은 처음부터 테스트용으로 웹 버전을 내부에 함께 배포했는데요. 기획에서부터 디자인, QA에 이르기까지 제품 개발 과정 전반에 큰 도움이 됐다는 의견을 받았습니다. 또한 가맹점용 앱인 RetailerApp 개발 과정에서는 PR(pull request)이 생성되면 웹 빌드 및 배포를 통해 작업 완료 여부를 판단하는 용도로 실험적으로 활용하기도 했습니다.반면 ConsumerApp에서는 개발 과정에서 웹 버전을 활용하고 있지 않았습니다. 웹 버전을 활용하지 않는 상태에서 지난 3월 UI/UX 개선 과제를 완료했는데요. ConsumerApp은 이해관계자가 많은 서비스인데다가 실제 작동 화면을 꼼꼼히 확인하며 진행해야 하는 과제였던 만큼 진행 과정에서 불편함을 느꼈고, 더 빠르고 효율적으로 서비스를 개선할 수 있는 개발 환경이 필요하다고 판단했습니다. 이번 글에서는 그와 같은 환경을 마련하기 위한 시도 중 하나로 ConsumerApp이 웹에서 작동할 수 있도록 개발 환경을 개선한 사례를 소개합니다.웹 환경에서 ConsumerApp 지원 필요성 확인저희는 아래 그림과 같이 6개의 개발 환경에서 ConsumerApp 제품 개선 활 동을 진행하고 있습니다. 각 환경에서는 병렬로 진행되는 과제나 정기 배포 진행 여부를 판단하기 위한 검증을 진행하며, 이를 통해 출시 일정을 유연하게 조정합니다.현재 내부 테스트나 공유를 위해서 Android는 DeployGate, iOS는 TestFlight 서비스를 이용해 실제 기기에서 작업을 확인하고 있는데요. 많은 인원이 함께 만들고 있기 때문에 실제 기기에서 작업을 확인하려면 개인 및 팀 단위로 계정과 기기를 준비해야 하는 등 불필요하게 예산이 낭비될 수 있습니다. 또한 보안을 유지하기 위해 사내 VPN 연결을 해야만 앱 서비스를 사용할 수 있는데 이를 준비하는 과정도 상당히 번거롭습니다. 이와 같은 이유로 프로덕트 메이커 분들은 프로젝트 진행 중 실제 앱 작동을 확인하면서 커뮤니케이션하기가 쉽지 않습니다.Flutter 기술은 출시 후 꾸준히 멀티 플랫폼 환경에서 개선돼 왔습니다. 데마에칸에서 운영 중인 서비스 앱들은 모두 Flutter로 개발하고 있으며, 덕분에 웹 환경에서도 구동이 가능해졌습니다. 이에 앞서 말씀드린 여러 가지 불편함을 개선하기 위해 ConsumerApp도 웹에서 작동을 확인할 수 있는 개발 환경이 구성되면 좋겠다는 제안이 있었고, 향후 앱 제품 개선 과정에 도움이 될 것이라고 기대하며 개발 팀 주도로 ConsumerApp 웹 작동 환경 구성을 진행했습니다.Flutter Web을 이용해 ConsumerApp 웹 개발 환경을 구축한 과정Flutter Web을 이용해 ConsumerApp 웹 작동 환경을 구성하는 과정은 다음과 같은 순서로 진행했습니다.• 빌드 오류가 발생하는 참조 패키지를 웹 지원 버전으로 업데이트• 로컬 개발 환경에서 CORS 이슈 대응• 웹에서 지도 뷰 표시하기먼저 아래와 같이 로컬 개발 환경에서 로그인 화면 진입까지 실행되도록 작업하는 PoC(Proof of Concept)를 진행했습니다. ConsumerApp은 많은 기능을 제공하고 있으며 다양한 패키지를 참조해 구현돼 있기 때문에 초기 구동 환경만 준비돼도 절반의 준비는 성공한 셈입니다(참고로 ConsumerApp은 Flutter 3.19.5를 사용하고 있습니다).PoC 단계에서 작업한 내용을 바탕으로 아래 그림과 같이 웹 실행이 가능하게 만들기 위해 코드 수정 및 리팩토링이 필요한 부분을 작업 단위 목록으로 정리했습니다. 이와 같이 작업을 도출한 덕분에 이후 사이드 이펙트를 최소화하면서 코드 리뷰에 부담되지 않도록 개발을 나눠 진행할 수 있었습니다.PoC 진행 결과를 토대로 설정한 ConsumerApp Flutter Web 버전의 방향은 아래와 같습니다.• ConsumerApp Flutter Web 버전을 최종 사용자에게 제공하는 것은 목표가 아닙니다. 데마에칸은 이미 웹에서도 서비스를 제공하고 있으며, Flutter Web은 실제 서비스로 활용하기에는 초기 구동 속도가 느리고, 웹 환경에서 상용 서비스 수준으로 활용 가능한 도구가 부족한 점 등의 아쉬운 부분이 있기 때문에 준비 단계에서부터 이미 최종 사용자용으로는 고려하지 않았습니다(참고: Flutter Web or React Native Web: Who Will Win the Battle?).• 실제 기기에서 작동하는 모든 기능이 모바일과 웹에서 완벽히 동일하게 작동하도록 만드는 것은 목표가 아닙니다. 기존에 사용하던 패키지 중 웹 환경을 지원하지 않는 패키지도 있었고, 앱에서 제공하는 기능이 웹에서 제공하기에는 적절치 않은 경우도 있었기 때문입니다. 따라서 동일하게 작동하도록 만들기보다는 인앱 웹뷰, 결제 흐름 등 일부 기능 사용에 제약이 있다는 사실을 공유하고 활용하는 방향으로 결정했습니다.• 웹 실행 환경을 팀에 최적화된 혹은 적합한 환경으로 구성하는 것은 목표가 아닙니다. 현재 ConsumerApp에는 6개의 개발 환경이 있는데요. 우선 그중 하나의 환경에서 ConsumerApp을 웹 환경으로 실행해 활용할 수 있는 수준으로 준비하는 것을 목표로 했습니
flutter
9/6/2024
logo
Flutter Web을 활용해 제품 개발 환경 개선하기
안녕하세요. ABC Studio에서 Demaecan(出前館, 이하 데마에칸) 앱을 개발하고 있는 김종식입니다. 데마에칸은 2000년부터 서비스를 시작한 일본 최대 규모의 음식 배달 서비스로 ABC Studio는 2021년 봄부터 프로덕트 개선에 참여하고 있습니다.Flutter 전환의 마침표 - 일본 1위 배달 앱, 세 번째 Recode 글을 통해 데마에칸의 소비자용 앱(이하 ConsumerApp) 서비스를 Flutter 기술로 전환한 작업을 소개 드린 적이 있습니다. Flutter는 단일 코드 베이스를 활용해 다양한 플랫폼의 애플리케이션을 개발할 수 있는 강력한 크로스 플랫폼 프레임워크입니다. 처음 등장한 후 모바일 앱뿐만 아니라 PC나 웹 환경에서도 활용되면서 점점 개선되고 있습니다.사장님용 앱인 MerchantApp과 ManagerApp은 이미 제품 개선 단계에서 Flutter를 이용해 웹 버전을 활용하고 있었습니다. 특히 ManagerApp은 처음부터 테스트용으로 웹 버전을 내부에 함께 배포했는데요. 기획에서부터 디자인, QA에 이르기까지 제품 개발 과정 전반에 큰 도움이 됐다는 의견을 받았습니다. 또한 가맹점용 앱인 RetailerApp 개발 과정에서는 PR(pull request)이 생성되면 웹 빌드 및 배포를 통해 작업 완료 여부를 판단하는 용도로 실험적으로 활용하기도 했습니다.반면 ConsumerApp에서는 개발 과정에서 웹 버전을 활용하고 있지 않았습니다. 웹 버전을 활용하지 않는 상태에서 지난 3월 UI/UX 개선 과제를 완료했는데요. ConsumerApp은 이해관계자가 많은 서비스인데다가 실제 작동 화면을 꼼꼼히 확인하며 진행해야 하는 과제였던 만큼 진행 과정에서 불편함을 느꼈고, 더 빠르고 효율적으로 서비스를 개선할 수 있는 개발 환경이 필요하다고 판단했습니다. 이번 글에서는 그와 같은 환경을 마련하기 위한 시도 중 하나로 ConsumerApp이 웹에서 작동할 수 있도록 개발 환경을 개선한 사례를 소개합니다.웹 환경에서 ConsumerApp 지원 필요성 확인저희는 아래 그림과 같이 6개의 개발 환경에서 ConsumerApp 제품 개선 활 동을 진행하고 있습니다. 각 환경에서는 병렬로 진행되는 과제나 정기 배포 진행 여부를 판단하기 위한 검증을 진행하며, 이를 통해 출시 일정을 유연하게 조정합니다.현재 내부 테스트나 공유를 위해서 Android는 DeployGate, iOS는 TestFlight 서비스를 이용해 실제 기기에서 작업을 확인하고 있는데요. 많은 인원이 함께 만들고 있기 때문에 실제 기기에서 작업을 확인하려면 개인 및 팀 단위로 계정과 기기를 준비해야 하는 등 불필요하게 예산이 낭비될 수 있습니다. 또한 보안을 유지하기 위해 사내 VPN 연결을 해야만 앱 서비스를 사용할 수 있는데 이를 준비하는 과정도 상당히 번거롭습니다. 이와 같은 이유로 프로덕트 메이커 분들은 프로젝트 진행 중 실제 앱 작동을 확인하면서 커뮤니케이션하기가 쉽지 않습니다.Flutter 기술은 출시 후 꾸준히 멀티 플랫폼 환경에서 개선돼 왔습니다. 데마에칸에서 운영 중인 서비스 앱들은 모두 Flutter로 개발하고 있으며, 덕분에 웹 환경에서도 구동이 가능해졌습니다. 이에 앞서 말씀드린 여러 가지 불편함을 개선하기 위해 ConsumerApp도 웹에서 작동을 확인할 수 있는 개발 환경이 구성되면 좋겠다는 제안이 있었고, 향후 앱 제품 개선 과정에 도움이 될 것이라고 기대하며 개발 팀 주도로 ConsumerApp 웹 작동 환경 구성을 진행했습니다.Flutter Web을 이용해 ConsumerApp 웹 개발 환경을 구축한 과정Flutter Web을 이용해 ConsumerApp 웹 작동 환경을 구성하는 과정은 다음과 같은 순서로 진행했습니다.• 빌드 오류가 발생하는 참조 패키지를 웹 지원 버전으로 업데이트• 로컬 개발 환경에서 CORS 이슈 대응• 웹에서 지도 뷰 표시하기먼저 아래와 같이 로컬 개발 환경에서 로그인 화면 진입까지 실행되도록 작업하는 PoC(Proof of Concept)를 진행했습니다. ConsumerApp은 많은 기능을 제공하고 있으며 다양한 패키지를 참조해 구현돼 있기 때문에 초기 구동 환경만 준비돼도 절반의 준비는 성공한 셈입니다(참고로 ConsumerApp은 Flutter 3.19.5를 사용하고 있습니다).PoC 단계에서 작업한 내용을 바탕으로 아래 그림과 같이 웹 실행이 가능하게 만들기 위해 코드 수정 및 리팩토링이 필요한 부분을 작업 단위 목록으로 정리했습니다. 이와 같이 작업을 도출한 덕분에 이후 사이드 이펙트를 최소화하면서 코드 리뷰에 부담되지 않도록 개발을 나눠 진행할 수 있었습니다.PoC 진행 결과를 토대로 설정한 ConsumerApp Flutter Web 버전의 방향은 아래와 같습니다.• ConsumerApp Flutter Web 버전을 최종 사용자에게 제공하는 것은 목표가 아닙니다. 데마에칸은 이미 웹에서도 서비스를 제공하고 있으며, Flutter Web은 실제 서비스로 활용하기에는 초기 구동 속도가 느리고, 웹 환경에서 상용 서비스 수준으로 활용 가능한 도구가 부족한 점 등의 아쉬운 부분이 있기 때문에 준비 단계에서부터 이미 최종 사용자용으로는 고려하지 않았습니다(참고: Flutter Web or React Native Web: Who Will Win the Battle?).• 실제 기기에서 작동하는 모든 기능이 모바일과 웹에서 완벽히 동일하게 작동하도록 만드는 것은 목표가 아닙니다. 기존에 사용하던 패키지 중 웹 환경을 지원하지 않는 패키지도 있었고, 앱에서 제공하는 기능이 웹에서 제공하기에는 적절치 않은 경우도 있었기 때문입니다. 따라서 동일하게 작동하도록 만들기보다는 인앱 웹뷰, 결제 흐름 등 일부 기능 사용에 제약이 있다는 사실을 공유하고 활용하는 방향으로 결정했습니다.• 웹 실행 환경을 팀에 최적화된 혹은 적합한 환경으로 구성하는 것은 목표가 아닙니다. 현재 ConsumerApp에는 6개의 개발 환경이 있는데요. 우선 그중 하나의 환경에서 ConsumerApp을 웹 환경으로 실행해 활용할 수 있는 수준으로 준비하는 것을 목표로 했습니
2024.09.06
flutter
emoji
좋아요
emoji
별로에요
logo
다양한 시각에서 바라본 Redis (2) 비교
두 번째 글에서는 다양한 친구들과 비교해 본 Redis라는 주제를 다룹니다.mysql, memcached등 redis와 자주 비교되는 친구들이죠.첫 번째 글에서 소개된 개념들이 두 번째 글에서도 중요하게 다뤄지므로, 첫 번째 글을 읽고 오시면 좋습니다.첫 번째 글에서 다룬 내용이기 때문에 링크로 대체하겠습니다.SQL DB는 두 가지 특징을 가지고 있습니다.• None 데이터는 정해진 데이터 스키마에 따라 테이블에 저장된다.• None 데이터는 관계를 통해 여러 테이블에 분산된다.No SQL에는 3가지 유형이 있습니다.키와 값으로 이루어진 데이터베이스입니다.이때 key 값은 unique한 값이어야 하고, 값에는 모든 데이터 타입을 허용합니다.Key-Value Database와 같이 Key-Value 형태로 이루어져 있습니다.하지만 Document Database는 Value에 문서를 저장합니다.데이터를 그래프 형태로 저장하고 관리하는 데이터베이스입니다.노드(Node)와 엣지(Edge)라는 개념을 기반으로 데이터를 표현합니다.이때 노드는 개체(entity)를 나타내고, 엣지는 개체들 간의 관계를 나타냅니다.• None 관계는 각 데이터를 중복없이 한 번만 저장• None 덜 유연함. 데이터 스키마를 사전에 계획하고 알려야 함. (나중에 수정하기 힘듦)• None 관계를 맺고 있어서 조인문이 많은 복잡한 쿼리가 만들어질 수 있음• None 대체로 수직적 확장만 가능함• None 스키마가 없어서 유연함. 언제든지 저장된 데이터를 조정하고 새로운 필드 추가 가능• None 데이터는 애플리케이션이 필요로 하는 형식으로 저장됨. 데이터 읽어오는 속도 빨라짐• None 수직 및 수평 확장이 가능해서 애플리케이션이 발생시키는 모든 읽기/쓰기 요청 처리 가능• None 유연성으로 인해 데이터 구조 결정을 미루게 될 수 있음• None 데이터가 여러 컬렉션에 중복되어 있기 때문에 수정 시 모든 컬렉션에서 수행해야 함 (SQL에서는 중복 데이터가 없으므로 한 번만 수행이 가능)• None• None 실행 결과가 모두 성공하거나 실패하는 성질입니다.• None• None 트랜잭션 전후에 트랜잭션 성공 여부와 상관없이 각 데이터 정합성에 문제가 없음을 의미합니다.• None• None 한 트랜잭션이 다른 트랜잭션에게 영향을 받지도 주지도 않는 성질입니다.• None• None 커밋된 데이터는 데이터베이스에 장애가 발생해도 사라지지 않는 성질입니다.MySQL은 InnoDB를 통해 ACID를 보장합니다.MySQL은 START TRANSACTION, COMMIT, ROLLBACK 명령어를 통해 원자성을 보장합니다.또한 AUTOCOMMIT을 활성화시켜 각 SQL문을 자동으로 개별 트랜잭션으로 처리되게 해 원자성을 보장할 수 있습니다.MySQL은 InnoDB의 더블라이트 버퍼와 충돌 복구를 통해 데이터를 보호해 일관성을 보장할 수 있습니다.MySQL은 READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE 격리 수준을 통해 격리성을 보장합니다.MySQL은 InnoDB 더블라이트 버퍼, innodb_flush_log_at_trx_commit, sync_binlog와 같은 설정 및 배터리 백업 캐시, UPS 등의 하드웨어 구성으로 이를 지원합니다.Redis는 자체 트랜잭션 명령을 통해 원자성을 보장합니다.트랜잭션 블록의 시작을 표시합니다.EXEC가 실행되기 전까지는 명령을 대기열에 추가합니다.대기열에 대기 중인 모든 명령을 실행하고 연결 상태를 정상으로 복원합니다.트랜잭션이 시작된 뒤 대기열에 쌓인 명령어가 실행되지 않고 트랜잭션을 종료합니다.먼저 WATCH를 사용하지 않은 경우를 보겠습니다.• None Telnet 환경에서 NEWJEANS라는 키를 생성한 후 VALUE에 ETA를 할당합니다.• None MULTI 명령를 통해 트랜잭션을 시작합니다.• None EXEC 명령어를 통해 대기열에 있던 명령을 실행시킵니다.• None GET을 통해 NEWJEANS라는 키에 할당된 VALUE 값을 조회합니다.Redis의 트랜잭션 중에는 다른 클라이언트의 명령을 실행시킬 수 있습니다.그래서 Redis의 트랜잭션은 격리성을 보장하지 않습니다.그 대신 Redis는 EXEC를 실행시켰을 때 큐에 있는 모든 명령이 중간에 다른 클라이언트의 명령 없이 연속적으로 실행 돼 원자성을 가지고 있습니다.클라이언트 1이 트랜잭션을 시작한 후, 클라이언트 2에서 NEWJEANS에 HYPEBOY라는 값을 할당했습니다.이때 트랜잭션이라도 다른 클라이언트가 개입을 할 수 있기 때문에 NEWJEANS의 Value가 변경된 것입니다.밑의 링크에 자세히 나와있습니다! (파이프라인 보시면 됩니다)Redis에서는 WATCH 명령을 통해 낙관적 락을 걸어줄 수 있습니다.클라이언트 1에서 WATCH 명령을 통해 NEWJEANS라는 KEY를 감시합니다.트랜잭션이 시작된 후, STACKOVERFLOW라는 Key에 58이라는 Value를 할당합니다.그리고 트랜잭션을 종료하면서 충돌이 있는지 확인을 합니다.이때 트랜잭션이 종료되기 전에 클라이언트 2에서 클라이언트 1에서 감시 중이었던 NEWJEANS라는 키에 값을 할당합니다.그러므로 충돌이 발생했습니다.충돌이 발생했으므로 트랜잭션이 실패합니다.STACKOVERFLOW라는 키를 조회했을 때 nil이 나오는 나오는 이유입니다.UNWATCH 명령을 통해 WATCH로 감시하고 있는 KEY를 해제할 수 있습니다.UNWATCH를 한 후, KEY를 다른 클라이언트에서 변경해도 트랜잭션이 정상적으로 실행됩니다.+ Redis Transaction 중 에러가 발생한다면?1. 대기열에 추가할 때 에러가 발생한 경우 (존재하지 않는 명령을 실행시킨 경우)위 코드에서는 SETSSSS ERROR E와 같은 존재하지 않은 명령을 트랜잭션 안에서 실행했습니다.그 결과 EXECABORT Transaction discarded because of previous errors.라는 문구와 함께 트랜잭션이 실행되지 않습니다.2. 명령어 실행 과정에서 에러가 발생한 경우하지만, 대기열에
memcached
mysql
redis
9/5/2024
logo
다양한 시각에서 바라본 Redis (2) 비교
두 번째 글에서는 다양한 친구들과 비교해 본 Redis라는 주제를 다룹니다.mysql, memcached등 redis와 자주 비교되는 친구들이죠.첫 번째 글에서 소개된 개념들이 두 번째 글에서도 중요하게 다뤄지므로, 첫 번째 글을 읽고 오시면 좋습니다.첫 번째 글에서 다룬 내용이기 때문에 링크로 대체하겠습니다.SQL DB는 두 가지 특징을 가지고 있습니다.• None 데이터는 정해진 데이터 스키마에 따라 테이블에 저장된다.• None 데이터는 관계를 통해 여러 테이블에 분산된다.No SQL에는 3가지 유형이 있습니다.키와 값으로 이루어진 데이터베이스입니다.이때 key 값은 unique한 값이어야 하고, 값에는 모든 데이터 타입을 허용합니다.Key-Value Database와 같이 Key-Value 형태로 이루어져 있습니다.하지만 Document Database는 Value에 문서를 저장합니다.데이터를 그래프 형태로 저장하고 관리하는 데이터베이스입니다.노드(Node)와 엣지(Edge)라는 개념을 기반으로 데이터를 표현합니다.이때 노드는 개체(entity)를 나타내고, 엣지는 개체들 간의 관계를 나타냅니다.• None 관계는 각 데이터를 중복없이 한 번만 저장• None 덜 유연함. 데이터 스키마를 사전에 계획하고 알려야 함. (나중에 수정하기 힘듦)• None 관계를 맺고 있어서 조인문이 많은 복잡한 쿼리가 만들어질 수 있음• None 대체로 수직적 확장만 가능함• None 스키마가 없어서 유연함. 언제든지 저장된 데이터를 조정하고 새로운 필드 추가 가능• None 데이터는 애플리케이션이 필요로 하는 형식으로 저장됨. 데이터 읽어오는 속도 빨라짐• None 수직 및 수평 확장이 가능해서 애플리케이션이 발생시키는 모든 읽기/쓰기 요청 처리 가능• None 유연성으로 인해 데이터 구조 결정을 미루게 될 수 있음• None 데이터가 여러 컬렉션에 중복되어 있기 때문에 수정 시 모든 컬렉션에서 수행해야 함 (SQL에서는 중복 데이터가 없으므로 한 번만 수행이 가능)• None• None 실행 결과가 모두 성공하거나 실패하는 성질입니다.• None• None 트랜잭션 전후에 트랜잭션 성공 여부와 상관없이 각 데이터 정합성에 문제가 없음을 의미합니다.• None• None 한 트랜잭션이 다른 트랜잭션에게 영향을 받지도 주지도 않는 성질입니다.• None• None 커밋된 데이터는 데이터베이스에 장애가 발생해도 사라지지 않는 성질입니다.MySQL은 InnoDB를 통해 ACID를 보장합니다.MySQL은 START TRANSACTION, COMMIT, ROLLBACK 명령어를 통해 원자성을 보장합니다.또한 AUTOCOMMIT을 활성화시켜 각 SQL문을 자동으로 개별 트랜잭션으로 처리되게 해 원자성을 보장할 수 있습니다.MySQL은 InnoDB의 더블라이트 버퍼와 충돌 복구를 통해 데이터를 보호해 일관성을 보장할 수 있습니다.MySQL은 READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE 격리 수준을 통해 격리성을 보장합니다.MySQL은 InnoDB 더블라이트 버퍼, innodb_flush_log_at_trx_commit, sync_binlog와 같은 설정 및 배터리 백업 캐시, UPS 등의 하드웨어 구성으로 이를 지원합니다.Redis는 자체 트랜잭션 명령을 통해 원자성을 보장합니다.트랜잭션 블록의 시작을 표시합니다.EXEC가 실행되기 전까지는 명령을 대기열에 추가합니다.대기열에 대기 중인 모든 명령을 실행하고 연결 상태를 정상으로 복원합니다.트랜잭션이 시작된 뒤 대기열에 쌓인 명령어가 실행되지 않고 트랜잭션을 종료합니다.먼저 WATCH를 사용하지 않은 경우를 보겠습니다.• None Telnet 환경에서 NEWJEANS라는 키를 생성한 후 VALUE에 ETA를 할당합니다.• None MULTI 명령를 통해 트랜잭션을 시작합니다.• None EXEC 명령어를 통해 대기열에 있던 명령을 실행시킵니다.• None GET을 통해 NEWJEANS라는 키에 할당된 VALUE 값을 조회합니다.Redis의 트랜잭션 중에는 다른 클라이언트의 명령을 실행시킬 수 있습니다.그래서 Redis의 트랜잭션은 격리성을 보장하지 않습니다.그 대신 Redis는 EXEC를 실행시켰을 때 큐에 있는 모든 명령이 중간에 다른 클라이언트의 명령 없이 연속적으로 실행 돼 원자성을 가지고 있습니다.클라이언트 1이 트랜잭션을 시작한 후, 클라이언트 2에서 NEWJEANS에 HYPEBOY라는 값을 할당했습니다.이때 트랜잭션이라도 다른 클라이언트가 개입을 할 수 있기 때문에 NEWJEANS의 Value가 변경된 것입니다.밑의 링크에 자세히 나와있습니다! (파이프라인 보시면 됩니다)Redis에서는 WATCH 명령을 통해 낙관적 락을 걸어줄 수 있습니다.클라이언트 1에서 WATCH 명령을 통해 NEWJEANS라는 KEY를 감시합니다.트랜잭션이 시작된 후, STACKOVERFLOW라는 Key에 58이라는 Value를 할당합니다.그리고 트랜잭션을 종료하면서 충돌이 있는지 확인을 합니다.이때 트랜잭션이 종료되기 전에 클라이언트 2에서 클라이언트 1에서 감시 중이었던 NEWJEANS라는 키에 값을 할당합니다.그러므로 충돌이 발생했습니다.충돌이 발생했으므로 트랜잭션이 실패합니다.STACKOVERFLOW라는 키를 조회했을 때 nil이 나오는 나오는 이유입니다.UNWATCH 명령을 통해 WATCH로 감시하고 있는 KEY를 해제할 수 있습니다.UNWATCH를 한 후, KEY를 다른 클라이언트에서 변경해도 트랜잭션이 정상적으로 실행됩니다.+ Redis Transaction 중 에러가 발생한다면?1. 대기열에 추가할 때 에러가 발생한 경우 (존재하지 않는 명령을 실행시킨 경우)위 코드에서는 SETSSSS ERROR E와 같은 존재하지 않은 명령을 트랜잭션 안에서 실행했습니다.그 결과 EXECABORT Transaction discarded because of previous errors.라는 문구와 함께 트랜잭션이 실행되지 않습니다.2. 명령어 실행 과정에서 에러가 발생한 경우하지만, 대기열에
2024.09.05
memcached
mysql
redis
emoji
좋아요
emoji
별로에요
logo
로컬 환경에서 Molecule + Docker 활용한 Ansible Role 단위 테스트하기
안녕하세요, 스푼라디오 SRE 팀에서 DevOps 업무를 맡고 있는 백영진(Paul)입니다. 지난 5년 간, 저희 팀은 AWS의 Multi-Account Multi-Region 환경에서 서비스의 안정성과 확장성을 보장하기 위해 Ansible을 활용한 인프라 자동화 및 CI/CD 배포 시스템을 구축하였습니다. 또한 다양한 운영 체제(AmazonLinux, Ubuntu) 환경에서 Ansible Role을 검증하기 위해 Vagrant & VirtualBox를 사용하여 로컬 환경에서 테스트를 수행해왔습니다. 그러나 Mac M1 기기에서는 Vagrant & VirtualBox 실행에 문제가 있었습니다. 이 문제를 해결하기 위해 Molecule이라는 도구와 Docker 활용해서 Ansible Roles를 테스트 방법에 대해 설명을 하겠습니다.1.Molecule 란 무엇인가?Ansible Molecule은 다양한 시나리오를 기반으로 Ansible Role을 테스트할 수 있는 프레임워크로, 현재 Ansible/Red Hat에 의해 유지 관리되고 있습니다. Molecule은 Docker, Vagrant, EC2, Azure, OpenStack, Podman 등 다양한 드라이버를 제공하여 테스트 환경을 구성할 수 있게 해줍니다. 또한 Ansible Molecule는 지속적 통합(Continuous Integration)를 통해 Ansible Role에 변경이 생길 때마다 테스트 프로세스를 자동화하여 지속적인 테스트를 수행할 수 있습니다.2. Molecule 테스트 환경 구성하기Molecule 테스트를 위해 Docker 컨테이너 환경을 구성하였습니다. 또한, Docker-In-Docker (DinD) 기술을 활용하여, 다양한 운영 체제 환경에서 Ansible Role을 테스트할 수 있도록 환경을 구성 하였습니다. 아래의 Dockerfile을 참고해 주시기 바랍니다.# Python 3.10을 기본 이미지로 설정FROM python:3.10# 필수 패키지 업데이트 및 설치RUN apt-get update && \ apt-get install -y git sudo curl && \ apt-get clean && \ rm -rf /var/lib/apt/lists/*# Docker 설치(DinD)RUN curl -fsSL https://get.docker.com -o get-docker.sh && \ sh get-docker.sh && \ rm get-docker.sh# Ansible 및 Molecule 설치RUN pip install --no-cache-dir ansible molecule docker pytest testinfraRUN python3.10 -m pip install -U "molecule-plugins[docker]"Molecule 실행하기 위해서는 Python 3.10 버전 이상이 필요합니다. Docker-In-Docker를 위해서 Docker 설치 하였고, Molecule 드라이버를 Docker 로 설정하기 위해서 플러그인을 설치 및 검증을 위해 pytest, testinfra 패키지를 설치 하였습니다. Molecule 컨테이너 실행하기 위해서 Docker Compose로 구성하였고, Yaml 파일은 아래와 같습니다.version: '3'services: moleclue: container_name: moleclue build: context: . dockerfile: ./Dockerfile volumes: - "./:/workspace" - "/var/run/docker.sock:/var/run/docker.sock" # (DinD) tty: true로컬 PC에서 Docker Desktop을 이미 설치했다고 가정하고 진행하겠습니다. GitHub에서 데모 프로젝트를 클론 합니다. 데모 프로젝트에는 테스트를 위한 간단한 Ansible Role과 Molecule 환경을 구성 및 실행하기 위한 파일로 구성되어 있습니다.# github clonevagrant@molecule:~$ git clone https://github.com/baiyongzhen/molecule-demoCloning into 'molecule-demo'...remote: Enumerating objects: 30, done.remote: Counting objects: 100% (30/30), done.remote: Compressing objects: 100% (23/23), done.remote: Total 30 (delta 0), reused 27 (delta 0), pack-reused 0Unpacking objects: 100% (30/30), 7.58 KiB | 369.00 KiB/s, done.vagrant@molecule:~$ lsmolecule-demovagrant@molecule:~$ cd molecule-demo/# Molecule 환경 실행vagrant@molecule:~/molecule-demo$ docker-compose up -d[+] Building 4.7s (3/8) => [internal] load .dockerignore 0.2s => => transferring context: 2B# docker ps 명령어를 통해서 컨테이너 실행 상태 확인vagrant@molecule:~/molecule-demo$ docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES60180282c58d molecule-demo-moleclue "python3" 26 seconds ago Up 25 seconds moleclue# docker exec 명령어를 통해서 컨테이너 접속vagrant@molecule:~/molecule-demo$ docker exec -it 60180282c58d /bin/bash# workspace 폴더로 이동root@60180282c58d:/# cd workspace/root@60180282c58d:/workspace# lsDockerfile Vagrantfile bitbucket-runner docker-te
ansible
bitbucket
docker
github
python
9/5/2024
logo
로컬 환경에서 Molecule + Docker 활용한 Ansible Role 단위 테스트하기
안녕하세요, 스푼라디오 SRE 팀에서 DevOps 업무를 맡고 있는 백영진(Paul)입니다. 지난 5년 간, 저희 팀은 AWS의 Multi-Account Multi-Region 환경에서 서비스의 안정성과 확장성을 보장하기 위해 Ansible을 활용한 인프라 자동화 및 CI/CD 배포 시스템을 구축하였습니다. 또한 다양한 운영 체제(AmazonLinux, Ubuntu) 환경에서 Ansible Role을 검증하기 위해 Vagrant & VirtualBox를 사용하여 로컬 환경에서 테스트를 수행해왔습니다. 그러나 Mac M1 기기에서는 Vagrant & VirtualBox 실행에 문제가 있었습니다. 이 문제를 해결하기 위해 Molecule이라는 도구와 Docker 활용해서 Ansible Roles를 테스트 방법에 대해 설명을 하겠습니다.1.Molecule 란 무엇인가?Ansible Molecule은 다양한 시나리오를 기반으로 Ansible Role을 테스트할 수 있는 프레임워크로, 현재 Ansible/Red Hat에 의해 유지 관리되고 있습니다. Molecule은 Docker, Vagrant, EC2, Azure, OpenStack, Podman 등 다양한 드라이버를 제공하여 테스트 환경을 구성할 수 있게 해줍니다. 또한 Ansible Molecule는 지속적 통합(Continuous Integration)를 통해 Ansible Role에 변경이 생길 때마다 테스트 프로세스를 자동화하여 지속적인 테스트를 수행할 수 있습니다.2. Molecule 테스트 환경 구성하기Molecule 테스트를 위해 Docker 컨테이너 환경을 구성하였습니다. 또한, Docker-In-Docker (DinD) 기술을 활용하여, 다양한 운영 체제 환경에서 Ansible Role을 테스트할 수 있도록 환경을 구성 하였습니다. 아래의 Dockerfile을 참고해 주시기 바랍니다.# Python 3.10을 기본 이미지로 설정FROM python:3.10# 필수 패키지 업데이트 및 설치RUN apt-get update && \ apt-get install -y git sudo curl && \ apt-get clean && \ rm -rf /var/lib/apt/lists/*# Docker 설치(DinD)RUN curl -fsSL https://get.docker.com -o get-docker.sh && \ sh get-docker.sh && \ rm get-docker.sh# Ansible 및 Molecule 설치RUN pip install --no-cache-dir ansible molecule docker pytest testinfraRUN python3.10 -m pip install -U "molecule-plugins[docker]"Molecule 실행하기 위해서는 Python 3.10 버전 이상이 필요합니다. Docker-In-Docker를 위해서 Docker 설치 하였고, Molecule 드라이버를 Docker 로 설정하기 위해서 플러그인을 설치 및 검증을 위해 pytest, testinfra 패키지를 설치 하였습니다. Molecule 컨테이너 실행하기 위해서 Docker Compose로 구성하였고, Yaml 파일은 아래와 같습니다.version: '3'services: moleclue: container_name: moleclue build: context: . dockerfile: ./Dockerfile volumes: - "./:/workspace" - "/var/run/docker.sock:/var/run/docker.sock" # (DinD) tty: true로컬 PC에서 Docker Desktop을 이미 설치했다고 가정하고 진행하겠습니다. GitHub에서 데모 프로젝트를 클론 합니다. 데모 프로젝트에는 테스트를 위한 간단한 Ansible Role과 Molecule 환경을 구성 및 실행하기 위한 파일로 구성되어 있습니다.# github clonevagrant@molecule:~$ git clone https://github.com/baiyongzhen/molecule-demoCloning into 'molecule-demo'...remote: Enumerating objects: 30, done.remote: Counting objects: 100% (30/30), done.remote: Compressing objects: 100% (23/23), done.remote: Total 30 (delta 0), reused 27 (delta 0), pack-reused 0Unpacking objects: 100% (30/30), 7.58 KiB | 369.00 KiB/s, done.vagrant@molecule:~$ lsmolecule-demovagrant@molecule:~$ cd molecule-demo/# Molecule 환경 실행vagrant@molecule:~/molecule-demo$ docker-compose up -d[+] Building 4.7s (3/8) => [internal] load .dockerignore 0.2s => => transferring context: 2B# docker ps 명령어를 통해서 컨테이너 실행 상태 확인vagrant@molecule:~/molecule-demo$ docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES60180282c58d molecule-demo-moleclue "python3" 26 seconds ago Up 25 seconds moleclue# docker exec 명령어를 통해서 컨테이너 접속vagrant@molecule:~/molecule-demo$ docker exec -it 60180282c58d /bin/bash# workspace 폴더로 이동root@60180282c58d:/# cd workspace/root@60180282c58d:/workspace# lsDockerfile Vagrantfile bitbucket-runner docker-te
2024.09.05
ansible
bitbucket
docker
github
python
emoji
좋아요
emoji
별로에요
Copyright © 2024. Codenary All Rights Reserved.