<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>hong_eh.log</title>
        <link>https://velog.io/</link>
        <description>화이팅</description>
        <lastBuildDate>Tue, 13 Jan 2026 01:00:18 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. hong_eh.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/hong_eh" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[LG CNS AM INSPIRE] 3기 마지막 멘토링]]></title>
            <link>https://velog.io/@hong_eh/LG-CNS-AM-INSPIRE-3%EA%B8%B0-%EB%A7%88%EC%A7%80%EB%A7%89-%EB%A9%98%ED%86%A0%EB%A7%81</link>
            <guid>https://velog.io/@hong_eh/LG-CNS-AM-INSPIRE-3%EA%B8%B0-%EB%A7%88%EC%A7%80%EB%A7%89-%EB%A9%98%ED%86%A0%EB%A7%81</guid>
            <pubDate>Tue, 13 Jan 2026 01:00:18 GMT</pubDate>
            <description><![CDATA[<h2 id="마지막-멘토링-개요">마지막 멘토링 개요</h2>
<p>LG CNS AM INSPIRE 프로그램의 마지막 멘토링 시간에 단위 테스트 케이스 작성 및 관리 방법 및 발표에 대한 피드백을 받았습니다.</p>
<h3 id="1-단위-테스트-대상-선정-구조">1. 단위 테스트 대상 선정 구조</h3>
<p>멘토님께서는 체계적인 테스트 관리를 위해 <strong>3단계 계층 구조</strong>를 제안해주셨습니다.</p>
<pre><code>Level 1 (대분류)
  └─ Level 2 (중분류)
      └─ 화면 단위 (최종 테스트 단위)</code></pre><p>이 구조를 통해 다음과 같은 정보를 관리할 수 있습니다:</p>
<ul>
<li>각 레벨별 기능 분류</li>
<li>화면별 한글명 및 영문명</li>
<li>테스트 대상 여부 (Y/N)</li>
<li>단위테스트 ID</li>
<li>담당자 지정</li>
</ul>
<p><strong>예시 구조:</strong></p>
<ul>
<li><strong>Level 1</strong>: Data Exploration (데이터 탐색)<ul>
<li><strong>Level 2</strong>: Data Sets (데이터셋)<ul>
<li>화면: Data Sets (데이터셋 탐색) - WEB-002 - 담당: 팀원1</li>
<li>화면: Data Details (데이터 상세) - WEB-003 - 담당: 팀원2</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="2-화면-단위-테스트-케이스-작성">2. 화면 단위 테스트 케이스 작성</h3>
<p>각 화면별로 구체적인 테스트 케이스를 작성하는 방법도 안내받았습니다.</p>
<h4 id="테스트-케이스-구성-요소">테스트 케이스 구성 요소:</h4>
<ol>
<li><strong>No.</strong> - 테스트 케이스 번호</li>
<li><strong>내용</strong> - 테스트 시나리오 설명</li>
<li><strong>Input Data</strong> - 입력 데이터</li>
<li><strong>Expected Data</strong> - 예상 결과</li>
<li><strong>Result</strong> - 실제 테스트 결과 (1st, 2nd 등)</li>
</ol>
<h4 id="실제-예시-로그인-화면">실제 예시 (로그인 화면):</h4>
<table>
<thead>
<tr>
<th>No.</th>
<th>내용</th>
<th>Input Data</th>
<th>Expected Data</th>
<th>Result</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>화면 오픈 시 Email Address, Password 입력창과 로그인 footer들이 정상 렌더링 되는가</td>
<td>N/A</td>
<td>화면 렌더링</td>
<td>O / O</td>
</tr>
<tr>
<td>2</td>
<td>(negative) Email 형식이 아닌 값을 입력했을 때 경고 메세지가 표시되는가</td>
<td>이메일 형식오류<br>email: admin.lgcns.com</td>
<td>이메일 형식으로 입력하세요. 메세지 출력</td>
<td>O / O</td>
</tr>
<tr>
<td>3</td>
<td>(negative) 필수값 미입력시 경고 메세지가 표시되는가</td>
<td>이메일 or 패스워드 누락</td>
<td>이메일주소는 필수입니다. 패스워드를 입력하세요. 메세지 출력</td>
<td>O / O</td>
</tr>
</tbody></table>
<h2 id="💡-얻은-인사이트">💡 얻은 인사이트</h2>
<h3 id="체계적인-테스트-관리">체계적인 테스트 관리</h3>
<ul>
<li>대분류-중분류-화면 단위로 나누어 관리함으로써 전체 시스템의 테스트 커버리지를 한눈에 파악할 수 있습니다</li>
<li>각 화면별 담당자를 명확히 지정하여 책임 소재를 분명히 할 수 있습니다</li>
</ul>
<h3 id="positive--negative-테스트-케이스">Positive &amp; Negative 테스트 케이스</h3>
<ul>
<li>정상 케이스(Positive)뿐만 아니라 비정상 케이스(Negative)도 반드시 포함해야 합니다</li>
<li>예외 상황 처리가 제대로 되는지 확인하는 것이 중요합니다</li>
</ul>
<h3 id="반복-테스트-결과-관리">반복 테스트 결과 관리</h3>
<ul>
<li>1st, 2nd 등으로 여러 차례 테스트 결과를 기록할 수 있어 버그 수정 후 재테스트 이력을 관리할 수 있습니다</li>
</ul>
<h3 id="3-ppt-구성에-대한-피드백">3. PPT 구성에 대한 피드백</h3>
<p>멘토님께서는 발표 자료(PPT)에 대해서도 중요한 조언을 해주셨습니다.</p>
<blockquote>
<p><strong>&quot;프로젝트에 너무 많은 내용이 들어가 있네요. 시연 영상에서 표현할 내용과 PPT에서 표현할 내용을 명확히 구분해야 합니다.&quot;</strong></p>
</blockquote>
<h4 id="ppt-vs-시연-영상-역할-구분">PPT vs 시연 영상 역할 구분</h4>
<p><strong>PPT에 담아야 할 내용:</strong></p>
<ul>
<li>프로젝트 개요 및 목표</li>
<li>핵심 기능 소개 (간단명료하게)</li>
<li>시스템 아키텍처</li>
<li>주요 기술 스택</li>
<li>프로젝트 성과 및 인사이트</li>
</ul>
<p><strong>시연 영상에서 보여줄 내용:</strong></p>
<ul>
<li>실제 기능 동작 모습</li>
<li>사용자 시나리오별 플로우</li>
<li>상세한 UI/UX 인터랙션</li>
<li>각 기능의 구체적인 작동 방식</li>
</ul>
<h4 id="왜-구분이-중요한가">왜 구분이 중요한가?</h4>
<ol>
<li><strong>PPT 과부하 방지</strong>: 모든 내용을 PPT에 담으면 청중이 집중하기 어렵고, 발표 시간도 길어집니다</li>
<li><strong>명확한 메시지 전달</strong>: PPT는 핵심 메시지 위주로, 시연 영상은 실제 구현 확인용으로 역할을 분리</li>
<li><strong>발표 효율성</strong>: PPT는 빠르게 넘기며 설명하고, 시연 영상은 필요한 부분만 재생</li>
<li><strong>청중의 이해도 향상</strong>: 개념은 PPT로, 실제 동작은 영상으로 보여주면 더 효과적</li>
</ol>
<h2 id="앞으로의-계획">앞으로의 계획</h2>
<ol>
<li><p><strong>테스트 대상 선정 문서 작성</strong></p>
<ul>
<li>Level 1, Level 2 구조에 따라 전체 기능 분류</li>
<li>각 화면별 테스트 대상 여부 결정 및 담당자 배정</li>
</ul>
</li>
<li><p><strong>화면별 테스트 케이스 작성</strong></p>
<ul>
<li>각 담당자가 맡은 화면의 기능별 테스트 케이스 작성</li>
<li>Positive/Negative 케이스 모두 포함</li>
</ul>
</li>
<li><p><strong>테스트 실행 및 결과 기록</strong></p>
<ul>
<li>작성된 테스트 케이스에 따라 실제 테스트 진행</li>
<li>결과를 문서에 기록하고 이슈 발견 시 트래킹</li>
</ul>
</li>
</ol>
<h2 id="마무리">마무리</h2>
<p>마지막 멘토링에서 실무에서 바로 적용 가능한 구체적인 테스트 관리 방법을 배울 수 있었습니다. 단순히 테스트를 하는 것을 넘어, 체계적으로 관리하고 추적하는 방법의 중요성을 깨달았습니다. </p>
<p>마지막으로 멘토님께 감사드리며, 이번에 배운 내용을 프로젝트에 잘 적용해보겠습니다! </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[LG CNS AM INSPIRE] 3기 여섯 번째 멘토링]]></title>
            <link>https://velog.io/@hong_eh/LG-CNS-AM-INSPIRE-3%EA%B8%B0-%EC%97%AC%EC%84%AF-%EB%B2%88%EC%A7%B8-%EB%A9%98%ED%86%A0%EB%A7%81</link>
            <guid>https://velog.io/@hong_eh/LG-CNS-AM-INSPIRE-3%EA%B8%B0-%EC%97%AC%EC%84%AF-%EB%B2%88%EC%A7%B8-%EB%A9%98%ED%86%A0%EB%A7%81</guid>
            <pubDate>Tue, 30 Dec 2025 00:47:40 GMT</pubDate>
            <description><![CDATA[<h1 id="6번째-멘토링-정리">6번째 멘토링 정리</h1>
<h2 id="1-멘토링-목표">1. 멘토링 목표</h2>
<p>이번 멘토링의 핵심 목표는 <strong>HAI(HistoryAI) 프로젝트에서 지금까지 구현한 기능들을 하나하나 단위 테스트(Unit Test)로 검증하는 단계로 전환하는 것</strong>이었다.</p>
<p>특히, 단위 테스트는 단순한 연습이 아니라,</p>
<ul>
<li>HistoryAI에서 이미 만들어 둔 모듈들(TTS, 음성 처리, AI 응답 흐름 등)을</li>
<li>실제 서비스 관점에서 <strong>안전하게 조합하기 위한 기반 작업</strong>이라는 점을 강조했다.</li>
</ul>
<p>또한, <strong>TTS_RVC 음성변환은 단순한 음성 실험용이 아니라</strong>,</p>
<blockquote>
<p>🎯 <em>HistoryAI에서 ‘인물 AI와 대화할 때 실제로 사용될 핵심 기능’</em></p>
</blockquote>
<p>이라는 맥락에서 다시 정리했다.</p>
<hr>
<h2 id="2-이제는-단위-테스트가-필요한-시점">2. 이제는 단위 테스트가 필요한 시점</h2>
<h3 id="21-historyaihai-관점에서의-필요성">2.1 HistoryAI(HAI) 관점에서의 필요성</h3>
<p>현재 HistoryAI(HAI)는 단순한 데모 수준을 넘어, 여러 기능이 유기적으로 결합된 서비스 형태로 확장되고 있다.</p>
<p>지금까지 구현된 주요 기능 흐름은 다음과 같다.</p>
<ul>
<li>사용자 입력</li>
<li>인물 AI의 응답 생성</li>
<li>텍스트 결과 출력</li>
<li>음성 출력 및 인물화 (TTS + RVC)</li>
<li>지도 기반 정보 제공</li>
<li>토론 기능</li>
<li>주요 사건 및 전쟁 정보 제공</li>
</ul>
<p>문제는 <strong>기능이 많아질수록 전체 시스템을 한 번에 실행해 검증하는 방식이 점점 비효율적이 된다는 점</strong>이다.</p>
<pre><code class="language-text">[기존 방식]
HistoryAI 전체 실행
 → 에러 발생
 → 어떤 기능에서 문제가 발생했는지 추적이 어려움

[개선 방식]
HAI 내부 기능을 모듈 단위로 분리
 → 각 기능을 단위 테스트로 검증
 → 검증된 기능들을 안정적으로 조합</code></pre>
<p>따라서 이번 멘토링에서는 단순히 &quot;기능이 동작하는지&quot;를 확인하는 단계를 넘어,</p>
<blockquote>
<p>✔️ &quot;HistoryAI에서 지금까지 만든 기능들을 하나씩 신뢰 가능한 상태로 만들자&quot;</p>
</blockquote>
<p>라는 관점에서 단위 테스트의 필요성을 정리했다.</p>
<hr>
<h2 id="3-단위-테스트-기준-정리">3. 단위 테스트 기준 정리</h2>
<p>이번 멘토링에서는 HistoryAI에 맞는 <strong>현실적인 단위 테스트 기준</strong>을 다음과 같이 정리했다.</p>
<h3 id="31-테스트-단위-예시">3.1 테스트 단위 예시</h3>
<p>HistoryAI는 여러 기능 모듈이 결합된 서비스이기 때문에, 단위 테스트 역시 <strong>서비스 기능 기준</strong>으로 나누어 설계한다.</p>
<ul>
<li><p><strong>인물 AI 응답 생성</strong></p>
<ul>
<li>사용자 입력에 대해 응답이 정상적으로 생성되는가?</li>
<li>응답 결과가 빈 문자열이 아닌가?</li>
<li>선택한 인물 컨텍스트가 응답에 반영되는가?</li>
</ul>
</li>
<li><p><strong>지도 기능</strong></p>
<ul>
<li>사건/전쟁에 대해 위치 정보(위도·경도)가 정상적으로 반환되는가?</li>
<li>지도에 표시할 데이터 구조(JSON 등)가 올바른 형식인가?</li>
<li>존재하지 않는 장소 입력 시 예외 처리가 되는가?</li>
</ul>
</li>
<li><p><strong>토론 기능</strong></p>
<ul>
<li>두 개 이상의 인물 AI 응답이 순서대로 생성되는가?</li>
<li>각 인물의 관점이 서로 다르게 유지되는가?</li>
<li>토론 턴 수가 제한 조건을 초과하지 않는가?</li>
</ul>
</li>
<li><p><strong>주요 사건 / 전쟁 정보 기능</strong></p>
<ul>
<li>특정 인물 또는 시대 입력 시 사건 목록이 정상적으로 반환되는가?</li>
<li>사건 정보에 연도, 장소, 설명이 포함되는가?</li>
<li>데이터가 없을 경우 적절한 안내 메시지가 반환되는가?</li>
</ul>
</li>
<li><p><strong>음성 출력 및 인물화 (TTS + RVC)</strong></p>
<ul>
<li>텍스트 응답이 음성 출력 단계로 정상 전달되는가?</li>
<li>최종 음성 파일이 재생 가능한 상태로 생성되는가?</li>
</ul>
</li>
</ul>
<h3 id="32-핵심-원칙">3.2 핵심 원칙</h3>
<p>핵심 원칙</p>
<ul>
<li>외부 API, 모델 호출 구간을 명확히 분리하여 테스트한다</li>
<li>파일 기반 작업은 반드시 <strong>존재 여부 · 크기 · 포맷</strong>을 함께 검증한다</li>
<li>실패 상황에서는 단순한 <code>print</code> 출력이 아닌, <strong>원인을 바로 알 수 있는 에러 메시지</strong>를 남긴다</li>
</ul>
<hr>
<h2 id="4-tts_rvc-음성변환-전체-구조-historyai-적용-관점">4. TTS_RVC 음성변환 전체 구조 (HistoryAI 적용 관점)</h2>
<h3 id="41-historyai에서의-역할">4.1 HistoryAI에서의 역할</h3>
<p>TTS_RVC 음성변환은 단순히 텍스트를 읽어주는 기능이 아니라,</p>
<ul>
<li>사용자가 질문하면</li>
<li><strong>역사 인물 AI가 답변하고</strong></li>
<li>그 답변을 <strong>해당 인물의 목소리로 들려주는 핵심 인터랙션 요소</strong>이다.</li>
</ul>
<p>즉, HistoryAI에서의 위치는 다음과 같다.</p>
<pre><code class="language-text">[사용자 질문]
     ↓
[인물 AI 답변 (텍스트)]
     ↓
[TTS_RVC 음성변환]
     ↓
[역사 인물의 목소리로 출력]</code></pre>
<hr>
<h2 id="5-tts-단계-설명-historyai-내부-모듈">5. TTS 단계 설명 (HistoryAI 내부 모듈)</h2>
<h3 id="51-역할">5.1 역할</h3>
<ul>
<li>HistoryAI에서 생성된 <strong>인물 AI의 텍스트 응답</strong>을</li>
<li>기본 음성(wav)으로 변환</li>
</ul>
<p>이 단계에서는 아직 특정 인물의 목소리가 아니라,</p>
<blockquote>
<p>📌 *&quot;말의 내용이 정확히 들리는 음성&quot;*을 만드는 것이 목적이다.</p>
</blockquote>
<h3 id="52-historyai-기준-단위-테스트-포인트">5.2 HistoryAI 기준 단위 테스트 포인트</h3>
<pre><code class="language-markdown">- 인물 AI 응답 텍스트가 정상적으로 전달되는가?
- 텍스트 길이가 0이 아닌가?
- wav 파일이 정상적으로 생성되는가?
- HistoryAI 파이프라인에서 다음 단계로 넘길 수 있는 형식인가?</code></pre>
<hr>
<h2 id="6-rvc-음성-변환-단계-설명-인물-ai-음성화">6. RVC 음성 변환 단계 설명 (인물 AI 음성화)</h2>
<h3 id="61-historyai에서-rvc의-의미">6.1 HistoryAI에서 RVC의 의미</h3>
<p>RVC는 HistoryAI에서 <strong>인물 AI를 ‘캐릭터로 완성’시키는 단계</strong>이다.</p>
<ul>
<li>TTS 음성의 발음·억양은 유지</li>
<li>역사 인물의 <strong>화자 특성(목소리)</strong>만 입힘</li>
</ul>
<p>즉,</p>
<blockquote>
<p>🧠 *&quot;AI가 말하는 것&quot; → &quot;그 인물이 말하는 것처럼 느끼게 하는 기술&quot;*</p>
</blockquote>
<hr>
<h3 id="✍️-마무리">✍️ 마무리</h3>
<p>이번 6번째 멘토링은 <strong>기능 구현 단계에서 검증 단계로 넘어가는 전환점</strong>이었다.</p>
<p>다음 단계에서는 이 단위 테스트들이 모여 <strong>안정적인 전체 서비스 파이프라인</strong>을 구성하게 될 것이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[LG CNS AM INSPIRE] 3기 다섯 번째 멘토링]]></title>
            <link>https://velog.io/@hong_eh/LG-CNS-AM-INSPIRE-3%EA%B8%B0-%EB%8B%A4%EC%84%AF-%EB%B2%88%EC%A7%B8-%EB%A9%98%ED%86%A0%EB%A7%81</link>
            <guid>https://velog.io/@hong_eh/LG-CNS-AM-INSPIRE-3%EA%B8%B0-%EB%8B%A4%EC%84%AF-%EB%B2%88%EC%A7%B8-%EB%A9%98%ED%86%A0%EB%A7%81</guid>
            <pubDate>Sat, 20 Dec 2025 06:34:31 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-중간발표-qa-피드백-정리">📌 중간발표 Q&amp;A 피드백 정리</h1>
