<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>연구실 |</title><link>https://inhyuk2000.github.io/tags/%EC%97%B0%EA%B5%AC%EC%8B%A4/</link><atom:link href="https://inhyuk2000.github.io/tags/%EC%97%B0%EA%B5%AC%EC%8B%A4/index.xml" rel="self" type="application/rss+xml"/><description>연구실</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Tue, 15 Jul 2025 00:00:00 +0900</lastBuildDate><image><url>https://inhyuk2000.github.io/media/icon_hu_eee4a95885829ab2.png</url><title>연구실</title><link>https://inhyuk2000.github.io/tags/%EC%97%B0%EA%B5%AC%EC%8B%A4/</link></image><item><title>LLM을 활용한 자연어 기반 알림 전송 제어 시스템 개발</title><link>https://inhyuk2000.github.io/projects/a-natural-language-based-notification-delivery-control-system-using-llm/</link><pubDate>Tue, 15 Jul 2025 00:00:00 +0900</pubDate><guid>https://inhyuk2000.github.io/projects/a-natural-language-based-notification-delivery-control-system-using-llm/</guid><description>&lt;h4 id="-paper"&gt;📄 Paper&lt;/h4&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;KSC 2025 Paper Accept&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;📑
&lt;/p&gt;
&lt;h4 id="-poster"&gt;🖼️ Poster&lt;/h4&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;KCC 2025 Conference Poster&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;📄
&lt;/p&gt;
&lt;h3 id="요약"&gt;요약&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;프로젝트 이름&lt;/strong&gt;: LLM을 활용한 자연어 기반 알림 전송 제어 시스템 개발&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;프로젝트 기간&lt;/strong&gt;: 2025.07 ~ 2025.11&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;프로젝트 설명&lt;/strong&gt;: 사용자의 자연어 명령에서 알림 수신 조건과 대상을 추출하고, 조건에 맞는 알림만 선별적으로 전송하는 LLM 기반 모바일 알림 제어 시스템&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;프로젝트 목적&lt;/strong&gt;: 복잡한 수동 설정 과정과 머신러닝 기반 자동 예측의 부정확성을 개선하여 사용자가 자연어만으로 원하는 알림 수신 조건을 설정할 수 있도록 지원&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;데이터 출처&lt;/strong&gt;: 사용자 7명으로부터 수집한 자연어 명령 시나리오 24개&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;주요 설계 대상&lt;/strong&gt;: 시간·장소·활동을 나타내는 조건 필드와 앱·키워드를 나타내는 대상 필드&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;프로젝트 성과&lt;/strong&gt;: KSC 2025 논문 발표 및 Paper Accept&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;code&gt;연구 시작 배경&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&amp;ldquo;알림을 일일히 &lt;strong&gt;수동으로 설정&lt;/strong&gt;하기 어렵다.&amp;rdquo;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&amp;ldquo;현재 알림 시스템은 시간/앱/내용/패턴 등의 &lt;strong&gt;컨텍스트&lt;/strong&gt;를 충분히 고려하지 못한다.&amp;rdquo;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이로 인해, &lt;strong&gt;사용자가 에이전트에게 알림 커스터마이징을 요청했을 때, 자동으로 커스터마이징 해주는 기능&lt;/strong&gt;을 핵심 아이디어로 도출함.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;구현 가능성 기술 조사&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Google Assistant&lt;/code&gt;, &lt;code&gt;Bixby&lt;/code&gt;, &lt;code&gt;Gemini&lt;/code&gt; 의 기존 음성 에이전트로 구현 가능성 조사
&lt;ul&gt;
&lt;li&gt;단순 앱 실행이 아니라 &lt;strong&gt;앱 내부의 특정 알림 제어 기능까지 자연어로 실행할 수 있는지&lt;/strong&gt; 조사함.&lt;/li&gt;
&lt;li&gt;Google Assistant의 App Actions, Shortcut / Bixby Capsule / Gemini 연동 가능성을 각각 확인함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-yellow-100 dark:bg-yellow-900 border-yellow-500"
data-callout="question"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-yellow-700 dark:text-yellow-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9.879 7.519c1.172-1.025 3.071-1.025 4.243 0c1.171 1.025 1.171 2.687 0 3.712q-.308.268-.67.442c-.746.361-1.452.999-1.452 1.827v.75M21 12a9 9 0 1 1-18 0a9 9 0 0 1 18 0m-9 5.25h.008v.008H12z"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;하지만 &lt;strong&gt;Google Assistant&lt;/strong&gt; 는 &lt;code&gt;App Actions&lt;/code&gt;, &lt;code&gt;Shortcut&lt;/code&gt; 중심으로 미리 정의된 액션에 매핑해야 하는 제약이 있고, 테스트 도구도 &lt;code&gt;Google Console&lt;/code&gt;에 너무 의존하고 있었음. &lt;strong&gt;Gemini&lt;/strong&gt;는 앱을 열어주는 수준이 아니라 앱 내부 알림 데이터를 자유롭게 제어하는 수준이 불가능했음. 마지막으로 &lt;strong&gt;Bixby Capsule&lt;/strong&gt;은 그나마 가능성이 있어시 실제 프로토타입까지 만들어 보았지만, 사용자의 자유로운 명령에 대응하기 위한 &lt;code&gt;goal&lt;/code&gt;, &lt;code&gt;intent&lt;/code&gt;, &lt;code&gt;training&lt;/code&gt; 등 사전 정의 작업이 필요했음.&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;결국 위 세가지 방식들은 전부 기각하고, &lt;code&gt;LLM Function Calling&lt;/code&gt; 기술을 기반으로 직접 구현하기로 결정.&lt;/p&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;LLM Function Calling&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;포폴에 작성된 내용&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;사용자 수집 데이터 기반 자료구조 설계 (JSON Schema)&lt;/li&gt;
&lt;li&gt;시스템 구조 설계 (알림 관리자, 조건 추출자)&lt;/li&gt;
&lt;li&gt;개발&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;포폴 이후 NotiLLM 개인 프로젝트 발전&lt;/code&gt; &lt;span class="high-mark"&gt;&lt;strong&gt;진행중&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;목표: &lt;strong&gt;LLM 시스템 Evaluation&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;LangChain&lt;/code&gt; 및 &lt;code&gt;LangGraph&lt;/code&gt;를 활용해 Version 개선&lt;/strong&gt;, &lt;strong&gt;부하 테스트&lt;/strong&gt;, &lt;strong&gt;배포&lt;/strong&gt;, &lt;strong&gt;사용자 피드백&lt;/strong&gt; 진행해 연구를 개선하는 것.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="자료구조-시나리오-설계-과정"&gt;자료구조 시나리오 설계 과정&lt;/h3&gt;
&lt;p&gt;사용자의 자연어를 Function Calling 기능을 활용해 JSON 구조로 변환해야겠다고 결정했을 때, 두 가지 조건을 결정해야 했습니다. 따라서 &lt;span class="high-mark"&gt;&lt;strong&gt;&amp;ldquo;알림을 언제 보내줘야 하지?&amp;rdquo;&lt;/strong&gt;&lt;/span&gt;
, &lt;span class="high-mark"&gt;&lt;strong&gt;&amp;ldquo;어떤 유형의 알림을 보내줘야 하지?&amp;rdquo;&lt;/strong&gt;&lt;/span&gt;
와 같은 결정을 내리기 위해서, 저는 8명의 참여자들로부터 총 24개의 질문 시나리오를 받고, 이를 바탕으로 가능한 JSON 구조를 설계했습니다.&lt;/p&gt;
&lt;h4 id="json-schema-설계"&gt;JSON Schema 설계&lt;/h4&gt;
&lt;p&gt;참여자들의 자연어 명령을 분석한 결과, 알림 제어에 필요한 정보는 크게 &lt;strong&gt;알림 대상(Notification Target)&lt;/strong&gt; 과 &lt;strong&gt;알림 조건(Notification Condition)&lt;/strong&gt; 으로 구분할 수 있었습니다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Notification Target&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;앱 이름을 기반으로 알림을 필터링&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;content&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;알림 제목 및 본문의 키워드를 기반으로 알림을 필터링&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Notification Condition&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;time.relative&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;현재 시점을 기준으로 한 상대 시간 (예: 5분 후)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;time.absolute&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;특정 절대 시간 (예: 오후 3시)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;activity&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;사용자의 현재 활동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;location&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;사용자의 현재 위치&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이를 바탕으로 다음과 같은 JSON 구조를 설계했습니다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;extract_notification_target&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;extract_notification_condition&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;relative&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;absolute&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;activity&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;location&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="작동-시스템-설계"&gt;작동 시스템 설계&lt;/h3&gt;
&lt;p&gt;이후 사용자의 자연어 명령을 위와 같이 JSON 자료구조로 변환하는 &lt;span class="high-mark"&gt;&lt;strong&gt;NotificationParser&lt;/strong&gt;&lt;/span&gt;
와 데이터베이스에 저장된 알림 내용들과 조건 목록들을 모니터링하는 &lt;span class="high-mark"&gt;&lt;strong&gt;ContextManager&lt;/strong&gt;&lt;/span&gt;
를 두 핵심 기능으로 삼아 개발을 진행했습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="트러블슈팅-과정"&gt;트러블슈팅 과정&lt;/h3&gt;
&lt;p&gt;해당 기능을 구현한 뒤 실제 환경에서 테스트하는 과정에서 예상치 못한 문제가 발생했습니다. 2025년 4월 One UI 7 업데이트 이후 &lt;strong&gt;알림에 표시되는 앱 아이콘이 시스템에 의해 임의로 변경&lt;/strong&gt;되었으며, 삼성의 내부 프레임워크가 공개되어 있지 않아 코드 수정만으로는 기존과 동일한 smallIcon을 가져올 수 없었습니다.&lt;/p&gt;
&lt;p&gt;약 2개월간 다양한 해결 방법을 검토했지만, 최종적으로 애플리케이션 코드 수준에서는 해결하기 어렵다는 결론에 도달했습니다. 이에 &lt;span class="high-mark"&gt;&lt;strong&gt;시스템 설정에서 알림 표시 방식을 이전 버전과 유사하게 변경하는 방법을 사용자에게 안내하는 방식으로 우회책을 마련&lt;/strong&gt;&lt;/span&gt;
했습니다. 이를 통해 개발 과정에서는 코드 개선뿐만 아니라 플랫폼의 제약을 파악하고, 제한된 환경 안에서 사용자 경험을 보완할 수 있는 현실적인 대안을 찾는 것 역시 중요하다는 점을 배웠습니다.&lt;/p&gt;
&lt;h3 id="프로젝트를-진행하며-느낀점"&gt;프로젝트를 진행하며 느낀점&lt;/h3&gt;
&lt;p&gt;알림 관련 문제 상황을 제가 제일 관심이 많이 있는 LLM 모델과 결합하다가 나온 연구 주제입니다. 선배분의 아이디어 기획 능력으로 초반 아이디어 구체화 부분은 수월하게 진행되었지만, 이후 자료구조 설계와 사용자 조사, 그리고 개발 및 논문 작성까지 주도적으로 작성하게 되어서 힘들었지만 많이 배우고 성장할 수 있는 뜻깊은 시간이었습니다. 문제 분석 - 기획 - 해결 아이디어 탐색 - 개발 - 논문 작성 까지의 일련의 흐름을 거치니, 논문과 프로젝트의 퀄리티를 좌지우지하는 중요한 과정은 개발이 아닌 &lt;span class="high-mark"&gt;&lt;strong&gt;문제 분석과 기획&lt;/strong&gt;&lt;/span&gt;
임을 다시 한 번 느꼈습니다. 또한 개발을 진행하는 과정에서 Android 버전이 바뀌어 아이콘이 깨지는 문제를 한동안 해결하느라 고생했던 것 같습니다. 이러한 예상치 못했던 문제에 대한 &lt;span class="high-mark"&gt;&lt;strong&gt;트러블슈팅 과정&lt;/strong&gt;&lt;/span&gt;
역시 저를 더 성장하게 해준 계기가 되었던 것 같습니다.&lt;/p&gt;</description></item></channel></rss>