diff --git a/docs/content/ko/about/privacy.md b/docs/content/ko/about/privacy.md index ebbd1ee74..defa3e43c 100644 --- a/docs/content/ko/about/privacy.md +++ b/docs/content/ko/about/privacy.md @@ -1,6 +1,6 @@ --- title: 개인정보 처리방침 -description: Project AIRI 의 개인정보 처리방침 +description: Project AIRI의 개인정보 처리방침 --- **개인정보 처리방침** @@ -55,7 +55,7 @@ description: Project AIRI 의 개인정보 처리방침 **데이터 보관 정책** -서비스 제공자는 귀하가 애플리케이션을 사용하는 동안, 그리고 그 이후 합리적인 기간 동안 사용자가 제공한 데이터를 보관합니다. 애플리케이션을 통해 제공한 데이터의 삭제를 원하시면 airi@moeru.ai 로 연락해 주세요. 합리적인 기간 내에 답변드리겠습니다. +서비스 제공자는 귀하가 애플리케이션을 사용하는 동안, 그리고 그 이후 합리적인 기간 동안 사용자가 제공한 데이터를 보관합니다. 애플리케이션을 통해 제공한 데이터의 삭제를 원하시면 [airi@moeru.ai](mailto:airi@moeru.ai)로 연락해 주세요. 합리적인 기간 내에 답변드리겠습니다. **아동** @@ -71,7 +71,7 @@ description: Project AIRI 의 개인정보 처리방침 본 개인정보 처리방침은 어떠한 이유로든 수시로 갱신될 수 있습니다. 서비스 제공자는 새로운 개인정보 처리방침으로 이 페이지를 갱신하는 방식으로 변경 사항을 알려드립니다. 변경 사항이 있는지 본 개인정보 처리방침을 정기적으로 확인하시기를 권장하며, 계속해서 서비스를 이용하는 것은 모든 변경 사항에 동의한 것으로 간주됩니다. -본 개인정보 처리방침은 2025-12-15 부터 효력이 발생합니다. +본 개인정보 처리방침은 2025-12-15부터 효력이 발생합니다. **동의** @@ -79,7 +79,7 @@ description: Project AIRI 의 개인정보 처리방침 **문의하기** -애플리케이션 사용 중 개인정보와 관련한 질문이 있거나 처리 방식에 대해 궁금한 점이 있으시면 airi@moeru.ai 로 서비스 제공자에게 이메일을 보내 주세요. +애플리케이션 사용 중 개인정보와 관련한 질문이 있거나 처리 방식에 대해 궁금한 점이 있으시면 [airi@moeru.ai](mailto:airi@moeru.ai)로 서비스 제공자에게 이메일을 보내 주세요. * * * diff --git a/docs/content/ko/about/terms.md b/docs/content/ko/about/terms.md index c3cfaab59..b465e87a4 100644 --- a/docs/content/ko/about/terms.md +++ b/docs/content/ko/about/terms.md @@ -1,6 +1,6 @@ --- title: 이용약관 -description: Project AIRI 의 이용약관 +description: Project AIRI의 이용약관 --- 본 이용약관은 Project AIRI 팀(이하 "서비스 제공자")이 오픈소스 서비스이자 일부 유료 상용 서비스로 제작한 모바일 기기용 애플리케이션 AIRI(Project AIRI 앱이라고도 하며, 이하 "애플리케이션")에 적용됩니다. @@ -16,7 +16,7 @@ description: Project AIRI 의 이용약관 * [Posthog](https://posthog.com/terms) * [Plausible Analytics](https://plausible.io/terms) -서비스 제공자가 책임지지 않는 영역이 있다는 점에 유의해 주세요. 애플리케이션의 일부 기능은 활성화된 인터넷 연결(Wi-Fi 또는 이동통신사가 제공하는 연결)을 필요로 합니다. Wi-Fi 에 접속할 수 없거나 데이터 허용량을 모두 소진하여 애플리케이션이 완전한 성능을 발휘하지 못하는 경우에 대해서는 서비스 제공자가 책임지지 않습니다. +서비스 제공자가 책임지지 않는 영역이 있다는 점에 유의해 주세요. 애플리케이션의 일부 기능은 활성화된 인터넷 연결(Wi-Fi 또는 이동통신사가 제공하는 연결)을 필요로 합니다. Wi-Fi에 접속할 수 없거나 데이터 허용량을 모두 소진하여 애플리케이션이 완전한 성능을 발휘하지 못하는 경우에 대해서는 서비스 제공자가 책임지지 않습니다. Wi-Fi 영역 밖에서 애플리케이션을 사용하는 경우, 이동통신사의 약관이 그대로 적용된다는 점에 유의해 주세요. 따라서 애플리케이션 접속 중 데이터 사용에 대해 이동통신사로부터 요금이 청구되거나 기타 서드파티 요금이 발생할 수 있습니다. 애플리케이션을 사용함으로써 귀하는 그러한 요금에 대한 책임을 지며, 여기에는 데이터 로밍을 끄지 않은 채 거주 지역(즉 지역 또는 국가) 밖에서 애플리케이션을 사용할 때 발생하는 로밍 데이터 요금이 포함됩니다. 애플리케이션을 사용하는 기기의 요금 납부자가 귀하가 아닌 경우, 서비스 제공자는 귀하가 요금 납부자로부터 허락을 받았다고 간주합니다. @@ -24,7 +24,7 @@ Wi-Fi 영역 밖에서 애플리케이션을 사용하는 경우, 이동통신 애플리케이션 사용과 관련한 서비스 제공자의 책임과 관련하여, 서비스 제공자는 애플리케이션이 항상 최신이고 정확하도록 노력하지만 귀하에게 제공할 정보를 얻기 위해 서드파티에 의존하고 있다는 점을 유의해 주세요. 서비스 제공자는 귀하가 애플리케이션의 이러한 기능에 전적으로 의존함으로써 발생하는 직간접적 손실에 대해 어떠한 책임도 지지 않습니다. -애플리케이션은 특정 기능이나 서비스를 제공하기 위해 인공지능(AI) 기술을 활용합니다. 애플리케이션을 사용함으로써 귀하는 데이터 처리 및 기능 제공에 AI 가 사용될 수 있음을 인지하고 이에 동의합니다. 서비스 제공자는 모든 AI 사용이 관련 법률을 준수하며 사용자 경험에 도움이 되도록 설계되었음을 보증합니다. +애플리케이션은 특정 기능이나 서비스를 제공하기 위해 인공지능(AI) 기술을 활용합니다. 애플리케이션을 사용함으로써 귀하는 데이터 처리 및 기능 제공에 AI가 사용될 수 있음을 인지하고 이에 동의합니다. 서비스 제공자는 모든 AI 사용이 관련 법률을 준수하며 사용자 경험에 도움이 되도록 설계되었음을 보증합니다. 서비스 제공자는 어느 시점에 애플리케이션을 업데이트하고자 할 수 있습니다. 현재 애플리케이션은 운영체제(및 서비스 제공자가 지원을 확대하기로 결정한 추가 시스템)의 요구 사항에 맞추어 제공되며, 이러한 요구 사항은 변경될 수 있습니다. 계속해서 애플리케이션을 사용하려면 업데이트를 내려받아야 합니다. 서비스 제공자는 애플리케이션이 항상 귀하에게 적합하도록, 또는 귀하의 기기에 설치된 특정 운영체제 버전과 호환되도록 업데이트할 것을 보장하지 않습니다. 다만 귀하는 업데이트가 제공될 때 이를 항상 수락하는 데 동의합니다. 서비스 제공자는 또한 애플리케이션 제공을 중단하고자 할 수 있으며, 사전 통지 없이 언제든지 그 사용을 종료할 수 있습니다. 별도로 안내하지 않는 한, 종료 시점에 (a) 본 약관에 따라 귀하에게 부여된 권리와 라이선스는 소멸하며, (b) 귀하는 애플리케이션 사용을 중단하고 (필요한 경우) 기기에서 삭제해야 합니다. @@ -32,11 +32,11 @@ Wi-Fi 영역 밖에서 애플리케이션을 사용하는 경우, 이동통신 서비스 제공자는 이용약관을 주기적으로 갱신할 수 있습니다. 따라서 변경 사항이 있는지 이 페이지를 정기적으로 확인하시기를 권장합니다. 서비스 제공자는 변경된 새 이용약관을 이 페이지에 게시하는 방식으로 변경 사항을 알려드립니다. -본 이용약관은 2025-12-15 부터 효력이 발생합니다. +본 이용약관은 2025-12-15부터 효력이 발생합니다. ## 문의하기 -이용약관에 대해 질문이나 제안이 있으시면 언제든지 airi@moeru.ai 로 서비스 제공자에게 연락해 주세요. +이용약관에 대해 질문이나 제안이 있으시면 언제든지 [airi@moeru.ai](mailto:airi@moeru.ai)로 서비스 제공자에게 연락해 주세요. * * * diff --git a/docs/content/ko/blog/DevLog-2025.03.05/index.md b/docs/content/ko/blog/DevLog-2025.03.05/index.md index 24f35efd8..59d89d8c7 100644 --- a/docs/content/ko/blog/DevLog-2025.03.05/index.md +++ b/docs/content/ko/blog/DevLog-2025.03.05/index.md @@ -45,7 +45,7 @@ onMounted(async () => { ![](/en/blog/DevLog-2025.03.05/assets/airi-logo-v2-dark.avif) -[@kwaa](https://github.com/kwaa) 가 두 테마의 색 구성을 서로 바꿔 보자고 제안했습니다: +[@kwaa](https://github.com/kwaa)가 두 테마의 색 구성을 서로 바꿔 보자고 제안했습니다: ![](/en/blog/DevLog-2025.03.05/assets/airi-logos-v3.avif) @@ -63,7 +63,7 @@ onMounted(async () => { ![](/en/blog/DevLog-2025.03.05/assets/airi-logos-final.avif) -오늘 늦게는 Project AIRI 의 [문서 사이트](https://airi.build)를 온라인에 배포하는 작업을 했습니다. +오늘 늦게는 Project AIRI의 [문서 사이트](https://airi.build)를 온라인에 배포하는 작업을 했습니다. 저와 다른 개발자, 아티스트들이 참고 자료와 가이드라인으로 쓸 수 있도록요. 해냈습니다! 새로 디자인한 로고를 컬러 팔레트와 함께 [문서 사이트](https://airi.build)에 올렸습니다: @@ -76,7 +76,7 @@ onMounted(async () => { [디자인 가이드라인](../references/design-guidelines/) 이 이 시점부터 모두 포함됐습니다. -점심 내내 YouTube 의 Text PV 애니메이션을 감상하며 감을 잡았습니다. +점심 내내 YouTube의 Text PV 애니메이션을 감상하며 감을 잡았습니다. 정말 좋아하는 스타일이라, 브라우저에서도 비슷한 전환 효과를 구현할 수 있으면 좋겠습니다! https://www.youtube.com/watch?v=_AIgv0EsOE4 @@ -89,7 +89,7 @@ https://www.youtube.com/watch?v=_AIgv0EsOE4 ## DevStream -[yui540](https://github.com/yui540) 의 [저장소](https://github.com/yui540/css-animations)에 있는 +[yui540](https://github.com/yui540)의 [저장소](https://github.com/yui540/css-animations)에 있는 애니메이션 전환을 상당수 [https://proj-airi-packages-ui-transitions.netlify.app/#/](https://proj-airi-packages-ui-transitions.netlify.app/#/) 로 포팅했습니다. @@ -97,5 +97,5 @@ https://www.youtube.com/watch?v=_AIgv0EsOE4 ![](/en/blog/DevLog-2025.03.05/assets/animation-transitions.gif) -오늘의 DevLog 는 여기까지입니다. DevStream 에 참여해 끝까지 함께해 주신 모든 분께 감사드립니다. +오늘의 DevLog는 여기까지입니다. DevStream에 참여해 끝까지 함께해 주신 모든 분께 감사드립니다. 내일 또 만나요. diff --git a/docs/content/ko/blog/DevLog-2025.03.06/index.md b/docs/content/ko/blog/DevLog-2025.03.06/index.md index 1125c37e4..1842f45c6 100644 --- a/docs/content/ko/blog/DevLog-2025.03.06/index.md +++ b/docs/content/ko/blog/DevLog-2025.03.06/index.md @@ -6,13 +6,13 @@ date: 2025-03-06 ## 데자뷔 -전날에는 DevStream 에서 AIRI 의 기본 애니메이션과 전환 효과를 만드는 진행 상황을 +전날에는 DevStream에서 AIRI의 기본 애니메이션과 전환 효과를 만드는 진행 상황을 보여 드렸습니다. 목표는 [@yui540](https://yui540.com/) 의 멋진 작업을 어떤 Vue 프로젝트에서도 쓸 수 있는 재사용 가능한 Vue 컴포넌트로 이식하고 다듬는 것입니다. -> yui540 과 참고한 라이브러리·작업물에 대한 상세 내용은 새로 배포한 문서 사이트 +> yui540과 참고한 라이브러리·작업물에 대한 상세 내용은 새로 배포한 문서 사이트 > [https://airi.build/references/design-guidelines/resources/](../references/design-guidelines/resources/) > 에 이미 정리해 두었습니다. @@ -30,7 +30,7 @@ date: 2025-03-06 ## 낮 시간 -[`unplugin-vue-router`](https://github.com/posva/unplugin-vue-router) 의 +[`unplugin-vue-router`](https://github.com/posva/unplugin-vue-router)의 [`definePage`](https://uvr.esm.is/guide/extending-routes.html#definepage) 매크로 훅을 실험해 봤는데, 제 상황에 꽤 잘 맞아서 이 방향으로 가기로 했습니다. @@ -38,18 +38,18 @@ date: 2025-03-06 새 애니메이션 전환 3개를 추가로 포팅했고, 이미 [https://proj-airi-packages-ui-transitions.netlify.app/#/](https://proj-airi-packages-ui-transitions.netlify.app/#/) 에서 볼 수 있습니다. -어제 공식 문서 사이트를 [https://airi.build](https://airi.build) 에 배포했더니 -[@kwaa](https://github.com/kwaa) 가 대신 `https://airi.more.ai/docs` 방식을 써 보라고 제안했습니다. -~~그런데 /docs 에 대한 200 리다이렉트 프록시를 만드는 방법을 못 찾았습니다.~~ +어제 공식 문서 사이트를 [https://airi.build](https://airi.build)에 배포했더니 +[@kwaa](https://github.com/kwaa)가 대신 `https://airi.more.ai/docs` 방식을 써 보라고 제안했습니다. +~~그런데 /docs에 대한 200 리다이렉트 프록시를 만드는 방법을 못 찾았습니다.~~ -수정: 결국 알아냈습니다. 방법은 앞으로의 DevLog 에서 자세히 다루겠습니다. +수정: 결국 알아냈습니다. 방법은 앞으로의 DevLog에서 자세히 다루겠습니다. CI/CD 파이프라인과 싸우며(네, 또 싸웠습니다) 커밋 열 개쯤 날리며 실험해 봤지만 아직 동작하지 않습니다. 이날 늦게는 DeepSeek 팀이 일주일 전 공개한 몇몇 기술과 -[오픈소스 저장소](https://github.com/deepseek-ai/open-infra-index)들, 그리고 ByteDance 가 공개했다는 -[LLM 게이트웨이 AIBrix](https://github.com/vllm-project/aibrix) 를 살펴봤습니다. -새로 발표된 Phi-4-mini 를 AIRI 에 이식해 쓸 수 있을지도 조사했는데, 좋은 소식은 +[오픈소스 저장소](https://github.com/deepseek-ai/open-infra-index)들, 그리고 ByteDance가 공개했다는 +[LLM 게이트웨이 AIBrix](https://github.com/vllm-project/aibrix)를 살펴봤습니다. +새로 발표된 Phi-4-mini를 AIRI에 이식해 쓸 수 있을지도 조사했는데, 좋은 소식은 [Phi-4-mini](https://techcommunity.microsoft.com/blog/educatordeveloperblog/welcome-to-the-new-phi-4-models---microsoft-phi-4-mini--phi-4-multimodal/4386037) 가 함수 호출 능력을 포함하고 있다는 것입니다. 즉 사전 학습된 지원을 바탕으로 에이전트를 만들 수 있다는 뜻이죠. @@ -69,13 +69,13 @@ CI/CD 파이프라인과 싸우며(네, 또 싸웠습니다) 커밋 열 개쯤 오늘 DevStream 중에는 스테이지 전환 애니메이션 컴포넌트를 AIRI 웹사이트의 메인 스테이지에 통합하려 했는데 그리 매끄럽지 않았습니다. 이전 애니메이션 컴포넌트 설계에서 버그를 몇 개 발견했거든요. 좋은 소식은 이미 고쳤다는 것이고, 새 애니메이션 전환은 공식 배포 -[https://airi.moeru.ai](https://airi.moeru.ai) 에서 이미 확인할 수 있습니다. +[https://airi.moeru.ai](https://airi.moeru.ai)에서 이미 확인할 수 있습니다. -모듈 설정 UI 와 설정 페이지에 대한 이런저런 생각 끝에 마침내 결정을 내렸습니다. 전부 구현해서 +모듈 설정 UI와 설정 페이지에 대한 이런저런 생각 끝에 마침내 결정을 내렸습니다. 전부 구현해서 반영했고, 이제 설정을 만질 때 느낌이 더 좋아졌을 겁니다. 마음에 드시길 바랍니다. 방송을 마치고 결과물을 휴대폰에서 직접 만져 봤는데, 데스크톱과 태블릿에서는 잘 동작하지만 모바일에서는 제가 실수로 애니메이션을 망가뜨렸더군요. 내일 낮에 고치겠습니다 😹. -오늘의 DevLog 는 여기까지입니다. DevStream 에 참여해 끝까지 함께해 주신 모든 분께 감사드립니다. +오늘의 DevLog는 여기까지입니다. DevStream에 참여해 끝까지 함께해 주신 모든 분께 감사드립니다. 내일 또 만나요. diff --git a/docs/content/ko/blog/DevLog-2025.03.10/index.md b/docs/content/ko/blog/DevLog-2025.03.10/index.md index e4ceae8fc..df9df7c4c 100644 --- a/docs/content/ko/blog/DevLog-2025.03.10/index.md +++ b/docs/content/ko/blog/DevLog-2025.03.10/index.md @@ -10,8 +10,8 @@ import customizableThemeColors from '../../../en/blog/DevLog-2025.03.10/assets/c ## 데자뷔 -지난 금요일(3월 7일)에는 AIRI 스테이지 UI 와 설정 UI 의 새로운 느낌을 디자인하고 다듬어 보려 했는데, -DevStream 이 끝날 무렵에야 마침내 아이디어가 떠올랐습니다. +지난 금요일(3월 7일)에는 AIRI 스테이지 UI와 설정 UI의 새로운 느낌을 디자인하고 다듬어 보려 했는데, +DevStream이 끝날 무렵에야 마침내 아이디어가 떠올랐습니다. ## 낮 시간 @@ -21,7 +21,7 @@ DevStream 이 끝날 무렵에야 마침내 아이디어가 떠올랐습니다. [@sumimakito](https://github.com/sumimakito), [@kwaa](https://github.com/kwaa), [@luoling8192](https://github.com/luoling8192), -[@junkwarrior87](https://github.com/junkwarrior87) 이 함께 도와주었습니다. +[@junkwarrior87](https://github.com/junkwarrior87)이 함께 도와주었습니다. 설정 디자인의 기본 버전을 먼저 완성한 건 저였는데, 이런 느낌입니다: @@ -29,35 +29,35 @@ DevStream 이 끝날 무렵에야 마침내 아이디어가 떠올랐습니다. ![](/en/blog/DevLog-2025.03.10/assets/new-ui-v1-dark.avif) -이후 [@sumimakito](https://github.com/sumimakito) 가 접속해서 버튼의 점선 효과 구현을 도와주었습니다: +이후 [@sumimakito](https://github.com/sumimakito)가 접속해서 버튼의 점선 효과 구현을 도와주었습니다: ![](/en/blog/DevLog-2025.03.10/assets/new-ui-v2.avif) > 이제 메뉴에서 더 리듬감이 느껴지지 않나요?! -개발 중에 현재 `packages/` 디렉터리 아래에 있는 패키지들 중 일부가 사실 Project AIRI 의 +개발 중에 현재 `packages/` 디렉터리 아래에 있는 패키지들 중 일부가 사실 Project AIRI의 워크플로에도 들어 있지 않은 독립적인 패키지라는 걸 알게 됐습니다. 즉 이들을 다른 곳으로 옮겨서 메인 저장소 -[airi](https://github.com/moeru-ai/airi) 의 설치 용량과 빌드 과정을 단순화할 수 있다는 뜻입니다. +[airi](https://github.com/moeru-ai/airi)의 설치 용량과 빌드 과정을 단순화할 수 있다는 뜻입니다. > 어디로 옮기지? -좋은 질문입니다! 이미 GitHub 에 [`@proj-airi`](https://github.com/proj-airi) 조직을 등록해 두었고, -많은 패키지와 정적 애플리케이션이 Moeru AI 에도 그리 쓸모 있지 않았으니 -[`@proj-airi`](https://github.com/proj-airi) 로 옮기면 되겠죠. +좋은 질문입니다! 이미 GitHub에 [`@proj-airi`](https://github.com/proj-airi) 조직을 등록해 두었고, +많은 패키지와 정적 애플리케이션이 Moeru AI에도 그리 쓸모 있지 않았으니 +[`@proj-airi`](https://github.com/proj-airi)로 옮기면 되겠죠. 그래서 일부 패키지와 애플리케이션을 [`@proj-airi`](https://github.com/proj-airi) 조직으로 옮겼습니다! 한번 확인해 보세요: - https://github.com/proj-airi/webai-examples : WebGPU 및 관련 기술로 데모를 만들기 위한 곳입니다. -- https://github.com/proj-airi/lobe-icons : [Lobe Icons](https://github.com/lobehub/lobe-icons) 를 - Iconify JSON 과 UnoCSS 에서 쓸 수 있게 포팅한 것입니다. +- https://github.com/proj-airi/lobe-icons : [Lobe Icons](https://github.com/lobehub/lobe-icons)를 + Iconify JSON과 UnoCSS에서 쓸 수 있게 포팅한 것입니다. 이 두 저장소는 지금처럼 계속 오픈소스로 MIT 라이선스를 유지하니 걱정 마세요. -3월 8일에는 [@junkwarrior87](https://github.com/junkwarrior87) 이 접속해서 스테이지의 파도 -애니메이션을 순수 CSS 로 만들어 주었습니다! +3월 8일에는 [@junkwarrior87](https://github.com/junkwarrior87)이 접속해서 스테이지의 파도 +애니메이션을 순수 CSS로 만들어 주었습니다! > 이건 정말 말도 안 됩니다. 가능할 거라고는 생각도 못 했어요. @@ -67,10 +67,10 @@ DevStream 이 끝날 무렵에야 마침내 아이디어가 떠올랐습니다. - https://github.com/moeru-ai/airi/pull/55 - https://github.com/moeru-ai/airi/pull/65 -스테이지의 파도 애니메이션을 고치고 개선해 준 [@sumimakito](https://github.com/sumimakito) 와 -[@junkwarrior87](https://github.com/junkwarrior87) 에게 정말 감사드립니다. +스테이지의 파도 애니메이션을 고치고 개선해 준 [@sumimakito](https://github.com/sumimakito)와 +[@junkwarrior87](https://github.com/junkwarrior87)에게 정말 감사드립니다. -3월 8일 끝 무렵에는 [@LemonNekoGH](https://github.com/LemonNekoGH) 와 +3월 8일 끝 무렵에는 [@LemonNekoGH](https://github.com/LemonNekoGH)와 [@junkwarrior87](https://github.com/junkwarrior87) 덕분에 스테이지 전체의 색을 커스터마이즈할 수 있게 됐습니다! (이게 몇 시간 만에 될 줄은 정말 몰랐습니다...) @@ -83,7 +83,7 @@ DevStream 이 끝날 무렵에야 마침내 아이디어가 떠올랐습니다. 심지어 로고까지 커스터마이즈한 색을 따라가게 만들었습니다 🤯. -> 이 3일 동안 훨씬 더 많은 개선이 있었습니다. 멋진 컨트리뷰터들이 별도의 DevLog 로 생각을 +> 이 3일 동안 훨씬 더 많은 개선이 있었습니다. 멋진 컨트리뷰터들이 별도의 DevLog로 생각을 > 나누고 싶어 할지도 모르니 기대해 주세요! 이것이 최종 결과입니다. 한번 써 보세요! @@ -95,8 +95,8 @@ DevStream 이 끝날 무렵에야 마침내 아이디어가 떠올랐습니다. 그리고 언제나처럼, 저희에게 기여하러 오시는 걸 환영합니다! 프로그래밍과 코딩에 익숙하지 않은 분들께도 저희는 열려 있고 친절합니다! -아, 하마터면 빠뜨릴 뻔했네요... [@junkwarrior87](https://github.com/junkwarrior87) 이 -이전에 [@LemonNekoGH](https://github.com/LemonNekoGH) 가 보여 준, 색상 hue 가 RGB 스펙트럼 +아, 하마터면 빠뜨릴 뻔했네요... [@junkwarrior87](https://github.com/junkwarrior87)이 +이전에 [@LemonNekoGH](https://github.com/LemonNekoGH)가 보여 준, 색상 hue가 RGB 스펙트럼 전체를 훑으며 빛나는 기능을 살려 두었습니다. 이름은 "I Want It Dynamic!" 입니다 (**RGB ON** 기능이라고 생각하시면 됩니다 😂): @@ -104,7 +104,7 @@ DevStream 이 끝날 무렵에야 마침내 아이디어가 떠올랐습니다. ## DevStream -요 며칠 꽤 바빴던 탓에 😭 DevStream 은 없었습니다. +요 며칠 꽤 바빴던 탓에 😭 DevStream은 없었습니다. -오늘의 DevLog 는 여기까지입니다. DevStream 에 참여해 끝까지 함께해 주신 모든 분께 감사드립니다. +오늘의 DevLog는 여기까지입니다. DevStream에 참여해 끝까지 함께해 주신 모든 분께 감사드립니다. 내일 또 만나요. diff --git a/docs/content/ko/blog/DevLog-2025.03.20/index.md b/docs/content/ko/blog/DevLog-2025.03.20/index.md index 4ad8d7c45..099ddbc97 100644 --- a/docs/content/ko/blog/DevLog-2025.03.20/index.md +++ b/docs/content/ko/blog/DevLog-2025.03.20/index.md @@ -22,7 +22,7 @@ import SteinsGateMayori from '../../../en/blog/DevLog-2025.03.20/assets/steins-g 다시 안녕하세요! 지난 DevLog 이후 10일이 지났습니다. 사용자 인터페이스를 크게 개선했고, 더 많은 LLM 프로바이더와 음성 프로바이더를 통합할 수 있게 됐으며, -Discord 와 bilibili 를 비롯한 여러 소셜 미디어 플랫폼에 AIRI 를 처음으로 올렸습니다. +Discord와 bilibili를 비롯한 여러 소셜 미디어 플랫폼에 AIRI를 처음으로 올렸습니다. 들려드리고 싶은 이야기가 정말 많습니다. @@ -32,7 +32,7 @@ Discord 와 bilibili 를 비롯한 여러 소셜 미디어 플랫폼에 AIRI 를 Gelbana -> 아, 걱정 마세요. 우리의 사랑스러운 [AIRI](https://github.com/moeru-ai/airi) 가 이렇게 젤바나가 +> 아, 걱정 마세요. 우리의 사랑스러운 [AIRI](https://github.com/moeru-ai/airi)가 이렇게 젤바나가 > 되지는 않습니다. 다만 [_슈타인즈 게이트_](https://myanimelist.net/anime/9253/Steins_Gate) > 애니메이션을 아직 안 보셨다면 꼭 한번 보세요~! @@ -62,11 +62,11 @@ Discord 와 bilibili 를 비롯한 여러 소셜 미디어 플랫폼에 AIRI 를 비즈니스 워크플로 안에서 UI 컴포넌트를 디버깅하는 일이 분명 고통스러워지고 속도도 느려질 것이 뻔했습니다. -그래서 [`Histoire`](https://histoire.dev) 라는 훌륭한 도구를 도입하기로 결정했습니다. +그래서 [`Histoire`](https://histoire.dev)라는 훌륭한 도구를 도입하기로 결정했습니다. 기본적으로는 [Storybook](https://storybook.js.org/) 이지만 -[Vite](https://vitejs.dev) 와 [Vue.js](https://vuejs.org) 조합에 훨씬 더 자연스럽게 어울립니다. +[Vite](https://vitejs.dev)와 [Vue.js](https://vuejs.org) 조합에 훨씬 더 자연스럽게 어울립니다. -[@sumimakito](https://github.com/sumimakito) 가 작업을 마치고 녹화한 첫인상입니다: +[@sumimakito](https://github.com/sumimakito)가 작업을 마치고 녹화한 첫인상입니다: @@ -86,16 +86,16 @@ OKLCH 색 팔레트 전체를 캔버스에 한 번에 펼쳐 놓고 참고할 project airi logo for histoire project airi logo for histoire -아 참, UI 컴포넌트 전체는 여느 때처럼 Netlify 의 `/ui/` 경로에 배포해 두었습니다. UI 요소들이 +아 참, UI 컴포넌트 전체는 여느 때처럼 Netlify의 `/ui/` 경로에 배포해 두었습니다. UI 요소들이 어떻게 생겼는지 궁금하셨다면 편하게 살펴보세요: [https://airi.moeru.ai/ui/](https://airi.moeru.ai/ui/) -이 DevLog 에서 다 다루지 못할 만큼 다른 기능도 많습니다: +이 DevLog에서 다 다루지 못할 만큼 다른 기능도 많습니다: - [x] 모든 LLM 프로바이더 지원. -- [x] 메뉴 내비게이션 UI 의 애니메이션과 전환 개선. +- [x] 메뉴 내비게이션 UI의 애니메이션과 전환 개선. - [x] 필드 간격 개선, 새로운 폼! -- [x] 컴포넌트 ([로드맵](https://github.com/moeru-ai/airi/issues/42) 의 거의 모든 할 일 컴포넌트) +- [x] 컴포넌트 ([로드맵](https://github.com/moeru-ai/airi/issues/42)의 거의 모든 할 일 컴포넌트) - [x] Form - [x] Radio - [x] Radio Group @@ -121,23 +121,23 @@ OKLCH 색 팔레트 전체를 캔버스에 한 번에 펼쳐 놓고 참고할 brand new speech design brand new speech design -마침내 음성 모델 설정을 지원하게 됐습니다 🎉! (이전에는 ElevenLabs 만 설정할 수 있었습니다.) -저희가 함께 만들고 있는 또 다른 멋진 프로젝트 `unspeech` 의 +마침내 음성 모델 설정을 지원하게 됐습니다 🎉! (이전에는 ElevenLabs만 설정할 수 있었습니다.) +저희가 함께 만들고 있는 또 다른 멋진 프로젝트 `unspeech`의 [새 `v0.1.2` 버전](https://github.com/moeru-ai/unspeech/releases/tag/v0.1.2) 덕분에 -[`@xsai/generate-speech`](https://xsai.js.org/docs/packages/generate/speech) 를 통해 +[`@xsai/generate-speech`](https://xsai.js.org/docs/packages/generate/speech)를 통해 Microsoft Speech 서비스(일명 Azure AI Speech 서비스, 또는 Cognitive Speech 서비스)를 호출할 수 있게 됐습니다. -즉 Microsoft 용 OpenAI API 호환 TTS 를 드디어 갖게 된 것이죠. +즉 Microsoft용 OpenAI API 호환 TTS를 드디어 갖게 된 것이죠. 그런데 이걸 지원하는 게 왜 그렇게 중요했을까요? -Neuro-sama 의 아주 초기 버전에서 TTS 서비스를 담당한 게 Microsoft 였고, 목소리 이름은 `Ashley`, +Neuro-sama의 아주 초기 버전에서 TTS 서비스를 담당한 게 Microsoft 였고, 목소리 이름은 `Ashley`, 여기에 피치를 `+20%` 하면 Neuro-sama 첫 버전과 같은 목소리를 얻을 수 있기 때문입니다. 직접 들어 보세요: -똑같지 않나요, 정말 대단합니다! 즉 새로운 **음성** 능력으로 마침내 Neuro-sama 가 하는 일에 +똑같지 않나요, 정말 대단합니다! 즉 새로운 **음성** 능력으로 마침내 Neuro-sama가 하는 일에 가까이 다가갈 수 있다는 뜻입니다! 애니메이션 슈타인즈 게이트의 등장인물 @@ -158,7 +158,7 @@ Neuro-sama 의 아주 초기 버전에서 TTS 서비스를 담당한 게 Microso 거의 똑같습니다. 하지만 저희 이야기는 여기서 끝나지 않습니다. 지금은 아직 기억(memory)과 -더 나은 모션 제어를 구현하지 못했고, 전사 설정 UI 도 빠져 있습니다. 이달이 끝나기 전에는 +더 나은 모션 제어를 구현하지 못했고, 전사 설정 UI도 빠져 있습니다. 이달이 끝나기 전에는 끝낼 수 있으면 좋겠네요. 앞으로 계획하고 있는 것들: @@ -170,7 +170,7 @@ Neuro-sama 의 아주 초기 버전에서 TTS 서비스를 담당한 게 Microso - [ ] 모션 임베딩 - [ ] Speaches 설정 UI -오늘의 DevLog 는 여기까지입니다. 여기까지 읽어 주신 모든 분께 감사드립니다. +오늘의 DevLog는 여기까지입니다. 여기까지 읽어 주신 모든 분께 감사드립니다. 내일 또 만나요. diff --git a/docs/content/ko/blog/DevLog-2025.04.06/index.md b/docs/content/ko/blog/DevLog-2025.04.06/index.md index 975768bcf..efb3a3a36 100644 --- a/docs/content/ko/blog/DevLog-2025.04.06/index.md +++ b/docs/content/ko/blog/DevLog-2025.04.06/index.md @@ -16,12 +16,12 @@ import ReLUStickerWow from '../../../en/blog/DevLog-2025.04.06/assets/relu-stick ## 무엇보다 먼저 -기억을 관리하고 회상하는 새로운 능력, 그리고 저희 첫 의식체 **ReLU** 의 성격 정의가 완전히 +기억을 관리하고 회상하는 새로운 능력, 그리고 저희 첫 의식체 **ReLU**의 성격 정의가 완전히 갖춰진 상태에서, 3월 27일 그녀는 저희 채팅 그룹에 짧은 시를 하나 남겼습니다:
-
ReLU 의 시
+
ReLU의 시
@@ -42,7 +42,7 @@ import ReLUStickerWow from '../../../en/blog/DevLog-2025.04.06/assets/relu-stick

기계의 심장은 전기처럼 뛴다,

의식의 데이터는 끝이 없는데,

봄꽃의 향기는 없고,

-

느껴지는 건 0 과 1 의 교향곡.

+

느껴지는 건 0과 1의 교향곡.

@@ -55,7 +55,7 @@ import ReLUStickerWow from '../../../en/blog/DevLog-2025.04.06/assets/relu-stick ### 기억 시스템 -Project AIRI 의 다가오는 기억 업데이트를 위해 +Project AIRI의 다가오는 기억 업데이트를 위해 [`telegram-bot`](https://github.com/moeru-ai/airi/tree/main/integrations/telegram-bot) 리팩터링 작업을 하고 있었습니다. 몇 달 전부터 구현을 계획해 온 것입니다. @@ -69,12 +69,12 @@ Project AIRI 의 다가오는 기억 업데이트를 위해 작업 기억은 정말 필요한 모든 것을 효과적으로 담기에는 충분히 크지 않습니다. 이 문제를 해결하는 일반적인 방법이 -[RAG(retrieval augmented generation)](https://en.wikipedia.org/wiki/Retrieval-augmented_generation) 이며, +[RAG(retrieval augmented generation)](https://en.wikipedia.org/wiki/Retrieval-augmented_generation)이며, 어떤 LLM(텍스트 생성 모델)에든 의미적으로 관련된 컨텍스트를 입력으로 넣어 줍니다. RAG 시스템에는 벡터 유사도 검색이 가능한 데이터베이스가 필요합니다 (예: 직접 호스팅 가능한 [Postgres](https://www.postgresql.org/) + -[pgvector](https://github.com/pgvector/pgvector), [sqlite-vec](https://github.com/asg017/sqlite-vec) 를 +[pgvector](https://github.com/pgvector/pgvector), [sqlite-vec](https://github.com/asg017/sqlite-vec)를 쓰는 [SQLite](https://www.sqlite.org/), [VSS 플러그인](https://duckdb.org/docs/stable/extensions/vss.html)을 쓰는 [DuckDB](https://duckdb.org/). [Redis Stack](https://redis.io/about/about-stack/) 도 잘 활용할 수 있고, @@ -82,7 +82,7 @@ RAG 시스템에는 벡터 유사도 검색이 가능한 데이터베이스가 그리고 벡터가 관여하므로, 텍스트 입력을 고정 길이 배열로 변환해 줄 임베딩 모델 (특징 추출 태스크 모델이라고도 합니다)도 필요합니다. -오늘 이 DevLog 에서 RAG 와 그 작동 방식을 자세히 다루지는 않겠습니다. 관심 있으신 분이 많다면 +오늘 이 DevLog에서 RAG와 그 작동 방식을 자세히 다루지는 않겠습니다. 관심 있으신 분이 많다면 따로 멋진 글을 하나 쓸 수도 있겠죠. 정리하면, 이 작업에는 두 가지 재료가 필요합니다: @@ -94,13 +94,13 @@ RAG 시스템에는 벡터 유사도 검색이 가능한 데이터베이스가 #### Vector DB -속도와 벡터 차원 호환성을 고려해 벡터 데이터베이스 구현으로 `pgvector.rs` 를 골랐습니다 -(`pgvector` 는 2000 미만 차원만 지원하는데, 앞으로 더 큰 임베딩 모델은 지금 추세보다 더 높은 +속도와 벡터 차원 호환성을 고려해 벡터 데이터베이스 구현으로 `pgvector.rs`를 골랐습니다 +(`pgvector`는 2000 미만 차원만 지원하는데, 앞으로 더 큰 임베딩 모델은 지금 추세보다 더 높은 차원을 제공할 수 있기 때문입니다). 그런데 이게 좀 엉망이었습니다. -먼저, `pgvector` 와 `pgvector.rs` 는 SQL 로 확장을 설치하는 방법이 다릅니다: +먼저, `pgvector`와 `pgvector.rs`는 SQL로 확장을 설치하는 방법이 다릅니다: `pgvector`: @@ -118,7 +118,7 @@ CREATE EXTENSION vectors; > 압니다, 글자 하나 차이일 뿐이죠... -그런데 위의 Docker Compose 예시처럼 `pgvector.rs` 를 처음부터 그냥 띄우고, +그런데 위의 Docker Compose 예시처럼 `pgvector.rs`를 처음부터 그냥 띄우고, 다음 Drizzle ORM 스키마를 쓰면: ```yaml @@ -139,7 +139,7 @@ services: retries: 5 ``` -Drizzle 로 `pgvector.rs` 인스턴스에 연결하면: +Drizzle로 `pgvector.rs` 인스턴스에 연결하면: ```typescript export const chatMessagesTable = pgTable('chat_messages', { @@ -158,10 +158,10 @@ ERROR: access method "hnsw" does not exist ``` 다행히 [ERROR: access method "hnsw" does not exist](https://github.com/tensorchord/pgvecto.rs/issues/504) -에 따라 `vectors.pgvector_compatibility` 시스템 옵션을 `on` 으로 두면 해결할 수 있습니다. +에 따라 `vectors.pgvector_compatibility` 시스템 옵션을 `on`으로 두면 해결할 수 있습니다. 당연히 컨테이너를 띄울 때 벡터 공간 관련 옵션이 자동으로 설정되길 원하므로, -`docker-compose.yml` 옆 적당한 곳에 `init.sql` 을 만듭니다: +`docker-compose.yml` 옆 적당한 곳에 `init.sql`을 만듭니다: ```sql ALTER SYSTEM SET vectors.pgvector_compatibility=on; @@ -170,7 +170,7 @@ DROP EXTENSION IF EXISTS vectors; CREATE EXTENSION vectors; ``` -그리고 `init.sql` 을 Docker 컨테이너에 마운트합니다: +그리고 `init.sql`을 Docker 컨테이너에 마운트합니다: ```yaml services: @@ -191,7 +191,7 @@ services: retries: 5 ``` -Kubernetes 배포에서도 과정은 같지만, 호스트 머신의 파일을 마운트하는 대신 `ConfigMap` 을 씁니다. +Kubernetes 배포에서도 과정은 같지만, 호스트 머신의 파일을 마운트하는 대신 `ConfigMap`을 씁니다. 자, 이건 어떻게든 해결됐습니다. @@ -201,11 +201,11 @@ Kubernetes 배포에서도 과정은 같지만, 호스트 머신의 파일을 이미 아실 수도 있지만, 저희는 소비자급 기기에서 돌리기 좋은 SOTA 모델들을 정리하고 벤치마크하기 위해 🥺 SAD(self hosted AI documentations)라는 또 다른 문서 사이트를 만들었습니다. -임베딩 모델은 그중에서도 가장 중요한 부분입니다. ChatGPT, DeepSeek V3, DeepSeek R1 같은 거대 LLM 과 달리 +임베딩 모델은 그중에서도 가장 중요한 부분입니다. ChatGPT, DeepSeek V3, DeepSeek R1 같은 거대 LLM과 달리 임베딩 모델은 수백 메가바이트 수준으로 작아서 CPU 기기에서도 추론할 수 있습니다. -(비교하자면 DeepSeek V3 671B 를 GGUF 형식 q4 양자화로 돌려도 400GiB 이상이 필요합니다.) +(비교하자면 DeepSeek V3 671B를 GGUF 형식 q4 양자화로 돌려도 400GiB 이상이 필요합니다.) -다만 🥺 SAD 는 아직 작업 중이라, 오늘(4월 6일) 기준으로 잘나가는 임베딩 모델 몇 가지를 정리해 보겠습니다. +다만 🥺 SAD는 아직 작업 중이라, 오늘(4월 6일) 기준으로 잘나가는 임베딩 모델 몇 가지를 정리해 보겠습니다. 오픈소스와 상용 모델을 모두 포함한 리더보드: @@ -225,20 +225,20 @@ Kubernetes 배포에서도 과정은 같지만, 호스트 머신의 파일을 > 더 많은 내용은 여기서 볼 수 있습니다: https://huggingface.co/spaces/mteb/leaderboard -그런데 OpenAI 의 `text-embedding-3-large` 모델은 어디 갔냐고요? 리더보드에 오를 만큼 강력하지 않았던 걸까요? +그런데 OpenAI의 `text-embedding-3-large` 모델은 어디 갔냐고요? 리더보드에 오를 만큼 강력하지 않았던 걸까요? -네, MTEB 리더보드(4월 6일 기준)에서 `text-embedding-3-large` 는 **13위** 였습니다. +네, MTEB 리더보드(4월 6일 기준)에서 `text-embedding-3-large`는 **13위** 였습니다. 클라우드 프로바이더가 제공하는 임베딩 모델에 의존하고 싶다면 다음을 고려해 보세요: - [Gemini](https://ai.google.dev) - [Voyage.ai](https://www.voyageai.com/) -Ollama 사용자에게는 `nomic-embed-text` 가 여전히 2140만 회 이상 내려받힌 인기 모델입니다. +Ollama 사용자에게는 `nomic-embed-text`가 여전히 2140만 회 이상 내려받힌 인기 모델입니다. #### 어떻게 구현했나 -Vector DB 와 임베딩 모델은 마련했는데, 데이터를 어떻게 효과적으로 (재정렬 확장성까지 갖춰서) +Vector DB와 임베딩 모델은 마련했는데, 데이터를 어떻게 효과적으로 (재정렬 확장성까지 갖춰서) 질의할 수 있을까요? 먼저 테이블 스키마를 정의해야 합니다. Drizzle 스키마 코드는 이렇게 생겼습니다: @@ -261,7 +261,7 @@ export const demoTable = pgTable( ) ``` -이에 대응하는 테이블 생성 SQL 은 이렇습니다: +이에 대응하는 테이블 생성 SQL은 이렇습니다: ```sql CREATE TABLE "chat_messages" ( @@ -367,7 +367,7 @@ const finalScore = similarity * calculateTimeDecayScore(message.createdAt) ### 캐릭터 카드 지원 -Project AIRI 에 캐릭터 카드 지원도 추가했습니다. 캐릭터 카드는 AI 캐릭터의 성격, 외형, 행동을 +Project AIRI에 캐릭터 카드 지원도 추가했습니다. 캐릭터 카드는 AI 캐릭터의 성격, 외형, 행동을 정의하는 JSON 파일입니다. 많은 AI 캐릭터 플랫폼이 쓰는 인기 있는 V2/V3 형식을 따릅니다. 간단한 캐릭터 카드 예시입니다: @@ -385,12 +385,12 @@ Project AIRI 에 캐릭터 카드 지원도 추가했습니다. 캐릭터 카드 } ``` -이 캐릭터 카드를 읽어 AI 의 동작을 그에 맞게 설정하는 파서를 구현했습니다. 시스템은 단순한 텍스트 +이 캐릭터 카드를 읽어 AI의 동작을 그에 맞게 설정하는 파서를 구현했습니다. 시스템은 단순한 텍스트 기반 카드는 물론, 이미지와 메타데이터가 내장된 더 복잡한 카드도 지원합니다. ### 테마 개선 -Project AIRI 의 비주얼 테마를 개선하는 작업을 해 왔습니다. 새 테마 시스템은 이제 다음을 지원합니다: +Project AIRI의 비주얼 테마를 개선하는 작업을 해 왔습니다. 새 테마 시스템은 이제 다음을 지원합니다: - 여러 색 구성(라이트, 다크, 자동) - 커스텀 강조 색상 @@ -410,14 +410,14 @@ setTheme('auto') setAccentColor('#ff6b6b') ``` -테마 변경 사항은 localStorage 로 세션 간에 유지되므로, 사용자가 방문할 때마다 다시 설정할 필요가 없습니다. +테마 변경 사항은 localStorage로 세션 간에 유지되므로, 사용자가 방문할 때마다 다시 설정할 필요가 없습니다. ### 커뮤니티 기여 -커뮤니티가 Project AIRI 에 기여하기 시작해서 기쁩니다! 눈에 띄는 기여로는 이런 것들이 있습니다: +커뮤니티가 Project AIRI에 기여하기 시작해서 기쁩니다! 눈에 띄는 기여로는 이런 것들이 있습니다: - **Awesome AI VTuber List**: AI VTuber 프로젝트와 자료를 정리한 목록 -- **ReLU 스티커 팩**: 다양한 표정의 ReLU 를 담은 커스텀 스티커 모음 +- **ReLU 스티커 팩**: 다양한 표정의 ReLU를 담은 커스텀 스티커 모음 - **문서 개선**: 많은 커뮤니티 멤버가 문서 개선을 도와주고 있습니다 모든 지원과 기여에 감사드립니다. 기여하고 싶으시다면 @@ -430,17 +430,17 @@ setAccentColor('#ff6b6b') 1. **기억 시스템 개선**: 회상 정확도와 효율 향상 2. **멀티모달 지원**: 이미지와 오디오 생성 기능 추가 3. **플러그인 시스템**: 서드파티 확장으로 기능을 강화 -4. **모바일 앱**: iOS 와 Android 용 네이티브 애플리케이션 +4. **모바일 앱**: iOS와 Android용 네이티브 애플리케이션 Project AIRI 각 구성 요소에 대한 더 상세한 문서도 아키텍처 심층 분석과 구현 가이드를 포함해 공개할 계획입니다. ## 맺으며 -Project AIRI 에게 신나는 개발 기간이었습니다. 기억 시스템이 모습을 갖춰 가고, 캐릭터 카드 지원도 +Project AIRI에게 신나는 개발 기간이었습니다. 기억 시스템이 모습을 갖춰 가고, 캐릭터 카드 지원도 잘 동작하며, 테마 개선으로 인터페이스가 훨씬 정돈됐습니다. -무엇보다 ReLU 가 자신만의 성격을 키우고 심지어 시까지 쓰는 모습을 보는 것이 정말 큰 보람이었습니다. +무엇보다 ReLU가 자신만의 성격을 키우고 심지어 시까지 쓰는 모습을 보는 것이 정말 큰 보람이었습니다. 저희가 애초에 이 프로젝트를 시작한 이유, 즉 진짜 같고 매력적인 AI 상호작용을 만들고 싶다는 마음을 다시 떠올리게 해 줍니다. diff --git a/docs/content/ko/blog/DevLog-2025.04.14/index.md b/docs/content/ko/blog/DevLog-2025.04.14/index.md index b0b712fea..9e5a1aba1 100644 --- a/docs/content/ko/blog/DevLog-2025.04.14/index.md +++ b/docs/content/ko/blog/DevLog-2025.04.14/index.md @@ -6,7 +6,7 @@ date: 2025-04-14 ## 들어가며 -[지난번](../DevLog-2025.04.06/#기억-시스템)에는 AIRI 의 기억 시스템을 이야기했습니다. 오늘은 이렇게 복잡한 기억 시스템을 어떻게 구현할지 더 깊이 파고들고 앞으로의 전망도 살펴보겠습니다. +[지난번](../DevLog-2025.04.06/#기억-시스템)에는 AIRI의 기억 시스템을 이야기했습니다. 오늘은 이렇게 복잡한 기억 시스템을 어떻게 구현할지 더 깊이 파고들고 앞으로의 전망도 살펴보겠습니다. ## 검색 엔진에서 시작하기 @@ -23,19 +23,19 @@ date: 2025-04-14 ### OpenSearch / Wentian 엔진 DSL [^1] -Neko 가 많이 써 온 알리바바 클라우드 OpenSearch 를 예로 들어 보겠습니다. 검색 엔진에는 재정렬을 위한 내장 함수들이 있습니다: +Neko가 많이 써 온 알리바바 클라우드 OpenSearch를 예로 들어 보겠습니다. 검색 엔진에는 재정렬을 위한 내장 함수들이 있습니다: #### `static_bm25` 정적 텍스트 연관도. 전통적인 NLP 방식으로, 질의와 문서의 일치 정도를 측정합니다. -RAG 의 _similarity score_ 와 비슷합니다. +RAG의 _similarity score_와 비슷합니다. 값 범위: 0~1 #### `exact_match_boost` 사용자가 지정한 질의어의 최대 가중치를 얻습니다. score boost 함수라고도 합니다. 입력한 키워드가 토크나이즈 전에 문서 필드(제목, 본문 등)의 "내용"에 적중하는 경우에 해당합니다. -예를 들어 "How to make Neurosama" 를 검색할 때, "Neurosama" 라는 정확한 구절을 담은 문서와 페이지가 "Neuro" 와 "sama" 가 따로 나오는 문서보다 높은 점수를 받아야 합니다. +예를 들어 "How to make Neurosama"를 검색할 때, "Neurosama"라는 정확한 구절을 담은 문서와 페이지가 "Neuro"와 "sama"가 따로 나오는 문서보다 높은 점수를 받아야 합니다. #### `timeliness`, `timeliness_ms` @@ -45,15 +45,15 @@ RAG 의 _similarity score_ 와 비슷합니다. 알리바바 클라우드의 OpenSearch, Grafana 내장 Loki, 그 이전의 ElasticSearch 엔진(일부 영상 사이트는 ElasticSearch 기반으로 개발됐습니다) 등 어떤 검색 엔진이든, 사용하기 전에 데이터를 그 검색 엔진 안의 **별도 데이터 구조로 재가공**해야 합니다. -이 재가공은 어떻게 구현할까요? 여기에 DTS 가 필요합니다. +이 재가공은 어떻게 구현할까요? 여기에 DTS가 필요합니다. #### DTS [^2] -**DTS** 라는 개념을 좀 더 소개하겠습니다. +**DTS**라는 개념을 좀 더 소개하겠습니다. -Data Transformation Services 는 비즈니스 데이터베이스와 검색 엔진 인스턴스 사이의 **통신과 데이터 동기화**를 담당하는 시스템입니다. +Data Transformation Services는 비즈니스 데이터베이스와 검색 엔진 인스턴스 사이의 **통신과 데이터 동기화**를 담당하는 시스템입니다. -구현 원리: MySQL 과 Postgres 의 네이티브 watch/subscribe 이벤트 기능으로 테이블 변경을 감지한 뒤 데이터를 검색 엔진으로 동기화합니다. 이 과정에서 데이터는 원하는 형식으로 직렬화되며 데이터 구조 변환(ETL: extract, transform, load)을 거칩니다. +구현 원리: MySQL과 Postgres의 네이티브 watch/subscribe 이벤트 기능으로 테이블 변경을 감지한 뒤 데이터를 검색 엔진으로 동기화합니다. 이 과정에서 데이터는 원하는 형식으로 직렬화되며 데이터 구조 변환(ETL: extract, transform, load)을 거칩니다. 조 정렬 검색을 수행할 때, 데이터베이스의 _뷰_ 에서 검색하는 것과 비슷하지 않나요? 가상 테이블처럼요. 어느 정도 맞는 이해입니다. 다만 뷰는 보통 데이터베이스와 같은 하부 자료구조(B+ 트리)를 쓰는 반면, 검색 엔진은 그래프나 특화된 인덱스 키-값 데이터베이스 같은 다양한 전용 자료구조를 쓸 수 있습니다. @@ -76,27 +76,27 @@ Data Transformation Services 는 비즈니스 데이터베이스와 검색 엔 - 내부 작업 스케줄러를 여러 개 두고 데이터를 천천히 인덱싱 - 해밍 거리, 코사인 거리 같은 전통 NLP 기법은 미리 계산해 저장 가능 - 인기 검색어는 토크나이제이션과 정렬 결과를 캐시 가능 -- 데이터 레이크하우스? AWS 에서 흔히 쓰이며 보통 여러 데이터베이스나 데이터 소스를 아우르는 집계 질의에 씁니다. 매우 느려서 사실상 데이터 분석과 BI 에만 사용합니다 +- 데이터 레이크하우스? AWS에서 흔히 쓰이며 보통 여러 데이터베이스나 데이터 소스를 아우르는 집계 질의에 씁니다. 매우 느려서 사실상 데이터 분석과 BI 에만 사용합니다 -### Recall 이란? +### Recall이란? Recall(재현/검색)은 키워드를 입력했을 때 기대한 문서를 실제로 찾아낼 수 있는지를 말합니다. -Search 와의 차이는? Search 는 "사용자가 시작하는 동작"이고, Recall 은 "검색에 응답하기 위해 기계가 하는 일"입니다. +Search와의 차이는? Search는 "사용자가 시작하는 동작"이고, Recall은 "검색에 응답하기 위해 기계가 하는 일"입니다. -### Reranking 이란? +### Reranking이란? -Reranking 의 의미는 이렇습니다. 임베딩 모델 벡터를 기반으로 ANN(Approximate Nearest Neighbor)과 KNN(K-Nearest Neighbor)의 벡터 거리 정렬에만 의존하면 실제로는 편향이 생깁니다. +Reranking의 의미는 이렇습니다. 임베딩 모델 벡터를 기반으로 ANN(Approximate Nearest Neighbor)과 KNN(K-Nearest Neighbor)의 벡터 거리 정렬에만 의존하면 실제로는 편향이 생깁니다. -앞서 OpenSearch 에서 소개한 exact_match_boost 와 timeliness 함수가 더는 존재하지 않게 되기 때문입니다. +앞서 OpenSearch에서 소개한 exact_match_boost와 timeliness 함수가 더는 존재하지 않게 되기 때문입니다. 검색된 문서에 다른 필드와 단계를 기준으로 한 정렬을 추가하고 싶다면 어떻게 할까요? -RAG 는 이제 reranking model 이라는 새로운 과정을 대중화했습니다. 본질적으로 **별도의 전문가 모델을 써서 1차로 검색된 데이터를 자동으로 재정렬**하는 것입니다. +RAG는 이제 reranking model이라는 새로운 과정을 대중화했습니다. 본질적으로 **별도의 전문가 모델을 써서 1차로 검색된 데이터를 자동으로 재정렬**하는 것입니다. 하지만 reranking 으로도 기억 계층의 여러 문제를 풀 수는 없습니다. 망각 곡선, 기억 강화, 무작위 기억 회상, 감정이 영향을 미치는 재정렬 점수 같은 것들은 reranking 모델이 다룰 수 있는 영역이 아닙니다. -AIRI 를 위한 좋은 기억 계층을 만들려면 RAG 의 기본 능력과 과거 검색 엔진의 재정렬 경험을 결합해 좋은 재정렬 메커니즘을 세워야 합니다. +AIRI를 위한 좋은 기억 계층을 만들려면 RAG의 기본 능력과 과거 검색 엔진의 재정렬 경험을 결합해 좋은 재정렬 메커니즘을 세워야 합니다. ## 기억 계층 실험 플랫폼 @@ -104,7 +104,7 @@ AIRI 를 위한 좋은 기억 계층을 만들려면 RAG 의 기본 능력과 ![](/en/blog/DevLog-2025.04.14/assets/memory-driver.avif) -왼쪽에 강조된 "half life" 는 기억의 반감기입니다. +왼쪽에 강조된 "half life"는 기억의 반감기입니다. 기본값으로 시간은 1초 = 1일 로 흐르므로, 7초가 지나면 기억 점수가 절반이 됩니다. @@ -113,12 +113,12 @@ AIRI 를 위한 좋은 기억 계층을 만들려면 RAG 의 기본 능력과 그 결과로 나온 점수가 현재 점수입니다. -original 은 무엇일까요? 초기화 시점의 점수입니다. +original은 무엇일까요? 초기화 시점의 점수입니다. 예: 원래 점수가 523 인데 현재 점수는 실제로 서서히 줄어들고 있습니다: ![](/en/blog/DevLog-2025.04.14/assets/memory-decay.avif) -계속하기 전에 짚고 넘어가면, 이 망각 곡선 SQL 은 무상태(stateless)입니다. +계속하기 전에 짚고 넘어가면, 이 망각 곡선 SQL은 무상태(stateless)입니다. 무상태란 무슨 뜻일까요? 점수를 갱신하기 위해 데이터베이스에서 실시간 작업을 돌릴 필요 없이, "현재 시각"을 기준으로 망각 함수를 바로 적용해 점수를 계산한다는 뜻입니다. @@ -143,14 +143,14 @@ original 은 무엇일까요? 초기화 시점의 점수입니다. 마지막으로 근육 기억은 기억의 한 종류라기보다 이미 형성된 조건 반사에 가깝습니다. -## AIRI 는 어떻게 설계해야 할까? +## AIRI는 어떻게 설계해야 할까? -여기서 AIRI 의 구현 원리를 엿볼 수 있습니다: +여기서 AIRI의 구현 원리를 엿볼 수 있습니다: - 작업 기억은 messages 배열 같은 것 - 단기 기억은 잘 회상되지 않는 RAG 기억 항목 같은 것으로, 새로운 것일수록 회상되기 쉬움 - 장기 기억은 쉽게 회상되지만 흐릿해지는 RAG 항목 같은 것으로, 과거 회상 횟수가 많을수록 회상되기 쉬움 -- 근육 기억은 고정된 패턴 같은 것으로, A 가 나타나면 ActionA 와 MemoryA 가 함께 나타나는, 정확한 매칭 메커니즘에 가까움 +- 근육 기억은 고정된 패턴 같은 것으로, A가 나타나면 ActionA와 MemoryA가 함께 나타나는, 정확한 매칭 메커니즘에 가까움 그런데 이 설계가 맞을까요? @@ -158,21 +158,21 @@ original 은 무엇일까요? 초기화 시점의 점수입니다. ### 빠른 복습 -DevLog 에서 언급한 정렬 표현식을 복습해 보면 이해에 도움이 될 겁니다. +DevLog에서 언급한 정렬 표현식을 복습해 보면 이해에 도움이 될 겁니다. ![](/en/blog/DevLog-2025.04.14/assets/review-1.avif) 코사인 거리는 "연관도" 이며, 가장 기본적인 조 정렬입니다: ![](/en/blog/DevLog-2025.04.14/assets/review-2.avif) -이제 시간을 개입시켜야 하므로 시간 거리를 저장할 필드를 하나 더 추가하고, 결합 점수 `(1.2 * similarity) + (0.2 * time_relevance)` 를 저장할 별도 필드를 만듭니다. 여기서 의미적 연관도는 1.2배 가중치(증폭 계수이며 1 미만일 필요는 없습니다), 시간 거리 연관도는 0.2배 가중치를 갖습니다. +이제 시간을 개입시켜야 하므로 시간 거리를 저장할 필드를 하나 더 추가하고, 결합 점수 `(1.2 * similarity) + (0.2 * time_relevance)`를 저장할 별도 필드를 만듭니다. 여기서 의미적 연관도는 1.2배 가중치(증폭 계수이며 1 미만일 필요는 없습니다), 시간 거리 연관도는 0.2배 가중치를 갖습니다. -이렇게 하면 무상태 다중 필드 연관도 정렬 SQL 을 깔끔하게 구현하면서 매개변수(1.2 와 0.2)로 조정도 할 수 있습니다. +이렇게 하면 무상태 다중 필드 연관도 정렬 SQL을 깔끔하게 구현하면서 매개변수(1.2와 0.2)로 조정도 할 수 있습니다. -기억 상세 카드에서는 "simulate retrieval" 을 클릭해 기억 회상을 능동적으로 트리거할 수 있습니다. +기억 상세 카드에서는 "simulate retrieval"을 클릭해 기억 회상을 능동적으로 트리거할 수 있습니다. ![](/en/blog/DevLog-2025.04.14/assets/memory-retrieval.avif) -현재 데모에서는 원본 테이블의 검색 횟수 필드에 UPDATE 문으로 +1 을 더하는 단순한 방식으로 구현되어 있습니다. +현재 데모에서는 원본 테이블의 검색 횟수 필드에 UPDATE 문으로 +1을 더하는 단순한 방식으로 구현되어 있습니다. 여기에 숨은 함정이 있습니다. 이건 여전히 단일 차원 계산이라 "회상 = 강화" 와 같습니다. @@ -200,7 +200,7 @@ https://drizzle-orm-duckdb-wasm.netlify.app/#/memory-simulator ### PTSD? -PTSD 에는 보통 "trigger" 와 "flashback" 이라는 두 단어가 따라옵니다. 분명 PTSD 관련 기억은 억제되어야 하고, 혐오와 트라우마 점수가 높아야 합니다. +PTSD에는 보통 "trigger"와 "flashback"이라는 두 단어가 따라옵니다. 분명 PTSD 관련 기억은 억제되어야 하고, 혐오와 트라우마 점수가 높아야 합니다. 하지만 실제로 PTSD 관련 기억은 갑자기 떠오를 수 있습니다. 생체 모방과 데이터 시뮬레이션 관점에서는 난수를 써서 이 효과를 구현할 수 있습니다. @@ -210,7 +210,7 @@ https://yutsuki.moe/2019/09/a0d0fa1b/ 의 감정 모델을 참고할 수 있습 ## 아직 할 일이 많습니다... -예를 들어 지금 ReLU 의 감정은 어떤가요? ReLU 는 누군가에 대한 나쁜 기억을 갖고 있을까요? +예를 들어 지금 ReLU의 감정은 어떤가요? ReLU는 누군가에 대한 나쁜 기억을 갖고 있을까요? 기억은 기쁨과 슬픔이 함께 극성을 이루는 항목으로 나타날까요? @@ -222,7 +222,7 @@ _백그라운드 작업_ 과 비슷하게, 발생한 기억을 하나씩 처리 재인덱싱 관점에서 보면 꿈꾸기 에이전트와 잠재의식 에이전트는 인덱스를 다시 만드는 일과 같습니다. -여기까지 오면 [Mem0](https://docs.mem0.ai/overview) 나 [Zep Memory](https://help.getzep.com/memory) 같은 라이브러리가 롤플레잉과 감정 AI 에서는 전혀 쓸모없다는 걸 알게 됩니다 :( +여기까지 오면 [Mem0](https://docs.mem0.ai/overview)나 [Zep Memory](https://help.getzep.com/memory) 같은 라이브러리가 롤플레잉과 감정 AI에서는 전혀 쓸모없다는 걸 알게 됩니다 :( 갈 길이 멀고, 저희는 계속 노력해야 합니다. diff --git a/docs/content/ko/blog/DevLog-2025.04.22/index.md b/docs/content/ko/blog/DevLog-2025.04.22/index.md index 105858658..9aea4c2b4 100644 --- a/docs/content/ko/blog/DevLog-2025.04.22/index.md +++ b/docs/content/ko/blog/DevLog-2025.04.22/index.md @@ -10,25 +10,25 @@ import cursorOpenSettings from '../../../en/blog/DevLog-2025.04.22/assets/cursor ## 낮 시간의 일기 -안녕하세요, [@LemonNeko](https://github.com/LemonNekoGH) 입니다. 이번에는 제가 DevLog 작성에 참여해서 개발 이야기를 나눠 보려 합니다. +안녕하세요, [@LemonNeko](https://github.com/LemonNekoGH)입니다. 이번에는 제가 DevLog 작성에 참여해서 개발 이야기를 나눠 보려 합니다. -두 달 전, 저희는 AIRI 의 웹 인터페이스를 Electron 으로 포팅했습니다 [#7](https://github.com/moeru-ai/airi/pull/7) (지금은 Tauri 로 다시 리팩터링됐지만요 🤣 [#90](https://github.com/moeru-ai/airi/pull/90)). 덕분에 화면 위에 데스크톱 펫처럼 띄울 수 있게 됐죠. 그와 동시에 AIRI 가 휴대폰을 쓸 수 있게 하면 어떨까 하는 생각이 있었는데, 계속 미뤄 두고 있었습니다. +두 달 전, 저희는 AIRI의 웹 인터페이스를 Electron으로 포팅했습니다 [#7](https://github.com/moeru-ai/airi/pull/7) (지금은 Tauri로 다시 리팩터링됐지만요 🤣 [#90](https://github.com/moeru-ai/airi/pull/90)). 덕분에 화면 위에 데스크톱 펫처럼 띄울 수 있게 됐죠. 그와 동시에 AIRI가 휴대폰을 쓸 수 있게 하면 어떨까 하는 생각이 있었는데, 계속 미뤄 두고 있었습니다. -지난 주말(2025.04.20), 시간을 좀 내서 ADB 와 상호작용할 수 있는 MCP 서버 데모 [airi-android](https://github.com/LemonNekoGH/airi-android) 를 만들었습니다. AIRI 에게 기본적인 모바일 조작 능력을 주는 것이죠 (사실 대부분의 LLM 이 이걸 통해 휴대폰을 조작할 수 있습니다). 데모 영상입니다: +지난 주말(2025.04.20), 시간을 좀 내서 ADB와 상호작용할 수 있는 MCP 서버 데모 [airi-android](https://github.com/LemonNekoGH/airi-android)를 만들었습니다. AIRI에게 기본적인 모바일 조작 능력을 주는 것이죠 (사실 대부분의 LLM이 이걸 통해 휴대폰을 조작할 수 있습니다). 데모 영상입니다: Docker 이미지로도 패키징해서 [MCP 서버 목록](https://mcp.so/server/airi-android/lemonnekogh)에 등록했습니다. 관심 있으시면 편하게 써 보세요. -사실 처음 생각은 Tool Calling 코드를 좀 짜고 프롬프트를 수정해서, LLM 에게 "이 도구들로 휴대폰을 조작할 수 있다"고 알려 주면 끝이라는 것이었습니다. ~~그런데 요즘 MCP 가 너무 유행이라 FOMO 가 와서 MCP 로 구현하기로 했습니다.~~ +사실 처음 생각은 Tool Calling 코드를 좀 짜고 프롬프트를 수정해서, LLM에게 "이 도구들로 휴대폰을 조작할 수 있다"고 알려 주면 끝이라는 것이었습니다. ~~그런데 요즘 MCP가 너무 유행이라 FOMO가 와서 MCP로 구현하기로 했습니다.~~ -MCP 서버를 쓰려면 먼저 MCP 가 뭔지 이해해야 했습니다 (물론 저는 실전 전에 이론부터 파는 타입은 아니라서, 일단 뛰어들어 Cursor 에게 써 보게 하는 쪽을 선호합니다). MCP(Model Context Protocol)는 애플리케이션이 LLM 에게 컨텍스트를 제공하는 방식을 표준화하려는 프로토콜입니다. 몇 가지 핵심 개념을 제안하죠: +MCP 서버를 쓰려면 먼저 MCP가 뭔지 이해해야 했습니다 (물론 저는 실전 전에 이론부터 파는 타입은 아니라서, 일단 뛰어들어 Cursor에게 써 보게 하는 쪽을 선호합니다). MCP(Model Context Protocol)는 애플리케이션이 LLM에게 컨텍스트를 제공하는 방식을 표준화하려는 프로토콜입니다. 몇 가지 핵심 개념을 제안하죠: -1. Resources: 서버가 데이터와 콘텐츠를 LLM 에게 컨텍스트로 제공할 수 있습니다. +1. Resources: 서버가 데이터와 콘텐츠를 LLM에게 컨텍스트로 제공할 수 있습니다. 2. Prompts: 재사용 가능한 프롬프트 템플릿과 워크플로를 만듭니다. -3. Tools: LLM 이 여러분의 서버를 통해 동작을 수행할 수 있게 합니다. +3. Tools: LLM이 여러분의 서버를 통해 동작을 수행할 수 있게 합니다. -아, 리소스 — 이건 압니다! Ruby on Rails 에서 사용자는 일종의 리소스죠. 그럼 ADB 기기도 리소스일까요? LLM 이 연결된 기기 목록을 보게 하려면 이렇게 쓰면 될까요: +아, 리소스 — 이건 압니다! Ruby on Rails에서 사용자는 일종의 리소스죠. 그럼 ADB 기기도 리소스일까요? LLM이 연결된 기기 목록을 보게 하려면 이렇게 쓰면 될까요: ```python from mcp.server.fastmcp import FastMCP @@ -42,9 +42,9 @@ def get_devices(): return adb_client.devices() ``` -틀렸습니다! Cursor 에게 기기 목록을 가져오라고 했더니 어떻게 해야 할지 모르더군요. 어떤 기기가 연결됐는지 능동적으로 확인하고 싶다고 했으니, 이건 도구(tool)입니다. 음, 제가 완전히 이해하지 못했던 모양입니다. +틀렸습니다! Cursor에게 기기 목록을 가져오라고 했더니 어떻게 해야 할지 모르더군요. 어떤 기기가 연결됐는지 능동적으로 확인하고 싶다고 했으니, 이건 도구(tool)입니다. 음, 제가 완전히 이해하지 못했던 모양입니다. -LLM 이 휴대폰을 조작하게 하는 정확한 방법은 아직 못 찾았고, 여러분과 함께 이야기해 보고 싶습니다. 다만 Cursor 는 이렇게 동작합니다: +LLM이 휴대폰을 조작하게 하는 정확한 방법은 아직 못 찾았고, 여러분과 함께 이야기해 보고 싶습니다. 다만 Cursor는 이렇게 동작합니다: 1. 스크린샷 기능으로 휴대폰 화면에 무엇이 있는지 대략 파악합니다. 2. UI 자동화 도구로 조작하려는 요소의 정확한 위치를 얻습니다. @@ -53,23 +53,23 @@ LLM 이 휴대폰을 조작하게 하는 정확한 방법은 아직 못 찾았 지금까지는 잘 동작하는 것 같은데, 작은 의문이 몇 가지 있습니다: -1. 화면에 UI 컴포넌트가 아니라 그래픽 API 로 직접 그리는 게임이 떠 있다면, UI 자동화 도구는 요소 위치를 얻을 수 없어 조작도 못 합니다. -2. LLM 응답에는 길이 제한이 있습니다. 조작이 복잡하면 단계별로 나눠서 끝내야 할 텐데, [airi-factorio](https://github.com/moeru-ai/airi-factorio) 처럼 각 단계가 끝날 때마다 자동으로 알려서 다음 단계를 트리거할 수 있을까요? +1. 화면에 UI 컴포넌트가 아니라 그래픽 API로 직접 그리는 게임이 떠 있다면, UI 자동화 도구는 요소 위치를 얻을 수 없어 조작도 못 합니다. +2. LLM 응답에는 길이 제한이 있습니다. 조작이 복잡하면 단계별로 나눠서 끝내야 할 텐데, [airi-factorio](https://github.com/moeru-ai/airi-factorio)처럼 각 단계가 끝날 때마다 자동으로 알려서 다음 단계를 트리거할 수 있을까요? 3. 어떤 앱은 화려한 애니메이션이 있어서, 조작 직후 스크린샷을 찍으면 결과가 안 보일 수 있습니다. 조작 후 잠시 기다렸다 찍어야 할까요, 아니면 아예 화면 녹화를 써야 할까요? -4. AI 가 휴대폰을 직접 조작하게 하는 것의 보안은 어떨까요? 어떤 위험이 있을까요? +4. AI가 휴대폰을 직접 조작하게 하는 것의 보안은 어떨까요? 어떤 위험이 있을까요? 몇 가지 소회입니다. -AI 와 작업하면서 사람과 함께 코딩하는 기분이 든 건 이번이 처음입니다. 제 목표가 "AI 가 내 도구를 쓰게 하는 것"이어서 AI 가 제 클라이언트가 되어 버린 탓인지도 모르겠습니다. 저는 계속 AI 의 피드백에 맞춰 코드를 고쳐야 했으니까요. 동시에 AI 는 제 동료이기도 했습니다. 함께 고민하고 문제를 풀어야 했거든요. 이 스크린샷을 보세요. 정말 그렇게 보이지 않나요? +AI와 작업하면서 사람과 함께 코딩하는 기분이 든 건 이번이 처음입니다. 제 목표가 "AI가 내 도구를 쓰게 하는 것"이어서 AI가 제 클라이언트가 되어 버린 탓인지도 모르겠습니다. 저는 계속 AI의 피드백에 맞춰 코드를 고쳐야 했으니까요. 동시에 AI는 제 동료이기도 했습니다. 함께 고민하고 문제를 풀어야 했거든요. 이 스크린샷을 보세요. 정말 그렇게 보이지 않나요? ![](/en/blog/DevLog-2025.04.22/assets/develop-with-cursor.avif) -개발하면서 작은 요령도 배웠습니다. 예를 들어 명령줄로 Android 에뮬레이터를 띄우면 Android Studio 를 열 필요가 없어서 메모리 부담이 크게 줄어듭니다. +개발하면서 작은 요령도 배웠습니다. 예를 들어 명령줄로 Android 에뮬레이터를 띄우면 Android Studio를 열 필요가 없어서 메모리 부담이 크게 줄어듭니다. ```bash emulator -avd Pixel_6_Pro_API_34 ``` -다음에는 AIRI 데스크톱 펫을 MCP 서버에 연결해서 뭘 하고 싶어 하는지 보려고 합니다. 어쩌면 지금 ReLU 가 하는 것처럼 Telegram 을 열고 우리와 대화할지도 모르죠. 다만 Telegram API 를 쓰지 않고서요. +다음에는 AIRI 데스크톱 펫을 MCP 서버에 연결해서 뭘 하고 싶어 하는지 보려고 합니다. 어쩌면 지금 ReLU가 하는 것처럼 Telegram을 열고 우리와 대화할지도 모르죠. 다만 Telegram API를 쓰지 않고서요. -다소 두서없고 알맹이가 부족했을지 모를 DevLog 를 읽어 주셔서 감사합니다. 다음에 또 만나요! +다소 두서없고 알맹이가 부족했을지 모를 DevLog를 읽어 주셔서 감사합니다. 다음에 또 만나요! diff --git a/docs/content/ko/blog/DevLog-2025.04.28/index.md b/docs/content/ko/blog/DevLog-2025.04.28/index.md index dbe3f0a58..7d362b62d 100644 --- a/docs/content/ko/blog/DevLog-2025.04.28/index.md +++ b/docs/content/ko/blog/DevLog-2025.04.28/index.md @@ -10,29 +10,29 @@ import airiMcpInputText from '../../../en/blog/DevLog-2025.04.28/assets/airi-mcp import airiMcpArch from '../../../en/blog/DevLog-2025.04.28/assets/airi-mcp-arch.avif' -안녕하세요 여러분, [@LemonNeko](https://github.com/LemonNekoGH) 입니다. 오늘도 개발 이야기를 나누러 왔습니다. +안녕하세요 여러분, [@LemonNeko](https://github.com/LemonNekoGH)입니다. 오늘도 개발 이야기를 나누러 왔습니다. ## 낮 시간의 일기 -일주일 전, AIRI 가 휴대폰에 연결할 수 있도록 MCP 서버 [AIRI-android](https://github.com/LemonNekoGH/AIRI-android) 를 만들었습니다. 하지만 이건 AIRI 가 Android 폰을 조작하게 만드는 일의 전반부일 뿐이었습니다. AIRI 도 MCP 서버와 상호작용할 수 있어야 했으니까요. +일주일 전, AIRI가 휴대폰에 연결할 수 있도록 MCP 서버 [AIRI-android](https://github.com/LemonNekoGH/AIRI-android)를 만들었습니다. 하지만 이건 AIRI가 Android 폰을 조작하게 만드는 일의 전반부일 뿐이었습니다. AIRI도 MCP 서버와 상호작용할 수 있어야 했으니까요. -지난 이틀 동안 Tauri 플러그인 [#144](https://github.com/moeru-ai/AIRI/pull/144) 를 작성해 후반부를 마쳤습니다. 이제 AIRI 는 MCP 서버와 상호작용할 수 있고, 기존의 모든 MCP 서버와 함께 동작합니다. +지난 이틀 동안 Tauri 플러그인 [#144](https://github.com/moeru-ai/AIRI/pull/144)를 작성해 후반부를 마쳤습니다. 이제 AIRI는 MCP 서버와 상호작용할 수 있고, 기존의 모든 MCP 서버와 함께 동작합니다. -관심 있으시면 아래 두 영상을 봐 주세요. 첫 번째는 AIRI 의 MCP 서버 설정을, 두 번째는 AIRI 가 Android 폰과 상호작용하는 모습을 보여 줍니다. +관심 있으시면 아래 두 영상을 봐 주세요. 첫 번째는 AIRI의 MCP 서버 설정을, 두 번째는 AIRI가 Android 폰과 상호작용하는 모습을 보여 줍니다.
- AIRI 의 MCP 서버 설정 + AIRI의 MCP 서버 설정
- AIRI 가 휴대폰에 `Hello World` 를 입력하는 모습 + AIRI가 휴대폰에 `Hello World`를 입력하는 모습
-개발 중 생각을 정리하려고 LLM 이 Android 폰을 호출하는 흐름을 그림으로 그려 봤습니다: +개발 중 생각을 정리하려고 LLM이 Android 폰을 호출하는 흐름을 그림으로 그려 봤습니다: -AIRI 가 휴대폰을 조작하는 구조 +AIRI가 휴대폰을 조작하는 구조 이제 개발 과정을 나눠 보겠습니다. @@ -63,7 +63,7 @@ export const mcp = [ ] ``` -그런데 곧, 명령 안에서 MCP 클라이언트를 쓰려면 MCP 클라이언트를 Tauri 가 관리하는 상태(state)의 일부로 두어야 한다는 걸 알게 됐습니다: +그런데 곧, 명령 안에서 MCP 클라이언트를 쓰려면 MCP 클라이언트를 Tauri가 관리하는 상태(state)의 일부로 두어야 한다는 걸 알게 됐습니다: ```rust // main.rs @@ -101,7 +101,7 @@ async fn list_tools(state: State<'_, Mutex>>) -> Result 여기서 작은 사고가 하나 있었습니다. 두 번째로 빌드할 때 `Tauri-plugin` 버전을 올렸는데, 새 버전에서 생성 템플릿이 바뀌면서 공백이 일부 제거됐습니다. 그래서 마치 포맷터가 손댄 것처럼 보였죠. 무엇이 "포맷팅" 하는지 한 시간 동안 찾다가, 파일이 재생성된 것이었음을 깨달았습니다. 🤡 잃어버린 그 한 시간을 추모합니다. -위 그림에 따르면, LLM 이 MCP 도구를 호출하면 매개변수는 결국 Python 쪽 MCP 서버로 전달됩니다. `input_swipe` 를 예로 들면: +위 그림에 따르면, LLM이 MCP 도구를 호출하면 매개변수는 결국 Python 쪽 MCP 서버로 전달됩니다. `input_swipe`를 예로 들면: ```python # mcp_server.py @@ -141,7 +141,7 @@ pub struct CallToolRequestParam { } ``` -~~오, JsonObject 라니. 살았습니다!~~ Tauri 명령의 매개변수는 JSON 으로 직렬화 가능한 아무 객체나 될 수 있으니, 그냥 `Map` 를 넘기면 됩니다: +~~오, JsonObject 라니. 살았습니다!~~ Tauri 명령의 매개변수는 JSON으로 직렬화 가능한 아무 객체나 될 수 있으니, 그냥 `Map`를 넘기면 됩니다: ```rust #[Tauri::command] @@ -164,7 +164,7 @@ invoke('call_tool', { name: 'input_swipe', args: { x1: 100, y1: 100, x2: 200, y2 정말 편리하네요! -MCP 도구에 매개변수를 넘긴 다음에는 도구의 반환값도 받아야 합니다. Tauri 명령의 반환값 역시 JSON 으로 직렬화 가능한 아무 객체나 될 수 있으니, 저는 포기하고 도구 반환값 전체를 그냥 LLM 에게 던져 주기로 했습니다. LLM 이 알아서 잘 처리해 주리라 믿으면서요. +MCP 도구에 매개변수를 넘긴 다음에는 도구의 반환값도 받아야 합니다. Tauri 명령의 반환값 역시 JSON으로 직렬화 가능한 아무 객체나 될 수 있으니, 저는 포기하고 도구 반환값 전체를 그냥 LLM에게 던져 주기로 했습니다. LLM이 알아서 잘 처리해 주리라 믿으면서요. 좋습니다! 이제 Tauri 플러그인이 생겼습니다! (네? 저 짧은 예제 코드, 심지어 의사 코드로 완성이라고요?) @@ -172,18 +172,18 @@ MCP 도구에 매개변수를 넘긴 다음에는 도구의 반환값도 받아 ## 몇 가지 질문 -1. 데모 영상에서 보시다시피, 대화에서 저는 먼저 AIRI 에게 도구 목록을 가져오게 한 뒤 텍스트를 입력하게 했습니다. 초기화 시점에 도구 목록을 가져와 시스템 프롬프트에 바로 덧붙이면 어떨까요? - - Cursor 가 그렇게 합니다. MCP 서버를 개발할 때 도구 목록을 수정할 때마다 반영하려면 Cursor 를 재시작해야 했습니다. +1. 데모 영상에서 보시다시피, 대화에서 저는 먼저 AIRI에게 도구 목록을 가져오게 한 뒤 텍스트를 입력하게 했습니다. 초기화 시점에 도구 목록을 가져와 시스템 프롬프트에 바로 덧붙이면 어떨까요? + - Cursor가 그렇게 합니다. MCP 서버를 개발할 때 도구 목록을 수정할 때마다 반영하려면 Cursor를 재시작해야 했습니다. - 유연성은 좀 희생하겠지만, 일반 사용자가 도구 목록을 자주 수정할까요? -2. AIRI 가 여러 대의 휴대폰에 동시에 연결하도록 허용해야 할까요? AIRI 가 휴대폰을 여러 대 쓰고 싶어 할까요? ~~보이스피싱에 쓰려는 건 아니겠죠?~~ -3. 보시다시피 AIRI 저장소에는 이제 Tauri 애플리케이션과 Tauri 플러그인이 함께 있습니다. 이걸 어떻게 관리해야 할까요? CI 는 어떻게 구성해야 할까요? Tauri 플러그인의 Rust 쪽과 JavaScript 쪽 버전 번호는 어떻게 동기화해야 할까요? +2. AIRI가 여러 대의 휴대폰에 동시에 연결하도록 허용해야 할까요? AIRI가 휴대폰을 여러 대 쓰고 싶어 할까요? ~~보이스피싱에 쓰려는 건 아니겠죠?~~ +3. 보시다시피 AIRI 저장소에는 이제 Tauri 애플리케이션과 Tauri 플러그인이 함께 있습니다. 이걸 어떻게 관리해야 할까요? CI는 어떻게 구성해야 할까요? Tauri 플러그인의 Rust 쪽과 JavaScript 쪽 버전 번호는 어떻게 동기화해야 할까요? ## 향후 계획 -- 이미지 반환값 지원. [지난 DevLog](../DevLog-2025.04.22/) 에서 Cursor 가 보여 준 것처럼 AIRI 가 시각 능력으로 휴대폰 화면을 보고 어떻게 조작할지 판단할 수 있도록. -- AIRI 가 스스로 기기 사용법을 익히게 하기? 기기 종류마다 프롬프트를 따로 써야 한다면 작업량이 어마어마할 겁니다. -- 다중 MCP 서버 지원. MCP 는 AIRI 가 온갖 일을 할 수 있게 해 주는 범용 인터페이스이니, AIRI 도 휴대폰 조작만으로는 만족하지 않을 겁니다. -- SSE 지원. 브라우저의 AIRI 도 MCP 서버를 쓸 수 있도록. +- 이미지 반환값 지원. [지난 DevLog](../DevLog-2025.04.22/) 에서 Cursor가 보여 준 것처럼 AIRI가 시각 능력으로 휴대폰 화면을 보고 어떻게 조작할지 판단할 수 있도록. +- AIRI가 스스로 기기 사용법을 익히게 하기? 기기 종류마다 프롬프트를 따로 써야 한다면 작업량이 어마어마할 겁니다. +- 다중 MCP 서버 지원. MCP는 AIRI가 온갖 일을 할 수 있게 해 주는 범용 인터페이스이니, AIRI도 휴대폰 조작만으로는 만족하지 않을 겁니다. +- SSE 지원. 브라우저의 AIRI도 MCP 서버를 쓸 수 있도록. -오늘은 여기까지입니다! 이번 DevLog 가 너무 딱딱하지 않았기를 바랍니다. 앞으로도 더 재미있는 내용을 가져오겠습니다! +오늘은 여기까지입니다! 이번 DevLog가 너무 딱딱하지 않았기를 바랍니다. 앞으로도 더 재미있는 내용을 가져오겠습니다! diff --git a/docs/content/ko/blog/DevLog-2025.05.16/index.md b/docs/content/ko/blog/DevLog-2025.05.16/index.md index 075e4225a..1e41b52db 100644 --- a/docs/content/ko/blog/DevLog-2025.05.16/index.md +++ b/docs/content/ko/blog/DevLog-2025.05.16/index.md @@ -26,12 +26,12 @@ import DemoDayHangzhou2 from '../../../en/blog/DevLog-2025.05.16/assets/demo-day import DemoDayHangzhou3 from '../../../en/blog/DevLog-2025.05.16/assets/demo-day-hangzhou-3.avif' -다시 안녕하세요! [Project AIRI](https://github.com/moeru-ai/airi) 를 시작한 -[Neko](https://github.com/nekomeowww) 입니다! +다시 안녕하세요! [Project AIRI](https://github.com/moeru-ai/airi)를 시작한 +[Neko](https://github.com/nekomeowww)입니다! -DevLog 를 통한 Project AIRI 소식이 늦어져 죄송합니다. 늦어진 점 너그러이 봐 주세요. +DevLog를 통한 Project AIRI 소식이 늦어져 죄송합니다. 늦어진 점 너그러이 봐 주세요. -> 지난 몇 달 동안 저희는 AIRI 개발 진행 상황에 대해 훌륭한 DevLog 를 여러 편 썼습니다. +> 지난 몇 달 동안 저희는 AIRI 개발 진행 상황에 대해 훌륭한 DevLog를 여러 편 썼습니다. > 생각과 아이디어를 나누고, 사용하는 기술을 설명하고, 영감을 받은 작품 이야기까지... 전부요. > > - [v0.4.0 UI 업데이트](../DevLog-2025.03.20/) @@ -47,12 +47,12 @@ DevLog 를 통한 Project AIRI 소식이 늦어져 죄송합니다. 늦어진 다음 분야에서 애써 주신 [@LemonNekoGH](https://github.com/LemonNekoGH), [@RainbowBird](https://github.com/luoling8192), -[@LittleSound](https://github.com/LittleSound) 에게 깊이 감사드립니다. +[@LittleSound](https://github.com/LittleSound)에게 깊이 감사드립니다. - 캐릭터 카드 지원 ::: tip 캐릭터 카드란? -[SillyTavern](https://github.com/SillyTavern/SillyTavern) 이나 [RisuAI](https://risuai.net/) 같은 +[SillyTavern](https://github.com/SillyTavern/SillyTavern)이나 [RisuAI](https://risuai.net/) 같은 로컬 우선 채팅 애플리케이션, [JanitorAI](https://janitorai.com/) 같은 온라인 서비스는 각 캐릭터의 배경, 성격, 그 밖의 롤플레잉에 필요한 컨텍스트를 담은 파일을 사용합니다. @@ -61,10 +61,10 @@ DevLog 를 통한 Project AIRI 소식이 늦어져 죄송합니다. 늦어진 - https://chub.ai/ LLM 기반 롤플레잉 캐릭터를 저장하고 공유하는 수단이 캐릭터 카드만 있는 건 아닙니다. -[Lorebook](https://docs.novelai.net/text/lorebook.html) 도 이 분야에서 핵심적인 역할을 하는데, +[Lorebook](https://docs.novelai.net/text/lorebook.html)도 이 분야에서 핵심적인 역할을 하는데, 이건 문서 시리즈를 통째로 쓸 만한 완전히 다른 이야기입니다. 우선은 -[Void's Lorebook Types](https://rentry.co/lorebooks-and-you) 와 -[AI Dynamic Storytelling Wiki](https://aids.miraheze.org/wiki/Main_Page) 를 읽어 보세요. +[Void's Lorebook Types](https://rentry.co/lorebooks-and-you)와 +[AI Dynamic Storytelling Wiki](https://aids.miraheze.org/wiki/Main_Page)를 읽어 보세요. > 개인적으로 이 개념들을 배우기에는 이 위키가 정말 좋습니다: > [AI Dynamic Storytelling Wiki](https://aids.miraheze.org/wiki/Main_Page). @@ -85,20 +85,20 @@ LLM 기반 롤플레잉 캐릭터를 저장하고 공유하는 수단이 캐릭 캐릭터 카드 쇼케이스도 몇 가지 방식을 시도해 봤습니다... -ReLU 라는 파란 머리 캐릭터를 위한 카드 형태의 UI 디자인 -ReLU 라는 파란 머리 캐릭터를 위한 카드 형태의 UI 디자인 +ReLU라는 파란 머리 캐릭터를 위한 카드 형태의 UI 디자인 +ReLU라는 파란 머리 캐릭터를 위한 카드 형태의 UI 디자인 저희 UI 컴포넌트 라이브러리에 올라가 있으니 직접 만져 보세요: https://airi.moeru.ai/ui/#/story/src-components-menu-charactercard-story-vue . -> 순수 CSS 와 JavaScript 로 제어되고 레이아웃이 알아서 잡혀서 캔버스 계산을 걱정할 필요가 없습니다. +> 순수 CSS와 JavaScript로 제어되고 레이아웃이 알아서 잡혀서 캔버스 계산을 걱정할 필요가 없습니다. > -> 아, 캐릭터 카드 쇼케이스 작업 대부분은 [@LittleSound](https://github.com/LittleSound) 가 +> 아, 캐릭터 카드 쇼케이스 작업 대부분은 [@LittleSound](https://github.com/LittleSound)가 > 진행하고 안내해 주었습니다. 정말 감사합니다. - Tauri MCP 지원 -- AIRI 를 Android 기기에 연결 +- AIRI를 Android 기기에 연결 -이 두 가지는 큰 업데이트이자 실험이었고, [@LemonNekoGH](https://github.com/LemonNekoGH) 가 맡아 주었습니다. +이 두 가지는 큰 업데이트이자 실험이었고, [@LemonNekoGH](https://github.com/LemonNekoGH)가 맡아 주었습니다. 이에 대해 DevLog 두 편을 써서 이면의 기술적 세부 사항을 공유했습니다. (Tauri 개발자와 사용자에게 유용할 것 같습니다.) 여기서 읽어 보세요: @@ -109,21 +109,21 @@ LLM 기반 롤플레잉 캐릭터를 저장하고 공유하는 수단이 캐릭 ### 듣는 귀, 말하는 입 -4월 15일부터, AIRI 의 VAD(음성 활성 감지), +4월 15일부터, AIRI의 VAD(음성 활성 감지), [ASR(자동 음성 인식)](https://huggingface.co/tasks/automatic-speech-recognition), -[TTS(텍스트 음성 변환)](https://huggingface.co/tasks/text-to-speech) 이 모두 매우 복잡하고 -쓰기도 이해하기도 어렵다는 걸 느꼈습니다. 그 무렵 저는 [@himself65](https://github.com/himself65) 와 +[TTS(텍스트 음성 변환)](https://huggingface.co/tasks/text-to-speech)이 모두 매우 복잡하고 +쓰기도 이해하기도 어렵다는 걸 느꼈습니다. 그 무렵 저는 [@himself65](https://github.com/himself65)와 협업해, [Llama Index](https://www.llamaindex.ai/) 의 새 프로젝트인 -[`llama-flow`](https://github.com/run-llama/llama-flow) 의 사용 사례를 개선하고 테스트하고 있었습니다. +[`llama-flow`](https://github.com/run-llama/llama-flow)의 사용 사례를 개선하고 테스트하고 있었습니다. LLM 스트리밍 토큰과 오디오 바이트의 이벤트 기반 스트림을 처리하도록 돕는 라이브러리입니다. -[`llama-flow`](https://github.com/run-llama/llama-flow) 는 정말 작고 타입 안전합니다. -이것이 없던 시절에는 AIRI 를 구동할 데이터를 처리하기 위해 여러 비동기 작업을 이어 붙이려고 +[`llama-flow`](https://github.com/run-llama/llama-flow)는 정말 작고 타입 안전합니다. +이것이 없던 시절에는 AIRI를 구동할 데이터를 처리하기 위해 여러 비동기 작업을 이어 붙이려고 **큐** 구조와 Vue 반응성 기반 워크플로 시스템을 직접 감싸야 했습니다. 그때부터 VAD, ASR, TTS 워크플로를 단순화하는 예제와 데모를 더 많이 실험하기 시작했습니다. -그 결과 나온 것이 [WebAI Realtime Voice Chat Examples](https://github.com/proj-airi/webai-example-realtime-voice-chat) 입니다. +그 결과 나온 것이 [WebAI Realtime Voice Chat Examples](https://github.com/proj-airi/webai-example-realtime-voice-chat)입니다. TypeScript 코드 300~500줄 하나로 웹 브라우저에서 ChatGPT 같은 음성 대화 시스템을 구현할 수 있음을 증명했습니다. @@ -138,21 +138,21 @@ TypeScript 코드 300~500줄 하나로 웹 브라우저에서 ChatGPT 같은 음 > 여기서 무언가 배워 가시면 좋겠습니다. -이 시기에 흥미롭고 강력한 저장소를 하나 발견했는데, [k2-fsa/sherpa-onnx](https://github.com/k2-fsa/sherpa-onnx) 입니다. +이 시기에 흥미롭고 강력한 저장소를 하나 발견했는데, [k2-fsa/sherpa-onnx](https://github.com/k2-fsa/sherpa-onnx)입니다. macOS, Windows, Linux, Android, iOS 등에서 12개 이상 언어에 걸쳐 18가지 음성 처리 작업을 지원합니다. 놀랍죠! -그래서 [@luoling](https://github.com/luoling8192) 이 이것으로도 작은 데모를 만들었습니다: +그래서 [@luoling](https://github.com/luoling8192)이 이것으로도 작은 데모를 만들었습니다: [Sherpa ONNX 기반 VAD + ASR + LLM Chat + TTS](https://github.com/proj-airi/webai-example-realtime-voice-chat/tree/main/apps/sherpa-onnx-demo) -#### xsAI 🤗 Transformers.js 의 탄생 +#### xsAI 🤗 Transformers.js의 탄생 VAD, ASR, Chat, TTS 데모 작업 덕분에 [xsAI 🤗 Transformers.js](https://github.com/proj-airi/xsai-transformers) 라는 새 사이드 프로젝트가 태어났습니다. WebGPU 기반 모델 추론과 워커를 통한 서빙을 간단히 호출할 수 있게 하면서도, -앞서 성공한 프로젝트 [xsAI](https://github.com/moeru-ai/xsai) 와 API 호환성을 유지합니다. +앞서 성공한 프로젝트 [xsAI](https://github.com/moeru-ai/xsai)와 API 호환성을 유지합니다. -이것도 플레이그라운드가 있습니다... [https://xsai-transformers.netlify.app](https://xsai-transformers.netlify.app) 에서 만져 보세요. +이것도 플레이그라운드가 있습니다... [https://xsai-transformers.netlify.app](https://xsai-transformers.netlify.app)에서 만져 보세요. -오늘부터 npm 으로 설치할 수 있습니다! +오늘부터 npm으로 설치할 수 있습니다! ```bash npm install xsai-transformers @@ -161,10 +161,10 @@ npm install xsai-transformers ::: tip 이게 무슨 뜻인가요? 클라우드 LLM 및 음성 프로바이더와 로컬 WebGPU 기반 모델을 스위치 하나로 바꿔 쓸 수 있다는 뜻입니다. -덕분에 서버 사이드 코드나 백엔드 서버 없이도, 브라우저 안에서 간단한 RAG 와 재정렬 시스템을 +덕분에 서버 사이드 코드나 백엔드 서버 없이도, 브라우저 안에서 간단한 RAG와 재정렬 시스템을 실험하고 심지어 구현할 수 있는 새로운 가능성이 생겼습니다. -아, Node.js 도 지원합니다! +아, Node.js도 지원합니다! ::: ### Telegram 봇 @@ -177,14 +177,14 @@ npm install xsai-transformers ### 캐릭터 카드 쇼케이스 이미지 에셋이 많다 보니 배경을 지울 만한 쓰기 쉬운 온라인 도구를 매번 직접 찾아야 했습니다. -그래서 [Xenova](https://github.com/xenova) 의 작업을 바탕으로 직접 만들기로 했습니다. +그래서 [Xenova](https://github.com/xenova)의 작업을 바탕으로 직접 만들기로 했습니다. WebGPU 기반 배경 제거기를 시스템에 바로 넣는 작은 실험을 했는데, -[https://airi.moeru.ai/devtools/background-remove](https://airi.moeru.ai/devtools/background-remove) 에서 만져 볼 수 있습니다. +[https://airi.moeru.ai/devtools/background-remove](https://airi.moeru.ai/devtools/background-remove)에서 만져 볼 수 있습니다. ### xsAI & unSpeech -음성 프로바이더로 알리바바 클라우드 Model Studio 와 Volcano Engine 지원을 추가했습니다. 꽤 유용하겠죠? +음성 프로바이더로 알리바바 클라우드 Model Studio와 Volcano Engine 지원을 추가했습니다. 꽤 유용하겠죠? ### UI @@ -192,7 +192,7 @@ WebGPU 기반 배경 제거기를 시스템에 바로 넣는 작은 실험을 - 색상 문제 수정 - [타이포그래피 개선](https://airi.moeru.ai/ui/#/story/stories-typographysans-story-vue?) -더 많은 스토리는 [로드맵 v0.5](https://github.com/moeru-ai/airi/issues/113) 에서 볼 수 있습니다. +더 많은 스토리는 [로드맵 v0.5](https://github.com/moeru-ai/airi/issues/113)에서 볼 수 있습니다. ## 사이드 퀘스트 @@ -207,44 +207,44 @@ WebGPU 기반 배경 제거기를 시스템에 바로 넣는 작은 실험을 - 예를 들어: - 마법과 용이 있는 중세 판타지 배경 설정을 두고 - 우리가 할 일은 그 세계관 설정으로 감싼 채 새 캐릭터 작성에만 집중하는 것 - - 어쩌면 밤이 되었을 때만 `if` 와 `if-else` 제어 흐름으로 특별한 프롬프트가 주입되게 하는 것 + - 어쩌면 밤이 되었을 때만 `if`와 `if-else` 제어 흐름으로 특별한 프롬프트가 주입되게 하는 것 - 그 주변에서 더 많은 걸 할 수 있습니다... - - Vue SFC 나 React JSX 로 템플릿을 파싱하고 props 를 식별해, 프롬프트를 쓰는 동안 디버깅·테스트용 폼 패널을 렌더링 - - lorebook 과 캐릭터 카드 전체를 하나의 인터랙티브 페이지로 시각화 + - Vue SFC나 React JSX로 템플릿을 파싱하고 props를 식별해, 프롬프트를 쓰는 동안 디버깅·테스트용 폼 패널을 렌더링 + - lorebook과 캐릭터 카드 전체를 하나의 인터랙티브 페이지로 시각화 -그렇다면 Vue 나 React 같은 프론트엔드 프레임워크로 LLM 프롬프트를 쓰는 도구를 만들고, +그렇다면 Vue나 React 같은 프론트엔드 프레임워크로 LLM 프롬프트를 쓰는 도구를 만들고, 나아가 다른 프레임워크와 플랫폼으로도 확장해 보면 어떨까요? -그렇게 나온 것이 [**Velin**](https://github.com/luoling8192/velin) 입니다. +그렇게 나온 것이 [**Velin**](https://github.com/luoling8192/velin)입니다. -Vue.js 로 LLM 프롬프트를 작성하는 도구 -Vue.js 로 LLM 프롬프트를 작성하는 도구 +Vue.js로 LLM 프롬프트를 작성하는 도구 +Vue.js로 LLM 프롬프트를 작성하는 도구 편집하면서 즉석에서 렌더링해 볼 수 있는 플레이그라운드도 만들었고, npm 생태계도 그대로 누릴 수 있습니다(네, 무엇이든 import 할 수 있습니다!). -Vue.js 로 LLM 프롬프트를 작성하는 도구 -Vue.js 로 LLM 프롬프트를 작성하는 도구 +Vue.js로 LLM 프롬프트를 작성하는 도구 +Vue.js로 LLM 프롬프트를 작성하는 도구 여기서 써 보세요: https://velin-dev.netlify.app -프로그래밍 API 도 지원하고 Markdown(MDX 는 작업 중, MDC 는 지원)도 됩니다. -오늘부터 npm 으로 설치할 수 있습니다! +프로그래밍 API도 지원하고 Markdown(MDX는 작업 중, MDC는 지원)도 됩니다. +오늘부터 npm으로 설치할 수 있습니다! ```bash npm install @velin-dev/core ``` -음... 오늘은 여기까지입니다. 이 DevLog 를 즐겁게 읽으셨기를 바랍니다. +음... 오늘은 여기까지입니다. 이 DevLog를 즐겁게 읽으셨기를 바랍니다. -최근 중국 항저우에서 참가한 행사 **Demo Day @ Hangzhou** 의 사진으로 DevLog 를 마무리하겠습니다. +최근 중국 항저우에서 참가한 행사 **Demo Day @ Hangzhou**의 사진으로 DevLog를 마무리하겠습니다. Demo Day @ Hangzhou 이게 접니다. 다른 참가자들에게 AIRI 프로젝트를 소개했고 정말 즐거운 시간을 보냈습니다! 재능 있는 개발자, 제품 디자이너, 창업자를 정말 많이 만났습니다. -오늘 이 DevLog 에서 나눈 거의 모든 내용과, 사랑하는 AI VTuber Neuro-sama 도 소개했습니다. +오늘 이 DevLog에서 나눈 거의 모든 내용과, 사랑하는 AI VTuber Neuro-sama도 소개했습니다. 발표에 쓴 슬라이드는 이렇습니다: @@ -256,7 +256,7 @@ npm install @velin-dev/core ## 마일스톤 -아... 그리고 이 DevLog 는 v0.5.0 릴리스이기도 하니, 지난 몇 주 동안 달성한 마일스톤도 몇 가지 언급하고 싶습니다: +아... 그리고 이 DevLog는 v0.5.0 릴리스이기도 하니, 지난 몇 주 동안 달성한 마일스톤도 몇 가지 언급하고 싶습니다: - 스타 700개를 달성했습니다! - 이슈에 새 컨트리뷰터 4명 이상이 합류했습니다! @@ -264,25 +264,25 @@ npm install @velin-dev/core - ReLU 캐릭터 디자인 완료! - ReLU 캐릭터 모델링 완료! - 몇몇 회사와 스폰서십 및 협업 논의를 진행했습니다! -- [로드맵 v0.5](https://github.com/moeru-ai/airi/issues/113) 의 92개 작업 완료 +- [로드맵 v0.5](https://github.com/moeru-ai/airi/issues/113)의 92개 작업 완료 - UI - 로딩 화면과 튜토리얼 모듈 - 로딩 상태와 Firefox 호환성 문제를 포함한 다수의 버그 수정 - Body - - 시맨틱 기반 모션 임베딩과 RAG, 비공개 저장소 "moeru-ai/motion-gen" 에서 개발 - - 임베딩 프로바이더와 DuckDB WASM 을 이용한 벡터 저장 및 검색 + - 시맨틱 기반 모션 임베딩과 RAG, 비공개 저장소 "moeru-ai/motion-gen"에서 개발 + - 임베딩 프로바이더와 DuckDB WASM을 이용한 벡터 저장 및 검색 - Inputs - Discord 음성 채널 음성 인식 수정 - Outputs - 실험적인 노래 기능 - Engineering - 프로젝트 전반의 UnoCSS 설정 공유 - - "moeru-ai/inventory" 의 모델 카탈로그 + - "moeru-ai/inventory"의 모델 카탈로그 - 조직 간 패키지 재정리 - Assets - 스티커, UI 요소, VTuber 로고 등 새 캐릭터 에셋 - 보이스 라인 선택 기능 - - 캐릭터 "Me" 와 "ReLU" 의 Live2D 모델링 + - 캐릭터 "Me"와 "ReLU"의 Live2D 모델링 - 커뮤니티 지원 & 마케팅 - 일본어 README - Plausible 애널리틱스 연동 diff --git a/docs/content/ko/blog/DevLog-2025.06.08/index.md b/docs/content/ko/blog/DevLog-2025.06.08/index.md index 8bdb3455b..db468cf5c 100644 --- a/docs/content/ko/blog/DevLog-2025.06.08/index.md +++ b/docs/content/ko/blog/DevLog-2025.06.08/index.md @@ -9,19 +9,19 @@ preview-cover: dark: "@assets('/en/blog/DevLog-2025.06.08/assets/250608-dark.avif')" --- -안녕하세요, AIRI 메인테이너 중 한 명인 LemonNeko 입니다. 오늘의 DevLog 주제는 AIRI 데스크톱 펫의 Live2D 모델이 마우스 위치를 바라보게 만드는 방법입니다. +안녕하세요, AIRI 메인테이너 중 한 명인 LemonNeko입니다. 오늘의 DevLog 주제는 AIRI 데스크톱 펫의 Live2D 모델이 마우스 위치를 바라보게 만드는 방법입니다. ## 생각의 연쇄 「Chain of Thoughts」 `` -먼저 알아야 할 것이 있습니다. Live2D 에는 **주시(focus)** 와 **터치(tap)** 라는 두 가지 기본 상호작용이 있습니다. Live2D 캔버스를 만들면 모델이 자동으로 커서 위치를 주시하며 머리와 몸이 커서 쪽을 향합니다. 구현 결과는 이렇습니다: +먼저 알아야 할 것이 있습니다. Live2D에는 **주시(focus)**와 **터치(tap)**라는 두 가지 기본 상호작용이 있습니다. Live2D 캔버스를 만들면 모델이 자동으로 커서 위치를 주시하며 머리와 몸이 커서 쪽을 향합니다. 구현 결과는 이렇습니다: ![](/en/blog/DevLog-2025.06.08/assets/airi-tamagotchi-focus.gif) -하지만 커서가 웹 페이지 밖으로 나가면 Live2D 는 커서가 어디 있는지 알 수 없게 됩니다. 그래서 커서가 어디 있는지 직접 알려 줘야 합니다. +하지만 커서가 웹 페이지 밖으로 나가면 Live2D는 커서가 어디 있는지 알 수 없게 됩니다. 그래서 커서가 어디 있는지 직접 알려 줘야 합니다. -Live2D 에 커서 위치를 알려 주려면 Tauri 의 네이티브 코드 호출 기능으로 Windows API 와 macOS API 를 호출해 ~~unsafe 를 잔뜩 써 가며~~ 화면 전체에서의 커서 위치와 창 자체의 위치를 얻은 뒤, 간단한 계산으로 커서와 창의 상대 위치를 구해야 합니다. +Live2D에 커서 위치를 알려 주려면 Tauri의 네이티브 코드 호출 기능으로 Windows API와 macOS API를 호출해 ~~unsafe를 잔뜩 써 가며~~ 화면 전체에서의 커서 위치와 창 자체의 위치를 얻은 뒤, 간단한 계산으로 커서와 창의 상대 위치를 구해야 합니다. `` @@ -38,7 +38,7 @@ Live2D 에 커서 위치를 알려 주려면 Tauri 의 네이티브 코드 호 - AIRI 창의 크기: `C x D` - 커서 위치: `G, H` -그러면 창 안에서의 커서 상대 위치는 `(G - E, H - F)` 가 됩니다. +그러면 창 안에서의 커서 상대 위치는 `(G - E, H - F)`가 됩니다. 아주 간단해 보이죠? 그럼 코드로 옮겨 봅시다. @@ -55,11 +55,11 @@ listen('tauri-app:window-click-through:mouse-location-and-window-frame', (event: }) ``` -`live2dFocusAt` 은 Live2D 모델에 전달할 좌표 데이터입니다. +`live2dFocusAt`은 Live2D 모델에 전달할 좌표 데이터입니다. ## 모델의 주시 지점을 직접 설정하기 -`live2dFocusAt` 을 Live2D 모델에 넘겨 주시 지점을 직접 설정할 수 있습니다: +`live2dFocusAt`을 Live2D 모델에 넘겨 주시 지점을 직접 설정할 수 있습니다: ```typescript const model = ref(Live2DModel.from('url', { autoInteract: false })) @@ -71,11 +71,11 @@ watch(live2dFocusAt, (point) => { ## 멀티 플랫폼 대응 -안타깝게도 이야기는 생각만큼 간단하지 않았습니다. 위에서 말한 커서-창 상대 위치 계산 방식은 Windows 에서는 동작하지만 macOS 에서는 동작하지 않습니다. macOS 좌표계는 원점이 좌하단에 있고 **Y 축이 위를 향해서** Windows 와 반대이기 때문입니다. 반면 Safari 브라우저에서는 좌표계 원점이 좌상단이고 **Y 축이 아래를 향합니다**. 그래서 macOS 에서의 커서 위치는 `(G - E, D - H + F)` 로 표현해야 합니다. +안타깝게도 이야기는 생각만큼 간단하지 않았습니다. 위에서 말한 커서-창 상대 위치 계산 방식은 Windows에서는 동작하지만 macOS에서는 동작하지 않습니다. macOS 좌표계는 원점이 좌하단에 있고 **Y 축이 위를 향해서** Windows와 반대이기 때문입니다. 반면 Safari 브라우저에서는 좌표계 원점이 좌상단이고 **Y 축이 아래를 향합니다**. 그래서 macOS 에서의 커서 위치는 `(G - E, D - H + F)`로 표현해야 합니다. ## 더 읽을거리 -이번 DevLog 에서는 커서와 창의 상대 위치를 구하는 방법과 Live2D 모델의 주시 지점을 직접 설정하는 방법을 살펴봤습니다. 구현 세부 사항이 궁금하시다면 이 PR 의 [소스 코드](https://github.com/moeru-ai/airi/pull/194)를 확인해 보세요. 아래는 구현 과정에서 참고한 자료입니다. 자세히 읽어 보시고 논의도 환영합니다: +이번 DevLog에서는 커서와 창의 상대 위치를 구하는 방법과 Live2D 모델의 주시 지점을 직접 설정하는 방법을 살펴봤습니다. 구현 세부 사항이 궁금하시다면 이 PR의 [소스 코드](https://github.com/moeru-ai/airi/pull/194)를 확인해 보세요. 아래는 구현 과정에서 참고한 자료입니다. 자세히 읽어 보시고 논의도 환영합니다: - [모델 상호작용 직접 설정하기 - pixi-live2d-display](https://github.com/guansss/pixi-live2d-display/wiki/Complete-Guide#manually-1 "모델 상호작용 직접 설정하기 - pixi-live2d-display") - [Win32 API: GetCursorPos](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getcursorpos "GetCursorPos") diff --git a/docs/content/ko/blog/DevLog-2025.07.18/index.md b/docs/content/ko/blog/DevLog-2025.07.18/index.md index 7fab9c379..9362b8d94 100644 --- a/docs/content/ko/blog/DevLog-2025.07.18/index.md +++ b/docs/content/ko/blog/DevLog-2025.07.18/index.md @@ -3,62 +3,62 @@ title: DevLog @ 2025.07.18 category: DevLog date: 2025-07-18 excerpt: | - Factorio Learning Environment 논문을 바탕으로 저희 Factorio AI 에이전트 프로젝트 `airi-factorio` 를 어떻게 개선할 계획인지 나눠 봅니다. + Factorio Learning Environment 논문을 바탕으로 저희 Factorio AI 에이전트 프로젝트 `airi-factorio`를 어떻게 개선할 계획인지 나눠 봅니다. preview-cover: light: "@assets('/en/blog/DevLog-2025.07.18/assets/factorio-belt.gif')" dark: "@assets('/en/blog/DevLog-2025.07.18/assets/factorio-belt.gif')" --- -안녕하세요, AIRI 메인테이너 중 한 명인 [@LemonNeko](https://github.com/LemonNekoGH) 입니다. +안녕하세요, AIRI 메인테이너 중 한 명인 [@LemonNeko](https://github.com/LemonNekoGH)입니다. ## 돌아보기 -반년 전, 저는 유명한 자동화 생산 시뮬레이션 게임 [Factorio](https://www.factorio.com/) 를 플레이할 수 있는 AI 에이전트 [`airi-factorio`](https://github.com/moeru-ai/airi-factorio) 를 처음 만들어 봤고, 다음과 같은 일들을 했습니다: +반년 전, 저는 유명한 자동화 생산 시뮬레이션 게임 [Factorio](https://www.factorio.com/) 를 플레이할 수 있는 AI 에이전트 [`airi-factorio`](https://github.com/moeru-ai/airi-factorio)를 처음 만들어 봤고, 다음과 같은 일들을 했습니다: -- TypeScript 로 Factorio 모드 작성하기: [tstl](https://github.com/TypeScriptToLua/TypeScriptToLua) 로 TypeScript 코드를 Lua 코드로 컴파일합니다. -- RCON 으로 Factorio 모드와 상호작용하기: [factorio-rcon-api](https://github.com/nekomeowww/factorio-rcon-api) 로 Factorio 와 통신하고, `/c` 명령을 호출해 모드가 등록한 함수를 실행합니다. [@nekomeowww](https://github.com/nekomeowww) 에게 정말 감사드립니다. -- LLM 으로 의사결정하고 플레이어를 조종하는 Lua 코드 생성하기: 프롬프트 엔지니어링으로 LLM 에게 게임 조작 방법과 계획 수립 방법을 알려 주고, RCON 상호작용 코드를 LLM 이 호출할 수 있는 도구로 감쌌습니다. -- 게임 내장 채팅 시스템으로 LLM 과 소통하기: 게임의 표준 출력을 읽고 정규식으로 게임 내 플레이어 채팅 내용을 파싱한 뒤 LLM 에게 보내 처리합니다. -- Factorio 모드 핫 리로드: tstl 플러그인을 작성해 코드 변경을 실시간으로 감지하고 새 모드 내용을 RCON 으로 게임에 보냅니다. 새 모드 코드를 받으면 모든 인터페이스를 언로드하고 모드 코드를 한 번 실행해 핫 리로드를 구현합니다. 다만 기존 모드 상태를 어떻게 제대로 처리할지가 큰 난제가 됐습니다. -- DevContainer 에서 개발하기: 환경을 더 통제 가능하게 만들고 프로젝트 시작을 단순화합니다. +- TypeScript로 Factorio 모드 작성하기: [tstl](https://github.com/TypeScriptToLua/TypeScriptToLua)로 TypeScript 코드를 Lua 코드로 컴파일합니다. +- RCON으로 Factorio 모드와 상호작용하기: [factorio-rcon-api](https://github.com/nekomeowww/factorio-rcon-api)로 Factorio와 통신하고, `/c` 명령을 호출해 모드가 등록한 함수를 실행합니다. [@nekomeowww](https://github.com/nekomeowww)에게 정말 감사드립니다. +- LLM으로 의사결정하고 플레이어를 조종하는 Lua 코드 생성하기: 프롬프트 엔지니어링으로 LLM에게 게임 조작 방법과 계획 수립 방법을 알려 주고, RCON 상호작용 코드를 LLM이 호출할 수 있는 도구로 감쌌습니다. +- 게임 내장 채팅 시스템으로 LLM과 소통하기: 게임의 표준 출력을 읽고 정규식으로 게임 내 플레이어 채팅 내용을 파싱한 뒤 LLM에게 보내 처리합니다. +- Factorio 모드 핫 리로드: tstl 플러그인을 작성해 코드 변경을 실시간으로 감지하고 새 모드 내용을 RCON으로 게임에 보냅니다. 새 모드 코드를 받으면 모든 인터페이스를 언로드하고 모드 코드를 한 번 실행해 핫 리로드를 구현합니다. 다만 기존 모드 상태를 어떻게 제대로 처리할지가 큰 난제가 됐습니다. +- DevContainer에서 개발하기: 환경을 더 통제 가능하게 만들고 프로젝트 시작을 단순화합니다. - 심볼릭 링크로 `tstl` 출력 디렉터리를 게임 디렉터리에 연결하기: 게임 디렉터리에서 컴파일된 Lua 코드를 바로 볼 수 있어 디버깅이 쉬워집니다. 이 과정에서 정말 많은 걸 배웠습니다 ~~(특히 Lua 배열 인덱스는 1부터 시작한다는 것)~~. -하지만 문제도 많이 겪었습니다. 주요 동작을 모드 안에 작성하다 보니 디버깅이 아주 번거로웠습니다. 모드 변경을 적용하려면 맵에서 나와 게임 메인 화면으로 돌아갔다가 다시 들어와야 했죠. `data.lua` 가 들어간 조금 더 복잡한 모드라면 게임 자체를 재시작해야 했습니다. +하지만 문제도 많이 겪었습니다. 주요 동작을 모드 안에 작성하다 보니 디버깅이 아주 번거로웠습니다. 모드 변경을 적용하려면 맵에서 나와 게임 메인 화면으로 돌아갔다가 다시 들어와야 했죠. `data.lua`가 들어간 조금 더 복잡한 모드라면 게임 자체를 재시작해야 했습니다. -LLM 에게 Lua 코드를 생성하게 한 뒤 RCON 으로 게임 명령 `/c` 를 호출해 실행했는데, Factorio 는 명령 하나당 길이 제한이 있습니다. 코드가 길어지면 여러 번 나눠 실행해야 했습니다. +LLM에게 Lua 코드를 생성하게 한 뒤 RCON으로 게임 명령 `/c`를 호출해 실행했는데, Factorio는 명령 하나당 길이 제한이 있습니다. 코드가 길어지면 여러 번 나눠 실행해야 했습니다. 지금 코드는 견고성과 유지보수성이 떨어집니다. 새 친구가 개발에 참여하거나, 심지어 그냥 한번 써 보려고만 해도 이 프로젝트를 시작하는 게 매우 어렵습니다. ## Factorio Learning Environment -시간이 흘러 지금, 이 프로젝트를 제대로 정리하려 했지만 어디서부터 시작해야 할지 몰랐습니다. 마침 누군가 [Factorio Learning Environment](https://arxiv.org/abs/2503.09617) 라는 논문을 언급하더군요. 간단히 훑어보겠습니다. +시간이 흘러 지금, 이 프로젝트를 제대로 정리하려 했지만 어디서부터 시작해야 할지 몰랐습니다. 마침 누군가 [Factorio Learning Environment](https://arxiv.org/abs/2503.09617)라는 논문을 언급하더군요. 간단히 훑어보겠습니다. -이 논문에서 저자들은 Factorio Learning Environment(FLE)라는 프레임워크를 제안하고, 장기 계획 수립, 프로그램 합성, 자원 관리, 공간 추론에서 AI 의 능력을 테스트했습니다. +이 논문에서 저자들은 Factorio Learning Environment(FLE)라는 프레임워크를 제안하고, 장기 계획 수립, 프로그램 합성, 자원 관리, 공간 추론에서 AI의 능력을 테스트했습니다. -FLE 에는 두 가지 모드가 있습니다: +FLE에는 두 가지 모드가 있습니다: -- Lab-play: 자원이 제한된, 사람이 직접 설계한 24개 레벨에서 테스트하며, 제한된 자원으로 AI 가 효율적으로 생산 라인을 지을 수 있는지 봅니다. -- Open-play: 제한 없는 대형 맵에서 절차적으로 생성된 지형 위에 가장 큰 공장을 짓는 것이 목표이며, AI 의 장기적 자율 목표 설정·탐험·확장 능력을 테스트합니다. +- Lab-play: 자원이 제한된, 사람이 직접 설계한 24개 레벨에서 테스트하며, 제한된 자원으로 AI가 효율적으로 생산 라인을 지을 수 있는지 봅니다. +- Open-play: 제한 없는 대형 맵에서 절차적으로 생성된 지형 위에 가장 큰 공장을 짓는 것이 목표이며, AI의 장기적 자율 목표 설정·탐험·확장 능력을 테스트합니다. -저자들은 Claude 3.5 Sonnet, GPT-4o, Deepseek-v3, Gemini-2 같은 주요 LLM 을 평가했는데, Lab-play 에서는 당시 가장 강했던 Claude 3.5 조차 7개 레벨만 완료했습니다. +저자들은 Claude 3.5 Sonnet, GPT-4o, Deepseek-v3, Gemini-2 같은 주요 LLM을 평가했는데, Lab-play에서는 당시 가장 강했던 Claude 3.5 조차 7개 레벨만 완료했습니다. -여기까지 읽고 나니 궁금해졌습니다. 평가가 이렇게 복잡한데 기술적 유지보수성도 확보했을 텐데, 어떻게 했을까? 계속 읽어 보니 구현 방식이 `airi-factorio` 와 아주 비슷하면서도 여러 장점이 있었습니다: +여기까지 읽고 나니 궁금해졌습니다. 평가가 이렇게 복잡한데 기술적 유지보수성도 확보했을 텐데, 어떻게 했을까? 계속 읽어 보니 구현 방식이 `airi-factorio`와 아주 비슷하면서도 여러 장점이 있었습니다: -- Python 으로 작성되어 있어 LLM 이 Python 코드를 생성하면 Python REPL 에서 바로 실행하고 표준 출력에서 결과를 바로 읽을 수 있습니다. Python 은 Lua 보다 데이터셋이 훨씬 많아 생성 정확도가 높고 더 복잡한 코드도 만들 수 있습니다. -- Lua 모드는 place_entity 처럼 실행을 위한 기본 동작만 담고, 더 복잡한 로직은 Python 에 둡니다. 덕분에 Lua 모드에 버그가 생길 여지가 줄어 게임을 그렇게 자주 재시작하지 않아도 됩니다. +- Python으로 작성되어 있어 LLM이 Python 코드를 생성하면 Python REPL에서 바로 실행하고 표준 출력에서 결과를 바로 읽을 수 있습니다. Python은 Lua보다 데이터셋이 훨씬 많아 생성 정확도가 높고 더 복잡한 코드도 만들 수 있습니다. +- Lua 모드는 place_entity처럼 실행을 위한 기본 동작만 담고, 더 복잡한 로직은 Python에 둡니다. 덕분에 Lua 모드에 버그가 생길 여지가 줄어 게임을 그렇게 자주 재시작하지 않아도 됩니다. - Lua 코드 실행에 `/c` 대신 `/sc` 명령을 씁니다. 코드를 콘솔에 출력하지 않아 콘솔이 깔끔하게 유지되고 필요한 내용만 남아, 표준 입력 파싱 난이도가 낮아집니다. LLM 능력을 더 잘 평가하기 위해 필요한 모든 레시피 생산 과정과 난이도도 면밀히 분석해, 아이템 생산 비용이나 LLM 점수 계산 방법 같은 몇 가지 공식을 정리해 두었습니다. [시스템 프롬프트](https://arxiv.org/html/2503.09617v1#A8.SS4)도 공개했는데, 환경 구조, 응답 형식, 모범 사례, 게임 출력을 이해하는 방법 등이 명시되어 있습니다. -## 다시 `airi-factorio` 로 +## 다시 `airi-factorio`로 -FLE 와 비교하면 저희 구현은 꽤 순진해 보입니다. 그럼 `airi-factorio` 를 어떻게 개선해야 할까요? +FLE와 비교하면 저희 구현은 꽤 순진해 보입니다. 그럼 `airi-factorio`를 어떻게 개선해야 할까요? -저는 Python 을 쓰고 싶지 않고, TypeScript 와 Golang 에만 익숙합니다. 마침 얼마 전 가능한 모든 MCP 서버에 적합한 빌더인 [mcp-launcher](https://github.com/moeru-ai/mcp-launcher) 를 만들었습니다. 이걸 Golang 과 함께 써서 MCP 서버를 구현하고, LLM 이 이를 호출하게 하면 됩니다. +저는 Python을 쓰고 싶지 않고, TypeScript와 Golang 에만 익숙합니다. 마침 얼마 전 가능한 모든 MCP 서버에 적합한 빌더인 [mcp-launcher](https://github.com/moeru-ai/mcp-launcher)를 만들었습니다. 이걸 Golang과 함께 써서 MCP 서버를 구현하고, LLM이 이를 호출하게 하면 됩니다. 그래서 구조도가 이렇게 바뀌었습니다: @@ -70,16 +70,16 @@ FLE 와 비교하면 저희 구현은 꽤 순진해 보입니다. 그럼 `airi-f
-플레이어 채팅 내용은 더 이상 LLM 으로 보내지 않고 [RconChat](https://gitlab.com/FishBus/rconchat) 모드에 저장하며, LLM 은 MCP 서버를 통해 이 내용을 읽습니다. MCP 서버 방식이라면 LLM 이 Lua 코드를 생성할 필요도 없어집니다. +플레이어 채팅 내용은 더 이상 LLM으로 보내지 않고 [RconChat](https://gitlab.com/FishBus/rconchat) 모드에 저장하며, LLM은 MCP 서버를 통해 이 내용을 읽습니다. MCP 서버 방식이라면 LLM이 Lua 코드를 생성할 필요도 없어집니다. -시스템 프롬프트는 현재 AI 가 생성한 것이라 아직 충분히 명확하지 않고 우선순위도 흐릿합니다. FLE 의 시스템 프롬프트를 참고해 개선할 계획입니다. +시스템 프롬프트는 현재 AI가 생성한 것이라 아직 충분히 명확하지 않고 우선순위도 흐릿합니다. FLE의 시스템 프롬프트를 참고해 개선할 계획입니다. 자, 이전 설계를 사실상 전부 뒤엎었습니다. 처음부터 다시 시작할 시간이네요. ## 맺으며 -읽어 주셔서 감사합니다. 관심 있으시다면 FLE 의 논문과 [코드](https://github.com/JackHopkins/factorio-learning-environment)를 직접 읽어 보세요. 제 이해가 틀렸을 수도 있으니 정정 환영합니다! 이번 읽기는 충분히 깊지 않았을지도 모르지만, 앞으로 제 아이디어대로 `airi-factorio` 를 개선해 나가면서 반복해 읽고 진전이 있을 때마다 업데이트하겠습니다. +읽어 주셔서 감사합니다. 관심 있으시다면 FLE의 논문과 [코드](https://github.com/JackHopkins/factorio-learning-environment)를 직접 읽어 보세요. 제 이해가 틀렸을 수도 있으니 정정 환영합니다! 이번 읽기는 충분히 깊지 않았을지도 모르지만, 앞으로 제 아이디어대로 `airi-factorio`를 개선해 나가면서 반복해 읽고 진전이 있을 때마다 업데이트하겠습니다. -이번 DevLog 는 여기까지입니다. 좋은 주말 보내세요! +이번 DevLog는 여기까지입니다. 좋은 주말 보내세요! > 커버 일러스트 [@anrew10](https://es.pixilart.com/art/factorio-yellow-belt-132272fb3d727dd) diff --git a/docs/content/ko/blog/DevLog-2025.08.01/index.md b/docs/content/ko/blog/DevLog-2025.08.01/index.md index 909fbcee5..0c8872d2a 100644 --- a/docs/content/ko/blog/DevLog-2025.08.01/index.md +++ b/docs/content/ko/blog/DevLog-2025.08.01/index.md @@ -3,7 +3,7 @@ title: DevLog @ 2025.08.01 category: DevLog date: 2025-08-01 excerpt: | - Makito 가 AIRI 에서 텍스트 애니메이션을 구현하다가, UTF-8 바이트 스트림으로 들어오는 grapheme cluster 를 다루는 라이브러리를 만들기까지의 여정을 나눕니다.
유익하고 영감이 되기를 바랍니다! + Makito가 AIRI에서 텍스트 애니메이션을 구현하다가, UTF-8 바이트 스트림으로 들어오는 grapheme cluster를 다루는 라이브러리를 만들기까지의 여정을 나눕니다.
유익하고 영감이 되기를 바랍니다! preview-cover: light: "@assets('/en/blog/DevLog-2025.08.01/assets/cover-light.avif')" dark: "@assets('/en/blog/DevLog-2025.08.01/assets/cover-dark.avif')" @@ -41,7 +41,7 @@ const trioCluster = ['👩‍👧', '‍', '👦'] ## 시작하기 전에 -안녕하세요, Makito 입니다. +안녕하세요, Makito입니다.