2025년 9월 15일 월요일

노코드 도구 flowise 사용기

AI 채팅 플로우를 만드는 데 최적화된 노코드 도구입니다. LLM, RAG, 에이전트 등 AI 관련 기능을 시각적으로 쉽게 조합할 수 있다.


AI 개발에 최적화: RAG(문서 기반 답변) 챗봇이나 AI 에이전트를 매우 쉽고 빠르게 만들 수 있다.
직관적인 UI: AI 모델과 프롬프트를 연결하는 과정이 시각적이고 간단하여 입문자가 사용하기 좋다.
빠른 프로토타이핑: AI 챗봇 아이디어를 몇 분 만에 테스트 가능한 프로토타입으로 만들 수 있다.

제한적인 자동화 기능: 다른 앱(슬랙, 구글 시트 등)과 연동하여 복잡한 업무 자동화를 구현하는 기능은 약하다.
챗봇 외 기능 부족: 사용자와 상호작용하는 챗봇이나 채팅 API 외의 다른 종류의 앱을 만들기 어렵다.

반면 n8n은 서로 다른 앱과 서비스들을 연결하여 반복적인 업무를 자동화하는 워크플로우를 만드는 데 강력하다. AI 모델을 자동화의 한 단계로 사용할 수는 있지만, Flowise처럼 RAG나 에이전트 같은 복잡한 AI 로직을 설계하기는 어렵다. 사용자 화면을 만드는 기능이 없어 순수하게 백엔드 자동화에만 집중한다.

2025년 9월 10일 수요일

LLM 동작 메커니즘과 최신 기술 분석

이 글은 LLM 동작 메커니즘과 최신 기술 분석 내용을 나눔한다.

MoE 개념

최신 대규모 언어모델의 기술적 기법들은 크게 효율성과 성능 향상을 동시에 추구하는 방향으로 발전하고 있다. 우선 혼합 전문가 구조라 불리는 MoE 기법은 수많은 전문가 모듈 중 일부만 선택적으로 활성화하여 연산 효율을 극대화하는 방식이다. 게이트 네트워크가 입력 토큰의 은닉 상태를 보고 가장 적합한 전문가를 확률적으로 선택하고 선택된 전문가만 계산에 참여하기 때문에 전체 연산량은 줄어들면서도 특정 전문가가 특정 패턴에 특화되도록 학습된다. 이 과정에서 균형을 잡기 위해 부가적인 로드 밸런싱 손실이 함께 도입된다.

또한 파라미터 효율적 미세조정 기법들이 각광받고 있다. LoRA와 같은 방법은 거대한 모델의 전체 파라미터를 업데이트하지 않고 저차원 어댑터 행렬만 학습해도 충분히 성능을 낼 수 있도록 한다. 이 방식은 저장 공간과 학습 자원을 크게 줄이면서도 다양한 도메인에 빠르게 적응할 수 있다는 장점이 있다.

양자화와 프루닝 역시 중요하다. 양자화는 모델 파라미터를 16비트나 8비트 같은 저정밀도로 표현하여 메모리 사용량과 연산 속도를 개선한다. 프루닝은 중요도가 낮은 가중치를 제거함으로써 모델 크기를 줄이고 효율을 높인다. 이 두 기법은 실제 배포 환경에서의 속도와 비용 문제를 해결하는 핵심적 방법으로 활용된다.

메모리와 추론 속도를 개선하기 위한 기법으로는 효율적 어텐션 구조가 있다. 전통적인 어텐션은 시퀀스 길이에 따라 연산량이 제곱으로 늘어나는데 이를 완화하기 위해 플래시 어텐션과 같은 최적화 기법이 개발되었다. 이 방식은 GPU의 메모리 대역폭을 최대한 활용하면서도 연산을 줄여 긴 시퀀스 처리 능력을 크게 향상시킨다.

데이터 품질과 안전성을 강화하기 위한 학습 전략도 주목된다. 인간 피드백을 통한 강화학습 기법인 RLHF는 모델이 단순히 언어를 생성하는 수준을 넘어 사용자의 의도와 선호를 반영하도록 만든다. 최근에는 직접적인 강화학습 대신 선호 데이터만으로 지도학습을 수행하는 DPO와 같은 방식이 도입되어 학습의 안정성과 단순성이 개선되고 있다.

이와 함께 다중 모달 학습이 확대되고 있다. 텍스트뿐 아니라 이미지 음성 코드 등 다양한 데이터를 하나의 모델이 동시에 이해하고 생성할 수 있도록 설계하는 것이다. 이는 언어 중심에서 벗어나 실제 세계와 상호작용하는 범용 인공지능의 기반이 된다.