<h2 id="1-교과서-선정-이유">1. 교과서 선정 이유</h2>
<p><strong>Q. 여러 교과서가 있는데 왜 ‘미래엔’ 교과서를 사용했는가?</strong>  </p>
<ul>
<li><strong>A.</strong> 미래엔 교과서는 현장에서 가장 많이 사용되고 있는 교과서로,<br>실제 수업 환경과의 적합성과 활용 가능성을 고려하여 선택하였다.</li>
</ul>
<hr>
<h2 id="2-토론-요약-기능의-필요성-및-레거시-여부">2. 토론 요약 기능의 필요성 및 레거시 여부</h2>
<p><strong>Q. 토론을 요약하는 기능은 기존(레거시)에도 있는 기능 아닌가?</strong>  </p>
<ul>
<li><strong>A.</strong> 기존에도 선생님이 요약 가능 하지만, 본 프로젝트에서는<br>수업 시간 내 토론을 효율적으로 운영하기 위해<br>교실 환경에 맞춘 토론 요약 기능을 설계하였다.</li>
</ul>
<p><strong>Q. 그렇다면 선생님은 어떤 인사이트를 제공할 수 있는가?</strong>  </p>
<ul>
<li><strong>A.</strong> AI는 토론 내용을 정리하고 구조화하는 역할을 수행하며,<br>교사는 이를 바탕으로 해석, 확장 질문 제시, 비판적 사고 유도 등<br>고차원적인 교육적 인사이트를 제공한다.</li>
</ul>
<hr>
<h2 id="3-ai-할루시네이션오답-문제-대응-방안">3. AI 할루시네이션(오답) 문제 대응 방안</h2>
<p><strong>Q. AI 답변은 틀릴 수 있는데, 할루시네이션 문제를 어떻게 해결할 것인가?</strong>  </p>
<ul>
<li><strong>A.</strong><ul>
<li>AI 인물과의 대화 기능에서는 AI임을 명확히 인지시키는 안내를 제공한다.</li>
<li>AI 챗봇 기능에서는 교과서 기반 페이지 및 근거 자료를 함께 제공하여<br>답변의 출처를 확인할 수 있도록 한다.</li>
<li>이를 통해 AI 답변에 대한 무비판적 수용을 방지하고<br>학습자의 비판적 사고를 유도한다.</li>
</ul>
</li>
</ul>
<hr>
<h2 id="4-교과서-기반-데이터-구축의-한계-및-향후-계획">4. 교과서 기반 데이터 구축의 한계 및 향후 계획</h2>
<p><strong>Q. 교과서 기반 자료를 만들 때 인력 자원이 많이 들 것 같은데, 향후 계획은?</strong>  </p>
<ul>
<li><strong>A.</strong><ul>
<li>장기적인 확장 계획은 아직 수립되지 않았다.</li>
<li>이번 프로젝트에서는 범위를 명확히 제한하여<br>직접 교과서 기반 데이터를 구축하는 방식으로 진행한다.</li>
<li>프로젝트의 실현 가능성과 교육적 효과 검증에 집중한다.</li>
</ul>
</li>
</ul>
<hr>
<h2 id="📝-종합-피드백-요약">📝 종합 피드백 요약</h2>
<ul>
<li>교과서 선정과 기능 설계 전반에서 수업 현장 중심의 실용성을 고려함</li>
<li>AI는 보조 도구이며, 교사의 역할과 교육적 판단이 핵심임을 명확히 함</li>
<li>할루시네이션 문제를 출처 제공과 인식 유도로 보완하려는 접근이 긍정적</li>
</ul>
<h1 id="🧑🏫-멘토-회고록">🧑‍🏫 멘토 회고록</h1>
<h2 id="1-토론방-table-관련-피드백">1. 토론방 Table 관련 피드백</h2>
<p>멘토님께서는 토론방(Table) 설계에 대해 언급하시며,<br>현재 구조에서 토론 데이터의 역할과 흐름이 명확하게 드러나지 않는 점을 짚어주셨다.<br>특히 토론방이 어떤 책임을 가지며, 다른 도메인과 어떻게 연결되는지에 대한<br>구조적 정리가 필요하다는 의견을 주셨다.</p>
<hr>
<h2 id="2-backend-구조에-대한-아키텍처-피드백">2. Backend 구조에 대한 아키텍처 피드백</h2>
<p>현재 프로젝트는  </p>
<ul>
<li><strong>Backend (Spring Boot)</strong></li>
<li><strong>AI Backend (Spring Boot)</strong>  </li>
</ul>
<p>로 분리되어 있는 구조이다.</p>
<p>멘토님께서는 두 백엔드가 모두 Spring Boot 기반임에도 불구하고<br><strong>역할 분리가 명확하지 않다</strong>는 점을 지적하셨다.<br>특히 이로 인해 <strong>User 인증 및 권한 처리 과정에서 이슈가 발생할 가능성</strong>이 높다는 점을 강조하셨다.</p>
<hr>
<h2 id="3-개선-방향-제안">3. 개선 방향 제안</h2>
<p>멘토님께서는 다음과 같은 구조가<br>아키텍처적으로 더 적합하다는 의견을 주셨다.</p>
<ul>
<li>Backend를 <strong>하나의 Spring Boot 서버로 통합</strong><ul>
<li>사용자 인증 및 인가를 단일 지점에서 관리</li>
<li>도메인 책임을 명확히 분리하되, 서버는 통합</li>
</ul>
</li>
<li>AI 처리를 담당하는 <strong>FastAPI 서버는 유지</strong></li>
<li>추후 필요 시 FastAPI 서버를 <strong>Django 기반으로 변환</strong><ul>
<li>서비스 확장성과 유지보수성을 고려한 단계적 전환</li>
</ul>
</li>
</ul>
<hr>
<h2 id="4-회고-및-느낀-점">4. 회고 및 느낀 점</h2>
<p>이번 멘토링을 통해<br>단순히 기능을 분리하는 것보다 <strong>역할과 책임이 명확한 아키텍처 설계가 중요하다</strong>는 점을 다시 한번 인식하게 되었다.<br>특히 인증과 같은 핵심 공통 기능은 분산시키기보다<br>중앙에서 관리하는 것이 안정성과 확장성 측면에서 유리하다는 점을 배울 수 있었다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[LG CNS AM INSPIRE] 3기 네 번째 멘토링]]></title>
            <link>https://velog.io/@hong_eh/LG-CNS-AM-INSPIRE-3%EA%B8%B0-%EB%84%A4-%EB%B2%88%EC%A7%B8-%EB%A9%98%ED%86%A0%EB%A7%81</link>
            <guid>https://velog.io/@hong_eh/LG-CNS-AM-INSPIRE-3%EA%B8%B0-%EB%84%A4-%EB%B2%88%EC%A7%B8-%EB%A9%98%ED%86%A0%EB%A7%81</guid>
            <pubDate>Sat, 06 Dec 2025 06:31:00 GMT</pubDate>
            <description><![CDATA[<h1 id="lg-cns-am-inspire-3기-네-번째-멘토링-정리">[LG CNS AM INSPIRE] 3기 네 번째 멘토링 정리</h1>
<blockquote>
<p>이번 멘토링에서는 <strong>프론트엔드 / 백엔드 / 클라우드</strong> 각 파트에서 진행 상황과 개선 방향을 공유받고,<br>“교과서 기반 History AI 서비스”를 더 현실적으로 만들기 위한 다음 액션 아이템을 정리했다.</p>
</blockquote>
<hr>
<h2 id="1-이번-주-멘토링-핵심-요약">1) 이번 주 멘토링 핵심 요약</h2>
<ul>
<li>프론트: <strong>교과서 PDF 처리 방식 재검토</strong> (용량 이슈로 S3 구조 변경 필요)</li>
<li>백엔드: <strong>ERD 피드백 반영</strong> 및 데이터 구조 정리 필요</li>
<li>AI: <strong>Bedrock 컬렉션 관리로 비용 절감</strong> + <strong>AI Agent(네비게이션/이동 기능) 설계</strong> 아이디어 제안</li>
<li>클라우드: <strong>이중화(HA) 전략</strong>을 더 고민하고, <strong>EKS 학습 + 실습</strong>으로 운영 관점 이해 강화</li>
</ul>
<hr>
<h2 id="2-프론트엔드-교과서-pdf-저장로딩-전략">2) 프론트엔드: 교과서 PDF 저장/로딩 전략</h2>
<h3 id="문제">문제</h3>
<ul>
<li>현재 교과서 PDF가 <strong>크기가 너무 커서</strong> 기존 방식으로 다루기 어려움</li>
<li>로딩/다운로드/렌더링이 느려지고, 배포/운영 관점에서도 부담이 큼</li>
</ul>
<h3 id="개선-방향">개선 방향</h3>
<ul>
<li>교과서 PDF를 <strong>새로운 S3 버킷(또는 새로운 경로 구조)</strong> 에 담아 관리하는 방향이 적절해 보임</li>
<li>(추가로 고려할 점)<ul>
<li>PDF를 <strong>페이지 단위 이미지(PNG/JPG) 또는 분할 PDF</strong>로 쪼개서 제공하면 UX/성능에 유리</li>
<li>교과서 페이지 이동 기능(목차/페이지 점프)과 연결하기 쉬움</li>
</ul>
</li>
</ul>
<hr>
<h2 id="3-백엔드-erd-피드백-반영">3) 백엔드: ERD 피드백 반영</h2>
<h3 id="받은-피드백-포인트요지">받은 피드백 포인트(요지)</h3>
<ul>
<li>DB 설계에서 <strong>테이블 관계/정규화/핵심 엔티티</strong>가 더 명확해야 함</li>
<li>서비스 기능(교과서, 토론, 유저, 학습 기록 등)에 맞춰 <strong>ERD를 더 탄탄하게</strong> 다듬는 단계가 필요</li>
</ul>
<h3 id="다음-액션">다음 액션</h3>
<ul>
<li>멘토링에서 받은 피드백을 기준으로 ERD를 업데이트하고,</li>
<li>API 설계와 연결되는 형태로 <strong>엔티티 책임/관계</strong>를 명확히 정리하기</li>
</ul>
<hr>
<h2 id="4-ai-bedrock-비용-절감--ai-agent-아이디어">4) AI: Bedrock 비용 절감 + AI Agent 아이디어</h2>
<h3 id="1-bedrock-비용-절감-컬렉션-관리">(1) Bedrock 비용 절감: “컬렉션 관리”</h3>
<ul>
<li>Bedrock 지식베이스/컬렉션을 <strong>정리하고 관리하는 방식</strong>을 통해 비용을 줄일 수 있다는 방향을 공유받음</li>
<li>불필요한 데이터 중복/동기화 빈도/인덱싱 범위를 줄이는 관점에서 점검 필요</li>
</ul>
<h3 id="2-ai-agent-기능-제안-바로-이동하는-에이전트">(2) AI Agent 기능 제안: “바로 이동하는 에이전트”</h3>
<p>멘토링에서 나온 가장 인상적인 아이디어는 <strong>Agent를 ‘네비게이션 도우미’로 쓰는 것</strong>이었다.</p>
<p>예시 기능:</p>
<ul>
<li>사용자가 “<strong>삼국시대로 가줘</strong>”라고 하면 → 바로 해당 시대 화면/연표로 이동</li>
<li>사용자가 “<strong>교과서 123페이지 보여줘</strong>”라고 하면 → 해당 페이지로 점프</li>
<li>즉, Claude(LLM)가 단순 답변을 넘어 <strong>UI 이동/상태 전환을 트리거하는 도우미</strong> 역할을 수행</li>
</ul>
<blockquote>
<p>정리하면, “질문 답변” + “화면 이동/컨텍스트 전환”을 결합한 형태로 사용성을 크게 올릴 수 있다.</p>
</blockquote>
<hr>
<h2 id="5-클라우드-이중화와-eks-학습-방향">5) 클라우드: 이중화와 EKS 학습 방향</h2>
<h3 id="이중화ha-관점">이중화(HA) 관점</h3>
<ul>
<li>서비스 운영을 고려하면 <strong>장애 대응/가용성</strong>을 더 진지하게 설계해야 함</li>
<li>단일 인스턴스/단일 AZ 구조에서 벗어나,<ul>
<li>서비스 레벨(서버)</li>
<li>DB 레벨</li>
<li>네트워크/로드밸런서 레벨
각각의 이중화 포인트를 점검할 필요가 있음</li>
</ul>
</li>
</ul>
<h3 id="eks-학습실습-목표">EKS 학습/실습 목표</h3>
<ul>
<li>“EKS를 공부한다”에서 끝내지 않고, <strong>직접 실습해보는 것</strong>까지 진행하면 좋겠다는 피드백</li>
<li>실습을 통해:<ul>
<li>배포 단위(Deployment/Service/Ingress)</li>
<li>오토스케일링(HPA)</li>
<li>운영 관점(롤링 업데이트/장애 대응)
같은 실제 운영 이슈를 체감할 수 있음</li>
</ul>
</li>
</ul>
<hr>
<h2 id="6-다음-주까지의-to-do액션-아이템">6) 다음 주까지의 To-Do(액션 아이템)</h2>
<ul>
<li><input disabled="" type="checkbox"> 교과서 PDF를 S3에 어떻게 적재/분할/서빙할지 <strong>프론트 전략 확정</strong></li>
<li><input disabled="" type="checkbox"> ERD 피드백 반영해서 <strong>DB 구조 개선</strong> 및 API 설계와 연결</li>
<li><input disabled="" type="checkbox"> Bedrock 컬렉션 운영/관리 전략으로 <strong>비용 절감 포인트 정리</strong></li>
<li><input disabled="" type="checkbox"> Claude 기반 <strong>Agent 네비게이션 기능</strong>(시대 이동, 페이지 점프) 설계 초안 작성</li>
<li><input disabled="" type="checkbox"> 이중화(HA) 체크리스트 작성 + <strong>EKS 실습</strong>(간단한 배포라도) 진행</li>
</ul>
<hr>
<h2 id="마무리">마무리</h2>
<p>이번 멘토링은 단순히 “기능 개발”이 아니라,<br><strong>운영/비용/사용성(네비게이션)까지 고려한 설계 방향</strong>을 잡는 데 도움이 됐다.<br>특히 <strong>AI Agent를 UI 이동 도우미로 활용</strong>하는 아이디어는 사용자 경험을 크게 개선할 수 있는 핵심 포인트라서, 다음 단계에서 우선순위를 높게 두고 구체화해볼 예정이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Amazon Bedrock 지식 기반(Knowledge Bases)으로 RAG 구축하기]]></title>
            <link>https://velog.io/@hong_eh/Amazon-Bedrock-%EC%A7%80%EC%8B%9D-%EA%B8%B0%EB%B0%98Knowledge-Bases%EC%9C%BC%EB%A1%9C-RAG-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@hong_eh/Amazon-Bedrock-%EC%A7%80%EC%8B%9D-%EA%B8%B0%EB%B0%98Knowledge-Bases%EC%9C%BC%EB%A1%9C-RAG-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 28 Nov 2025 08:44:50 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>“내 사내 문서/교재/매뉴얼을 LLM이 똑똑하게 참고하면서 대답해 주게 만들고 싶다”<br>이걸 <strong>AWS 매니지드 서비스</strong>만으로 해결해 주는 게 바로 <strong>Amazon Bedrock Knowledge Bases</strong>(지식 기반) 입니다.<br>(<a href="https://docs.aws.amazon.com/bedrock/latest/userguide/kb-how-it-works.html?utm_source=chatgpt.com">https://docs.aws.amazon.com/bedrock/latest/userguide/kb-how-it-works.html?utm_source=chatgpt.com</a>)</p>
