<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>uiw_min.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Wed, 20 Nov 2024 02:22:09 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>uiw_min.log</title>
            <url>https://velog.velcdn.com/images/uiw_min/profile/cd31eaad-4047-4f91-8154-5eb156a1cb47/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. uiw_min.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/uiw_min" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[지식 그래프]]></title>
            <link>https://velog.io/@uiw_min/%EC%A7%80%EC%8B%9D-%EA%B7%B8%EB%9E%98%ED%94%84</link>
            <guid>https://velog.io/@uiw_min/%EC%A7%80%EC%8B%9D-%EA%B7%B8%EB%9E%98%ED%94%84</guid>
            <pubDate>Wed, 20 Nov 2024 02:22:09 GMT</pubDate>
            <description><![CDATA[<p>지식 그래프(Knowlege Graph)는 개체, 사건 또는 개념과 같은 실체에 대한 상호 연결된 설명 모음을</p>
<p> 데이터를 스마트하게 만들기 위해서는 기계가 미리 정의된 데이터 스키마에 얽매이지 않아야 했다. 실제 세계에 얽히고설킨 관계를 나타낼 수 있는 데이터 저장소가 필요해졌고, 이 모든 것은 컴퓨터가 읽을 수 있는 방식으로 수행되어야 했다</p>
<p> 데이터의 진정한 힘은 우리의 독점적 지식을 글로벌 지식과 연결시킬 때 진정한 힘이 발휘된다. 이를 가능하게 해주는 것이 KG</p>
<p> KG는 실세계의 객체 및 사건 또는 추상 개념(예를 들면 문서)과 같은 실체에 대한 <strong>상호 연결된 설명의 모음</strong>을 나타낸다.</p>
<p>설명(Description)은 사람과 컴퓨터 모두 효율적이고 모호하지 않은 방식으로 처리할 수 있는 형식적 의미론(formal semantics)을 가지고 있다.
개체 설명(Entity Description)은 네트워크를 형성하면서 서로 기여하며, 여기서 각 개체는 관련 개체 설명의 일부를 나타내며 이들의 해석에 대한 맥락(context)을 제공한다.</p>
<p>KG는 다음과 같은 여러 데이터 관리 패러다임의 특성을 갖고 있다.</p>
<p>데이터베이스 : 구조화된 쿼리(structured query)를 통해  데이터를 탐색할 수 있다.
그래프 : 네트워크 데이터 구조로 분석될 수 있다.
지식 베이스(Knowledge base) : 데이터를 해석하고 새로운 사실을 추론하는 데 사용할 수 있는 형식적 의미론을 포함한다.</p>
<hr>
<p>&quot;임진 왜란아 엄마 아빠가 꺠우지 않아도 스스로 일어나는 착한아이구나&quot;
질문의 의도를 파악하지 못하고 &#39;일어나다&#39;의 뜻을 인식한 결과
검색엔진에서 검색을 할떄 단어와 단어사이의 관계, 문장의 흐름을 고려해 이해한다면? -&gt; 이를 해결해줄수 있는것 이 지식 그래프</p>
<ul>
<li>많은 양의 데이터와 데이터의 관계를 알아보기 쉽게 해주는 포맷</li>
</ul>
<hr>
<ul>
<li>ALIVE: 살아 성장하는 유기적 모습의 데이터베이스, 따라서 지속적으로 데이터 공급하고 데이터가 유기적을 성장할 수 있도록 지원</li>
<li>Scale Up: 모든 데이터를 하나의 큰 스마트 저장소에 축적, 검색 결과 관령 높이고 쉽게 찾도록 지원</li>
<li>Automation with AI: 도메인 규칙과 어휘를 구축하면 온톨로지, 머신러닝, 알고리즘의 도움을 받아 지속적인 학습과 유기적 성장이 ㄱ ㅏ능</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Neuro Symbolic ai]]></title>
            <link>https://velog.io/@uiw_min/Neuro-Symbolic-ai</link>
            <guid>https://velog.io/@uiw_min/Neuro-Symbolic-ai</guid>
            <pubDate>Wed, 20 Nov 2024 00:36:39 GMT</pubDate>
            <description><![CDATA[<p>connection
symbolic : 인간이 상징적 표현을 형성하여 주변세계를 이해하는 능력에 기반, 개념 처리를 위한 <strong>규칙</strong>을 만들고, 이 규칙은 일상적 지식을 포착하는 방식으로 공식화 </p>
<p>symbolic: 규칙기반
신경망: 데이터기반
따라서 symbolic AI 시스템에 무언가를 설명하려면 올바른 식별을 위해 필요한 모든 정보를 명시적으로 제공해야</p>
<p>connection + symbolic = neural symbolic AI
neural networks와 symbolic ai 장점을 합친것
neural symbolic ai 아이디어</p>
<ul>
<li>neural networks: 원래 symbolic ai 는 인간 프로그래머가 정보를 제공했다면, neural networksrk symbols 만드는것 도와줌<ul>
<li>데이터 기반, 학습이 되고 나면 물체 인식 뿐만 아니라, 물체를 만들수도 있음</li>
</ul>
</li>
<li>symbolic ai : 상식에 대한 추론이나 기존지식 적용하는 부분, symbolic AI 통해 보완<ul>
<li>상징적 인공지능에게 설명하려면 명시적 모든 정보 제공</li>
</ul>
</li>
</ul>
<p>실제 세계는 symbolic representation으로 표현하기가 매우 어려움,
-&gt;이를 신경망을 이용한다면, 데이터가 많으니 correlation을 쉽게 찾을수 있고, symbolic representation도 쉽게 만들수 있다.
-&gt; symbolic representation을 가지고 reasoing</p>
<p>neuro(신경/딥러닝)
Symbolic (규칙)</p>
<p>neuro symbolic ai : 학습+ 논리: 추론</p>
<p>참조 : <a href="https://nongnongai.tistory.com/3">https://nongnongai.tistory.com/3</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[인턴일기]IT 스타트업]]></title>
            <link>https://velog.io/@uiw_min/%EC%9D%B8%ED%84%B4%EC%9D%BC%EA%B8%B0IT-%EC%8A%A4%ED%83%80%ED%8A%B8%EC%97%85</link>
            <guid>https://velog.io/@uiw_min/%EC%9D%B8%ED%84%B4%EC%9D%BC%EA%B8%B0IT-%EC%8A%A4%ED%83%80%ED%8A%B8%EC%97%85</guid>
            <pubDate>Tue, 01 Oct 2024 04:49:50 GMT</pubDate>
            <description><![CDATA[<p>한 IT 회사 데이터구축업무로 3개월간 인턴을 하게 되었다.
첫 인턴이다보니 면접이 엄청 떨렸었다. 
자그마치 왕복 4시간... 이라는 엄청난 거리! 지만 회사에 일부분이 될수 있다는 것만으로도 배울것이 많다 생각해 뿌듯한 마음으로 출근중이다.
다양한 it 관련 솔루션을 제공하는 회사였고 새로운 모델 개발을 위한 데이터 구축 업무에 투입되었다.</p>
<p>직접 회사에 와서 느낀점은 기록의 중요성이었다.
회사의 업무를 정리해놓은 문서를 공유받았는데, 어떤 것들을 해왔고 할 예정이라고 계획이 한눈에 그려져 신입의 입장에서 한번에 내용이 이해가 가는 면이 인상깊었고, 기록의 중요성을 느끼게 되었다.</p>
<p>두번째로 여러 회의에 참여하게 되었는데, 모든 팀원이 모여서 프로젝트의 과정을 함께 그려보며 의견을 나누는 과정이 인상깊었다. 전체적인 프로세스가 이해가 되었고, 회사에서 중요하게 생각하는 가치를 알 수 있어 뜻깊었다. 이런 과정에 참여할수 있게 되어서 너무 좋았다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[PEFT]]></title>
            <link>https://velog.io/@uiw_min/PEFT-kup40dv5</link>
            <guid>https://velog.io/@uiw_min/PEFT-kup40dv5</guid>
            <pubDate>Mon, 23 Sep 2024 04:34:33 GMT</pubDate>
            <description><![CDATA[<h2 id="peft-parameter-efficient-fine-tuning개념">PEFT (Parameter Efficient Fine-tuning)개념</h2>
<p>대규모 사전 학습된 모델을 효율적으로 파인튜닝하기 위한 방법론입니다. 기본 개념은 모델 전체를 미세 조정하지 않고, 일부 파라미터만 조정하여 적은 리소스로도 원하는 작업에 맞게 모델 성능을 높이는 것입니다. PEFT는 특히 대규모 모델(GPT, BERT 등)을 파인튜닝할 때 메모리와 계산 자원을 절약하면서도 성능을 유지할 수 있는 장점을 제공합니다.</p>
<p>*<em>적은수의 파라미터로 학습 하도록 도와줌!
*</em></p>
<ul>
<li>효율성: 파인튜닝할 때 모<strong>든 파라미터를 학습하지 않고, 필요한 부분만 미세 조정</strong>함으로써 모델을 훨씬 가볍게 만듭니다.</li>
<li>낮은 리소스: GPU 메모리나 계산 리소스가 제한된 환경에서 대규모 모델을 효율적으로 파인튜닝할 수 있습니다.</li>
<li>다양한 기법: PEFT에는 다양한 방법론이 포함되어 있어 작업 특성에 맞는 최적의 기법을 선택할 수 있습니다.</li>
</ul>
<h2 id="대규모-언어-모델에-특화된-peft">대규모 언어 모델에 특화된 PEFT</h2>
<p><strong>- 파라미터 효율성에 중점 **
**- 모델의 특정 부분만 조정하거나 작은 레이어나 임베딩을 학습하는 방식으로 모델을 효율적으로 파인튜닝</strong></p>
<h4 id="1loralow-rank-adaptation">1.Lora(Low-Rank Adaptation)</h4>
<ul>
<li>개념: </li>
<li><ul>
<li>모델의 파라미터를 저차원 공간에서 학습하여, 적은 메모리로도 대규모 모델을 파인튜닝할 수 있는 방법입니다.</li>
</ul>
</li>
<li><ul>
<li><strong>기존 파라미터를 직접 수정하는 대신, 새로운 저차원 파라미터를 추가</strong>합니다. 이를 통해 사전 학습된 모델의 주요 파라미터를 그대로 유지하면서, 부가적인 파라미터를 학습하게 됩니다.</li>
</ul>
</li>
<li><ul>
<li>LoRA는 저차원 행렬을 이용해 원래 파라미터 공간을 보완하는 방식으로, 이 <strong>저차원 행렬이 새로운 파라미터로 추가</strong>됩니다.(<em>LoRA는 사전 학습된 모델의 변형 행렬을 학습하는 대신, 모델의 변형 행렬을 저차원 행렬 두 개로 분해하여 파라미터를 학습합니다. 즉, 기존의 큰 행렬을 직접 학습하지 않고, 이를 두 개의 작은 저차원 행렬 𝐴와 𝐵로 분해하여 학습합니다.저차원 행렬들은 모델의 아키텍처에 추가적으로 부착되며, 학습은 이 저차원 행렬에서만 일어나기 때문에 메모리와 계산 비용이 절약됩니다.</em>)</li>
</ul>
</li>
<li>특징: 모델의 주요 파라미터를 동결하고, 일부 파라미터만 저차원으로 분해하여 학습합니다.</li>
<li>장점: 메모리 사용량을 크게 줄일 수 있으며, 성능 저하 없이 빠르게 모델을 파인튜닝할 수 있습니다.</li>
<li>적용 사례: 대규모 언어 모델(GPT, BERT 등)을 훈련할 때 GPU 메모리를 절약하면서 빠르게 파인튜닝해야 하는 경우.</li>
</ul>
<h4 id="2adapter-tuning">2.Adapter Tuning</h4>
<ul>
<li>개념: 기존의 모델에 어댑터 레이어를 추가하여, 해당 레이어만 학습시키는 방식입니다.</li>
<li>특징: 모델 전체를 수정하는 것이 아니라, 어댑터 레이어를 추가하고 해당 레이어만 학습합니다.</li>
<li>장점: 모델의 파라미터를 거의 변경하지 않으면서도 새로운 작업에 맞게 미세 조정할 수 있습니다.</li>
<li>적용 사례: 다양한 작업에 동일한 모델을 빠르게 적용해야 할 때. 어댑터 레이어만 조정하면 다른 작업에 쉽게 전환 가능합니다.</li>
</ul>
<h4 id="3prefix-tuning">3.Prefix Tuning:</h4>
<ul>
<li>개념: 입력 토큰 앞에 <strong>프리픽스(임의의 텍스트)</strong> 를 추가하고, 프리픽스 부분만 학습하는 방식입니다.</li>
<li>특징: 전체 모델을 학습시키는 대신, 입력에 붙이는 프리픽스만 조정합니다.</li>
<li>장점: 기존 모델의 성능을 유지하면서도 프리픽스 부분만 학습하므로 리소스가 적게 소모됩니다.</li>
<li>적용 사례: 다중 작업에서 동일한 모델에 대해 프리픽스를 변경하는 방식으로 쉽게 파인튜닝을 적용할 수 있습니다.</li>
</ul>
<h4 id="4prompt-tuning">4.Prompt Tuning</h4>
<ul>
<li>개념: 모델의 입력 앞에 학습 가능한 프롬프트를 추가하여 해당 프롬프트만 학습하는 방식입니다.</li>
<li>특징: 입력의 일부분만 조정하면서 모델이 특정 작업에 맞게 출력하도록 유도합니다.</li>
<li>장점: 기존 모델의 파라미터를 건드리지 않고도 다양한 태스크에 빠르게 적응할 수 있습니다.</li>
<li>적용 사례: 몇 가지 프롬프트 변형으로 다양한 자연어 처리 작업을 수행하는 데 유용합니다.<h4 id="5p-tuning">5.P-tuning:</h4>
</li>
<li>P-tuning은 입력에 <strong>프롬프트(입력 전처리 부분에 텍스트나 임베딩을 추가)</strong>를 사용하여 모델을 미세 조정하는 방법입니다.</li>
<li>기존 Prompt Tuning 기법과 달리, P-tuning은 프롬프트를 학습 가능한 임베딩으로 바꾸고, 해당 임베딩을 훈련 가능한 파라미터로 취급합니다.</li>
<li>이 임베딩은 모델의 입력으로 사용되며, 학습 가능한 프롬프트를 통해 대규모 사전 학습된 모델을 더 효율적으로 파인튜닝합니다.</li>
</ul>
<hr>
<p><strong>P-tuning vs. Prompt Tuning</strong>
<strong>Prompt Tuning</strong>은 주로 텍스트 기반 프롬프트를 추가해 모델의 출력을 조정하는 방식입니다. 그러나 이 프롬프트는 고정된 프롬프트로, 학습을 하지 않는 경우가 많습니다.
<strong>P-tuning</strong>은 학습 가능한 프롬프트 임베딩을 생성하고, 이를 모델 입력에 추가합니다. 이 방식은 프롬프트가 동적으로 조정될 수 있어 더 강력한 파인튜닝이 가능합니다.</p>
<hr>
<h2 id="peft-방법론">PEFT 방법론</h2>
<p>*<em>- 모델의 크기를 줄이거나 모델을 경량화하는 기술
*</em></p>
<ol>
<li><p>지식증류(Knowledge distillation)
개념: 큰 모델(교사)의 지식을 작은 모델(학생)로 전달하는 기술입니다.
설명: </p>
<ul>
<li>큰 모델의 출력 확률을 작은 모델의 학습 목표로 사용합니다.</li>
<li>작은 모델이 큰 모델의 지식을 얻으면서도 더 나은 일반화 능력을 갖게 됩니다.</li>
<li>모델 크기를 줄이면서도 성능을 유지할 수 있습니다.</li>
</ul>
</li>
<li><p>모델 가지치기(Pruning)
개념: 사전 학습된 모델에서 불필요한 가중치나 연결을 제거하는 기법입니다.
설명:</p>
<ul>
<li>중요도가 낮은 매개변수를 식별하고 제거합니다.</li>
<li>크기 기반 가지치기, 구조적 가지치기 등 다양한 방법이 있습니다.</li>
<li>모델의 크기와 계산 요구사항을 줄이면서도 성능을 유지할 수 있습니다.</li>
</ul>
</li>
<li><p>양자화 (Quantization)
개념: 모델 매개변수의 정밀도를 낮춰 메모리 및 계산 요구사항을 줄이는 기술입니다.
설명:</p>
<ul>
<li>32비트 부동 소수점 숫자를 8비트 정수 등으로 변환합니다.</li>
<li>학습 후 양자화와 양자화를 고려한 학습 방식이 있습니다.</li>
<li>메모리 사용량을 줄이고 계산 속도를 높일 수 있습니다.</li>
</ul>
</li>
<li><p>Low Rank Factorization
개념: 가중치 행렬을 저순위 행렬로 근사화하는 기술입니다.
설명:</p>
<ul>
<li>가중치 행렬을 더 작은 구성 요소로 분해합니다.</li>
<li>단일 값 분해(SVD) 등의 방법을 사용합니다.</li>
<li>파라미터 수와 계산 복잡도를 줄이면서 중요 정보를 유지합니다.</li>
</ul>
</li>
<li><p>지식 주입(Knowledge Injection)
개념: 원본 모델의 파라미터를 수정하지 않고 태스크별 정보를 주입하는 기술입니다.
설명:</p>
<ul>
<li>태스크별 모듈을 추가하거나 기존 구조를 수정합니다.</li>
<li>사전 학습된 지식을 활용하면서 재학습 필요성을 최소화합니다.</li>
<li>원본 모델 수정을 최소화하면서 특정 태스크에 적응시킬 수 있습니다.</li>
</ul>
</li>
<li><p>Adapter Modules(어댑터 모듈)
개념: 사전 학습된 모델에 추가되는 경량 모듈입니다.
설명:</p>
<ul>
<li>원본 파라미터를 수정하지 않고 모델의 다양한 계층에 삽입됩니다.</li>
<li>태스크별로 관리되며, 쉽게 추가하거나 제거할 수 있습니다.</li>
<li>사전 학습된 파라미터를 유지하면서 태스크별 정보를 학습할 수 있습니다.</li>
</ul>
</li>
</ol>
<p>이 방법들은 모두 대규모 모델을 효율적으로 파인튜닝하거나 최적화하는 데 사용되며, 각각의 장단점과 적용 시나리오가 다릅니다. 실제 응용에서는 이러한 기법들을 단독으로 또는 조합하여 사용할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[파인튜닝 과정]]></title>
            <link>https://velog.io/@uiw_min/PEFT</link>
            <guid>https://velog.io/@uiw_min/PEFT</guid>
            <pubDate>Mon, 23 Sep 2024 01:16:18 GMT</pubDate>
            <description><![CDATA[<h2 id="파인튜닝-왜-하는건가">파인튜닝 왜 하는건가?</h2>
<h2 id="파인튜닝-과정">파인튜닝 과정</h2>
<h3 id="1-파인튜닝-데이터-생성-및-변환">1. 파인튜닝 데이터 생성 및 변환</h3>
<h3 id="2-파인튜닝-모델-생성">2. 파인튜닝 모델 생성</h3>
<p>과정: 대규모 데이터셋으로 사전 학습된 모델을 불러옵니다</p>
<p>1) 사전 훈련된 모델 선택
Hugging Face Basic Model 한국어 기본모델
base_model = &quot;beomi/llama-2-ko-7b&quot;</p>
<p>Hugging Face의 transformers 라이브러리에서 사전 학습된 언어 모델을 쉽게 불러올 수 있습니다.</p>
<pre><code>from transformers import AutoModelForSequenceClassification

model = AutoModelForSequenceClassification.from_pretrained(&quot;bert-base-uncased&quot;)</code></pre><h3 id="3-데이터셋-불러오기">3. 데이터셋 불러오기</h3>
<p>과정: 특정 작업에 맞는 데이터셋을 준비하고, 훈련 데이터와 검증 데이터를 나눕니다.
이때 훈련 데이터와 검증 데이터를 분리하여 파인튜닝 중 모델 성능을 평가합니다.</p>
<pre><code>from datasets import load_dataset

dataset = load_dataset(&quot;imdb&quot;)  # 감정 분석 데이터셋</code></pre><h3 id="4-모델-아키텍처-조정-or-동결">4. 모델 아키텍처 조정 or 동결</h3>
<pre><code>model.classifier = torch.nn.Linear(model.config.hidden_size, num_labels)</code></pre><p>레이어 조정: PyTorch를 사용하여 모델의 출력 레이어를 조정합니다.</p>
<pre><code>for param in model.base_model.parameters():
    param.requires_grad = False  # 기본 모델의 파라미터를 동결
</code></pre><p>동결 : PyTorch 또는 TensorFlow로 모델의 파라미터를 동결할 수 있습니다.사전 학습된 모델의 주요 파라미터를 고정하여, 이미 학습된 지식을 훼손하지 않고 새로운 작업에 맞춰 마지막 레이어만 학습시키는 방식입니다.</p>
<h3 id="5--최적화-및-손실-함수-설정">5.  최적화 및 손실 함수 설정</h3>
<p>과정: 특정 작업에 적합한 손실 함수와 최적화 알고리즘을 설정합니다. 예를 들어, 텍스트 분류에는 교차 엔트로피 손실을 사용합니다.</p>
<h3 id="6-파인튜닝-실행">6. 파인튜닝 실행</h3>
<p>과정: 사전 학습된 모델을 특정 작업 데이터로 추가 훈련합니다. 이때, 낮은 학습률을 사용하여 기존의 지식을 훼손하지 않도록 합니다.</p>
<pre><code>from transformers import Trainer, TrainingArguments

training_args = TrainingArguments(
    output_dir=&quot;./results&quot;,
    learning_rate=1e-5,
    per_device_train_batch_size=8,
    num_train_epochs=3,
    evaluation_strategy=&quot;epoch&quot;
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=dataset[&quot;train&quot;],
    eval_dataset=dataset[&quot;test&quot;]
)

trainer.train()
</code></pre><h3 id="7-평가-및-반복">7. 평가 및 반복</h3>
<pre><code>#평가
eval_results = trainer.evaluate()
print(f&quot;Perplexity: {math.exp(eval_results[&#39;eval_loss&#39;]):.2f}&quot;)
print(f&quot;Accuracy: {eval_results[&#39;eval_accuracy&#39;]:.2f}&quot;)
</code></pre><h3 id="추가로-고려하여할-점">추가로 고려하여할 점</h3>
<ul>
<li>데이터 전처리: 토큰화, 패딩, 인코딩 등의 과정이 필요할 수 있습니다.</li>
<li>하이퍼파라미터 튜닝: 최적의 학습률, 배치 크기, 에폭 수 등을 찾는 과정이 포함될 수 있습니다.</li>
<li>모델 저장 및 배포: 파인튜닝된 모델을 저장하고 실제 환경에 배포하는 단계도 고려해야 합니다.</li>
</ul>
<h3 id="추가적인-라이브러리">추가적인 라이브러리</h3>
<p>PEFT
peft: LoRA, Prefix Tuning, P-Tuing, Prompt Tuning 과 같은 기법들을 쉽게 사용하도록 나온 라이브러리. 모델의 일부 파라미터만을 조정하여 메모리 사용량과 계산 비용을 줄이면서도 높은 성능을 유지하는 것이 목표입니다.</p>
<p> TRL (Transformer Reinforcement Learning) 은 transfomer언어 모델의 훈련을 위한 풀스택 라이브러리. TRL은 변환기 기반 언어 모델을 강화학습을 통해 파인튜닝하는 기법입니다. 이는 모델이 특정 목표나 보상 함수에 따라 출력을 최적화할 수 있도록 합니다.</p>
<h3 id="peft-lora-trl-적용-단계-요약">PEFT, LoRA, TRL 적용 단계 요약</h3>
<p>파인튜닝 과정에서 PEFT, LoRA, 그리고 TRL은 각각 적절한 단계에서 부가적으로 실행될 수 있습니다. 각 기법이 적용될 수 있는 단계는 다음과 같습니다:</p>
<h4 id="1-파인튜닝-모델-생성-사전-학습된-모델-불러오기">1. 파인튜닝 모델 생성 (사전 학습된 모델 불러오기)</h4>
<p>PEFT 및 LoRA 적용 가능
모델을 불러올 때, LoRA나 PEFT 설정을 미리 준비하여 일부 파라미터만 효율적으로 학습할 수 있도록 설정합니다.
적용 단계: 모델 생성 시 (2번 과정).</p>
<h4 id="2-모델-아키텍처-조정-또는-동결">2. 모델 아키텍처 조정 또는 동결</h4>
<p>PEFT 및 LoRA 적용 가능
모델의 일부 파라미터를 조정하거나 동결하고, 필요한 부분만 학습하도록 최적화합니다.
예를 들어, 모델의 주요 파라미터는 동결하고, 마지막 레이어만 학습하는 방식으로 사용할 수 있습니다.
적용 단계: 모델 아키텍처 조정 및 동결 시 (4번 과정).</p>
<h4 id="3-파인튜닝-실행">3. 파인튜닝 실행</h4>
<p>LoRA 및 PEFT 적용 가능
파인튜닝 실행 시, LoRA나 PEFT 기법을 적용하여 일부 파라미터만 학습하는 효율적인 파인튜닝을 수행합니다.
TRL 적용 가능
파인튜닝 후에 추가로 강화학습을 적용하여, 모델이 생성하는 텍스트의 품질을 높일 수 있습니다. 특히 텍스트 생성 작업에서 유용합니다.
적용 단계:
파인튜닝 실행 시 (6번 과정) - LoRA 및 PEFT.
파인튜닝 후 - TRL.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[파라미터, 하이퍼 파라미터]]></title>
            <link>https://velog.io/@uiw_min/%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0-%ED%95%98%EC%9D%B4%ED%8D%BC-%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0</link>
            <guid>https://velog.io/@uiw_min/%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0-%ED%95%98%EC%9D%B4%ED%8D%BC-%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0</guid>
            <pubDate>Fri, 20 Sep 2024 00:15:39 GMT</pubDate>
            <description><![CDATA[<h2 id="파라미터-parameters">파라미터 (Parameters)</h2>
<p><strong>정의</strong>: 머신러닝 모델 내부에서 학습되는 변수입니다.
<strong>특징</strong>:
데이터로부터 <strong>자동으로 학습</strong>됩니다.
학습을 통해 모델이 최적화하려는 값입니다.
<strong>예</strong>: 신경망의 가중치(weight)와 편향(bias)</p>
<h2 id="하이퍼파라미터-hyperparameters">하이퍼파라미터 (Hyperparameters)</h2>
<p><strong>정의</strong>: 모델 학습 과정을 제어하는 <strong>외부 설정값</strong>입니다.
특징:
<strong><em>개발자가 직접 설정</em></strong>하며, 학습 과정에서 변경되지 않습니다.
모델이 어떻게 학습할지에 대한 설정값으로, 최적화를 위해 수동으로 조정해야 합니다.
<strong>예</strong>: 학습률(learning rate), 에포크(epoch) 수, 은닉층의 수 등</p>
<h2 id="주요-차이점">주요 차이점</h2>
<p><strong>학습 방식</strong>:</p>
<p><strong>파라미터</strong>는 데이터로부터 <strong>자동으로 학습</strong>됩니다.
<strong>하이퍼파라미터</strong>는 <strong>수동</strong>으로 설정되며, <strong>학습 과정 중에는 변경되지 않습니다</strong>.</p>
<h2 id="변경-시점">변경 시점:</h2>
<p><strong>파라미터</strong>는 학습 중 <strong>지속적으로 업데이트</strong>되며, 모델이 최적의 결과를 내기 위해 <strong>학습 데이터를 통해 조정</strong>됩니다.
<strong>하이퍼파라미터</strong>는 <strong>학습이 시작되기 전에 설정</strong>되며, <strong>학습 과정에서는 고정</strong>되어 있습니다.</p>
<h2 id="모델-구조와-역할">모델 구조와 역할:</h2>
<p>파라미터는 모델 내부의 구조를 형성하고, 모델이 데이터를 처리하는 과정에서 직접적인 역할을 합니다.
하이퍼파라미터는 모델의 학습 과정과 성능을 조절하는 역할을 하며, 모델의 외부적인 설정값입니다.</p>
<p>이와 같이, 파라미터는 모델의 내부에서 학습을 통해 자동으로 조정되는 값이고, 하이퍼파라미터는 학습을 어떻게 수행할지를 설정하는 외부 값이라는 점에서 차이가 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Agent]]></title>
            <link>https://velog.io/@uiw_min/Agent</link>
            <guid>https://velog.io/@uiw_min/Agent</guid>
            <pubDate>Wed, 18 Sep 2024 08:43:24 GMT</pubDate>
            <description><![CDATA[<h2 id="agent-사용목적">Agent 사용목적?</h2>
<ul>
<li>LLM 가지고는 대화형식의 질의응답방식 </li>
<li>조금 더 자동화 목적 </li>
<li>규칙을 정해놓지 x/ ai가 적절한 상황판단을 한 다음에 적절한 도구 활용해 내가원하는 결과물을 도출</li>
</ul>
<h2 id="agent-기초--llm중심-에이전트-구축">Agent 기초 : LLM중심 에이전트 구축</h2>
<ul>
<li>Google Brain: REAC T:Synergizing Reasoning and acting in language models</li>
</ul>
<p><strong>(1) Hotspot QA</strong>
<strong>질문</strong> : Apple Remote 외에 원래 Apple Remote와 상호작용하도록 설계된 프로그램을 제어할 수 있는 다른 장치는 무엇인가요?</p>
<hr>
<p><strong>(1a) 기본적인 즉답</strong>
<strong>답변</strong> : iPod (틀린답변)</p>
<hr>
<p><strong>(1b) CoT 프롬프팅 기법을 적용 [고도화된 추론 적용]</strong></p>
<p><strong>생각</strong> : 단계별로 생각해 봅시다.
         Apple Remote는 원래 Apple TV와 상호작용하도록 설계되었습니다.
      Apple TV는 iPhone, iPad, iPod Touch로 제어할수 있습니다.
      따라서 답변은 iPhone, iPad, iPod Touch입니다.
<strong>답변</strong> : iPhone, iPad, iPod Touch (틀린답변)</p>
<ul>
<li>고급 프롬프팅을 써도 LLM이 잘 모르는것이기 때문에 틀린답변</li>
</ul>
<hr>
<p><strong>(1c) Act-Only: LLM이 갖고있지 않은 지식에 대해 다른 도구 활용해 답변</strong></p>
<p>행동 1 : 검색 [Apple Remote]
관찰 1 : Apple Remote는 원격 제어 장치 입니다...</p>
<p>행동 2 : 검색[Front Row]
관찰 2 : [Front Row]를 찾을수 없습니다..</p>
<p>행동 3 : 검색[Front Row(소프트웨어)]
관찰 3 : Front Row는ㄴ 중단된 미디어 센터 소프트웨어입니다...</p>
<p>행동 4 : 완료[예]  (애플 리모트와 상호작용하도록 설계된프로그램 제어할수 있는 다른 장치에 대한 답변 못함)</p>
<ul>
<li>웹 검색을 하기만하는거지 실제 웹 검색결과를 가지고 사용자의 질문에 답변하기 위한 추론 X</li>
</ul>
<hr>
<p><strong>(1d) ReAct( Reason + Act): CoT, Act-Only장점 섞어서/ 추론과 모르는부분은 새로운도구 활용해/ 생각, 행동, 관찰</strong></p>
<p><strong>생각 1</strong>: Apple Remote를 검색하여 원래 상호작용하도록 설계된 프로그램을 찾아야 합니다.
<strong>행동 1</strong> : 검색[Apple Remote]
<strong>관찰 1</strong> : Apple Remote는 2005년 10월에 Apple이 소개한 원격제어장치입니다. 원래 Front Row 미디어 센터 프로그램을 제어하도록 설계되었습니다.</p>
<p><strong>생각 2</strong> : Apple Remote는 원래 Front Row 미디어 센터 프로그램을 제어하도록 설계되었습니다. [Front Row] 미디어 센터 프로그램을 제어하도록 설계되었습니다. [Front Row]를 검색하여 다른 어떵ㄴ 장치가 이를 제어할수있는지 찾아야 합니다.
<strong>행동 2</strong> : 검색[Front Row]
<strong>관찰 2</strong> : [Front Row]를 찾을수 없습니다. 유사한 것:[&#39;Front Row Seat to Earth&#39;, &#39;Front Row Motorsports&#39;, &#39;Front Row(소프트웨어)&#39;,...]</p>
<p><strong>생각 3</strong> : Front Row가 발견되지 않았습니다. [Front Row (소프트웨어)]를 검색해야 합니다.
<strong>행동 3</strong> : 검색[Front Row (소프트웨어)]
<strong>관찰 3</strong> : Front Row는 중단된 미디어 센터 소프트웨어입니다..</p>
<p><strong>생각 4</strong> : Front Row(소프트웨어)는 Apple Remote 또는 키보드 기능 키로 제어됩니다. 따라서 답변은 키보드 기능키입니다.
*<em>행동 4 *</em>: 완료[키보드 기능 키]</p>
<h2 id="agent-구조">Agent 구조</h2>
<ul>
<li><p>두뇌역할 추론능력을 부여하는 LLM</p>
</li>
<li><p>목표를 달성할수 있는 외부 도구 (Langchain 도구 모음 toolkit)
<img src="https://velog.velcdn.com/images/uiw_min/post/77500ecf-7656-4727-b9d5-0e824fdfbb5a/image.png" alt=""></p>
<ul>
<li><p>도구에 대한 메뉴얼만 정의
ex&gt; 사용자가 &quot;검색해줘&quot; -&gt; 웹 검색 / &quot;문서에서 검색해줘&quot; -&gt;문서 검색</p>
<p>(Thought-&gt;Action-Obeservation)과정 반복</p>
<p>Invoking: 어떤 검색 도구 썻는지
Query: 질문에서 핵심 키워드 추출해서</p>
</li>
</ul>
</li>
</ul>
<ol>
<li><p>Thougt : 어떤 도구를 사용해야 할까?</p>
</li>
<li><p>Action : 웹검색</p>
<p>Invoking: 어떤 검색 도구 썻는지
Query: 질문에서 핵심 키워드 추출해서</p>
</li>
<li><p>Obersvation : 검색 결과 토대로 observation 수행</p>
<pre><code>         사용자가 궁금해하는 query 정보가 검색된 정보 안에 있는지 관측

        정보가 있으면 -&gt; 
         정보가 없으면 -&gt; 다시 1.Thought 프로세스로</code></pre></li>
</ol>
<p>프로세스를 반복해서 원하는 결과가 나오면 RAG를 거치고 결과 도출</p>
<p>LangChain에서 Agent는 주어진 쿼리에 대해 스스로 생각하여 적절한 행동을 하는 대리인
Agent는 자신의 목표를 달성할 때까지 자신에게 주어진 Tool들을 기반으로 Action을 수행한다</p>
<h2 id="단일-에이전트의-한계">단일 에이전트의 한계</h2>
<ul>
<li>단일 에이전트 시스템<ul>
<li>LLM 기반 Reasoning(계획) - 사용자의 질문에 대해 웹 검색이 필요하겠구나!</li>
<li>Act(실행) - 웹검색 기반으로 실행(ex.보고서 작성)<blockquote>
<p>but 그냥 실무에 쓰기에는 전문성 부족
하나의 역할안에서만</p>
</blockquote>
</li>
</ul>
</li>
</ul>
<h2 id="멀티-에이전트-시스템">멀티 에이전트 시스템</h2>
<p>여러개의 에이전트가 하나의 작업을 완수하기 위해 협력과 소통</p>
<ul>
<li><p>멀티 에이전트 시스템(두개의 에이전트가 서로 협력)</p>
<ul>
<li><p>Researcher(정보수집): 웹 검색을 기반으로 정보 검색 및 요약</p>
</li>
<li><p>Report Writer: 정보기반으로 리포트 작성</p>
<blockquote>
<ul>
<li>각 에이전트가 별도의 전문영역을 맡음</li>
<li>여러번의 대화를 통해 결과물 생성</li>
</ul>
</blockquote>
<p>-
장점 : 1. 퀄리티있는 결과물 도출 가능(여러번의 대화를 통해)</p>
<pre><code> 2. 퀄리티 올려가는 작업을 자동화가능</code></pre></li>
</ul>
</li>
</ul>
<h3 id="멀티-에이전트의-유형">멀티 에이전트의 유형</h3>
<ol>
<li>협업형 멀티 에이전트 :  CrewAI, AutoGen, LangGraph</li>
<li>감독형 멀티 에이전트 : 모든 에이전트들이 평등한 관계를 가지고 소통하는것이 아닌 하나의 감독자 에이전트에게 보고를 하고, 피드백을 받는 과정에서 결과물 고도화</li>
<li>위계형 멀티 에이전트: 감독형 멀티 에이전트와 동일한 시스템, 그리고 더 고도화</li>
</ol>
<h3 id="정식-지원하는-모델">정식 지원하는 모델</h3>
<p><a href="https://python.langchain.com/v0.2/docs/integrations/chat/">https://python.langchain.com/v0.2/docs/integrations/chat/</a>
Tool calling 지원</p>
<p>Llama 기반 모델은 원칙적으로 지원 x</p>
<h3 id=""></h3>
<h3 id="위글은-아래의-동영상을-요약">위글은 아래의 동영상을 요약</h3>
<p>모두의 AI님의 &lt;AI 에이전트위 원리와 단일, 멀티 에이전트&gt;
<a href="https://www.youtube.com/watch?v=1n_Kui6B43Y">https://www.youtube.com/watch?v=1n_Kui6B43Y</a></p>
<p>테디노트님의 &lt;llama3 로 agent 🤖 만드는 방법 + 8B 오픈 모델로 Agent 구성하는 방법&gt; 참고
<a href="https://www.youtube.com/watch?v=04MM0PXv2Fk&amp;t=622s">https://www.youtube.com/watch?v=04MM0PXv2Fk&amp;t=622s</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[RAG]]></title>
            <link>https://velog.io/@uiw_min/RAG</link>
            <guid>https://velog.io/@uiw_min/RAG</guid>
            <pubDate>Fri, 13 Sep 2024 09:52:36 GMT</pubDate>
            <description><![CDATA[<h2 id="llm에-학습과정에-포함되어있지-않은-지식을-주입하는-방법-크게-2가지">LLM에 학습과정에 포함되어있지 않은 지식을 주입하는 방법 크게 2가지</h2>
<h2 id="1-fine-tuning-">1. Fine-Tuning :</h2>
<ul>
<li>공부 진짜 열심히 해서 실제로 그 지식 습득</li>
</ul>
<p><img src="https://velog.velcdn.com/images/uiw_min/post/3dcec01b-5a2f-4f9f-95ed-9700c4498843/image.png" alt=""></p>
<h2 id="2-ragretrieval-augmented-geneartion-검색-증강">2. RAG(Retrieval-Augmented Geneartion) 검색 증강</h2>
<ul>
<li>오픈북 시험 / 누가 질문하면 질문에 답변할 수 있는 부분을 찾아서 답변</li>
</ul>
<h3 id="기본흐름">기본흐름</h3>
<p><img src="https://velog.velcdn.com/images/uiw_min/post/ea4a8f3f-a918-4fa5-8966-1d83b7aa4a54/image.png" alt=""></p>
<p>chatgpt는 이미 학습된 걸 바탕으로  답변</p>
<p>rag 내가 올린 데이터 기반으로 답변</p>
<h3 id="과정">과정</h3>
<ol>
<li>새로운 지식에 관한 텍스트 데이터(pdf, txt … ) → </li>
<li>Embedding →</li>
<li>VectorStore 저장 →  </li>
<li>프롬프트 구성(외부 텍스트 데이터를 함께 이용해 프롬프터 구성) → </li>
<li>LLM으로부터 답변</li>
</ol>
<p><img src="https://velog.velcdn.com/images/uiw_min/post/0ee12c41-1fbd-4f44-abeb-bab1695ef4b4/image.png" alt=""></p>
<h3 id="문서-또는-데이터-가공">문서 또는 데이터 가공</h3>
<h3 id="1-나누는-이유">1. 나누는 이유?</h3>
<ul>
<li>언어 모델 및 임베딩 모델 토큰크기</li>
<li>기대하는 답변의 성격 또는 형식에 따라 나누는 기준 저알수도</li>
<li>문서나 데이터의 현재 형식: 구조화된문서/ 구조가 일관성이 없는 문서</li>
</ul>
<h3 id="2--임베딩-모델">2.  임베딩 모델</h3>
<ul>
<li><strong>임베딩(Embedding)</strong>?  글자, 단어, 문장을 분류하는것<ul>
<li>모든 과일에는 “과일”스티커, 모든 장난감에는 “장난감”스티커</li>
<li>임베딩은 전용 AI모델을 이용해 스티커 대신 숫자를 붙이는것</li>
<li>숫자들이 서로 가까울수록 서로의 거리가 가까워서 자연스럽게 분류</li>
</ul>
</li>
</ul>
<ul>
<li><p><strong>벡터 데이터베이스(Vector Database)</strong>는 과일상자, 장난감사자</p>
</li>
<li><p><strong>임베딩 모델</strong>?</p>
<ul>
<li><p>AI가 사람의 언어를 이해하기 위한 방법으로 숫자로 변환을 해주는 역할을 하는 AI 모델
<img src="https://velog.velcdn.com/images/uiw_min/post/2b346544-6e58-433e-8b49-00fd8db122b7/image.png" alt=""></p>
<p>-_ 임베딩 모델의 성능은 RAG 챗봇을 만들 떄 매우중요_
-<em>임베딩 모델은 지정된 차원수를 가지고 있다</em>
-_ 오픈 AI Ada 모델(모델명:text-embedding-ada-002)DMS 1536차원 지원_</p>
</li>
<li><p>다양한 임베딩 모델</p>
<ul>
<li>OpenAI의 모델들 : text-embeding-ada-002/ <pre><code>          text-search-davinci-*-001/ 
         text-search-curie-*-001</code></pre></li>
<li>구글: Bert / Sbert</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="3-벡터-데이터베이스">3. <strong>벡터 데이터베이스</strong></h3>
<ul>
<li>벡터 데이터베이스(Vector Database)는 과일상자, 장난감사자
<img src="https://velog.velcdn.com/images/uiw_min/post/9bf51dee-c1d7-4930-8683-042eada486f3/image.png" alt="">
<img src="https://velog.velcdn.com/images/uiw_min/post/b2e732e3-58e4-4581-b65b-0a2cf090b5e4/image.png" alt=""><ul>
<li>장난감을 주제, 크기, 색깔로 나눠 상자에 넣듯이</li>
<li>임베딩 모델을 이용해 붙은 숫자를 이용해, ‘벡터’라는 조각으로 나누어 저장</li>
</ul>
</li>
</ul>
<h3 id="4-사용자-검색">4. 사용자 검색</h3>
<p><img src="https://velog.velcdn.com/images/uiw_min/post/af395b2e-d78c-4616-b11c-8f8fd8836dc8/image.png" alt=""></p>
<ul>
<li>k개를 순서대로 나열하고  가장 유사도가 높은 것부터 가져옴</li>
</ul>
<h3 id="5-프롬프트와--답변-생성">5. 프롬프트와  답변 생성</h3>
<ul>
<li>프롬프팅 엔지어링</li>
<li>LLM 모델</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Hybrid Search]]></title>
            <link>https://velog.io/@uiw_min/Hybrid-Search</link>
            <guid>https://velog.io/@uiw_min/Hybrid-Search</guid>
            <pubDate>Wed, 04 Sep 2024 06:25:14 GMT</pubDate>
            <description><![CDATA[<p>Hybrid Search란
키워드 기반 검색인 Lexical Search와 유사도 기반 검색인 Semantic Search는 각각 장단점이 있고 사용이 유리한 상황이 서로 다르다.</p>
<p>Lexical Search : OpenSearch와 같은 전통적인 검색 엔진에서 주로 사용되는 방법으로, BM25와 같은 희소 벡터 알고리즘을 통해 키워드 기반 매칭을 진행한다. 특정 도메인 용어를 검색하기에 용이하지만 오타 및 동의어에 취약하다.
Semantic Search : 키워드가 일치하지 않더라도 의미론적으로 유사한 검색 결과를 반환한다. 검색 결과는 임베딩 품질에 의존도가 높다.
Hybrid Search는 각 검색 방법의 장점만을 추려 사용된다. 특정 도메인 용어나 제품 용어가 포함된 쿼리로 검색했을 때도 Lexical Search의 검색 결과를 통해 보조한다. 의미론적으로 유사한 동의어 검색의 경우 및 오타가 일부 포함되더라도 Semantic Search가 벡터 기반으로 가장 가까운 내용을 반환하기 때문에 보다 정확도를 높일 수 있다.</p>
<p>Lexical Search와 Semantic Search의 결과를 결합하는 방법은 크게 총 2가지가 존재한다. CC(Convex Combination), RRF(Reciprocal Rank Fusion)의 2가지 방법으로, 아래와 같이 간단히 요약할 수 있다.</p>
<ul>
<li><p>CC : Lexical Search와 Semantic Search 각각 문서의 모음에 아래와 같이 가중치(α, β)를 부여하여 취합한다.
<img src="https://velog.velcdn.com/images/uiw_min/post/c680a0e6-39cc-46bf-98f6-102bcf8e6e26/image.png" alt=""></p>
</li>
<li><p>RRF : 쿼리를 실행할 때 순위가 매겨진 문서를 반환하며, 취합 시에 상단이 위치한(순위가 높은) 문서에 점수를 부여한다. 이때, k 값은 순위가 낮은 문서의 조정을 위한 상수이다.
<img src="https://velog.velcdn.com/images/uiw_min/post/77d3e656-a525-48ab-b31b-a11e363d0dd3/image.png" alt=""></p>
</li>
</ul>
<p>LangChain을 통한 Hybrid Search 구현 방법
Hybrid Search를 위한 LangChain의 EnsembleRetriever는 각기 다른 쿼리 응답의 조합을 위해 RRF 기법을 채택한다. 아래와 같은 코드로 작성할 수 있겠다. OpenSearchLexicalSearchRetriever를 위한 코드 구성은 링크를 참고할 것을 권장한다.</p>
<pre><code>from langchain.retrievers import EnsembleRetriever
from langchain_community.vectorstores import OpenSearchVectorSearch

vector_db = OpenSearchVectorSearch(
            index_name=index_name,
            opensearch_url=oss_endpoint,
            embedding_function=embeddings,
            http_auth=http_auth, 
            is_aoss =False,
            engine=&quot;faiss&quot;,
            space_type=&quot;l2&quot;
        )

# Sementic Retriever(유사도 검색, 3개의 결과값 반환)
opensearch_semantic_retriever = vector_db.as_retriever(
    search_type=&quot;similarity&quot;,
    search_kwargs={
        &quot;k&quot;: 3
    }
)

search_semantic_result = opensearch_semantic_retriever.get_relevant_documents(query)

opensearch_lexical_retriever = OpenSearchLexicalSearchRetriever(
    os_client=os_client,
    index_name=index_name
)

# Lexical Retriever(키워드 검색, 3개의 결과값 반환)
opensearch_lexical_retriever.update_search_params(
    k=3,
    minimum_should_match=0
)

search_keyword_result = opensearch_lexical_retriever.get_relevant_documents(query)

# Ensemble Retriever(앙상블 검색)
ensemble_retriever = EnsembleRetriever(
    retrievers=[opensearch_lexical_retriever, opensearch_semantic_retriever],
    weights=[0.50, 0.50]
)

search_hybrid_result = ensemble_retriever.get_relevant_documents(query)</code></pre><p>아래와 같이 실제 LLM을 호출할 때 context로 EnsembleRetriever의 결과인 search_hybrid_result를 전달하면 Hybrid Search를 수행할 수 있다.</p>
<h3 id="라마인덱스에서의-hybridsearch-구현">라마인덱스에서의 hybridsearch 구현</h3>
<p>하이브리드 검색에 적합한 Retriever 선택
키워드 검색을 위한 Retriever:</p>
<p>BM25Retriever 또는 SimpleKeywordTableRetriever:
BM25는 텍스트의 빈도와 관련성을 기준으로 순위를 매기는 알고리즘으로, 전통적인 키워드 검색에 적합합니다.
SimpleKeywordTableRetriever는 키워드를 기반으로 문서를 인덱싱하고, 입력된 검색어와 정확히 일치하는 키워드가 포함된 문서를 반환하는 단순한 키워드 검색 방식입니다.
이 중 BM25Retriever가 좀 더 발전된 키워드 검색 방식으로, 문서의 길이와 검색어 빈도를 고려한 순위 계산을 합니다.</p>
<p>시맨틱(유사도) 검색을 위한 Retriever:</p>
<p>EmbeddingRetriever 또는 GPTSimpleVectorRetriever:
EmbeddingRetriever는 문서와 검색어를 임베딩 벡터로 변환하여, 유사도를 기반으로 문서 간의 의미적 연관성을 찾아줍니다.
GPTSimpleVectorRetriever도 비슷하게 GPT나 LLM(대규모 언어 모델)의 임베딩을 사용하여 의미 기반 검색을 수행합니다.
EmbeddingRetriever가 벡터 기반 검색을 처리하는데 적합하고, 특히 LlamaIndex에서는 이러한 임베딩을 사용하여 시맨틱 검색을 처리할 수 있습니다.</p>
<p>하이브리드 검색을 위해 두 가지를 결합하는 방식:</p>
<p>HybridRetriever:
HybridRetriever는 키워드 검색과 시맨틱 검색을 동시에 수행한 후, 두 결과를 결합하여 사용자에게 반환하는 방식입니다.
키워드와 의미적 유사성을 동시에 고려하는 것이 핵심입니다.
HybridRetriever는 검색 결과의 가중치를 조정하여, 특정 검색 방식에 더 큰 비중을 둘 수도 있습니다.
WeightedRetriever:
WeightedRetriever는 다양한 리트리버의 결과에 가중치를 부여하여 결과를 결합할 수 있습니다.
예를 들어, 키워드 검색 결과에 70%, 시맨틱 검색 결과에 30% 가중치를 줄 수 있습니다.</p>
<hr>
<p>SimpleDirectoryReader를 사용하지 않는 이유는 데이터의 형식 때문입니다. 사용자가 제공한 데이터는 Excel 파일 형식으로 되어 있기 때문에, SimpleDirectoryReader 대신 pandas를 사용하여 데이터를 로드하고 처리하는 것이 더 적합합니다.</p>
<hr>
<ol>
<li>ServiceContext
ServiceContext는 임베딩 모델, LLM(대규모 언어 모델), 텍스트 분할기 등 서비스와 관련된 설정을 관리합니다. 주로 문서 처리에 필요한 다양한 설정과 모델을 관리하는 데 사용됩니다.</li>
</ol>
<p>역할:
임베딩 모델: 텍스트를 벡터로 변환하기 위한 모델 설정.
LLM: 질의에 답변을 생성하거나 요약을 수행하는 데 사용되는 대규모 언어 모델 설정.
텍스트 분할기: 긴 문서를 처리할 때 일정한 크기로 나누는 역할을 하는 문서 분할기 설정.
기타 서비스 관련 설정: 다른 외부 API와의 상호작용을 포함한 여러 서비스 관련 설정을 관리.</p>
<ol start="2">
<li>StorageContext
StorageContext는 인덱스 데이터를 저장하고 불러오는 방법을 관리합니다. 즉, 생성된 인덱스와 벡터 데이터를 디스크 또는 <strong>데이터베이스(예: Chroma)</strong>와 같은 외부 스토리지에 저장하거나, 이미 저장된 인덱스를 불러오는 역할을 합니다.</li>
</ol>
<p>역할:
인덱스 저장: 생성된 인덱스를 디스크나 데이터베이스에 저장.
인덱스 로드: 이전에 저장된 인덱스를 불러와 재사용.
벡터 스토어 설정: Chroma, Pinecone 등 벡터 스토어를 설정하고 관리.
데이터 관리: 인덱스와 임베딩 벡터를 저장하거나 로드할 때의 관리 작업.</p>
<p>요약:
ServiceContext:
문서 처리 및 임베딩, LLM, 텍스트 분할기 등의 서비스 관련 설정을 관리합니다.
임베딩 모델, LLM, 텍스트 처리 방법 등을 정의하는 데 사용됩니다.
StorageContext:
인덱스 데이터의 저장 및 불러오기를 관리합니다.
벡터 스토어(Chroma, Pinecone 등)를 설정하여 벡터 데이터를 저장하고, 디스크나 외부 스토리지에 인덱스를 저장하거나 로드하는 역할을 합니다.</p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[라마인덱스 구성 개념]]></title>
            <link>https://velog.io/@uiw_min/%EB%9D%BC%EB%A7%88%EC%9D%B8%EB%8D%B1%EC%8A%A4-%EA%B5%AC%EC%84%B1-%EA%B0%9C%EB%85%90</link>
            <guid>https://velog.io/@uiw_min/%EB%9D%BC%EB%A7%88%EC%9D%B8%EB%8D%B1%EC%8A%A4-%EA%B5%AC%EC%84%B1-%EA%B0%9C%EB%85%90</guid>
            <pubDate>Tue, 03 Sep 2024 16:18:29 GMT</pubDate>
            <description><![CDATA[<h2 id="loading">Loading</h2>
<h2 id="indexing">Indexing</h2>
<h3 id="개념">개념</h3>
<p>인덱스(Index)는 사용자 쿼리에 대해 관련 있는 문맥을 빠르게 검색할 수 있도록 해주는 데이터 구조입니다. 라마인덱스(LlamaIndex)에서 인덱스는 검색-증강 생성(RAG) 사용의 기초입니다.</p>
<p>높은 수준에서 인덱스는 _문서(Document)_에서 생성됩니다. 이들은 쿼리 엔진(Query Engines)과 채팅 엔진(Chat Engines)을 구축하는 데 사용되며, 이를 통해 데이터에 대한 질문과 답변, 채팅이 가능해집니다.</p>
<p>인덱스는 노드객체(원본 문서의 chunk를 대표하는)에 데이터를 저장하며, 추가적인 구성 및 자동화를 지원하는 검색기(Retriever) 인터페이스를 노출합니다.
++ 인덱스는 문서의 일부를 나타내는 노드 객체에 데이터를 저장,
++ Node 객체는 원본 문서의 일부를 나타내며, 원본 문서를 작은 덩어리(청크)로 나눈 것이라고 이해</p>
<p>가장 일반적으로 사용되는 인덱스는 VectorStoreIndex이며, 이를 시작하는 가장 좋은 방법은 VectorStoreIndex 사용 가이드를 참조하는 것입니다.</p>
<h2 id="storing">Storing</h2>
<h3 id="개념-1">개념</h3>
<p>LlamaIndex는 외부 데이터를 가져오고(ingesting), 인덱싱하고(indexing), 쿼리하는(querying) 고수준의 인터페이스를 제공합니다.</p>
<p>내부적으로, LlamaIndex는 교체 가능한 저장소 구성 요소를 지원하여 다음과 같은 요소들을 사용자 정의할 수 있습니다:</p>
<ul>
<li>Document stores: 가져온 문서들(예: Node 객체)이 저장되는 곳</li>
<li>Index stores: 인덱스 메타데이터가 저장되는 곳</li>
<li>Vector stores: 임베딩 벡터가 저장되는 곳</li>
<li>Property Graph stores: 지식 그래프가 저장되는 곳 (예: -- -- PropertyGraphIndex에 사용)</li>
<li>Chat Stores: 채팅 메시지가 저장되고 구성되는 곳</li>
</ul>
<p>문서/인덱스 저장소는 공통 키-값(Key-Value) 저장소 추상화에 의존하며, 이는 아래에 더 자세히 설명되어 있습니다.</p>
<p>LlamaIndex는 fsspec이 지원하는 모든 스토리지 백엔드에 데이터를 영구적으로 저장하는 것을 지원합니다. 현재 다음과 같은 스토리지 백엔드를 지원함을 확인했습니다:</p>
<ul>
<li>로컬 파일 시스템</li>
<li>AWS S3</li>
<li>Cloudflare R2</li>
</ul>
<p><img src="https://velog.velcdn.com/images/uiw_min/post/c77b7063-6fba-4711-91da-e1e429b0a589/image.png" alt=""></p>
<h3 id="사용-패턴">사용 패턴</h3>
<p>많은 벡터 저장소(FAISS 제외)는 데이터와 인덱스(임베딩)를 모두 저장합니다. 이는 별도의 문서 저장소나 인덱스 저장소를 사용할 필요가 없음을 의미합니다. 또한, 이 데이터를 명시적으로 저장할 필요도 없으며, 이 과정은 자동으로 이루어집니다. 사용 예시는 새로운 인덱스를 구축하거나 기존 인덱스를 재로드하는 것과 같은 형태를 가집니다</p>
<pre><code>## build a new index
from llama_index.core import VectorStoreIndex, StorageContext
from llama_index.vector_stores.deeplake import DeepLakeVectorStore

# construct vector store and customize storage context
vector_store = DeepLakeVectorStore(dataset_path=&quot;&lt;dataset_path&gt;&quot;)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
# Load documents and build index
index = VectorStoreIndex.from_documents(
    documents, storage_context=storage_context
)


## reload an existing one
index = VectorStoreIndex.from_vector_store(vector_store=vector_store)</code></pre><p>일반적으로 저장소 추상화를 사용하려면 StorageContext 객체를 정의해야 합니다.</p>
<pre><code>from llama_index.core.storage.docstore import SimpleDocumentStore
from llama_index.core.storage.index_store import SimpleIndexStore
from llama_index.core.vector_stores import SimpleVectorStore
from llama_index.core import StorageContext

# create storage context using default stores
storage_context = StorageContext.from_defaults(
    docstore=SimpleDocumentStore(),
    vector_store=SimpleVectorStore(),
    index_store=SimpleIndexStore(),
)</code></pre><h2 id="quering">Quering</h2>
<p>쿼리는 LLM(대규모 언어 모델) 애플리케이션에서 가장 중요한 부분입니다. 배포 가능한 최종 제품을 만드는 방법에 대해 더 알고 싶다면, <em>쿼리 엔진</em> 및 _채팅 엔진_에 대한 내용을 확인하세요.</p>
<p>고급 추론을 도구 사용과 결합하고자 한다면, <em>에이전트(agents)</em> 가이드를 확인해보세요.</p>
<p>쿼리 워크플로우</p>
<p>이벤트 기반의 <em>워크플로우</em> 인터페이스를 사용하여 쉽게 쿼리 워크플로우를 만들 수 있습니다. 자세한 내용은 워크플로우 가이드를 참조하세요.</p>
<p>그 외에도, 쿼리 모듈을 독립적인 구성 요소로 사용하는 방법에 대해 아래에서 확인할 수 있습니다 👇.</p>
<p>쿼리 모듈</p>
<ul>
<li>(Query Engines)</li>
<li>(Chat Engines)</li>
<li>에이전트(Agents)</li>
<li>검색기(Retrievers)</li>
<li>응답 합성기(Response Synthesizers)</li>
<li>라우터(Routers)</li>
<li>노드 후처리기(Node Postprocessors)</li>
<li>구조화된 출력(Structured Outputs)</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>