요약하면 최신 언어모델은 전문가를 선택적으로 활용하는 MoE 구조 파라미터 효율적 학습을 위한 LoRA 양자화와 프루닝 같은 최적화 메모리 효율적 어텐션 구조 인간 피드백 기반 학습 전략 그리고 다중 모달 통합 학습이라는 축 위에서 진화하고 있는 것이다.


레퍼런스

2025년 8월 22일 금요일

Text, wav 를 통한 입술 모양 이미지 생성 방법

이 글은 Text, wav 를 통한 입술 모양 이미지 생성 방법을 간략히 정리해 본다.

서론
디지털 휴먼 및 가상 아바타 기술의 발전에 따라, 텍스트 입력에 대한 실시간 립 애니메이션 생성 기술의 중요성이 증대되고 있다. 전통적인 방식은 텍스트로부터 완전한 오디오 파일을 생성한 후, 해당 파일을 기반으로 비디오 프레임을 합성하는 배치(Batch) 처리 방식을 채택한다. 그러나 이 방식은 오디오 파일 생성과 비디오 렌더링에 소요되는 시간으로 인해 상당한 지연(Latency)이 발생하며, 실시간 상호작용 애플리케이션에는 부적합하다. 본 글은 실시간 텍스트립싱크를 구현하기 위한 핵심 기술 요소를 분석한다.

실시간 립싱크 구현을 위한 핵심 파이프라인
실시간 립싱크 시스템은 단일 모델이 아닌, 두 가지 핵심 기술이 순차적으로 결합된 파이프라인(Pipeline) 구조로 구현된다.

1.  스트리밍 텍스트음성 변환 (Streaming TexttoSpeech, TTS)
 실시간성을 확보하기 위한 첫 번째 단계는 스트리밍 TTS 엔진이다. 이는 입력 텍스트를 완성된 오디오 파일로 변환하는 것이 아니라, 연속적인 오디오 데이터 스트림(Stream)으로 즉시 생성하는 기술이다. 텍스트가 입력되는 즉시 오디오 청크(Chunk)가 생성되어 파이프라인의 후속 단계로 전달되므로, 전체 문장이 끝날 때까지 기다릴 필요가 없다. 이는 전체 지연 시간을 최소화하는 데 결정적인 역할을 한다.

2.  저지연 얼굴 애니메이션 (Lowlatency Facial Animation)
    두 번째 단계는 스트리밍 TTS로부터 전달받은 오디오 청크를 입력받아, 이에 상응하는 입 모양 애니메이션을 즉각적으로 생성하는 모델이다. 이 모델은 오디오 파형, 음소(Phoneme), 또는 음성 특징(Feature)을 분석하여 얼굴 모델의 특정 파라미터를 제어한다. 여기서 핵심은 최소한의 연산으로 최대한 자연스러운 움직임을 생성하여, 오디오와 시각적 출력 사이의 동기화를 유지하는 것이다.

구현 방식에 따른 기술적 접근
실시간 립싱크는 요구되는 성능과 사용 가능한 하드웨어 자원에 따라 다양한 접근 방식이 존재한다.

1. 고성능 GPU 기반 솔루션: NVIDIA Riva 및 Audio2Face
NVIDIA에서 제공하는 이 솔루션은 현재 가장 높은 수준의 실시간성과 품질을 제공하는 산업 표준으로 평가된다. NVIDIA Riva는 고성종 스트리밍 TTS 엔진의 역할을 수행하며, Audio2Face는 Riva로부터 생성된 오디오 스트림을 입력받아 3D 아바타의 얼굴 메쉬(Mesh)를 실시간으로 정교하게 제어한다. 이 방식은 RTX 시리즈 이상의 고성능 GPU를 요구하지만, 매우 낮은 지연 시간과 사실적인 표정 변화를 구현할 수 있다는 장점이 있다.

2. 경량화 오픈소스 모델 조합
제한된 하드웨어 환경에서는 경량화된 오픈소스 모델을 조합하여 시스템을 구축할 수 있다. 예를 들어, 빠른 추론 속도를 보이는 LivePortrait 또는 Wav2Lip과 같은 얼굴 애니메이션 모델과 PiperTTS와 같은 경량 스트리밍 TTS 엔진을 결합하는 방식이다. 이 접근법은 시스템의 전체적인 연산량을 줄여 소비자용 GPU 또는 CPU 환경에서도 실시간 처리를 가능하게 하는 것을 목표로 한다. 다만, 각 구성 요소를 연결하고 최적화하는 추가적인 개발 과정이 요구된다.