</blockquote>
<p>이 글은 <strong>Bedrock 지식 기반을 처음 쓴다</strong>는 가정으로,</p>
<ol>
<li>개념 이해  </li>
<li>사전 준비 사항 (Root User vs IAM User 분리)  </li>
<li>데이터 소스(S3 등) 연결 &amp; 동기화(Sync)  </li>
<li>Test</li>
</ol>
<p>을 한 번에 따라갈 수 있게 정리했습니다.</p>
<hr>
<h2 id="1-bedrock-knowledge-bases-개념-정리">1. Bedrock Knowledge Bases 개념 정리</h2>
<h3 id="1-1-rag--지식-기반이-뭐야">1-1. RAG + 지식 기반이 뭐야?</h3>
<p><strong>RAG(Retrieval-Augmented Generation)</strong> 는 한 줄로 말하면:</p>
<blockquote>
<p>“답변하기 전에 <strong>내 문서에서 관련 내용을 먼저 찾아서</strong> 그걸 근거로 답변하게 하는 방식”</p>
</blockquote>
<p>작동 흐름은 보통 이래요:</p>
<ol>
<li>사용자의 질문을 <strong>임베딩(벡터화)</strong></li>
<li>내 <strong>문서 벡터 DB(벡터 스토어)</strong> 에서 관련 문서 조각(chunk) 검색</li>
<li>검색 결과를 프롬프트에 끼워 넣고 LLM이 답변 생성</li>
</ol>
<p><strong>Amazon Bedrock Knowledge Bases</strong>는 이 과정을 AWS에서 “자동으로” 묶어둔 서비스예요.</p>
<ul>
<li>문서 → chunk → 임베딩 → 벡터 스토어 저장</li>
<li>질문 → 검색 → 답변 생성(출처 포함)</li>
</ul>
<p>즉, “RAG 파이프라인을 직접 조립하지 않아도 되게 해주는 서비스”라고 보면 됩니다.</p>
<h3 id="1-2-기본-구성-요소지식-기반을-만들면-생기는-것들">1-2. 기본 구성 요소(지식 기반을 만들면 생기는 것들)</h3>
<p>지식 기반을 하나 만들면 보통 아래 4가지가 핵심입니다.  </p>
<blockquote>
<p>Amazon Bedrock 지식 기반 데이터의 사전 조건<br><a href="https://docs.aws.amazon.com/ko_kr/bedrock/latest/userguide/knowledge-base-ds.html">https://docs.aws.amazon.com/ko_kr/bedrock/latest/userguide/knowledge-base-ds.html</a></p>
</blockquote>
<ul>
<li><strong>데이터 소스</strong><ul>
<li>예: S3 버킷에 올린 PDF/HTML/텍스트, Confluence, SharePoint, Salesforce, Kendra, Neptune, RDS/Redshift 등</li>
</ul>
</li>
<li><strong>임베딩 모델(Embedding Model)</strong><ul>
<li>예: <code>amazon.titan-embed-text-v1</code>  </li>
<li>문서를 “벡터(숫자)”로 바꿔서 검색 가능하게 만듦</li>
</ul>
</li>
<li><strong>벡터 스토어(Vector Store)</strong><ul>
<li>예: Amazon OpenSearch Serverless(기본), 또는 Redis/Pinecone 같은 외부 벡터 DB</li>
</ul>
</li>
<li><strong>LLM / Inference Profile</strong><ul>
<li>검색된 문서 조각을 바탕으로 “답변”을 만들어주는 모델</li>
<li>예: <code>global.anthropic.claude-sonnet-4-20250514-v1:0</code> 같은 inference profile ID</li>
</ul>
</li>
</ul>
<hr>
<h2 id="2-사전-준비-사항-root-user-vs-iam-user-분리">2. 사전 준비 사항 (Root User vs IAM User 분리)</h2>
<p>AWS에서 Bedrock 지식 기반을 쓰기 전에,<br><strong>루트 계정으로 한 번만 할 일</strong>과 <strong>IAM 사용자로 계속 할 일</strong>을 분리해 두면 운영이 진짜 편해져요.</p>
<h3 id="루트-계정으로는-지식-기반-bedrock-기능을-사용-할-수-없습니다">루트 계정으로는 지식 기반 Bedrock 기능을 사용 할 수 없습니다!</h3>
<hr>
<h2 id="2-1-root-user루트-계정로-한-번만-할-일">2-1. Root User(루트 계정)로 “한 번만” 할 일</h2>
<blockquote>
<p>루트 계정은 <strong>결제·보안·최초 설정용</strong>으로만 쓰는 게 베스트 프랙티스입니다.<br>실제 Bedrock 작업은 전부 IAM 사용자/역할로 하는 걸 권장합니다.</p>
</blockquote>
<p>1) <strong>결제/리전 확인</strong></p>
<ul>
<li>Bedrock, OpenSearch Serverless, S3에서 요금이 발생할 수 있어요.</li>
<li>결제 수단 등록 + 예산/청구 알림 설정(가능하면 꼭)</li>
<li>사용할 리전(예: <code>ap-northeast-2, Seoul</code>)을 미리 정해두기</li>
</ul>
<p>2) <strong>관리자용 IAM 사용자(또는 IAM Identity Center) 만들기</strong></p>
<ul>
<li>루트 계정을 매일 쓰지 않기 위해 “관리자 계정”을 만들어요.</li>
<li>예: <code>AdministratorAccess</code> 권한 부여</li>
<li>MFA(다중 인증) 설정도 추천</li>
</ul>
<p>3) <strong>루트 계정은 최소 사용 원칙</strong></p>
<ul>
<li>루트로 하는 일:<ul>
<li>비밀번호/MFA 관리</li>
<li>결제/계정 관련 작업  </li>
</ul>
</li>
<li>그 외 Bedrock/리소스 작업은 <strong>IAM 사용자로만</strong> 진행</li>
</ul>
<p>➡️ 여기까지는 “계정 만들고 한 번만” 하면 됩니다.</p>
<hr>
<h2 id="2-2-iam-user관리자개발자로-실제-작업하기">2-2. IAM User(관리자/개발자)로 “실제 작업”하기</h2>
<p>이제부터가 <strong>진짜 Bedrock 지식 기반</strong> 만드는 단계예요.</p>
<h3 id="2-2-1-권한-구분운영이-편해지는-방식">2-2-1. 권한 구분(운영이 편해지는 방식)</h3>
<ul>
<li><strong>관리자(Admin)</strong><ul>
<li>S3, OpenSearch, IAM Role, Knowledge Base <strong>생성·설정 담당</strong></li>
</ul>
</li>
<li><strong>개발자(Developer)</strong><ul>
<li>만들어진 지식 기반을 <strong>질의/테스트/API 호출 담당</strong></li>
</ul>
</li>
</ul>
<p>처음에는 “관리자 / 개발자” 2개로만 나눠도 충분합니다.</p>
<hr>
<h3 id="2-2-2-관리자-iam-사용자로-할-일-세팅-담당">2-2-2. 관리자 IAM 사용자로 할 일 (세팅 담당)</h3>
<p>1) <strong>사용 리전 확정</strong></p>
<ul>
<li>Bedrock + 사용할 모델이 지원되는 리전을 확인하고 통일</li>
<li>예: <code>ap-northeast-2 (Seoul)</code></li>
</ul>
<p>2) <strong>Bedrock 모델 사용 허용(Access 요청/Enable)</strong></p>
<ul>
<li>Bedrock 콘솔에서 사용할 모델(Claude, Titan 등)을 “사용 가능” 상태로 설정</li>
<li>관리자 계정 권한(초기 편의상 넓게):<ul>
<li><code>bedrock:*</code> (초기에는 편함, 운영 안정화 후 최소 권한으로 줄이기 권장)</li>
</ul>
</li>
</ul>
<p>3) <strong>데이터 소스(S3) 준비</strong></p>
<ul>
<li><p>PDF/문서/이미지 등을 담을 전용 S3 버킷 준비  </p>
</li>
<li><p>참고: <a href="https://inpa.tistory.com/entry/AWS-%F0%9F%93%9A-S3-%EB%B2%84%ED%82%B7-%EC%83%9D%EC%84%B1-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95">S3생성 및 권한 설정 블로그</a></p>
</li>
<li><p>폴더 구조 예시</p>
<ul>
<li><code>raw/</code> : 원본 PDF/이미지</li>
<li><code>processed/</code> : 정리된 텍스트/Markdown</li>
<li><code>kb/</code> : 지식 기반이 실제로 읽을 경로  <ul>
<li>예: <code>kb/textbook/middle/grade1/</code></li>
</ul>
</li>
</ul>
</li>
<li><p>S3 권한(최소)</p>
<ul>
<li><code>s3:ListBucket</code>, <code>s3:GetObject</code>, <code>s3:PutObject</code></li>
</ul>
</li>
</ul>
<p>4) <strong>벡터 스토어(OpenSearch Serverless) 준비(선택)</strong></p>
<ul>
<li>Bedrock이 자동으로 만들게 할 수도 있고,</li>
<li>직접 만든 OpenSearch Serverless 컬렉션을 연결할 수도 있어요.</li>
<li>필요 권한 예:<ul>
<li><code>aoss:*</code> 또는<ul>
<li><code>aoss:CreateCollection</code>, <code>aoss:BatchGetCollection</code></li>
<li><code>aoss:UpdateAccessPolicy</code>, <code>aoss:CreateIndex</code></li>
</ul>
</li>
</ul>
</li>
</ul>
<p>5) <strong>지식 기반용 IAM Role 생성</strong></p>
<ul>
<li>Bedrock이 S3/벡터스토어에 접근하려면 서비스 역할(Role)이 필요해요.</li>
<li>Trust Policy에 <code>bedrock.amazonaws.com</code> 허용</li>
<li>Permission Policy 예:<ul>
<li>S3 읽기(<code>s3:GetObject</code>, <code>s3:ListBucket</code>)</li>
<li>OpenSearch Serverless 접근 권한</li>
</ul>
</li>
<li>콘솔에서 “새 역할 생성”으로 자동 생성해도 OK</li>
</ul>
<hr>
<h3 id="2-2-3-개발자-iam-사용자로-할-일-사용호출-담당">2-2-3. 개발자 IAM 사용자로 할 일 (사용/호출 담당)</h3>
<p>1) <strong>Bedrock 지식 기반 접근 권한</strong></p>
<ul>
<li>최소 권한 예:<ul>
<li><code>bedrock:ListKnowledgeBases</code>, <code>bedrock:GetKnowledgeBase</code></li>
<li><code>bedrock:Retrieve</code>, <code>bedrock:RetrieveAndGenerate</code></li>
<li>(필요 시) 모델 호출 <code>bedrock:InvokeModel</code></li>
</ul>
</li>
<li>출처 문서를 S3에서 직접 열어야 하면:<ul>
<li>해당 버킷 <code>s3:GetObject</code></li>
</ul>
</li>
</ul>
<p>2) <strong>콘솔에서 Knowledge Base 생성 &amp; Sync</strong></p>
<ul>
<li>Bedrock 콘솔 → <strong>Knowledge bases</strong> → <code>Create knowledge base</code></li>
<li>S3 경로 + IAM Role + 벡터 스토어(자동/수동) 선택</li>
<li>생성 후 <strong>Sync</strong> 버튼을 눌러 문서 인덱싱(임베딩/저장)</li>
</ul>
<p>3) <strong>콘솔에서 Test knowledge base로 질의 테스트</strong></p>
<ul>
<li>“Test knowledge base”로 질문해보고<ul>
<li>답변이 나오는지</li>
<li>출처(footnote)가 붙는지 확인</li>
</ul>
</li>
</ul>
<p>4) <strong>코드에서 <code>RetrieveAndGenerate</code> 호출 준비</strong></p>
<ul>
<li>로컬/서버에 AWS SDK 설치(<code>boto3</code> 등)</li>
<li><code>bedrock-agent-runtime</code> 클라이언트로 호출</li>
<li>Access Key 또는 Role에 아래 권한이 있어야 정상 동작:<ul>
<li><code>bedrock:RetrieveAndGenerate</code></li>
<li><code>bedrock:InvokeModel</code></li>
</ul>
</li>
</ul>
<hr>
<h2 id="2-3-권장-권한-패턴-한-줄-요약">2-3. 권장 권한 패턴 한 줄 요약</h2>
<ul>
<li><strong>Root User</strong><ul>
<li>결제/보안/계정 초기 설정만</li>
</ul>
</li>
<li><strong>Admin IAM</strong><ul>
<li>S3/OpenSearch/IAM Role/Knowledge Base 생성·설정</li>
</ul>
</li>
<li><strong>Dev IAM</strong><ul>
<li>지식 기반 테스트 + API 호출(<code>RetrieveAndGenerate</code>) 위주</li>
</ul>
</li>
</ul>
<p>이렇게 나누면,</p>
<ul>
<li>“루트 계정으로 실수”를 막고</li>
<li>팀원마다 할 수 있는 범위를 명확히 나눌 수 있어요.</li>
</ul>
<h2 id="3-데이터-소스s3-연결--동기화sync">3. 데이터 소스(S3) 연결 &amp; 동기화(Sync)</h2>
<p>이번 파트는 “내 문서를 Bedrock 지식 기반이 읽게 만드는 과정”입니다.<br>핵심은 딱 2가지예요.</p>
<p>1) <strong>S3(데이터 소스)를 Knowledge Base에 연결</strong><br>2) <strong>Sync(동기화)를 눌러서 인덱싱(Chunk → Embedding → Vector store 저장)</strong></p>
<blockquote>
<p>데이터 소스/형식 사전 조건 참고<br><a href="https://docs.aws.amazon.com/ko_kr/bedrock/latest/userguide/knowledge-base-ds.html">https://docs.aws.amazon.com/ko_kr/bedrock/latest/userguide/knowledge-base-ds.html</a></p>
</blockquote>
<blockquote>
<p>BedRock 지식 기반 생성시 참고 블로그 : <a href="https://dobby-isfree.tistory.com/241">https://dobby-isfree.tistory.com/241</a></p>
</blockquote>
<hr>
<h3 id="3-1-s3에-문서-업로드-준비">3-1. S3에 문서 업로드 준비</h3>
<p>1) <strong>S3 버킷/폴더 구조(예시)</strong></p>
<ul>
<li><code>raw/</code> : 원본(그대로 보관)</li>
<li><code>processed/</code> : 전처리된 텍스트/마크다운(선택)</li>
<li><code>kb/</code> : 지식 기반이 읽을 “최종” 경로 (여기만 연결하는 걸 추천)</li>
</ul>
<p>예:</p>
<ul>
<li><code>s3://my-kb-bucket/kb/manual/</code></li>
<li><code>s3://my-kb-bucket/kb/textbook/middle/grade1/</code></li>
</ul>
<p>2) <strong>업로드</strong></p>
<ul>
<li>PDF, txt, md, html 등 문서를 <code>kb/</code> 아래로 업로드합니다.</li>
</ul>
<p>3) <strong>주의(자주 막히는 포인트)</strong></p>
<ul>
<li>파일명이 너무 길거나 특수문자가 많으면 관리가 어려워서,<ul>
<li>한글 파일명도 가능은 하지만, 문제나면 영문/숫자/언더바로 정리 추천</li>
</ul>
</li>
<li>같은 문서를 여러 번 올리면 “중복 chunk”가 생길 수 있으니<ul>
<li>폴더 버전(<code>v1/</code>, <code>v2/</code>)로 관리하면 좋습니다.</li>
</ul>
</li>
</ul>
<hr>
<h3 id="3-2-knowledge-base-생성-시-s3-데이터-소스-연결">3-2. Knowledge Base 생성 시 S3 데이터 소스 연결</h3>
<p>Bedrock 콘솔에서 아래 순서대로 진행합니다.</p>
<p>1) <strong>Bedrock 콘솔 접속</strong></p>
<ul>
<li>Amazon Bedrock → <strong>Knowledge bases</strong> → <code>Create knowledge base</code></li>
</ul>
<p>2) <strong>Knowledge Base 기본 설정</strong></p>
<ul>
<li>Name: <code>my-kb</code> 처럼 구분 가능한 이름</li>
<li>IAM role: (2장에서 만든 Bedrock 서비스 역할 선택)</li>
</ul>
<p>3) <strong>Data source(데이터 소스)로 S3 선택</strong></p>
<ul>
<li>Data source type에서 <strong>Amazon S3</strong> 선택</li>
<li>S3 URI에 <code>kb/</code> 경로를 정확히 입력<br>예: <code>s3://my-kb-bucket/kb/manual/</code></li>
</ul>
<p>4) <strong>Embedding 모델 선택</strong></p>
<ul>
<li>예: <code>amazon.titan-embed-text-v1</code> 등<br>(문서 → 벡터로 바꿔서 검색 가능하게 만듦)</li>
</ul>
<p>5) <strong>Vector store 선택</strong></p>
<ul>
<li>대부분은 기본값(예: OpenSearch Serverless 자동 구성)으로 진행해도 OK</li>
<li>이미 만들어둔 벡터 스토어가 있다면 선택해서 연결</li>
</ul>
<p>6) <strong>Create</strong></p>
<ul>
<li>생성 완료 후 Knowledge base 상세 화면으로 이동합니다.</li>
</ul>
<hr>
<h3 id="3-3-동기화sync란-무엇이고-언제-누르나">3-3. 동기화(Sync)란 무엇이고, 언제 누르나?</h3>
<p><strong>Sync = “S3 문서를 읽어서 지식 기반에 반영하는 과정”</strong>입니다.</p>
<p>Sync를 누르면 내부적으로:</p>
<ul>
<li>S3 문서 읽기  </li>
<li>문서를 <strong>chunk(조각)</strong> 로 나누기  </li>
<li>각 chunk를 <strong>임베딩(벡터화)</strong>  </li>
<li>벡터 스토어에 저장  </li>
<li>이후 질문이 들어오면, 관련 chunk를 검색해서 답변에 사용</li>
</ul>
<p>즉, <strong>S3에 문서를 올렸다고 바로 반영되는 게 아니라, Sync를 해야 반영됩니다.</strong></p>
<hr>
<h3 id="3-4-최초-1회-sync인덱싱-실행-방법">3-4. 최초 1회 Sync(인덱싱) 실행 방법</h3>
<p>1) Bedrock 콘솔 → Knowledge base 선택
2) <strong>Data sources</strong> 탭 이동
3) 연결된 S3 데이터 소스 선택
4) <strong>Sync</strong> 버튼 클릭</p>
<p><strong>확인할 것</strong></p>
<ul>
<li>Sync status가 <code>In progress → Completed</code>로 바뀌는지</li>
<li>실패하면 <code>Failed</code>로 뜨면서 원인(권한/파일형식 등)이 나옵니다.</li>
</ul>
<hr>
<h3 id="3-5-문서-업데이트할-때-운영-방식추천">3-5. 문서 업데이트할 때 운영 방식(추천)</h3>
<p>현업에서는 보통 아래처럼 운영합니다.</p>
<ul>
<li>새 문서 추가/수정/삭제 → S3 <code>kb/</code> 경로에 반영</li>
<li>변경 후 <strong>Sync 실행</strong></li>
<li>큰 업데이트는 폴더 버전으로 분리<ul>
<li><code>kb/manual/v1/</code> (운영)</li>
<li><code>kb/manual/v2/</code> (준비)</li>
</ul>
</li>
<li>검증 완료 후 v2를 연결하거나, v1을 교체</li>
</ul>
<hr>
<h3 id="3-6-sync가-실패할-때-가장-흔한-원인-top-5">3-6. Sync가 실패할 때 가장 흔한 원인 TOP 5</h3>
<p>1) <strong>IAM Role 권한 문제</strong></p>
<ul>
<li>Bedrock 서비스 역할에 S3 읽기 권한이 부족함<ul>
<li><code>s3:ListBucket</code>, <code>s3:GetObject</code> 확인</li>
</ul>
</li>
</ul>
<p>2) <strong>S3 경로 오타</strong></p>
<ul>
<li><code>s3://bucket/kb/manual/</code> 처럼 prefix가 정확한지 확인</li>
</ul>
<p>3) <strong>지원하지 않는 파일 형식/손상된 파일</strong></p>
<ul>
<li>문서 형식이 조건에 맞는지 확인<br><a href="https://docs.aws.amazon.com/ko_kr/bedrock/latest/userguide/knowledge-base-ds.html">https://docs.aws.amazon.com/ko_kr/bedrock/latest/userguide/knowledge-base-ds.html</a></li>
</ul>
<p>4) <strong>리전(Region) 혼용</strong></p>
<ul>
<li>S3/Knowledge Base/벡터 스토어 리전이 섞이면 문제가 될 수 있어요.</li>
<li>가능하면 같은 리전으로 통일 추천</li>
</ul>
<p>5) <strong>너무 큰 문서/너무 많은 문서</strong></p>
<ul>
<li>처음엔 테스트용으로 파일 몇 개만 넣고 Sync 성공부터 확인한 뒤,
점진적으로 전체 문서를 넣는 방식이 안전합니다.</li>
</ul>
<hr>
<h3 id="3-7-체크-sync-이후-제대로-들어갔는지-확인">3-7. (체크) Sync 이후 제대로 들어갔는지 확인</h3>
<ul>
<li>Bedrock 콘솔 → Knowledge base → <strong>Test knowledge base</strong></li>
<li>“문서에 있는 문장을 그대로” 물어보기</li>
<li>답변에 <strong>출처(footnote)</strong> 가 붙으면 정상적으로 검색이 되는 상태입니다.</li>
</ul>
<h2 id="4-콘솔에서-테스트지식-기반-test-knowledge-base">4. 콘솔에서 테스트(지식 기반 Test knowledge base)</h2>
<p>지식 기반을 만들고 <strong>Sync까지 완료</strong>했다면, 이제 콘솔에서 바로 질문을 던져서</p>
<ul>
<li>검색이 잘 되는지(문서를 제대로 찾는지)</li>
<li>답변이 근거(출처)와 함께 나오는지
를 확인할 수 있습니다.</li>
</ul>
<p>아래 화면처럼 <strong>Amazon Bedrock → 지식 기반 → (내 Knowledge base 선택) → 지식 기반 테스트</strong>로 들어가면 됩니다.</p>
<p><img src="https://velog.velcdn.com/images/hong_eh/post/670a09e7-1a12-4bbd-b458-c03338e3bb2c/image.png" alt=""></p>
<hr>
<h3 id="4-1-테스트-화면-구성왼쪽-설정--오른쪽-대화">4-1. 테스트 화면 구성(왼쪽: 설정 / 오른쪽: 대화)</h3>
<p>테스트 화면은 크게 2부분입니다.</p>
<ul>
<li><p><strong>왼쪽: 구성(설정)</strong></p>
<ul>
<li>검색 방식 선택</li>
<li>사용할 모델 선택(Claude 등)</li>
<li>소스 청크(검색 결과 개수) 등 옵션 조정</li>
</ul>
</li>
<li><p><strong>오른쪽: 테스트</strong></p>
<ul>
<li>질문 입력</li>
<li>답변 생성 결과 확인</li>
<li>출처(원문) 확인</li>
</ul>
</li>
</ul>
<hr>
<h3 id="4-2-꼭-선택해야-하는-옵션-가장-많이-하는-실수-방지">4-2. 꼭 선택해야 하는 옵션 (가장 많이 하는 실수 방지)</h3>
<h4 id="✅-1-검색-및-응답-생성-선택">✅ (1) “검색 및 응답 생성” 선택</h4>
<p>왼쪽 <code>검색 및 응답 생성</code>에서 아래 둘 중 <strong>반드시</strong> 이걸 선택합니다.</p>
<ul>
<li><p><code>검색 전용: 데이터 소스</code><br>→ 문서 검색 결과만 보여주고, 답변 생성은 안 함</p>
</li>
<li><p><code>검색 및 응답 생성: 데이터 소스 및 모델</code> ✅<br>→ <strong>검색 + LLM 답변 생성</strong>까지 한 번에 수행</p>
</li>
</ul>
<p>📌 보통 우리가 원하는 건 “RAG 답변”이라서 <strong>검색 및 응답 생성</strong>이 맞습니다.</p>
<h4 id="✅-2-모델model-선택">✅ (2) 모델(Model) 선택</h4>
<p>캡처처럼 <code>Claude 3.5 Sonnet</code> 등 원하는 모델이 선택되어 있어야 합니다.<br>(모델 접근 허용이 안 되어 있으면 목록에 안 뜰 수 있음)</p>
<hr>
<h3 id="4-3-질문-입력--실행">4-3. 질문 입력 &amp; 실행</h3>
<p>오른쪽 <code>미리 보기</code>(채팅 영역)에 질문을 입력합니다.</p>
<p>예:</p>
<ul>
<li><code>고려 건국 과정 설명해줘</code></li>
<li><code>후삼국 통일 과정의 핵심 사건을 정리해줘</code></li>
</ul>
<p>실행:</p>
<ul>
<li>Enter: 전송/실행</li>
<li>Shift + Enter: 줄바꿈</li>
</ul>
<hr>
<h3 id="4-4-출처가-붙는지로-성공-여부-판단하기">4-4. “출처가 붙는지”로 성공 여부 판단하기</h3>
<p>정상적으로 지식 기반이 동작하면 답변에 <strong>출처 표시(footnote / [1] 같은 번호)</strong> 가 뜹니다.<br>캡처에서도 답변 중간에 <code>[1][2]</code> 같은 형태로 출처가 붙는 걸 확인할 수 있습니다.</p>
<p>추가로 왼쪽 또는 하단의 <strong>소스 청크(Source chunk)</strong> 영역에서</p>
<ul>
<li>어떤 문서 조각이 검색되었는지</li>
<li>그 조각이 답변에 어떻게 사용됐는지
확인할 수 있습니다.</li>
</ul>
<p>✅ 결론:</p>
<ul>
<li>답변이 나오고</li>
<li>출처(각주)가 함께 붙는다<br>→ <strong>Sync + 검색 + 생성이 정상 동작 중</strong>입니다.</li>
</ul>
<hr>
<h3 id="4-5-테스트가-이상할-때짧은-체크">4-5. 테스트가 이상할 때(짧은 체크)</h3>
<ul>
<li>출처가 안 뜬다 → Sync가 안 되었거나, 검색 설정이 “검색 전용”으로 되어 있을 수 있음</li>
<li>질문이 문서랑 상관없는 일반 답변만 나온다 → 관련 문서가 S3에 없거나, chunk로 잘 안 잘렸을 수 있음</li>
<li>답변이 아예 안 나온다 → 모델 권한/리전/역할 권한(S3 읽기) 문제 가능성</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[LG CNS AM INSPIRE] 3기 세  번째 멘토링]]></title>
            <link>https://velog.io/@hong_eh/LG-CNS-AM-INSPIRE-3%EA%B8%B0-%EC%84%B8-%EB%B2%88%EC%A7%B8-%EB%A9%98%ED%86%A0%EB%A7%81</link>
            <guid>https://velog.io/@hong_eh/LG-CNS-AM-INSPIRE-3%EA%B8%B0-%EC%84%B8-%EB%B2%88%EC%A7%B8-%EB%A9%98%ED%86%A0%EB%A7%81</guid>
            <pubDate>Sat, 22 Nov 2025 06:43:10 GMT</pubDate>
            <description><![CDATA[<h1 id="3차-멘토링-회의-정리--haihistory-ai">3차 멘토링 회의 정리 – HAI(History AI)</h1>
<h2 id="1-멘토링-개요">1. 멘토링 개요</h2>
<ul>
<li><strong>프로젝트명</strong>: HAI(History AI)</li>
<li><strong>목적</strong><ul>
<li>작성한 <strong>User Story</strong>를 멘토님께 설명</li>
<li>각 Story에 대해 <strong>피드백 및 리뷰</strong> 진행</li>
<li>기술 스택·아키텍처·기능 범위에 대한 방향성 정리</li>
</ul>
</li>
</ul>
<hr>
<h2 id="2-user-story--서비스-컨셉-피드백">2. User Story &amp; 서비스 컨셉 피드백</h2>
<ul>
<li>User Story 구성 및 방향은 전반적으로 <strong>긍정적인 평가</strong>를 받음.</li>
<li>다만, 아이디어가 많기 때문에<ul>
<li><strong>게임(테마) 요소는 일단 제외</strong>하고</li>
<li><strong>핵심 기능(MVP) 위주</strong>로 먼저 개발 시작하는 것이 좋다는 조언.</li>
</ul>
</li>
<li>게임적인 요소(캐릭터, 스토리, UI 연출 등)는<br>→ <strong>추후 안정화 후에 확장 요소로 고민</strong>하기로 함.</li>
</ul>
<hr>
<h2 id="3-교과서--이미지-처리-방안-논의">3. 교과서 &amp; 이미지 처리 방안 논의</h2>
<h3 id="31-교과서-질문-처리-방식">3.1 교과서 질문 처리 방식</h3>
<ul>
<li>사용자가 <strong>교과서에 대해 질문</strong>할 때, 교과서 정보를 어떻게 저장하고 검색할지 논의.</li>
<li>교과서를 단순 텍스트가 아니라 <strong>이미지 + 페이지 구조</strong>까지 고려해야 함.</li>
</ul>
<h3 id="32-이미지페이지-처리-전략-옵션">3.2 이미지/페이지 처리 전략 (옵션)</h3>
<ol>
<li><p><strong>Vector DB + 이미지 메타데이터 방식</strong></p>
<ul>
<li>교과서를 <strong>섹션/단원/단락 단위로 분할</strong>하여 텍스트를 Vector DB화</li>
<li><strong>이미지는 별도로 저장</strong>하고,<br>해당 이미지의 <strong>URL/경로를 메타데이터로 함께 저장</strong></li>
<li>검색 결과에서:<ul>
<li>관련 텍스트와 함께<br>→ 해당 페이지/이미지 URL을 사용해 <strong>이미지를 함께 노출</strong> 가능</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>페이지 단위 뷰어 방식</strong></p>
<ul>
<li>이미지를 따로 떼어 저장하지 않고,</li>
<li>검색 시 <strong>문제가 있는 페이지 전체를 바로 보여주는 형식</strong></li>
<li>교과서 뷰어처럼 “현재 페이지”를 보여주고<br>질문과 연결된 부분을 표시하는 UX도 고려 가능.</li>
</ul>
</li>
</ol>
<blockquote>
<p>결론: 두 가지 방식 모두 장단점이 있어,<br><strong>서비스 UX/난이도/개발 리소스를 고려해 선택</strong>하기로 함.</p>
</blockquote>
<hr>
<h2 id="4-기능-및-화면-기획-관련-논의">4. 기능 및 화면 기획 관련 논의</h2>
<h3 id="41-관리자--강사-기능">4.1 관리자 &amp; 강사 기능</h3>
<ul>
<li><strong>관리자 페이지</strong>는 가능하면 초기부터 고려하는 것이 좋다는 의견.</li>
<li><strong>강사용 기능</strong>:<ul>
<li>강사가 사용하는 <strong>교과서를 변경/선택</strong>할 수 있도록 설계</li>
<li>추후 여러 교과서를 관리할 수 있는 구조를 염두에 둘 것.</li>
</ul>
</li>
</ul>
<h3 id="42-퀴즈--캐릭터게임-요소">4.2 퀴즈 &amp; 캐릭터/게임 요소</h3>
<ul>
<li><strong>캐릭터/일러스트/게임화 요소</strong>는  <ul>
<li>제작 난이도와 리소스가 크기 때문에  </li>
<li><strong>초기 버전에서는 최소화</strong>하는 방향.</li>
</ul>
</li>
<li>단원 마무리용 퀴즈는:<ul>
<li><strong>텍스트 박스에 퀴즈/답안을 올리는 정도의 간단한 형태</strong>로 시작</li>
<li>이후 여유가 생기면 객관식, 드래그앤드롭 등 확장 가능.</li>
</ul>
</li>
</ul>
<h3 id="43-로그인-기능">4.3 로그인 기능</h3>
<ul>
<li><strong>로그인 기능을 넣을지 여부</strong>는 아직 결정 X<ul>
<li>계정 기반 저장/히스토리/진행도 관리가 필요하다면 필수</li>
<li>초기 PoC 단계에서는 <strong>비로그인/간단한 세션 기반</strong>으로 갈 수도 있음</li>
</ul>
</li>
<li>추후 요구사항에 맞춰 결정하기로 함.</li>
</ul>
<h3 id="44-기술-검토-표시">4.4 기술 검토 표시</h3>
<ul>
<li>기술 스택·도입 여부 검토가 끝난 것들은<br>→ <strong>FigJam에 “기술 검토 완료” 등으로 명시</strong>해서,<ul>
<li>팀원 모두가 현재 상태를 한눈에 볼 수 있도록 관리하기로 함.</li>
</ul>
</li>
</ul>
<hr>
<h2 id="5-기술-스택--아키텍처-논의">5. 기술 스택 &amp; 아키텍처 논의</h2>
<h3 id="51-백엔드--ai-역할-분리">5.1 백엔드 &amp; AI 역할 분리</h3>
<ul>
<li><strong>백엔드 메인 프레임워크</strong>:  <ul>
<li>Spring Boot vs Python 중 <strong>Spring Boot를 메인 백엔드로 사용하는 방향</strong> 추천</li>
</ul>
</li>
<li><strong>AI 기능</strong>:<ul>
<li>모델 호출, 임베딩 생성, Vector DB 연동 등 <strong>AI 관련 로직은 Python에 집중</strong></li>
<li>구조 예시:<ul>
<li>Spring Boot: 인증/권한, 비즈니스 로직, API Gateway 역할</li>
<li>Python: AI 서버, 모델 인퍼런스, 임베딩 생성, 검색 API 제공</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="52-db--검색-스택">5.2 DB &amp; 검색 스택</h3>
<p>아직 최종 결정 전, 후보군 논의:</p>
<ul>
<li><strong>관계형 DB (메인 데이터 저장소)</strong><ul>
<li>MariaDB</li>
<li>PostgreSQL (Vector 확장 기능을 활용할지를 포함하여 고려)</li>
</ul>
</li>
<li><strong>검색/Vector DB/기타</strong><ul>
<li>PostgreSQL + Vector 확장</li>
<li>또는 <strong>Elasticsearch</strong>를 도입해서 검색 기능 강화</li>
</ul>
</li>
<li>현재는:<ul>
<li><strong>메인 트랜잭션 DB</strong>와</li>
<li><strong>검색/유사도 기반 Q&amp;A용 Vector DB or 검색 엔진</strong><br>→ <strong>역할 분리하는 방향</strong>으로 고민 중.</li>
</ul>
</li>
</ul>
<h3 id="53-파일이미지-저장소">5.3 파일/이미지 저장소</h3>
<ul>
<li>교과서 원본, 이미지, 첨부 파일 등은<ul>
<li><strong>S3 같은 오브젝트 스토리지에 저장</strong>하는 방향이 적합하다는 의견.</li>
<li>DB에는 <strong>파일 경로/URL, 메타데이터만 저장</strong>.</li>
</ul>
</li>
</ul>
<h3 id="54-인프라-캐시-cicd">5.4 인프라, 캐시, CI/CD</h3>
<ul>
<li><strong>CI/CD</strong><ul>
<li>다양한 옵션 중에서 <strong>GitHub Actions 사용을 추천</strong></li>
<li>저장소 기반, Workflow 관리가 편하고 학습 자료도 많음.</li>
</ul>
</li>
<li><strong>캐시</strong><ul>
<li>세션/토큰/간단한 캐시 및 큐잉 용도로 <strong>Redis 도입</strong>을 검토.</li>
</ul>
</li>
<li><strong>아키텍처</strong><ul>
<li>가능하다면 <strong>MSA 구조에 도전해 보는 것</strong>을 권장.</li>
<li>다만, 개발 시작 전에:<ul>
<li>어떤 서비스를 나눌지</li>
<li>서비스 간 통신 방식</li>
<li>각 서비스의 책임 범위<br>→ <strong>명확히 정의하고 시작하는 것이 중요</strong>하다는 조언.</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h2 id="6-부하-테스트--비용-이슈">6. 부하 테스트 &amp; 비용 이슈</h2>
<ul>
<li><strong>nGrinder</strong>를 활용해 부하 테스트를 진행할 예정이라면,<ul>
<li>테스트 시 <strong>AI 호출(토큰 사용량)을 반드시 주의할 것</strong>.</li>
</ul>
</li>
<li>부하 테스트에서 무분별하게 모델을 호출하면<ul>
<li>비용이 심하게 증가할 수 있음.</li>
</ul>
</li>
<li>해결 방향:<ul>
<li>테스트 전용 <strong>Mock 서버</strong> 또는</li>
<li>특정 구간에서만 실제 AI 호출,</li>
<li>혹은 <strong>토큰 사용량을 제한한 시나리오</strong>를 설계하는 방안 고려.</li>
</ul>
</li>
</ul>
<hr>
<h2 id="7-다음-액션-아이템-todo">7. 다음 액션 아이템 (TODO)</h2>
<ul>
<li><input disabled="" type="checkbox"> 교과서 &amp; 이미지 처리 방식(옵션 1 vs 옵션 2) 최종 결정</li>
<li><input disabled="" type="checkbox"> 백엔드(Spring Boot)와 AI(Python) 역할 분리 아키텍처 초안 작성</li>
<li><input disabled="" type="checkbox"> 메인 DB(MariaDB vs PostgreSQL) 및 검색/Vector DB 구성 확정</li>
<li><input disabled="" type="checkbox"> 파일 저장소로 S3 사용 여부 확정 및 버킷 구조 설계</li>
<li><input disabled="" type="checkbox"> MSA로 나눌 서비스 경계(예: auth, content, quiz, ai 등) 정의</li>
<li><input disabled="" type="checkbox"> FigJam에 <strong>기술 검토 완료/보류</strong> 상태 표시 체계 정의</li>
<li><input disabled="" type="checkbox"> 로그인 기능 도입 여부 및 요구 기능(진행도 저장, 히스토리 등) 정리</li>
<li><input disabled="" type="checkbox"> nGrinder 부하 테스트 시 <strong>AI 토큰 사용 전략</strong>(Mock, 제한 등) 설계(나중에 검토)</li>
<li><input disabled="" type="checkbox"> spring Boot를 쓴다면 어떤 라이브러리를 쓸지</li>
<li><input disabled="" type="checkbox"> frontend에서 어떤 UI를 쓸지</li>
<li><input disabled="" type="checkbox"> Docker로 Vector DB띄워서 하는 방법 찾기</li>
</ul>
<hr>
<h2 id="8-용어-정리">8. 용어 정리</h2>
<p>아래는 멘토링/설계에서 언급된 주요 인프라/메시징/IaC 용어 정리입니다.  </p>
<hr>
<h3 id="81-route-53">8.1 Route 53</h3>
<ul>
<li><strong>무엇?</strong><br>AWS에서 제공하는 <strong>DNS 서비스</strong></li>
<li><strong>역할</strong>  <ul>
<li><code>history-ai.com</code> 같은 <strong>도메인 이름</strong>을 실제 서버/서비스와 연결</li>
<li>지연 시간 기반, 지역 기반 등 <strong>다양한 트래픽 라우팅 정책</strong> 지원</li>
</ul>
</li>
<li><strong>언제 사용?</strong><ul>
<li>나만의 도메인으로 서비스 접속</li>
<li><code>api.history-ai.com</code>, <code>admin.history-ai.com</code> 같은 서브도메인 구성</li>
</ul>
</li>
</ul>
<hr>
<h3 id="82-cloudfront">8.2 CloudFront</h3>
<ul>
<li><strong>무엇?</strong><br>AWS의 <strong>CDN(Content Delivery Network)</strong> 서비스</li>
<li><strong>역할</strong><ul>
<li>S3/EC2/ALB에 있는 콘텐츠를 <strong>전 세계 엣지 서버에 캐싱</strong>해서 빠르게 전달</li>
<li>이미지, JS/CSS, 교과서 파일 뷰어 등을 사용자와 가까운 위치에서 제공</li>
</ul>
</li>
<li><strong>언제 사용?</strong><ul>
<li>정적 리소스를 전 세계에 빠르게 제공하고 싶을 때</li>
<li>트래픽 많을 때 응답 속도와 비용 최적화</li>
</ul>
</li>
</ul>
<hr>
<h3 id="83-s3-simple-storage-service">8.3 S3 (Simple Storage Service)</h3>
<ul>
<li><strong>무엇?</strong><br>AWS의 <strong>오브젝트 스토리지</strong></li>
<li><strong>역할</strong><ul>
<li>이미지, PDF, 동영상, JSON 같은 <strong>파일 저장소</strong></li>
<li>버킷(bucket) 단위 관리, 버전 관리, 정적 웹 호스팅 가능</li>
</ul>
</li>
<li><strong>언제 사용?</strong><ul>
<li>교과서 원본, 페이지 이미지, 첨부파일 저장</li>
<li>Vector DB 메타데이터에서 <strong>이미지/파일 URL</strong>로 연결할 때</li>
</ul>
</li>
</ul>
<hr>
<h3 id="84-aws-lambda">8.4 AWS Lambda</h3>
<ul>
<li><strong>무엇?</strong><br>서버를 직접 관리하지 않고 <strong>코드만 실행하는 서버리스 함수(Function as a Service)</strong> 서비스</li>
<li><strong>역할</strong><ul>
<li>S3 업로드, API 요청, 스케줄 등 <strong>이벤트 기반으로 짧은 로직 실행</strong></li>
<li>인프라 신경 안 쓰고 함수 단위로 코드 배포</li>
</ul>
</li>
<li><strong>언제 사용?</strong><ul>
<li>교과서 업로드 시 자동으로 썸네일/메타데이터 생성</li>
<li>간단한 API, 배치/스케줄러성 작업 처리</li>
</ul>
</li>
</ul>
<hr>
<h3 id="85-kafka">8.5 Kafka</h3>
<ul>
<li><strong>무엇?</strong><br>대용량 실시간 데이터 처리를 위한 <strong>분산 메시지 스트리밍 플랫폼</strong></li>
<li><strong>역할</strong><ul>
<li>서비스 간 이벤트를 <strong>토픽(topic)</strong> 단위로 발행/구독</li>
<li>로그, 클릭 이벤트, 문제 풀이 기록을 모아서 분석 시스템으로 전달</li>
</ul>
</li>
<li><strong>언제 사용?</strong><ul>
<li>HAI에서 학생 행동 로그를 쌓고 추천/통계/분석에 활용할 때</li>
<li>MSA에서 <strong>비동기 이벤트 기반 통신</strong> 구조 설계할 때</li>
</ul>
</li>
</ul>
<hr>
<h3 id="86-vpc-virtual-private-cloud">8.6 VPC (Virtual Private Cloud)</h3>
<ul>
<li><strong>무엇?</strong><br>AWS 안에서 만드는 <strong>나만의 가상 네트워크(사설망)</strong></li>
<li><strong>역할</strong><ul>
<li>공개/비공개 서브넷, 라우팅, 보안 그룹 등을 구성해<br><strong>네트워크 구조와 보안 경계</strong>를 설계</li>
<li>외부 노출 리소스(ALB 등)와 내부 리소스(DB, 내부 API 서버) 분리</li>
</ul>
</li>
<li><strong>언제 사용?</strong><ul>
<li>백엔드, DB, Redis 등을 안전한 사설망 안에서 운영할 때</li>
<li>실무 수준의 네트워크/보안 구조를 갖추고 싶을 때 필수</li>
</ul>
</li>
</ul>
<hr>
<h3 id="87-terraform">8.7 Terraform</h3>
<ul>
<li><strong>무엇?</strong><br>HashiCorp에서 만든 <strong>오픈소스 IaC(Infrastructure as Code) 도구</strong></li>
<li><strong>역할</strong><ul>
<li><code>.tf</code> 파일(HCL 언어)로 <strong>클라우드 인프라 구조를 코드로 선언</strong><br>→ <code>terraform apply</code>로 실제 인프라를 생성/변경</li>
<li><strong>멀티 클라우드</strong> 지원: AWS, Azure, GCP, Kubernetes 등 다양한 프로바이더</li>
<li><code>terraform plan</code>으로 변경 내용을 미리 확인(일종의 diff)</li>
</ul>
</li>
<li><strong>언제 사용?</strong><ul>
<li>AWS 외에도 여러 클라우드/서비스를 한 번에 관리하고 싶을 때</li>
<li>인프라 구성을 Git으로 버전 관리하고, CI/CD와 연동하고 싶을 때</li>
<li>HAI 인프라를 코드로 관리하면서, 나중에 다른 클라우드도 고려할 수 있는 구조로 가고 싶을 때</li>
</ul>
</li>
</ul>
<hr>
<h3 id="88-aws-cloudformation">8.8 AWS CloudFormation</h3>
<ul>
<li><strong>무엇?</strong><br>AWS가 제공하는 <strong>AWS 전용 IaC 서비스</strong></li>
<li><strong>역할</strong><ul>
<li>YAML/JSON 템플릿으로 VPC, EC2, RDS, S3, IAM 등<br><strong>AWS 리소스를 정의하고 스택(Stack) 단위로 배포/관리</strong></li>
<li>AWS 내부 서비스들과 깊게 연동 (CDK, SAM 등이 결국 CloudFormation 템플릿을 생성해서 사용)</li>
</ul>
</li>
<li><strong>언제 사용?</strong><ul>
<li>인프라가 거의 <strong>AWS 안에서만</strong> 구성될 때</li>
<li>“AWS 공식” 도구로 인프라를 정의/관리하고 싶을 때</li>
<li>HAI가 AWS에만 올인하고, 멀티클라우드 계획이 크지 않다면<br>CloudFormation(+CDK)도 후보가 될 수 있음</li>
</ul>
</li>
</ul>
<blockquote>
<p><strong>Terraform vs CloudFormation 감각 정리</strong>  </p>
<ul>
<li>Terraform:<br>→ “여러 클라우드를 포함하는 <strong>범용 IaC 툴</strong>”  </li>
<li>CloudFormation:<br>→ “<strong>AWS에 특화된 공식 IaC 서비스</strong>”</li>
</ul>
</blockquote>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[LG CNS AM INSPIRE] 3기 두 번째 멘토링]]></title>
            <link>https://velog.io/@hong_eh/LG-CNS-AM-INSPIRE-3%EA%B8%B0-%EB%91%90-%EB%B2%88%EC%A7%B8-%EB%A9%98%ED%86%A0%EB%A7%81</link>
            <guid>https://velog.io/@hong_eh/LG-CNS-AM-INSPIRE-3%EA%B8%B0-%EB%91%90-%EB%B2%88%EC%A7%B8-%EB%A9%98%ED%86%A0%EB%A7%81</guid>
            <pubDate>Sat, 15 Nov 2025 06:36:40 GMT</pubDate>
            <description><![CDATA[<h2 id="두-번째-멘토링">두 번째 멘토링</h2>
<p>지난 주 멘토링 시간에는 교육 도메인에 적용할 수 있는 인공지능 기술인 <strong>RAG, Tool Calling, Vector DB</strong>에 대해 배웠다. 이를 바탕으로 &quot;AI가 개인 맞춤형 IT 로드맵을 제공하는 서비스&quot;라는 주제를 설정했고, 지난 일주일간 Agile 방식으로 프로젝트를 진행했다.</p>
<hr>
<h3 id="📋-일주일간의-작업-과정">📋 일주일간의 작업 과정</h3>
<h4 id="1-vision-board-작성">1. Vision Board 작성</h4>
<p>프로젝트의 방향성과 최종 목표를 시각화하며 팀원들과 같은 그림을 그리기 위한 첫 단추를 끼웠다.</p>
<h4 id="2-user-story와-scenario-작성">2. User Story와 Scenario 작성</h4>
<p>가장 먼저 집중한 것은 사용자 관점에서 서비스를 정의하는 것이었다. <strong>&quot;누가, 왜, 무엇을 원하는가?&quot;</strong> 라는 질문에 답하며 User Story를 작성했고, 실제 사용 시나리오를 구체화했다. 단순히 기능을 나열하는 것이 아니라, 실제 사용자가 겪을 문제와 그 해결 과정을 상상하며 작성하니 서비스의 방향성이 명확해졌다.</p>
<h4 id="3-theme-epic과-feature-정리">3. Theme Epic과 Feature 정리</h4>
<p>큰 주제(Theme Epic)를 설정하고, 이를 구현 가능한 Feature 단위로 쪼개는 작업을 진행했다. GitHub Issues에 Feature 태그를 붙여가며 <strong>9개의 이슈</strong>를 오픈했고, 각각에 우선순위와 담당자를 배정했다. AX 조사, 학습 주제 선정, 환경설정 기능 구현 등 다양한 작업이 동시다발적으로 진행되었다.</p>
<h4 id="4-agile-전체-프로세스-체험">4. Agile 전체 프로세스 체험</h4>
<p>이번 주는 &#39;Agile 에자일 전체&#39;라는 이슈명 그대로, 애자일 방법론의 전 과정을 경험한 주였다. 스프린트 계획, 일일 스탠드업(비록 비동기로 진행되었지만), 진행 상황 공유, 그리고 회의 태그가 붙은 작업들을 통해 팀원들과 끊임없이 소통했다.</p>
<hr>
<h3 id="🎯-기존-서비스들과의-차별점">🎯 기존 서비스들과의 차별점</h3>
<h4 id="1-ai와-함께-개발-목표-직접-설정">1. AI와 함께 개발 목표 직접 설정</h4>
<p>사용자가 AI와 대화하며 자신의 상황과 목표에 맞는 학습 계획을 능동적으로 설계할 수 있도록 한다.</p>
<h4 id="2-화면-모니터링-기반-트러블슈팅-기능">2. 화면 모니터링 기반 트러블슈팅 기능</h4>
<p>학습 중 발생하는 오류를 실시간으로 감지하고 해결책을 제시하는 기능을 구상했다.</p>
<blockquote>
<p>💡 <strong>멘토님 피드백</strong><br>계속 모니터링하는 방식은 기술적으로 구현이 어렵고 사용자 경험 측면에서도 부담스러울 수 있다. 사용자가 특정 버튼을 눌러 현재 화면을 캡처하고, 그것을 바탕으로 트러블슈팅을 제공하는 방식이 더 현실적일 수 있다.</p>
</blockquote>
<h4 id="3-맞춤형-로드맵-생성-및-진행-관리">3. 맞춤형 로드맵 생성 및 진행 관리</h4>
<p>사용자의 현재 수준과 목표, 가용 시간 등을 고려한 개인화된 학습 로드맵을 생성하고, 그 로드맵을 따라갈 수 있도록 지속적으로 가이드한다.</p>
<h4 id="4-개발-환경-설치-자동화">4. 개발 환경 설치 자동화</h4>
<p>초보자들이 가장 어려워하는 개발 환경 구축 과정을 자동화한다.</p>
<blockquote>
<p>💡 <strong>멘토님 피드백</strong><br>PC의 모든 권한을 부여받아 한 번에 설치하는 방식은 보안상 위험할 수 있다. 사용자가 안전하게 느낄 수 있는 단계적 접근이 필요하다.</p>
</blockquote>
<hr>
<h3 id="🔍-다음-단계를-위한-과제">🔍 다음 단계를 위한 과제</h3>
<blockquote>
<p>📌 <strong>참고 자료</strong>: <a href="https://blog.naver.com/sayment/223733261853">https://blog.naver.com/sayment/223733261853</a></p>
</blockquote>
<p>멘토님께서 <strong>11개의 교육 테마 서비스</strong> 중 우리 아이디어가 어디에 포함되는지 명확히 정의하고, 아이디어를 재설계해보라는 피드백을 주셨다. </p>
<p>*&quot;기능들은 구상했지만, 서비스의 정체성과 포지셔닝을 더욱 명확히 해야 할 시점이다.&quot;*</p>
<p>다음 주에는 이 부분에 집중하며 아이디어를 정교화할 계획이다. 새로운 아이디어를 제시하기 위한 방법으로는 <strong>AI와 함께 대상과 기능을 엮어 아이디어를 제시하고 구체화하는 방향</strong>으로 다시 아이디어를 제시하는 방법을 알려주셨다.</p>
<hr>
<h3 id="⚙️-아이디어-결정-후-진행-계획">⚙️ 아이디어 결정 후 진행 계획</h3>
<p>✔️ 1) 아이디어 구체화
    •    대상(취준생/개발자/학생 등) + 기능 조합
    •    POC를 통해 기능 검증 진행</p>
<p>✔️ 2) 기능 정리
    •    핵심 기능(MVP) 선정
    •    구현 가능 범위 및 우선순위 설정</p>
