<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>sixbell.log</title>
        <link>https://velog.io/</link>
        <description>제가요?</description>
        <lastBuildDate>Wed, 31 Jul 2024 06:07:17 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>sixbell.log</title>
            <url>https://images.velog.io/images/yuk_jongwha/profile/1aeca574-b8c3-4182-8c62-9fdeeed3f398/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. sixbell.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/yuk_jongwha" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Intro to LLM ]]></title>
            <link>https://velog.io/@yuk_jongwha/Intro-to-LLM</link>
            <guid>https://velog.io/@yuk_jongwha/Intro-to-LLM</guid>
            <pubDate>Wed, 31 Jul 2024 06:07:17 GMT</pubDate>
            <description><![CDATA[<p>아래 링크의 유튜브를 듣고 정리
<a href="https://www.youtube.com/watch?v=rRpZEGCpNbE">https://www.youtube.com/watch?v=rRpZEGCpNbE</a></p>
<p>위 링크의 영상은 llama를 기준으로 설명하고 있으나,
큰 틀에서 LLM을 구성하는 방식에 대해서 설명하고 있다.</p>
<p>LLM 구성은 생각보다 단순함
파라미터 파일, 실행 파일로 이루어짐</p>
<ol>
<li>파라미터 파일 : 매개변수를 저장하고 있는 파일. </li>
<li>실행 파일 : 파라미터 모델을 신경망 모델에서 실행하는 파일.</li>
</ol>
<p>훈련이란?
엄청난 양의 텍스트를 수집한 후 압축하는 과정으로 이 과정을 통해 &#39;파라미터 파일&#39;을 생성함,</p>
<p>LLM에서의 텍스트 생성
신경망에서 파라미터에 따라 다음 단어를 예측하는 것.
LLM은 텍스트를 &quot;꿈&quot;꾸듯 생성함. 그럴듯한 틀에 맞춰서 데이터 세트를 모방함. 100% 학습에 사용 된 내용을 따라하진 않지만 흡사한 무언가를 제공하는 형태임. 특히 일련번호 같은 경우, 그 일련번호가 맞는지는 상관 없고 &#39;어떤 형태&#39;로 존재하는지 정도는 따라함(주민번호처럼 보이는 무언가를 만들 순 있지만, 가상의 숫자 시퀀스를 만드는 형태)</p>
<p>텍스트 생성은 어떻게 이루어지는가?
흔히 transformer라고 불리는 것을 사용함. 매개변수를 활용해 다음 단어를 뱉게하는 최적화는 가능하지만, 실제 모든 매개변수가 어떤 영향을 주고 있는지는 정확히 알지 못함. 아쉽게도 LLM이 동작하지만 완벽히 어떻게 동작하는지는 모르는 상태임. 대부분 경험적으로 다루어지고 있음.</p>
<p>LLM에서의 데이터
특정 정보를 &#39;저장&#39;하고 있는 형태는 아님. 특정 정보를 얻기 위한 &#39;방향&#39;이 정해져 있음.(reverse curse)</p>
<h3 id="ai-언어모델-구축-단계">AI 언어모델 구축 단계</h3>
<h4 id="사전학습pretraining">사전학습(Pretraining)</h4>
<ol>
<li>많은 양의 텍스트를 수집(10TB ~ )</li>
<li>학습을 시작할 GPU 클러스터 셋업</li>
<li>텍스트를 신경망이 이해할 수 있는 형태로 변환</li>
<li>기본 모델(base model)을 획득</li>
</ol>
<p>단, 훈련에 사용되는 텍스트는 온전히 압축되는 것이 아닌 손실 압축됨.
흔히 이 과정에서 많은 비용이 들어감.</p>
<h4 id="미세조정finetuning">미세조정(Finetuning)</h4>
<ol>
<li>라벨링 지침 작성</li>
<li>고품질의 Q&amp;A 응답, 비교 레이블 준비</li>
<li>파인튜닝</li>
<li>보조 모델(assistant model)을 획득</li>
<li>평가</li>
<li>배포</li>
<li>모니터링, 잘못된 응답 수집 (잘못된 응답에 대한 올바른 응답 준비)</li>
<li>step 1으로 이동해서 반복</li>
</ol>
<ul>
<li>훈련된 모델을 목적에 맞게 학습하는 과정을 뜻함. </li>
<li>이 과정은 앞선 &#39;훈련&#39;보다는 훨씬 저렴하며 데이터의 양보다는 &#39;질&#39;이 중요함. 사전 학습에 사용된 엄청난 양의 인터넷 문서가 아닌, 필요에 따라 만들어진 Q&amp;A 같은 데이터 셋임.</li>
</ul>
<h4 id="강화학습">강화학습</h4>
<p>비교 답변을 통해 성능을 끌어올리는 방법임. 미세조정 된 보조 모델들을 통해 답변을 생성하고, 더 좋은 답변을 선택하여 학습시키는 방법임. 인간과 모델의 협업을 통해서 이루어짐. 요즘은 모델이 생성한 답변만을 가지고 강화학습하는 추세.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[bcrypt를 활용한 패스워드 암호화]]></title>
            <link>https://velog.io/@yuk_jongwha/bcrypt%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%ED%8C%A8%EC%8A%A4%EC%9B%8C%EB%93%9C-%EC%95%94%ED%98%B8%ED%99%94</link>
            <guid>https://velog.io/@yuk_jongwha/bcrypt%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%ED%8C%A8%EC%8A%A4%EC%9B%8C%EB%93%9C-%EC%95%94%ED%98%B8%ED%99%94</guid>
            <pubDate>Sun, 27 Jun 2021 14:20:14 GMT</pubDate>
            <description><![CDATA[<p>이전 포스트에서 sign-up 함수를 통해 db연결까지 간단하게 구현했다.</p>
<p>다만, password가 단순 텍스트로 저장되고 있는 점이 문제였는데 이 부분을 bcrypt를 활용하여 해싱해보자</p>
<p>간단하다 아직 없다면 깔아주고</p>
<blockquote>
<p>pip install bcrypt</p>
</blockquote>
<p>가져다 쓸 때는</p>
<blockquote>
<p>import bcrypt</p>
</blockquote>
<p>기존에 구현했던 sign-up을 가져와서 password를 bcrypt를 이용해서 해싱하고 저장하자</p>
<pre><code>@app.route(&#39;/sign-up&#39;, methods=[&#39;POST&#39;])
def sign_up():
    new_user = request.json
        new_user[&#39;password&#39;] = bcrypt.hashpw(
        new_user[&#39;password&#39;].encode(&#39;utf-8&#39;), bcrypt.gensalt()
        )

        new_user_id = insert_user(new_user)
        check_user = str(new_user_id)

        if check_user is None :
            return &#39;fail&#39;, 400

        return check_user, 200
</code></pre><p>변경한 코드로 회원가입 
<img src="https://images.velog.io/images/yuk_jongwha/post/527c68f5-73a0-4bab-9e20-acbe9bc28634/image.png" alt=""></p>
<p>password 상태
<img src="https://images.velog.io/images/yuk_jongwha/post/12b8ffd2-26cc-499b-aa47-5590c36203aa/image.png" alt=""></p>
<p>확실히 안전해졌다.</p>
<p>+추가
bcrypt가 하는 일은 다음과 같다</p>
<p>+salting : 음식에 간을 더 하듯 랜덤한 데이터를 더 해서 해싱한다. 어찌저찌하여 데이터를 추출하더라도 어디서부터 어디까지가 기존 데이터인지 알 수 없게 한다. 일련의 해시 데이터를 쭉 넣어서 공격하는 rainbow attack에 효과적이다.</p>
<p>+key streching
기존 단방향 해시 알고리즘의 실행 속도가 너무 빠르다는 취약점을 보완하기 위해서 N번의 해싱을 반복하는 것이 키 스트레칭이다. 물론 애초에 알고리즘 실행속도가 매우 빠르기 때문에 인증 실패를 적절하게 제한하여 사용하면 좋다.</p>
<p>도식화하면</p>
<ol>
<li><p>salt data + password</p>
</li>
<li><p>N times hashing</p>
</li>
<li><p>Hash result (+ 접근 횟수 제한 = 별도 구현)</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[flask + mysql (2)]]></title>
            <link>https://velog.io/@yuk_jongwha/flask-mysql-2</link>
            <guid>https://velog.io/@yuk_jongwha/flask-mysql-2</guid>
            <pubDate>Sun, 27 Jun 2021 13:34:26 GMT</pubDate>
            <description><![CDATA[<p>이전 글에서 app.py에 config.py를 연결해보았다.</p>
<p>database에 접근하는 방법을 구현했으니, 회원가입 함수를 구현하고 테이블에 회원 정보를 저장해보자</p>
<p>created_app 내부에 다음과 같이 sign-up route를 만들어주자.</p>
<pre><code>@app.route(&#39;/sign-up&#39;, methods=[&#39;POST&#39;])
def sign_up():
    new_user = request.json
    new_user_id = insert_user(new_user)
    check_user = str(new_user_id)

    if check_user is None :
        return &#39;fail&#39;, 401

    return check_user, 200</code></pre><p>위 함수가하는 일은 간단하다. 아래에 구현하겠지만 요청에 담겨온 json을 읽고 insert_user에 던져준다. </p>
<p>insert_user에서 정상적으로 user를 insert하게 되면 insert한 유저의 uid를 리턴 받고, 성공 여부를 리턴하는 함수다.</p>
<pre><code>def insert_user(user):
    return current_app.database.execute(text(&quot;&quot;&quot;
        INSERT INTO users(
            name,
            email,
            profile,
            hashed_password
        ) VALUES (
            :name,
            :email,
            :profile,
            :password
        )
    &quot;&quot;&quot;) user).lastrowid</code></pre><p>요렇게 구성하면 다음과 같이 리턴을 받아볼 수 있다.</p>
<p><img src="https://images.velog.io/images/yuk_jongwha/post/d13f4311-2708-403d-8e51-5afff560e840/image.png" alt=""></p>
<p>이건 DB 상태
<img src="https://images.velog.io/images/yuk_jongwha/post/65b1592a-7580-42f9-ace4-a69a3faac0ce/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[flask + mysql (1)]]></title>
            <link>https://velog.io/@yuk_jongwha/flask-mysql</link>
            <guid>https://velog.io/@yuk_jongwha/flask-mysql</guid>
            <pubDate>Sun, 27 Jun 2021 12:11:24 GMT</pubDate>
            <description><![CDATA[<p>flask 기반의 프로젝트에서 mysql database에 접근하는 방법이다.</p>
<p>간단하게 회원가입을 구현하기 위해 다음과 같은 users 테이블을 하나 만든다.</p>
<p><img src="https://images.velog.io/images/yuk_jongwha/post/4ece75cf-45ec-4f2c-9877-214dafd2c18d/image.png" alt=""></p>
<p>회원가입을 하기 위해서 여러 검증과정을 거쳐야 하지만 여기서는 다음과 같이 간단히 구현해본다.</p>
<ol>
<li><p>name, email, password, profile 정보를 입력 받는다.</p>
</li>
<li><p>이 때, email 은 중복이 불가능하다.</p>
</li>
<li><p>request가 요구사항에 맞으면, 회원가입을 완료하며 유저 테이블에 insert한다.</p>
</li>
</ol>
<p>위 내용을 위해 app.py에서 생성한 database에 접근할 수 있도록 config.py에 관련 내용을 정리한다.</p>
<p>config.py에는 다음과 같은 정보를 넣는다</p>
<pre><code>db = {
    &#39;user&#39; : &#39;db 설정시 입력한 user&#39;,
    &#39;password&#39; : &#39;설정한 비밀번호&#39;,
    &#39;host&#39; : &#39;localhost&#39;, (dev이기 때문에)
    &#39;port&#39; : 설정한 포트 넘버,
    &#39;database&#39; : &#39;만든 database 이름&#39;
    }

DB_URL = f&quot;mysql+mysqlconnector://{db[&#39;user&#39;]}:{db[&#39;password&#39;]}@{db[&#39;host&#39;]}:{db[&#39;port&#39;]}/{db[&#39;database&#39;]}?charset=utf8&quot;</code></pre><p>config.py를 app.py에서는 다음과 같이 호출한다.</p>
<pre><code>def create_app(config):
    app = Flask(__name__)

    if config is None:
         app.config.from_pyfile(&quot;config.py&quot;)


     database = create_engine(app.config[&#39;DB_URL&#39;], encoding=&#39;utf-8&#39;, max_overflow=0)
     app.database = database

     return app
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[mysql 다운]]></title>
            <link>https://velog.io/@yuk_jongwha/mysql-%EB%8B%A4%EC%9A%B4</link>
            <guid>https://velog.io/@yuk_jongwha/mysql-%EB%8B%A4%EC%9A%B4</guid>
            <pubDate>Sun, 27 Jun 2021 11:05:07 GMT</pubDate>
            <description><![CDATA[<p>이 윈도우 컴터에는 안깔려 있는 설정이 너무 많다..</p>
<p>flask를 이용한 api 구성에 mysql을 사용할 것이므로 mysql를 다운로드한다.</p>
<p>window 버전이므로..</p>
<p><a href="https://dev.mysql.com/downloads/windows/installer/8.0.html">https://dev.mysql.com/downloads/windows/installer/8.0.html</a></p>
<p>위 링크에서 용량 많은걸 받아본다.</p>
<p>그대로 쭉 설치해주면 OK</p>
<p>+추가</p>
<p>잘 설치한 후에 터미널에서 mysql 명령어를 입력해도 먹히지 않은 경우... 보통 환경변수 추가를 하지 않아서 일어난다.</p>
<p>환경변수를 추가해주자!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[stateless]]></title>
            <link>https://velog.io/@yuk_jongwha/stateless</link>
            <guid>https://velog.io/@yuk_jongwha/stateless</guid>
            <pubDate>Sun, 27 Jun 2021 08:25:50 GMT</pubDate>
            <description><![CDATA[<p>http 통신 방식의 특징 중 하나이다.</p>
<p>http 프로토콜은 기본적으로 request와 response 구조를 가지고 있다. </p>
<p>백엔드 api를 구현할 때 이런 구조적 특성이 반영되어 http 요청을 input으로, 응답을 output으로 가져간다.</p>
<p>이런 구조에서 각각의 http 통신은 &#39;독립적&#39;이며 그전에 처리 된 통신에 대해서는 알지 못 한다.</p>
<p>그렇기때문에 stateless라는 특성을 가지게 된다.</p>
<p>이런 특성 덕분에 http 통신들의 상태를 서버에서 저장할 필요가 없어지고 서버 디자인이 훨씬 간단해지는 장점을 가질 수 있다.</p>
<p>단점은.. 서버는 각 요청의 상태를 모르기 때문에 로그인 여부라던지 이런 상태 값을 클라단에서 잘 관리해줘야 한다. (session, cookie 등)</p>
<p>필요한 상태, 로그인 여부 등을 클라에서 잘 관리하고 있다가 서버 통신을 요청할 때 잘 넣어서 보내주면 된다.</p>
<p>결론 : 요청을 잘 받고, 응답 값을 잘 돌려주면 된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[flask run (on windows)]]></title>
            <link>https://velog.io/@yuk_jongwha/flask-run-on-windows</link>
            <guid>https://velog.io/@yuk_jongwha/flask-run-on-windows</guid>
            <pubDate>Sun, 27 Jun 2021 08:13:31 GMT</pubDate>
            <description><![CDATA[<p>mac os 에서는 터미널 다루는게 이숙하지만, 13인치가 너무 눈이 아프므로.. 윈도우 데탑에서 큰 화면으로 스터디를 진행하기 위해 각종 세팅을 진행해본다.</p>
<p>cmd에서도 flask run을 실행하는 방법</p>
<p>mac os 기준으로는</p>
<blockquote>
<p>FLASK_APP=name.py FLASK_DEBUG=1(optional) flask run </p>
</blockquote>
<p>정도로 정리가 가능하다.</p>
<p>windows cmd 는 조금 다르다.
set 명령어를 통해 어떤 flask 기반의 .py 파일을 구동할 것인지 설정해줘야한다.</p>
<blockquote>
<p>set FLASK_APP=name.py
app.py</p>
</blockquote>
<p>이 경우 </p>
<blockquote>
<p>python name.py </p>
</blockquote>
<p>cmd에서 구동되는 방식하고는 조금 다르게 flask run을 구성할 수 있다.</p>
<p>코드는 아래와 같이 구성된다.</p>
<pre><code>from flask import Flask

app = Flask(__name__)

@app.route(&#39;/ping&#39;, methods=[&#39;GET&#39;])
def ping():
    return &quot;pong&quot;</code></pre><p>아래 코드가 없어도 정상적으로 구동</p>
<pre><code>if __name__ == &#39;__main__&#39;:
    app.run()</code></pre><p>flask run
<img src="https://images.velog.io/images/yuk_jongwha/post/7532190a-9f01-47ef-aba8-3d15865b495e/image.png" alt=""></p>
<p>httpie를 통한 통신
<img src="https://images.velog.io/images/yuk_jongwha/post/aac98e27-a714-4ee7-a4a0-61994a1617d1/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[flask를 이용한 api 구현 (/ping)]]></title>
            <link>https://velog.io/@yuk_jongwha/flask%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-api-%EA%B5%AC%ED%98%84-ping</link>
            <guid>https://velog.io/@yuk_jongwha/flask%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-api-%EA%B5%AC%ED%98%84-ping</guid>
            <pubDate>Sun, 27 Jun 2021 08:00:20 GMT</pubDate>
            <description><![CDATA[<p>flask를 활용하여 api 를 구현해보자</p>
<p>간단히 서버에 ping을 보내고, pong을 응답으로 받는 것을 구현해본다.</p>
<pre><code>from flask import Flask

app = Flask(__name__)

@app.route(&#39;/ping&#39;, methods=[&#39;GET&#39;]
def ping():
    return &quot;pong&quot;, 200

if __name__ = &#39;__main__&#39;:
    app.run()</code></pre><p>심플하다 flask 를 기반으로 app을 생성하고, 
endpoint에 해당하는 &#39;/ping&#39;의 루트를 정의해준다.</p>
<p>외부에서 endpointsurl/ping 을 호출하면, pong이라는 텍스트를 리턴한다.</p>
<p>cmd에서 app.py를 실행해보자.
<img src="https://images.velog.io/images/yuk_jongwha/post/e848eb3e-9169-4343-9d92-3f18e87bfa86/image.png" alt=""></p>
<p>localhost:5000/ping
<img src="https://images.velog.io/images/yuk_jongwha/post/cfe403ae-54dd-460e-9dcc-7d8b68e1da9e/image.png" alt=""></p>
<p>성공적으로 호출 및 응답</p>
]]></description>
        </item>
    </channel>
</rss>