MediaPipe
MediaPipe 라이브러리는 립싱크 시스템 구축에 있어 중요한 기반 기술을 제공한다. MediaPipe의 Face Landmarker 기능은 이미지나 비디오 프레임에서 478개의 3D 얼굴 랜드마크와 52개의 블렌드셰이프(Blendshapes)를 정밀하게 추출한다. 블렌드셰이프는 '입 벌리기', '미소' 등 특정 표정의 강도를 수치화한 데이터로, 3D 모델을 제어하는 표준 파라미터로 사용된다.

그러나 MediaPipe 자체는 오디오 데이터를 해석하여 립싱크 애니메이션을 생성하는 기능을 포함하고 있지 않다. MediaPipe는 단지 얼굴의 기하학적 구조와 표정을 '표현'하고 '측정'하는 도구일 뿐이다. 따라서 MediaPipe를 활용한 립싱크 시스템을 구축하기 위해서는, 오디오 스트림을 입력받아 이에 상응하는 블렌드셰이프 값을 예측하는 별도의 '오디오투블렌드셰이프(AudiotoBlendshape)' 변환 모델이 반드시 필요하다. 이 모델이 오디오 분석 엔진의 역할을 수행하며, MediaPipe는 그 결과를 받아 시각적으로 렌더링하는 후처리단에 위치하게 된다.

결론
실시간 텍스트 기반 립싱크는 단순한 모델 하나가 아닌, 스트리밍 TTS와 저지연 얼굴 애니메이션 모델이 유기적으로 결합된 파이프라인을 통해 구현되는 복합적인 기술이다. 고성능 환경에서는 NVIDIA의 솔루션이, 자원이 제한된 환경에서는 경량화된 오픈소스 모델들의 조합이 효과적인 대안이 될 수 있다. MediaPipe와 같은 라이브러리는 얼굴 애니메이션의 최종 출력단을 담당하는 핵심적인 구성 요소이지만, 그 자체만으로는 완전한 립싱크 솔루션이 될 수 없으며 오디오를 해석하는 별도의 AI 모델과의 연동이 필수적이다. 

레퍼런스

2025년 8월 21일 목요일

Coding 기반 애니메이션 생성 방법

이 글은 Coding 기반 애니메이션 생성 방법을 보여준다.


from manim import *

class SquareToCircle(Scene):
    def construct(self):
        circle = Circle()
        square = Square()
        square.flip(RIGHT)
        square.rotate(-3 * TAU / 8)
        circle.set_fill(PINK, opacity=0.5)

        self.play(Create(square))
        self.play(Transform(square, circle))
        self.play(FadeOut(square))

레퍼런스

2025년 7월 8일 화요일

인공지능 멀티 에이전트 개발 방법 정리

이 글은 인공지능 멀티 에이전트 개발 방법을 정리한 것이다. 

기술스택
crewai
높은 수준의 프레임워크로 포지셔닝된 CrewAI는 다양한 방식으로 협업할 수 있는 롤플레잉 에이전트로 구성된 "크루"의 생성이 용이하다. 

설치는 uv를 이용한다. 참고로, 현재 시점(2025.7)에서 윈도우 버전 설치는 불안정(참고)하며, 우분투 리눅스에 uv로 설치하면 좀 더 쉽게 설치할 수 있다. 
uv venv 
uv tool install crewai
다음은 관련 예제이다.
Langchain
langgraph
엄밀히 말하면 다중 에이전트 프레임워크는 아니지만 LangGraph를 사용하면 그래프 구조를 사용하여 행위자 간의 복잡한 상호 작용을 정의한다.
Autogen
Microsoft에서 개발한 AutoGen은 대화형 접근 방식을 사용하며 다중 에이전트 시스템을 위한 초기 프레임워크 중 하나이다.

Swarm
기타, Carmel, Agno 등이 있다. 

레퍼런스

2025년 7월 7일 월요일

확실하게 성공하는 바이브 코딩 도구 사용 방법

이 글은 확실하게 성공하는 바이브 코딩 도구 사용 방법을 보여준다. 여기서는 바이브 코딩 도구로 PRD(Product Requirement Document) 작성은 Gemini Pro, 바이브 코딩 도구는 Github Copilot, 대형언어모델 LLM은 Claude Sonet을 사용했다(LLM은 본인 입맛에 맞게 사용하면 됨).