<p>✔️ 3) 기술 스택 결정
    •    Frontend / Backend / DB / CI/CD 전체 구조 설계
    •    Python or Java 중 AI 로직 개발 언어 선택
    •    PostgreSQL Vector DB vs OpenSearch Vector DB 비교 후 선택</p>
<p>✔️ 4) 역할 분담
    •    팀원별 Front/Back/AI/Infra 역할 분담
    •    업무 로드맵 제시</p>
<p>✔️ 5) POC(Proof of Concept) 일정 초기에 배치
    •    기능이 실제 가능한지 빠르게 검증
    •    실패 시 Plan B 아이디어로 회귀</p>
<p>✔️ 6) 프로젝트 구조 정립
    •    FrontEnd 폴더 구조 (React/Next.js Best Practice 참고)
    •    BackEnd 폴더 구조 (Spring Boot/FastAPI Best Practice 참고)
    •    구조 확정 후 개발 시작</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS가 제시하는 클라우드 설계 패턴 정리 2]]></title>
            <link>https://velog.io/@hong_eh/AWS%EA%B0%80-%EC%A0%9C%EC%8B%9C%ED%95%98%EB%8A%94-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EC%84%A4%EA%B3%84-%ED%8C%A8%ED%84%B4-%EC%A0%95%EB%A6%AC-2</link>
            <guid>https://velog.io/@hong_eh/AWS%EA%B0%80-%EC%A0%9C%EC%8B%9C%ED%95%98%EB%8A%94-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EC%84%A4%EA%B3%84-%ED%8C%A8%ED%84%B4-%EC%A0%95%EB%A6%AC-2</guid>
            <pubDate>Thu, 13 Nov 2025 07:53:44 GMT</pubDate>
            <description><![CDATA[<h2 id="api-라우팅-패턴-왜-필요한가">API 라우팅 패턴 왜 필요한가?</h2>
<p>API 라우팅 패턴은 클라이언트 요청이 어떤 서비스로 전달될지 명확하게 정의하는 규칙입니다.</p>
<h4 id="1-서비스-경로를-표준화하기-위해">1. 서비스 경로를 표준화하기 위해</h4>
<p>서로 다른 팀이 개발한 서비스가 뒤섞이면
/users, /user, /api/v1/user, /v1/users
같은 비일관적 경로들이 발생합니다.</p>
<p>API 라우팅 패턴을 적용하면 다음처럼 모든 서비스가 같은 규칙을 따르게 된다.</p>
<pre><code>/api/v1/users
/api/v1/orders
/api/v1/auth</code></pre><h4 id="2-api-gateway가-요청을-올바른-서비스로-라우팅하기-위해">2. API Gateway가 요청을 올바른 서비스로 라우팅하기 위해</h4>
<p>MSA 구조는
프론트엔드 → API Gateway → Microservices
Gateway는 요청이 들어왔을 때 이렇게 해야 합니다.</p>
<pre><code>/api/v1/users → user-service  
/api/v1/auth  → auth-service  
/api/v1/routine → routine-service</code></pre><h4 id="3-버저닝을-통한-서비스-변경-관리">3. 버저닝을 통한 서비스 변경 관리</h4>
<p>API는 시간이 지나면 변경되기 마련이다.
하지만 기존 앱은 옛버전을 여전히 호출할 수 있기 때문에,
버전 관리(v1, v2, v3 …) 해야 서비스 업그레이드가 용이합니다</p>
<pre><code>/api/v1/users  ← 기존 앱 유지
/api/v2/users  ← 새로운 Response 제공</code></pre><h4 id="4-보안·인증-정책을-서비스별로-다르게-적용-가능">4. 보안·인증 정책을 서비스별로 다르게 적용 가능</h4>
<pre><code>/api/v1/auth/* → 인증 제외 (login 필요 없음)
/api/v1/users/* → JWT 인증 필요
/api/v1/admin/* → 관리자 Role 필요</code></pre><p>일관된 라우팅 구조가 있어야
Gateway, Spring Security, Role 기반 접근 제어를 쉽게 설정할 수 있다.</p>
<h3 id="호스트-이름-라우팅">호스트 이름 라우팅</h3>
<pre><code>https://api.myservice.com/users
https://admin.myservice.com/dashboard
https://m.myservice.com/home</code></pre><p>이런식으로 요청이 들어오면 각각의 도메인이 다르기에 Gateway가 Service를 다르게 보낸다.</p>
<p>1) 기능별로 도메인을 분리할 수 있음 (서비스 경계 명확)</p>
<pre><code>    •    api.example.com → API 서버
    •    admin.example.com → 관리자 웹
    •    cdn.example.com → 정적 파일
    •    openapi.example.com → 외부 개발자용 API</code></pre><p>2) URL 구조를 깔끔하게 유지할 수 있음</p>
<p>Path-based Routing (경로 기반)</p>
<pre><code>example.com/api/users
example.com/admin/dashboard</code></pre><p>Host-based Routing (도메인 기반)</p>
<pre><code>api.example.com/users
admin.example.com/dashboard</code></pre><p>3) MSA + API Gateway와 궁합이 최고임</p>
<p>Nginx, AWS ALB, Spring Cloud Gateway, Envoy 모두 지원하는 패턴.</p>
<p>예: Spring Cloud Gateway에서 Host 라우팅</p>
<pre><code>routes:
  - id: user-service
    uri: http://user-service:8080
    predicates:
      - Host=api.example.com

  - id: admin-service
    uri: http://admin-service:8080
    predicates:
      - Host=admin.example.com</code></pre><p><img src="https://velog.velcdn.com/images/hong_eh/post/abb60c98-04fc-4dc9-aea1-3b3dffbe134f/image.png" alt="">
호스트 이름 라우팅 패턴은 도메인을 기준으로 요청을 서로 다른 백엔드 서비스로 라우팅하는 패턴이다.
MSA 환경에서 서비스 경계를 명확하게 하고, 인증/보안/트래픽 정책을 도메인 단위로 분리하여 적용할 수 있다는 장점이 있다.
또한 API Gateway(Nginx, ALB, SCG 등)에서 광범위하게 지원되며,
규모가 커질수록 Host 기반 분리가 API 설계와 운영 효율을 크게 향상할수있다.</p>
<blockquote>
<p>AWS API 라우팅 패턴
<a href="https://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/cloud-design-patterns/api-routing.html">https://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/cloud-design-patterns/api-routing.html</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS가 제시하는 클라우드 설계 패턴 정리 1]]></title>
            <link>https://velog.io/@hong_eh/AWS%EA%B0%80-%EC%A0%9C%EC%8B%9C%ED%95%98%EB%8A%94-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EC%84%A4%EA%B3%84-%ED%8C%A8%ED%84%B4-%EC%A0%95%EB%A6%AC-1</link>
            <guid>https://velog.io/@hong_eh/AWS%EA%B0%80-%EC%A0%9C%EC%8B%9C%ED%95%98%EB%8A%94-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EC%84%A4%EA%B3%84-%ED%8C%A8%ED%84%B4-%EC%A0%95%EB%A6%AC-1</guid>
            <pubDate>Wed, 12 Nov 2025 06:45:31 GMT</pubDate>
            <description><![CDATA[<h2 id="aclanti-corruption-layer-손실-방지-계층-정리">ACL(Anti-Corruption Layer, 손실 방지 계층) 정리</h2>
<p>ACL은 서로 다른 언어를 쓰는 두 시스템 사이를 통역해 주는 &quot;<strong>통역사</strong>&quot; 입니다!
업스트림 팀 : 기존에 이미 있던 레거시 모놀로식 시스템
다운스트림 팀 : 새로 만든 마이크로서비스
업스트림, 다운스트림은 같은 곳에 있지만 서로 다른 언어와 구조를 사용합니다.</p>
<p>업스트림(모놀로식)은 &quot;직원&quot;을 Employee라고 하고
다운스트림(마이크로서비스)은 &quot;직원&quot;을 Worker로 라고 하면
서로의 데이터를 이해하기 위한 통역사(ACL)이 필요합니다!</p>
<h2 id="acl-작동-방식-step">ACL 작동 방식 STEP</h2>
<p>1️⃣ <strong>데이터 수신</strong> – 업스트림 시스템으로부터 데이터를 받습니다.
2️⃣ <strong>데이터 변환</strong> – ACL이 다운스트림에서 이해할 수 있도록 모델 변환을 수행합니다.
3️⃣ <strong>데이터 활용</strong> – 마이크로서비스는 자신의 모델을 유지한 채 외부 데이터를 안전하게 사용합니다.</p>
<p><strong>업스트림 시스템 (기존 모놀리스)</strong>
<img src="https://velog.velcdn.com/images/hong_eh/post/a1e1a34c-5789-4298-bb39-970958b77955/image.png" alt="">
<strong>다운스트림 시스템 (마이크로서비스)</strong>
<img src="https://velog.velcdn.com/images/hong_eh/post/129e2f5a-4804-4509-801f-dd94d62b6935/image.png" alt="">
<strong>통합된 ACL 구조</strong>
<img src="https://velog.velcdn.com/images/hong_eh/post/30af0596-6012-4562-9323-99ba2bfd9c0f/image.png" alt="">
<strong>[출처: AWS Cloud Design Patterns]</strong></p>
<blockquote>
<p>🔗 AWS 공식 문서 ACL(Anti-Corruption Layer)
<a href="https://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/cloud-design-patterns/acl.html">https://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/cloud-design-patterns/acl.html</a>
🔗 AWS 구현 ACL
<a href="https://github.com/aws-samples/anti-corruption-layer-pattern">https://github.com/aws-samples/anti-corruption-layer-pattern</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[LG CNS AM INSPIRE] 3기 첫 번째 멘토링]]></title>
            <link>https://velog.io/@hong_eh/LG-CNS-AM-INSPIRE-3%EA%B8%B0-%EC%B2%AB-%EB%B2%88%EC%A7%B8-%EB%A9%98%ED%86%A0%EB%A7%81</link>
            <guid>https://velog.io/@hong_eh/LG-CNS-AM-INSPIRE-3%EA%B8%B0-%EC%B2%AB-%EB%B2%88%EC%A7%B8-%EB%A9%98%ED%86%A0%EB%A7%81</guid>
            <pubDate>Tue, 11 Nov 2025 01:49:50 GMT</pubDate>
            <description><![CDATA[<h2 id="첫-번째-멘토링">첫 번째 멘토링</h2>
<p>아이디어에 대해 생각하기 이전에 프로젝트 안에 들어가야는 핵심 요소부터 알아봤다.<img src="https://velog.velcdn.com/images/hong_eh/post/37b5de2b-5b2e-4626-8c5f-0ed0c70cbc50/image.png" alt=""></p>
<p>첫번째 멘토링에서는 최근 인공지능 분야에서 핵심적으로 다뤄지는 개념인 RAG(Retrieval-Augmented Generation), Tool Calling, 그리고 Vector DB(Vector Database) 에 대해 배웠다.
이 세 가지 요소는 오늘날 생성형 AI 시스템의 기본 구조를 이루는 중요한 기술로,
AI가 단순히 “대답하는 존재”를 넘어 스스로 필요한 정보를 찾고, 활용하며, 더 정확한 결과를 만들어내는 과정을 가능하게 한다.</p>
<h2 id="rag">RAG</h2>
<blockquote>
<p>검색 증강 생성(RAG)이란?
<a href="https://aws.amazon.com/ko/what-is/retrieval-augmented-generation/">https://aws.amazon.com/ko/what-is/retrieval-augmented-generation/</a></p>
</blockquote>
<p>RAG는 단순한 검색(Search) 기술이 아니라, AI가 스스로 ‘정보를 찾아 활용하는 능력’을 부여하는 구조이다. 일반적인 생성형 AI 모델은 학습 시점 이후의 데이터에 접근할 수 없기 때문에, 새로운 정보나 기업 내부 문서를 다루는 데 한계가 있다.
하지만 RAG는 질문을 받아 의미적으로 관련된 문서를 Vector DB에서 검색한 후,
그 결과를 LLM에게 전달해 답변을 생성함으로써 이 문제를 해결한다.
즉, 모델이 “모르는 것을 아는 척하지 않고”, 실제 근거가 있는 정보를 바탕으로 대답할 수 있게 만드는 것이다.</p>
<h2 id="tool-calling">Tool Calling</h2>
<p><img src="https://velog.velcdn.com/images/hong_eh/post/9497ed94-b7bd-4e28-8e5d-9726a83fcdb2/image.png" alt=""></p>
<p>Tool Calling은 AI가 스스로 “검색이 필요하다”라고 판단하면
자동으로 RAG 시스템이나 외부 API를 호출해 결과를 받아오는 기능이다.</p>
<h2 id="vector-db">VECTOR DB</h2>
<h4 id="vector-db-예시">vector DB 예시</h4>
<pre><code class="language-json">{
  &quot;id&quot;: &quot;chunk_0001&quot;,
  &quot;document_id&quot;: &quot;doc_123&quot;,
  &quot;text&quot;: &quot;RAG는 외부 지식을 검색해 LLM의 답변 정확도를 높이는 아키텍처이다.&quot;,
  &quot;embedding&quot;: [
    0.0321, -0.1147, 0.2890, 0.0573, -0.0418, 0.1025, -0.2206, 0.0159
  ],
  &quot;dimension&quot;: 8,
  &quot;metadata&quot;: {
    &quot;source&quot;: &quot;notion&quot;,
    &quot;title&quot;: &quot;RAG 개요&quot;,
    &quot;language&quot;: &quot;ko&quot;,
    &quot;tags&quot;: [&quot;RAG&quot;, &quot;VectorDB&quot;, &quot;LLM&quot;],
    &quot;created_at&quot;: &quot;2025-11-11T09:20:00+09:00&quot;,
    &quot;uri&quot;: &quot;https://example.org/rag-overview&quot;
  }
}</code></pre>
<p>1️⃣ id 와 document_id
    •    id: 벡터 데이터베이스 내에서 이 조각(chunk)을 구분하는 고유 식별자입니다.
→ 하나의 문서를 여러 조각으로 나눠 저장하기 때문에, 각 조각마다 고유한 ID가 필요합니다.
    •    document_id: 이 벡터가 속한 원본 문서의 ID입니다.
→ 예를 들어, 한 문서를 10개 조각으로 나눴다면 document_id는 같고 id는 각각 다릅니다.</p>
<p>2️⃣ text
    •    실제 원문 텍스트입니다.
    •    이 내용이 벡터로 변환(embedding) 되어, 의미 기반 검색을 가능하게 합니다.</p>
<p>3️⃣ embedding
    •    embedding 은 문장을 수학적으로 표현한 숫자 벡터입니다.
    •    실제로는 보통 384, 768, 1536차원 등 훨씬 길어요.
    •    각 숫자는 문장의 의미적 특징을 압축 표현한 값이에요.
    •    dimension 은 벡터의 차원 수를 명시합니다.</p>
<p>➡️ 예를 들어,
“RAG는 AI 검색 구조다” 와 “LLM이 정보를 검색한다”
이 두 문장은 의미가 비슷하므로, embedding 공간에서 서로 가까운 위치에 저장됩니다.</p>
<p>4️⃣ metadata
    •    metadata 는 검색된 결과를 더 풍부하게 활용하기 위한 부가 정보입니다.
    •    source: 데이터의 출처 (예: notion, pdf, github 등)
    •    title: 문서 제목
    •    language: 언어 코드
    •    tags: 주제 분류
    •    created_at: 데이터가 생성된 시점
    •    uri: 원문에 접근할 수 있는 링크</p>
<p>➡️ RAG 시스템은 검색된 벡터의 metadata를 이용해
“이 문장은 어디서 왔는지, 어떤 문서의 일부인지”를 함께 보여줄 수 있습니다.</p>
<h2 id="bedrock">BEDROCK</h2>
<blockquote>
<p>AWS Bedrock 서비스란?
<a href="https://docs.aws.amazon.com/ko_kr/bedrock/latest/userguide/what-is-bedrock.html">https://docs.aws.amazon.com/ko_kr/bedrock/latest/userguide/what-is-bedrock.html</a>
<a href="https://mozzi-devlog.tistory.com/73">https://mozzi-devlog.tistory.com/73</a></p>
</blockquote>
<h2 id="아이디어-회의">아이디어 회의</h2>
<ol>
<li>*<em>청각장애인을 대상으로 시각 기반 영어 발음 교정 서비스 *</em><ul>
<li>기존에는 입모양을 기준으로 판별 → 대충 느낌으로 </li>
<li>소리를 듣지 않아도 발음의 형태, 강세 등을 이해할 수 있도록 시각적 자료(그래프) 및 피드백 제공</li>
<li>음성 분석, TTS, 발음 규칙 엔진, LLM 피드백 생성</li>
<li>생성형 AI 기술 활용해 개인화된 발음 교정 학습 지원</li>
<li>입술 모양 시각화 / blender / 모션캡쳐가 더 낫더라? / 안되면 빼버리는게 좋을듯</li>
</ul>
</li>
</ol>
<ol start="2">
<li>*<em>IT 개발자를 위한 로드맵 생성기 *</em><ul>
<li>내가 직접 만든 로드 맵</li>
<li>블로그, 깃허브 소스 크롤링</li>
<li>학습 관련데이터 시각화</li>
<li>IT 트랜드 시각화</li>
</ul>
</li>
</ol>
<h2 id="멘토님-피드백">멘토님 피드백</h2>
<pre><code>1. 1번 아이디어(청각장애인을 위한 시각 기반 영어 발음 교정 서비스)
•    흥미롭고 사회적 가치가 높은 주제지만, 기술적 난이도가 높음
•    발음 분석 기법(음소 단위, 강세, 입모양, 리듬 등) 을 다양하게 연구해야 함
•    프로젝트 내에서 1~2명이 발음 분석 기법과 시각화 파트를 집중적으로 담당해야 효율적일 것으로 조언
•    단기간에 완성하기는 어려우므로 PoC(Proof of Concept, 개념 검증) 단계로 범위를 축소해 진행하는 것이 현실적
•    Blender나 모션캡처 등 입술 모양 시각화 기술은 선택적 요소로, 기술 구현이 어렵다면 과감히 제외해도 무방

2.    IT 개발자를 위한 로드맵 생성기
•    이미 비슷한 서비스들이 존재하지만, 기존 서비스의 단점을 보완하거나 시각화를 다양한 방면으로 발전시키는 방향으로 개선할 수 있음.
•    단순히 로드맵을 자동 생성하는 것보다는 다른 방향을 제시해보는 것이 좋을 것 같다.
•    예를 들어, GitHub와 블로그 데이터를 분석해 실제 개발자의 학습 경로를 반영하거나, 최신 기술 스택의 트렌드 시각화 대시보드를 제공하는 방향이 유용할 것이라고 조언하심.</code></pre>]]></description>
        </item>
    </channel>
</rss>