
(썸네일 이미지는 Stable Diffusion에 의해 생성되었다.)
Kyla Unit-00는 Neuro Sama같은 버츄얼 AI 스트리머를 만들고 싶어서 시작한 프로젝트였다. MSAI 6기와 병행하느라 진행이 더뎠기 때문에 아직도 버츄얼 캐릭터 모델과 연결하는 단계에는 진입하지 못했다.
처음에는 랭그래프를 활용해 구현할 계획이었다. 랭그래프의 튜토리얼을 참고하며 여러 구성을 테스트해봤고, 가장 초점을 맞췄던 부분은 지출이 0원이면서 가장 방송에 적합한 워크플로우를 찾는 것이었다.
데이터를 로컬에 저장하고 이에 대한 Vector Storage RAG나 Knowledge Graph RAG를 구현해서 정보를 불러오는 등 여러 시도를 했다. 결과는 별로였다. 소요 시간이 너무 길었다. 뿐만 아니라 대화가 길어짐에 따라 응답 소요 시간이 너무 커지기도 했다.
결국 랭그래프를 프로젝트에서 제외하고 LLM의 공식 API를 직접 사용하여 구현하게 되었다. 현재 카일라의 구조는 다음과 같다.
core✅: 상황에 맞는 응답을 생성한다. LLM은 여기에서 사용되고 있다.chzzk✅: 치지직 채팅을 실시간으로 읽어온다.discord✅: 디스코드 메시지를 실시간으로 읽어온다.speach🛠️: 생성된 응답으로부터 음성을 생성한다.memory❌: 상황과 그에 따라 생성되는 응답을 저장한다.모듈 간 통신은 Flask에 의한 REST API로 구현되었다. 각 모듈이 독립적으로 실행되기 때문에 프로토콜 이외의 의존성은 없다.
core✅다른 모듈로부터 정보를 수집해 LLM에 입력한다.
현재는 LLM 인스턴스 한 개가 응답을 생성하고 있다. 함수 호출 등의 추가 기능은 구현되어있지 않다.
응답은 stream 모드로 생성되고 있다. 이를 버퍼에 받아서, 문장이 완성될 때마다 음성으로 변환하는 방향으로 개발을 진행하고 있다.
chzzk✅치지직 채팅을 core 모듈에 전달한다. gunyu1019/chzzkpy를 사용하고 있다.
discord✅디스코드로부터 수신한 메시지를 core 모듈에 전달한다. Rapptz/discord.py 라이브러리를 사용하고 있다.
speach🛠️core로부터 문장을 전달받아 TTS를 수행한다. rany2/edge-tts로 생성한 음성에 myshell-ai/OpenVoice에 의한 Voice Cloning으로 일관된 목소리를 입힌다.
현재 Flask 서버를 추가하는 작업을 앞두고 있다.
memory❌core로부터 상황과 LLM의 응답을 전달받아 파일로 저장한다. 전체적인 데이터를 LLM으로 재가공하여 옵시디언에서 열람 가능한 형식의 문서로 저장하는 기능도 구현된 상태이다.
아직 Flask 서버가 추가되지 않았고, 프로토콜에 맞게 수정되지 않았다.
[v] 가상 인격: 프롬프트 엔지니어링과 메모리 기능을 기반으로 일관된 인격을 형성했다고 판단하고 있다.
[v] 자율적인 사고와 행동: 입력이 주어지지 않아도 스스로 행동하도록 구현되어있다.
[-] 치지직 연동
[v] 치지직 입력: 치지직에서 채팅을 읽어올 수 있다.
[ ] 치지직 출력
[-] 디스코드 연동
[v] 디스코드 입력: 디스코드에서 메시지를 읽어올 수 있다.
[ ] 디스코드 출력
[ ] 버츄얼 캐릭터 연동
[ ] 치지직에서의 첫 스트리밍
앞으로의 블로그 포스팅은 하루 1개가 아니라 일주일에 1개 정도로 줄어들 예정이다.
지난 한 주 동안 카일라의 작업에 손을 거의 댈 수 없었다. MSAI 6기 활동에 전념하느라 여유가 안 나기도 했고, 수업이 끝난 뒤에 코딩 테스트에 대비한 문제 풀이도 추가로 진행하고 있다.
앞으로의 개발은 지금보다 더 느리게 진행될 것이다. 하지만 프로젝트를 포기할 생각은 없다.