바이브 코딩 준비하기
바이브 코딩을 하는 방법은 다음과 같이 다양하다. 
  1. ChatGPT 에 코딩 요청을 해서 생성된 파이썬 같은 코드를 복사&붙여넣기해 프로그램을 완성해 나가는 방법
  2. Gemini CLI, Claude code CLI, codex CLI 도구를 사용해 프로젝트 파일 및 소스코드를 생성하는 방법
  3. vscode 같은 개발 IDE와 연동되는 github copilot, cursor, windsurf와 같은 도구를 사용해 바이브 코딩하는 방법
  4. Bubble.io나 Canva와 같은 바이브 코딩 웹서비스에서 직접 요구사항을 입력하여 제공 클라우드에 앱을 생성 빌드 실행하는 방법 
여기서는 로컬PC에서 프로젝트 소스 파일들을 생성하고 직접 수정할 수 있도록 vscode에서 바이브 코딩할 수 있는 방법을 취한다. 이를 위해 다음 환경을 미리 준비한다.

요구사항 작성하기
바이브 코딩 목적은 텍스트 편집기를 개발하는 것이다. 이를 위한 PRD를 작성하고, 바이브 코딩을 진행한다. PRD작성을 위해 프롬프트를 다음과 같이 입력한다. 

GUI 기반 텍스트 편집기를 개발할꺼야. 파이썬과 Tkinter 라이브러리를 이용할꺼야. 메뉴는 파일 메뉴, 편집 메뉴, 테마 선택 메뉴(다크모드 하위 메뉴 포함), 찾기 메뉴로 구성됨. 이 프로그램 개발을 위한 PRD를 UI 스케치를 포함해 md 포맷으로 작성해.

사용할 라이브러리와 같은 기술 스택을 지정하는 것은 중요하다. 약간 시행착오를 하며 명확한 PRD가 작성될 수 있도록 프롬프트에 정확한 정보를 포함시킨다. md 포맷은 좀 더 명확한 문서형식작성을 위해 사용했다. md포맷은 markdown 파일형식으로 github에서 README 파일 작성할때 표준 형식이다. 

다음은 이렇게 생성된 제품 요구사항 문서이다.

# **Python/Tkinter 기반 GUI 텍스트 편집기 제품 요구사항 명세서 (PRD)**

## **1. 개요**

본 문서는 파이썬(Python)과 표준 GUI 라이브러리인 티케이인터(Tkinter)를 사용하여 개발될 데스크톱 텍스트 편집기의 요구사항을 정의합니다. 이 애플리케이션은 기본적인 텍스트 편집 기능과 함께 사용자의 편의를 위한 다크 모드, 찾기 기능 등을 제공하는 것을 목표로 합니다.

## **2. 목표 사용자**

  * **초보 개발자 및 학생**: 간단한 코드나 스크립트, 메모, 과제 등을 작성하고 편집하려는 사용자.
  * **일반 사용자**: Windows 메모장과 같은 가볍고 빠른 텍스트 편집기가 필요한 사용자.

## **3. 핵심 기능**

### **3.1. 파일 메뉴**

| 기능 | 단축키 | 설명 |
| :--- | :--- | :--- |
| **새 파일** | `Ctrl+N` | 새로운 빈 편집 창을 엽니다. |
| **열기** | `Ctrl+O` | 기존 텍스트 파일 (`.txt` 등)을 불러옵니다. |
| **저장** | `Ctrl+S` | 현재 파일을 덮어쓰기 저장합니다. |
| **다른 이름으로 저장** | `Ctrl+Shift+S` | 새 이름이나 경로로 파일을 저장합니다. |
| **종료** | `Alt+F4` | 프로그램을 종료합니다. (저장되지 않은 내용이 있으면 경고) |

### **3.2. 편집 메뉴**

| 기능 | 단축키 | 설명 |
| :--- | :--- | :--- |
| **실행 취소 (Undo)** | `Ctrl+Z` | 마지막 작업을 되돌립니다. |
| **다시 실행 (Redo)** | `Ctrl+Y` | 되돌린 작업을 다시 실행합니다. |
| **잘라내기** | `Ctrl+X` | 선택한 텍스트를 잘라내 클립보드에 저장합니다. |
| **복사** | `Ctrl+C` | 선택한 텍스트를 클립보드에 복사합니다. |
| **붙여넣기** | `Ctrl+V` | 커서 위치에 클립보드의 내용을 붙여넣습니다. |

