<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>くりまんじゅう</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Thu, 15 Oct 2026 08:18:37 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>くりまんじゅう</title>
            <url>https://velog.velcdn.com/images/u_heag/profile/e5ac9243-5992-4aa3-9b82-88d1783ae8ff/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. くりまんじゅう. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/u_heag" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[RAG 이해하기 ⑤ RAG Evaluation, 답변의 정확도는 어떻게 평가할까?]]></title>
            <link>https://velog.io/@u_heag/RAG-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-RAG-Evaluation-%EB%8B%B5%EB%B3%80%EC%9D%98-%EC%A0%95%ED%99%95%EB%8F%84%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%ED%8F%89%EA%B0%80%ED%95%A0%EA%B9%8C</link>
            <guid>https://velog.io/@u_heag/RAG-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-RAG-Evaluation-%EB%8B%B5%EB%B3%80%EC%9D%98-%EC%A0%95%ED%99%95%EB%8F%84%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%ED%8F%89%EA%B0%80%ED%95%A0%EA%B9%8C</guid>
            <pubDate>Thu, 15 Oct 2026 08:18:37 GMT</pubDate>
            <description><![CDATA[<p>지난 글에서는 <strong>Hybrid Search와 Reranking</strong>을 통해 RAG의 검색 품질을 높이는 방법을 알아봤다.</p>
<p>그런데 검색 성능을 개선했다고 해서 항상 좋은 답변이 만들어지는 것은 아니다.</p>
<p>관련 문서를 잘 찾았더라도 LLM이 내용을 잘못 해석하거나, 검색된 자료에 없는 내용을 답변에 포함할 수도 있기 때문이다.</p>
<p>그렇다면 <strong>RAG가 제대로 동작하고 있는지는 어떻게 확인할 수 있을까?</strong></p>
<p>이번 글에서는 RAG의 성능을 평가하는 방법인 <strong>RAG Evaluation</strong>에 대해 알아보려고 한다.</p>
<hr>
<h2 id="1-rag-evaluation이란">1. RAG Evaluation이란?</h2>
<p><strong>RAG Evaluation(평가)</strong>은 RAG 시스템이 사용자의 질문에 대해 얼마나 적절한 정보를 검색하고, 그 정보를 바탕으로 얼마나 좋은 답변을 생성하는지 평가하는 과정이다.</p>
<p>RAG는 크게 두 단계로 나눌 수 있다.</p>
<ul>
<li><strong>Retrieval(검색)</strong> : 질문과 관련된 문서를 잘 찾았는가?</li>
<li><strong>Generation(생성)</strong> : 검색한 문서를 바탕으로 적절한 답변을 만들었는가?</li>
</ul>
<p>따라서 RAG를 평가할 때도 검색 품질과 답변 품질을 구분해서 살펴보는 것이 중요하다.</p>
<pre><code class="language-text">사용자 질문
    ↓
Retrieval ── 검색 품질 평가
    ↓
Context
    ↓
LLM
    ↓
최종 답변 ── 답변 품질 평가</code></pre>
<hr>
<h2 id="2-faithfulness란">2. Faithfulness란?</h2>
<p><strong>Faithfulness(충실도)</strong>는 LLM이 생성한 답변이 <strong>검색된 Context에 얼마나 충실한지</strong> 평가하는 지표다.</p>
<p>쉽게 말하면,</p>
<blockquote>
<p>&quot;LLM이 참고 자료에 없는 내용을 마음대로 만들어내지는 않았을까?&quot;</p>
</blockquote>
<p>를 확인하는 것이다.</p>
<p>예를 들어 검색된 문서에 다음과 같은 내용이 있다고 해보자.</p>
<p><strong>검색된 Context</strong></p>
<blockquote>
<p>미사용 연차는 최대 5일까지 다음 연도로 이월할 수 있다.</p>
</blockquote>
<p>그런데 LLM이 다음과 같이 답변했다면?</p>
<p><strong>LLM 답변</strong></p>
<blockquote>
<p>미사용 연차는 최대 5일까지 다음 연도로 이월할 수 있으며, 별도의 승인 절차는 필요하지 않습니다.</p>
</blockquote>
<p>여기서 <strong>&#39;별도의 승인 절차는 필요하지 않습니다&#39;</strong>라는 내용은 검색된 문서에 존재하지 않는다.</p>
<p>즉, LLM이 근거 없는 내용을 추가한 것이다.</p>
<p>이러한 경우 Faithfulness가 낮아질 수 있다.</p>
<p>반대로 검색된 자료에서 확인할 수 있는 내용만으로 답변했다면 Faithfulness가 높게 평가될 수 있다.</p>
<p>다만 Faithfulness는 <strong>답변이 참고 자료에 근거하고 있는지</strong>를 평가하는 것이지, 참고 자료 자체가 사실인지까지 보장하는 것은 아니다.</p>
<hr>
<h2 id="3-context-precision이란">3. Context Precision이란?</h2>
<p><strong>Context Precision(검색 문맥 정밀도)</strong>은 검색된 문서 중 <strong>질문과 관련 있는 문서가 얼마나 상위에 잘 배치되어 있는지</strong> 평가하는 지표다.</p>
<p>예를 들어 사용자가 다음과 같이 질문했다고 해보자.</p>
<blockquote>
<p>&quot;남은 연차를 내년으로 넘길 수 있어?&quot;</p>
</blockquote>
<p>검색 결과가 다음과 같다면?</p>
<table>
<thead>
<tr>
<th>순위</th>
<th>검색된 문서</th>
<th>관련 여부</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>미사용 연차 이월 규정</td>
<td>관련 있음</td>
</tr>
<tr>
<td>2</td>
<td>연차 사용 절차</td>
<td>관련 있음</td>
</tr>
<tr>
<td>3</td>
<td>출장비 정산 규정</td>
<td>관련 없음</td>
</tr>
</tbody></table>
<p>질문과 관련 있는 문서들이 상위에 배치되어 있다.</p>
<p>반대로 관련 없는 문서가 상위에 많이 등장한다면 Context Precision이 낮아질 수 있다.</p>
<p>즉,</p>
<blockquote>
<p>&quot;검색된 결과에서 관련 있는 정보가 얼마나 앞쪽에 잘 배치되어 있을까?&quot;</p>
</blockquote>
<p>를 평가하는 지표다.</p>
<p>Context Precision은 단순히 관련 문서의 개수뿐 아니라 <strong>검색 결과의 순서</strong>도 중요하게 본다.</p>
<hr>
<h2 id="4-context-recall이란">4. Context Recall이란?</h2>
<p><strong>Context Recall(검색 문맥 재현율)</strong>은 답변에 필요한 정보를 검색 단계에서 얼마나 빠짐없이 가져왔는지 평가하는 지표다.</p>
<p>예를 들어 회사의 연차 이월 규정이 다음과 같다고 해보자.</p>
<p><strong>실제 규정</strong></p>
<blockquote>
<p>미사용 연차는 최대 5일까지 다음 연도로 이월할 수 있으며, 이월 신청은 연말까지 완료해야 한다.</p>
</blockquote>
<p>그런데 검색된 Context에는 다음 내용만 포함되어 있다.</p>
<blockquote>
<p>미사용 연차는 최대 5일까지 다음 연도로 이월할 수 있다.</p>
</blockquote>
<p>연차를 이월할 수 있다는 내용은 찾았지만, <strong>연말까지 신청해야 한다는 조건</strong>은 검색하지 못했다.</p>
<p>이처럼 답변에 필요한 정보가 일부 누락되면 Context Recall이 낮아질 수 있다.</p>
<p>쉽게 말하면,</p>
<blockquote>
<p>&quot;답변에 필요한 정보를 빠뜨리지 않고 잘 찾아왔을까?&quot;</p>
</blockquote>
<p>를 확인하는 것이다.</p>
<p>Context Precision과 Context Recall은 비슷해 보이지만 차이가 있다.</p>
<ul>
<li><strong>Precision</strong> : 검색한 결과가 얼마나 적절한가?</li>
<li><strong>Recall</strong> : 필요한 정보를 얼마나 빠짐없이 찾았는가?</li>
</ul>
<hr>
<h2 id="5-answer-relevancy란">5. Answer Relevancy란?</h2>
<p><strong>Answer Relevancy(답변 관련성)</strong>는 LLM이 생성한 답변이 <strong>사용자의 질문에 얼마나 적절하게 대응하는지</strong> 평가하는 지표다.</p>
<p>예를 들어 사용자가 다음과 같이 질문했다고 해보자.</p>
<blockquote>
<p>&quot;남은 연차를 내년으로 넘길 수 있어?&quot;</p>
</blockquote>
<p>그런데 LLM이 다음과 같이 답변했다면?</p>
<blockquote>
<p>연차는 근로자가 휴식을 취하기 위해 사용하는 유급휴가입니다. 연차는 근속기간과 근무 조건에 따라 발생할 수 있습니다.</p>
</blockquote>
<p>틀린 설명은 아닐 수 있지만, 사용자가 궁금해하는 <strong>연차 이월 가능 여부</strong>에 대한 답변은 아니다.</p>
<p>따라서 Answer Relevancy가 낮게 평가될 수 있다.</p>
<p>반대로,</p>
<blockquote>
<p>네. 미사용 연차는 최대 5일까지 다음 연도로 이월할 수 있습니다.</p>
</blockquote>
<p>처럼 질문에 직접적으로 답한다면 Answer Relevancy가 높게 평가될 수 있다.</p>
<hr>
<h2 id="6-rag-평가-지표-한눈에-보기">6. RAG 평가 지표 한눈에 보기</h2>
<p>지금까지 살펴본 네 가지 지표를 정리하면 다음과 같다.</p>
<table>
<thead>
<tr>
<th>평가 지표</th>
<th>핵심 질문</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Faithfulness</strong></td>
<td>답변이 검색된 자료에 근거하고 있는가?</td>
</tr>
<tr>
<td><strong>Context Precision</strong></td>
<td>관련 문서가 검색 결과 상위에 잘 배치되어 있는가?</td>
</tr>
<tr>
<td><strong>Context Recall</strong></td>
<td>필요한 정보를 빠짐없이 검색했는가?</td>
</tr>
<tr>
<td><strong>Answer Relevancy</strong></td>
<td>답변이 사용자 질문에 적절한가?</td>
</tr>
</tbody></table>
<p>이러한 지표들은 RAG 평가 프레임워크인 <strong>RAGAS</strong> 등에서 활용된다.</p>
<p>RAGAS는 검색 결과와 생성된 답변을 다양한 기준으로 평가할 수 있도록 지원하는 프레임워크다.</p>
<p>평가 지표에 따라 정답 데이터나 LLM 기반 평가가 필요할 수 있으며, 실제 평가 방식은 사용하는 프레임워크와 설정에 따라 달라진다.</p>
<hr>
<h2 id="7-평가-결과는-어떻게-활용할까">7. 평가 결과는 어떻게 활용할까?</h2>
<p>RAG Evaluation은 단순히 점수를 확인하는 데서 끝나지 않는다.</p>
<p><strong>어느 단계에서 문제가 발생했는지 파악하고 개선하는 것</strong>이 더 중요하다.</p>
<p>예를 들어,</p>
<table>
<thead>
<tr>
<th>평가 결과</th>
<th>확인할 부분</th>
</tr>
</thead>
<tbody><tr>
<td>Faithfulness 낮음</td>
<td>프롬프트, LLM의 근거 활용 방식</td>
</tr>
<tr>
<td>Context Precision 낮음</td>
<td>검색 방식, Reranking</td>
</tr>
<tr>
<td>Context Recall 낮음</td>
<td>Chunking, 검색 범위, Top-K</td>
</tr>
<tr>
<td>Answer Relevancy 낮음</td>
<td>프롬프트, 답변 생성 방식</td>
</tr>
</tbody></table>
<p>물론 하나의 지표가 낮다고 해서 반드시 특정 단계에만 문제가 있는 것은 아니다.</p>
<p>하지만 평가 결과를 분석하면 <strong>검색 과정과 답변 생성 과정 중 어디를 우선적으로 개선해야 할지</strong> 판단하는 데 도움이 된다.</p>
<hr>
<h2 id="정리">정리</h2>
<p><img src="https://velog.velcdn.com/images/u_heag/post/46ce5e83-e606-4e3b-81ec-6d1010220392/image.png" alt=""></p>
<p>RAG는 관련 문서를 검색하고 LLM이 답변을 생성하는 구조지만, 단순히 답변이 만들어졌다는 이유만으로 잘 동작한다고 판단할 수는 없다.</p>
<p>관련 정보를 정확하게 찾았는지, 필요한 정보가 누락되지는 않았는지, 답변이 검색된 자료에 근거하고 있는지 등을 함께 확인해야 한다.</p>
<p>이번 글에서 살펴본 핵심 용어를 정리하면 다음과 같다.</p>
<ul>
<li><p>Faithfulness (충실도)
LLM이 생성한 답변이 검색된 자료에 근거하고 있는지 평가하는 지표</p>
</li>
<li><p>Context Precision (검색 문맥 정밀도)
질문과 관련된 문서가 검색 결과 상위에 잘 배치되어 있는지 평가하는 지표</p>
</li>
<li><p>Context Recall (검색 문맥 재현율)
답변에 필요한 정보를 검색 과정에서 얼마나 빠짐없이 가져왔는지 평가하는 지표</p>
</li>
<li><p>Answer Relevancy (답변 관련성)
생성된 답변이 사용자의 질문에 얼마나 적절하게 대응하는지 평가하는 지표</p>
</li>
<li><p>RAGAS
RAG의 검색 품질과 답변 품질을 다양한 지표로 평가할 수 있도록 지원하는 프레임워크</p>
</li>
</ul>
<p>결국 RAG Evaluation의 핵심은 검색 품질과 답변 품질을 각각 평가하고, 문제가 발생한 부분을 찾아 개선하는 것이다.</p>
<p>다음 글에서는 RAG를 실제 서비스에 적용할 때 발생할 수 있는 문제점과 한계, 그리고 개선 방법에 대해 알아보려고 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[RAG 이해하기 ④ Hybrid Search와 Reranking이란?]]></title>
            <link>https://velog.io/@u_heag/RAG-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-Hybrid-Search%EC%99%80-Reranking%EC%9D%B4%EB%9E%80</link>
            <guid>https://velog.io/@u_heag/RAG-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-Hybrid-Search%EC%99%80-Reranking%EC%9D%B4%EB%9E%80</guid>
            <pubDate>Tue, 13 Oct 2026 02:39:40 GMT</pubDate>
            <description><![CDATA[<p>지난 글에서는 사용자의 질문이 들어왔을 때 <strong>Similarity Search를 통해 관련 문서를 검색하고, LLM이 답변을 생성하는 과정</strong>을 살펴봤다.</p>
<p>그런데 여기서 한 가지 궁금한 점이 생긴다.</p>
<blockquote>
<p><strong>의미가 비슷한 문서를 검색한다고 해서 항상 정확한 정보를 찾을 수 있을까?</strong></p>
</blockquote>
<p>정답은 <strong>아니다.</strong></p>
<p>실제로 RAG에서는 질문과 관련 없는 문서가 검색되거나, 정작 필요한 문서가 검색 결과에서 누락될 수도 있다.</p>
<p>이러한 문제를 개선하기 위해 사용하는 대표적인 방법이 <strong>Hybrid Search와 Reranking</strong>이다.</p>
<hr>
<h2 id="1-vector-search의-한계">1. Vector Search의 한계</h2>
<p>앞서 살펴본 Vector Search는 텍스트를 Embedding하여 <strong>의미적으로 비슷한 문서를 찾는 검색 방식</strong>이다.</p>
<p>예를 들어 사용자가 다음과 같이 질문했다고 해보자.</p>
<blockquote>
<p>&quot;남은 연차를 내년으로 넘길 수 있어?&quot;</p>
</blockquote>
<p>Vector Search는 다음과 같은 관련 문서를 찾아낼 수 있다.</p>
<pre><code class="language-text">사용자 질문
&quot;남은 연차를 내년으로 넘길 수 있어?&quot;

        ↓

     Vector Search

        ↓

&quot;미사용 연차 이월 규정&quot;</code></pre>
<p>질문과 문서에 사용된 단어가 완전히 같지 않더라도 의미가 비슷하기 때문에 검색할 수 있다.</p>
<p>하지만 Vector Search에도 한계가 있다.</p>
<p>예를 들어 다음과 같은 질문이라면 어떨까?</p>
<blockquote>
<p>&quot;HR-2026-015 규정에 대해 알려줘.&quot;</p>
</blockquote>
<p><code>HR-2026-015</code>는 특정 문서를 구분하는 고유한 코드다.</p>
<p>이처럼 <strong>문서 번호, 상품 코드, 정확한 명칭</strong> 등이 중요한 경우에는 의미 중심의 Vector Search만으로 원하는 결과를 찾지 못할 수 있다.</p>
<p>이때 활용할 수 있는 것이 <strong>Keyword Search</strong>다.</p>
<hr>
<h2 id="2-keyword-search란">2. Keyword Search란?</h2>
<p><strong>Keyword Search(키워드 검색)</strong>는 사용자의 질문에 포함된 단어나 문자열을 기반으로 관련 문서를 찾는 방식이다.</p>
<p>예를 들어,</p>
<pre><code class="language-text">사용자 질문
&quot;HR-2026-015 규정에 대해 알려줘.&quot;

        ↓

     Keyword Search

        ↓

&quot;HR-2026-015 휴가 및 연차 관리 규정&quot;</code></pre>
<p>특정 코드나 명칭이 포함된 문서를 검색할 때 유용하다.</p>
<p>대표적인 키워드 기반 검색 알고리즘으로는 <strong>BM25</strong>가 있다.</p>
<p>BM25는 단어가 문서에 등장하는 빈도와 해당 단어의 희소성, 문서 길이 등을 고려하여 검색 결과의 관련성을 계산한다.</p>
<p>그렇다면 Keyword Search만 사용하면 될까?</p>
<p>그것도 아니다.</p>
<p>Keyword Search는 검색어와 문서의 표현이 다르면 관련 문서를 놓칠 수 있다.</p>
<p>예를 들어 <strong>&quot;남은 휴가를 다음 해에 쓸 수 있나요?&quot;</strong>라는 질문과 <strong>&quot;미사용 연차 이월 규정&quot;</strong>이라는 문서는 의미가 비슷하지만 사용하는 단어가 다르다.</p>
<p>이런 경우에는 Vector Search가 더 유리할 수 있다.</p>
<hr>
<h2 id="3-hybrid-search란">3. Hybrid Search란?</h2>
<p><strong>Hybrid Search(하이브리드 검색)</strong>는 서로 다른 검색 방식을 결합하여 검색 결과를 개선하는 방법이다.</p>
<p>RAG에서는 주로 <strong>Keyword Search와 Vector Search를 결합</strong>한다.</p>
<pre><code class="language-text">              사용자 질문
                  |
          ┌───────┴───────┐
          ↓               ↓
    Keyword Search    Vector Search
          |               |
          ↓               ↓
    키워드 기반 검색    의미 기반 검색
          |               |
          └───────┬───────┘
                  ↓
             검색 결과 통합
                  ↓
              관련 문서</code></pre>
<p>각 검색 방식의 장점을 함께 활용하는 것이다.</p>
<table>
<thead>
<tr>
<th>구분</th>
<th>Keyword Search</th>
<th>Vector Search</th>
</tr>
</thead>
<tbody><tr>
<td>검색 기준</td>
<td>단어 및 키워드</td>
<td>문장의 의미</td>
</tr>
<tr>
<td>강점</td>
<td>정확한 명칭, 코드 검색</td>
<td>유사한 의미 검색</td>
</tr>
<tr>
<td>약점</td>
<td>표현이 다르면 검색이 어려울 수 있음</td>
<td>정확한 식별자 검색에 약할 수 있음</td>
</tr>
<tr>
<td>대표 기술</td>
<td>BM25</td>
<td>Embedding 기반 유사도 검색</td>
</tr>
</tbody></table>
<p>Hybrid Search에서는 두 검색 결과를 합치는 방법도 중요하다.</p>
<p>대표적인 방법으로 <strong>RRF(Reciprocal Rank Fusion)</strong>가 있다.</p>
<p>RRF는 서로 다른 검색 결과의 순위를 활용하여 하나의 통합 순위를 만드는 방식이다.</p>
<p>즉, Keyword Search와 Vector Search가 각각 찾아온 문서를 종합하여 더 적절한 검색 결과를 얻도록 돕는다.</p>
<hr>
<h2 id="4-reranking이란">4. Reranking이란?</h2>
<p>Hybrid Search로 관련 문서를 검색했다고 해서 모든 과정이 끝나는 것은 아니다.</p>
<p>검색된 문서 중에는 질문과 관련성이 높은 문서도 있고, 상대적으로 낮은 문서도 있다.</p>
<p>이때 사용하는 것이 <strong>Reranking(재순위화)</strong>이다.</p>
<p>Reranking은 <strong>1차 검색으로 가져온 문서들의 관련성을 다시 평가하고 순서를 조정하는 과정</strong>이다.</p>
<p>예를 들어 사용자가 다음과 같이 질문했다고 해보자.</p>
<blockquote>
<p>&quot;미사용 연차는 다음 연도로 얼마나 이월할 수 있어?&quot;</p>
</blockquote>
<p>1차 검색 결과가 다음과 같다고 가정해보자.</p>
<table>
<thead>
<tr>
<th>순위</th>
<th>검색 문서</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>연차 사용 신청 절차</td>
</tr>
<tr>
<td>2</td>
<td>휴가 및 연차 지급 기준</td>
</tr>
<tr>
<td>3</td>
<td>미사용 연차 이월 규정</td>
</tr>
</tbody></table>
<p>질문에 가장 적합한 문서는 3번째 문서지만, 검색 결과에서는 3위에 위치하고 있다.</p>
<p>Reranking을 적용하면 문서와 질문의 관련성을 다시 평가하여 순서를 조정할 수 있다.</p>
<pre><code class="language-text">[1차 검색 결과]

1. 연차 사용 신청 절차
2. 휴가 및 연차 지급 기준
3. 미사용 연차 이월 규정

          ↓

       Reranking

          ↓

[재정렬된 결과]

1. 미사용 연차 이월 규정
2. 휴가 및 연차 지급 기준
3. 연차 사용 신청 절차</code></pre>
<p>물론 Reranking을 적용한다고 항상 올바른 순서로 정렬되는 것은 아니다.</p>
<p>하지만 <strong>검색된 문서 중 질문에 더 적합한 문서를 상위에 배치하도록 개선할 수 있다.</strong></p>
<hr>
<h2 id="5-hybrid-search와-reranking의-차이">5. Hybrid Search와 Reranking의 차이</h2>
<p>두 기술은 모두 검색 품질을 개선하기 위해 사용하지만 역할이 다르다.</p>
<p><strong>Hybrid Search</strong>는 여러 검색 방식을 결합하여 관련 문서를 더 잘 찾아내는 데 집중한다.</p>
<p>반면 <strong>Reranking</strong>은 이미 검색된 문서의 관련성을 다시 평가하여 순서를 개선한다.</p>
<p>전체 흐름을 보면 다음과 같다.</p>
<pre><code class="language-text">사용자 질문
    ↓
Hybrid Search
    ├─ Keyword Search
    └─ Vector Search
    ↓
검색 결과 통합
    ↓
Reranking
    ↓
관련성이 높은 문서 선택
    ↓
Context 구성
    ↓
LLM
    ↓
최종 답변</code></pre>
<p>여기서 중요한 점은 <strong>Hybrid Search와 Reranking이 반드시 함께 사용되어야 하는 것은 아니라는 것</strong>이다.</p>
<p>서비스의 요구사항이나 데이터 특성에 따라 하나만 사용하거나 둘 다 사용하지 않을 수도 있다.</p>
<p>또한 Reranking은 검색 결과를 재정렬하는 기술이므로, 1차 검색에서 필요한 문서를 아예 찾지 못했다면 그 문서를 새롭게 찾아내지는 못한다.</p>
<hr>
<h2 id="정리">정리</h2>
<p>이번 글에서 살펴본 개념을 정리하면 다음과 같다.
<img src="https://velog.velcdn.com/images/u_heag/post/807cdee6-5ce6-4387-9149-eaec7f39211f/image.png" alt=""></p>
<blockquote>
<p><strong>Keyword Search</strong><br>단어나 키워드를 기반으로 관련 문서를 검색하는 방식</p>
</blockquote>
<blockquote>
<p><strong>Vector Search</strong><br>Embedding을 활용하여 의미적으로 비슷한 문서를 검색하는 방식</p>
</blockquote>
<blockquote>
<p><strong>Hybrid Search</strong><br>여러 검색 방식을 결합하여 검색 결과를 개선하는 방법</p>
</blockquote>
<blockquote>
<p><strong>Reranking</strong><br>검색된 문서의 관련성을 다시 평가하여 순서를 재정렬하는 과정</p>
</blockquote>
<p>결국 두 기술의 핵심적인 차이는 다음과 같다.</p>
<p><strong>Hybrid Search는 더 잘 찾기 위한 방법이고, Reranking은 찾은 결과를 더 잘 정렬하기 위한 방법이다.</strong></p>
<p>RAG에서는 단순히 많은 문서를 검색하는 것보다 <strong>사용자의 질문에 적합한 정보를 정확하게 찾아서 LLM에게 전달하는 것</strong>이 중요하다.</p>
<p>다음 글에서는 RAG가 실제로 얼마나 정확하게 동작하는지 확인하기 위한 <strong>RAG 평가(Evaluation)</strong>에 대해 알아보려고 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[RAG 이해하기 ③ Retrieval, 질문과 관련된 정보는 어떻게 찾을까?]]></title>
            <link>https://velog.io/@u_heag/RAG-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-Retrieval-%EC%A7%88%EB%AC%B8%EA%B3%BC-%EA%B4%80%EB%A0%A8%EB%90%9C-%EC%A0%95%EB%B3%B4%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%B0%BE%EC%9D%84%EA%B9%8C</link>
            <guid>https://velog.io/@u_heag/RAG-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-Retrieval-%EC%A7%88%EB%AC%B8%EA%B3%BC-%EA%B4%80%EB%A0%A8%EB%90%9C-%EC%A0%95%EB%B3%B4%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%B0%BE%EC%9D%84%EA%B9%8C</guid>
            <pubDate>Mon, 12 Oct 2026 02:06:03 GMT</pubDate>
            <description><![CDATA[<p>지난 글에서는 RAG에서 문서를 검색하기 위해 사용하는 <strong>Chunking, Embedding, Vector DB</strong>에 대해 알아봤다.</p>
<p>문서를 작은 단위로 나누고, 각 Chunk를 벡터로 변환하여 Vector DB에 저장하는 과정까지 살펴봤다.</p>
<p>그렇다면 이제 사용자가 실제로 질문을 입력하면 어떻게 될까?</p>
<p>이번 글에서는 <strong>사용자의 질문이 들어온 순간부터 LLM이 최종 답변을 생성하기까지의 과정</strong>을 정리해보려고 한다.</p>
<hr>
<h2 id="전체-흐름-먼저-보기">전체 흐름 먼저 보기</h2>
<p>사용자가 질문하면 RAG에서는 대략 다음과 같은 과정을 거친다.</p>
<pre><code class="language-text">사용자 질문
    ↓
질문 Embedding
    ↓
Vector DB 검색
    ↓
관련 Chunk 검색 (Retrieval)
    ↓
검색 결과 + 사용자 질문
    ↓
LLM
    ↓
최종 답변</code></pre>
<p>지난 글에서 문서를 Vector DB에 저장해두었던 이유가 바로 여기서 나온다.</p>
<p>사용자의 질문과 <strong>의미적으로 비슷한 문서를 빠르게 찾기 위해서</strong>다.</p>
<hr>
<h2 id="1-사용자-질문도-embedding한다">1. 사용자 질문도 Embedding한다</h2>
<p>사용자가 다음과 같이 질문했다고 해보자.</p>
<blockquote>
<p>*&quot;남은 연차를 내년에 사용할 수 있어?&quot;*</p>
</blockquote>
<p>Vector DB에 저장되어 있는 문서들은 이미 Embedding을 통해 벡터로 변환되어 있다.</p>
<p>따라서 질문과 문서를 비교하려면 <strong>사용자의 질문 역시 같은 방식으로 벡터로 변환해야 한다.</strong></p>
<pre><code class="language-text">&quot;남은 연차를 내년에 사용할 수 있어?&quot;

↓

Embedding

↓

[-0.11, 0.62, 0.33, ...]</code></pre>
<p>이제 질문과 문서가 모두 벡터로 표현되었기 때문에 서로 얼마나 비슷한지 비교할 수 있다.</p>
<hr>
<h2 id="2-비슷한-문서를-찾는다">2. 비슷한 문서를 찾는다</h2>
<p>질문의 벡터가 만들어지면 Vector DB에서 <strong>질문과 가까운 벡터를 가진 Chunk</strong>를 찾는다.</p>
<p>예를 들어 Vector DB에 다음과 같은 내용들이 저장되어 있다고 해보자.</p>
<pre><code class="language-text">Chunk 1
&quot;미사용 연차는 최대 5일까지 다음 연도로 이월할 수 있다.&quot;

Chunk 2
&quot;연차 사용 신청은 최소 3일 전에 제출한다.&quot;

Chunk 3
&quot;출장비는 출장 종료 후 7일 이내에 정산한다.&quot;</code></pre>
<p>질문은 <strong>남은 연차의 이월</strong>에 관한 내용이다.</p>
<p>따라서 의미적으로 가장 비슷한 Chunk 1이 높은 유사도를 가지게 된다.</p>
<p>이처럼 질문과 의미적으로 비슷한 데이터를 찾는 것을 <strong>Similarity Search(유사도 검색)</strong>라고 한다.</p>
<hr>
<h2 id="3-retrieval">3. Retrieval</h2>
<p>이렇게 검색을 통해 질문과 관련된 정보를 가져오는 과정을 <strong>Retrieval</strong>이라고 한다.</p>
<p>RAG에서 <code>R</code>이 바로 이 <strong>Retrieval</strong>이다.</p>
<pre><code class="language-text">사용자 질문

&quot;남은 연차를 내년에 사용할 수 있어?&quot;

↓

Vector DB 검색

↓

관련 Chunk 발견

&quot;미사용 연차는 최대 5일까지
다음 연도로 이월할 수 있다.&quot;</code></pre>
<p>즉, LLM에게 질문을 보내기 전에 <strong>답변에 필요한 근거 자료를 먼저 찾아오는 과정</strong>이다.</p>
<hr>
<h2 id="4-top-k란">4. Top-K란?</h2>
<p>실제로 검색할 때는 관련 문서를 하나만 가져오는 것보다 <strong>유사도가 높은 여러 개의 Chunk를 가져오는 경우가 많다.</strong></p>
<p>이때 자주 등장하는 것이 <strong>Top-K</strong>다.</p>
<p>예를 들어 <code>Top-K = 3</code>으로 설정했다면,</p>
<blockquote>
<p>질문과 가장 유사한 Chunk <strong>상위 3개를 가져온다.</strong></p>
</blockquote>
<p>라는 의미다.</p>
<pre><code class="language-text">검색 결과 (Top-K = 3)

1. 미사용 연차 이월 규정       유사도 0.82
2. 연차 사용 절차             유사도 0.71
3. 연차 지급 기준             유사도 0.68</code></pre>
<p>여기서 <code>K</code>는 가져올 검색 결과의 개수를 의미한다.</p>
<p>무조건 많이 가져온다고 좋은 것은 아니다.</p>
<p>관련 없는 정보까지 너무 많이 전달하면 오히려 LLM의 답변 품질에 영향을 줄 수 있기 때문에 <strong>필요한 만큼의 관련 정보를 가져오는 것이 중요하다.</strong></p>
<hr>
<h2 id="5-검색한-정보를-llm에게-전달한다">5. 검색한 정보를 LLM에게 전달한다</h2>
<p>관련 Chunk를 찾았다고 끝나는 것은 아니다.</p>
<p>이제 검색한 내용을 <strong>사용자의 질문과 함께 LLM에게 전달해야 한다.</strong></p>
<p>예를 들어 실제로는 프롬프트가 다음과 비슷한 형태로 구성될 수 있다.</p>
<pre><code class="language-text">[참고 자료]

미사용 연차는 최대 5일까지
다음 연도로 이월할 수 있다.

[사용자 질문]

남은 연차를 내년에 사용할 수 있어?

[지시]

참고 자료를 바탕으로 사용자의 질문에 답변하세요.</code></pre>
<p>이처럼 LLM에게 전달되는 <strong>참고 정보</strong>를 보통 <strong>Context(컨텍스트)</strong>라고 한다.</p>
<p>LLM은 이제 자신이 학습한 지식에만 의존하는 것이 아니라 <strong>검색된 Context를 참고하여 답변을 생성</strong>할 수 있다.</p>
<hr>
<h2 id="6-llm이-최종-답변을-생성한다">6. LLM이 최종 답변을 생성한다</h2>
<p>마지막으로 LLM이 전달받은 질문과 Context를 바탕으로 답변을 생성한다.</p>
<pre><code class="language-text">검색된 Context

&quot;미사용 연차는 최대 5일까지
다음 연도로 이월할 수 있다.&quot;

+

사용자 질문

&quot;남은 연차를 내년에 사용할 수 있어?&quot;

↓

LLM

↓

&quot;미사용 연차는 최대 5일까지
다음 연도로 이월할 수 있습니다.&quot;</code></pre>
<p>이제 RAG의 전체 흐름이 연결된다.</p>
<p>LLM이 회사의 연차 규정을 원래 알고 있었던 것이 아니다.</p>
<p><strong>RAG가 관련 문서를 찾아서 LLM에게 전달했고, LLM은 그 정보를 바탕으로 답변을 생성한 것</strong>이다.</p>
<hr>
<h2 id="전체-과정-다시-보기">전체 과정 다시 보기</h2>
<p>지금까지의 과정을 한 번에 정리하면 다음과 같다.
<img src="https://velog.velcdn.com/images/u_heag/post/87eafc17-c10f-4ef6-a4cb-b55d4536078e/image.png" alt=""></p>
<pre><code class="language-text">① 사용자 질문

&quot;남은 연차를 내년에 사용할 수 있어?&quot;

        ↓

② 질문 Embedding

텍스트 → Vector

        ↓

③ Similarity Search

Vector DB에서
질문과 비슷한 Chunk 검색

        ↓

④ Retrieval

관련 Chunk 가져오기

        ↓

⑤ Context 구성

검색 결과 + 사용자 질문

        ↓

⑥ LLM

Context를 참고하여 답변 생성

        ↓

⑦ 최종 답변</code></pre>
<p>결국 RAG에서 사용자의 질문이 들어온 이후의 핵심은</p>
<h3 id="질문을-벡터로-바꾸고-→-비슷한-자료를-찾고-→-llm에게-전달하고-→-답변하게-한다">질문을 벡터로 바꾸고 → 비슷한 자료를 찾고 → LLM에게 전달하고 → 답변하게 한다.</h3>
<p>라고 정리할 수 있다.</p>
<hr>
<h2 id="정리">정리</h2>
<p>이번 글에서 등장한 용어들을 다시 정리하면 다음과 같다.</p>
<blockquote>
<p><strong>Similarity Search</strong><br>질문과 의미적으로 비슷한 데이터를 찾는 과정</p>
</blockquote>
<blockquote>
<p><strong>Retrieval</strong><br>검색을 통해 질문과 관련된 정보를 가져오는 과정</p>
</blockquote>
<blockquote>
<p><strong>Top-K</strong><br>검색 결과 중 유사도가 높은 상위 K개의 데이터를 가져오는 설정</p>
</blockquote>
<blockquote>
<p><strong>Context</strong><br>LLM이 답변을 생성할 때 참고하도록 함께 전달하는 정보</p>
</blockquote>
<p>앞선 글에서 살펴본 <strong>Chunking → Embedding → Vector DB</strong>가 데이터를 검색할 수 있도록 준비하는 과정이었다면,</p>
<p>이번 글에서 살펴본 <strong>Embedding → Retrieval → Context → LLM</strong>은 실제 사용자의 질문을 처리하는 과정이라고 볼 수 있다.</p>
<p>여기까지 이해하면 기본적인 RAG의 전체 흐름은 거의 완성된다.</p>
<p>하지만 실제 RAG에서는 단순히 Vector DB에서 비슷한 문서를 가져오는 것만으로 항상 좋은 결과가 나오지는 않는다.</p>
<p>검색 결과의 정확도를 높이기 위해 <strong>Hybrid Search, Reranking</strong> 같은 방법도 함께 사용된다.</p>
<p>다음 글에서는 이러한 <strong>RAG의 검색 품질을 높이는 방법</strong>에 대해 정리해보려고 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[RAG 이해하기 ② Chunking, Embedding, Vector DB란?]]></title>
            <link>https://velog.io/@u_heag/RAG-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-Chunking-Embedding-Vector-DB%EB%9E%80</link>
            <guid>https://velog.io/@u_heag/RAG-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-Chunking-Embedding-Vector-DB%EB%9E%80</guid>
            <pubDate>Wed, 07 Oct 2026 01:27:16 GMT</pubDate>
            <description><![CDATA[<p>지난 글에서는 <strong>RAG가 무엇인지, 왜 필요한지</strong> 전체적인 흐름을 살펴봤다.</p>
<p>RAG의 핵심은 사용자의 질문과 관련된 정보를 찾아서 LLM에게 전달하는 것이다.</p>
<p>그런데 여기서 궁금한 점이 생긴다.</p>
<blockquote>
<p><strong>수많은 문서 중에서 사용자의 질문과 관련된 내용을 어떻게 찾아낼까?</strong></p>
</blockquote>
<p>이를 이해하려면 RAG에서 자주 등장하는 <strong>Chunking, Embedding, Vector DB</strong>를 알아야 한다.</p>
<hr>
<h2 id="전체-흐름-먼저-보기">전체 흐름 먼저 보기</h2>
<p>문서를 RAG에서 활용하려면 보통 다음과 같은 과정을 거친다.
<img src="https://velog.velcdn.com/images/u_heag/post/932d40d9-f5bb-41a4-9bd0-3324ccf8c429/image.png" alt=""></p>
<pre><code class="language-text">문서
 ↓
Chunking
 ↓
Embedding
 ↓
Vector DB 저장</code></pre>
<p>예를 들어 회사의 여러 규정이 담긴 문서가 있다고 해보자.</p>
<p>문서 전체를 그대로 저장하고 검색하는 것이 아니라,</p>
<p><strong>문서를 작은 단위로 나누고 → 각 내용을 숫자로 변환하고 → 검색할 수 있도록 저장한다.</strong></p>
<p>하나씩 살펴보자 .. !</p>
<hr>
<h2 id="chunking이란">Chunking이란?</h2>
<p><strong>Chunking(청킹)</strong>은 긴 문서를 <strong>작은 단위(Chunk)로 나누는 과정</strong>이다.</p>
<p>예를 들어 하나의 사내 규정 문서에 다음과 같은 내용이 있다고 해보자.</p>
<pre><code class="language-text">사내 규정.pdf

- 근무시간 규정
- 휴가 및 연차 규정
- 복지제도
- 출장 규정
- 경비 처리 규정
...</code></pre>
<p>이 문서를 하나의 거대한 데이터로 사용하는 것이 아니라 일정한 크기의 조각으로 나눈다.</p>
<pre><code class="language-text">Chunk 1 → 근무시간 관련 내용

Chunk 2 → 휴가 및 연차 관련 내용

Chunk 3 → 복지제도 관련 내용

Chunk 4 → 출장 관련 내용</code></pre>
<p>왜 굳이 나눌까?</p>
<p>사용자가</p>
<blockquote>
<p>&quot;남은 연차를 내년으로 넘길 수 있어?&quot;</p>
</blockquote>
<p>라고 질문했는데 수십, 수백 페이지의 문서 전체를 가져올 필요는 없다.</p>
<p>질문과 관련 있는 <strong>연차 규정 부분만 찾아오면 된다.</strong></p>
<p>즉, Chunking은 문서를 <strong>검색하고 활용하기 좋은 크기로 나누는 과정</strong>이라고 볼 수 있다.</p>
<hr>
<h2 id="embedding이란">Embedding이란?</h2>
<p>문서를 나눴다면 이제 각각의 Chunk를 <strong>검색할 수 있는 형태</strong>로 만들어야 한다.</p>
<p>이때 등장하는 것이 <strong>Embedding(임베딩)</strong>이다.</p>
<p>Embedding은 텍스트의 의미를 컴퓨터가 비교할 수 있도록 <strong>숫자로 이루어진 벡터(Vector)로 변환하는 과정</strong>이다.</p>
<p>예를 들어 실제 값은 아니지만,</p>
<pre><code class="language-text">&quot;미사용 연차 이월 규정&quot;

↓

Embedding

↓

[0.21, -0.53, 0.87, 0.14, ...]</code></pre>
<p>와 같은 형태로 변환된다.</p>
<p>그런데 굳이 왜 이렇게 숫자로 바꾸는 걸까?</p>
<p>우리가 검색하고 싶은 것은 단순히 <strong>같은 단어가 들어간 문장</strong>이 아니라 <strong>의미가 비슷한 문장</strong>이기 때문이다.</p>
<p>예를 들어,</p>
<blockquote>
<p>&quot;남은 연차를 내년에 사용할 수 있나요?&quot;</p>
</blockquote>
<p>와</p>
<blockquote>
<p>&quot;미사용 연차 이월 규정&quot;</p>
</blockquote>
<p>은 사용된 단어가 완전히 같지는 않다.</p>
<p>하지만 사람이 읽으면 두 문장이 비슷한 내용을 의미한다는 것을 쉽게 알 수 있다.</p>
<p>Embedding을 사용하면 이러한 <strong>텍스트의 의미적 유사성</strong>을 벡터를 통해 비교할 수 있다.</p>
<hr>
<h2 id="vector-db란">Vector DB란?</h2>
<p>Embedding을 통해 만들어진 벡터는 어딘가에 저장해야 한다.</p>
<p>이때 사용하는 것이 <strong>Vector Database(Vector DB)</strong>다.</p>
<p>전체 과정을 다시 보면,</p>
<pre><code class="language-text">문서
 ↓
Chunking
 ↓
각 Chunk를 Embedding
 ↓
Vector DB에 저장</code></pre>
<p>Vector DB에는 문서의 Chunk와 해당 Chunk를 표현하는 벡터가 저장된다.</p>
<p>그리고 사용자의 질문이 들어오면 <strong>질문 역시 Embedding을 통해 벡터로 변환한다.</strong></p>
<pre><code class="language-text">&quot;남은 연차를 내년에 사용할 수 있어?&quot;

↓

Embedding

↓

질문의 Vector</code></pre>
<p>그다음 Vector DB에서 질문의 벡터와 <strong>가까운 벡터를 가진 문서 Chunk</strong>를 찾는다.</p>
<p>쉽게 말하면,</p>
<blockquote>
<p><strong>&quot;이 질문과 의미가 가장 비슷한 내용이 어디 있지?&quot;</strong></p>
</blockquote>
<p>를 찾는 것이다.</p>
<hr>
<h2 id="어떻게-관련-문서를-찾는-걸까">어떻게 관련 문서를 찾는 걸까?</h2>
<p>전체 과정을 연결해보면 조금 더 이해하기 쉽다.</p>
<pre><code class="language-text">[미리 준비]

사내 규정 문서
      ↓
   Chunking
      ↓
   Embedding
      ↓
   Vector DB


[사용자 질문]

&quot;남은 연차를 내년에 사용할 수 있어?&quot;
      ↓
   Embedding
      ↓
질문과 비슷한 Vector 검색
      ↓
&quot;미사용 연차 이월 규정&quot; 발견</code></pre>
<p>이렇게 질문과 의미가 비슷한 문서를 찾는 것을 <strong>유사도 검색(Similarity Search)</strong>이라고 한다.</p>
<p>결국 RAG는 이 과정을 통해 사용자의 질문과 관련된 정보를 찾아낸다.</p>
<p>찾아낸 정보는 이후 <strong>LLM에게 질문과 함께 전달</strong>되고, LLM은 해당 내용을 참고하여 최종 답변을 생성한다.</p>
<hr>
<h2 id="정리">정리</h2>
<p>지금까지의 내용을 간단하게 정리하면 다음과 같다.</p>
<blockquote>
<p><strong>Chunking</strong><br>긴 문서를 검색하기 좋은 작은 단위로 나누는 과정</p>
</blockquote>
<blockquote>
<p><strong>Embedding</strong><br>텍스트의 의미를 숫자로 이루어진 Vector로 변환하는 과정</p>
</blockquote>
<blockquote>
<p><strong>Vector DB</strong><br>만들어진 Vector를 저장하고, 비슷한 Vector를 검색할 수 있는 데이터베이스</p>
</blockquote>
<p>그리고 이 과정을 연결하면,</p>
<h3 id="문서를-나누고-→-의미를-숫자로-바꾸고-→-저장하고-→-비슷한-내용을-찾는다">문서를 나누고 → 의미를 숫자로 바꾸고 → 저장하고 → 비슷한 내용을 찾는다.</h3>
<p>라는 흐름이 된다.</p>
<p><img src="https://velog.velcdn.com/images/u_heag/post/9ffbe136-13d5-4795-bbfe-81fe3cf829d5/image.png" alt=""></p>
<p>여기까지 이해하면 RAG에서 <strong>관련 문서를 어떻게 찾아오는지</strong>에 대한 기본적인 구조를 이해할 수 있다.</p>
<p>다음 글에서는 이렇게 찾아온 정보를 실제로 어떻게 LLM에게 전달하는지, <strong>Retrieval부터 최종 답변 생성까지의 RAG 동작 과정</strong>을 조금 더 자세히 살펴보려고 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[RAG 이해하기 ① RAG란? LLM이 모르는 정보를 찾아서 답하게 만드는 방법 !]]></title>
            <link>https://velog.io/@u_heag/RAG%EB%9E%80-LLM%EC%9D%B4-%EB%AA%A8%EB%A5%B4%EB%8A%94-%EC%A0%95%EB%B3%B4%EB%A5%BC-%EC%B0%BE%EC%95%84%EC%84%9C-%EB%8B%B5%ED%95%98%EA%B2%8C-%EB%A7%8C%EB%93%9C%EB%8A%94-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@u_heag/RAG%EB%9E%80-LLM%EC%9D%B4-%EB%AA%A8%EB%A5%B4%EB%8A%94-%EC%A0%95%EB%B3%B4%EB%A5%BC-%EC%B0%BE%EC%95%84%EC%84%9C-%EB%8B%B5%ED%95%98%EA%B2%8C-%EB%A7%8C%EB%93%9C%EB%8A%94-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Tue, 06 Oct 2026 08:51:44 GMT</pubDate>
            <description><![CDATA[<p>LLM 관련 내용을 공부하다 보면 <strong>RAG</strong>라는 단어를 자주 접하게 된다.</p>
<p>처음에는 단순히 *&quot;AI가 검색해서 답하는 건가?&quot;* 정도로 생각했는데, 전체적인 구조를 알고 나니 생각보다 어렵지 않은 개념이었다.</p>
<p>이번 글에서는 우선 <strong>RAG가 무엇이고, 왜 필요한지</strong>부터 간단하게 정리해보려고 한다.</p>
<hr>
<h2 id="rag란">RAG란?</h2>
<p><strong><em>RAG(Retrieval-Augmented Generation)</em></strong>, <strong>검색 증강 생성</strong>이라고 한다.</p>
<p>단어를 나눠보면 조금 더 이해하기 쉽다.</p>
<ul>
<li><strong>Retrieval</strong> : 필요한 정보를 검색</li>
<li><strong>Augmented</strong> : 검색한 정보로 보강</li>
<li><strong>Generation</strong> : LLM이 답변 생성</li>
</ul>
<blockquote>
<p><strong>LLM이 자신이 학습한 지식만으로 답하는 것이 아니라, 
외부에서 필요한 정보를 먼저 찾아본 뒤 그 정보를 참고해서 답변을 생성하는 방식</strong></p>
</blockquote>
<p>쉽게 생각하면 <strong>LLM에게 오픈북 시험을 보게 하는 것</strong>과 비슷하다.</p>
<p>기억에만 의존해서 답하는 것이 아니라, 필요한 자료를 찾아본 다음 그 내용을 참고해서 답하는 것이다.</p>
<hr>
<h2 id="rag는-왜-필요할까">RAG는 왜 필요할까?</h2>
<p>ChatGPT 같은 LLM은 이미 많은 데이터를 학습하고 있다.<br>하지만 그렇다고 해서 <strong>모든 정보를 알고 있는 것은 아니다.</strong></p>
<p>특히 회사 내부 문서나 사내 규정, 최근 변경된 정보처럼 <strong>LLM이 학습하지 못한 데이터</strong>는 정확하게 답하기 어렵다.</p>
<p>예를 들어 회사에서 사용하는 AI에게 다음과 같이 질문했다고 해보자.</p>
<blockquote>
<p>*&quot;우리 회사 연차는 최대 며칠까지 이월할 수 있어?&quot;*</p>
</blockquote>
<p>해당 내용이 회사 내부 규정에만 존재한다면 LLM은 정확한 답을 알 수 없다.</p>
<p>이때 RAG를 사용하면 <strong>관련 사내 문서를 먼저 검색한 뒤, 찾은 내용을 LLM에게 전달해서 답변하도록 만들 수 있다.</strong></p>
<hr>
<h2 id="일반-llm과-무엇이-다를까">일반 LLM과 무엇이 다를까?</h2>
<p>일반적인 LLM의 흐름은 단순하다.</p>
<p><img src="https://velog.velcdn.com/images/u_heag/post/272ea7d4-cd3f-4976-bdb5-684a2de56f86/image.png" alt=""></p>
<p><strong>사용자 질문 → LLM → 답변 생성</strong></p>
<p>LLM이 기존에 학습한 지식을 기반으로 답변을 생성하는 구조다.</p>
<p>반면 RAG에서는 중간에 <strong>검색 과정</strong>이 추가된다.</p>
<p><img src="https://velog.velcdn.com/images/u_heag/post/6f5e2f19-ae0d-4376-8709-94b7b7d80b27/image.png" alt=""></p>
<p><strong>사용자 질문 → 검색 → 관련 자료 → LLM → 답변 생성</strong></p>
<p>즉,</p>
<blockquote>
<p><strong>질문 → LLM</strong></p>
</blockquote>
<p>이었던 구조가</p>
<blockquote>
<p><strong>질문 → 검색 → 관련 자료 → LLM</strong></p>
</blockquote>
<p>구조로 바뀌는 것이다.</p>
<p>이 중간의 <strong>Retrieval(검색)</strong> 과정이 RAG의 핵심이다.</p>
<hr>
<h2 id="rag의-전체적인-흐름">RAG의 전체적인 흐름</h2>
<p>실제 RAG에서는 대략 다음과 같은 과정을 거친다.</p>
<h3 id="①-데이터-준비">① 데이터 준비</h3>
<pre><code class="language-text">문서
 ↓
문서를 작은 단위로 나누기 (Chunking)
 ↓
Embedding
 ↓
Vector DB 저장</code></pre>
<h3 id="②-사용자-질문-처리">② 사용자 질문 처리</h3>
<pre><code class="language-text">사용자 질문
 ↓
관련 정보 검색 (Retrieval)
 ↓
검색 결과 + 사용자 질문
 ↓
LLM
 ↓
최종 답변</code></pre>
<p>여기서 갑자기 새로운 단어들이 등장한다.</p>
<p><strong>Chunking, Embedding, Vector DB...</strong></p>
<p>지금은 각각의 기술을 자세히 알 필요 없이,</p>
<blockquote>
<p><strong>문서를 검색할 수 있는 형태로 미리 저장해두고 → 질문이 들어오면 관련 내용을 찾아서 → LLM에게 전달한다.</strong></p>
</blockquote>
<p>정도로만 이해해도 충분하다.</p>
<p>각각의 개념은 다음 글에서 하나씩 살펴볼 예정이다.</p>
<hr>
<h2 id="정리">정리</h2>
<p>RAG를 처음 접하면 여러 기술 용어 때문에 복잡해 보이지만 핵심은 생각보다 간단하다.</p>
<blockquote>
<p><strong>RAG는 사용자의 질문과 관련된 외부 정보를 먼저 검색하고, 검색한 정보를 LLM에게 참고자료로 제공하여 답변을 생성하는 방식이다.</strong></p>
</blockquote>
<p>한마디로 정리하면,</p>
<h3 id="찾고-→-넣어주고-→-답하게-한다">찾고 → 넣어주고 → 답하게 한다.</h3>
<p>그리고 이 과정에서 등장하는 <strong>Chunking, Embedding, Vector DB</strong>가 각각 어떤 역할을 하는지는 다음 글에서 이어서 정리해보려고 한다 . ..🤓</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Node.js] NVM으로 Node JS 버전 관리하기]]></title>
            <link>https://velog.io/@u_heag/Node.js-NVM%EC%9C%BC%EB%A1%9C-Node-JS-%EB%B2%84%EC%A0%84-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@u_heag/Node.js-NVM%EC%9C%BC%EB%A1%9C-Node-JS-%EB%B2%84%EC%A0%84-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 14 Jun 2023 07:10:06 GMT</pubDate>
            <description><![CDATA[<h2 id="1-nvm이란❓">1. NVM이란❓</h2>
<blockquote>
<p><strong>nvm</strong>(Node version Manager)은 여러 버전의 node js를 설치하고 버전 변경을 관리해주는 도구이다.</p>
</blockquote>
<p>강의를 들으며 실습하거나 개발을 할때 node.js버전이 달라서 에러가 날 경우가 많은데 ! 이때 nvm을 사용하면 다양한 버전으로 변경이 가능해서 문제를 손쉽게 해결할 수 있다 ❕</p>
<h2 id="2-nvm-설치">2. NVM 설치</h2>
<blockquote>
<p>🔗 nvm 다운로드: <a href="https://github.com/coreybutler/nvm-windows">https://github.com/coreybutler/nvm-windows</a></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/u_heag/post/3cbbb253-32d7-4b77-892c-dd3593d87c39/image.png" alt=""><img src="https://velog.velcdn.com/images/u_heag/post/f2b4d3d9-8a1d-416d-b464-91fe942bb16a/image.png" alt=""></p>
<h2 id="3-nvm-사용하기">3. NVM 사용하기</h2>
<blockquote>
<p>PowerShell에서 작업하는걸 추천합니다 😂</p>
</blockquote>
<ul>
<li>원하는 버전 설치
<code>nvm install 16.19.0</code></li>
<li>원하는 버전 사용
<code>nvm use 16.19.0</code><ul>
<li>내 pc에 설치된 node.js버전 확인
<code>nvm list</code></li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CSS] PNG 이미지 편집없이 색상 변경하기 🎨]]></title>
            <link>https://velog.io/@u_heag/CSS-PNG-%EC%9D%B4%EB%AF%B8%EC%A7%80-%ED%8E%B8%EC%A7%91%EC%97%86%EC%9D%B4-%EC%83%89%EC%83%81-%EB%B3%80%EA%B2%BD%ED%95%98%EB%8A%94-%EB%B2%95</link>
            <guid>https://velog.io/@u_heag/CSS-PNG-%EC%9D%B4%EB%AF%B8%EC%A7%80-%ED%8E%B8%EC%A7%91%EC%97%86%EC%9D%B4-%EC%83%89%EC%83%81-%EB%B3%80%EA%B2%BD%ED%95%98%EB%8A%94-%EB%B2%95</guid>
            <pubDate>Wed, 12 Oct 2022 04:50:45 GMT</pubDate>
            <description><![CDATA[<p>아래는 radio 버튼을 클릭했을 때 나타나는 화면이다.
<img src="https://velog.velcdn.com/images/u_heag/post/676f75a9-10c2-4165-a74c-31c88f060c7e/image.png" alt=""></p>
<br />

<p>아이콘은 png파일인데 색상을 변경하고 싶다면, 이미지 편집없이 간단하게 <code>filter</code> 속성을 추가하면 된다 !</p>
<pre><code class="language-css">input[type=&quot;radio&quot;]:checked + label {
  color: #228b22;
  border: 2px solid #228b22;
  filter: opacity(0.5) drop-shadow(0 0 0 #228b22);
}</code></pre>
<p><img src="https://velog.velcdn.com/images/u_heag/post/943c7f6c-d52d-49f1-ae00-d273f085b075/image.png" alt="">
색상변경 성공 . . ✨ 
<br/></p>
<blockquote>
<p><em>📢 참고</em></p>
</blockquote>
<ul>
<li><a href="https://developer.mozilla.org/ko/docs/Web/CSS/filter">https://developer.mozilla.org/ko/docs/Web/CSS/filter</a></li>
<li>CSS filter generator <a href="https://codepen.io/sosuke/pen/Pjoqqp">https://codepen.io/sosuke/pen/Pjoqqp</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[HTML/CSS] 구글 폰트 적용하기 👩‍🏫]]></title>
            <link>https://velog.io/@u_heag/HTMLCSS-%EA%B5%AC%EA%B8%80-%ED%8F%B0%ED%8A%B8-%EC%A0%81%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B2%95</link>
            <guid>https://velog.io/@u_heag/HTMLCSS-%EA%B5%AC%EA%B8%80-%ED%8F%B0%ED%8A%B8-%EC%A0%81%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B2%95</guid>
            <pubDate>Tue, 11 Oct 2022 03:26:27 GMT</pubDate>
            <description><![CDATA[<ol>
<li>Goggle Fonts에 접속<blockquote>
<p><a href="https://fonts.google.com/">https://fonts.google.com/</a></p>
</blockquote>
</li>
</ol>
<br/>

<ol start="2">
<li><p>원하는 폰트를 선택</p>
<ol>
<li><p>언어를 선택할 수 있음
<img src="https://velog.velcdn.com/images/u_heag/post/3da6c520-3046-451e-8761-2ef580464a78/image.png" alt=""></p>
</li>
<li><p>스타일을 선택해서 <code>+ 버튼</code> 클릭 
<img src="https://velog.velcdn.com/images/u_heag/post/daeef9a9-8e57-4ad8-a004-f737ed39e34f/image.png" alt=""></p>
</li>
<li><p>왼쪽 사이드바 &#39;Use on the web&#39;에 있는 <code>&lt;Link&gt;</code>코드를 html <code>&lt;head&gt;</code>에 붙여넣기 하고 css에 아래코드를 추가하면 끝 🤓
<img src="https://velog.velcdn.com/images/u_heag/post/1b503aef-472a-4bca-b9ea-2ef556f4b205/image.png" alt=""></p>
</li>
</ol>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[AWS] EC2 인스턴스 생성]]></title>
            <link>https://velog.io/@u_heag/AWS-EC2-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EC%83%9D%EC%84%B1</link>
            <guid>https://velog.io/@u_heag/AWS-EC2-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EC%83%9D%EC%84%B1</guid>
            <pubDate>Sun, 13 Feb 2022 15:26:16 GMT</pubDate>
            <description><![CDATA[<h3 id="☁️-ec2-인스턴스-생성하기">☁️ EC2 인스턴스 생성하기</h3>
<br/>

<h4 id="1_-aws콘솔에-접속하고-ec2_-서비스에-들어가서-인스턴스-시작">1._ AWS콘솔<em>에 접속하고,</em> EC2_ 서비스에 들어가서 인스턴스 시작</h4>
<p><img src="https://images.velog.io/images/u_heag/post/8952e057-2fff-45b9-ba91-187d45458f83/image.png" alt=""></p>
<h4 id="2-amazon-machine-imageami-선택">2. Amazon Machine Image(AMI) 선택</h4>
<ul>
<li>우분투 리눅스 선택
<img src="https://images.velog.io/images/u_heag/post/b38286dc-bb7d-4e4a-89f7-7f5682008065/image.png" alt=""></li>
</ul>
<h4 id="3-인스턴스-선택-후-검토-및-시작을-클릭">3. 인스턴스 선택 후, 검토 및 시작을 클릭</h4>
<p><img src="https://images.velog.io/images/u_heag/post/468afdb6-a715-489e-bb76-dc2259993aaf/image.png" alt=""></p>
<h4 id="4-키-페어-생성하고-다운로드-받기">4. 키 페어 생성하고 다운로드 받기</h4>
<blockquote>
<h5 id="다운로드받은-키-페어는-잃어버리지-말고-잘-갖고있어야-한다-_ssh-파일로-옮기기--_">다운로드받은 키 페어는 잃어버리지 말고 잘 갖고있어야 한다. <del>_.ssh 파일로 옮기기 ! _</del></h5>
</blockquote>
<p><img src="https://images.velog.io/images/u_heag/post/5f1ab5c7-88f2-4a60-b0fd-9185bee374e0/image.png" alt=""><img src="https://images.velog.io/images/u_heag/post/b9f12574-f742-4338-91c7-5ca3be182598/image.png" alt=""></p>
<blockquote>
<p>RSA와 ED25519가 뭘까... 🙄💭 
<span style = "color:gray">참고사이트 : </span><em><a href="https://naleejang.tistory.com/218">https://naleejang.tistory.com/218</a></em></p>
</blockquote>
<br/>
<hr/>



<h3 id="☁️-ec2-인스턴스-접속하기">☁️ EC2 인스턴스 접속하기</h3>
<br/>

<h4 id="1-인스턴스-선택-후-연결을-클릭하여-ssh클라이언트-확인하기">1. 인스턴스 선택 후, 연결을 클릭하여 ssh클라이언트 확인하기</h4>
<p><img src="https://images.velog.io/images/u_heag/post/0a6b8f35-6c30-4a34-974f-68a2e1385496/image.png" alt=""><img src="https://images.velog.io/images/u_heag/post/d1f9cd8b-45cb-4f9a-9216-e76c7ead2085/Screenshot_1.jpg" alt=""></p>
<h4 id="2-인스턴스-생성할때-다운로드-받은-키-페어의-속성에서-보안---고급---상속사용-안함-버튼-클릭">2. 인스턴스 생성할때 다운로드 받은 키 페어의 속성에서 [<strong>보안</strong>] -&gt; [<strong>고급</strong>] -&gt; [<strong>상속사용 안함</strong>] 버튼 클릭</h4>
<p><img src="https://images.velog.io/images/u_heag/post/951b1267-86e4-405f-9dae-8d557ce60461/Screenshot_2.jpg" alt=""><img src="https://images.velog.io/images/u_heag/post/bb421cf3-72ee-46c2-abdd-164415cdc957/image.png" alt=""></p>
<h4 id="3-명령프롬프트를-관리자모드로-실행하고-키-페어-파일이-있는-폴더로-이동">3. 명령프롬프트를 관리자모드로 실행하고, 키 페어 파일이 있는 폴더로 이동</h4>
<h4 id="4-1번-단계에서-봤던-ssh-명령어로-서버에-접속-✔️">4. 1번 단계에서 봤던 SSH 명령어로 서버에 접속 ✔️</h4>
<p><img src="https://images.velog.io/images/u_heag/post/71529efb-bd11-4027-9ad8-a8539d97b237/image.png" alt=""></p>
<blockquote>
<p>SSH 명령어 입력 후, <code>&#39;Are you sure you want to continue connecting?&#39;</code>이 출력될 때 !
 💁 참고사이트 : <a href="https://not-to-be-reset.tistory.com/431">https://not-to-be-reset.tistory.com/431</a></p>
</blockquote>
<h4 id="5-서버에-접속하여-python3-입력-후-제대로-접속됐는지-확인">5. 서버에 접속하여 &#39;python3&#39; 입력 후 제대로 접속됐는지 확인</h4>
<p><img src="https://images.velog.io/images/u_heag/post/41452910-57a4-4af8-b696-13da7d079e58/image.png" alt=""></p>
<br/>
<br/>

<blockquote>
<p><span style = "color:gray">💁‍♀️ 아래 사이트를 참고하여 작성했습니다 : )  </span>
 <span style = "color:gray"><a href="https://ndb796.tistory.com/250">https://ndb796.tistory.com/250</a>  [안경잡이개발자]</span>
<span style = "color:gray"><a href="https://deepmal.tistory.com/6">https://deepmal.tistory.com/6</a></span></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 아나콘다 설치]]></title>
            <link>https://velog.io/@u_heag/Python-%EC%95%84%EB%82%98%EC%BD%98%EB%8B%A4-%EC%84%A4%EC%B9%98</link>
            <guid>https://velog.io/@u_heag/Python-%EC%95%84%EB%82%98%EC%BD%98%EB%8B%A4-%EC%84%A4%EC%B9%98</guid>
            <pubDate>Sun, 13 Feb 2022 08:12:15 GMT</pubDate>
            <description><![CDATA[<h4 id="🐍-아나콘다-설치">🐍 아나콘다 설치</h4>
<blockquote>
<p><span style = 'font-size: 15px'>아나콘다(Anaconda)는 패키지 관리와 디플로이를 단순케 할 목적으로 과학 계산(데이터 과학, 기계 학습 애플리케이션, 대규모 데이터 처리, 예측 분석 등)을 위한 파이썬과 R 프로그래밍 언어의 자유-오픈 소스 배포판이다. 패키지 버전들은 패키지 관리 시스템 conda를 통해 관리된다.</span>
<span style = 'font-size: 13px; color: gray'>📢 자주쓰는 파이썬 패키지가 설치되어있어서 그냥 파이썬만 사용하는 것 보다 편한건가 보다..🙄<span></p>
</blockquote>
<br/>
<hr/>


<p><span style = 'font-size: 16px'>1. 아나콘다 홈페이지 <a href="https://www.anaconda.com/products/individual">(https://www.anaconda.com/products/individual)</a>에 들어가서 다운로드 받기.</span></p>
<p><img src="https://images.velog.io/images/u_heag/post/b5920242-0add-4302-a25b-7f5cc61a4d57/image.png" alt=""></p>
<br/>
<br/>
<span style = 'font-size: 16px'>2. 아나콘다 다운로드 과정</span>

<p><img src="https://images.velog.io/images/u_heag/post/1a246075-5568-40a4-a353-6757f4181015/image.png" alt=""><img src="https://images.velog.io/images/u_heag/post/f08d2611-08c5-492e-aaff-cbcc664c5082/image.png" alt=""><img src="https://images.velog.io/images/u_heag/post/1fd33663-981d-41c4-8097-54bcbc853a60/image.png" alt=""><img src="https://images.velog.io/images/u_heag/post/1bfc4557-4b0b-4432-a03c-33ae7e84a29d/image.png" alt=""></p>
<br/>
<br/>

<p><span style = 'font-size: 16px'>3. 아나콘다 설치완료</span>
<img src="https://images.velog.io/images/u_heag/post/96625d2d-270b-4160-92ef-44fd2fb8e71b/image.png" alt=""><img src="https://images.velog.io/images/u_heag/post/a632b1e1-b3d9-4935-b199-9ed150ecb2eb/image.png" alt="">
<br/></p>
<hr/>
<br/>


<h4 id="💡-환경변수-단축키">💡 환경변수 단축키</h4>
<p><span style = 'font-size: 15px'><code>window +  r</code> 을 누르고, 실행창이 나타나면 <code>sysdm.cpl ,3</code>을 입력하면 환경변수로 이동함 🤓 </span>
<img src="https://images.velog.io/images/u_heag/post/b3c27853-eef1-401c-85dc-46159da120e0/image.png" alt=""></p>
<p><span style = 'font-size: 15px'>아나콘다 설치과정에서 path 설정을 체크해둬서 자동으로 환경변수에 path 추가가 되었다 ! </span>
<img src="https://images.velog.io/images/u_heag/post/9e6dc023-e6ee-4485-add3-049a9c046370/image.png" alt="">
<br/></p>
<h4 id="💡-명령-프롬프트에서-python을-쳤을-때-에러-해결-">💡 명령 프롬프트에서 <code>python</code>을 쳤을 때 에러 해결 !<img src="https://images.velog.io/images/u_heag/post/4cc17a28-c987-4276-b15f-6189b4ad2915/image.png" alt=""></h4>
<blockquote>
<p> 💁 참고사이트 :  <a href="https://devpad.tistory.com/42">https://devpad.tistory.com/42</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PostgreSQL] INSERT]]></title>
            <link>https://velog.io/@u_heag/PostgreSQL-INSERT</link>
            <guid>https://velog.io/@u_heag/PostgreSQL-INSERT</guid>
            <pubDate>Tue, 18 Jan 2022 05:37:39 GMT</pubDate>
            <description><![CDATA[<h4 id="▪️-create-table"><code>▪️ CREATE TABLE</code></h4>
<pre><code class="language-sql">-- creating a customers table
CREATE TABLE customers (
    customer_id SERIAL PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    email VARCHAR(150),
    age INT
);

-- *은 모든 컬럼
SELECT * FROM customers;</code></pre>
<br/>

<h4 id="▪️-insert"><code>▪️ INSERT</code></h4>
<blockquote>
<p><strong><code>INSERT</code>문을 사용하여 테이블에 행을 삽입할 수 있다.</strong></p>
</blockquote>
<pre><code class="language-sql">INSERT INTO table_name(column1, column2, …)
VALUES (value1, value2, …);</code></pre>
<pre><code class="language-sql">-- insert data into a table
INSERT INTO customers(first_name, last_name, email, age)
VALUES 
(&#39;Shin&#39;, &#39;Zzanggu&#39;, &#39;cd.com&#39;, 5),
(&#39;Shin&#39;, &#39;Zzanga&#39;, &#39;abcd.com&#39;, 2),
(&#39;Bong&#39;, &#39;Bongsun&#39;, &#39;zz.com&#39;, 29);


INSERT INTO customers(first_name)
VALUES (&#39;Bill&#39;&#39;o Sullivan&#39;);</code></pre>
<p><span style="font-size:14px">▶️ <code>customer_id</code>는 자동부여 되고, first_name 이외의 값은 null로 삽입된다.</span>
<span style="font-size:14px">▶️ <code>&#39;</code>를 사용하려면 <code>&#39;&#39;</code>두 번 적으면 된다.</span>
<img src="https://images.velog.io/images/u_heag/post/2fb9f73c-de5a-4747-9354-c0e76b9a2df3/image.png" alt=""></p>
<br/>
<hr/>

<pre><code class="language-sql">-- 값을 insert한 후 그 값의 행만 return 함! *는 컬럼모두
INSERT INTO customers (first_name)
VALUES (&#39;Tom&#39;) RETURNING *; 

-- customer_id 만 return
INSERT INTO customers (first_name)
VALUES (&#39;Elsa&#39;) RETURNING customer_id;
</code></pre>
<br/>

<p><span style="font-size:14px">▶️ <code>INSERT</code>문 마지막에 <code>RETURNING</code>키워드를 사용하면 새로 넣은 값의 행을 반환해서 보여준다.
 <code>RETURNING</code>키워드 뒤에 <code>*</code>이면 모든 컬럼을 반환하고, 특정 컬럼이 적혀있으면 그 컬럼만 반환한다.
</span></p>
<p><img src="https://images.velog.io/images/u_heag/post/1c5dad7f-8f9d-43be-9be1-c58d14b4cff4/image.png" alt=""><img src="https://images.velog.io/images/u_heag/post/bc5f6180-9c30-4c58-b510-4be3b21db3fb/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PostgreSQL] 테이블 생성]]></title>
            <link>https://velog.io/@u_heag/PostgreSQL-%ED%85%8C%EC%9D%B4%EB%B8%94-%EC%83%9D%EC%84%B1</link>
            <guid>https://velog.io/@u_heag/PostgreSQL-%ED%85%8C%EC%9D%B4%EB%B8%94-%EC%83%9D%EC%84%B1</guid>
            <pubDate>Tue, 18 Jan 2022 02:46:14 GMT</pubDate>
            <description><![CDATA[<br/>

<h3 id="▪️-create-table">▪️ CREATE TABLE</h3>
<p><code>SERIAL</code>은 아이디를 순서대로 증가시켜준다. <code>PRIMARY KEY</code>는 기본키</p>
<pre><code class="language-sql">-- 테이블 생성
-- CREATE TABLE &#39;table_name&#39; (column...);

CREATE TABLE actors (
    actor_id SERIAL PRIMARY KEY, 
    first_name VARCHAR(150),
    last_name VARCHAR(150) NOT NULL,
    gender CHAR(1),
    date_of_birth DATE,
    add_date DATE,
    update_date Date
);

CREATE TABLE directors (
    director_id SERIAL PRIMARY KEY,
    first_name VARCHAR(150),
    last_name VARCHAR(150) NOT NULL,
    date_of_birth DATE,
    nationality VARCHAR(20),
    add_date DATE,
    update_date DATE
);</code></pre>
<br/>

<p>👀 테이블 생성 후, 구조 확인하기 <code>SELECT * FROM directors;</code>
<img src="https://images.velog.io/images/u_heag/post/f64a76a4-b577-47f3-9ea0-6e133cbed325/image.png" alt=""></p>
<hr/>
<br/>

<h3 id="▪️-create-table-참조">▪️ CREATE TABLE (참조)</h3>
<blockquote>
<p><code>REFERENCES</code> 키워드를 사용하여 movie 테이블의 director_id는 directors 테이블의 director_id를 참조한다.</p>
</blockquote>
<pre><code class="language-sql">-- &#39;column_name&#39; &#39;dataType&#39; REFERENCES &#39;table_name(column_name)&#39;
director_id INT REFERENCES direcors (director_id)</code></pre>
<pre><code class="language-sql">CREATE TABLE movies (
    movie_id SERIAL PRIMARY KEY,
    movie_name VARCHAR(100) NOT NULL,
    movie_length INT,
    movie_lang VARCHAR(20),
    age_certificate VARCHAR(10),
    release_date DATE,
    director_id INT REFERENCES direcors (director_id)
);

CREATE TABLE movies_revenue (
    revenue_id SERIAL PRIMARY KEY,
    movie_id INT REFERENCES movies (movie_id),
    revenues_domestic NUMERIC (10,2),
    revenues_international NUMERIC (10,2)
);</code></pre>
<br/>

<h4 id="▪️-연결테이블">▪️ 연결테이블</h4>
<pre><code class="language-sql">-- creating a movies_actor junction table

CREATE TABLE movies_actors (
    movie_id INT REFERENCES movies (movie_id),
    actor_id INT REFERENCES actors (actor_id),
    PRIMARY KEY (movie_id,actor_id)
);</code></pre>
<p><img src="https://images.velog.io/images/u_heag/post/d298470a-19f6-444a-9aa3-cc0f2e996b9d/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PostgreSQL] 유저등록, 데이터베이스 생성]]></title>
            <link>https://velog.io/@u_heag/PostgreSQL-%EC%9C%A0%EC%A0%80%EB%93%B1%EB%A1%9D-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%83%9D%EC%84%B1</link>
            <guid>https://velog.io/@u_heag/PostgreSQL-%EC%9C%A0%EC%A0%80%EB%93%B1%EB%A1%9D-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%83%9D%EC%84%B1</guid>
            <pubDate>Mon, 17 Jan 2022 15:01:00 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📌 강의를 듣고 복습을 위해 작성한 공부기록용 포스팅입니다. :D  <u>잘못된 정보가 있으면 알려주세요 !</u></p>
</blockquote>
<br/>

<h3 id="1-데이터베이스-유저등록">1. 데이터베이스 유저등록</h3>
<pre><code>- login/group roles 마우스 오른쪽 클릭 후, create 
  패스워드 설정과 권한부여 설정함.</code></pre><p><img src="https://images.velog.io/images/u_heag/post/7e7ac56e-fc12-4d55-982e-f0a2ec436136/image.png" alt=""><img src="https://images.velog.io/images/u_heag/post/2659e747-4934-4922-9959-1be572d7f7f5/image.png" alt=""><img src="https://images.velog.io/images/u_heag/post/07f31e96-22b1-46a6-9cf1-81aa74b10e46/image.png" alt=""><img src="https://images.velog.io/images/u_heag/post/2bf9689d-cef9-409c-a37e-e21775b6d03c/image.png" alt="">
<br/></p>
<h3 id="2-데이터베이스-생성">2. 데이터베이스 생성</h3>
<pre><code>- 데이터베이스에서 마우스 오른쪽 클릭 후, create -&gt; owner 선택 -&gt; save </code></pre><p><img src="https://images.velog.io/images/u_heag/post/eb49eb65-4fab-4735-aa97-dac59a74e86f/image.png" alt=""><img src="https://images.velog.io/images/u_heag/post/c1148edb-8f08-4d36-b7b3-7a9de837cab7/image.png" alt=""><img src="https://images.velog.io/images/u_heag/post/8c7325e2-a7f4-44dc-8246-f6657fe36e3e/image.png" alt="">
<br/></p>
<pre><code>- ⚡️ 번개모양을 클릭하면 해당데이터베이스의 쿼리를 작성할 수 있는 에디터가 뜸.</code></pre><p><img src="https://images.velog.io/images/u_heag/post/3a3e6c4b-5d19-4db8-a711-66d505c38fa9/image.png" alt=""><img src="https://images.velog.io/images/u_heag/post/420c130e-0da3-428b-8ae5-c40a79e18959/image.png" alt="">
<br/></p>
<h4 id="💡-코드-💡">💡 코드 💡</h4>
<pre><code class="language-sql">-- CREATE DATABASE &#39;데이터베이스명&#39;
CREATE DATABASE db_test;

-- DROP DATABASE &#39;데이터베이스명&#39;
DROP DATABASE db_test;
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PostgreSQL] PostgreSQL 설치하기🐘]]></title>
            <link>https://velog.io/@u_heag/PostgreSQL-PostgreSQL-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@u_heag/PostgreSQL-PostgreSQL-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 17 Jan 2022 07:13:47 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/u_heag/post/3bca9b27-1716-409e-a851-6735864f07fd/KakaoTalk_20220117_153803201_03.gif" alt=""></p>
<hr>
<br>

<h2 id="1-postgresql-홈페이지-접속">1. PostgreSQL 홈페이지 접속</h2>
<p><a href="https://www.postgresql.org/download/">https://www.postgresql.org/download/</a>
자신의 PC 운영체제에 맞게 설치파일을 다운로드 받습니다. </p>
<p><img src="https://images.velog.io/images/u_heag/post/679a82e0-abd4-4ef9-b725-a4d4f25e901d/image.png" alt=""><img src="https://images.velog.io/images/u_heag/post/d60bf2d5-5eff-48e2-99d4-ba6bac3b0a35/image.png" alt=""></p>
<blockquote>
<p> 💁 설치에러해결 참고사이트 (감사합니다🙇‍♀️)</p>
</blockquote>
<ol>
<li><a href="https://heeonii.tistory.com/8?category=929658"><em>https://heeonii.tistory.com/8?category=929658</em></a></li>
<li><a href="https://bug41.tistory.com/148"><em>https://bug41.tistory.com/148</em></a></li>
</ol>
<br>

<h2 id="2-계속-next-클릭-후-다운로드-완료-❗️">2. 계속 next 클릭 후 다운로드 완료 ❗️</h2>
<pre><code>- 경로 디폴트로 설정, 지역은 korea로 하고 next ⇒
- ⭐️이때 설정한 패스워드는 까먹지 말기⭐️
- 포트번호 5432

-&#39;pgAdin4&#39;를 검색해서 뜨면 다운로드 성공 😆</code></pre><p><img src="https://images.velog.io/images/u_heag/post/cd4d37d2-5c9c-44e2-aa07-a81f50e8a2e0/image.png" alt="">
<br></p>
<h2 id="3-pgadmin4-접속">3. pgAdmin4 접속</h2>
<pre><code>- Servers -&gt; PostgreSQL11 클릭한 후</code></pre><p><img src="https://images.velog.io/images/u_heag/post/018b9aef-be35-42da-9001-4c0d5fb8e254/image.png" alt=""></p>
<pre><code>- 2번 단계에서 설정한 패스워드를 입력 !</code></pre><p><img src="https://images.velog.io/images/u_heag/post/a4f480e9-5ab8-4710-939b-966b3d57157f/image.png" alt=""></p>
<pre><code>- 서버연결 성공 😆</code></pre><p><img src="https://images.velog.io/images/u_heag/post/c93a126f-186a-45aa-88e4-09b9cf88832a/image.png" alt=""></p>
]]></description>
        </item>
    </channel>
</rss>