<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Braincache - Projects</title>
        <link>https://teddynote-lab.github.io/brain-cache/projects</link>
        <description>회사 프로젝트 회고와 의사결정 기록</description>
        <lastBuildDate>Sat, 20 Dec 2025 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>ko</language>
        <item>
            <title><![CDATA[IBK캐피탈 AI 여신 승인신청서 자동화 시스템 구축기]]></title>
            <link>https://teddynote-lab.github.io/brain-cache/projects/ibk-capital-ai-approval-system</link>
            <guid>https://teddynote-lab.github.io/brain-cache/projects/ibk-capital-ai-approval-system</guid>
            <pubDate>Sat, 20 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[완전폐쇄망(On-Prem) 환경에서 RAG 기반 승인신청서 자동 생성 시스템을 구축하며 겪은 기술적 도전과 해결 과정을 공유합니다.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tldr">TL;DR<a href="https://teddynote-lab.github.io/brain-cache/projects/ibk-capital-ai-approval-system#tldr" class="hash-link" aria-label="TL;DR에 대한 직접 링크" title="TL;DR에 대한 직접 링크" translate="no">​</a></h2>
<blockquote>
<p>IBK캐피탈의 승인신청서 작성 소요시간을 <strong>3.5일에서 1일 이내로 약 70% 단축</strong>하고, 반복문서 자동화를 통해 <strong>연간 약 4.7억 원 절감 효과</strong>를 달성한 AI PoC 프로젝트입니다. 완전폐쇄망(On-Prem) 환경에서 RAG 파이프라인을 구축하며, Table-First 파싱 전략과 HeadingRefiner 기반 청킹으로 금융 문서의 수치 정확성 문제를 해결했습니다.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="프로젝트-배경">프로젝트 배경<a href="https://teddynote-lab.github.io/brain-cache/projects/ibk-capital-ai-approval-system#%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%B0%B0%EA%B2%BD" class="hash-link" aria-label="프로젝트 배경에 대한 직접 링크" title="프로젝트 배경에 대한 직접 링크" translate="no">​</a></h2>
<p>승인신청서는 IBK캐피탈 영업점이 기업고객과 상담 후 작성하는 비정형 문서입니다. 사업보고서, 감사보고서, 재무제표 등 다양한 문서를 참조하여 9개 섹션을 채워야 하며, 작성과 검토에 많은 시간과 인력이 소요됩니다.</p>
<p><strong>핵심 과제:</strong> 생성형 AI 기반 자동화를 통해 문서 작성 효율성과 정확성을 동시에 높이는 것. 특히 <strong>완전폐쇄망</strong> 환경이라는 제약이 있었습니다.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="기술적-도전과-해결">기술적 도전과 해결<a href="https://teddynote-lab.github.io/brain-cache/projects/ibk-capital-ai-approval-system#%EA%B8%B0%EC%88%A0%EC%A0%81-%EB%8F%84%EC%A0%84%EA%B3%BC-%ED%95%B4%EA%B2%B0" class="hash-link" aria-label="기술적 도전과 해결에 대한 직접 링크" title="기술적 도전과 해결에 대한 직접 링크" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-문서-전처리-파이프라인-table-first-전략">1. 문서 전처리 파이프라인: Table-First 전략<a href="https://teddynote-lab.github.io/brain-cache/projects/ibk-capital-ai-approval-system#1-%EB%AC%B8%EC%84%9C-%EC%A0%84%EC%B2%98%EB%A6%AC-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8-table-first-%EC%A0%84%EB%9E%B5" class="hash-link" aria-label="1. 문서 전처리 파이프라인: Table-First 전략에 대한 직접 링크" title="1. 문서 전처리 파이프라인: Table-First 전략에 대한 직접 링크" translate="no">​</a></h3>
<p>금융 문서에서 가장 중요한 건 <strong>수치의 정확성</strong>입니다. 단순 PDF 텍스트 추출로는 표 데이터가 깨지는 문제가 있었습니다.</p>
<p>우리가 세운 3가지 원칙:</p>
<ul>
<li class=""><strong>정확한 수치 보존</strong> — 재무제표의 숫자 하나가 틀리면 전체 신뢰도가 무너짐</li>
<li class=""><strong>문서 내 의미 단락을 정확히 추출</strong> — 섹션별로 올바른 컨텍스트를 전달해야 함</li>
<li class=""><strong>근거 기반 의견 생성</strong> — 출처가 명확한 답변이 필수</li>
</ul>
<p>이를 위해 <strong>Table-First Approach</strong>를 채택했습니다:</p>
<ol>
<li class="">Table 문서를 우선 처리 — 표 구조가 수치 왜곡이 가장 적음</li>
<li class="">일반 PDF 텍스트는 fallback으로 보완</li>
<li class="">OCR은 최후 수단으로만 사용</li>
</ol>
<p><img decoding="async" loading="lazy" alt="Parser &amp;amp; Chunker 아키텍처" src="https://teddynote-lab.github.io/brain-cache/assets/images/architecture-6cb9fe8a6e0f195e5fa5f96236a24fb5.png" width="626" height="904" class="img_ev3q"></p>
<p>전체 종합 처리 플로우는 다음과 같습니다:</p>
<p><img decoding="async" loading="lazy" alt="종합 처리 플로우" src="https://teddynote-lab.github.io/brain-cache/assets/images/processing-flow-2ada331ed9868c6396f92c4a07687aad.png" width="1516" height="737" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-headingrefiner-의미-단락-분리의-핵심">2. HeadingRefiner: 의미 단락 분리의 핵심<a href="https://teddynote-lab.github.io/brain-cache/projects/ibk-capital-ai-approval-system#2-headingrefiner-%EC%9D%98%EB%AF%B8-%EB%8B%A8%EB%9D%BD-%EB%B6%84%EB%A6%AC%EC%9D%98-%ED%95%B5%EC%8B%AC" class="hash-link" aria-label="2. HeadingRefiner: 의미 단락 분리의 핵심에 대한 직접 링크" title="2. HeadingRefiner: 의미 단락 분리의 핵심에 대한 직접 링크" translate="no">​</a></h3>
<p>청킹(Chunking) 품질은 heading 추출의 정확도에 직결됩니다. 이를 위해 <strong>HeadingRefiner</strong> 모듈을 설계했습니다:</p>
<ul>
<li class=""><strong>목차가 있는 문서</strong>: 목차 기반으로 계층 구조를 자동 구성 → LLM 호출 최소화</li>
<li class=""><strong>목차가 없는 문서</strong>: LLM을 활용하여 heading 계층을 재구성</li>
</ul>
<p>이 접근법으로 의미 단락을 더 정확하게 분리할 수 있었고, 최종적으로 의견 생성 품질이 크게 향상되었습니다.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-비동기--병렬처리로-소요시간-54-단축">3. 비동기 + 병렬처리로 소요시간 54% 단축<a href="https://teddynote-lab.github.io/brain-cache/projects/ibk-capital-ai-approval-system#3-%EB%B9%84%EB%8F%99%EA%B8%B0--%EB%B3%91%EB%A0%AC%EC%B2%98%EB%A6%AC%EB%A1%9C-%EC%86%8C%EC%9A%94%EC%8B%9C%EA%B0%84-54-%EB%8B%A8%EC%B6%95" class="hash-link" aria-label="3. 비동기 + 병렬처리로 소요시간 54% 단축에 대한 직접 링크" title="3. 비동기 + 병렬처리로 소요시간 54% 단축에 대한 직접 링크" translate="no">​</a></h3>
<p>초기 파이프라인은 문서 하나를 처리하는 데 <strong>12분 41초</strong>가 걸렸습니다. 두 가지 최적화를 동시에 적용했습니다:</p>
<ul>
<li class=""><strong>Heading 정제 및 메타데이터 생성 과정을 비동기 처리</strong></li>
</ul>
<p><img decoding="async" loading="lazy" alt="비동기 처리 구조" src="https://teddynote-lab.github.io/brain-cache/assets/images/async-processing-485402e88290abf430fdb92b7a8d1ad8.png" width="1366" height="648" class="img_ev3q"></p>
<ul>
<li class=""><strong>다중 Worker 기반 병렬 처리</strong></li>
</ul>
<p><img decoding="async" loading="lazy" alt="병렬 처리 구조" src="https://teddynote-lab.github.io/brain-cache/assets/images/parallel-processing-f31842e8e060599c03ad9897db93d9ae.png" width="1704" height="1202" class="img_ev3q"></p>
<p>결과: <strong>12분 41초 → 5분 54초</strong> (약 54% 단축)</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-rag-파이프라인-tabular-데이터의-정보-손실-최소화">4. RAG 파이프라인: Tabular 데이터의 정보 손실 최소화<a href="https://teddynote-lab.github.io/brain-cache/projects/ibk-capital-ai-approval-system#4-rag-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8-tabular-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%9D%98-%EC%A0%95%EB%B3%B4-%EC%86%90%EC%8B%A4-%EC%B5%9C%EC%86%8C%ED%99%94" class="hash-link" aria-label="4. RAG 파이프라인: Tabular 데이터의 정보 손실 최소화에 대한 직접 링크" title="4. RAG 파이프라인: Tabular 데이터의 정보 손실 최소화에 대한 직접 링크" translate="no">​</a></h3>
<p>전처리된 PDF에서 추출된 표 데이터는 형태가 가변적입니다. LLM이 이를 해석할 때 정보 손실을 최소화하기 위해, 컨텍스트로 활용되는 <strong>데이터 형태를 Markdown KV(Key-Value) 구조로 변환</strong>하여 적용했습니다.</p>
<p><img decoding="async" loading="lazy" alt="Markdown KV 변환 예시" src="https://teddynote-lab.github.io/brain-cache/assets/images/markdown-kv-3ca3bbb6824fb5c5e1efdfa8d79e2987.png" width="750" height="456" class="img_ev3q"></p>
<p>Prompt Engineering을 통해 승인신청서 내부 9개 Section에 대한 개별 응답을 생성하도록 최적화했습니다.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="기술-스택">기술 스택<a href="https://teddynote-lab.github.io/brain-cache/projects/ibk-capital-ai-approval-system#%EA%B8%B0%EC%88%A0-%EC%8A%A4%ED%83%9D" class="hash-link" aria-label="기술 스택에 대한 직접 링크" title="기술 스택에 대한 직접 링크" translate="no">​</a></h2>

























<table><thead><tr><th>항목</th><th>상세</th></tr></thead><tbody><tr><td>Web Client</td><td>Next.js</td></tr><tr><td>Backend Server</td><td>FastAPI</td></tr><tr><td>Database</td><td>Elasticsearch, Redis</td></tr><tr><td>환경</td><td>On-Prem (완전폐쇄망)</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="성과">성과<a href="https://teddynote-lab.github.io/brain-cache/projects/ibk-capital-ai-approval-system#%EC%84%B1%EA%B3%BC" class="hash-link" aria-label="성과에 대한 직접 링크" title="성과에 대한 직접 링크" translate="no">​</a></h2>
<ul>
<li class=""><strong>작성 소요시간 약 70% 단축</strong>: 기존 3.5일 → 1일 이내</li>
<li class=""><strong>자동작성으로 생산성 23%p 향상</strong></li>
</ul>
<p><img decoding="async" loading="lazy" alt="생산성 향상 지표" src="https://teddynote-lab.github.io/brain-cache/assets/images/productivity-118b54670f71d0435b60ce03357a65cf.png" width="1280" height="716" class="img_ev3q"></p>
<ul>
<li class=""><strong>연간 약 4.7억 원 인건비 절감 효과</strong></li>
</ul>
<p><img decoding="async" loading="lazy" alt="인건비 절감 효과" src="https://teddynote-lab.github.io/brain-cache/assets/images/cost-saving-4452e5f78ccd23275547c87164aa47e0.png" width="1270" height="784" class="img_ev3q"></p>
<ul>
<li class=""><strong>내부 실무자 만족도 약 80% 달성</strong>
<ul>
<li class="">정성점수: 79.41/100</li>
<li class="">평균 만족도: 4/5</li>
</ul>
</li>
</ul>
<p><img decoding="async" loading="lazy" alt="만족도 평가 결과" src="https://teddynote-lab.github.io/brain-cache/assets/images/survey-1-b55e936451104a341128314757335ec9.png" width="7368" height="4096" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="만족도 상세 결과" src="https://teddynote-lab.github.io/brain-cache/assets/images/survey-2-d567a019b3b9778524421b2b0eba8cb8.png" width="7296" height="4144" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="만족도 항목별 결과" src="https://teddynote-lab.github.io/brain-cache/assets/images/survey-3-552b31ed99a99f1f0eb6b939d1cd4172.png" width="7104" height="4008" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="회고">회고<a href="https://teddynote-lab.github.io/brain-cache/projects/ibk-capital-ai-approval-system#%ED%9A%8C%EA%B3%A0" class="hash-link" aria-label="회고에 대한 직접 링크" title="회고에 대한 직접 링크" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="잘한-점">잘한 점<a href="https://teddynote-lab.github.io/brain-cache/projects/ibk-capital-ai-approval-system#%EC%9E%98%ED%95%9C-%EC%A0%90" class="hash-link" aria-label="잘한 점에 대한 직접 링크" title="잘한 점에 대한 직접 링크" translate="no">​</a></h3>
<ul>
<li class=""><strong>Table-First 전략</strong>: 금융 도메인의 핵심인 수치 정확성을 최우선으로 놓은 것이 프로젝트 성공의 열쇠였습니다.</li>
<li class=""><strong>HeadingRefiner의 이중 전략</strong>: 목차 유무에 따라 분기하는 설계가 다양한 문서 유형에 대한 범용성을 확보해줬습니다.</li>
<li class=""><strong>On-Prem 환경 대응</strong>: 클라우드 서비스 의존 없이 완전폐쇄망에서 동작하는 아키텍처를 구축한 경험은 향후 프로젝트에도 큰 자산이 됩니다.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="배운-점">배운 점<a href="https://teddynote-lab.github.io/brain-cache/projects/ibk-capital-ai-approval-system#%EB%B0%B0%EC%9A%B4-%EC%A0%90" class="hash-link" aria-label="배운 점에 대한 직접 링크" title="배운 점에 대한 직접 링크" translate="no">​</a></h3>
<ul>
<li class="">금융 문서에서 LLM의 역할은 "생성"보다 "정확한 정보 추출과 구조화"에 더 가깝습니다. Prompt Engineering의 방향도 이에 맞춰야 합니다.</li>
<li class="">비동기/병렬 처리는 초기부터 설계에 반영해야 합니다. 나중에 추가하면 아키텍처 변경 비용이 큽니다.</li>
<li class="">실무자 피드백 기반의 정성 평가는 PoC 단계에서 본사업 전환을 위한 중요한 근거가 됩니다.</li>
</ul>]]></content:encoded>
            <category>Retrospective</category>
            <category>Architecture</category>
            <category>Decision Log</category>
        </item>
        <item>
            <title><![CDATA[LG Electronics 라이프로그 AI 어시스턴트 구축기: 그래프 검색으로 일상을 탐색하다]]></title>
            <link>https://teddynote-lab.github.io/brain-cache/projects/lge-rag-lifelog-ai-assistant</link>
            <guid>https://teddynote-lab.github.io/brain-cache/projects/lge-rag-lifelog-ai-assistant</guid>
            <pubDate>Sat, 20 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[사용자의 일상 활동 데이터를 그래프 기반으로 검색하는 AI 어시스턴트를 구축하며, Context를 85% 줄이면서도 92% 정확도를 달성한 과정을 공유합니다.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tldr">TL;DR<a href="https://teddynote-lab.github.io/brain-cache/projects/lge-rag-lifelog-ai-assistant#tldr" class="hash-link" aria-label="TL;DR에 대한 직접 링크" title="TL;DR에 대한 직접 링크" translate="no">​</a></h2>
<blockquote>
<p>L사 고객의 라이프로그 데이터를 기반으로, "저번주에 커피 몇 번 마셨더라?" 같은 일상적 질문에 정확히 답변하는 AI 어시스턴트를 구축했습니다. 벡터 검색 + 그래프 탐색의 하이브리드 구조로 Context를 <strong>20,000개에서 3,000개로 85% 감소</strong>시키면서도, 사용자 요구사항 기반 평가셋에서 <strong>92%(74/80개) 정확도</strong>를 달성했습니다.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="프로젝트-배경">프로젝트 배경<a href="https://teddynote-lab.github.io/brain-cache/projects/lge-rag-lifelog-ai-assistant#%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%B0%B0%EA%B2%BD" class="hash-link" aria-label="프로젝트 배경에 대한 직접 링크" title="프로젝트 배경에 대한 직접 링크" translate="no">​</a></h2>
<p>사용자가 "캠핑 갔을 때 쓴 버너 뭐였지?"라고 물으면, AI가 복잡한 활동 기록을 연결해서 정확한 답을 찾아줘야 합니다.</p>
<p>단순 키워드 검색으로는 불가능합니다. <strong>시간·장소·활동·브랜드·음식·상황</strong> 사이의 복잡한 연결 구조를 AI가 스스로 이해하고 탐색할 수 있어야 합니다.</p>
<p><strong>핵심 과제 4가지:</strong></p>
<ol>
<li class="">데이터 양이 많아져도 느려지지 않는 검색</li>
<li class="">구어체·줄임말·외래어도 정확히 이해</li>
<li class="">통계/패턴 관련 질문에도 정확히 답변</li>
<li class="">Context 최적화로 효율성과 일관성 동시 달성</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="기술적-도전과-해결">기술적 도전과 해결<a href="https://teddynote-lab.github.io/brain-cache/projects/lge-rag-lifelog-ai-assistant#%EA%B8%B0%EC%88%A0%EC%A0%81-%EB%8F%84%EC%A0%84%EA%B3%BC-%ED%95%B4%EA%B2%B0" class="hash-link" aria-label="기술적 도전과 해결에 대한 직접 링크" title="기술적 도전과 해결에 대한 직접 링크" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-그래프-기반-검색-맥락-단위로-찾는-능력">1. 그래프 기반 검색: 맥락 단위로 찾는 능력<a href="https://teddynote-lab.github.io/brain-cache/projects/lge-rag-lifelog-ai-assistant#1-%EA%B7%B8%EB%9E%98%ED%94%84-%EA%B8%B0%EB%B0%98-%EA%B2%80%EC%83%89-%EB%A7%A5%EB%9D%BD-%EB%8B%A8%EC%9C%84%EB%A1%9C-%EC%B0%BE%EB%8A%94-%EB%8A%A5%EB%A0%A5" class="hash-link" aria-label="1. 그래프 기반 검색: 맥락 단위로 찾는 능력에 대한 직접 링크" title="1. 그래프 기반 검색: 맥락 단위로 찾는 능력에 대한 직접 링크" translate="no">​</a></h3>
<p>"캠핑에서 썼던 버너 브랜드"라는 질문을 분해하면:</p>
<ul>
<li class=""><strong>활동</strong>: 캠핑 → <strong>장소</strong>: 캠핑장 → <strong>행동</strong>: 요리 → <strong>물건</strong>: 버너 → <strong>브랜드</strong>: ?</li>
</ul>
<p>전통적인 벡터 검색만으로는 이 관계 추론이 불가능합니다. 우리는 모든 활동 데이터를 <strong>그래프 형태로 재구성</strong>했습니다:</p>
<ul>
<li class=""><strong>14개 메타데이터 키</strong>: 시간, 위치, 활동, 소비, 개체명 등</li>
<li class=""><strong>242개 엣지</strong>: 메타데이터 간 연결 관계</li>
<li class="">에이전트가 질문을 분석해 <strong>어떤 경로를 따라 탐색해야 하는지 스스로 결정</strong></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-하이브리드-검색--자동-시간-필터링">2. 하이브리드 검색 + 자동 시간 필터링<a href="https://teddynote-lab.github.io/brain-cache/projects/lge-rag-lifelog-ai-assistant#2-%ED%95%98%EC%9D%B4%EB%B8%8C%EB%A6%AC%EB%93%9C-%EA%B2%80%EC%83%89--%EC%9E%90%EB%8F%99-%EC%8B%9C%EA%B0%84-%ED%95%84%ED%84%B0%EB%A7%81" class="hash-link" aria-label="2. 하이브리드 검색 + 자동 시간 필터링에 대한 직접 링크" title="2. 하이브리드 검색 + 자동 시간 필터링에 대한 직접 링크" translate="no">​</a></h3>
<p>수천~수만 건의 활동 데이터에서 매번 전체 스캔은 비효율적입니다. 벡터 검색(ChromaDB)과 그래프 탐색을 결합한 하이브리드 구조를 설계했습니다.</p>
<p>특히 <strong>자연어 시간 표현 자동 해석</strong>이 핵심이었습니다:</p>
<ul>
<li class="">"지난주" → 날짜 범위 자동 계산</li>
<li class="">"올해 초" → 1~3월 필터</li>
<li class="">"저녁에" → 시간대 필터</li>
</ul>
<p>LLM이 이런 표현을 해석하여 검색 범위를 자동으로 좁혀줍니다.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-context-최적화-85-감소-성능은-유지">3. Context 최적화: 85% 감소, 성능은 유지<a href="https://teddynote-lab.github.io/brain-cache/projects/lge-rag-lifelog-ai-assistant#3-context-%EC%B5%9C%EC%A0%81%ED%99%94-85-%EA%B0%90%EC%86%8C-%EC%84%B1%EB%8A%A5%EC%9D%80-%EC%9C%A0%EC%A7%80" class="hash-link" aria-label="3. Context 최적화: 85% 감소, 성능은 유지에 대한 직접 링크" title="3. Context 최적화: 85% 감소, 성능은 유지에 대한 직접 링크" translate="no">​</a></h3>
<p>초기에는 검색 결과로 <strong>20,000개</strong>의 Context를 LLM에 전달하고 있었습니다. 비용도 높고, 오히려 불필요한 정보가 답변 품질을 떨어뜨리는 문제가 있었습니다.</p>
<p>그래프 탐색을 통해 관련성 높은 Context만 선별하여 <strong>3,000개로 85% 감소</strong>시켰고, 오히려 답변 일관성이 향상되었습니다. 적은 정보를 정확히 주는 것이 많은 정보를 던지는 것보다 낫다는 교훈을 얻었습니다.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-한국어-자연어-처리-최적화">4. 한국어 자연어 처리 최적화<a href="https://teddynote-lab.github.io/brain-cache/projects/lge-rag-lifelog-ai-assistant#4-%ED%95%9C%EA%B5%AD%EC%96%B4-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC-%EC%B5%9C%EC%A0%81%ED%99%94" class="hash-link" aria-label="4. 한국어 자연어 처리 최적화에 대한 직접 링크" title="4. 한국어 자연어 처리 최적화에 대한 직접 링크" translate="no">​</a></h3>
<p>한국어의 다양한 표현 방식이 검색 정확도의 병목이었습니다:</p>
<ul>
<li class="">스벅 / 스타벅스 / Starbucks</li>
<li class="">넷플 / 넷플릭스</li>
<li class="">베라 / 베스킨라빈스</li>
</ul>
<p>이를 해결하기 위해:</p>
<ul>
<li class="">도메인 특화 <strong>동의어·줄임말 사전</strong> 구축</li>
<li class="">LLM 기반 <strong>질의 정규화</strong> (사용자 표현 → 데이터 표현 자동 변환)</li>
<li class=""><strong>Query Expansion</strong>으로 의미 단위 검색 확장</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="아키텍처">아키텍처<a href="https://teddynote-lab.github.io/brain-cache/projects/lge-rag-lifelog-ai-assistant#%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98" class="hash-link" aria-label="아키텍처에 대한 직접 링크" title="아키텍처에 대한 직접 링크" translate="no">​</a></h2>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">사용자 질문</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ↓</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">에이전트 (LangGraph ReAct)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ├── Tool 호출 필요 여부 판단</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ├── query_extraction (활동·시간 관련 내용 추출)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ├── GraphRetriever</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  │     ├── 벡터 검색 (ChromaDB)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  │     └── 그래프 탐색 (메타데이터 엣지)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  └── 검색 결과 종합</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ↓</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">최종 답변 반환</span><br></span></code></pre></div></div>
<p><strong>기술 스택:</strong></p>
<ul>
<li class=""><strong>에이전트</strong>: LangGraph ReAct Agent</li>
<li class=""><strong>벡터 저장소</strong>: ChromaDB</li>
<li class=""><strong>검색</strong>: 벡터 검색 + 그래프 탐색 하이브리드</li>
<li class=""><strong>프론트엔드</strong>: LangGraph Studio 연동</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="서비스-화면">서비스 화면<a href="https://teddynote-lab.github.io/brain-cache/projects/lge-rag-lifelog-ai-assistant#%EC%84%9C%EB%B9%84%EC%8A%A4-%ED%99%94%EB%A9%B4" class="hash-link" aria-label="서비스 화면에 대한 직접 링크" title="서비스 화면에 대한 직접 링크" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="메인 페이지 - 챗 오프너 및 대화 입력창" src="https://teddynote-lab.github.io/brain-cache/assets/images/main-page-4bbb11f3c513a280d8a2ff88fb10c2f3.png" width="3024" height="1722" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="사이드바 - 이전 대화 내역 불러오기" src="https://teddynote-lab.github.io/brain-cache/assets/images/sidebar-95e3add3cc4d09bc843cdf0df0453146.png" width="3024" height="1722" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="대화 페이지 - 검색 결과 및 AI 응답 표시" src="https://teddynote-lab.github.io/brain-cache/assets/images/chat-page-ba0dc6179121ed12184fe7d59297d46e.png" width="3024" height="1722" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="성과">성과<a href="https://teddynote-lab.github.io/brain-cache/projects/lge-rag-lifelog-ai-assistant#%EC%84%B1%EA%B3%BC" class="hash-link" aria-label="성과에 대한 직접 링크" title="성과에 대한 직접 링크" translate="no">​</a></h2>
<ul>
<li class=""><strong>정확도 92%</strong>: 사용자 요구사항 기반 평가셋 80개 중 74개 정답</li>
<li class=""><strong>Context 85% 감소</strong>: 20,000개 → 3,000개</li>
<li class="">복합 질의 검색 가능: "캠핑에서 사용한 버너 브랜드" 같은 관계 추론</li>
<li class="">맥락 의존적 검색: 단순 유사도 기반 검색 대비 품질 향상</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="회고">회고<a href="https://teddynote-lab.github.io/brain-cache/projects/lge-rag-lifelog-ai-assistant#%ED%9A%8C%EA%B3%A0" class="hash-link" aria-label="회고에 대한 직접 링크" title="회고에 대한 직접 링크" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="잘한-점">잘한 점<a href="https://teddynote-lab.github.io/brain-cache/projects/lge-rag-lifelog-ai-assistant#%EC%9E%98%ED%95%9C-%EC%A0%90" class="hash-link" aria-label="잘한 점에 대한 직접 링크" title="잘한 점에 대한 직접 링크" translate="no">​</a></h3>
<ul>
<li class=""><strong>그래프 구조 도입 결정</strong>: 초기에 "벡터 검색만으로 충분하지 않을까?"라는 의견이 있었지만, 복합 질의 테스트 결과를 근거로 그래프 도입을 결정한 것이 프로젝트 성공의 핵심이었습니다.</li>
<li class=""><strong>Context 최적화</strong>: "더 많은 정보 = 더 좋은 답변"이라는 직관을 데이터로 반증하고, 과감하게 85% 줄인 결정이 옳았습니다.</li>
<li class=""><strong>평가셋 기반 개발</strong>: 사용자 요구사항에서 직접 평가셋을 만들어 개발 방향을 잡은 것이 효과적이었습니다.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="배운-점">배운 점<a href="https://teddynote-lab.github.io/brain-cache/projects/lge-rag-lifelog-ai-assistant#%EB%B0%B0%EC%9A%B4-%EC%A0%90" class="hash-link" aria-label="배운 점에 대한 직접 링크" title="배운 점에 대한 직접 링크" translate="no">​</a></h3>
<ul>
<li class="">라이프로그 데이터는 "관계"가 핵심입니다. 개별 이벤트의 유사도보다 이벤트 간 연결 구조가 검색 품질을 결정합니다.</li>
<li class="">한국어 NLP는 여전히 도전적입니다. 줄임말/외래어 처리는 사전 구축만으로는 한계가 있으며, LLM 기반 정규화가 필수적입니다.</li>
<li class="">Context 양과 답변 품질은 비례하지 않습니다. 노이즈 제거가 곧 성능 향상입니다.</li>
</ul>]]></content:encoded>
            <category>Retrospective</category>
            <category>Architecture</category>
            <category>Decision Log</category>
        </item>
    </channel>
</rss>