### **3.3. 테마 선택 메뉴**

| 기능 | 설명 |
| :--- | :--- |
| **라이트 모드** | 기본 테마 (흰 배경, 검은 글씨)를 적용합니다. |
| **다크 모드** | 어두운 테마 (회색/검은 배경, 흰 글씨)를 적용합니다. |

### **3.4. 찾기 메뉴**

| 기능 | 단축키 | 설명 |
| :--- | :--- | :--- |
| **찾기** | `Ctrl+F` | 문서 내에서 특정 문자열을 검색할 수 있는 입력창 또는 대화상자를 엽니다. |

-----

## **4. 기술 스택**

  * **프로그래밍 언어**: **Python 3.x**
  * **GUI 라이브러리**: **Tkinter** (파이썬 표준 라이브러리)

-----

## **5. UI 스케치**

애플리케이션의 전체적인 레이아웃 스케치입니다.

```
+----------------------------------------------------------------------+
| My Text Editor                                                 - □ X |
+----------------------------------------------------------------------+
| 파일(F) | 편집(E) | 테마(T) | 찾기(S)                                |
+----------------------------------------------------------------------+
| |                                                                  |
| |                                                                  |
| |                                                                  |
| |         ##############################################           |
| |         #                                            #           |
| |         #    사용자가 텍스트를 입력하는 메인 영역    #           |
| |         #                                            #           |
| |         ##############################################           |
| |                                                                  |
| |                                                                  |
| |                                                                  |
| |                                                                  |
+----------------------------------------------------------------------+
| 줄: 1, 열: 1                                                    UTF-8  |
+----------------------------------------------------------------------+
```

**UI 구성 요소:**

  * **제목 표시줄**: 프로그램 이름과 창 조절 버튼이 표시됩니다.
  * **메뉴 바**: 파일, 편집, 테마, 찾기 메뉴가 위치하며, 각 메뉴 클릭 시 하위 메뉴 항목들이 나타납니다.
  * **텍스트 영역**: 스크롤 가능한 주 텍스트 편집 공간입니다.
  * **상태 표시줄**: 하단에 커서의 현재 위치(줄, 열)나 인코딩 같은 간단한 상태 정보를 보여줍니다.

-----

## **6. 성공 지표**

  * 명시된 모든 메뉴 기능(파일 I/O, 편집, 테마 변경, 찾기)이 정상적으로 작동합니다.
  * 다크 모드와 라이트 모드 간 전환이 즉시 UI에 반영됩니다.
  * 프로그램이 안정적으로 실행되며, 일반적인 사용 환경에서 오류로 인해 종료되지 않습니다.

vscode에서 바이브 코딩하기
vscode를 실행하고, 생성된 PRD파일을 copilot에 알려주고, 이대로 프로그램 작성하도록 입력한다. 

혹시, 에러가 발생하면, 메시지를 다시 입력해 수정하는 과정을 반복하면 된다. 다음 영상은 바이브 코딩 과정을 보여준다.

결과적으로 큰 문제 없이 편집기가 동작되는 것을 확인할 수 있다.

결론
바이브 코딩이 최근 매우 발전해서, 요구사항도 추론해주고, 심지어 SRS(Software Requirement Specification), SAD(Software Architecture Document)도 작성해 준다. 향후에는 말만 하면, 소프트웨어 공학에서 필수로 다루는 SRS, SAD뿐 아니라, UML(Unified Modeling Language)과 같은 아키텍처 설계도도 디자인패턴에 의거해 그려줄 날이 멀지 않은 것 같다.

다만, 소프트웨어 개발 과정에서 바이브 코딩 도구에 일을 시키려면, 당연히, 인턴에 업무 지시하는 수준의 능력은 필요하다. 

예를 들어, 바이브 코딩 시 적절한 용어를 사용해야 하며, 수정되지 않은 어려운 문제나 에러가 발생하면, 생성된 코드를 이해하고 개선할 수 있는 능력은 당연히 필요하다 하겠다. 

부록: 웹기반 텍스트 편집기 개발 및 깃허브 푸쉬하기
추가로, Tailwind 로 웹 기반 편집기도 개발해 보았다. 다음과 같이 자동으로 프로젝트 만들어 코딩되고, 실행된다. 
프로젝트 코드 작성 중
완성된 웹 텍스트 편집기
미완성된 메뉴에 대해 추가 요청
모두 완성된 메뉴 기능
Github 푸쉬 요청

다음은 이렇게 개발된 프로젝트 코드이다.