<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>joshua_1203.log</title>
        <link>https://velog.io/</link>
        <description>🐥삐약이 개발자🐤</description>
        <lastBuildDate>Wed, 26 Mar 2025 14:01:29 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>joshua_1203.log</title>
            <url>https://velog.velcdn.com/images/joshua_1203/profile/d54af0a0-f0a4-477a-a653-0829d12f8ab7/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. joshua_1203.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/joshua_1203" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[🥇 2025년 AWS 자격증 무료로 취득하기 (AWS 바우처)[‼️ 현재 서비스 종료 😭]]]></title>
            <link>https://velog.io/@joshua_1203/AWS-voucher</link>
            <guid>https://velog.io/@joshua_1203/AWS-voucher</guid>
            <pubDate>Wed, 26 Mar 2025 14:01:29 GMT</pubDate>
            <description><![CDATA[<p>개발을 하면서 사용할 수 있는 많은 클라우드 서비스가 있지만 아직 부동의 1위는 AWS 인 것 같다.
워낙 많은 회사에서 사용하고 있기도 하고, 나도 회사에서 사용하는 클라우드 서비스이기도 하다.</p>
<p>그래서인지 AWS에서 무료로 제공해 학습할 수 있는 스킬 빌더도 있고, 관련 포스팅도 많다.
처음에는 다소 어렵다고 생각이 들 수 있지만 익숙해지면 그만큼 편해진다👌.</p>
<p>하지만 익숙해질 수 없는 것이 있는데 바로 <strong>AWS 자격증 가격</strong>이다 ㅠㅠ</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/031d8046-0adf-4dc7-90ca-2567e08c53e2/image.png" alt=""></p>
<p><a href="https://aws.amazon.com/ko/certification/policies/before-testing/">https://aws.amazon.com/ko/certification/policies/before-testing/</a></p>
<p>공식 사이트에 있는 AWS 자격증 응시료....
<strong>가장 기본 자격증이 13만원이라니....! 💰</strong></p>
<p>그러다 8월 31일까지 쓸 수 있는 바우처가 있다는 걸 알게 되었는데,
무려 <strong>시험 금액의 100%를 지원(사실상 무료라는 소리)</strong> 해준다고 한다.
하지만 절차가 자세하게 나와있는 곳이 없어서 여기저기 있는 정보를 가져와서 직접 해봤다.</p>
<p><strong>But</strong>, <em>절차가 조금 번거롭고, 바우처를 받기까지 시간과 노력이 필요해서</em>  하나하나 차근차근 해야 한다.
<del>하지만 최소 10만원은 세이브할 수있는데 이정도쯤이야</del>
<img src="https://velog.velcdn.com/images/joshua_1203/post/f7f99efb-fae5-44de-8d27-18df5a9dab8b/image.png" alt=""></p>
<hr>
<h2 id="0-📌-aws-인증-시험-100-할인-바우처-요약">0. 📌 AWS 인증 시험 100% 할인 바우처 요약</h2>
<blockquote>
</blockquote>
<h3 id="✅-제공-시험">✅ 제공 시험:</h3>
<ul>
<li><strong>AWS Foundational</strong> : Certified Cloud Practitioner or AWS Certified AI Practitioner.</li>
<li><strong>AWS Associate</strong> : Solutions Architect Associate, Developer Associate, SysOps Administrator Associate, Data Engineer Associate, or Machine Learning Engineer Associate.<blockquote>
</blockquote>
<h3 id="✅-바우처-획득-조건">✅ 바우처 획득 조건:</h3>
</li>
<li>AWS Skill Builder 시험 준비 과정 이수</li>
<li>AWS Skill Builder <strong>연습 시험 또는 공식 연습 문제 세트에서 80% 이상 득점</strong> (최소 1개 완료)</li>
<li>AWS Educate 이메일과 AWS Skill Builder 이메일이 동일해야 함<blockquote>
</blockquote>
<h3 id="✅-유의-사항">✅ 유의 사항:</h3>
</li>
<li>바우처 만료일: <strong>2025년 8월 31일까지 사용</strong>해야 함 (시험까지 완료)</li>
<li>1인당 1개 바우처만 제공 (양도 및 재판매 불가)</li>
<li>AWS는 보상 혜택을 수정 또는 취소할 수 있음</li>
<li>AWS Educate 이메일로 발송되며, 재발행 불가</li>
<li>세금 및 법적 책임은 개인 부담</li>
</ul>
<hr>
<h2 id="1-📌-aws-educate-skillbuilder-회원가입">1. 📌 AWS educate, skillbuilder 회원가입</h2>
<ul>
<li><strong>AWS educate URL</strong> : <a href="https://aws.amazon.com/education/awseducate/">https://aws.amazon.com/education/awseducate/</a></li>
</ul>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/19975685-2956-4242-9d6f-8f4658a1388c/image.png" alt=""></p>
<p>여기에서 educate 회원가입을 하고, </p>
<ul>
<li><strong>AWS skillbuilder URL</strong> : <a href="https://explore.skillbuilder.aws/learn">https://explore.skillbuilder.aws/learn</a></li>
</ul>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/a75bbc29-c30d-4531-ac63-ee2fe35cf2e7/image.png" alt=""></p>
<p>여기에서 skillbuilder 회원가입을 하면 된다.</p>
<p><strong>❗️ 중요한건, 두 사이트의 이메일이 동일해야 한다는 것 !!!</strong></p>
<hr>
<h2 id="2-📌-연습-시험-응시">2. 📌 연습 시험 응시</h2>
<ul>
<li><p><strong>Associate</strong>
<a href="https://explore.skillbuilder.aws/learn/courses/15000/solutions-architect-knowledge-badge-assessment/lessons">https://explore.skillbuilder.aws/learn/courses/15000/solutions-architect-knowledge-badge-assessment/lessons</a></p>
</li>
<li><p><strong>Foundational</strong>
<a href="https://explore.skillbuilder.aws/learn/courses/15782/cloud-essentials-knowledge-badge-assessment/lessons">https://explore.skillbuilder.aws/learn/courses/15782/cloud-essentials-knowledge-badge-assessment/lessons</a>
<img src="https://velog.velcdn.com/images/joshua_1203/post/7cac0cec-de59-4b0a-b4ed-ee6fdb886657/image.png" alt=""></p>
</li>
</ul>
<p>나는 이 두 가지 시험을 모두 응시했다.
본인이 원하는 자격증의 연습 시험만 응시해도 된다.</p>
<blockquote>
</blockquote>
<ul>
<li><strong>시험 설명</strong><blockquote>
<p>이 평가는 Solutions Architect Knowledge Badge Readiness Path에 대한 이해도를 검증한다.  </p>
</blockquote>
</li>
<li><em>50문제, 객관식*</em>으로 진행되며 80% 이상의 점수를 받으면 Architecting Knowledge 배지를 받을 수 있다. (배지는 5~7일 이내에 발급됨)<blockquote>
</blockquote>
80% 이상을 받지 못하는 경우 <strong>24시간 대기 기간 후</strong>에 평가를 다시 받을 수 있다. 평가 문제는 각 시험마다 <strong>무작위</strong>로 지정됨</li>
</ul>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/0abb2fb5-eef1-4287-8074-662bb3b76c80/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/1246325f-d93c-413f-8c47-65fd7da8e5ff/image.png" alt=""></p>
<p>ㅋㅋㅋㅋㅋㅋㅋㅋ
아무 생각 없이 봤다가 40점 맞음.... 😅</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/855b53ff-c76f-4357-8299-53a45d0a679d/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/d1e23cea-b9b8-4e58-961c-ac22bf190a1a/image.png" alt=""></p>
<p>그래도 다시 시험볼 수 있어서 금방 배지를 획득할 수 있었다.</p>
<hr>
<h2 id="3-📌-emerging-talent-community-승인-받기">3. 📌 Emerging Talent Community 승인 받기</h2>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/dde3b48c-b5dc-402a-ab6a-4a12d19886f8/image.png" alt="">
엥</p>
<p>처음 화면에 들어가면 아무것도 안나와서 당황할 수 있다 
아래에 있는 <strong>코스 선택</strong>을 눌러서 </p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/2219c089-8ea4-4697-8f73-46bf9fd0bb12/image.png" alt=""></p>
<p>아무거나 수강하고 조금 기다리면(최대 하루정도 걸리는 것 같다)</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/3a8f513c-c80d-4e99-97b3-50aaf1dad5f1/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/9cecfa1b-01fb-441d-b583-1adc91067f8d/image.png" alt=""></p>
<p>이렇게 메일을 받아볼 수 있다.
그럼 이제 준비가 끝난 것이다 !</p>
<hr>
<h2 id="4-📌-포인트-획득하기">4. 📌 포인트 획득하기</h2>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/f878d26f-86a2-47a4-bd0f-378c6d310d17/image.png" alt=""></p>
<p>그럼 이제 포인트가 붙은 화면이 나오게 되는데 <strong>설문조사, 블로그 글 읽기, 간단한 문제 풀이 등</strong>을 통해 포인트를 조금씩 쌓을 수 있게 된다.</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/dd70e353-e1a9-480c-9d7e-227268e7d16d/image.png" alt=""></p>
<p>100포인트 주세요 🙃 !!
<img src="https://velog.velcdn.com/images/joshua_1203/post/ec6380af-3406-4ef3-8a70-a9008ce077e6/image.png" alt=""></p>
<p>지금 나와있는 컨텐츠들을 한번에 하면 <strong>약 2000~ 3000 포인트까지</strong> 받을 수 있을 것이다.
<strong>1~2주마다 6개씩 업데이트</strong> 된다고 하니 지금부터 조금씩 모으면 8월까지 바우처를 획득할 수 있다 !!</p>
<hr>
<h2 id="5-📌-바우처-수령하기">5. 📌 바우처 수령하기</h2>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/121d8d0b-318d-47d7-a3e5-442c0b5b942d/image.png" alt=""></p>
<p>드롭다운에서 <strong>리워드</strong> 창으로 들어가면</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/7f6d575c-df5c-4b72-91f1-3ecf359b12b3/image.png" alt=""></p>
<p>이렇게 포인트로 바우처를 획득할 수 있는 창이 나오는데,
<strong>아직 포인트를 다 모으지 못해서 할 수가 없다 ^^;;ㅎㅎ</strong>
다 모으고 바우처까지 받게 되면 포스팅을 업데이트 할 예정이다 😊!!</p>
<hr>
<h4 id="😇-여담">😇 여담</h4>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/52f77cd7-a2f6-4bec-a026-a9e6ed5b586d/image.png" alt=""> 이 뜬금 없는 디지털 배경뭘까
포인트 다 모으면 하나 갖고 싶어졌음 ㅋㅋㅋㅋ</p>
<p>열심히 모아서 시험보는 그날까지,
틈틈히 공부하면서 포인트를 모아보자 !!!
<del>이게 바로 짠테크</del>
<img src="https://velog.velcdn.com/images/joshua_1203/post/fb3fffd2-a1bc-478c-b497-18e23a1a1e6a/image.png" alt=""></p>
<hr>
<h2 id="6-📌-참고-자료">6. 📌 참고 자료</h2>
<p>거의 유일한 한국어 블로그.. 감사합니다 많이 참고했습니다 !!
<a href="https://tabmania.tistory.com/m/entry/AWS-100-voucher-%ED%9A%8D%EB%93%9D%EB%B0%A9%EB%B2%95-2025%EB%85%84-8%EC%9B%94-31%EC%9D%BC">https://tabmania.tistory.com/m/entry/AWS-100-voucher-%ED%9A%8D%EB%93%9D%EB%B0%A9%EB%B2%95-2025%EB%85%84-8%EC%9B%94-31%EC%9D%BC</a></p>
<p>인도 분의 설명 자료. 관련 직원 분이신거 같은데 잘 모르겠음 ^^;;ㅎㅎ
<a href="https://dev.to/nikhil_nareddula_/100-free-certification-voucher-for-foundational-associate-level-1ce8">https://dev.to/nikhil_nareddula_/100-free-certification-voucher-for-foundational-associate-level-1ce8</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[LLM과 시계열 분석의 만남: "Time-LLM"]]></title>
            <link>https://velog.io/@joshua_1203/Time-LLM</link>
            <guid>https://velog.io/@joshua_1203/Time-LLM</guid>
            <pubDate>Thu, 27 Feb 2025 23:53:33 GMT</pubDate>
            <description><![CDATA[<h4 id="⏱️-time-llm-거대-언어-모델-시계열-분석의-새로운-패러다임을-열다"><em>⏱️ Time-LLM: 거대 언어 모델, 시계열 분석의 새로운 패러다임을 열다</em></h4>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/78718ad5-e9dd-4bef-bedd-1c88bd7fe2a5/image.png" alt=""></p>
<p>요즘 정말 바쁜 생활을 보내고 있어서
주 1회 벨로그 발행이라는 말이 무색하게 ^^; 한달만에 등장
논문을 읽기도 하고, 여러가지 데이터도 분석하며 보내고 있는데
그러던 와중 정말 신선한 분야를 발견했다. <strong>시계열 분석에 LLM을 활용하자고?</strong>
<img src="https://velog.velcdn.com/images/joshua_1203/post/a5e3cfc3-2c2d-4570-8bf9-a4b2b695c38f/image.png" alt="">
<a href="https://opentimeseries.com/python_packages/llm_for_time_series/">https://opentimeseries.com/python_packages/llm_for_time_series/</a></p>
<p>조금 찾아보니 time-llm 말고도 시계열 분석 및 예측을 위한 다양한 모델이 많고, 시계열 데이터와 llm의 관계도 복잡했다. 나는 삐약이 이기 때문에 🐥 이번 포스팅은 &#39;이런 것도 있습니다!&#39; 하고 간단히 소개하려고 한다.</p>
<p>시계열 foundation model에 대해 조금 더 자세한 내용을 알아보고 싶다면 LG research 블로그를 참고하면 좋다. 정말 깔끔히 정리가 되어 있다.
<a href="https://www.lgresearch.ai/blog/view?seq=427">https://www.lgresearch.ai/blog/view?seq=427</a></p>
<hr>
<h2 id="🕵️♀️-개요">🕵️‍♀️ 개요</h2>
<p>시계열 데이터는 금융 시장 예측부터 기상 변화 모델링, 전력 소비 패턴 분석까지 다양한 분야에서 핵심적인 역할을 한다. 전통적으로 이러한 시계열 예측에는 <strong>ARIMA, 지수 평활법, LSTM과 같은 딥러닝 모델</strong>이 사용되어 왔다. 그러나 최근 인공지능 분야가 빠르게 성장하면서 시계열 분석에도 혁신적인 접근법이 등장했는데, 바로 대규모 언어 모델(LLM)을 활용한 <strong>Time-LLM</strong>이다.</p>
<p>Time-LLM은 <strong>거대 언어 모델(LLM)의 강력한 언어 처리 능력을 시계열 예측에 활용</strong>하는 새로운 패러다임이다. 이번 포스팅에서는 Time-LLM의 기본 개념부터 주요 방법론, 성능과 장단점, 그리고 최신 연구 동향까지 자세히 살펴보려 한다.</p>
<p><strong>📢 요약</strong></p>
<ul>
<li><strong>핵심 개념</strong>: 시계열 데이터를 텍스트로 변환하여 LLM에 입력, 언어 처리 능력을 활용하여 예측</li>
<li><strong>주요 방법론</strong>: 입력 임베딩, Cross Attention 메커니즘, Time-LlaMA 프레임워크</li>
<li><strong>장점</strong>: 장기 및 단기 예측 능력 향상, 도메인 지식 통합 용이</li>
<li><strong>한계</strong>: 장기 종속성 학습의 어려움, 도메인 지식 완전 포착의 어려움
<img src="https://velog.velcdn.com/images/joshua_1203/post/6c9c24ad-710b-4e14-bf7e-19ec16f25fb4/image.png" alt=""></li>
</ul>
<hr>
<h2 id="📚-1-time-llm이란-">📚 1. Time-LLM이란 ?</h2>
<p>Time-LLM은 간단히 말해 <strong>시계열 데이터를 텍스트 형태로 변환하여 LLM이 이해하고 예측할 수 있도록 하는 방법</strong>이다. 기존의 시계열 분석 모델과는 달리, Time-LLM은 LLM의 방대한 지식과 추론 능력을 활용하여 더욱 정확하고 유연한 예측을 가능하게 한다.</p>
<h4 id="🤔-왜-시계열-데이터를-텍스트로-변환해야-할까"><strong>🤔 왜 시계열 데이터를 텍스트로 변환해야 할까?</strong></h4>
<p>LLM은 텍스트 데이터를 기반으로 학습되었기 때문에, 시계열 데이터와 같은 비정형 데이터를 직접 처리하는 데 어려움이 있다. 따라서 시계열 데이터를 텍스트 형태로 변환함으로써 <strong>LLM이 데이터를 이해하고 패턴을 파악할 수 있도록</strong> 하는 것 !</p>
<h4 id="🕹️-time-llm의-작동-방식">🕹️ Time-LLM의 작동 방식</h4>
<blockquote>
</blockquote>
<p><strong>1) 데이터 변환</strong>
시계열 데이터를 텍스트 기반의 표현으로 변환</p>
<blockquote>
</blockquote>
<p><strong>2) 프롬프트 설계</strong>
프롬프트를 접두사로 사용하는 방식(Prompt-as-Prefix, PaP)을 적용. 이 방법을 통해 모델에게 &quot;다음 값을 예측하라&quot;와 같은 지시를 효과적으로 전달할 수 있음.</p>
<blockquote>
</blockquote>
<p><strong>3) LLM 처리</strong>
변환된 텍스트와 프롬프트를 LLM에 입력하여 예측 수행. 이 과정에서 LLM은 방대한 학습 데이터에서 얻은 패턴 인식 능력을 활용.</p>
<blockquote>
</blockquote>
<p><strong>4) 출력 변환</strong>
LLM이 생성한 텍스트 출력을 다시 시계열 형식으로 변환하여 최종 예측 결과를 얻음.</p>
<hr>
<h2 id="📚-2-time-llm의-주요-방법론">📚 2. Time-LLM의 주요 방법론</h2>
<p>Time-LLM은 다양한 방법론과 구성 요소를 통해 시계열 예측을 수행한다.</p>
<blockquote>
</blockquote>
<ul>
<li><strong>입력 임베딩</strong>: 시계열 데이터를 전처리한 후 텍스트 형태로 인코딩함. 결측값 처리, 데이터 스케일링 및 정규화 등의 과정 포함.</li>
<li><strong>Cross Attention 메커니즘</strong>: 인코딩된 시계열 데이터 중 현재 예측 작업과 가장 관련성이 높은 부분에 집중하도록 함. 어텐션 메커니즘을 통해 구현.</li>
<li><strong>Time-LlaMA 프레임워크</strong>: 시간 시계열 토큰화 모듈, 모달리티 정렬 모듈, 동적 저랭크 적응(D-LoRA) 등<ul>
<li><strong>시간 시계열 토큰화 모듈</strong>: 시계열 데이터를 토큰 임베딩으로 변환.</li>
<li><strong>모달리티 정렬 모듈</strong>: 시계열 임베딩을 자연어로 표현된 프롬프트의 임베딩과 정렬. 다중 헤드 크로스 어텐션(MHCA) 레이어를 사용.</li>
<li><strong>동적 저랭크 적응(D-LoRA)</strong>: 입력에 따라 LoRA 모듈을 다르게 할당하여 예측 능력 향상.</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/fe692753-5687-4787-b1b6-a43bf1d84ebc/image.png" alt=""></p>
<p>(시간의 흐름에 대해 이미지를 만들어달라고 했더니 gemini가 이렇게 예쁜걸 줬다. 대박. 맘에 들어)</p>
<hr>
<h2 id="📚-3-time-llm의-성능과-장단점">📚 3. Time-LLM의 성능과 장단점</h2>
<p>Time-LLM은 기존 시계열 분석 모델에 비해 다음과 같은 장점을 가진다.</p>
<blockquote>
</blockquote>
<ul>
<li><strong>장기 예측</strong>: LLM은 기존 모델이 놓칠 수 있는 장기적인 종속성과 맥락 정보를 포착할 수 있다. 프롬프트를 통해 도메인 지식을 통합하여 장기 예측을 개선할 수 있다.<blockquote>
</blockquote>
</li>
<li><strong>단기 예측</strong>: LLM은 텍스트 데이터 내에서 단기 패턴과 관계를 식별하는 데 탁월하며, 프롬프트 기반 접근 방식이 특정 단기 추세나 이상 징후에 집중할 수 있다.<blockquote>
</blockquote>
</li>
<li><strong>퓨-샷 예측</strong>: LLM은 사전에 학습한 일반적인 언어 처리 기술을 활용하여 제한된 데이터로 새로운 작업에 적응할 수 있다.<blockquote>
</blockquote>
</li>
<li><strong>제로-샷 예측</strong>: LLM은 사전에 학습한 지식으로 데이터 없이 작업을 수행할 수 있는 능력을 갖추고 있다. 특정 데이터 없이도 예측 작업과 도메인 지식을 설명하도록 Time-LLM의 프롬프트를 만들 수 있다.</li>
</ul>
<p>하지만 다른 모델들도 그렇듯이 Time-LLM도 단점이 존재한다.</p>
<blockquote>
</blockquote>
<ul>
<li><strong>장기 종속성 학습의 어려움</strong>: 장기 종속성은 본질적으로 노이즈가 많고 학습하기 어려울 수 있으며, 전문화된 방법에 비해 Time-LLM의 장기 정확도에 영향을 미칠 수 있다.<blockquote>
</blockquote>
</li>
<li><strong>도메인 지식 완전 포착의 어려움</strong>: 단기 예측은 특정 도메인 지식과 데이터 특성에 크게 의존하는 경우가 많으며, 이는 텍스트 인코딩과 프롬프트를 통해 완전히 포착되지 않을 수 있다.<blockquote>
</blockquote>
</li>
<li><strong>해석 가능성</strong>
LLM 기반 모델의 일반적인 한계인 &quot;블랙박스&quot; 특성은 Time-LLM에도 적용된다. 모델이 어떻게 특정 예측에 도달했는지 설명하기 어려울 수 있다.<blockquote>
</blockquote>
</li>
<li><strong>계산 비용</strong>
대규모 언어 모델을 운영하는 데 필요한 계산 자원은 상당한데, 이는 자원이 제한된 환경에서 Time-LLM 채택의 장벽이 될 수 있다.</li>
</ul>
<hr>
<h2 id="📚-4-time-llm-최신-연구-동향">📚 4. Time-LLM 최신 연구 동향</h2>
<p>최근 연구에서는 Time-LLM을 활용한 시계열 이상 탐지, 모델별 성능 비교 등에 대한 논의가 활발하게 이루어지고 있다.</p>
<blockquote>
</blockquote>
<ul>
<li><strong>시계열 이상 탐지</strong>
LLM이 시계열 데이터를 제대로 이해하고 이상을 탐지할 수 있는지에 대한 연구가 진행되고 있는데, <strong>시각화된 시계열 데이터</strong>를 처리할 때 성능이 향상되며, 복잡한 추론 없이 인간의 인식과는 다른 방식으로 이상을 탐지할 수 있다는 결과가 나왔다고 한다.<blockquote>
</blockquote>
</li>
<li><strong>모델별 성능 비교</strong>
LLM 아키텍처에 따라 시계열 이해와 이상 탐지 능력이 다르며, <strong>모델 선택이 중요하다는 연구 결과</strong>도 있다. 또한, <strong>토큰 수가 적을 때</strong> 더 나은 성능을 보이는 경우도 있다.<blockquote>
</blockquote>
</li>
<li><strong>Time-LlaMA 프레임워크</strong>
Time-LlaMA 프레임워크는 기존의 SOTA 방법론들을 초월하는 성능을 보였으며, 길거나 짧은 시간 시계열 예측 모두에서 우수한 성능을 나타내었다. 이는 LLM이 시간 시계열 예측 문제에 대한 강력한 솔루션이 될 수 있음을 실증적으로 입증했다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/06e27967-b386-4bb0-840a-2371afd53749/image.png" alt=""></p>
<h2 id="📚-5-적용-사례">📚 5. 적용 사례</h2>
<blockquote>
</blockquote>
<ul>
<li><strong>금융 시장 예측</strong>
Time-LLM은 주가 움직임, 통화 가치 변동, 상품 가격 예측 등 금융 시장 분석에 활용될 수 있다. 전통적인 시계열 모델이 놓칠 수 있는 미묘한 패턴을 감지하는 데 도움이 된다.</li>
<li><strong>에너지 소비 예측</strong>
전력 그리드 관리자들은 Time-LLM을 사용해 에너지 소비 패턴을 더 정확하게 예측할 수 있다. 이는 효율적인 자원 할당과 재생 에너지 통합에 중요하다.</li>
<li><strong>의료 모니터링</strong>
환자의 생체 신호 데이터를 분석하여 잠재적인 건강 이슈를 예측하는 데 Time-LLM이 활용될 수 있다. 이는 예방적 의료 개입에 중요한 역할을 할 수 있다.</li>
</ul>
<hr>
<h2 id="📚-6-결론-time-llm-시계열-분석의-미래를-엿보다">📚 6. 결론: Time-LLM, 시계열 분석의 미래를 엿보다</h2>
<p>Time-LLM은 시계열 데이터 분석에 <strong>대규모 언어 모델의 강력한 패턴 인식 능력과 유연성을 도입</strong>함으로써 새로운 가능성을 열어준다. 
적은 데이터로도 효과적인 예측이 가능하고, 다양한 도메인에 적용할 수 있다는 장점은 시계열 분석의 패러다임을 바꿀 잠재력을 가지고 있다.
앞으로 Time-LLM이 더욱 발전하고 성숙해짐에 따라, 우리는 더 정확하고 통찰력 있는 시계열 예측을 기대할 수 있다. 이는 금융부터 의료, 에너지 관리에 이르기까지 다양한 분야에서 더 나은 의사결정을 가능하게 할 것이다.</p>
<hr>
<h2 id="📚-7-느낀점">📚 7. 느낀점</h2>
<p>생각보다 시계열 분석은, 특히 금융 도메인 분석은 정말정말 어려운 것 같다. 데이터가 가지고 있는 한계도 있고 워낙 많은 배경들이 얽히고 섥혀있는 분야여서 그런가 싶다. 하지만 Time-llm과 같이 금융 도메인에서도 AI를 이용하는 움직임이 보이는 것으로 봐서 앞으로 더 참신한 연구들이 많이 나오지 않을까 짐작해본다. 최근에는 Time-LLM의 한계를 극복하기 위해 Time-RAG도 있는데, 이 부분도 추후 다뤄보면 재미있을 것 같다.</p>
<p><strong>🎉 Time-LLM, 앞으로의 활약을 기대하며!</strong></p>
<hr>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/897fb74c-6247-40bb-a7ee-f1401b2efae5/image.png" alt=""></p>
<p><strong>[참고 자료]</strong></p>
<ul>
<li><a href="https://leafht.tistory.com/168">https://leafht.tistory.com/168</a></li>
<li><a href="https://www.themoonlight.io/ko/review/adapting-large-language-models-for-time-series-modeling-via-a-novel-parameter-efficient-adaptation-method">https://www.themoonlight.io/ko/review/adapting-large-language-models-for-time-series-modeling-via-a-novel-parameter-efficient-adaptation-method</a></li>
<li><a href="https://discuss.pytorch.kr/t/time-llm-llm-time-series-forecasting-by-reprogramming-large-language-models/3436">https://discuss.pytorch.kr/t/time-llm-llm-time-series-forecasting-by-reprogramming-large-language-models/3436</a></li>
<li><a href="https://www.lgresearch.ai/blog/view?seq=423">https://www.lgresearch.ai/blog/view?seq=423</a></li>
<li><a href="https://kingnamji.tistory.com/70">https://kingnamji.tistory.com/70</a></li>
<li><a href="https://arxiv.org/abs/2306.11025">Temporal Data Meets LLM -- Explainable Financial Time Series Forecasting</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[CAG와 RAG: 차세대 AI 기술 전격 비교]]></title>
            <link>https://velog.io/@joshua_1203/CAGandRAG</link>
            <guid>https://velog.io/@joshua_1203/CAGandRAG</guid>
            <pubDate>Tue, 21 Jan 2025 14:26:12 GMT</pubDate>
            <description><![CDATA[<h2 id="intro">INTRO</h2>
<p>논문 제목이 살벌하다. Don&#39;t Do RAG ,,,
열심히 배웠는데 어째서요 ㅠㅠ
그럼에도... 새로운건 늘 짜릿하니까 🥺
<del>(한동안 LLM 관련 안한다고 했는데 블로그는 내 취미생활이니까 에라 모르겠다)</del>
RAG 방식의 한계점을 극복하기 위해 나온 CAG에 대해 알아보자!</p>
<hr>
<h2 id="기술-소개-cag와-rag">기술 소개: CAG와 RAG</h2>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/b8e8abc7-4968-48f3-b6f8-7254da69acc5/image.png" alt="">출처 : <a href="https://www.threads.net/@choi.openai/post/DEgGNUAh6M-">https://www.threads.net/@choi.openai/post/DEgGNUAh6M-</a></p>
<blockquote>
<p><strong>CAG(Cache-Augmented Generation)</strong>는 대규모 언어 모델의 성능을 극대화하기 위해 개발된 기술로, <strong>미리 준비된 정보를 캐시에 저장하여 빠른 응답을 제공</strong>한다. 이 기술은 실시간 검색의 필요성을 제거하고, 사전에 로드된 정보를 활용하여 높은 정확성과 효율성을 보장한다. CAG는 복잡한 검색 모듈을 사용하지 않기 때문에 구조가 단순하며, 이는 시스템의 유지보수와 확장성이 용이하다.</p>
</blockquote>
<hr>
<blockquote>
<p><strong>RAG(Retrieval-Augmented Generation)</strong>는 대규모 언어 모델의 한계를 극복하기 위해 개발된 기술로, <strong>외부 데이터베이스에서 실시간으로 정보를 검색하여 제공</strong>한다. 이 기술은 최신 정보를 활용할 수 있어 다양한 질문에 대한 대응력을 높일 수 있지만, 검색 시간과 시스템 복잡성이 증가할 수 있는 단점이 있다. RAG는 신뢰할 수 있는 외부 지식 베이스를 참조하여 모델의 출력을 최적화한다.</p>
</blockquote>
<p>CAG와 RAG는 모두 대규모 언어 모델의 성능을 향상시키기 위해 개발된 기술이다. <strong>CAG는 미리 준비된 정보를 활용하여 빠르고 정확한 응답</strong>을 제공하는 반면, <strong>RAG는 실시간 검색을 통해 최신 정보를 반영하여 다양한 질문에 대응</strong>할 수 있다. 이러한 기술들은 대규모 언어 모델의 한계를 극복하고, 보다 효율적이고 정확한 정보 제공을 목표로 한다.</p>
<hr>
<h2 id="출시-시기-및-배경">출시 시기 및 배경</h2>
<p><strong>CAG는 2024년에 소개된 기술</strong>로, <strong>RAG의 한계를 보완하기 위해 개발</strong>되었고 <strong>RAG는 2023년 3월 NVIDIA GTC 컨퍼런스에서 처음 발표된 기술</strong>로, <strong>대규모 언어 모델의 한계를 극복하기 위해 개발</strong>되었다. </p>
<p>RAG는 기존 대규모 언어 모델의 한계점인 비실시간성을 보완하기 위해 외부 데이터베이스에서 실시간으로 정보를 검색하여 최신 정보를 반영할 수 있는 능력을 갖추고 있다. RAG는 다양한 질문에 대한 대응력을 높이고, 보다 정확한 정보를 제공하기 위해 설계되었다.</p>
<p>그럼에도 RAG는 한계점이 있었기 때문에 CAG는 이런 부분을 보완하고자 실시간 검색의 필요성을 제거하고 사전에 로드된 정보를 활용하여 응답을 생성한다. 이는 시스템의 복잡성을 줄이고, 유지보수와 확장성을 용이하게 하며, 빠르고 정확한 응답을 제공할 수 있도록 한다.
<img src="https://velog.velcdn.com/images/joshua_1203/post/c33bf037-d2bc-4d7d-aeec-26ece55a6e96/image.png" alt=""></p>
<p><del>퍼플렉시티에게 만들어달라고 하니까 줄 다 엉망. 이럴거야 !?</del></p>
<hr>
<h2 id="코드로-살펴보기">코드로 살펴보기</h2>
<p>CAG와 RAG는 각각의 장점을 가지고 있다. CAG는 미리 준비된 정보를 활용하여 빠른 응답과 간단한 구조를 제공함으로써 시스템의 복잡성을 줄이고, 유지보수와 확장성을 용이하게 한다. 반면 RAG는 외부 데이터베이스에서 실시간으로 정보를 검색하여 최신 정보를 활용할 수 있어 다양한 질문에 대한 대응력을 높일 수 있다. 이러한 차이점은 각 기술이 특정 상황에서 더 적합하게 사용될 수 있도록 한다.</p>
<h3 id="rag">RAG</h3>
<blockquote>
<pre><code class="language-python">import openai
from some_retrieval_module import retrieve_documents  # 가상의 검색 모듈
</code></pre>
</blockquote>
<h1 id="사용자-질의">사용자 질의</h1>
<p>user_query = &quot;파리의 에펠탑에 대해 알려줘.&quot;</p>
<blockquote>
</blockquote>
<h1 id="외부-데이터베이스에서-관련-문서-검색">외부 데이터베이스에서 관련 문서 검색</h1>
<p>retrieved_docs = retrieve_documents(user_query)</p>
<blockquote>
</blockquote>
<h1 id="검색된-문서를-컨텍스트로-설정">검색된 문서를 컨텍스트로 설정</h1>
<p>context = &quot;\n\n&quot;.join(retrieved_docs)</p>
<blockquote>
</blockquote>
<h1 id="모델-프롬프트-구성">모델 프롬프트 구성</h1>
<p>prompt = f&quot;Context:\n{context}\n\nQuery: {user_query}\nAnswer:&quot;</p>
<blockquote>
</blockquote>
<h1 id="llm에-프롬프트-전달하여-응답-생성">LLM에 프롬프트 전달하여 응답 생성</h1>
<p>response = openai.ChatCompletion.create(
    model=&quot;gpt-4&quot;,
    messages=[
        {&quot;role&quot;: &quot;system&quot;, &quot;content&quot;: &quot;당신은 역사적인 랜드마크에 대해 잘 알고 있는 어시스턴트입니다.&quot;},
        {&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: prompt}
    ],
    max_tokens=100,
    temperature=0.5
)</p>
<blockquote>
</blockquote>
<p>print(response[&#39;choices&#39;][0][&#39;message&#39;][&#39;content&#39;].strip())</p>
<pre><code>
이 코드의 가장 핵심은 외부 검색 파이프라인이다.
지금은 간단한 코드여서 가상의 retrieve_documents를 사용했지만
보통은 FAISS나 다른 벡터DB를 사용하여 검색한 정보를 LLM에게 전달한다.

---
### CAG
&gt;```python
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
&gt;
# 모델과 토크나이저 로드
model_name = &#39;gpt-3.5-turbo&#39;  # 예시 모델 이름
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
&gt;
# 사전 로딩된 데이터
preloaded_data = &quot;&quot;&quot;
에펠탑은 프랑스 파리에 위치한 랜드마크로, 1889년에 완공되었습니다. 세계에서 가장 유명한 건축물 중 하나입니다. 실제로는 훨씬 길고 많겠죠. 파일이나 DB자체를 불러와야 할거에요.
&quot;&quot;&quot;
&gt;
# 사용자 질의
user_query = &quot;파리의 에펠탑에 대해 알려줘.&quot;
&gt;
# 입력 구성: 사전 로딩된 데이터 + 사용자 질의
input_text = preloaded_data + &quot;\n\n&quot; + user_query
input_ids = tokenizer.encode(input_text, return_tensors=&#39;pt&#39;)
&gt;
# 키-값 캐시 생성
with torch.no_grad():
    outputs = model(input_ids, use_cache=True)
    past_key_values = outputs.past_key_values
&gt;
# 응답 생성
generated_ids = model.generate(input_ids, max_length=512, past_key_values=past_key_values)
response = tokenizer.decode(generated_ids[0], skip_special_tokens=True)
&gt;
print(response)</code></pre><p>CAG의 가장 핵심은 키-값 캐시 생성 부분이다
많은 메모리를 차지하지 않게 문서를 캐시화 해두고 모델은 검색 과정을 건너뛰고 저장된 캐시를 참고하여 답변을 생성하게 된다.</p>
<hr>
<h2 id="관련-연구-논문">관련 연구 논문</h2>
<p>CAG와 관련된 주요 논문으로는 <strong>&#39;Don&#39;t Do RAG: When Cache-Augmented Generation is All You Need for Knowledge Tasks&#39;</strong>가 있다. 이 논문은 CAG가 RAG의 한계를 보완하기 위해 개발되었으며, 미리 준비된 정보를 활용하여 빠르고 정확한 응답을 제공하는 방법을 제시한다. </p>
<p>RAG와 관련된 주요 논문으로는 <strong>&#39;Retrieval-Augmented Generation for Large Language Models: A Survey&#39;</strong>가 있다. 이 논문은 RAG가 대규모 언어 모델의 한계를 극복하기 위해 제안된 기술로, 외부 데이터베이스에서 실시간으로 정보를 검색하여 최신 정보를 반영할 수 있는 능력을 갖추고 있음을 설명한다.</p>
<p>CAG와 RAG는 모두 대규모 언어 모델의 성능을 향상시키기 위한 기술로, 다양한 연구가 진행되고 있다. CAG는 미리 준비된 정보를 활용하여 빠르고 정확한 응답을 제공하는 반면, RAG는 실시간 검색을 통해 최신 정보를 반영하여 다양한 질문에 대응할 수 있다. 이러한 연구들은 대규모 언어 모델의 한계를 극복하고, 보다 효율적이고 정확한 정보 제공을 목표로 한다.</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/7ae6006d-d245-4290-9467-7119cf123fba/image.png" alt=""></p>
<hr>
<h2 id="향후-발전-방향">향후 발전 방향</h2>
<p>CAG는 다양한 분야에서의 활용 가능성이 크며, 특히 실시간 답변 서비스와 특정 분야 정보 활용에 유용할 것으로 예상된다. 나온지 얼마 되지 않은 기술이지만, 현재 많은 기술 중 굉장한 관심과 기대를 가지고 있다. 실제 많은 대형 언어 모델이 컨텍스트 윈도우를 활용해 빠른 응답과 불필요한 반복적인 검색을 피하고 있다고 한다.</p>
<p>RAG는 하이브리드 시스템 개발을 통해 개인화, 확장성, 정확성 중심으로 발전할 것으로 보인다. 외부 데이터베이스에서 실시간으로 정보를 검색하여 최신 정보를 반영할 수 있는 RAG는 다양한 질문에 대한 대응력을 높이고, 보다 정확한 정보를 제공하기 위해 설계되었다. 이러한 발전 방향은 RAG가 개인화된 정보 제공과 확장성 있는 시스템 구축에 기여할 수 있을 것으로 보인다.</p>
<p>CAG와 RAG의 미래 전망은 두 기술의 장점을 결합한 하이브리드 시스템 개발이 활발히 진행될 수도 있다. CAG의 빠른 응답과 간단한 구조, RAG의 최신 정보 활용과 다양한 질문에 대한 대응력을 결합한 하이브리드 시스템은 대규모 언어 모델의 성능을 극대화할 수 있는 가능성을 제시한다. 이러한 시스템은 보다 효율적이고 정확한 답변을 내기 위해 가파른 성장을 할 것이다.</p>
<hr>
<h2 id="outro">OUTRO</h2>
<p>처음에는 CAG가 잘 이해가지 않았는데 관련 논문을 찾고 또 읽어보니 정말 재미있다는 생각이 들었다. 
원래 전부 모델에 던짐 -&gt; 느려짐 -&gt; 검색해서 모델에 던짐 -&gt; 이것도 느림 -&gt; 미리 사전에 캐시로 저장해서 메모리 덜 쓰게 하기(검색X) -&gt; ?
한편으로는 연구분야 사람들도 이어지지 않은 지식 그래프를 잇는 사람들이 아닐까 생각했다. 모델, 프롬프트, 지식 베이스, 캐스 등등 모두 다른 각각의 개념인데, 이걸 어떻게 조합해서 더 좋은 성능을 이끌어 낼것인가 하지 않을까. 조심스레 생각해본다 😊</p>
<hr>
<h2 id="출처">출처:</h2>
<p>글
<a href="https://discuss.pytorch.kr/t/cag-cache-augmented-generation-llm-long-context-rag/5792">https://discuss.pytorch.kr/t/cag-cache-augmented-generation-llm-long-context-rag/5792</a>
<a href="https://www.aitimes.com/news/articleView.html?idxno=167272">https://www.aitimes.com/news/articleView.html?idxno=167272</a>
<a href="https://modulabs.co.kr/blog/retrieval-augmented-generation">https://modulabs.co.kr/blog/retrieval-augmented-generation</a></p>
<p>코드 구현
<a href="https://medium.com/@ronantech/cache-augmented-generation-cag-in-llms-a-step-by-step-tutorial-6ac35d415eec">https://medium.com/@ronantech/cache-augmented-generation-cag-in-llms-a-step-by-step-tutorial-6ac35d415eec</a></p>
<p>논문
<a href="https://arxiv.org/abs/2412.15605">https://arxiv.org/abs/2412.15605</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[🚀 데이터 파이프라인 자동화의 끝판왕, Airflow 파헤치기!]]></title>
            <link>https://velog.io/@joshua_1203/Airflow</link>
            <guid>https://velog.io/@joshua_1203/Airflow</guid>
            <pubDate>Wed, 15 Jan 2025 08:27:26 GMT</pubDate>
            <description><![CDATA[<p>이번 포스팅은 데이터 엔지니어링 여정에 강력한 날개를 달아줄 <strong>Airflow</strong>에 대한 모든 것을 담았다. 긴 스크롤 압박이 예상되지만, 그만큼 알찬 정보로 가득 채우려고 노력했다! 🔥</p>
<h3 id="1-서론-왜-airflow가-필요할까-🤔">1. 서론: 왜 Airflow가 필요할까? 🤔</h3>
<p>LLM 학습에 빠져 살고 있는 주니어 개발자로서, 데이터를 처리하는 과정에서 수많은 어려움을 겪었다. 수동으로 데이터를 옮기고, 스크립트를 실행하고, 오류를 감시하는 일은 정말 고됐다. 😵‍💫</p>
<p>이런 복잡하고 반복적인 작업을 자동화할 수 있는 방법이 없을까? 고민하던 중 눈에 들어온 것이 바로 <strong>Airflow</strong>!</p>
<p>Airflow는 복잡한 데이터 파이프라인을 <strong>정의, 스케줄링, 모니터링</strong>할 수 있는 강력한 오픈소스 플랫폼이다. 데이터 엔지니어링의 필수 도구로 자리매김하고 있으며 데이터 처리 자동화의 핵심 기술이라고 할 수 있음 !!</p>
<p><strong>Airflow가 필요한 이유:</strong></p>
<ul>
<li><strong>수동 작업의 한계:</strong> 데이터 처리 작업은 반복적이고 오류가 발생하기 쉽다. Airflow는 이러한 수동 작업을 자동화하여 효율성을 높여준다.</li>
<li><strong>복잡한 의존성 관리:</strong> 여러 작업이 복잡하게 연결된 파이프라인을 관리하는 것은 매우 어렵다. Airflow는 작업 간 의존성을 명확하게 정의하고 관리할 수 있도록 도와준다.</li>
<li><strong>실패 처리 및 재시도:</strong> 작업 실패 시 자동 재시도 기능을 제공하여 데이터 처리 안정성을 높여준다.</li>
<li><strong>모니터링 및 알림:</strong> 파이프라인의 실행 상태를 모니터링하고, 오류 발생 시 알림을 받을 수 있어 문제 발생 시 빠르게 대응할 수 있다.</li>
</ul>
<hr>
<h3 id="2-airflow-핵심-개념-짚어보기-🧐">2. Airflow 핵심 개념 짚어보기 🧐</h3>
<p>Airflow를 제대로 활용하기 위해서는 몇 가지 핵심 개념을 이해해야 한다. 마치 레고 블록처럼, 이 개념들을 조합하여 데이터 파이프라인을 만들 수 있는 것 !</p>
<blockquote>
</blockquote>
<ul>
<li><strong>DAG (Directed Acyclic Graph):</strong> Airflow의 핵심 단위로, 작업(task)들의 의존 관계를 방향성 비순환 그래프(DAG) 형태로 표현. DAG는 파이프라인의 논리적 구조를 정의.</li>
<li><strong>Task:</strong> DAG를 구성하는 개별 작업 단위를 의미. (데이터 추출, 변환, 로드 등)</li>
<li><strong>Operator:</strong> Task가 수행하는 실제 작업을 정의. Airflow는 다양한 종류의 Operator를 제공하며, 사용자 정의 Operator를 만들 수도 있음. (BashOperator, PythonOperator, PostgresOperator 등)</li>
<li><strong>Scheduler:</strong> 정의된 DAG를 스케줄에 따라 실행하는 역할. Cron 표현식을 사용하여 실행 주기를 설정할 수 있다.</li>
<li><strong>Executor:</strong> Task를 실행하는 엔진. (LocalExecutor, CeleryExecutor, KubernetesExecutor 등)</li>
<li><strong>Web UI:</strong> Airflow 웹 인터페이스를 통해 DAG 실행 상태를 모니터링하고, 로그를 확인하고, 스케줄을 관리</li>
</ul>
<hr>
<h3 id="3-airflow-이렇게-활용하세요-✨">3. Airflow, 이렇게 활용하세요! ✨</h3>
<p>Airflow는 데이터 엔지니어링의 다양한 분야에서 활용될 수 있다. 몇 가지 예시를 통해 Airflow의 활용 가능성을 살펴보자 !</p>
<blockquote>
</blockquote>
<ul>
<li><strong>데이터 수집 및 통합:</strong> API, 데이터베이스, 파일 시스템 등 다양한 소스에서 데이터를 수집하고 통합하는 파이프라인 구축</li>
<li><strong>데이터 변환 및 정제:</strong> 수집된 데이터를 원하는 형태로 변환하고 정제하는 파이프라인을 구축할 수 있다. (데이터 누락 값 처리, 이상치 제거, 데이터 형식 변환 등을 자동화)</li>
<li><strong>머신러닝 모델 학습:</strong> 모델 학습에 필요한 데이터 전처리 과정을 자동화하고, 모델 학습 및 배포 파이프라인 구축</li>
<li><strong>데이터 웨어하우스 구축:</strong> 데이터 웨어하우스에 데이터를 적재하고 관리하는 파이프라인 구축</li>
<li><strong>BI (Business Intelligence) 보고서 생성:</strong> 데이터를 분석하여 BI 보고서를 생성하고 배포하는 파이프라인 구축</li>
</ul>
<p><strong>Airflow 활용 예시 (Python 코드):</strong></p>
<pre><code class="language-python">from airflow import DAG
from airflow.operators.bash import BashOperator
from airflow.operators.python import PythonOperator
from datetime import datetime

def my_python_function():
    print(&quot;Hello from Python!&quot;)

with DAG(
    dag_id=&#39;my_first_airflow_dag&#39;,
    start_date=datetime(2024, 1, 1),
    schedule_interval=None,
    catchup=False
) as dag:
    bash_task = BashOperator(
        task_id=&#39;run_bash_command&#39;,
        bash_command=&#39;echo &quot;Hello from Bash!&quot;&#39;
    )

    python_task = PythonOperator(
        task_id=&#39;run_python_function&#39;,
        python_callable=my_python_function
    )

    bash_task &gt;&gt; python_task</code></pre>
<p>위 코드는 Bash 명령어를 실행하는 Task와 Python 함수를 실행하는 Task로 구성된 간단한 DAG다. 이 코드를 Airflow에 등록하면, 정의된 순서대로 Task가 실행된다.</p>
<hr>
<h3 id="4-airflow-설치와-사용">4. airflow 설치와 사용</h3>
<h4 id="1-설치">1) 설치</h4>
<p><code>pip install apache-airflow</code>
이렇게 pip로 직접 설치하거나</p>
<p><code>curl -LfO &#39;https://airflow.apache.org/docs/apache-airflow/stable/docker-compose.yaml&#39;</code>
airflow에서 제공하는 docker-compose 파일을 받아와도 된다.</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/501e0b43-b322-46dd-9218-da509d2d7963/image.png" alt=""></p>
<p>이런거 너무 귀여움</p>
<p>나의 경우 기존에 사용하던 MySQL에서 PostgreSQL로 이동하는 코드를 작성했다.</p>
<ul>
<li>compose file(airflow 기본 세팅)
이 부분에서 데이터베이스를 설치하고 로그인 정보를 입력하면 된다.<blockquote>
<pre><code class="language-yaml">version: &#39;3.7&#39;
services:
postgres:
  image: postgres:13
  environment:
    POSTGRES_USER: airflow
    POSTGRES_PASSWORD: airflow
    POSTGRES_DB: airflow
  ports:
    - &quot;5432:5432&quot;
  volumes:
    - postgres_data:/var/lib/postgresql/data
</code></pre>
</blockquote>
mysql:
  image: mysql:8.0
  environment:<pre><code>MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: source
MYSQL_USER: user
MYSQL_PASSWORD: password</code></pre>  ports:<pre><code>- &quot;3306:3306&quot;</code></pre>  volumes:<pre><code>- mysql_data:/var/lib/mysql</code></pre><blockquote>
</blockquote>
redis:
  image: redis:7.2-bookworm
  ports:<pre><code>- &quot;6379:6379&quot;</code></pre><blockquote>
</blockquote>
airflow-webserver:
  image: apache/airflow:2.7.1
  environment:<pre><code>- AIRFLOW__CORE__EXECUTOR=LocalExecutor
- AIRFLOW__CORE__SQL_ALCHEMY_CONN=postgresql+psycopg2://airflow:airflow@postgres/airflow
- AIRFLOW__CELERY__BROKER_URL=redis://redis:6379/0</code></pre>  depends_on:<pre><code>- postgres
- mysql
- redis</code></pre>  ports:<pre><code>- &quot;8080:8080&quot;</code></pre>  volumes:<pre><code>- ./dags:/opt/airflow/dags
- ./logs:/opt/airflow/logs
- ./plugins:/opt/airflow/plugins</code></pre>  command: &gt;<pre><code>bash -c &quot;
airflow db init &amp;&amp;
airflow users create --username airflow --password airflow --firstname Admin --lastname User --role Admin --email admin@example.com &amp;&amp;
airflow webserver&quot;</code></pre><blockquote>
</blockquote>
airflow-scheduler:
  image: apache/airflow:2.7.1
  depends_on:<pre><code>- postgres
- redis</code></pre>  volumes:<pre><code>- ./dags:/opt/airflow/dags
- ./logs:/opt/airflow/logs
- ./plugins:/opt/airflow/plugins</code></pre>  command: &gt;<pre><code>bash -c &quot;
airflow scheduler&quot;</code></pre><blockquote>
</blockquote>
volumes:
postgres_data:
mysql_data:</li>
</ul>
<hr>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/cbe09e67-e0e0-43b3-be13-de307df7ef0f/image.png" alt=""></p>
<p>그 다음 <code>docker-compose up -d</code>로 올리면 기본 세팅 끝 !</p>
<ul>
<li>마이그레이션 작업할 py 파일<blockquote>
<pre><code class="language-python">from airflow import DAG
from airflow.operators.python import PythonOperator
from datetime import datetime, timedelta
import mysql.connector
import psycopg2
# MySQL에서 데이터 가져오기
def transfer_data():</code></pre>
</blockquote>
<h1 id="mysql-연결">MySQL 연결</h1>
  mysql_conn = mysql.connector.connect(<pre><code>  host=&quot;mysql&quot;,
  user=&quot;user&quot;,
  password=&quot;password&quot;,
  database=&quot;db&quot;</code></pre>  )
  mysql_cursor = mysql_conn.cursor()
  mysql_cursor.execute(&quot;SELECT * FROM your_table LIMIT 100&quot;)
  rows = mysql_cursor.fetchall()<blockquote>
</blockquote>
<h1 id="postgresql-연결">PostgreSQL 연결</h1>
  postgres_conn = psycopg2.connect(<pre><code>  host=&quot;postgres&quot;,
  user=&quot;airflow&quot;,
  password=&quot;airflow&quot;,
  database=&quot;airflow&quot;</code></pre>  )
  postgres_cursor = postgres_conn.cursor()<blockquote>
</blockquote>
<h1 id="postgresql에-데이터-삽입">PostgreSQL에 데이터 삽입</h1>
  insert_query = &quot;&quot;&quot;
  INSERT INTO my_table (job_title, job_post, company)
  VALUES (%s, %s, %s)
  &quot;&quot;&quot;
  postgres_cursor.executemany(insert_query, rows)<blockquote>
</blockquote>
<h1 id="커밋-및-연결-종료">커밋 및 연결 종료</h1>
  postgres_conn.commit()
  mysql_cursor.close()
  mysql_conn.close()
  postgres_cursor.close()
  postgres_conn.close()<blockquote>
<h1 id="dag-정의">DAG 정의</h1>
<p>default_args = {
  &quot;owner&quot;: &quot;airflow&quot;,
  &quot;depends_on_past&quot;: False,
  &quot;email_on_failure&quot;: False,
  &quot;email_on_retry&quot;: False,
  &quot;retries&quot;: 1,
  &quot;retry_delay&quot;: timedelta(minutes=5),
}</p>
</blockquote>
with DAG(
  &quot;mysql_to_postgres&quot;,
  default_args=default_args,
  description=&quot;Transfer data from MySQL to PostgreSQL&quot;,
  schedule_interval=&quot;0 * * * *&quot;,  # 매시간 0분에 실행
  start_date=datetime(2025, 1, 1),
  catchup=False,
) as dag:<blockquote>
</blockquote>
  transfer_task = PythonOperator(<pre><code>  task_id=&quot;transfer_data&quot;,
  python_callable=transfer_data,</code></pre>  )</li>
</ul>
<p>매 시간마다 100개씩 옮기도록 설정해두었다.
yaml파일에서 설정한 <a href="http://localhost:8080%EB%A1%9C">http://localhost:8080로</a> 접속해 로그인하면 배치 작업을 확인할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/0259b29f-f2c7-43d6-b096-e6a6d5e137ba/image.png" alt=""></p>
<p>이런식으로 !
간단한 작업이어서 나도 조금 더 써봐야 알겠지만
활용도가 높은 툴이다보니 더 깊게 공부해봐야겠다는 생각 !!
나중에는 데이터 분석을 위한 데이터 파이프라인도 만들어봐야겠다.</p>
<hr>
<h3 id="5-결론-데이터-엔지니어링-여정의-든든한-동반자-airflow-🤝">5. 결론: 데이터 엔지니어링 여정의 든든한 동반자, Airflow! 🤝</h3>
<p>Airflow는 데이터 파이프라인 자동화를 위한 강력한 도구다. 복잡한 데이터 처리 작업을 자동화하고, 효율성을 높이며, 안정적인 시스템을 구축할 수 있도록 도와준다. 주니어 입장에서 Airflow를 배우고 활용하는 것은 데이터 엔지니어링 분야의 성장에 큰 도움이 될 것이다.</p>
<p>나도 아직 Airflow를 배우는 과정에 있지만, 앞으로도 Airflow를 활용한 데이터 파이프라인 구축 경험을 공유하며 계속 성장해 나가야겠다! 🚀</p>
<hr>
<p><strong>마무리:</strong></p>
<p>이 포스팅이 Airflow에 대한 여러분의 이해를 높이는 데 도움이 되었기를 바랍니다. 궁금한 점이 있다면 언제든지 댓글로 질문해주세요. 데이터 엔지니어링의 세계에서 함께 성장해 나가는 멋진 여정을 기대합니다! 💪</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[LLM 성능 향상을 위한👀 전문가 혼합(MoE)과 에이전트 혼합(MoA)]]></title>
            <link>https://velog.io/@joshua_1203/MoE-MoA</link>
            <guid>https://velog.io/@joshua_1203/MoE-MoA</guid>
            <pubDate>Tue, 07 Jan 2025 07:31:46 GMT</pubDate>
            <description><![CDATA[<p>인공지능(AI) 분야는 최근 몇 년간 급속한 발전을 이루며, 특히 대규모 언어 모델(LLM)의 성능 향상에 많은 주목을 받고 있다. 모두의 연구소에서 진행하는 강연을 들었을 때 <strong>전문가 혼합(MoE, Mixture of Experts)</strong>과 <strong>에이전트 혼합(MoA, Mixture of Agents)</strong>이라는 두 가지 접근법을 알게 되었고 꽤나 흥미로웠다.</p>
<p>LLM무새가 이걸 지나칠 수는 없지. 이번 블로그에서는 MoE와 MoA의 개념, 특징, AI 모델에 미치는 영향을 살펴보겠다 !!</p>
<hr>
<h2 id="1-전문가-혼합moe이란-무엇인가">1. 전문가 혼합(MoE)이란 무엇인가?</h2>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/c4774f82-7667-4c36-9cb1-631ccc2f03b3/image.avif" alt=""></p>
<blockquote>
</blockquote>
<p>여러 개의 &#39;<strong>전문가&#39; 모델을 활용</strong>하여 주어진 입력에 가장 적합한 전문가를 <strong>선택</strong>하고, 이를 통해 예측을 수행하는 아키텍처. 이러한 구조는 <strong>모델의 효율성</strong>을 높이고, 특정 작업에 대한 <strong>전문성을 강화</strong>하는 데 기여함.</p>
<hr>
<h3 id="🧐-주요-성질">🧐 주요 성질</h3>
<ul>
<li><p><strong>전문가 모델</strong>: 다양한 전문 분야에서 탁월한 성능을 발휘하는 전문가 모델의 집합으로 구성</p>
</li>
<li><p><strong>부분 활성화</strong>: 입력되는 질문이나 과제에 따라 일부 전문가만 활성화됨</p>
</li>
<li><p><strong>층화 구조</strong>: 각 층에서 서로 다른 전문가들이 협력하여 문제를 해결해 복잡한 문제를 보다 효과적으로 처리</p>
</li>
</ul>
<hr>
<h3 id="🧐-주요-특징">🧐 주요 특징</h3>
<blockquote>
</blockquote>
<ul>
<li><strong>게이팅 네트워크</strong>: 입력에 따라 적절한 전문가를 선택하는 역할<blockquote>
</blockquote>
</li>
<li><strong>효율성</strong>: 모든 전문가를 동시에 사용하는 것이 아니라, 선택된 일부 전문가만 활성화하여 계산 자원 절약<blockquote>
</blockquote>
</li>
<li><strong>확장성</strong>: 전문가의 수를 늘려 모델의 용량 확장<blockquote>
</blockquote>
<em>MoE 모델은 특히 대규모 언어 모델의 성능 향상에 효과적이며, PyTorch와 같은 프레임워크를 통해 구현되고 있다.</em></li>
</ul>
<hr>
<h3 id="🧐-활용-사례">🧐 활용 사례</h3>
<p>GPT-3 및 GPT-4의 활용: 이들 모델은 MoE 기법을 통하여 다양한 질문응답(task)에서 뛰어난 성능을 발휘한다. 특정 작업에 대해 최적화된 모델만을 사용함으로써, 처리 시간을 단축하고 연산 비용을 절감함.</p>
<hr>
<h2 id="2-에이전트-혼합moa이란-무엇인가">2. 에이전트 혼합(MoA)이란 무엇인가?</h2>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/7c5e56d5-92c0-480d-aad4-00bcc94bfd9f/image.png" alt=""></p>
<blockquote>
</blockquote>
<p><strong>여러 개의 언어 모델(에이전트)이 협력</strong>하여 더 나은 성능을 도출하는 방법론. 각 에이전트는 계층 구조 내에서 <strong>상호 작용</strong>하며, <strong>이전 계층의 출력을 기반으로 응답을 생성</strong>하여 최종 결과를 개선함.</p>
<hr>
<h3 id="🧐-주요-성질-1">🧐 주요 성질</h3>
<ul>
<li><p><strong>협력적 구조</strong>: MoA는 다양한 LLM들이 서로의 출력을 참고하여 더 나은 결과 도출</p>
</li>
<li><p><strong>계층적 접근</strong>: LLM은 여러 계층으로 구성되어 각 계층의 결과를 종합하여 최종 응답 생성</p>
</li>
<li><p><strong>모델 다양성</strong>: 첫 번째 계층에서 생성된 출력은 다음 계층에서 개선(각 모델이 상호 보완적으로 작용함)</p>
</li>
</ul>
<hr>
<h3 id="🧐-주요-특징-1">🧐 주요 특징</h3>
<blockquote>
</blockquote>
<ul>
<li><strong>협력성</strong>: 여러 모델이 서로의 출력을 참고하여 최적의 응답 생성<blockquote>
</blockquote>
</li>
<li><strong>계층 구조</strong>: 각 계층은 여러 에이전트로 구성되며, 단계별로 응답의 품질을 향상시킴<blockquote>
</blockquote>
</li>
<li><strong>비용 효율성</strong>: 단일 대규모 모델보다 저렴한 비용으로 높은 성능 구현<blockquote>
</blockquote>
<em>MoA 기법은 LLM의 성능을 향상시키는 데 효과적이며, OpenPipe와 같은 플랫폼에서 이를 활용하여 GPT-4 수준의 성능을 더 낮은 비용으로 구현하고 있다.</em></li>
</ul>
<hr>
<h3 id="🧐-활용-사례-1">🧐 활용 사례</h3>
<p>여러 LLM의 활용: MoA 기법은 여러 대규모 언어 모델을 사용하여 각각의 장점을 극대화하는 작업에서 활용함. 이들은 서로 다른 출력 결과를 저렴한 비용으로 결합하여 보다 종합적이고 고품질의 결과를 제공함.</p>
<hr>
<h2 id="3-moe와-moa의-비교-및-활용">3. MoE와 MoA의 비교 및 활용</h2>
<p>MoE와 MoA는 모두 AI 모델의 성능 향상을 목표로 하지만 접근 방식에서 차이가 있다.</p>
<blockquote>
</blockquote>
<p><strong>MoE</strong>: 단일 모델 내에서 여러 전문가를 활용하여 특정 작업에 대한 전문성을 강화</p>
<blockquote>
</blockquote>
<p><strong>MoA</strong>: 여러 모델 간의 협력을 통해 복잡한 문제에 대한 종합적인 해결책을 도출</p>
<h4 id="moe와-moa-비교">MoE와 MoA 비교</h4>
<table>
<thead>
<tr>
<th>특징</th>
<th>MoE (Mixture of Experts)</th>
<th>MoA (Mixture of Agents)</th>
</tr>
</thead>
<tbody><tr>
<td><strong>구조</strong></td>
<td>여러 전문가 모델 중 입력에 따라 선택된 모델이 작업 처리</td>
<td>여러 LLM (또는 에이전트)이 협력하여 작업 수행</td>
</tr>
<tr>
<td><strong>활성화 메커니즘</strong></td>
<td>부분 활성화 (입력에 따라 필요한 전문가만 활성화)</td>
<td>전체 활성화 (모든 참여 모델 사용)</td>
</tr>
<tr>
<td><strong>성능 최적화</strong></td>
<td>자원 사용 효율성 극대화</td>
<td>응답 품질 향상 (협력적 요소 활용)</td>
</tr>
<tr>
<td><strong>운영 비용</strong></td>
<td>비용 효율적 (일부 전문가만 사용)</td>
<td>상대적으로 높은 비용 (다양한 모델 동시 활용)</td>
</tr>
<tr>
<td><strong>핵심 아이디어</strong></td>
<td>입력에 특화된 전문가를 선택적으로 활용하여 효율성 증대</td>
<td>여러 모델의 강점을 결합하여 시너지 효과 창출</td>
</tr>
<tr>
<td><strong>비유</strong></td>
<td>여러 분야의 전문가에게 필요한 부분만 자문을 구하는 형태</td>
<td>여러 명의 전문가가 모여 협력하여 문제를 해결하는 형태</td>
</tr>
<tr>
<td><strong>주요 장점</strong></td>
<td>연산 효율성, 모델 확장 용이</td>
<td>높은 정확도 및 풍부한 정보 제공 가능성</td>
</tr>
<tr>
<td><strong>주요 단점</strong></td>
<td>전문가 선택의 어려움, 전문가 간 조정 문제 발생 가능성</td>
<td>높은 연산 비용, 복잡한 관리, 모델 간 충돌 발생 가능성</td>
</tr>
</tbody></table>
<hr>
<p>이 부분은 Gemini 2.0에서 추가적으로 설명해준 부분이다.</p>
<h3 id="추가-설명">추가 설명</h3>
<blockquote>
</blockquote>
<ul>
<li><strong>MoE (Mixture of Experts):</strong><ul>
<li>입력 데이터에 따라 적절한 전문가를 선택하는 것이 핵심입니다.</li>
<li>게이팅 네트워크가 이 역할을 담당하며, 어떤 전문가를 사용할지 결정합니다.</li>
<li>각 전문가는 특정 유형의 입력 또는 작업에 특화되어 학습됩니다.<blockquote>
</blockquote>
</li>
</ul>
</li>
<li><strong>MoA (Mixture of Agents):</strong><ul>
<li>여러 모델 또는 에이전트가 서로 협력하여 작업을 수행하는 방식입니다.</li>
<li>각 모델은 독립적으로 또는 협력적으로 작업을 수행하고, 결과를 종합하여 최종 결과를 도출합니다.</li>
<li>이 과정에서 합의, 투표, 조정 등의 메커니즘이 사용될 수 있습니다. &quot;Aggregator&quot;라는 용어를 사용하는 경우, 여러 모델의 출력을 종합하는 역할을 강조합니다.</li>
</ul>
</li>
</ul>
<hr>
<h2 id="4-결론">4. 결론</h2>
<p>전문가 혼합(MoE)과 에이전트 혼합(MoA)은 각각의 장점과 특성을 통해 대규모 데이터 처리 및 응답 생성에서 차별화된 성능을 발휘하여 AI 모델의 새로운 패러다임을 제시하며, 대규모 언어 모델의 성능을 한층 더 향상시키는 데 기여하고 있다. 
<strong>각각의 상황에 맞는 적절한 기법의 선택은 효과적인 AI 기술 응용을 위한 중요한 기준이 된다.</strong> 
이러한 혁신적인 접근법들은 앞으로의 AI 발전에 중요한 이정표가 될 것이다.</p>
<hr>
<h2 id="5-개인적인-의견">5. 개인적인 의견</h2>
<p>저번 agent 관련 논문 리뷰도 그렇고 AI 자체가 &quot;인간을 모방하는&quot;에 초점이 맞춰져 있다보니 모델의 행동 양상도 비슷하게 만들어간다는 생각이 든다. 사람도 여러 관계가 있고 그에 따른 다양한 output이 있으니 agent의 결과값도 여러 방향이 나올 것 같다.</p>
<p>이건 좀 다른 이야기지만, 공부하겠다는 의지만 있으면 어디서든 배울 수 있다는 게 요즘 살아가면서 진짜 강점인거 같다. 다들 지식공유를 열심히 해주셔서 나같이 아무것도 모르는 사람도 이정도로 공부할 수 있기도 하고... (깊이 있는 내용이 많아서 기초적인 부분만 적는게 민망할 정도.) 좀 더 자세한 내용은 출처에 있는 사이트와 관련 논문을 둘러봐도 좋을 것 같다.
<img src="https://velog.velcdn.com/images/joshua_1203/post/6dfe7998-98cf-42c7-afd3-234c5fb3df57/image.png" alt=""></p>
<hr>
<h2 id="6-출처-및-관련-논문">6. 출처 및 관련 논문</h2>
<p><a href="https://www.datacamp.com/blog/mixture-of-experts-moe">https://www.datacamp.com/blog/mixture-of-experts-moe</a>
<a href="https://discuss.pytorch.kr/t/moa-mixture-of-agents-llm/4667">https://discuss.pytorch.kr/t/moa-mixture-of-agents-llm/4667</a></p>
<ul>
<li><p>Mixture-of-Experts (MoE) 관련 논문
&quot;Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layer&quot; (2017)
(Google Brain에서 제안. MoE의 기본 개념을 도입하며 특정 입력에 따라 일부 전문가만 활성화하여 계산 자원을 효율적으로 사용하는 방법을 설명)
&quot;Mixture of Attention Heads: Selecting Attention Heads Per Token&quot;
(MoE와 유사한 메커니즘인 Mixture of Attention Heads를 제안)</p>
</li>
<li><p>Mixture-of-Agents (MoA) 관련 논문
&quot;Mixture of Agents Enhances Large Language Model Capabilities&quot; (2024)
(여러 LLM 에이전트가 계층 구조를 통해 협력하여 최종 응답을 점진적으로 개선하는 방식을 제안합니다. 다양한 벤치마크에서 GPT-4 Omni를 능가하는 성능을 보인 것으로 보고됨)
&quot;MoA is All You Need: Building LLM Research Team using Mixture of Agents&quot; (2024)
(금융 분야에서 MoA 기반의 검색 강화 생성 시스템을 제안. 여러 소형 언어 모델 에이전트를 통해 높은 품질의 결과를 제공하는 방법을 설명)</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[비전공자의 데이터 분석가를 향한 1년간의 여정 회고록]]></title>
            <link>https://velog.io/@joshua_1203/my-da-post</link>
            <guid>https://velog.io/@joshua_1203/my-da-post</guid>
            <pubDate>Tue, 31 Dec 2024 14:11:19 GMT</pubDate>
            <description><![CDATA[<p>*&quot;나는 데이터 분석가라는 새로운 정체성을 받아들이며 2024년을 보냈다.&quot;*</p>
<p>(아무리 생각해봐도 데이터 분석가, 데이터 사이언스, 데이터 엔지니어 중에 나는 데이터 분석가가 맞는 것 같아 제목을 이렇게 선정했다.)</p>
<p>처음에는 회고록을 쓸까 말까 고민을 많이 했는데 마지막날 내 1년을 돌아보고 싶어져 급하게 노트북을 켰다.
평소와 다를 바 없는 하루가 흘러간 것일 뿐이겠지만 그럼에도 의미를 부여하는 게 인간의 기본 습성이 아닐까 생각했다 ^^;;
<del>나도 인간인데 써야지</del></p>
<hr>
<h2 id="intro">INTRO</h2>
<p>2024년에는 정말 많은 일들이 있었다.
2023년 1월 4년 째 잘 다니던 직장을 그만두고 여행을 다녔다
1년동안 5개의 국내 도시에서 한달 살기를 했고 유럽, 오키나와, 보라카이, 몽골. 내가 가고 싶었던 곳을 열심히도 돌아다녔다.
<img src="https://velog.velcdn.com/images/joshua_1203/post/af7838df-66dd-41a1-b74c-f6c3c77ef794/image.png" alt="">(몽골 최고다. 또 가고 싶다)</p>
<p>그리고 정확히 <strong>1년 뒤 개발자 양성 과정</strong>에 뛰어 들었다.
워낙 돌아다니는 걸 좋아해서 다시 학교 생활 비스무리한걸 할 수 있을까 걱정했는데
1년 동안 집에 있던 날보다 없던 날이 더 많아서 일까 오히려 나가지 않는 규칙적인 생활이 더 즐거웠다. 약간 스스로도 변태 같았음</p>
<hr>
<h2 id="6개월-개발자-부트-캠프">6개월 개발자 부트 캠프</h2>
<p>6개월 간 양성과정. 재미있기도, 힘이 들기도, 짜증나기도, 설레기도 했던 날이었다.</p>
<p>내가 부트캠프 학원을 정하는 기준은 2가지 였다.</p>
<blockquote>
</blockquote>
<ol>
<li>최대한 다양한 툴, 기술스택을 배우는가?</li>
<li>취업할 때 얼마나 메리트가 있는가?</li>
</ol>
<p>내가 다녔던 학원은 두 가지 기준에 잘 맞았다. <strong>너무 한 가지만 배우지 않고, 우수한 학생은 인턴의 기회</strong>도 있었다. 원래 12월에 할 계획이었는데 인원이 전부 차서 1월 말부터 다니기 시작했다.
훈련 장려금과 국취제도 함께해서 솔직히 금전적으로는 좀 넉넉했다. <del>공부만 하는데 돈을 준다고? 최고잖아 !</del></p>
<p>&#39;비전공자&#39; 말은 개발자 양성 학원에서 지겹도록 들어봐서 많을 줄 알았는데 &#39;컴공&#39;만 많이 없다 뿐이지 통계학과, 수학과, 전자과 등등,,, 이런 사람들에 비하면 <strong>나는 정말로 쌩 비전공자</strong>였다.
그나마 하나 괜찮았던건 내가 다닌 학원이 교육 관련 회사였기 때문에, 석사 전공이었던 교육공학이 그나마 쓸 곳이 있었다는 것이다.</p>
<p>이제는 학교생활보다 직장 생활이 더 익숙했는데, <strong>좋은 동기들과 선배님(?)은 아니고 멘토분들을 만나서</strong> 진짜 오랜만에 학교생활 하는 것처럼 즐겁게 다녔다.</p>
<p>물론 팀원과 트러블이 있기도 하고, 내 스스로가 이것밖에 안되나 하는 생각들, 왜 나는 영어와 수학을 못할까(ㅋㅋㅋㅋㅋ 진짜 진지하게 했던 생각임), 개발도 머리가 어느정도 되야 할 수 있는건가(ㅋㅋㅋㅋ 이것도 진짜 진지하게 했음)라며 자책했던 나날도 있었다. <strong>며칠 밤을 새고 만들었던 모델이 원하는 대답은 내놓지 않고 소설을 쓰고 있을 때 진짜 눈물 났다. 근데 상황이 너무 웃겨서 슬픈데 웃긴 감정을 처음 알았음.</strong></p>
<p>내가 다닌 빅데이터 개발자 양성과정은 정말 이것 저것 많이 알려주시고 또 재미있었지만 <strong>몇 가지 아쉬운 점</strong>은 있다. 혹시 이걸 보게 되는 예비 교육생 분들이 있다면 참고하면 좋을 듯 싶다.</p>
<p><code>1. 세부적인 개발자 직무</code>
아직도 왜 정립이 안되는 걸까, 궁금한 사항이긴 한데
나는 DA, DS, DE라는 단어의 정확한 의미를 학원을 다니고 한... 3<del>4개월차쯤 알았다.
DA는 통계적으로 분석하고, DE는 데이터베이스를 만지고, DS는 둘을 모두 잘하는 사람이라고 생각했다. 
진</del>짜 간단하게는 그게 맞지만 전혀 다르다.
이론상으로 설명은 해주셨지만 각 직무에서 어떤 걸 더 중요시하는 지, 취업을 할 때 내가 이런 세부 직무를 알고 있고 그 부분에 중요한 기술스택을 선택적으로 꾸준히 공부하면 꼭 도움이 될 것이란 걸 미리 코칭해주었으면 어떨까 하는 생각이다.
또 하나 얹자면, 사실 <strong>개발자는 프론트엔트, 백엔드, MLOps, LLM, 검색엔진 엔지니어, 인프라, 정보보안 등등 정말 분야가 많은데 이런 내용을 좀 더 알려줬으면 어떨까</strong> 싶다.</p>
<p><code>2. 취업 시장의 이해도</code>
이건 정말 뼈저리게 느끼게 되었는데, 물론 내가 모든 학원들을 다 아는 것이 아니니 확답할 수는 없지만 다시 취준생이 되어 취업시장을 보니 <strong>취업 시장에 대해 몰라도 너무 몰랐다</strong>는 생각이 든다. 기본적으로 뭘 준비해야하는지, 협업 툴이나 원하는 기술스택이 어떤건지 전혀 모르고 있었다는 것이다. 예를 들면 자격증이 있으면 좋지만 그것보다 어떤 언어를 잘 쓰고 활용했는지가 더 중요한 느낌?
최소한 프로젝트 때 <strong>협업 툴을 쓰게 해보거나 실제 실무적으로 어떻게 주고 받는지에 대해 경험했으면</strong> 정말 좋았을 것 같은데, 아쉽게도 내가 진행했던 프로젝트는 그 부분보다 기획에 더 힘을 써야 했다. 생각하는 개발자, 정말 중요하지만 채용 시장에서는 <strong>협력할 줄 아는 개발자를 훨씬 필요로 한다.</strong></p>
<p>그럼에도 정말 좋았던건, 나의 경우 정말 운이 좋게도 프로젝트를 진행하며 <strong>LLM 엔지니어</strong>라는 직무를 알게 되었고 그게 찰떡이었던 것이다 !!!!!
대형 모델을 이리저리 만져보고, 정확한 답변을 내게 하고, 데이터베이스와 연결하고, 서버에 띄워 운영하고 등등!!!! 계속 하고 싶은 분야를 찾은 것이다.</p>
<p>또, 정말 마음이 맞는 좋은 사람들을 만나 공부할 수 있다는 점도 매우매우 좋았다. 아쉬운 점이 분명 있지만 그걸 다 덮을 수 있을 정도로 좋은 일이 많았다.</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/f76be4a0-89d7-4a2e-870f-5f20ec1d6ea5/image.png" alt=""></p>
<p>(나의 1년 간 깃허브 잔디)
교육생 때인 2~ 6월까진 좀 하다가 인턴 생활 할 땐 텅텅 비어있는게 내 마음을 아프게 한다 엌ㅠㅠㅋㅋㅋㅋㅋ</p>
<hr>
<h2 id="인턴-생활">인턴 생활</h2>
<p>3개월동안 했던 인턴 생활. 사실 교육 때보다 인턴 생활이 더 아득한 옛날 같다.
직장 생활이 워낙 익숙했기도 하고, 친숙한 사람들과 일을 해서 그런지 정말 편했다. <strong>내가 모르는 부분이 정말 많다는 사실도 느꼈고 그래서 더 열심히 했던 것 같다.</strong>
얼른 1인분을 하고 싶었다. <strong>내 노력만큼의 보상이 따라준다면 어떤 일이든 다 맡을 수 있었다.</strong> 매일 12 ~ 15시간씩 회사에 있어도 그저 즐거웠던 기억 뿐이었다.
스트레스 받는 상황도 도전의식이 생겼고 문제가 풀렸을 때의 그 희열감이 사람 미치게 했다(ㅋㅋㅋ)</p>
<p><strong>사람들도 모난 사람없이 너무너무 좋았다. 금세 친해졌고 개인적인 이야기도, 업무적인 이야기도 모두 재미있었다.</strong> 약간 초식동물들이 있는 초원에서 여유롭게 풀 뜯어먹는 느낌이라고 해야하나. 그 전에 직장 생활에서 별로 좋은 기억이 없어서 더 그런 걸수도 있겠다. <strong>내가 공부하게끔 꾸준한 자극을 주시는 분도 많았다.</strong> 아니 어떻게 저러지? 싶은 분들이 사방에 널려있음. 열심히 안하고 싶어도 열심히 하게 되었다. (채찍질 해주시는 분도 있었다. 공부 할게요 ㅠㅠ)</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/db8f2528-c946-4baf-bb85-4ade132acd49/image.png" alt=""></p>
<p>(내가 인턴 기간 내내 매달려있던 업무 자동화 시스템.) 
애정을 넘어 애착까지 생길 지경이다. 고칠게 많았는데... 아쉬울 따름. 혼자 개인적으로라도 디벨롭할 생각이다.</p>
<p><strong>아쉽게도 인턴 생활을 더 이어가지는 못했다.</strong> 이것이 나에게 상당히 큰 후폭풍으로 다가왔는데 그 당시에는 자각이 덜 된 모양이었다. 정말 열심히 했는데 <strong>내 노력과 시간과 결과와는 전혀 다른 이유로 그만두게 되자 더이상 나아갈 원동력이 사라졌다.</strong> 회사생활이라는게 어떻게 자기 뜻대로 할 수 있겠냐만은, 나의 경우 천직이 아닐까 생각할 정도로 재미있게 일을 해왔기 때문에 더 크게 다가 왔던 것 같다. &quot;이래서 사람이 본인이 하고 싶은 일을 해야 한다는 거구나&quot; 라는 말을 실감할 정도로 새로운 이론, 툴, 논문을 보고 읽고 하는게 정말 재미있었으니 말이다.
오죽하면 맨날 일 얘기만 해서 혼나기도 했다 ^ ^;;ㅎㅎ
<strong>내가 통제하지 못하는 상황을 나는 정말 싫어한다는 사실을 올 해 처음 알게 되었다.</strong> 어쩔 수 없는 부분을 잘 흘려보내는 것도 능력인데, 25년에는 그런 면을 좀 더 다듬어야 겠다.
지금은 한... 95% 정도? 괜찮아졌다. 아직도 미련을 버리지 못한 전남자친구처럼 (ㅠㅠㅋㅋㅋㅋㅋ) 회사 관련 물건을 보면 마음 한켠이 쓰리지만(ㅠㅠㅋㅋㅋㅋㅋ) 인턴 생활하면서 하지 못했던 공부들을 할 수 있다는 것에 만족한다. 지금도 이정도인데 내가 직접 선택해서 간 회사라면 대체 얼마나 더 열심히 할런지 감도 안잡힌다 ^ ^ㅋ</p>
<p><strong>인턴 생활하면서 배운 점</strong></p>
<blockquote>
</blockquote>
<ol>
<li>생각보다 <strong>업무 자동화할 곳은 많다.</strong></li>
<li>생각보다 일이 중구난방이다.</li>
<li>생각보다 <strong>협업이 진짜 중요하다.</strong> 트러블 안나려면</li>
<li>생각보다 일은 하는 사람이 몰아받는다.</li>
<li>생각보다 <strong>적극적인 사람은 내부로도, 외부로도 좋다.</strong></li>
<li>생각보다 일에 <strong>열정을 가지고 하는 사람이 많다.</strong> 대단하다.</li>
</ol>
<hr>
<p>인턴 생활이 끝난지 이제 한달 되었는데 아이러니하게 24년도 끝이 난다. 
시간이 참 빠르다. <strong>그 한달동안 링크드인도 열심히 하고, 나름 벨로그도 열심히 하고, 논문도 읽고, 코딩 테스트 공부도 하면서 보냈다</strong>.
특히 코딩 공부를 많이 했는데, GPT 분리불안도 아니고 코드 한 줄 작성 못하는 개발자가 어디 있나 싶어서 시작했다. 아직 많이 부족하지만 하나씩 알아가는 재미가 있다.
<img src="https://velog.velcdn.com/images/joshua_1203/post/ab16ff22-5a7e-4928-a476-5c570bb186a9/image.png" alt=""></p>
<p>(너무 귀여운 프로그래머스 인증 스티커.)
교육에 있어 보상은 확실히 있어야 한다고 생각한다. 확실히 나는 그런 타입이라 저거 채우려고 더 열심히 함</p>
<hr>
<h2 id="앞으로의-계획과-다짐">앞으로의 계획과 다짐</h2>
<p>내 계획은 여타 취준생 분들과 별 다를게 없다</p>
<ul>
<li>25년 계획<blockquote>
</blockquote>
</li>
<li><em>- 목표: LLM 엔지니어로서의 성장.*</em></li>
<li><em>- 준비: 특정 기술(MLOps, AI 모델 최적화) 집중 학습.*</em></li>
<li><em>- 지원 전략: 링크드인 네트워킹 강화 및 프로젝트 결과물 포트폴리오화.*</em></li>
<li><em>- 자기계발: 꾸준한 논문 읽기와 새로운 기술 트렌드 파악.*</em><blockquote>
</blockquote>
</li>
<li>세부 내용<blockquote>
</blockquote>
</li>
<li><em>- 취업*</em></li>
<li><em>- 알고리즘 공부*</em></li>
<li><em>- 통계, ML, LLM*</em></li>
<li><em>- 영어 공부(회화, 공인)*</em></li>
<li><em>- 링크드인 일촌 300명*</em></li>
<li><em>- 벨로그 주 1회 발행*</em> (하루에 하나씩은 100퍼 무리라는 것을 이번 년도에 깨닫고 말았다...)</li>
<li><em>- 논문 리뷰*</em></li>
<li><em>- 꾸준히 수영 다니기*</em></li>
<li><em>- 대화하기, 오해하지 않기, 더 배려하기*</em></li>
</ul>
<hr>
<h2 id="outro">OUTRO</h2>
<p>주변에서 많이들 물어봤다. 지금까지 해온게 아깝지 않냐고 왜 맨날 그렇게 힘든 길을 돌아가냐고
난 그런 사람인가보다. <strong>내가 재미있는 일이라고 생각하면 앞뒤 안가리고, 직접 뛰어보고, 부딛혀보고, 넘어져도 보고, 아파도 해봐야 직성이 풀리는 성격</strong>이라 별 수 없다.
개발자 채용시장이 불안한거, 나도 안다. 하루에도 몇 번씩 좌절하기도 하지만 결국 잘 되리라 믿는다.
24년에 많이 쌓아올린 것처럼 25년에도 변함없이 내가 하고 싶은 것을 쌓아가며 나아가야겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[컴퓨터가 자아를 가지고 협업한다고? 'Generative Agents: Interactive Simulacra of Human Behavior' 논문 리뷰]]></title>
            <link>https://velog.io/@joshua_1203/Generative-Agents-Interactive-Simulacra-of-Human-Behavior-paper-review</link>
            <guid>https://velog.io/@joshua_1203/Generative-Agents-Interactive-Simulacra-of-Human-Behavior-paper-review</guid>
            <pubDate>Tue, 17 Dec 2024 06:34:21 GMT</pubDate>
            <description><![CDATA[<p>요즘 AI와 LLM 공부에 빠져 있는데
작년 논문이지만 정말 재미있는 논문이 있어서 가져왔다😎
이 논문에 대해 간단히 소개하자면 <strong>ChatGPT를 이용해 25개의 Agent를 생성하고, 이 에이전트들이 서로 어떻게 상호작용하는지에 대해 시뮬레이션</strong>해본 <del>엄청나게 재미있어 보이는</del> 논문이다.</p>
<blockquote>
<p>Joon Sung Park. (2023). Generative Agents: Interactive Simulacra of Human Behavior. arXiv.org. <a href="https://arxiv.org/abs/2304.03442v2">https://arxiv.org/abs/2304.03442v2</a></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/71185dc9-9e2a-4abd-b776-c036835d09e3/image.png" alt=""></p>
<hr>
<h3 id="1-📚-요약">1. 📚 요약</h3>
<p>이 논문에서는 &#39;생성 에이전트(Generative Agents)&#39;라는 개념을 소개한다. 생성 에이전트는 <strong>언어 모델을 기반으로 하여 사람의 행동을 사실적으로 시뮬레이션하는 컴퓨터 소프트웨어 에이전트</strong>이다. 이를 통해 몰입형 환경, 대인관계 의사소통 연습, 프로토타입 도구 등의 상호작용형 애플리케이션을 구현할 수 있다. 저자들은 <strong>이 에이전트가 자신의 경험을 자연어로 기록하고, 반성하며, 행동을 계획하는 메커니즘을 설명</strong>한다.</p>
<hr>
<h3 id="2-🏡-시뮬레이션-환경">2. 🏡 시뮬레이션 환경</h3>
<h4 id="생성-에이전트">[생성 에이전트]</h4>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/20a53aa1-e4e4-4c8a-87b0-9ba1493a1e9a/image.png" alt=""></p>
<p>생성 에이전트는 현실적인 인간 행동을 모사하기 위해 설계된 컴퓨터 에이전트로 이 에이전트들은 <strong>자아를 가지며, 특정 행동을 계획하고 이를 실행</strong>할 수 있다. 연구팀은 이러한 에이전트들이 어떻게 서로 소통하고 환경과 상호작용하는지를 연구했다. 각 에이전트는 <strong>개인적인 기억과 경험을 기반으로 한 상호작용을 통해 진화하고 독특한 사회적 행동을 생성</strong>한다.</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/908ce831-4205-46ab-8376-faab54f024ad/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/a185051a-43be-486c-939b-5b91f09b9836/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/dda90a7a-bfcf-463a-9905-e61ace24f78e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/10f123f0-991d-4ff6-8744-2547b1260701/image.png" alt=""></p>
<p>웹 데모에서는 각 에이전트의 현재 활동과 위치를 알 수 있다.
또한 에이전트들에게 부여된 여러 항목(생활 양식, 메모리 저장, 대화 내역 등)을 알 수 있다.</p>
<hr>
<h4 id="샌드박스-환경">[샌드박스 환경]</h4>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/7e9cedb4-8f3d-4473-913f-e3d160edec6d/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/a557bb3d-7cc5-4217-81e9-c197c9c4c12e/image.png" alt=""></p>
<p>이 연구에서 제안된 샌드박스 환경은 <code>&quot;Smallville&quot;</code>이라고 하며, 이는 <strong>The Sims 게임을 기반으로 한 가상의 마을을 구현</strong>한다. 이 환경에서는 <strong>25명의 개별 생성적 에이전트가 존재</strong>하며, 사용자와 상호작용할 수 있다. 에이전트들은 <strong>자연어를 사용하여 서로 대화하고 정보를 교환</strong>하며, 이러한 상호작용을 통해 <strong>사회적 행동을 형성</strong>한다.</p>
<hr>
<h4 id="아키텍처">[아키텍처]</h4>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/381cb228-5672-46c1-b837-390c85d90217/image.png" alt=""></p>
<blockquote>
<p><code>Generative Agents의 아키텍처</code></p>
</blockquote>
<ul>
<li><strong>메모리 스트림</strong></li>
<li><em>에이전트의 경험과 행동을 기록*</em>하는 구조로, 향후 참조를 위해 세밀하게 기록됨. 이 기억은 해당 메모리가 생성된 시간과 설명으로 구성.<blockquote>
</blockquote>
</li>
<li><strong>기억 검색 및 선택 메커니즘</strong>
에이전트는 <strong>필요할 때 적절한 기억을 검색하여 이를 기반으로 행동을 결정</strong>할 수 있다. 이 검색 과정은 recency(최신성), importance(중요성), relevance(관련성)의 세 가지 기준을 통해 이루어지며, 각 기억에 점수를 부여하여 가장 적합한 기억을 선택한다. 이 메커니즘은 에이전트가 상황에 적응하고 일관된 행동을 유지하는 데 기여한다.<blockquote>
</blockquote>
</li>
<li><strong>반영(Reflection)</strong></li>
<li><em>기초적인 경험을 추상화하여 더 복잡한 추론으로 발전*</em>시키는 과정. 에이전트는 이 정보를 바탕으로 더 나은 결정과 일반화를 위해 학습함.<blockquote>
</blockquote>
</li>
<li><strong>계획(Planning)</strong>: 에이전트는 <strong>효율적으로 행동을 계획하고, 이러한 계획을 기반으로 행동을 실행</strong>함. 이들은 주변 환경의 다른 상황 변화에 맞춰 자신의 행동을 조정.</li>
</ul>
<hr>
<h4 id="사례-연구-및-결과">[사례 연구 및 결과]</h4>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/525c411f-9031-4c90-8adc-4716f75b3c6f/image.png" alt=""></p>
<p>논문에서는 <strong>Isabella라는 에이전트가 발렌타인 데이 파티를 열도록 설정하는 실험을 통해 사회적 상호작용의 사례를 제시</strong>한다. 이 에이전트는 친구와 고객에게 초대장을 보냈고, 그 과정에서 여러 상호작용과 관계가 형성되었습니다. 에이전트들은 <strong>서로의 기억을 공유하면 자유롭게 행동하여 복잡한 사회적 행동을 전개</strong>하는 데 성공했다.</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/f16aaa19-9037-4aab-a380-804751d1f7ec/image.png" alt=""></p>
<p><strong>이사벨라의 계획을 들은 다른 에이전트들은 또 다른 에이전트에게 이 소식을 전하고</strong>, 이 소식을 접한 에이전트는 이사벨라에게 계획이 잘 진행되고 있는지 물어보는 등의 <strong>상호작용이 일어난다.</strong></p>
<hr>
<h3 id="3-🌟-insight">3. 🌟 Insight</h3>
<blockquote>
<ul>
<li><strong><u>인간 행동 모방 가능성</u></strong>
이 연구는 생성적 에이전트가 흡사한 <strong>인간과 같은 행동을 할 수 있음</strong>을 보여준다. 에이전트들은 실제 상황속에서 환경에 적응하거나 상호작용 할 수 있다.</li>
</ul>
</blockquote>
<ul>
<li><strong><u>사회적 상호작용의 역동성</u></strong>
에이전트 간의 <strong>자율적인 정보 교환과 사회적 관계 형성은 사전 프로그래밍 없이</strong> 이루어지며, 이는 인간의 상호작용 모델을 보다 정확하게 시뮬레이션할 수 있는 가능성을 제시함.<blockquote>
</blockquote>
</li>
<li><strong><u>기술적 미래 전망</u></strong>
생성적 에이전트를 통한 연구는 <strong>인간-컴퓨터 상호작용의 새로운 패러다임을 제시</strong>할 뿐만 아니라 사회적 시스템에 대한 테스트 및 프로토타이핑, 복잡한 대인관계 처리 방안 제시 등 다양한 분야에 응용될 수 있다는 점에서 큰 의의를 갖고 있다.</li>
</ul>
<hr>
<h3 id="4-🔍-한계">4. 🔍 한계</h3>
<blockquote>
<ul>
<li><strong>설명 가능성 부족</strong>
생성적 에이전트의 행동은 복잡한 메모리와 반응 구조에 의해 결정되지만 <strong>모든 행동이 어떻게 발생하는지에 대한 설명이 항상 명확하지 않을 수 있다.</strong></li>
</ul>
</blockquote>
<ul>
<li><strong>메모리 처리의 비효율성</strong>
에이전트는 <strong>메모리를 효과적으로 관리하고 활용하는 데 한계가 있다.</strong> 메모리 저장이 잘 이루어지긴 하지만 이를 어떻게 효과적으로 사용할지에 대한 체계적인 접근이 부족하다. 때문에 에이전트가 전형적이지 않은 행동을 하거나 일관성이 떨어지는 경우가 발생할 수 있다.<blockquote>
</blockquote>
</li>
<li><strong>비용 문제</strong>
에이전트의 동작에 따라 발생하는 <strong>콜 비용은 상당히 크며, 필요한 연산량이 많아 계산 시간도 길어진다</strong>. 이는 시스템의 실시간 반응성을 저하시킬 수 있으며, 실제 애플리케이션에서의 효율성을 영향을 미칠 수 있다. <del>(시뮬레이션을 2일 돌리는 데 수천 달러가 들었다는 이야기도 있다)</del>이러한 비용 문제는 대규모 에이전트 시스템의 운영에 있어 주요한 제한 요소가 된다.<blockquote>
</blockquote>
</li>
<li><strong>사회적 요구와 윤리적 고려</strong>
에이전트가 인간의 행동을 모방하는 만큼, 이로 인해 <strong>발생하는 사회적 요구와 윤리적 문제를 충분히 고려하지 못할 수 있다</strong>. 사용자들이 이러한 시스템에 대해 과도한 신뢰를 가지거나 잘못된 사용을 하게 될 우려가 있으므로, 이를 해결하기 위한 체계적 접근이 필요하다.</li>
</ul>
<hr>
<h3 id="5-결론">5. 결론</h3>
<p>Generative Agents는 단순한 NPC 이상의 역할을 하며, <strong>복잡한 사회적 환경 속에서 실제 사람들과 유사하게 행동할 수 있다</strong>. 이 연구에서의 발견은 AI와 인간의 상호작용을 보다 깊이 있게 이해하는 데 기여할 것이며, 향후 AI 기술의 발전 방향을 제시한다.
본 연구는 앞으로의 AI-인간 간의 상호작용이 직접적으로 영향을 미칠 수 있는 <strong>게임, 교육, 심리치료 등 다양한 분야에서 흥미로운 적용 사례를 제공할 수 있다</strong>. 이러한 기술적 발전은 잠재적으로 인간의 사회적 행동을 보다 깊게 이해하고 재현할 수 있는 기회를 만들어준다.
그러나 Generative Agents는 사회적 상호작용의 방식에 중대한 영향을 미치며, <strong>긍정적인 부분을 넘어 여러 부정적 요인들도 존재</strong>한다. 이를 통해 기술이 발전함에 따라, 사회적 상호작용에 미치는 다양하고 복합적인 영향들을 고려해야 할 필요성이 있다. 기술적인 진보가 이루어질수록 이러한 영향에 대한 심도 깊은 논의와 윤리적 고찰이 병행되어야 할 것이다.</p>
<hr>
<h3 id="6-개인적인-견해">6. 개인적인 견해</h3>
<p>처음에는 &quot;무슨 SF 소설 이야기 하나&quot; 하면서 논문을 살펴봤는데, Agent에게 상세한 prompt를 부여하고 그에 맞는 상호작용을 시키기 위해 많은 작업을 진행한 연구팀의 노력이 보여서 숙연해졌다. 이 논문에서는 <strong>단순히 agent가 만났던 빈도 수, 최근 대화 기록만으로 행동을 선택하는 것이 아닌 &#39;실제 사람이 선택할만한 이유&#39;를 가지고 agent들을 상호작용 시키기 위해 여러 작업을 진행</strong>하였다.
인간의 상호작용은 매우 복잡하다. 이성적인 판단, 감정적인 생각, 현재 처해진 환경 등 고려 요소가 수도 없이 많다. 이런 복잡한 메커니즘을 어떻게 구현하나 겁먹고 시도하지 않는 것보다 조금 부족한 면이 있어도 시도를 해본 것이 발전의 시작이자 이 논문이 가지고 있는 의의가 아닐까 싶다.</p>
<hr>
<h3 id="7-논문-자료link">7. 논문 자료(link)</h3>
<p>[논문원본]<a href="https://arxiv.org/abs/2304.03442">https://arxiv.org/abs/2304.03442</a>
[논문 웹 데모]<a href="https://reverie.herokuapp.com/arXiv_Demo/">https://reverie.herokuapp.com/arXiv_Demo/</a></p>
<p>이번 포스팅은 두 분의 블로그를 많이 참고했다 !
<a href="https://insoo-hwang.tistory.com/28">https://insoo-hwang.tistory.com/28</a>
<a href="https://facerain.me/generative-agents-paper-review/">https://facerain.me/generative-agents-paper-review/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[아직GPT만 쓰세요? 자료 조사와 정리의 새로운 기준이 되는 AI 툴 5개 비교]]></title>
            <link>https://velog.io/@joshua_1203/AI-tools</link>
            <guid>https://velog.io/@joshua_1203/AI-tools</guid>
            <pubDate>Sun, 08 Dec 2024 09:02:41 GMT</pubDate>
            <description><![CDATA[<p>이번 포스팅은 어마어마한 스크롤을 자랑합니다..^^;;
급하신 분들은 목차에 보이는 툴들을 빠르게 훑어보신 뒤 4. 비교 표를 참고해주세요.
(저는 개인적으로 genspark와 Liner가 제일 좋았습니다!!)</p>
<ul>
<li><strong>리서치 툴 소개를 위해 질문은 통일</strong>하였습니다.
(코딩 교육 / kt / 지식 맵)</li>
<li>모두 <strong>무료버전으로만 진행</strong>하였습니다. 유료 버전은 지원하는 내용이 다를 수 있습니다.</li>
</ul>
<hr>
<h2 id="1-서론">1. 서론</h2>
<p>왜 AI 리서치 툴이 필요한가?
디지털 시대에 정보를 검색하고 정리하는 일은 일상적인 과제가 되었다. 우리는 프로젝트, 보고서 작성, 학습 등 다양한 상황에서 정확하고 신뢰할 수 있는 정보를 빠르게 찾아야 한다. 하지만 <strong>수많은 웹페이지를 일일이 확인하며 필요한 데이터를 추출하는 일은 시간 소모</strong>가 크고, 가끔은 <strong>너무 방대하거나 부족한 결과에 실망</strong>하기도 한다.</p>
<p>이제 이런 문제를 해결하기 위해 등장한 것이 바로 <strong>AI 기반 리서치 툴</strong>이다. AI는 단순히 정보를 검색하는 수준을 넘어, <strong>방대한 자료를 요약하고, 분석하며, 적합한 결과를 추천</strong>해주는 데까지 발전했다. 특히, 검색 엔진의 한계를 보완해 더 정교하고 유용한 결과를 제공하는 점에서 많은 관심을 받고 있다.</p>
<p>그렇다면, <strong>다양한 AI 리서치 툴들 중 어떤 것이 나에게 가장 적합할까?</strong> 이 글에서는 가장 <strong>주목받는 AI 리서치 툴들을 소개</strong>하고, 세부 기능의 비교를 통해 가장 적절한 툴을 찾아보려고 한다.</p>
<hr>
<h2 id="2-주요-ai-리서치-툴">2. 주요 AI 리서치 툴</h2>
<p>이번 포스팅에서 소개할 리서치 툴은 총 5개로, 이외에도 AI 툴은 많지만 대표적이고, 무료로 충분히 사용 가능하다고 생각되어 선정하였다.</p>
<blockquote>
</blockquote>
<ul>
<li>perplexity</li>
<li>genspark</li>
<li>Liner</li>
<li>Felo</li>
<li>consensus</li>
</ul>
<hr>
<h2 id="3-세부적인-툴-소개">3. 세부적인 툴 소개</h2>
<h3 id="✨-perplexity">✨ Perplexity</h3>
<p><a href="https://www.perplexity.ai/">https://www.perplexity.ai/</a>
<img src="https://velog.velcdn.com/images/joshua_1203/post/e53bed48-4473-4f70-8503-e6123f9a5961/image.png" alt=""></p>
<p>퍼플렉시티는 <strong>질문 기반의 정보 검색 플랫폼</strong>으로, 실시간으로 웹에서 정보를 검색하고 사용자에게 관련된 답변을 제공한다.</p>
<blockquote>
</blockquote>
<ul>
<li><strong>실시간 웹 검색</strong>: 사용자의 질문에 대해 최신 웹 데이터를 기반으로 답변 제공</li>
<li><strong>다양한 출처</strong>: 여러 정보 출처에서 데이터를 수집하여 신뢰할 수 있는 정보 제공</li>
<li><strong>AI 기반 자연어 처리</strong>: 자연어 처리 기술을 활용해 사용자 요청에 맞는 정확한 정보를 신속하게 전달</li>
</ul>
<h4 id="↳-사용법과-주요-기능">↳ 사용법과 주요 기능</h4>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/643a949c-5902-4748-88b7-1afd63e9048a/image.png" alt=""></p>
<p>홈페이지를 들어가면 GPT와 비슷한 화면이 나온다.</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/a1ace861-8d24-438b-b3d3-ec1a14a9f6e4/image.png" alt=""></p>
<p>이렇게 <strong>모드를 선택할 수 있다는 것</strong>이 새로웠다.
퍼플렉시티는 <strong>수학과 과학, 코드 분야에 특화</strong>되어 있다고 하는데,
그래서 그런지 수학 탭이 따로 있었다</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/3a79a234-58a9-42bc-93df-c659dc617690/image.png" alt=""></p>
<p>요즘 코딩 교육에 관심이 많아서 개인적으로 프로젝트를 진행하려 한다.
그 중 전에 배웠던 <strong>kt나 지식 맵을 활용할 수 있는지 궁금해 질문해봤다.</strong></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/5b82701f-7c85-4536-b4a2-f750c72432a7/image.png" alt=""></p>
<p>perplexity의 특징 중 하나가 군더더기 없이 <strong>결과를 깔끔하게 보여준다</strong>는 점이다.</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/d99757d7-76b6-495e-8eb3-9cc15b56896d/image.png" alt=""></p>
<p>질문 - 답에서 끝나는 것이 아니라 <strong>관련된 질문</strong>을 만들어줘서
내가 미쳐 생각하지 못한 부분이나 추가로 물어 볼만한 질문을 바로 할 수 있다.
<img src="https://velog.velcdn.com/images/joshua_1203/post/939a6558-dd16-4fdc-8b87-804ef163e255/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/5ecdbef2-98b7-4c2b-80b6-cd090d955344/image.png" alt=""></p>
<p>그 외에도 <strong>발견하기(뉴스레터 같은 느낌)나 도서관(질문 내용 보관함) 등을 제공</strong>하고 있다.</p>
<table>
<thead>
<tr>
<th align="center"><img src="https://velog.velcdn.com/images/joshua_1203/post/be375036-c038-45d8-be37-b731514a4cf2/image.png" alt="이미지 1"></th>
<th align="center"><img src="https://velog.velcdn.com/images/joshua_1203/post/4ada6f44-b180-4217-85cd-7431b31dd143/image.png" alt="이미지 2"></th>
</tr>
</thead>
</table>
<p><del>참고로 궁금해서 수학 관련 질문해봤는데 무슨 소리인지 모르겠어서 검증이 불가능했다 엌</del></p>
<hr>
<h3 id="✨-genspark">✨ Genspark</h3>
<p><a href="https://www.genspark.ai/">https://www.genspark.ai/</a>
<img src="https://velog.velcdn.com/images/joshua_1203/post/9c19aadb-d235-4349-8422-86eb4155e4ff/image.png" alt=""></p>
<p>젠스파크는 <strong>정보 검색 시 AI 기반 기술을 통해 사용자 맞춤형 정보를 제공</strong>한다.</p>
<blockquote>
</blockquote>
<ul>
<li><strong>맞춤형 정보 제공</strong>: 사용자의 검색 쿼리에 따라서 개인화된 페이지를 생성</li>
<li><strong>비교 검색</strong>: 다양한 웹 사이트에서 정보를 비교하며 확인</li>
<li><strong>추천 시스템</strong>: 예상 질문 목록이나 관련 검색어를 추천하여 사용자 경험 향상</li>
</ul>
<h4 id="↳-사용법과-주요-기능-1">↳ 사용법과 주요 기능</h4>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/93fa3f04-e8ed-4a91-93d3-0d4044c4a5ec/image.png" alt=""></p>
<p>똑같은 질문으로 작성해서 물어봤다.</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/8691408f-454a-44bb-959d-5cbddd1aab4a/image.png" alt=""></p>
<p><strong>genspark는 다른 툴보다 특히(?) 시간이 느렸는데, 그만한 이유가 있다.</strong></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/d863fdee-e479-4302-86ad-5c803bddb290/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/ca275377-bc42-4477-b2f3-af1e68a777fd/image.png" alt="">
최종 답변까지 조금 시간이 걸리지만, <strong>생성되는 과정을 실시간으로 보여주고, 교차 검증도 제공</strong>한다. 다만 개인적으로는 UI가 좀 불편했다.</p>
<hr>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/bae0ff53-16aa-4944-9825-3bf6b36f2394/image.png" alt=""></p>
<p>이리저리 찾아보고 알아낸 결과, 맨 처음 화면으로 다시 돌어오면 있는 <code>Autopilot agent</code>를 발견했는데 이 UI가 훨씬 마음에 들었다🎉.
<img src="https://velog.velcdn.com/images/joshua_1203/post/c6f7ec70-a4d9-40c2-8e4e-59af7f6fd6de/image.png" alt=""></p>
<p><strong>데이터 검색 / 교차 검사</strong> 중 선택할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/6918e41e-46f0-413d-98ba-3661516a4283/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/cb00d6b9-756b-4cb2-b120-4b3a8e06150b/image.png" alt=""></p>
<p>정말 시간이 오래걸린다. <strong>질문 하나에 30분</strong>이라니 !!!!</p>
<p>그럼에도 genspark가 정말 마음에 들었던 점은, 
<strong>계획 - 실행 - 반성 - 계획 수정</strong>의 단계를 계속 거친다는 점이었다.
<del>프롬프트로 따지면 CoT 려나</del>
<img src="https://velog.velcdn.com/images/joshua_1203/post/20096598-ed86-433b-8eea-caa29d8d2d6f/image.png" alt=""></p>
<p>질문을 하면 <strong>10 ~ 30초 이내로 빠른 답변</strong>을 내보낸다.
그 다음 <strong>실행 계획을 구체화</strong>한 뒤 데이터를 채워간다.</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/ba44d557-ca5d-49ad-9606-5dd7a9f9e27f/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/f4726dd7-5e2f-474c-9de5-f4cb1bc61ce8/image.png" alt=""></p>
<p>실행 계획을 세우기 전에 내가 입력한 <strong>텍스트를 토대로 어떤 걸 원한다고 판단했는지에 대해 정의</strong>하고, <strong>데이터 분석 테이블</strong>을 만든다.</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/e7f1d682-0fbc-45d6-ac9b-b8ce8093fd6d/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/8f106218-e4b7-482a-8876-a27a0cbb2d06/image.png" alt=""></p>
<p>그 다음 <strong>웹 사이트를 돌며 정보를 수집하면서 데이터 테이블을 채워간다.</strong>
이 모든 것이 작업 공간에서 <strong>실시간</strong>으로 보여진다.</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/d2e04aa2-7faa-4407-a6ff-bb72f7b534ca/image.png" alt=""></p>
<p>그리고 <strong>중간중간 Agent가 찾은 내용에 대해 부족한 점이 없는지 검토</strong>한다.
부족한 점이 있다면 <strong>실행 계획을 조정하며 최종 답변을 낸다.</strong>
이 부분에서 시간이 오래걸리는 점을 수긍할 수 있게 되었다. 이거 짱인데..😎</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/53c87ef0-24ab-42a5-b49f-cb065979b2f8/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/4a2a40a4-a322-49c8-b92d-545aeef3403b/image.png" alt=""></p>
<p>시간이 지난 뒤 최종 답변을 출력한다. 이 부분에서는 agent가 실행한 내용은 숨김 처리되고 결과만 깔끔하게 보여진다. <strong>agnet가 채웠던 데이터 테이블은 마지막에 한번에 정리</strong>된다.</p>
<hr>
<h3 id="✨-liner">✨ Liner</h3>
<p><a href="https://getliner.com/ko">https://getliner.com/ko</a></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/51f3c4b2-8129-4134-961a-5858ea01a0b1/image.png" alt=""></p>
<p>(이 툴은 특히 <strong>한국 기업의 검색 엔진</strong>이라 왠지 모르게 더 좋았다. 편협한 시선 인정한다🙄)</p>
<p>라이너는 <strong>연구 및 정보를 탐색하는 데 특화된 검색 엔진</strong>으로, <strong>신뢰성</strong>과 <strong>직관적인 검색 기능</strong>을 갖춘 플랫폼이다.</p>
<blockquote>
</blockquote>
<ul>
<li><strong>Liner Ranker 기술</strong>: 문서의 신뢰성과 관련성을 점수화하여 최적의 결과 제공</li>
<li><strong>연구 도구 통합</strong>: 학술 정보를 필터링하고 관련 연구를 신속하게 탐색할 수 있는 기능 제공</li>
<li><strong>빠른 정보 탐색</strong>: 필요한 정보를 효율적으로 찾을 수 있도록 도움</li>
</ul>
<h4 id="↳-사용법과-주요-기능-2">↳ 사용법과 주요 기능</h4>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/d63aec2c-5fcc-436e-a4a1-e478d51f9afe/image.png" alt=""></p>
<p>라이너는 <strong>메인 화면에서 여러가지를 설정</strong>할 수 있다.</p>
<p>1) <strong>웹</strong> 검색 / <strong>에세이 작성</strong> 선택
<img src="https://velog.velcdn.com/images/joshua_1203/post/d2a1d4d3-80a7-4dae-b96f-899321ab28ee/image.png" alt=""></p>
<p>에세이 작성을 누르면 이런 화면이 보인다.
<code>내 글쓰기 스타일 적용</code> 기능이 마음에 들었다. notebookLM 느낌?</p>
<hr>
<p>2) <strong>일반</strong> 검색 / <strong>학술</strong> 검색</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/1e3733d5-b3bd-4d1b-a3c3-5d1160ffc76d/image.png" alt=""></p>
<hr>
<p>3) <strong>모델</strong> 선택 / <strong>맞춤</strong> 설정</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/0bd6400b-c0c1-452a-8d9b-ad7ef093cd9a/image.png" alt=""></p>
<table>
<thead>
<tr>
<th align="center"><img src="https://velog.velcdn.com/images/joshua_1203/post/7af7e0ee-fc35-4420-83d9-a07ea4896fef/image.png" alt=""></th>
<th align="center"><img src="https://velog.velcdn.com/images/joshua_1203/post/0e311b35-bfb7-485d-83c1-51ca6b38412f/image.png" alt=""></th>
</tr>
</thead>
<tbody><tr>
<td align="center">pro 버전이 아니어서 여러 설정을 사용해볼 수는 없었지만 다양한 글쓰기 설정을 제공하고 있다.</td>
<td align="center"></td>
</tr>
</tbody></table>
<hr>
<p>결과 화면
<img src="https://velog.velcdn.com/images/joshua_1203/post/f717cbbc-a12d-4c13-b9a2-810df3557d89/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/7eef1487-135f-4124-b67f-ac418a538bfc/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/ca77790f-5d81-442e-9cbb-1783c1c7c3c5/image.png" alt=""></p>
<p>최종 답변 안에 어디에서 인용해왔는 지와 중요한 부분에 <strong>하이라이팅</strong>이 되어 있고, 옆에는 검색된 출처가 있다.
<strong>통상 10 ~ 20개 정도의 출처를 가져오는 것 같다.</strong>
그리고 다른 툴들과 마찬가지로 <strong>결과에 대한 관련 질문을 제공</strong>한다.
개인적으로는 <strong>가장 직관적인 UI</strong>라고 생각했고, 무료 버전에서 활용할 수 있는 부분이 가장 많은 툴이 아닌가 싶었다.</p>
<hr>
<h3 id="✨-felo">✨ Felo</h3>
<p><a href="https://felo.ai/ko/search">https://felo.ai/ko/search</a>
<img src="https://velog.velcdn.com/images/joshua_1203/post/330345fb-5a7b-447e-b7ca-2edafbcc769d/image.png" alt=""></p>
<p>Felo는 <strong>실시간 번역과 검색 기능을 제공하는 AI 기반 커뮤니케이션 도구</strong>다.</p>
<blockquote>
</blockquote>
<ul>
<li><strong>번역 기능</strong>: 전 세계적인 정보에 대한 실시간 번역과 다국어 지원.</li>
<li><strong>다양한 자료 제공</strong>: 학술 자료 검색 및 다국어 변환을 통한 더 넓은 자료 접근.</li>
<li><strong>시각화 자료 제공</strong>: 마인드 맵과 같은 시각화 도구로 데이터를 보다 쉽게 이해.</li>
</ul>
<h4 id="↳-사용법과-주요-기능-3">↳ 사용법과 주요 기능</h4>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/022d6afd-26e9-44b2-95b8-2ba8de85326d/image.JPG" alt=""></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/dcc28d47-56a4-45a6-8f5b-f6dd47eb90e4/image.png" alt=""></p>
<p>왜이렇게 짧은가 - 에 대해 변명을 좀 하자면 <strong>Felo는 앞의 툴들의 성능이나 UI가 거의 똑같다</strong>(특히 perplexity와 진짜 비슷하게 생겼다).
하나 눈여겨 볼 점은 바로 <strong>마인드맵</strong>을 제공한다는 것인데, <strong>검색된 내용을 토대로 마인드맵을 그려준다</strong>. 이 기능이 좋아서 쓰는 사람들도 많다고 들었다.</p>
<hr>
<h3 id="✨-consensus">✨ Consensus</h3>
<p><a href="https://consensus.app/search/">https://consensus.app/search/</a></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/f67f52ce-7dba-4c18-ba64-0c7a32a37f8b/image.png" alt=""></p>
<p>Consensus는 <strong>AI 기반의 학술 리서치 툴</strong>로, 과학 및 학술 자료를 신속하게 검색하고 분석할 수 있도록 지원한다.</p>
<blockquote>
</blockquote>
<ul>
<li><strong>200M 이상의 자료 검색</strong>: 2억 개 이상의 피어 리뷰 논문에서 즉시 전문가 인사이트 제공</li>
<li><strong>정확한 출처 제공</strong>: 모든 정보에 대한 출처를 명확히 제시하여 사용자가 신뢰할 수 있도록 함</li>
<li><strong>논문 요약 기능</strong>: 검색된 논문의 핵심 통찰을 빠르게 추출하여 제공</li>
</ul>
<h4 id="↳-사용법과-주요-기능-4">↳ 사용법과 주요 기능</h4>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/09d1e890-bd5c-424e-b5db-30e1ed9c0d85/image.png" alt=""></p>
<p>한국어도 지원이 되지만 <strong>영어로 검색</strong>하는 것이 훨씬 좋다고 한다.</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/09fca317-801e-478e-b297-d0b4584ac78c/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/975aa32f-8e33-4d28-b93b-bd30859acbce/image.png" alt=""></p>
<p>그래도 한국어로 물어봤다 ^ ^
<strong>어마어마한 수의 논문을 한 줄로 요약</strong>해주고, <strong>바로 인용도 가능</strong>하게 되어 있다.</p>
<table>
<thead>
<tr>
<th align="center"><img src="https://velog.velcdn.com/images/joshua_1203/post/40adf6fd-8f3c-4550-a831-efdfe89054f3/image.png" alt=""></th>
<th align="center"><img src="https://velog.velcdn.com/images/joshua_1203/post/f833b904-0cd2-4eae-afcc-f53361135417/image.png" alt=""></th>
</tr>
</thead>
</table>
<p>학술 논문 리서치 툴답게 논문에 대한 <strong>메타 데이터를 직접 선택해서 솔팅</strong>할 수도 있다. </p>
<hr>
<h2 id="4-어떤-툴을-선택해야-할까">4. 어떤 툴을 선택해야 할까?</h2>
<p>아래는 오늘 살펴본 AI 리서치 툴들의 주요 특징과 비교를 표 형식으로 정리한 내용이다.
<strong>개인적인 견해가 들어가 있으니 직접 사용해보고 판단하시길 바란다.</strong></p>
<table>
<thead>
<tr>
<th><strong>툴 이름</strong></th>
<th><strong>주요 특징</strong></th>
<th><strong>장점</strong></th>
<th><strong>단점</strong></th>
<th><strong>활용 사례</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>Perplexity</strong></td>
<td>실시간 웹 검색 및 다양한 출처에서 데이터를 수집하여 AI 기반 답변 제공</td>
<td>- 실시간 정보 제공<br>- 관련 질문 추천<br>- 그래프, 이미지 등 시각 자료 지원</td>
<td>- <strong>수학/과학 중심</strong><br>- 전문성 부족 시 검증 어려움</td>
<td>질문 기반 정보 검색, 보고서 작성 지원</td>
</tr>
<tr>
<td><strong>Genspark</strong></td>
<td>사용자 맞춤형 정보 제공 및 비교 검색, 실행 계획 단계화</td>
<td>- 교차 검증 제공<br>- <strong>계획-실행-검토-수정 단계 반복</strong><br>- 실시간 진행 상황 제공</td>
<td>- <strong>응답 시간 느림</strong><br>- 복잡한 UI</td>
<td>연구 프로젝트 진행, 단계별 데이터 수집 및 분석</td>
</tr>
<tr>
<td><strong>Liner</strong></td>
<td><strong>학술 및 일반 정보를 직관적으로 탐색</strong>할 수 있는 한국 기업의 검색 엔진</td>
<td>- 직관적인 UI<br>- 다양한 설정 가능<br>- 신뢰성과 관련성을 점수화하여 최적 결과 제공</td>
<td>- 일부 고급 기능은 유료 버전에 제한</td>
<td>학술 검색, 에세이 작성, 관련 연구 탐색</td>
</tr>
<tr>
<td><strong>Felo</strong></td>
<td>실시간 번역, 다국어 지원, 마인드맵 기능을 통한 시각화 도구 제공</td>
<td>- <strong>마인드맵 제공</strong><br>- 학술 자료 검색 및 다국어 변환<br>- 문서 미리보기 제공</td>
<td>- UI가 다른 툴과 유사<br>- 일부 기능 제한</td>
<td>학술 자료 번역 및 분석, 데이터 시각화</td>
</tr>
<tr>
<td><strong>Consensus</strong></td>
<td>연구 결과와 통계를 분석한 데이터를 기반으로 한 AI 검색</td>
<td>- 신뢰도 높은 결과 제공<br>- <strong>논문과 연구 중심</strong><br>- 과학적 근거 제공</td>
<td>- 일반 검색 기능 부족<br>- 기술적인 주제 중심</td>
<td>연구 기반 논문 분석, 과학적 자료 비교</td>
</tr>
</tbody></table>
<hr>
<h2 id="5-결론">5. 결론</h2>
<p>AI 리서치 툴은 디지털 시대에 정보 검색과 분석을 더욱 효과적으로 수행할 수 있도록 도와주는 강력한 도구다. <strong>각 툴은 고유한 기능과 특징을 가지고 있어, 사용자가 필요에 따라 적절히 선택해 활용하는 것이 중요하다.</strong></p>
<p>Perplexity, Genspark, Liner, Felo, Consensus와 같은 툴은 각각의 강점과 용도를 가지고 있다. 툴은 특화된 부분을 통해 <strong>실시간 정보 검색, 체계적인 연구 계획 수립, 한국어 검색 최적화, 다국어 번역 및 시각화, 과학적 데이터 기반 분석 등</strong> 다양한 요구를 충족시킬 수 있다.</p>
<p>따라서 <strong>사용자는 자신의 목표와 프로젝트의 특성에 맞는 툴을 선택해야 하며, 필요에 따라 여러 툴을 조합하여 활용하는 전략을 고려할 수 있다.</strong> 이러한 AI 리서치 툴은 단순히 정보를 제공하는 것을 넘어, 우리의 작업 효율성을 높이고, 더 나은 의사결정을 내릴 수 있도록 돕는 동반자가 될 것이다.</p>
<p>AI 리서치 툴은 정보의 홍수 속에서 길을 잃지 않도록 방향을 제시해준다. 또한 시간을 절약하고 더 나은 결과를 얻을 수 있게 함으로써 업무 생산성 향상에 큰 역할을 할 것으로 보인다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[임시파일이 80GB🙄?? tmpreaper/tmpwatch로 물리치자]]></title>
            <link>https://velog.io/@joshua_1203/tmpreaper-tmpwatch</link>
            <guid>https://velog.io/@joshua_1203/tmpreaper-tmpwatch</guid>
            <pubDate>Thu, 05 Dec 2024 11:51:02 GMT</pubDate>
            <description><![CDATA[<h2 id="🔍사건의-발단">🔍사건의 발단</h2>
<p>AWS EC2 서버에서 여러가지 작업 중이었는데, 갑자기 제보를 받았다</p>
<p>👤*&quot;슈아님, <strong>쓰고 계신 인스턴스가 꽉 찼다고 나오던데</strong>, 확인해보셨나요?&quot;*</p>
<p>넹😅?</p>
<p>어리둥절해진 나는 <code>df -h</code>로 스토리지를 확인해봤다.</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/7d2e056c-e491-4353-aa83-e7c3b2615a26/image.png" alt=""></p>
<p>띠용????
정말 많이 쳐줘야 20GB를 쓰고 있었는데 <strong>갑자기 100GB를 썼다고</strong>?</p>
<p>원인을 파악하기 위해서 파일 별로 용량을 확인해봤다.
그리고는 엄청난 파일을 발견하게 되는데...</p>
<hr>
<h2 id="🔍-원인">🔍 원인</h2>
<p><code>sudo du -ah /tmp | sort -rh | head -n 20</code> : tmp 파일 크기 순 상위 20개 출력하기</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/0ee0ef93-a55c-48fd-b8f4-d0eb9db3f14d/image.png" alt=""></p>
<p><strong>임시 파일이 84GB</strong>요??????????</p>
<p>chromeium이라고 나오는 걸 보니 <strong>크롤링 문제</strong>인 듯 싶었다.
조금 찾아보고 이유를 알게 되었다.</p>
<blockquote>
</blockquote>
<ol>
<li>데이터를 수집하기 위해 <strong>브라우저를 실행할 때 저장되는 캐시 데이터</strong></li>
<li>수집하면서 <strong>닫히지 않은 브라우저</strong></li>
</ol>
<p>이 두개가 임시 파일에 계속 쌓이면서 생긴 현상이었다.
그래서 자동으로 수집되고 있던 데이터들도 수집이 안되고 있었고...
수집되는 데이터가 워낙 많다 보니 빠르게 쌓인 듯 보였다.
<img src="https://velog.velcdn.com/images/joshua_1203/post/a71e6de7-5090-4de7-bbdd-87c4def306bb/image.png" alt=""></p>
<p>(대충 슬픈 짤)</p>
<hr>
<h2 id="🔍-해결-방법">🔍 해결 방법</h2>
<blockquote>
<ol>
<li><strong>tmpwatch</strong>(접근 시간을 기준으로 삭제, <strong>CentOS</strong>)
<code>sudo yum install tmpwatch</code> // 설치
<code>tmpwatch 24 /tmp</code> // 디렉토리에서 마지막 접근 시간이 24시간 이상 지난 파일 삭제</li>
</ol>
<ol start="2">
<li><strong>tmpreaper</strong>(접근 시간 + 생성 시간 + 수정 시간 가능, <strong>Ubuntu</strong>)
<code>sudo apt update</code>  // apt 최신화
<code>sudo apt install tmpreaper</code> // 설치
<code>sudo tmpreaper 1440 /tmp</code> // 접근 시간이 1440분(24시간) 이상 지난 파일 삭제</li>
</ol>
</blockquote>
<p>두 가지 중 선택해서 크론탭을 걸어놓는 것이다.</p>
<hr>
<h2 id="🔍-그런데도-오류가-난다">🔍 그런데도 오류가 난다?</h2>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/87a689cd-a61d-4c54-ba83-45ee60adf86f/image.png" alt=""></p>
<p>문제는 계속 <strong>run time 오류가 발생</strong>하는 것이다
도대체 왜 이럴까 찾아봤는데, tmpreaper는 위에서 부터 차례로 파일을 삭제하는 형식이 아닌 <strong>전체 파일을 읽고 삭제하는 방식</strong>이었다.
한번에 84GB에 해당하는 전체 파일을 읽으려고 하니 오류가 발생한 것..🙄</p>
<p>그래서 <strong>강제로 삭제시키는 명령어</strong>를 사용할 수 밖에 없었다.</p>
<blockquote>
</blockquote>
<p><code>sudo find /tmp -type f -mtime +7 -exec rm -f {} \;</code></p>
<blockquote>
</blockquote>
<p><code>sudo</code> : 관리자 권한으로 명령 실행
<code>find /tmp</code> : /tmp 디렉토리에서 검색 시작
<code>-type f</code> : 검색 대상이 <strong>파일(file)</strong>임을 지정 (디렉토리는 제외)
<code>-mtime +7</code> : 마지막으로 수정된 지 7일 이상 지난 파일 찾기(+7은 7일 초과를 의미 = 즉 8일째부터 해당)
<code>-exec rm -f {} \;</code> :
찾은 파일에 대해 rm -f 명령을 실행하여 삭제
<code>{}</code> : 검색된 파일 이름 참조
<code>\;</code> : find 명령에 대한 -exec 옵션의 종료</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/671db048-a581-4458-86ff-5861206aaf1e/image.png" alt=""></p>
<p>열심히 지워지고 있는 나의 tmp 파일...</p>
<p>그 뒤로 <strong>자동화도 걸어둔다</strong>.</p>
<blockquote>
</blockquote>
<p><code>crontab -e</code> // 크론탭 실행
<code>0 0 * * * /usr/sbin/tmpreaper 10080 /tmp</code> // 매일 자정 마지막으로 접근한 지 7일 이상 지난 파일을 삭제</p>
<hr>
<p>/
/</p>
<p>얼추 자동화가 끝났다고 생각해서 손도 안대고 있던 항목이었는데 이런 상황이 생겨서 매우 당황했다.
왜 이상치에 대해 알림을 해놓는지도 뼈저리게(?) 알게된 순간이었다.
나중에 또 서버를 이용하게 된다면 그 땐 모니터링에 신경을 좀 써야겠다 ㅠㅠ</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/c53468cf-5ef7-4063-a0eb-78f6d7194b29/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS Lambda, API Gateway, CloudWatch를 이용한 메일링 로그 추적 구축]]></title>
            <link>https://velog.io/@joshua_1203/AWS-Lambda-API-Gateway-CloudWatch</link>
            <guid>https://velog.io/@joshua_1203/AWS-Lambda-API-Gateway-CloudWatch</guid>
            <pubDate>Mon, 02 Dec 2024 09:02:16 GMT</pubDate>
            <description><![CDATA[<p>🧐인턴 생활 마지막 글🧐
정말 재미있게 일했고, 그만큼 아쉬움도 크지만 좋은 경험이 되었다고 생각한다
그리고 중요한 건 <strong>내가 스스로 생각해서 문제를 해결한 경험</strong>이 생겼다는 것 !
<img src="https://velog.velcdn.com/images/joshua_1203/post/88eeb100-c80b-4af4-9475-147e9c69c79a/image.png" alt=""></p>
<hr>
<h2 id="1-직면한-문제">1. 직면한 문제</h2>
<blockquote>
</blockquote>
<p>[문제 상황]</p>
<blockquote>
</blockquote>
<p>AWS의 SES로 메일을 보낼 때 유독 <strong>naver메일만 open 로그가 찍히지 않는 현상</strong> 발생</p>
<p>SES는 기본적으로 메일 열람 여부, 메일 내 링크 클릭 여부, 반송 여부 등을 추적하는 시스템이 내장되어 있다
(구성세트라고 하고, 더 자세한 내용은 <a href="https://velog.io/@joshua_1203/AWS-SES">https://velog.io/@joshua_1203/AWS-SES</a> 이 포스팅을 참고하면 된다 !!)
그런데... 어째서인지 네이버 메일은 메일 열람 여부가 작동하지 않았다.
아무래도 <strong>네이버 클라이언트가 보안 상 1x1 픽셀 이미지를 tracker로 간주하고 차단</strong>하는 모양이었다.
이 문제를 어떻게 해결할 것인가에 대해 기획자분과 이야기를 나누었다.</p>
<blockquote>
</blockquote>
<p>[문제 해결 방법 모색]</p>
<blockquote>
</blockquote>
<p><strong>1. AWS 담당자와 연락하기</strong></p>
<blockquote>
</blockquote>
<p><strong>2. AWS의 다른 서비스를 이용하여 직접 로그 추적 구축하기</strong></p>
<blockquote>
</blockquote>
<p><strong>3. 메일을 보낼 때 naver메일은 받지 않기</strong></p>
<p><strong>1번의 경우 가장 확실했지만 담당자가 누구인지, 또 AWS는 글로벌 서비스이기 때문에 과연 이 문제를 바로 해결할 수 있을 지에 대한 의문</strong>이 있었다. 이 해결 방법은 같은 사무실에 인프라 담당자 분이 계셔서 그 분께 맡겼다.</p>
<p>그렇다고 가만히 손을 놓을 수도 없는 일이었다. 메일을 보내는 <strong>수신자의 절반 이상이 네이버 메일을 사용</strong>하고 있었다. 메일링의 지표로 <strong>오픈율</strong>과 <strong>클릭률</strong>을 보려고 했는데 절반이상의 정보가 없다니, 앞 뒤가 맞지 않았다. 그래서 생각해낸게 2번이었다. 
<strong>2번은 메일링 대시보드를 담당하고 있었고, 아이디어를 낸 내가 자연스럽게 맡게 되었다.</strong></p>
<p><em>&quot;이렇게 했는데도 안되면 어쩌지? AWS 담당자가 처리하면 쉽게 해결되는거 아닐까?&quot;</em></p>
<p>새로운 분야를 공부하는 걸 좋아하는 편임에도 막상 업무가 되니 리스크와 마감이 따라오는 상황이라 더 불안했다.</p>
<p><strong>하지만 손 놓고 가만히 있는 것도 직성에 맞지 않는지라, 한번 해보기로 했다</strong>
<img src="https://velog.velcdn.com/images/joshua_1203/post/ed68f15f-c31d-4064-874f-118669f037fc/image.png" alt=""></p>
<hr>
<h2 id="2-문제-해결-과정">2. 문제 해결 과정</h2>
<p>처음 한 일은, 물론 AWS와 친해지는 일이었다
<strong>opensearch와 SES를 사용한 경험이 있어서 콘솔에는 좀 익숙한 편이었다.</strong>
그러나 괜히 무서운(?) Lambda와 API Gateway를 처음부터 알아가야 한다고 생각하니 왠지 막막했다🤣</p>
<p>그래서 내 로직을 먼저 <strong>아키텍처로 정리</strong>해봤다
몇 개의 프로젝트를 진행하면서 왜 그렇게 아키텍처를 만들라고 하는 걸까 했는데 지금와서 보면 아키텍처만큼 직관적으로 잘 설명해주는 것도 없다👍</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/33ecb76b-9411-4a29-b5e7-94e09363fbea/image.png" alt=""></p>
<blockquote>
</blockquote>
<p>여기서 잠깐 ! <strong>메일 열람 추적</strong>은 어떤 식으로 진행될까?
메일 열람은 <strong>1x1의 투명 이미지를 메일에 삽입</strong>한다.
수신자가 <strong>메일을 열게 되면 이 이미지를 로드</strong>하게 되는 데, 이 때 메일을 열었다고 간주하는 것이다.</p>
<blockquote>
</blockquote>
<p>내가 구축한 2번 방법은 여기에서 차용한 것이다.
<strong>메일을 보낼 때 회사 로고를 html에 넣게 되는데, 이 로고를 외부 이미지로 심어놓고 이 로고를 요청할 때마다 로그를 찍는 방법</strong>이다.</p>
<p>아래에 가려둔 mail body의 로고 부분을 요청으로 받아올 것이다 !!
<img src="https://velog.velcdn.com/images/joshua_1203/post/def7ebaa-69f0-4cf6-a14f-06e73132f77b/image.jpg" alt=""></p>
<p>그렇다면 <strong>Lambda, API Gateway를 사용해서 이메일에 이미지를 표시할 수 있도록 설정한 과정</strong>을 정리해보자.</p>
<hr>
<h3 id="1-lambda-함수-설정">1) Lambda 함수 설정</h3>
<p><strong>Lambda 함수는 이미지 URL을 반환</strong>하고, 
<strong>CloudWatch 로그를 사용</strong>하여 요청 및 응답을 추적할 수 있도록 구성된다. 
이 <strong>Lambda 함수는 API Gateway에서 호출</strong>된다.</p>
<p>먼저Lambda에 들어와서 함수를 만들어준다.
<img src="https://velog.velcdn.com/images/joshua_1203/post/3eaf1c2a-a10b-4067-8505-436208367b69/image.png" alt=""></p>
<p>만든 함수에 접속하면 아래와 같이 나온다.
(지금은 API Gateway에 연결되어 있지만 원래는 아무것도 안나온다)
<img src="https://velog.velcdn.com/images/joshua_1203/post/fe458bd9-dec9-4171-9c48-09dd01c4519a/image.png" alt=""></p>
<p>그리고 코드 부분에 작성해주면 된다.
<img src="https://velog.velcdn.com/images/joshua_1203/post/508f8e7a-7383-41c7-a1fb-4dc34bfff6b7/image.JPG" alt=""></p>
<p>🔗 Lambda 함수 코드</p>
<pre><code class="language-python">import logging

# 로깅 설정
logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    # 이미지 URL 설정 (예시)
    image_url = &quot;https://www.img/picture/common2/logo.png&quot;

    # 로그에 이미지 URL 기록
    logger.info(f&quot;Returning image URL: {image_url}&quot;)

    # URL 반환
    return {
        &quot;statusCode&quot;: 200,
        &quot;headers&quot;: {
            &quot;Content-Type&quot;: &quot;text/plain&quot;,
            &quot;Cache-Control&quot;: &quot;no-store, no-cache, must-revalidate, max-age=0&quot;
        },
        &quot;body&quot;: image_url  # 이미지 URL 반환
    }</code></pre>
<p>이런식으로 원래 코드를 작성했던 것처럼 해주면 된다.</p>
<p>lambda에서는 배포(deploy)라고 표현하는데, 이게 코드 활성화라고 생각하면 된다.
<img src="https://velog.velcdn.com/images/joshua_1203/post/51285489-7675-46a1-9e21-819feb5ae41f/image.JPG" alt=""></p>
<p>성공하면 아래와 같이 성공적으로 업데이트 되었다고 나온다
<img src="https://velog.velcdn.com/images/joshua_1203/post/7f750da8-d0a8-452f-851f-c43d184e4b9d/image.png" alt=""></p>
<p>lambda는 서버리스이기 때문에 바로 배포 상태를 확인할 수가 없는데, 그래서 아래 있는 test를 사용한다.</p>
<p>한번도 안했다면 test 환경을 만들라고 나온다. 그냥 이름 지어주고 만들면 된다.
<img src="https://velog.velcdn.com/images/joshua_1203/post/78b492d7-6891-440c-97d9-4debd95bbb12/image.JPG" alt=""></p>
<p>만들고 나서 test를 클릭하면 내가 만든 환경이 나온다.</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/f8b388b3-87e2-43b8-b6b7-088ba39e94ed/image.png" alt=""></p>
<p>test하면 성공여부와 결과값을 확인할 수 있다.
<img src="https://velog.velcdn.com/images/joshua_1203/post/326a81ab-e151-45dc-94b1-2b846c3277ec/image.png" alt=""></p>
<h3 id="1-2-캐시-및-만료-설정">1-2) 캐시 및 만료 설정</h3>
<h4 id="🚨-여기서-중요한-부분-">🚨 여기서 중요한 부분 !!</h4>
<p>보통 웹 페이지는 이미지를 계속 로드하지 않기 위해 이미지를 캐시하게 되는데, 
<strong>로그 추적은 열 때마다 이미지가 로드되어야 하므로 캐시 데이터로 저장하지 않게 해야 한다.</strong> 
이미지를 캐시하지 않고 매번 새로 요청하게 만들기 위해 <code>Cache-Control</code> 헤더를 설정하여 매번 이미지를 로드하도록 유도했다.</p>
<h4 id="🚨-여기서-또-중요한-부분-">🚨 여기서 또 중요한 부분 !!</h4>
<p><strong>lambda는 필요할 때만 켜지는 인스턴스</strong>라고 생각하면 쉽다. 
그렇기 때문에 내가 <strong>필요한 라이브러리를 폴더 내에 저장</strong>해두어야 한다.
<strong>AWS는 .ZIP 파일로 업로드</strong>할 수 있게 만들어 두었음 !!
나같은 경우는 URL만 반환하면 되기 때문에 따로 넣지는 않았다.
<img src="https://velog.velcdn.com/images/joshua_1203/post/0b5206fc-68a0-4ee1-a6e1-04abcc8c5498/image.png" alt=""></p>
<hr>
<h3 id="2-api-gateway-설정-프록시-통합-활성화">2) API Gateway 설정 (프록시 통합 활성화)</h3>
<p><strong>API Gateway에서 GET 메서드를 설정하여 Lambda 함수를 트리거</strong>한다.
API Gateway에 들어가면 이렇게 생겼다.
지금은 다 만들어놔서 뭔가 있지만 원래는 최상경로&quot;/&quot;만 있다.</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/fc4933d2-f099-48ea-81d8-58b9cf94d5f4/image.JPG" alt=""></p>
<p>API Gateway에서 <strong>리소스를 먼저 생성</strong>하고, <strong>메서드를 생성</strong>하면 된다
<img src="https://velog.velcdn.com/images/joshua_1203/post/d865117c-197e-4cef-ac43-cc9d82c40d09/image.JPG" alt=""></p>
<h4 id="🚨-여기서-중요한-부분--1">🚨 여기서 중요한 부분 !!</h4>
<p>메서드를 생성할 때 꼭 !! 꼭 <strong>프록시 통합을 활성화</strong> 해야 한다.
<del>그렇지 않으면.... 큰일납니다.... 저도 알고싶지 않았어요</del>
Lambda 프록시 통합을 사용하여 <strong>API Gateway가 Lambda 함수를 호출하고 반환된 URL을 그대로 반환할 수 있게</strong> 해야 한다!</p>
<p>위에서 람다 함수를 미리 정의해두었기 때문에, lambda를 선택하면 자동으로 보이게 된다.
<img src="https://velog.velcdn.com/images/joshua_1203/post/45823cd7-4bb8-448c-a192-14c55317fe9e/image.png" alt=""></p>
<p>GET 메서드를 생성하였다면 아래와같이 생성된다!</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/bc59acd6-bbcc-4eb3-bf65-674b6684efe5/image.png" alt=""></p>
<p>그 다음 API 배포 버튼을 눌러 스테이지에 올리면 된다.</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/86267a6b-dd9e-4b2b-bc50-8579809fe82d/image.JPG" alt=""></p>
<p>스테이지도 별거 없이 그냥 새 스테이지를 만들면 된다.
나는 이미 mail 이라는 스테이지를 생성해놔서 그걸로 선택했다.</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/3eba7ace-1bdc-4143-a159-b45b78f1b07f/image.png" alt=""></p>
<p>그렇게 스테이지로 가게 되면 내가 만들어 놓은 스테이지에 GET 메서드가 있는 걸 확인할 수 있다.
GET 메서드에 보면 URL 호출이 있는데, 이게 최종 HTML에 삽입 될 URL이다.</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/f4d0a46b-69d7-455f-b3f4-a33309ba5d61/image.png" alt=""></p>
<p>이 URL에 접속하면 lambda 함수와 연결되면서 로고 이미지가 뜨게 된다.
<img src="https://velog.velcdn.com/images/joshua_1203/post/be6826fa-3ea1-4f15-b738-420cefc79d04/image.png" alt=""></p>
<hr>
<h3 id="3-cloudwatch-로깅-설정">3) CloudWatch 로깅 설정</h3>
<p><strong>Lambda 함수에서 CloudWatch 로그를 사용</strong>하여 요청 및 응답을 기록할 수 있다. 이를 통해 <strong>이미지 URL 및 함수 호출을 추적</strong>할 수 있다.</p>
<p><code>logger.info()</code>를 사용하여 Lambda 함수 내에서 정보를 기록하고, 로그 그룹과 로그 스트림을 CloudWatch에서 확인할 수 있다.</p>
<h3 id="4-api-gateway에서-이미지-url-반환">4) API Gateway에서 이미지 URL 반환</h3>
<p><strong>Lambda 함수는 요청을 처리하고 이미지 URL을 반환</strong>한다. 이 URL을 사용하여 이메일 본문에 이미지를 삽입할 수 있다.</p>
<p>이메일 본문에 이미지를 삽입하려면, <strong>Lambda가 반환한 이미지 URL을 <code>&lt;img&gt;</code> 태그의 src로 사용하기 위해 endpoint url을 작성</strong>하면 된다.</p>
<pre><code class="language-html">&lt;a href=&quot;https://www.example.com/&quot; target=&quot;_blank&quot;&gt;
    &lt;img src=&quot;https://XXXXXX.execute-api.ap-northeast-2.amazonaws.com/MY-ENDPOINT-URL/mail/mail-open&quot; border=&quot;0&quot; width=&quot;200&quot; height=&quot;auto&quot;&gt;
&lt;/a&gt;</code></pre>
<h3 id="5-cloudwatch에서-로그-확인">5) CloudWatch에서 로그 확인</h3>
<p>이제 <strong>수신자가 메일을 열람할 때마다 Lambda 함수가 실행되고, 로그가 CloudWatch에 기록</strong>된다. 이를 통해 요청된 URL, 반환된 이미지 URL, 오류 발생 여부 등을 추적할 수 있다.</p>
<p>cloudwatch의 로그 그룹에 가면 lambda 함수가 모여 있다.
나의 람다 함수로 들어가보자
<img src="https://velog.velcdn.com/images/joshua_1203/post/664770c4-c18a-4c17-8429-cafa5693c8c2/image.JPG" alt=""></p>
<p>이렇게 요청이 올 때마다 로그가 찍히게 된다.</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/28c160e6-ddb2-403f-91aa-4f70c370e786/image.JPG" alt=""></p>
<p>로그에는 다양한 정보가 찍히게 된다. 이 중 하나를 대시보드에 올리면 된다.
<img src="https://velog.velcdn.com/images/joshua_1203/post/eea2135d-9eee-4d0e-a4ce-c27533e61e81/image.png" alt=""></p>
<p>cloudwatch의 대시보드에 접속해서 지표 중 API Gateway나 lambda에서 확인하면 된다.
<img src="https://velog.velcdn.com/images/joshua_1203/post/4111ef3c-3471-47dc-b661-7c73685751df/image.JPG" alt=""></p>
<p>결국 구축한 나의...... 대시보드 !!!!!!!!!!!!!
<img src="https://velog.velcdn.com/images/joshua_1203/post/616a8ac9-289e-49c3-bfca-12c10624f8b6/image.JPG" alt=""></p>
<hr>
<h3 id="6-요약">6) 요약</h3>
<blockquote>
</blockquote>
<ul>
<li><strong>Lambda 함수는 이미지 URL을 반환</strong>하고, <strong>CloudWatch 로그</strong>를 통해 이미지 URL을 추적.</li>
<li><strong>API Gateway에서 Lambda 프록시 통합을 활성화하여 Lambda 함수를 HTTP 엔드포인트로 호출</strong>.</li>
<li>이 때 Cache-Control 헤더를 설정하여 <strong>이미지를 캐시하지 않고 매번 로드</strong>하도록 유도.</li>
<li><strong>이메일 HTML에 Lambda에서 반환된 이미지 URL을 삽입</strong>하여 이메일 본문에 이미지를 표시.</li>
<li>CloudWatch 로그에서 Lambda 실행을 추적하고 디버깅.</li>
</ul>
<hr>
<h2 id="3-로그-추적-시스템을-구축하고-나서">3. 로그 추적 시스템을 구축하고 나서</h2>
<p>처음 로그가 성공적으로 찍혔을 때, 그리고 그 로그를 cloudwatch에 옮겼을 때 
정말 사무실에서 소리지를 뻔했다<del>(물론 지르진 않았다)</del>
그리고 <strong>내가 의지만 있다면 문제는 반드시 해결할 수 있다</strong>는 걸 알았다.
로그 로직을 전부 완성하고 나서 반신반의했던 주변 동료 분들도 정말 본인 일처럼 기뻐해주셨다!
그렇게 큰 시스템은 아니지만 <strong>혼자 생각해서 혼자 만들었다는 점이 정말 짜릿했다.</strong> 이래서 개발자 하는건가!<del>(아닙니다)</del></p>
<p>이런 점을 좋게 봐주셔서 인지, 인턴 끝나고 마지막 인사를 할 때 </p>
<p><u>*&quot;문제를 해결하시는 모습을 보고 대단하다고 느꼈어요. 조슈아님은 어디가서든 정말 잘할거에요.&quot;*</u></p>
<p><u>*&quot;사실 정말 하실지 몰랐는데, 의지가 남다르신 것 같아요&quot;*</u></p>
<p><u>*&quot;조슈아님 너무 아까운데 ㅠㅠ 매일 13~15시간 씩 회사에 남아 일하고, 관련 공부를 하시는 걸 보고 저도 열심히 정진해야겠다고 반성했어요.&quot;*</u></p>
<p>내가 내 칭찬을 받아적자니 좀 부끄럽긴 하지만 ^^;;ㅎㅎ
<em>3개월의 인턴 기간 동안 남는 것이 하나도 없지 않았을까</em>  절망하고 있었는데 이런 피드백을 들으니 <em>헛되이 보내진 않았구나, 많이 노력했구나,</em> 하는 생각이 들었다.
그만큼 이번 <strong>AWS를 이용해 만든 로그 추적은 나에게도 큰 의미로 남았다.</strong>
앞으로 어디에서 일을 하던 이 모습 그대로 있고 싶다
어려운 부분이 있어도 공부하면서, 모르면 물어보면서, 늘 의구심을 가지면서, 그렇게 조금씩 성장하면서 !
<img src="https://velog.velcdn.com/images/joshua_1203/post/f015bd38-7534-46ee-bb80-e08fc3bda560/image.png" alt=""></p>
<p>PS. 이자리를 빌어 로그 추적을 구축하기 위해 AWS 보안 권한 요청만 10번 넘게 했는데 흔쾌히 받아주신 팀원 분께 감사드립니다... 정말 죄송한 마음 뿐....(_ _ )</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[교육 콘텐츠 설계의 혁신: 그래프 데이터베이스로 학습 경로 최적화하기]]></title>
            <link>https://velog.io/@joshua_1203/%ED%95%99%EC%8A%B5-%EC%BD%98%ED%85%90%EC%B8%A0%EC%99%80-%EA%B7%B8%EB%9E%98%ED%94%84-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EA%B4%80%EA%B3%84-%EC%A4%91%EC%8B%AC%EC%9D%98-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81</link>
            <guid>https://velog.io/@joshua_1203/%ED%95%99%EC%8A%B5-%EC%BD%98%ED%85%90%EC%B8%A0%EC%99%80-%EA%B7%B8%EB%9E%98%ED%94%84-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EA%B4%80%EA%B3%84-%EC%A4%91%EC%8B%AC%EC%9D%98-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81</guid>
            <pubDate>Thu, 28 Nov 2024 08:00:14 GMT</pubDate>
            <description><![CDATA[<p>효과적인 교육 시스템은 데이터를 구조화하고, <strong>학습자와 콘텐츠 간의 복잡한 상호작용을 직관적으로 표현해야 한다.</strong> 
이 글에서는 그래프 데이터베이스를 활용하여 학습 콘텐츠를 효율적으로 설계하고 구현하는 방법을 다룰 예정이다.</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/b9485f89-a597-474c-8471-027cc83f9ee4/image.png" alt=""></p>
<h2 id="목차">목차</h2>
<ol>
<li><a href="#1-%EA%B7%B8%EB%9E%98%ED%94%84-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EB%9E%80">그래프 데이터베이스란?</a></li>
<li><a href="#2-%EC%99%9C-%EA%B7%B8%EB%9E%98%ED%94%84-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EC%9D%BC%EA%B9%8C">왜 그래프 데이터베이스일까?</a></li>
<li><a href="#3-%EA%B5%90%EC%9C%A1-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EC%84%A4%EA%B3%84-%ED%95%B4%EB%B3%B4%EA%B8%B0">교육 시스템 설계 해보기</a></li>
<li><a href="#4-neo4j-%EA%B5%AC%ED%98%84-%EC%98%88%EC%8B%9C">Neo4j 구현 예시</a></li>
<li><a href="#5-%EC%9E%A5%EB%8B%A8%EC%A0%90-%EB%B0%8F-%EA%B2%B0%EB%A1%A0">장단점 및 결론</a></li>
<li><a href="#6-%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C">참고 자료</a></li>
</ol>
<hr>
<h2 id="1-그래프-데이터베이스란graphdb">1. 그래프 데이터베이스란(GraphDB)?</h2>
<blockquote>
</blockquote>
<ul>
<li>그래프 데이터베이스(GraphDB)는 데이터를 <code>노드(Nodes)</code>와 <code>관계(Relationships)</code>로 저장하고 관리하는 <strong>NoSQL 데이터베이스</strong> </li>
<li>각 <strong>노드는 개체(Entity)</strong>를 나타내며, <strong>관계는 이러한 개체들 간의 연결</strong>을 표현</li>
<li><strong>복잡한 관계를 가진 데이터 모델링</strong>에 적합</li>
</ul>
<h3 id="📚-주요-특징">📚 주요 특징:</h3>
<ul>
<li><code>노드(Nodes)</code>: 데이터의 개체(예: 학생, 콘텐츠)</li>
<li><code>관계(Relationships)</code>: 개체 간 연결(예: 학생이 콘텐츠를 학습)</li>
<li><code>속성(Properties)</code>: 노드/관계에 추가 정보 저장(예: 이름, 점수)</li>
<li><code>레이블(Labels)</code>: 노드 유형 분류(예: User, Content)</li>
</ul>
<hr>
<h2 id="2-왜-그래프-데이터베이스일까">2. 왜 그래프 데이터베이스일까?</h2>
<h3 id="📚-관계형-db-vs-그래프-db">📚 관계형 DB vs 그래프 DB</h3>
<p>관계형 데이터베이스에서는 <strong>복잡한 관계를 표현하기 위해 여러 테이블을 조인</strong>해야 하는데, 이는 <strong>성능 저하</strong>를 초래할 수 있다.</p>
<p>그렇다면, <code>그래프 데이터베이스</code>는 어떨까?</p>
<blockquote>
</blockquote>
<ol>
<li><strong>자연스러운 관계 표현</strong>
그래프 데이터베이스는 <strong>노드</strong>와 <strong>엣지</strong>로 데이터를 표현하며, 이를 통해 <strong>실제 세계의 복잡한 연결 구조를 직관적으로 모델링</strong>할 수 있다.<blockquote>
</blockquote>
</li>
<li><strong>성능 이점</strong>
그래프 데이터베이스는 최단 경로 계산, 친구의 친구 찾기, 네트워크 중심성 분석과 같은 <strong>깊이 있는 관계 탐색 작업에서 뛰어난 성능을 발휘</strong>한다.
관계형 데이터베이스에서 복잡한 쿼리를 실행하려면 여러 테이블 간의 조인 연산이 필요하지만, <strong>그래프 데이터베이스는 조인 없이 관계를 직접 탐색하므로 속도가 빠르고 리소스 사용이 적다</strong><blockquote>
</blockquote>
</li>
<li><strong>유연한 스키마</strong>
그래프 데이터베이스는 <strong>스키마가 고정되지 않아 새로운 데이터 유형이나 관계 유형을 손쉽게 추가</strong>할 수 있다.
이는 <strong>데이터 구조가 자주 변하거나 성장하는 프로젝트에서 유용</strong>함<blockquote>
</blockquote>
</li>
<li><strong>직관적인 쿼리 언어</strong>
관계를 탐색하기 위한 <strong>Cypher와 같은 직관적인 쿼리 언어 지원</strong>
예를 들어, <strong>&quot;친구의 친구 중에서 특정 관심사를 가진 사람 찾기&quot;</strong>와 같은 질문은 Cypher로 몇 줄의 코드로 표현 가능.<blockquote>
</blockquote>
</li>
<li><strong>다양한 응용 사례</strong></li>
</ol>
<p><strong>소셜 네트워크, 추천 엔진, 사기 탐지, 공급망 관리, 지식 그래프</strong>와 같은 다양한 산업 분야에서 사용</p>
<blockquote>
</blockquote>
<ol start="6">
<li><strong>기술적 생태계와 지원</strong></li>
</ol>
<p><strong>Neo4j, Amazon Neptune, ArangoDB</strong> 등 다양한 솔루션을 활용하면 특정 도메인에 맞는 최적화된 기능을 사용
<strong>AI 및 머신러닝과도 잘 통합</strong>되며 그래프 임베딩을 통해 추천 모델이나 예측 분석을 강화 가능.</p>
<h3 id="📚-그럼-그래프db만-사용해야-하나">📚 그럼 그래프DB만 사용해야 하나?</h3>
<p>물론, 모든 데이터를 그래프 데이터베이스로 관리하는 것은 아니다. 
실제로 많은 시스템은 <strong>다양한 데이터베이스를 혼합하여 사용</strong>한다.</p>
<ul>
<li><strong>그래프 데이터베이스가 적합한 경우</strong></li>
</ul>
<ol>
<li><strong>복잡한 관계 탐색</strong>: 네트워크 경로 분석, 추천 시스템, 학습 경로 추적 등 데이터 간의 복잡한 관계를 탐색하고 분석해야 할 때</li>
<li><strong>동적 스키마</strong>: 데이터 모델이 자주 변경되거나 확장되어야 할 때.</li>
</ol>
<ul>
<li><strong>그래프 데이터베이스가 적합하지 않은 경우</strong></li>
</ul>
<ol>
<li><strong>단순한 트랜잭션 처리</strong>: 단순 CRUD 작업이나 트랜잭션이 주인 경우</li>
<li><strong>대량의 정형 데이터</strong>: 대량의 정형 데이터를 저장하고 처리하는 경우</li>
<li><strong>복잡한 집계 연산</strong>: 복잡한 집계 연산에는 데이터 웨어하우스나 OLAP 시스템이 더 적합할 수 있음</li>
</ol>
<ul>
<li><p><strong>혼합 사용(하이브리드 접근)</strong>
많은 시스템은 <strong>그래프 데이터베이스를 다른 데이터베이스와 함께 사용</strong>한다. 예를 들어, 사용자 프로필과 같은 정형 데이터는 관계형 데이터베이스에 저장하고, 사용자 간의 관계나 추천 시스템은 그래프 데이터베이스로 관리할 수 있다.</p>
</li>
<li><p><strong>ETL 프로세스</strong> </p>
</li>
<li><p><em>데이터를 다른 데이터베이스에서 가져와 그래프 데이터베이스로 변환*</em>하여 관계 분석을 수행할 수 있다.</p>
</li>
</ul>
<hr>
<h2 id="3-교육-시스템-설계-해보기">3. 교육 시스템 설계 해보기</h2>
<h3 id="📚-ai-curriculum-구조-설명">📚 <strong>AI Curriculum 구조 설명</strong></h3>
<p><strong>커리큘럼 (Curriculum)</strong></p>
<table>
<thead>
<tr>
<th>이름</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>AI Curriculum</td>
<td>Comprehensive learning path for AI</td>
</tr>
</tbody></table>
<p><strong>코스 (Course)</strong></p>
<table>
<thead>
<tr>
<th>코스명</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>AI Basics</td>
<td>AI의 기본 개념, 역사 등을 다루는 기초 과정</td>
</tr>
<tr>
<td>AI Applications</td>
<td>AI를 실생활에 적용하는 과정 (헬스케어, 금융 등)</td>
</tr>
</tbody></table>
<p><strong>중단원 (Unit)</strong></p>
<table>
<thead>
<tr>
<th>중단원명</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>Foundations of AI</td>
<td>AI의 기초 이론 및 역사</td>
</tr>
<tr>
<td>Machine Learning Basics</td>
<td>머신러닝의 기초 개념</td>
</tr>
<tr>
<td>AI in Healthcare</td>
<td>의료 분야에서의 AI 활용</td>
</tr>
<tr>
<td>AI in Finance</td>
<td>금융 분야에서의 AI 활용</td>
</tr>
</tbody></table>
<p><strong>소단원 (Subtopic)</strong></p>
<table>
<thead>
<tr>
<th>소단원명</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>What is AI?</td>
<td>AI의 정의를 다룸</td>
</tr>
<tr>
<td>History of AI</td>
<td>AI 발전의 역사를 학습</td>
</tr>
<tr>
<td>Supervised Learning</td>
<td>지도 학습의 기본 원리</td>
</tr>
<tr>
<td>Unsupervised Learning</td>
<td>비지도 학습의 기본 개념</td>
</tr>
</tbody></table>
<p><strong>콘텐츠 (Content)</strong></p>
<table>
<thead>
<tr>
<th>콘텐츠명</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>Introduction to AI Video</td>
<td>AI의 기본 개념을 설명하는 비디오</td>
</tr>
<tr>
<td>History of AI Article</td>
<td>AI의 역사를 설명하는 기사 자료</td>
</tr>
</tbody></table>
<p><strong>문제 (ExamQuestion)</strong></p>
<table>
<thead>
<tr>
<th>문제명</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>Define AI</td>
<td>AI의 정의를 작성하는 문제</td>
</tr>
<tr>
<td>List AI Milestones</td>
<td>AI 역사에서 중요한 사건을 나열하는 문제</td>
</tr>
</tbody></table>
<hr>
<h3 id="📚-사용자user">📚 <strong>사용자(User)</strong></h3>
<p><strong>1. 사용자 기본 정보</strong></p>
<table>
<thead>
<tr>
<th>이름</th>
<th>사용자 ID</th>
<th>학습자 이름</th>
<th>진행 중인 커리큘럼</th>
</tr>
</thead>
<tbody><tr>
<td>홍길동</td>
<td>1</td>
<td>user1</td>
<td>AI Curriculum</td>
</tr>
</tbody></table>
<p><strong>2. 학습 중인 코스(Course)</strong></p>
<table>
<thead>
<tr>
<th>코스명</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>AI Basics</td>
<td>AI의 기본 개념, 역사 등을 배우는 기초 과정</td>
</tr>
</tbody></table>
<p><strong>3. 학습 중인 중단원(Unit)</strong></p>
<table>
<thead>
<tr>
<th>중단원명</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>Foundations of AI</td>
<td>AI의 기초 이론 및 역사</td>
</tr>
<tr>
<td>Machine Learning Basics</td>
<td>머신러닝의 기초 개념</td>
</tr>
</tbody></table>
<p><strong>4. 학습 중인 소단원(Subtopic)</strong></p>
<table>
<thead>
<tr>
<th>소단원명</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>What is AI?</td>
<td>AI의 정의를 다룸</td>
</tr>
<tr>
<td>History of AI</td>
<td>AI 발전의 역사를 학습</td>
</tr>
</tbody></table>
<p><strong>5. 학습 중인 콘텐츠(Content)</strong></p>
<table>
<thead>
<tr>
<th>콘텐츠명</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>Introduction to AI Video</td>
<td>AI의 기본 개념을 설명하는 비디오</td>
</tr>
<tr>
<td>History of AI Article</td>
<td>AI의 역사를 설명하는 기사 자료</td>
</tr>
</tbody></table>
<p><strong>6. 완료한 평가 문제(ExamQuestion)</strong></p>
<table>
<thead>
<tr>
<th>문제명</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>Define AI</td>
<td>AI의 정의를 작성하는 문제</td>
</tr>
<tr>
<td>List AI Milestones</td>
<td>AI 역사에서 중요한 사건을 나열하는 문제</td>
</tr>
</tbody></table>
<hr>
<h2 id="4-neo4j-구현-예시">4. Neo4j 구현 예시</h2>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/88f91940-df31-4165-aa1f-2281251f6e66/image.png" alt=""></p>
<p>다음은 위의 내용을 토대로 Neo4j에서 간단하게 구현한 예시이다
Neo4j의 사용법은 추후 포스팅 할 계획이다
cypher 쿼리가 기존 SQL과 달라 익숙해지기 힘들지만
<strong>관계를 설정해두면 시각화할 수 있는 콘솔을 제공</strong>하기 때문에 편리하게 사용할 수 있다.</p>
<hr>
<h2 id="5-장단점-및-결론">5. 장단점 및 결론</h2>
<h3 id="📚-장점">📚 장점</h3>
<blockquote>
</blockquote>
<ol>
<li><strong>복잡한 학습 경로 추적 용이</strong>
학습자가 학습한 콘텐츠와 연결된 다음 학습 경로를 직관적으로 파악할 수 있어 복잡한 학습 흐름도 효과적으로 관리 가능.<blockquote>
</blockquote>
</li>
<li><strong>맞춤형 학습 추천 시스템 구현 가능</strong>
사용자의 학습 이력과 유사 학습자의 데이터를 분석해 개인화된 학습 콘텐츠를 실시간으로 추천할 수 있음.<blockquote>
</blockquote>
</li>
<li><strong>성능 최적화 (깊은 관계 탐색)</strong>
깊은 레벨의 관계를 탐색하는 쿼리를 빠르게 처리하며, 전통적인 조인 연산을 사용하지 않아 성능 저하 없이 복잡한 분석이 가능.<blockquote>
</blockquote>
</li>
<li><strong>유연한 모델 확장</strong>
새로운 학습 콘텐츠나 학습자의 데이터를 추가할 때 기존 구조를 크게 변경할 필요 없이 손쉽게 확장이 가능하며, 변화하는 요구 사항에 적합.</li>
</ol>
<h3 id="📚-단점">📚 단점</h3>
<blockquote>
</blockquote>
<ol>
<li><strong>초기 학습 곡선</strong>
그래프 데이터베이스의 새로운 개념과 쿼리 언어(Cypher 등)에 익숙해지기 위해 시간과 노력이 필요함.<blockquote>
</blockquote>
</li>
<li><strong>트랜잭션 처리가 RDBMS보다 복잡</strong>
대규모 트랜잭션 처리 시 관계 데이터의 일관성을 유지하기 위한 추가적인 관리가 필요하며, 구현 난이도가 높아질 수 있음.<blockquote>
</blockquote>
</li>
<li><strong>대용량 데이터 처리시 메모리 사용량 증가</strong>
관계 데이터가 많아질수록 메모리 사용량이 급격히 증가할 수 있어, 하드웨어와의 균형 잡힌 설계가 필요함.</li>
</ol>
<h3 id="📚-결론">📚 결론</h3>
<p>그래프 데이터베이스는 <strong>데이터를 연결 중심적으로 관리하는 도구</strong>로, 관계를 기반으로 한 데이터 분석과 쿼리의 한계를 극복한다. 전통적인 관계형 데이터베이스와 달리 <strong>복잡한 연결 구조를 직관적으로 표현</strong>하고, 효율적으로 처리할 수 있는 것이 가장 큰 장점이다.</p>
<p>또한, 스키마 유연성과 확장성 덕분에 <strong>새로운 데이터 유형과 구조를 쉽게 통합</strong>할 수 있어, 변화하는 비즈니스 요구사항에도 신속하게 대응할 수 있다.</p>
<p>교육 시스템과 같이 <strong>복잡한 관계를 가진 도메인에서는 그래프 데이터베이스가 매우 효과적인 솔루션</strong>이 될 수 있다. 특히 <strong>학습 경로 추적, 맞춤형 콘텐츠 추천 등</strong>의 기능 구현에 있어 좋은 솔루션이 될 수 있다.</p>
<p>그렇다면 <strong>모든 상황에서 그래프 데이터베이스가 적합할까? 당연히 아니다.</strong> 그래프 데이터베이스는 연결 중심의 데이터가 많을 때 특히 강력한 성능을 발휘하며, 관계형 데이터베이스와의 <strong>장단점을 명확히 이해하고 적합한 사용 사례를 찾아야</strong> 그 진가를 발휘할 수 있다.</p>
<p>결국, 그래프 데이터베이스는 특정 유형의 데이터와 쿼리에 매우 강력하지만, 모든 데이터에 적합한 것은 아니다. <strong>시스템의 요구 사항에 따라 적절한 데이터베이스를 선택하고, 필요에 따라 여러 데이터베이스를 조합하여 사용</strong>해야 하기 때문에, 그래프DB의 사용을 고려할 때는 <strong>도메인과 데이터의 성격에 대한 이해가 선행되어야 할 것</strong>이다.</p>
<h2 id="6-참고-자료">6. 참고 자료</h2>
<ul>
<li>Neo4j 공식 문서: <a href="https://neo4j.com/docs/">https://neo4j.com/docs/</a></li>
<li>Graph Databases: <a href="https://neo4j.com/graph-databases-book/">O&#39;Reilly Book</a>
<a href="https://medium.com/technology-hits/7-graph-database-use-cases-that-will-change-your-mind-699e92437523">https://medium.com/technology-hits/7-graph-database-use-cases-that-will-change-your-mind-699e92437523</a>
<a href="https://www.puppygraph.com/blog/graph-database-use-cases">https://www.puppygraph.com/blog/graph-database-use-cases</a>
<a href="https://www.profium.com/en/blog/graph-database-use-cases/">https://www.profium.com/en/blog/graph-database-use-cases/</a>
<a href="https://ceur-ws.org/Vol-840/02-paper-20.pdf">https://ceur-ws.org/Vol-840/02-paper-20.pdf</a></li>
</ul>
<hr>
<p>/
/</p>
<p>놀랍게도 이 모든 것은 GPT 4o가 만든 내용이다 🙄
그래프데이터데이스에 대해 블로그를 쓸 생각이고, 목차를 알려주고, &quot;공식 문서를 참고해서 만들어줘&quot; 라고 프롬프트를 추가하였다.
그리고 Neo4j부분만 만들었을 뿐...😗
나중에는 이미지까지 직접 골라보라고 하고 싶다!</p>
<p>물론 내용에 대해 교차검증을 진행하였지만, 점점 사람이 손 댈 분야는 출력 부분이 아닌 생성 부분이라는 생각이 든다.
좋아하는 분야고 계속 공부하는 내용이지만 성능을 볼 때마다 놀란다^ ^;;
그래프데이터베이스도 공부하고, 프롬프트도 공부했던 재미있는 시간이었다!
<img src="https://velog.velcdn.com/images/joshua_1203/post/6c762fd8-568c-40cd-8f27-b53132c3e202/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Cursor AI, 개발자를 대체할까?(ft. chatGPT)]]></title>
            <link>https://velog.io/@joshua_1203/%EC%82%90%EC%95%BD%EC%9D%B4-%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%9D%98-cursor-AI-%EC%82%AC%EC%9A%A9%EA%B8%B0ft.-GPT-%EB%B3%B4%EB%8B%A4-%ED%8E%B8%ED%95%A0%EA%B9%8C</link>
            <guid>https://velog.io/@joshua_1203/%EC%82%90%EC%95%BD%EC%9D%B4-%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%9D%98-cursor-AI-%EC%82%AC%EC%9A%A9%EA%B8%B0ft.-GPT-%EB%B3%B4%EB%8B%A4-%ED%8E%B8%ED%95%A0%EA%B9%8C</guid>
            <pubDate>Mon, 25 Nov 2024 14:09:00 GMT</pubDate>
            <description><![CDATA[<p>11월 첫 게시물이 오늘일줄 누가 알았을까..
이번 달은 인턴 생활하면서 가장 바쁜 달이었다.
AWS 기능도 이것저것 사용해보고, 문제를 해결하기 위해 주말까지 반납하며 고군분투했던 지난 날...😂
다행히 성공적으로 프로젝트를 끝내 오랜만에 벨로그를 켰다.</p>
<p>오늘은 이러다 일자리를 잃겠다(물론 아닙니다) 싶었던 <strong>cursorAI 사용기</strong> !</p>
<hr>
<p>떄는 바야흐로 한 달 전..
여러 직장 동료분들의 추천으로 cursorAI를 처음 접했다 🤖
<del>(근데 본인들은 안쓰고 나보고 써보라고 주심 뭐임)</del>
어쨋든 다운 받아놓고 이제서야 써본 나
점핑 만세를 했더랜다
뭔데... 이거 뭔데 대체?
<img src="https://velog.velcdn.com/images/joshua_1203/post/b8b4cd0f-2ec1-46fb-9086-fa767a3e9162/image.png" alt=""></p>
<hr>
<h2 id="1-cursorai가-뭐야">1. cursorAI가 뭐야?</h2>
<blockquote>
</blockquote>
<ul>
<li><strong>정의 📚</strong>
인공지능(AI)을 활용하여 개발자들에게 코드 작성, 디버깅, 리팩토링 등의 과정을 더욱 효율적이고 직관적으로 도와주는 <strong>독립형 코드 에디터.</strong>
Cursor AI는 <strong>VS Code를 포크</strong>해 만들어졌다. 기존의 VS Code 환경과 유사하면서도 독립적인 앱으로 동작하며, <strong>고급 AI 기능을 지원</strong>.<blockquote>
</blockquote>
</li>
<li><strong>간단한 장점 📢</strong>
1) <strong>코드 작성, 리팩토링, 디버깅</strong>을 포함한 다양한 작업이 보다 직관적이고 효율적으로 수행
2) 기존 VS Code 설정, 확장 프로그램, 테마 등을 가져와 <strong>Cursor로 이전 가능</strong>
3) GPT-4와 Claude 3.5 Sonnet 같은 <strong>최신 AI 모델을 사용</strong>해 문맥을 이해하고 적합한 코드를 생성
4) 선택된 <strong>코드 또는 전체 파일을 기반으로 한 제안</strong>
5) Python, HTML, CSS 등 다양한 언어를 지원하며, <strong>파일 확장자에 따라 적합한 언어를 자동 감지</strong>
6) Chat을 통해 <strong>코드 기반 대화형 작업</strong>을 수행</li>
</ul>
<p>처음 내가 접했을 때의 생각은
<u>&quot;GPT가 있는데 굳이?🧐&quot;
&quot;보안은 어떻게 할건데?🧐&quot;</u> 였다.</p>
<p>그래도 거부만 하는 건 발전에 도움이 안되지. 한번 해보자 !</p>
<hr>
<h2 id="2-가격">2. 가격</h2>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/ea2cfca7-aacc-4674-a599-d52ed80aa506/image.png" alt=""></p>
<p>cursorAI 사이트에서 가져왔다.
2주동안 프리미엄을 사용해보고 있는데 꽤나 괜찮다
<strong>프로가 2만원 중후반대니까 GPT 가격과 비슷한 수준?</strong></p>
<hr>
<h2 id="3-다운을-받아보자-">3. 다운을 받아보자 !!</h2>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/07ea267e-3f2c-4af0-b8fe-3ae27ca68073/image.JPG" alt=""></p>
<p><a href="https://www.cursor.com/">https://www.cursor.com/</a>
먼저 여기로 접속해서 다운을 받아준다
버전 차이가 나면 문제가 생기므로 다운을 받고 바로 설치하는 걸 추천한다
<del>(나도 알고 싶지 않았다)</del></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/d8345809-31f2-4427-9604-8ec4f653d91c/image.JPG" alt=""></p>
<p><strong>디폴트는 vs code로 되어 있다.</strong></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/a9391966-2d9d-4c55-8923-c54245b2756b/image.JPG" alt=""></p>
<p>그리고 정말 편리하게 !
<strong>내가 기존에 가지고 있던 확장프로그램과 세팅을 불러올 수 있다</strong>
짱이자나 😋😋😋!!!!</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/11a435cd-3e71-4e1c-a19f-894e63078d42/image.JPG" alt=""></p>
<p>그 다음은 AI를 사용할 것인지, Privacy 모드를 사용할 것인지에 대해 나온다.
쉽게 말해 <strong>내 정보를 인덱싱하여 저장해 AI를 활용할 것인지 / 보안을 강화하고 AI 사용을 제한할 것인지</strong>를 정하는 것이다
나도 보안은 신경쓰는 편인데, 그래도 한번 AI를 사용하고 싶어서 선택했다.</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/d142f27b-06f5-401b-a100-f18afb30ce3f/image.png" alt=""></p>
<p>열심히 튜토리얼 뿌수는 중
재밌당 😄</p>
<hr>
<h2 id="4-어떤-기능들이-있을까">4. 어떤 기능들이 있을까?</h2>
<h3 id="1-챗봇-기능">1) 챗봇 기능</h3>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/ce21b442-12b6-4001-a315-cf9895f080d5/image.JPG" alt=""></p>
<p>일단 첫 번째로 챗봇 기능이 있는데, <code>ctrl + L</code>을 누르면 옆에 나타난다
코드 복붙할 필요없이 파일에 대해 물어보면 알아서 알려준다 대박 👍</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/e53cd08b-36d4-4577-8267-cd1639783e06/image.JPG" alt=""></p>
<p>기본적으로 챗봇이어서 관련된 내용도 알려준다
내가 친숙한 UI에서 답해줘서 그런가 되게 좋았음 😊</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/aff3a799-eb23-4c41-87d4-6a770d0ba007/image.JPG" alt=""></p>
<p>코드 검토도 해달라고 말하면 검토도 해준다 우와 ~</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/91aa99a6-8aab-4558-ac6a-be8a3aa4fe51/image.JPG" alt=""></p>
<p>오류 보여주면 바로 답도 해주고,
그래도 여기까진 GPT와 비슷하다
그 다음이 중요함 ✨</p>
<hr>
<h3 id="2-코드-기반-답변-및-수정">2) 코드 기반 답변 및 수정</h3>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/2c5f4267-46c5-4f06-9dda-1045048b4429/image.png" alt="">
<code>ctrl + K</code> 를 입력하면
<strong>코드 내에서 수정</strong>이 가능하다</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/ee92d6c4-d74a-4b0e-bfda-1820f81fd947/image.png" alt=""></p>
<p>참고로 블럭 선택하고 <code>ctrl + L</code>을 누르면 채팅에 내가 선택한 내용이 입력된다
찢었다 😎</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/011db8b7-a029-4962-8e07-f2d1d37ae63a/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/01a89e0c-26c6-445e-ad26-be1c58fa48c7/image.png" alt=""></p>
<p><code>ctrl + K</code> 로 질문하게 되면
<strong>코드 내에서 삭제할 부분과 새로 입력된 부분을 표시</strong>해준다
<code>Accept</code> 하면 코드를 알아서 바꿔준다</p>
<hr>
<h3 id="3-폴더-웹-검색-등-다양한-검색-기반-답변">3) 폴더, 웹 검색 등 다양한 검색 기반 답변</h3>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/709ae684-0e01-46b4-ad23-787d716f3c2e/image.png" alt=""></p>
<p>띠용 ?
폴더 구조로 물어볼 수도 있다
<strong>폴더에 있는 파일들을 다 읽고 그에 맞게 답을 해준다</strong></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/1ff74d02-2b26-4a66-8bca-99f3f95f49a2/image.png" alt=""></p>
<p>그 외에도 파일, web 등 다양하게 연결할 수 있다 Git도 된다 !!!!</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/d8d0e42c-c824-4ca8-9645-fae1cb635064/image.png" alt=""></p>
<p>web 기반 질문을 던지니 이렇게 답변해줬다</p>
<hr>
<h3 id="4-다양한-모델-지원">4) 다양한 모델 지원</h3>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/d08343bd-07f2-4a99-b817-44045c0b4073/image.png" alt=""></p>
<p><strong>모델도 고를 수 있다</strong> 설정하지 않으면 <strong>claude 3.5 sonnet</strong>이 기본으로 되어 있는 것 같다
저 <code>cursor-small</code>은 뭐지 🙄?</p>
<p>궁금해서 찾아보니 </p>
<blockquote>
<p><strong>cursor AI에 통합된 경량 AI 모델</strong>로, 코드 편집과 같은 기본적인 작업을 수행하는 데 사용됨.
고급 프리미엄 모델을 대체하는 것은 아니지만, <strong>가벼운 수정이나 빠른 작업에 유용함</strong></p>
</blockquote>
<p>라고 한다
<img src="https://velog.velcdn.com/images/joshua_1203/post/b7f1a91e-9ca1-4b4a-b35b-df669b8e7131/image.png" alt=""></p>
<p>세팅의 <code>Models</code>에 들어가면 다양한 모델을 볼 수 있다
<strong>API key</strong>도 입력할 수 있는 걸 보니 프리미엄? 고급 모델도 사용할 수 있게 해둔 것 같다</p>
<hr>
<h3 id="5-자동-완성-기능">5) 자동 완성 기능</h3>
<p>정말 대박이라고 생각했던 기능 중 하나인 자동완성
원래 vs code에서도 자동완성은 제공되지만
<strong>cursor는 사용자가 틀린 내용을 잡아내거나, 코드에 없는 부분을 파악해서 자동완성을 시키는데....</strong></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/e6f85905-cdbf-4460-afee-b5f9957188d7/image.png" alt=""></p>
<p>a. traceback이 <strong>코드에서 쓰였는데 import가 안되어 있으니</strong> 자동으로 완성됨</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/da6868af-00d4-4686-8d32-371d1de86d77/image.png" alt=""></p>
<p>b. <strong>올바른 변수 명</strong>으로 수정할 수 있도록 자동 완성</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/49156698-6afb-487f-82dc-04c9ef6ddef5/image.png" alt=""></p>
<p>c. <strong>print 자동 완성</strong></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/134241be-0796-4232-bbd4-35c7d44ad845/image.png" alt=""></p>
<p>d. <strong>주석도 자동 완성</strong> 시켜준다 엌</p>
<p>이거 외에도 다양한 기능이 있지만 그건 점차 써보면서 알아가게 될 듯 하다
더 자세한 내용은 <a href="https://docs.cursor.com/get-started/migrate-from-vscode">https://docs.cursor.com/get-started/migrate-from-vscode</a> 공식 문서를 참고!!</p>
<hr>
<h2 id="5-어떻게-사용해야-할까">5. 어떻게 사용해야 할까?</h2>
<p>사용하면서 내가 느낀 점은 &quot;편리함&quot;과 &quot;정신차려야겠다(?)&quot; 였다</p>
<p>아직 삐약이 개발자 입장에서 <strong>코드 짜는 속도가 정말 빨라지고, 모르는 부분도 막힘없이 척척해주는 녀석이 고마우면서도,
내가 어떻게 짜였는지 파악하지 못한 코드를 내 코드라고 할 수 있을까? 하는 생각이 들었다</strong>😭😭</p>
<p>그리고 보안 측면에서도 개인적인 프로젝트는 가능하겠지만 비즈니스적인 프로젝트는 써도 될지 아직 잘 모르겠다 🕵️‍♂️</p>
<p>하지만 이렇게 편리한 기능이 넘쳐나는데 안쓰면 아쉽다 </p>
<p>그래서 내가 임의로 정해본 cursor 사용 방법 👤</p>
<blockquote>
</blockquote>
<h3 id="1-마감이-얼마-남지-않았을-때이젠-정말-해야-할-때">1) 마감이 얼마 남지 않았을 때(이젠 정말 해야 할 때)</h3>
<blockquote>
</blockquote>
<p>cursorAI를 쓰면 코드 짜는 속도가 엄청나게 빨라진다. 그 말인 즉슨 <strong>빠르게 일을 쳐낼 수 있다</strong>는 뜻이다. 이런 상황이 오는 걸 별로 좋아하진 않지만 회사 생활하면서 언제나 예상대로 흘러갈 수는 없다는 걸 알았으니... 그런 상황에서 사용하면 좋을 것 같다.</p>
<blockquote>
</blockquote>
<h3 id="2-코드-뼈대-만들-때">2) 코드 뼈대 만들 때</h3>
<blockquote>
</blockquote>
<p>실제로 생각만 해두고 시도해보지 않은 개인 프로젝트가 있었는데, 글쎄 자연어만으로 30분만에 코드를 완성해버렸다.....😅
전부 cursor로 만들기 보단, <strong>어떻게 시작해야 할지 막막한 프로젝트의 뼈대를 받는다고 생각</strong>하고 최대한 풀어서 모델에 전달하는 것이다.
이게 바로... 자연어 기반 코딩....?
출력내용을 보고 내가 원하는 방향으로 수정해주고 고도화시키면 된다. 코드의 뼈대 자체를 cursor가 만들어줬기 때문에 수정하는 부분도 좀 더 명확해준다는 느낌을 받았다.</p>
<blockquote>
</blockquote>
<h3 id="3-내가-짠-코드-최적화를-위한-검사">3) 내가 짠 코드 최적화를 위한 검사</h3>
<p>코드 내에서 메모리 누수가 있진 않은지, 좀 더 간결하게 코드를 작성할 수 있는지 스스로 판단한다는 게 여간 쉬운 일이 아니다.
코드에 나의 논리와 생각이 들어가 있기 때문에 더 그런 것 같다.
그 때 cursor에 &quot;내 코드 보고 최적화해줘&quot; 라고 하면 코드를 보고 검사해준다. <strong>내가 알고 있던 방식 말고 다양한 방면을 알 수 있다는 게 좋은 것 같다.</strong></p>
<hr>
<p>/
/</p>
<p>부끄러운 이야기지만 아직 GPT가 없으면 코드를 짜기 막막하다. 
그런데 이런 프로그램이 나오다니 한편으로는 대 환영이지만,
또 한편으로는 <strong>내 걸로 만들겠다는 생각 없이 남용하면 나에게 남는게 없다</strong>는 생각이 들었다.
어느정도 아는 상태가 되기 전까지는, 조금 미련해보여도 내 손으로 직접 코드를 짜는 연습을 해봐야겠다.</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/e9efc369-e1b9-49b2-b518-5f127a540652/image.png" alt=""></p>
<h2 id="6-참고자료">6. 참고자료</h2>
<p><a href="https://www.cursor.com/">https://www.cursor.com/</a>
<a href="https://chucoding.tistory.com/143">https://chucoding.tistory.com/143</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[kakao map API을 사용해 지도를 띄워보자]]></title>
            <link>https://velog.io/@joshua_1203/kakao-map-API%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%B4-%EC%A7%80%EB%8F%84%EB%A5%BC-%EB%9D%84%EC%9B%8C%EB%B3%B4%EC%9E%90</link>
            <guid>https://velog.io/@joshua_1203/kakao-map-API%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%B4-%EC%A7%80%EB%8F%84%EB%A5%BC-%EB%9D%84%EC%9B%8C%EB%B3%B4%EC%9E%90</guid>
            <pubDate>Wed, 30 Oct 2024 14:14:58 GMT</pubDate>
            <description><![CDATA[<p><u><em>지금 내가 하고 있는 일이 완전히 DA 인가?</u></em></p>
<p>라고 물어본다면 그건 아니지만, 인턴을 하는 입장으로써 여러가지를 경험해본다는 것은 정말 행운이다😊</p>
<p>다행히 지금 일하고 있는 회사가 배움에 있어서는 정말 자유롭기 때문에 나도 이런 저런 툴을 써가면서 열심히 일하는 중이다✊</p>
<p>그러던 중 컨퍼런스 장소 선정에 대한 분석을 요청 받았는데
장소에서 중요한건 뭐니뭐니 해도 위치가 아니겠나</p>
<p>그냥 지하철에서 가깝다 - 정도가 아니라
<strong>지도에 정확히 보일 수 있고, 거리까지 계산하고 싶었다</strong></p>
<p>그래서 사용해본 ✨<strong>KAKAO MAP API</strong>✨!
<del>여담이지만 네이버는 워낙 잘 막혀서 찾다가 알게 되었다는 사실</del></p>
<p>그런데 생각보다 정말 잘 되어 있는 것이 아닌가 !
하나하나 파헤쳐 보자</p>
<hr>
<h2 id="1-kakao-map-api-사용하기">1. kakao map api 사용하기</h2>
<p><a href="https://developers.kakao.com/">https://developers.kakao.com/</a>
<img src="https://velog.velcdn.com/images/joshua_1203/post/08e9619a-ccdb-46ce-8a94-a8d73ef1d930/image.png" alt=""></p>
<p>일단 여기로 접속한다</p>
<p>TMI : 최근 if(kakao) 컨퍼런스를 온라인으로 들었었는데 카카오가 좋아하는 디자인이 뭔지 알거 같다. 약간 어두운 배경에 밝은 도형</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/b84be180-f00b-4591-89d2-8079c0b2b423/image.png" alt=""></p>
<p>내 애플리케이션에 들어가면 <strong>추가하기</strong>가 있다
나는 이미 생성해둔 상태라 (1)로 떠있음</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/c0eb9df8-0f52-4392-81aa-f01de3974b8a/image.png" alt=""></p>
<p>애플리케이션 추가하기를 입력하면 이렇게 앱을 생성하는 곳이 뜬다
간단한 정보를 입력하면 바로 생성할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/e8ea3965-6a0b-42a0-92c9-4fa83c1b16de/image.png" alt=""></p>
<p>내가 만든 map 애플리케이션에 들어가면 이렇게 정보를 확인할 수 있다
음,,, 사실 이거 뭔지 잘 모르겠음 내가 서비스를 만들 수 있는 것 같은데🙄?</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/a96610f0-5e12-4585-84a4-7e4fb28db98f/image.png" alt=""></p>
<p>우리는 <strong>API KEY가 필요하니 대시보드로</strong> 향한다</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/8e43304e-73eb-41e5-9a57-114464fc37e0/image.png" alt=""></p>
<p>앱키 탭으로 들어가면 이렇게 다양한 곳에서 사용이 가능한 키가 주르륵 나온다.
나는 <strong>flask</strong>를 이용해서 지도를 올릴 거기 때문에 <strong>Javascript 키</strong>를 사용한다</p>
<p>또, 카카오는 api로 사용이 가능한 라이브러리를 제공한다</p>
<blockquote>
</blockquote>
<p><strong>clusterer</strong>: 마커를 클러스터러 라이브러리
<strong>services</strong>: 장소 검색, 주소-좌표 변환 라이브러리
<strong>drawing</strong>: 마커와 그래픽스 객체 그리기 모드 라이브러리</p>
<p>appkey를 입력하면서 함께 입력해주면 된다
<code>appkey=APIKEY&amp;libraries=services</code> 이런식으로 !</p>
<blockquote>
</blockquote>
<pre><code class="language-javascript">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;행사장 위치 찾기&lt;/title&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//dapi.kakao.com/v2/maps/sdk.js?appkey={발급받은 key 입력}&quot;&gt;&lt;/script&gt;
    &lt;!-- CSS 파일 링크 --&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;{{ url_for(&#39;static&#39;, filename=&#39;css/styles.css&#39;) }}&quot;&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h2&gt;행사장 위치&lt;/h2&gt;
    &lt;div id=&quot;map&quot;&gt;&lt;/div&gt;</code></pre>
<p>script type의 src 부분에 kakao 링크와 발급받은 appkey를 입력해주면 된다.
처음에 무지성으로 gpt한테 물어봤다가 된통 당했음. gpt 분리불안 버릇좀 고쳐야겠어😢</p>
<hr>
<h3 id="🚩-지도-생성">🚩 지도 생성</h3>
<blockquote>
</blockquote>
<pre><code class="language-javascript">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta charset=&quot;utf-8&quot;/&gt;
    &lt;title&gt;Kakao 지도 시작하기&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div id=&quot;map&quot; style=&quot;width:500px;height:400px;&quot;&gt;&lt;/div&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//dapi.kakao.com/v2/maps/sdk.js?appkey=발급받은 APP KEY&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
        var container = document.getElementById(&#39;map&#39;);
        var options = {
            center: new kakao.maps.LatLng(33.450701, 126.570667),
            level: 3
        };
        var map = new kakao.maps.Map(container, options);
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>내 코드를 가져오려고 했는데, kakao 설명이 더 깔끔해서 그대로 들고왔다 😅</p>
<p>보통 프론트 작업은</p>
<blockquote>
<pre><code class="language-javascript">  static/css
  ⌞styles.css //스타일 정리해놓은 파일
static/js
  ⌞map.js // 기능 정리해둔 java
templates/
  ⌞index.html // front</code></pre>
</blockquote>
<pre><code>
이런식으로 작업하기 때문에 내 코드는 뿔뿔히 흩어져있다..^^

&gt;```javascript
// Kakao 지도 로드
kakao.maps.load(function() {
    // Kakao 지도 객체 생성
    var mapContainer = document.getElementById(&#39;map&#39;), 
        mapOption = {
            center: new kakao.maps.LatLng(37.486320, 126.898530), 
            level: 4 
        };
    var map = new kakao.maps.Map(mapContainer, mapOption);
    // 주소-좌표 변환 객체 생성 (전역 변수로 설정)
    window.geocoder = new kakao.maps.services.Geocoder();
    // 인포윈도우를 하나만 관리하도록 설정
    var infowindow = new kakao.maps.InfoWindow({zIndex: 1});
    // 여러 주소 처리
    locations.forEach(function(item) {
        // 불용어가 포함된 주소인지 확인
        if (!containsStopWords(item.address)) {
            // 주소로 좌표 변환
            geocoder.addressSearch(item.address, function(result, status) {
                if (status === kakao.maps.services.Status.OK) {
                    var coords = new kakao.maps.LatLng(result[0].y, result[0].x);
                    // 마커 추가
                    var marker = new kakao.maps.Marker({
                        map: map,
                        position: coords
                    });
                    // 마커 클릭 시 인포윈도우 표시
                    kakao.maps.event.addListener(marker, &#39;click&#39;, function() {
                        // 기존에 열린 인포윈도우 닫기
                        infowindow.close();
                        // 클릭한 마커의 정보를 표시할 새로운 인포윈도우 내용
                        var content = &#39;&lt;div style=&quot;width:300px;text-align:center;padding:6px 0;&quot;&gt;&#39; +
                                    &#39;&lt;strong&gt;&#39; + item.title + &#39;&lt;/strong&gt;&lt;br&gt;&#39; +
                                    &#39;address : &#39; + item.address + &#39;&lt;br&gt;&#39; +
                                    &#39;Point : &#39; + item.point + &#39;&lt;br&gt;&#39; +
                                    // &#39;URL : &#39; + item.url + &#39;&lt;br&gt;&#39;+
                                    // &#39;&lt;a href=&quot;&#39; + item.url + &#39;&quot; target=&quot;_blank&quot;&gt;homepage&lt;/a&gt;&#39; +
                                    &#39;&lt;/div&gt;&#39;;
                        // 새로운 인포윈도우를 열기
                        infowindow.setContent(content);
                        infowindow.open(map, marker);
                        // 표 업데이트
                        updateInfoTableWithSingleMarker(item);
                        // 가까운 역 찾기
                        findNearestStation(coords, item);
                    });
                    // 지도의 중심을 해당 주소로 이동
                    map.setCenter(coords);
                }
            });
        } else {
            console.log(`주소 &quot;${item.address}&quot;는 불용어가 포함되어 있어 검색하지 않습니다.`);
        }
    });
});  </code></pre><p>내가 구현한 카카오맵 기본 구조
함수까지 적으면 너무 길어질 것 같아서 map.js의 부분만 가져왔다</p>
<p>프론트, 특히 java는 거의 만져본적이 없는데 나름 재미있었다
파이썬에서 쓰는 것처럼 함수도 지정해서 사용하기도 하고 👶</p>
<hr>
<h2 id="2-kakaomap-api으로-거리-계산하기">2. kakaomap api으로 거리 계산하기</h2>
<p>내가 api를 쓰면서 가장 신기했던 점...</p>
<p>위에서 쓰인 <strong>getDistance 함수</strong>는 이렇게 작성되었다</p>
<blockquote>
</blockquote>
<pre><code class="language-javascript">// 거리 계산 함수
function getDistance(coords1, coords2) {
    var lat1 = coords1.getLat();
    var lng1 = coords1.getLng();
    var lat2 = coords2.getLat();
    var lng2 = coords2.getLng();
    // Haversine formula (지구의 곡률을 고려한 거리 계산)
    var R = 6371e3; // 지구의 반지름 (미터)
    var φ1 = lat1 * Math.PI/180; // 위도를 라디안으로 변환
    var φ2 = lat2 * Math.PI/180; //위도를 라디안으로 변환
    var Δφ = (lat2-lat1) * Math.PI/180; //두 위도의 차이를 라디안으로 계산
    var Δλ = (lng2-lng1) * Math.PI/180; //두 경도의 차이를 라디안으로 계산
    var a = Math.sin(Δφ/2) * Math.sin(Δφ/2) +
            Math.cos(φ1) * Math.cos(φ2) *
            Math.sin(Δλ/2) * Math.sin(Δλ/2);
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    return Math.round(R * c); // 거리 반환 (미터 단위)
}</code></pre>
<p>이야 이게 무슨 소리야 😅</p>
<p>차근차근 해보자면</p>
<blockquote>
<p><code>var lat1 ~ lng2</code> : 위도(lat), 경도(lng) 추출
<code>var R ~ var Δλ</code> : Haversine 공식을 위한 상수 및 변환
<code>var a</code> : 두 좌표 간의 대원적 거리의 제곱을 계산
<code>var c</code> : 아크 탄젠트 함수(atan2)를 사용하여 두 점 사이의 중심각 계산</p>
</blockquote>
<p>아직 한 60%만 감이 잡혔는데, <strong>지도상의 거리를 지구의 곡률을 고려하여 정확히 계산하는 방법</strong>이라 생각하면 되겠다
kakao map에 위치를 입력하면 위도와 경도를 알려주기 때문에 거리 계산도 한결 편했다👌</p>
<hr>
<h2 id="3-kakaomap--flask">3. kakaomap + flask</h2>
<blockquote>
<pre><code class="language-python">from flask import Flask, render_template
import pandas as pd
app = Flask(__name__)
@app.route(&#39;/&#39;)
def index():
    # CSV 파일 읽기
    # df = pd.read_csv(&#39;processed_df.csv&#39;)
    df = pd.read_excel(&#39;handling.xlsx&#39;)
    # 결측값 제거 및 필요한 데이터만 리스트로 변환
    data = df.dropna(subset=[&#39;address&#39;, &#39;title&#39;, &#39;point&#39;, &#39;url&#39;, &#39;condition&#39;, &#39;contact&#39;])
    # &#39;keyword&#39; 컬럼에서 지역 이름 추출 (공백으로 구분된 첫 번째 단어)
    data[&#39;region&#39;] = data[&#39;keyword&#39;].str.split().str[0]
    # 줄바꿈 문자를 &lt;br&gt;로 변환
    data[&#39;condition&#39;] = data[&#39;condition&#39;].str.replace(&#39;\n&#39;, &#39;&lt;br&gt;&#39;, regex=False)
    # 중복된 지역 이름 제거 후 리스트로 변환
    regions = sorted(data[&#39;region&#39;].unique().tolist())
    # 필요한 컬럼을 딕셔너리로 변환
    locations = data[[&#39;title&#39;, &#39;address&#39;, &#39;point&#39;, &#39;url&#39;, &#39;region&#39;, &#39;condition&#39;, &#39;contact&#39;]].to_dict(orient=&#39;records&#39;)
    # 템플릿에 데이터 전달
    return render_template(&#39;index.html&#39;, locations=locations, regions=regions)
if __name__ == &#39;__main__&#39;:
    app.run(debug=True)</code></pre>
</blockquote>
<pre><code>
flask로 구현한 main.py를 실행시키면

![](https://velog.velcdn.com/images/joshua_1203/post/11118ce0-ccba-4e59-b109-ee96c037abf6/image.png)

이렇게 지도에 위치 마커가 표시 된다

![](https://velog.velcdn.com/images/joshua_1203/post/253a75d9-4dbe-4d4b-906a-a5037b614663/image.png)

마커를 누르면 마커 위에 정보를 표시하고,
지역 별로 드롭다운으로 구현하고,
아래에 표로 나타내고,
엑셀로 다운로드 하는 기능까지 구현해봤다

사실 마커 부분을 제외하면 java로 구현한거지만 ^^;;ㅎㅎ
이렇게 또 하나 배워가는거지


![](https://velog.velcdn.com/images/joshua_1203/post/7ee00721-450b-4130-9807-737c765a3344/image.png)

https://apis.map.kakao.com/

위의 사이트를 들어가면 kakaomap에 대해 더 자세히 알 수 있다
그럼 다음에는 꼭 LLM을 공부를.............
![](https://velog.velcdn.com/images/joshua_1203/post/59bada47-b3ab-4dc8-a964-94c34f68c229/image.png)
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[구글 설문조사 폼과 스프레드 시트 📑]]></title>
            <link>https://velog.io/@joshua_1203/%EA%B5%AC%EA%B8%80-%EC%84%A4%EB%AC%B8%EC%A1%B0%EC%82%AC-%ED%8F%BC%EA%B3%BC-%EC%8A%A4%ED%94%84%EB%A0%88%EB%93%9C-%EC%8B%9C%ED%8A%B8</link>
            <guid>https://velog.io/@joshua_1203/%EA%B5%AC%EA%B8%80-%EC%84%A4%EB%AC%B8%EC%A1%B0%EC%82%AC-%ED%8F%BC%EA%B3%BC-%EC%8A%A4%ED%94%84%EB%A0%88%EB%93%9C-%EC%8B%9C%ED%8A%B8</guid>
            <pubDate>Tue, 29 Oct 2024 08:39:30 GMT</pubDate>
            <description><![CDATA[<p>서비스 프로젝트를 하나 완성하고 고도화 하고 있는 지금,
정말 다양한 서비스를 사용해보고 있는데
그 중 하나가 <strong>구글 설문 폼과 스프레드 시트</strong>🧐 !
정말 편리한 녀석이기도 하고, 범용적으로 많이 사용되고 있는 서비스라 나도 재미있게<del>(근데 좀 열받는 부분도 있음)</del> 이리저리 만져봤다🫡</p>
<h2 id="1-구글-폼이-뭐야-">1. 구글 폼이 뭐야 ?</h2>
<p><strong>구글에서 제공하는 무료 설문조사 및 설문 양식 작성 도구</strong>로 사용자가 설문지를 만들고 배포할 수 있게 해주며, 응답을 수집하고 분석하는 데 유용하다!</p>
<blockquote>
<p>🛠️ <strong><u>구글 폼 주요기능</u></strong></p>
</blockquote>
<p><strong>양식 만들기</strong>: 텍스트, 선택형 질문, 체크박스 등 다양한 질문 형식을 사용해 만들고자 하는 설문지 작성 가능</p>
<blockquote>
</blockquote>
<p><strong>디자인 및 커스터마이징</strong>: 구글 폼에서 제공하는 테마와 색상을 선택해 설문지의 외관 변경 가능</p>
<blockquote>
</blockquote>
<p><strong>응답 수집</strong>: 설문지 url을 통해 쉽게 배포할 수 있으며, 응답은 자동으로 구글 스프레드시트에 저장됨</p>
<blockquote>
</blockquote>
<p><strong>응답 분석</strong>: 수집된 응답을 실시간으로 확인하고, 그래프와 차트를 통해 분석 가능</p>
<blockquote>
</blockquote>
<p><strong>팀 협업:</strong> 여러 사용자가 동시에 설문지를 작성하거나 수정할 수 있음</p>
<hr>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/0dc9740c-37e5-4cc4-ac77-95cc1d84af38/image.png" alt=""></p>
<center>구글 로그인 해서 메뉴를 눌러보면 Forms라고 있음!</center>

<hr>
<h2 id="2-구글-폼을-사용해보자-">2. 구글 폼을 사용해보자 !</h2>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/fa8187f6-ab39-4aea-9abd-5510af9b6656/image.png" alt=""></p>
<center>폼을 눌러보면 양식을 선택할 수 있고 기존에 만들어 놨던 설문지를 확인할 수 있다 🎯

<p><img src="https://velog.velcdn.com/images/joshua_1203/post/066b8ba3-15bb-4e85-912d-44b8cd2f6c30/image.png" alt=""></p>
<p>정말 다양한 질문 형식을 제공하고 있는데, <strong>이 형식에 따라 데이터를 분석할 때 사용하는 시각화도 알아서 정해주는 것 같다.</strong></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/abb65b60-5ae2-4eed-8a25-1925306aa825/image.png" alt=""></p>
<p>설문지 옆에 + 버튼으로 추가하고 이미지, 텍스트, 심지어 영상까지 넣을 수 있다📽️ !!</center></p>
<hr>
<h2 id="3-결과를-어떻게-보지">3. 결과를 어떻게 보지?</h2>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/3cec25ee-d64d-49c2-915e-aff255995734/image.png" alt=""></p>
<center> 질문을 수정하면 바로 옆에 응답이 있다
없을 경우에는 응답을 기다리고 있다는 안내 메세지가 나오고,

<p>응답이 쌓이면 자동으로 응답과 그래프를 시각화해서 보여준다</p>
<p>오... 아주 편리해...😗</p>
<p>화면에 보이는 것 말고도 구글 스프레드 시트와 연동하여 다양한 작업을 할 수 있는데, 그건 다음 챕터에서!</center></p>
<hr>
<h2 id="4-스프레드-시트와-연결해보자">4. 스프레드 시트와 연결해보자</h2>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/00f77e9b-dfe3-406e-889e-3573dc1d46ec/image.png" alt=""></p>
<center>응답에 가면 `응답 저장 위치 선택`이 있다

<p>이걸 클릭하면 스프레드 시트를 만들거나, 내 구글 드라이브에 있는 스프레드 시트를 사용할 수 있게 된다</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/06019c0f-d479-43f1-b58f-b907ea09c142/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/79e4bd9e-edab-466a-ac96-c4b457f21090/image.png" alt=""></p>
<p>그리고 나온 결과물 짜잔 ✨
이렇게 스프레드 시트로 관리하면 필터나 서치도 용이해지고,
간단한 분석도 진행 할 수 있어서 좋았다.</center></p>
<hr>
<h2 id="5-api를-이용해-파이썬으로-구현하자">5. API를 이용해 파이썬으로 구현하자</h2>
<center> 하지만 난 개발자. 파이썬이 편하지 (?)

<p>신난다 얼른 파이썬으로 가져와보자 😋 !!</p>
<p>먼저 <strong>구글 클라우드 API에서 서비스 계정 키를 받아야 한다</strong></p>
<p>근데 왜인지 접속이 안돼서.... 그냥 링크를 공유하는 걸로 ㅠ</p>
<p><a href="https://neep305.tistory.com/67">https://neep305.tistory.com/67</a>
이 분이 포스팅을 정말 잘해놓으셨다 !!</p>
<p><a href="https://greeksharifa.github.io/references/2023/04/10/gspread-usage/">https://greeksharifa.github.io/references/2023/04/10/gspread-usage/</a>
json 파일로 받는 방법과 값을 불러오는 방법은 이 분을 참고 !</p>
<p>역시 세상에는 잘 정리해 두신 분들이 많음 🤗
<img src="https://velog.velcdn.com/images/joshua_1203/post/ec0937dd-d8ac-41d0-a4d9-f75ab53c2604/image.png" alt=""></p>
<p>나는 api 키를 받았다는 가정하에 진행하려고 한다</p>
<p>json 파일을 받거나 키를 생성하면 </p>
<p><code>&quot;test@test.iam.gserviceaccount.com&quot;</code></p>
<p>이런 주소를 하나 받게 된다
(json 파일의 경우 <code>client_email</code>를 확인 !!)
<img src="https://velog.velcdn.com/images/joshua_1203/post/e78d134c-5dd4-4587-ab40-5f899301d232/image.png" alt=""></p>
<p>이 주소를 스프레드 시트 공유 창을 눌러</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/509c837c-7baa-4034-8264-16bce9f52802/image.png" alt=""></p>
<p>쏙 넣어주면 된다 🧩
<strong>액세스 권한은 꼭 편집자로 설정</strong>해 놓아야
내가 자유롭게 코드로 활용할 수 있게 되니 참고 !</center></p>
<blockquote>
</blockquote>
<pre><code class="language-python"># 구글 시트에서 정보 불러오기
json_file_path = &quot;/home/ubuntu/test.json&quot; 
gc = gspread.service_account(json_file_path) 
spreadsheet_url = &quot;https://docs.google.com/spreadsheets/test&quot;
worksheet = gc.open_by_url(spreadsheet_url)
sheet = worksheet.worksheet(&quot;test&quot;)
rows = sheet.get_all_values()</code></pre>
<center>이런식으로 코드를 작성하여 정보들을 불러올 수 있다📚

<p>참고로 <strong>명령어에 따라서 list나 dict의 형태로 가져올 수 있다</strong>
처음엔 두 개 똑같은 건줄 알고 그대로 작성했다가 형식이 달라서 애먹었다 ^^;;</center></p>
<blockquote>
</blockquote>
<pre><code class="language-python">sheet.get_all_values() # list
sheet.get_all_records() # dict</code></pre>
<center>

<p>  <a href="https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets?hl=ko">https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets?hl=ko</a>
여기에서 더 자세한 설명을 볼 수 있는데,
주로 셀 서식 등에 관련된 내용이라 설문조사 관련해서는 <strong>값을 가져오는 것만 알아도 크게 불편한 건 없다</strong></center></p>
<hr>
<h2 id="6-응답-결과-수정-삭제">6. 응답 결과 수정, 삭제</h2>
<center>응답 결과의 경우 

<p><img src="https://velog.velcdn.com/images/joshua_1203/post/9a67e189-2cf1-448e-812e-903eb81eeb46/image.png" alt=""></p>
<p>설문지 폼에서 삭제가 가능함</p>
<p>하지만 여기서 삭제한다고 스프레드 시트에서 삭제되지 않는다
이리저리 알아봤지만 삭제까지 연동이 되는건 찾지 못했다 ㅠㅠ
그래서 <strong>응답 결과는 설문지 폼과 스프레드 시트 둘 다 삭제를 해줘야 한다</strong>
<img src="https://velog.velcdn.com/images/joshua_1203/post/77e9ac17-b74e-48e6-8c45-6ef8ee51b4bb/image.png" alt=""></p>
<p>주의할 점은, 꼭 <strong>행 삭제</strong>를 해줘야 한다는 점📌 !
데이터를 삭제하면 우리 눈에는 빈칸 같아도 구글 폼에서는 데이터가 있다고 판단해 그 아래에서 부터 데이터가 쌓이게 되고
매우 불편함을 느낄 수 있다 <del>나도 알고싶지 않았다</del> </center></p>
<hr>
<p>/
/</p>
<p>짧고 간단하게 구글 폼 설명을 마친다 !
저번주까지만 해도 심경이 복잡했는데 그래도 이렇게 또 하루에 하나씩 차곡차곡 쌓여가는 것이 보이니 다 의미가 있던거구나 생각하게 된다.
역시 사람은 조급해 하지 말고 내가 해야 할 일과 할 수 있는 일, 하고 싶은 일을 잘 구분해야 함을 깨달았던 시간.
<img src="https://velog.velcdn.com/images/joshua_1203/post/a0b2f204-da7f-4752-9db4-e0b0b4f571b8/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS SES 이메일 콘솔사용법 :  등록부터 발송, 로그 추적까지 !]]></title>
            <link>https://velog.io/@joshua_1203/AWS-SES</link>
            <guid>https://velog.io/@joshua_1203/AWS-SES</guid>
            <pubDate>Wed, 23 Oct 2024 07:45:12 GMT</pubDate>
            <description><![CDATA[<p>아 정말 얼마만에 벨로그인지 ㅠㅠ
요 몇주 정말 바빴다
하고 싶었던 프로젝트도 결국 못하게 되었고 (....😭😭😭😭😭😭)
공부하고 싶었던 LLM도 잠시 멈춰둔 상태다 (....😭😭😭😭😭😭 !!!!!!!)
그래도 기초부터 차근차근, 다방면으로 공부하는 것도 나에게 좋은 양분이라고 생각하고 열심히 해보려고 한다 ㅠㅠ</p>
<hr>
<h3 id="1-aws-sessimple-email-service란">1. AWS SES(Simple Email Service)란?</h3>
<p>AWS에서 제공하는 클라우드 기반 이메일 발송 서비스. 
주로 대량 이메일을 안전하고 경제적으로 전송하기 위해 사용된다</p>
<blockquote>
</blockquote>
<ul>
<li><strong>대량 마케팅 이메일 발송</strong>: 뉴스레터, 프로모션 이메일 등</li>
<li><strong>트랜잭션 이메일 발송</strong>: 주문 확인서, 비밀번호 재설정, 계정 알림 같은 개인화된 이메일 자동 발송</li>
<li><strong>알림 이메일</strong>: 시스템 이벤트나 경고 등을 사용자에게 즉시 알려주는 용도</li>
</ul>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/a94792ec-f223-4bda-87cc-367d147af3c3/image.png" alt=""></p>
<p>그림에서 보는 것처럼 기본적인 메일링 서비스와 로그 추적도 가능함
<del>(이제보니 kinesis가 있네 cloudwatch썼는데 ㅠㅠ)</del></p>
<hr>
<h4 id="주요-기능">주요 기능</h4>
<blockquote>
</blockquote>
<ul>
<li><strong>대량 이메일 발송</strong></li>
<li><strong>이메일 수신</strong>: 특정 이메일 주소를 수신하여 해당 메시지를 Lambda 같은 다른 AWS 서비스와 연결할 수 있음</li>
<li><strong>SPF, DKIM, DMARC 지원</strong>: 인증된 발신자로 이메일을 보낼 수 있도록 SPF(Sender Policy Framework), DKIM(DomainKeys Identified Mail), DMARC(Domain-based Message Authentication, Reporting &amp; Conformance)와 같은 이메일 인증 표준 지원.</li>
<li><strong>Bounce 처리</strong>: 이메일을 제대로 수신하지 못하거나 반송된 이메일에 대해 피드백 제공</li>
<li><strong>비용 효율적</strong>: 사용량에 따른 종량제 요금제(발신 또는 수신 이메일 1,000건당 USD 0.10 USD)</li>
</ul>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/87b60ea3-616e-401e-93a9-a263c6d6ce28/image.png" alt=""></p>
<p>이렇게 계정 대시보드에서 사용량을 확인할 수 있다.
<strong>비용이 정확히 쓰여 잇지 않아서 모르는데 대시보드를 보니 하루 50,000건은 무료고, 그 이후에 건당 요금이 추가되는 시스템인듯.</strong></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/af37bcb7-4705-41bb-87e3-187605055af9/image.png" alt=""></p>
<hr>
<h3 id="2-ses의-장점">2. SES의 장점</h3>
<ul>
<li><strong>확장성</strong>: Amazon SES는 자동으로 확장되므로 트래픽이 급증할 때도 안정적인 이메일 전송이 가능.</li>
<li><strong>보안성</strong>: Amazon VPC, IAM, CloudWatch, CloudTrail 같은 AWS 보안 및 모니터링 서비스를 통합하여 보안 수준을 높임.</li>
<li><strong>쉬운 통합</strong>: 다른 AWS 서비스와 쉽게 연동할 수 있어 AWS 환경에서 작업할 때 편리함.</li>
</ul>
<hr>
<h3 id="3-콘솔-설명">3. 콘솔 설명</h3>
<p> 솔직히 콘솔
 겁 나 어 렵 습 니 다
 <img src="https://velog.velcdn.com/images/joshua_1203/post/1b9e9c72-487d-4885-a9ef-4184f13b225a/image.png" alt=""></p>
<p> 아 먼소리냐고 대체 ~~
 그치만 어쩌겠습니까, 해봐야지요🧐</p>
<h4 id="⚡-자격증명">⚡ 자격증명</h4>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/cafbbad2-e5ae-46f7-9baf-877a6c8f9092/image.png" alt="">
어떤 이메일로 보낼것인가? 를 자격증명에서 설정하면 된다
example.gmail.com 이런 식으로 생성해서 보안 인증을 받으면 됨!
도메인이 인증되면 여러 로그 추적을 할 수 있어 편하다🫡</p>
<hr>
<h4 id="⚡-구성세트">⚡ 구성세트</h4>
<p>내 가 진 짜 헷 갈 렸 던 구 성 세 트
<img src="https://velog.velcdn.com/images/joshua_1203/post/1fe60ba8-6578-482f-97df-53e064d3227f/image.png" alt=""></p>
<p>여기에 세트를 구성해야 로그 추적이 가능해진다
근데 코드에서 설정을 하긴 해야함 ㅋ</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/0a952217-16ea-4def-9979-d6e85301ffc1/image.png" alt=""></p>
<p>먼저 세트 생성을 하는데, 여기서 중요한 점은
<strong>추적 옵션을 꼭 체크</strong>해야 한다는 것 !
그래야 <strong>열기 및 클릭 추적이 가능</strong>해진다
사용자 지정 리디렉션 도메인 사용은 비워둬도 상관없다</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/851fe566-df4b-4f21-a999-f9d9493f0c58/image.png" alt=""></p>
<p>그러면 이렇게 구성 세트가  생성된다
여기에 이벤트 대상으로 가보면 (원래는 비워져 있음) 대상 추가를 눌러 여기서 설정하면 된다
구성 세트는 <strong>여러 대상을 만들 수 있는 주머니 같은 존재</strong>라고 생각하면 됨!</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/314b5ea1-c6f6-484b-a437-86c8c2ed6a9f/image.png" alt=""></p>
<p>대상추가에서 본인에게 맞는 이벤트 유형을 체크해주면 된다</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/da136a0c-71e5-4c1e-83c9-35262964ff89/image.png" alt=""></p>
<p>다음을 누르면 대상 옵션이 뜨는데,
나는 로그를 대시보드로 띄우고 싶어서 <strong>Cloudwatch</strong>를 선택했고,
감지가 되면 문자를 보내주는 SNS도 등록할 수 있다
<strong>원하는 유형대로 선택</strong>하면 된다 !</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/6577c270-3f01-4ecf-855d-3a81ab9bb935/image.png" alt=""></p>
<p>cloudewatch의 경우 이렇게 적어주면 된다. 차원은 흩어져있는 대상 같은 친구들을 하나로 묶어 보여주기 위해 걸어놓는 이름 같은건데(확실하진 않고 내가 이해한 것) 차원을 같이 사용하면 요금이 부과된다</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/da3887fe-1455-4ace-99a5-62d0fae299d1/image.png" alt=""></p>
<p>마지막으로 검토하고 대상추가를 누르면 된다</p>
<p>마지막의 마지막으로😂 !!!!!!
<strong>코드에 내가 만든 구성세트의 이름을 넣어주면 된다</strong>(ConfigurationSetName)
참고로 이벤트 대상이 아닌 구성 세트의 이름을 넣어주어야 한다</p>
<blockquote>
</blockquote>
<pre><code class="language-python">  # ses_client 생성
  ses_client = boto3.client(&#39;ses&#39;,
                            region_name = aws_region,
                            aws_access_key_id = aws_access_key_id,
                            aws_secret_access_key = aws_secret_access_key
                            )
  try:
      response = ses_client.send_email(
          Destination = {
              &#39;ToAddresses&#39;: [
                  recipient_email
              ],
          },
          Message = {
              &#39;Body&#39; : {
                  &#39;Html&#39; : {
                      &#39;Charset&#39; : &#39;UTF-8&#39;,
                      &#39;Data&#39; : html_body
                  },
              },
              &#39;Subject&#39; : {
                  &#39;Charset&#39; : &#39;UTF-8&#39;,
                  &#39;Data&#39; : subject
              },
          },
          ConfigurationSetName=&#39;name&#39;,  # Configuration Set 이름
          Source = sender_email,
      )</code></pre>
<hr>
<h3 id="4-메일-트래킹">4. 메일 트래킹</h3>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/e071e5e9-4d22-431f-8f33-03cb0fe0aef5/image.png" alt=""></p>
<p>내가 만든 구성세트의 이벤트 대상
걍 다 때려 넣었다
내가 설정한 대상 유형인 cloudwatch를 클릭하면</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/ba648a9c-0b81-4ec3-899f-689fbe4399fb/image.png" alt=""></p>
<p>이렇게 지표로 바로 넘어갈 수 있다 📊</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/eb0fea7c-ae32-4e10-ae6d-84d099f196eb/image.png" alt=""></p>
<p>여기에 내가 설정한 지표를 선택하면 그래프로 나타나게 되는데
여기서 질문 </p>
<blockquote>
</blockquote>
<p><strong>아까 이벤트는 7개 아니였어?</strong>
<strong>답 : 맞다. 신기한게 cloudwatch는 이 이벤트가 생겨야 범례에도 나타난다</strong></p>
<p>이벤트가 나타나기 전까지는 나오지 않음
그런데도 뭔가 이상하다? <strong>콘솔 재로그인</strong> 하면된다
나도 알고 싶지 않았다.
ㅠ
ㅠㅠ
ㅠㅠㅠ
ㅠㅠㅠㅠ</p>
<blockquote>
</blockquote>
<p>질문2
저 그래프는 왜저래?</p>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/33c54ec9-a461-4de5-a72c-ee157027c3e6/image.png" alt=""></p>
<blockquote>
</blockquote>
<p>답 : <strong>cloudwatch는 시간대 설정이 까다로워서 여러개 만져야 한다는 사실 !
기본값이 평균으로 되어 있어 이상하게 나오는 거였다</strong></p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/199de3a0-a240-4987-85b8-d4bec9f4259b/image.png" alt=""></p>
<hr>
<p>/
/</p>
<p>오늘은 정신없이 휘몰아쳤던 AWS의 SES 서비스!
<strong>생각보다 정보도 많이 없고, DOCS도 불친절해서(사실 불친절하기 보다 기능이 너무 많아서) 익숙해지는데 애먹었다</strong>
그래도 말로만 듣던 애들을 <del>(돈걱정없이)</del> 써본다는 게 진짜 좋은 경험이었음 !!
이제 일하는 것도 점점 익숙해지고,
이리저리 업무도 많이 받고 책임질 일도 많아졌지만
이렇게 일하는 지금의 내가 그 언젠가의 나보다 가장 좋다 😎 !!
개발자하길 잘했어
<img src="https://velog.velcdn.com/images/joshua_1203/post/33fe9883-656b-481a-b8f9-049a2fc04eb8/image.png" alt=""></p>
<hr>
<h4 id="참고문헌">참고문헌</h4>
<p><a href="https://xn--uni-s-code-2w63b.tistory.com/48">https://xn--uni-s-code-2w63b.tistory.com/48</a>
이 분의 도움을 굉장히 많이 받았다 !!!!!
<a href="https://aws.amazon.com/ko/ses/">https://aws.amazon.com/ko/ses/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[LDA 모델을 활용한 주제 분석]]></title>
            <link>https://velog.io/@joshua_1203/LDA-%EB%AA%A8%EB%8D%B8%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%A3%BC%EC%A0%9C-%EB%B6%84%EC%84%9D</link>
            <guid>https://velog.io/@joshua_1203/LDA-%EB%AA%A8%EB%8D%B8%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%A3%BC%EC%A0%9C-%EB%B6%84%EC%84%9D</guid>
            <pubDate>Sat, 12 Oct 2024 08:17:35 GMT</pubDate>
            <description><![CDATA[<p>인턴 생활 하면서 정말정말 정신 없는 삶을 살고 있다😋
1일 1 포스팅이 목표였는데 <del>개뿔</del> 현생에 치여 매우 바쁘다</p>
<p>그래도 오랜만에 일하면서하면서 알게 된 분석기법을 소개하고자 한다
원래 한 포스팅에 내용을 많이 쓰는 편인데 한동안은 어렵지 싶음😢
주저리 주저리 그만하고, 얼른 내가 배운 지식을 남기자 !!</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/b6a1525a-2b71-4110-82bd-cebc16295fa9/image.png" alt=""></p>
<hr>
<h2 id="1-주제-분석-">1. 주제 분석 ?</h2>
<p><strong>주제 분석(Topic Modeling)</strong> 은 대량의 텍스트 데이터에서 숨겨진 주제를 자동으로 찾아내기 위해 사용되는 기법으로, 주제들이 텍스트에서 자주 등장하는 단어 패턴을 기반으로 추론된다.
주로 <strong>비지도 학습</strong> 기법에 속하며, 인간의 개입 없이 데이터의 패턴을 발견한다.
<strong>주제 분석의 목적</strong>은 문서에서 자주 등장하는 <strong>단어들의 패턴</strong>을 기반으로 그 문서가 <strong>어떤 주제를 다루고 있는지</strong> 파악하는 것 !</p>
<p>주제 분석은 비정형 텍스트 데이터를 분석하는 데 효과적인 도구로, 뉴스 기사, 블로그, 학술 논문, 사용자 리뷰 등에서 사용된다. 이러한 텍스트 데이터가 대규모일 경우, 인간이 일일이 읽고 분석하는 것이 불가능하거나 비효율적일 수 있기 때문에 주제 분석 기법은 다음과 같은 질문을 자동으로 해결한다</p>
<blockquote>
</blockquote>
<p>텍스트 데이터에서 주된 주제는 무엇인가?
각 문서는 어떤 주제를 얼마나 다루고 있는가?
주제와 관련된 핵심 단어들은 무엇인가?</p>
<p>주제 분석의 <strong>중요한 가정</strong>은 문서가 주제들의 혼합으로, 주제가 단어들의 혼합으로 구성된다는 것 !</p>
<p>즉, <strong>문서(document)</strong> 는 여러 <strong>주제(topic)</strong> 의 혼합으로 이루어져 있으며, 각 주제는 문서 내에 확률적으로 분포되어 있다.
각 <strong>주제(topic)</strong> 는 특정 단어들의 분포로 정의되며, 주제는 여러 문서에서 단어의 출현 빈도에 따라 확률적으로 구성된다.</p>
<hr>
<h2 id="2-lda-">2. LDA ?</h2>
<p>LDA(Latent Dirichlet Allocation)는 <strong>주제 분석의 대표적인 알고리즘</strong>이자 확률적 주제 모델링 기법</p>
<h3 id="📚-lda의-확률적-분포">📚 LDA의 확률적 분포</h3>
<blockquote>
</blockquote>
<ul>
<li><strong>문서-주제 분포</strong>: 문서가 여러 주제로 이루어져 있으며, 각 주제는 문서 내에서 특정 확률로 등장</li>
<li><strong>주제-단어 분포</strong>: 각 주제는 여러 단어로 이루어져 있으며, 주제 내에서 특정 단어들이 특정 확률로 등장</li>
</ul>
<p>-&gt; LDA는 이러한 분포를 토대로 <strong>각 문서가 어떤 주제들로 이루어져 있는지</strong>를 추정하고, 각 <strong>주제가 어떤 단어들로 이루어져 있는지</strong>를 계산함</p>
<blockquote>
</blockquote>
<ul>
<li><strong>단어(w)</strong>: 문서에서 관찰되는 데이터로, 각 단어는 고유의 단어 ID를 가지고 있음.</li>
<li><strong>문서(d)</strong>: 여러 단어들로 구성된 텍스트. 각 문서는 다양한 주제의 혼합으로 이루어짐.</li>
<li><strong>주제(z)</strong>: 주제는 단어의 분포를 나타내며, 각 주제는 특정 단어들의 집합을 나타냄.</li>
<li><strong>말뭉치(corpus)</strong>: 문서들의 집합으로, 분석의 대상이 되는 전체 텍스트 데이터.</li>
</ul>
<h3 id="📚-lda의-동작-과정">📚 LDA의 동작 과정</h3>
<p>LDA는 각 문서에서 주제를 추론하고 각 주제에서 단어를 추론하는 <strong>역방향 생성 모델</strong>로 동작한다.</p>
<p>수학적인 내용은 너무 어려워서 개념적인 이해만이라도 되도록 간단히 표현해봤다.</p>
<blockquote>
</blockquote>
<ul>
<li><strong>문서-단어 행렬 생성</strong>: 데이터에 있는 문서를 단어의 등장 빈도로 나타냄</li>
<li><strong>사전 확률 분포 설정</strong>: 주제에 포함될 단어들에 대한 초기 확률을 무작위로 설정</li>
<li><strong>토픽 할당</strong>: 각 문서의 각 단어에 대해 확률적으로 주제를 할당</li>
<li><strong>최적화</strong>: 각 문서의 주제 분포와 주제의 단어 분포를 반복적으로 최적화해 문서에 가장 적합한 주제들을 도출</li>
</ul>
<h3 id="📚-lda의-결과-해석">📚 LDA의 결과 해석</h3>
<p>LDA 모델이 학습되면 다음과 같은 정보를 얻을 수 있다</p>
<blockquote>
</blockquote>
<ul>
<li><strong>문서에서 주제 분포</strong>: 각 문서가 어떤 주제들로 구성되어 있는지 (각 주제에 대한 확률).</li>
<li><strong>주제에서 단어 분포</strong>: 각 주제가 어떤 단어들로 이루어져 있는지 (각 단어에 대한 확률).</li>
<li><strong>주제 키워드</strong>: 각 주제에 가장 관련된 키워드들.</li>
</ul>
<p>✨ 예시
문서 A는 40%의 확률로 &quot;스포츠&quot;, 60%의 확률로 &quot;정치&quot; 주제를 다루고 있다.
&quot;스포츠&quot; 주제는 &#39;축구&#39;, &#39;선수&#39;, &#39;경기&#39;와 같은 단어들과 강하게 연관되어 있다.</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/a8798475-664a-4bdf-a021-25c96cafa848/image.png" alt=""></p>
<ul>
<li>출처 : <a href="http://bigdata.emforce.co.kr/index.php/2020072401/">http://bigdata.emforce.co.kr/index.php/2020072401/</a>
솔직히 그림 봐도 잘 이해가 안돼서 내가 볼라구 가져온 것🤭 ㅎ</li>
</ul>
<hr>
<h2 id="3-그게-군집-분석이랑-뭐가-달라">3. 그게 군집 분석이랑 뭐가 달라</h2>
<p>주제 분석(Topic Modeling)과 군집 분석(Clustering)은 둘 다 <strong>데이터를 그룹화하는 기법</strong>이지만, 그 목적과 방법이 다르다.</p>
<ul>
<li><p><strong>주제 분석(Topic Modeling)</strong>: 문서에서 <strong>숨겨진 주제를 찾아내는 데 중점</strong>을 둔다. 주제 분석은 문서나 텍스트에서 자주 등장하는 단어들의 패턴을 기반으로, 텍스트가 어떤 주제를 포함하고 있는지 알아내는 방법이다. 
예를 들어, LDA(잠재 디리클레 할당)를 사용하여 <strong>여러 문서에서 주제를 찾아내고, 각 문서에 주제가 어느 정도 포함되어 있는지를 확률적으로 계산</strong>한다. 이때, 각 주제는 특정 단어들의 분포로 구성된다.</p>
</li>
<li><p><strong>군집 분석(Clustering)</strong>: 데이터를 <strong>비슷한 속성</strong>에 따라 여러 그룹으로 나누는 방법. 군집 분석은 데이터를 비슷한 특성이나 패턴에 따라 자동으로 묶는 데 사용된다. 텍스트 데이터뿐만 아니라, 숫자 데이터, 이미지 등 <strong>다양한 데이터에서 사용</strong> 가능하다. 기법은 K-means, DBSCAN, 계층적 군집화 등 여러 가지 방법이 있으며 군집 분석에서는 <strong>주제 대신 데이터의 유사성을 기반</strong>으로 그룹을 나눈다.</p>
</li>
</ul>
<h3 id="🕵️♂️조금-더-자세히-설명하자면">🕵️‍♂️조금 더 자세히 설명하자면,</h3>
<ul>
<li><p><strong>주제(Topic)</strong>: 주제는 특정 범주나 카테고리에 속하는 내용적인 개념. <strong>여러 문서에서 등장하는 특정 단어들이 서로 밀접한 관계를 맺고 있다면, 이 단어들이 묶여 하나의 주제를 형성</strong>함. 이는 텍스트 내에서 내용의 중심을 발견하는 과정. LDA 같은 주제 분석 알고리즘은 이 단어들의 패턴을 보고, 그 문서가 어떤 주제를 포함하고 있는지 추출함.</p>
</li>
<li><p><strong>그룹화(Grouping)</strong>: 그룹화는 데이터 간의 유사성이나 특성에 따라 데이터를 묶는 행위. 군집 분석에서는 유사한 특성을 가진 데이터를 한 그룹으로 묶는데 이 때 데이터의 속성을 기준으로 그룹이 나뉘게 된다. 즉, 그룹화는 <strong>데이터 사이의 패턴이나 연관성을 기반으로 분류</strong>하는 것.</p>
</li>
</ul>
<p>✨ 예시:</p>
<ul>
<li><strong>주제 분석</strong>: 텍스트 데이터에서 특정 단어들이 반복적으로 나타나면, 이를 기반으로 &quot;교육&quot;, &quot;기술&quot;, &quot;AI&quot;와 같은 주제들이 발견될 수 있음.</li>
<li><strong>군집 분석</strong>: 주제와 무관하게 데이터의 유사한 속성(ex: 크기, 거리 등)을 기준으로 데이터를 묶는 과정. 예를 들어, 나이와 수입을 기준으로 사람들을 여러 그룹으로 나누는 것이 군집 분석입니다.</li>
</ul>
<hr>
<h2 id="4-주제분석은-어디에-활용될까">4. 주제분석은 어디에 활용될까?</h2>
<p><strong>뉴스 기사 분류</strong>: 뉴스 기사를 주제별로 분류하여 독자에게 추천하거나, 언론사 내부에서 자동으로 분류할 때 활용.
<strong>리뷰 분석</strong>: 고객 리뷰를 분석하여, 특정 제품이나 서비스에 대한 주요 이슈나 장점 파악.
<strong>SNS 데이터 분석</strong>: 소셜 미디어 데이터를 분석하여 사람들이 주로 논의하는 주제나 트렌드를 파악.
<strong>학술 논문 분석</strong>: 대량의 학술 논문을 주제별로 분류하고, 관련 논문들을 탐색.</p>
<blockquote>
</blockquote>
<p>주제 분석은 <strong>방대한 양의 텍스트에서 대략적인 맥락을 보여주는 기법</strong>이라고 보면 된다. 어떤 토픽인지 결정하는 것은 분석가의 인사이트 영역이기 때문에, 주제 분석 외에도 다양한 분석을 진행해가면서 문서를 씹고 뜯고 맛보고 즐기면 된다(?)</p>
<hr>
<h2 id="5-뭐-다-좋대-한계점은">5. 뭐 다 좋대. 한계점은?</h2>
<h3 id="📚-장점">📚 장점</h3>
<blockquote>
</blockquote>
<ul>
<li><strong>대규모 텍스트 데이터 처리 가능</strong>: 대량의 비정형 텍스트 데이터를 효율적으로 처리하여 주제를 자동으로 추출.</li>
<li><strong>비지도 학습</strong>: 주제나 레이블 없이도 텍스트 데이터를 분석할 수 있고, 분석자의 주관을 최소화.</li>
<li><strong>효율적 주제 탐색</strong>: 각 문서의 핵심 주제를 자동으로 탐지하여, 효율적으로 문서들을 요약, 분류함.</li>
</ul>
<h3 id="📚-한계">📚 한계</h3>
<blockquote>
</blockquote>
<ul>
<li><strong>사전 주제 수 설정 필요</strong>: LDA는 사용자가 미리 설정한 주제 수에 따라 결과가 달라진다. 너무 적거나 많은 주제 수는 적절한 결과를 도출하지 못할 수 있음.</li>
<li><strong>짧은 문서에 대한 분석 한계</strong>: 주로 긴 문서에서 더 효과적이고, 문서가 짧으면 주제 추출이 어려워질 수 있다.</li>
<li><strong>해석의 모호성</strong>: 추출된 주제를 분석가가 해석하는 과정에서 모호할 수 있으며, 주제가 명확하지 않은 경우가 발생할 수 있다.</li>
</ul>
<h3 id="📚-lda-외의-주제-분석-기법">📚 LDA 외의 주제 분석 기법</h3>
<ul>
<li><strong>NMF (Non-negative Matrix Factorization)</strong>: 행렬 분해 기법을 사용하여 주제를 추출하는 방법.</li>
<li><strong>BERT 토픽 모델링</strong>: 사전 학습된 BERT 모델을 활용해 보다 정교하게 문서의 의미와 주제를 추출하는 방법.</li>
<li><strong>LSA (Latent Semantic Analysis)</strong>: 단어 간의 의미적 유사성을 기반으로 주제를 추출하는 방법.</li>
</ul>
<hr>
<p>아직 실무에 적응하느라 바쁘지만
같이 일하시는 분들이 다 열정적이고 똑똑하신 분들이어서😎
매번 공부할게 넘쳐난다(LDA도 같은 직원분이 쓰셔서 알게 되었다)</p>
<p>다들 열심히 사시는구나 부럽기도 하고, 나도 열심히 해야겠다 자극도 되니까 더 좋다🐣
요즘 DA 직무와는 사뭇 다르게 쿼리 짜고, 서버 올리고 로직 짜고 했었는데 ( 아닌가? DA 직군도 다 할줄 아는 내용인가?)
오랜만에 분석하니 또 재미있다
그럼 다음 일은 무엇일까 두근두근 🤗</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/16583872-9d13-4a80-8ff7-74c6aa52acdd/image.png" alt=""></p>
<h3 id="참고-문헌">참고 문헌</h3>
<p><a href="https://wikidocs.net/30708">https://wikidocs.net/30708</a>
<a href="http://bigdata.emforce.co.kr/index.php/2020072401/">http://bigdata.emforce.co.kr/index.php/2020072401/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[docker로 mySQL 올리는 방법]]></title>
            <link>https://velog.io/@joshua_1203/docker%EB%A1%9C-mySQL-%EC%98%AC%EB%A6%AC%EB%8A%94-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@joshua_1203/docker%EB%A1%9C-mySQL-%EC%98%AC%EB%A6%AC%EB%8A%94-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Mon, 07 Oct 2024 10:20:54 GMT</pubDate>
            <description><![CDATA[<p>와 이거 어디서부터 정리해야하지 진짜 막막하다</p>
<p>근데 우짜 해야지
끄응
<img src="https://velog.velcdn.com/images/joshua_1203/post/36e2b5c4-66e1-4568-9301-ef0f93052744/image.png" alt=""></p>
<p>때는 바야흐로 벌써 인턴 한 달 차 !
크롤링이 끝난 후 AWS에 인스턴스를 올려 코드 작업하고 있었는데
세상에 <strong>회사 내부 DB를 사용할 수 없는 것</strong>이었다 ㅠㅠ</p>
<p>그래서 나온 방법이 <strong>도커로 mySQL을 올려서 사용하는 법</strong>
그동안 효자 디비버🦦로만 하다가 눈에 보이지 않는 환경을 쓰려고 하니 머리가 좀 아팠다😥</p>
<p>하지만 열심히 해봐야지, 일은 해야지😎 !!</p>
<hr>
<h2 id="1-docker-설치">1. docker 설치</h2>
<p>먼저 나는  <strong>WSL 환경</strong>에서 작업했다.</p>
<blockquote>
<p><code>sudo apt update</code> -- 패키지 목록을 업데이트 (사용 가능 최신 버전 확인)
<code>sudo apt install -y docker.io</code> -- docker.io 패키지 설치, -y 모든 질문에 자동으로 &quot;예&quot;로 답</p>
</blockquote>
<blockquote>
<p><code>sudo systemctl start docker</code> -- Docker 서비스 시작
<code>sudo usermod -aG docker $USER</code> -- 현재 사용자를 Docker 그룹에 추가해 sudo 없이 Docker 명령어 실행</p>
</blockquote>
<hr>
<h2 id="2-sql-설치">2. SQL 설치</h2>
<blockquote>
<p><code>docker pull mysql/mysql-server:latest</code> -- 최신 버전 MySQL 이미지를 Docker Hub에서 다운로드</p>
</blockquote>
<p><code>docker run --name crawling -e MYSQL_ROOT_PASSWORD=1111 -d -p 3306:3306 mysql/mysql-server:latest</code></p>
<ul>
<li><code>name crawling</code>: 컨테이너 이름</li>
<li><code>e MYSQL_ROOT_PASSWORD=1111</code>: root 비밀번호 1111 설정</li>
<li><code>d</code>: 컨테이너 백그라운드 실행</li>
<li><code>p 3306:3306</code>: 호스트 3306 포트-&gt; 컨테이너 3306 포트에 연결</li>
</ul>
<p><code>docker ps</code> 입력해서 확인!
<img src="https://velog.velcdn.com/images/joshua_1203/post/30de8fca-9d0b-4191-b452-44577ead27fc/image.png" alt=""></p>
<p>이렇게 뜨면 된건데, 이상하게 자꾸 연결이 안되는거다. 
그래서 확인해보니 <strong>pc 포트가 막혀 있었음</strong> ^^^ 이게 나라냐</p>
<p>결국 컨테이너 지우고 ^^ 다시해</p>
<blockquote>
</blockquote>
<p><code>docker stop crawling</code>
<code>docker rm crawling</code> -- 컨테이너 삭제</p>
<blockquote>
</blockquote>
<p><code>docker run --name crawling -e MYSQL_ROOT_PASSWORD=1111 -d -p 3334:3306 mysql/mysql-server:latest</code> -- 다시 빌드하기</p>
<p>다행히(?) 3334 포트는 열려 있어서 3306으로 <strong>포워딩</strong> 시켰다</p>
<blockquote>
</blockquote>
<p>⚡mysql 한글 검색이 안되던 문제를 해결한 방법 중 하나가
<code>docker run --name crawling -e MYSQL_ROOT_PASSWORD=1111 -d -p 3334:3306 mysql/mysql-server:latest --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci</code> docker를 run할 때 utf-8을 직접 설정해 준 것이다. 참고 !</p>
<blockquote>
</blockquote>
<p>이건 그냥 참고용
<code>docker inspect -f &#39;{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}&#39; crawling</code> -- 도커 ip 주소 확인</p>
<pre><code class="language-python">import pymysql

# 데이터베이스 연결
connection = pymysql.connect(
    host=&#39;localhost&#39;, # 내부에서 사용중이어서
    user=&#39;root&#39;,
    password=&#39;1111&#39;,
    database=&#39;crawling&#39;,
    charset=&#39;utf8mb4&#39;,
    port=3334
)</code></pre>
<p>python에서 이런식으로 코드를 작성하면 연결된다</p>
<hr>
<h2 id="3-dump-파일로-sql에-삽입하기">3. dump 파일로 SQL에 삽입하기</h2>
<p>기존 DB의 데이터를 백업 파일(예: .sql 파일)로 준비해야 한다 !</p>
<blockquote>
</blockquote>
<p><code>docker cp /mnt/c/202410071345.sql crawling:/tmp/</code> -- .sql 파일을 Docker 컨테이너 crawling의 /tmp/ 디렉토리로 복사</p>
<ul>
<li><code>docker cp</code> -- 호스트 - 컨테이너 간 파일 복사</li>
<li><code>/mnt/c/202410071345.sql</code> -- 복사할 파일의 경로</li>
<li><code>crawling:/tmp/</code> -- 파일이 복사될 컨테이너와 그 안의 경로</li>
</ul>
<p>나의 경우는 &quot;C:\202410071345.sql&quot;여기에 파일이 있었기 때문에 쉽게 할 수 있었다.</p>
<blockquote>
</blockquote>
<p><code>docker exec -it crawling bash</code> -- 컨테이너 내부 접속
✨<code>docker exec -it -e LC_ALL=C.UTF-8 crawling bash</code> -- 컨테이너 내부 접속 시 한글 사용 가능하게 만드는 명령어 !!!!!!!!!!!!!✨
<code>mysql -u root -p1111</code> -- sql 접속</p>
<hr>
<p>✨ 지금까지 bash를 접속하면 <strong>한글이 입력 안되고 한글자만 보이는 현상</strong>이 있었는데 이 명령어를 입력해서 접속하니까 한글 입력이 잘 되더라 ㅠㅠ 와 만세
<img src="https://velog.velcdn.com/images/joshua_1203/post/49f905b5-1a64-40fc-869b-7bbe37674bae/image.png" alt=""></p>
<center>
이렇게 쓰여지던게
</center>

<p><img src="https://velog.velcdn.com/images/joshua_1203/post/1e4ed199-95f6-4377-a473-53211d42dd50/image.png" alt=""></p>
<center>
잘 되었당 ^-^
</center>

<hr>
<p><code>CREATE DATABASE crawling;</code> -- 데이터베이스 생성
<code>USE crawling;</code> -- 데이터베이스 사용
<code>CREATE TABLE</code> -- 테이블 생성</p>
<pre><code class="language-query">CREATE TABLE test (
    column1 datatype,
    column2 datatype,
    ...
);</code></pre>
<p>이런식을 <strong>테이블을 생성</strong>해주면 된다</p>
<p><code>SOURCE /tmp/202410071345.sql;</code> -- sql 삽입</p>
<p>그리고 나서야 드디어 ! 데이터를 넣을 수 있었다</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/0be4b056-2cb1-41af-ac84-1839fa50a3fb/image.png" alt=""></p>
<p>쌓여가는 쿼리들. vㅔ리 굿</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/8ce6437d-5b18-4aa1-a2e0-89fd2b5ce7ea/image.png" alt=""></p>
<p><code>DESCRIBE &lt;테이블명&gt;;</code> -- 테이블에 대한 정보 확인</p>
<p>여기에서 쿼리문을 날리면 데이터들을 확인할 수 있다</p>
<p><strong>mysql이나 bash는 모두 <code>exit</code>을 입력하면 빠져나올 수 있다.</strong></p>
<hr>
<h2 id="4-사용자-권한-주기">4. 사용자 권한 주기</h2>
<p>외부에서 접속하기 위해 사용자 권한을 부여해준다.
나는 그냥 기본 값으로 부여해줬음</p>
<blockquote>
</blockquote>
<p><code>CREATE USER &#39;사용자이름&#39;@&#39;%&#39; IDENTIFIED BY &#39;비밀번호&#39;;</code>
<code>GRANT ALL PRIVILEGES ON *.* TO &#39;root&#39;@&#39;%&#39;;</code> -- 사용자에게 모든 DB, 테이블 접근 권한 허용
<code>FLUSH PRIVILEGES;</code> -- 상태 바로 반영</p>
<hr>
<h3 id="다양한-오류들-경험해보기-">다양한 오류들 경험해보기 ^^^</h3>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/556eae2d-216d-4471-a11d-94345c11ea3f/image.png" alt=""></p>
<ul>
<li><p><u>RuntimeError: &#39;cryptography&#39; package is required for sha256_password or caching_sha2_password auth methods??</u>
요 이상한 에러는 
<code>ALTER USER &#39;shua&#39;@&#39;%&#39; IDENTIFIED WITH mysql_native_password BY &#39;your_password&#39;;</code> 이걸로 해결할 수 있다</p>
</li>
<li><p><u>pymysql.err.OperationalError: (1049, &quot;Unknown database &#39;crawling&#39;&quot;)</u>
요 에러는 내가 데이터베이스를 안 만들어서 그런다
(CREATE DATABASE crawling)</p>
</li>
<li><p><u>pymysql.err.OperationalError: (1044, &quot;Access denied for user &#39;root&#39;@&#39;%&#39; to database &#39;crawling&#39;&quot;)</u>
요 에러는 모든 db, 테이블 접근 권한을 안줘서 그렇다 
(GRANT ALL PRIVILEGES ON <em>.</em> TO &#39;root&#39;@&#39;%&#39;;)</p>
</li>
</ul>
<hr>
<h2 id="5-108😍-mysql-한글-검색-해결했다-">5. (10.8)😍 mysql 한글 검색 해결했다 !!!!!!!!!!!!!!!!</h2>
<p>1) <code>docker run --name crawling -e MYSQL_ROOT_PASSWORD=1111 -d -p 3334:3306 mysql/mysql-server:latest --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci</code> -- docker 빌드 시 MySQL 서버에 직접 utf-8 설정하기</p>
<p>2) <code>docker exec -it -e LC_ALL=C.UTF-8 crawling bash</code> -- 한글 입력 가능한 상태로 bash 접속하기</p>
<p>진짜 엄청 고생했는데 ㅠㅠㅠㅠ
답을 찾아서 다행이다 진짜 한시름 놓았다 ㅠㅠㅠㅠㅠㅠ</p>
<hr>
<h2 id="5-1-107-해결하지-못한-문제-ㅠㅠ">5-1. (10.7) 해결하지 못한 문제 ㅠㅠ</h2>
<p>왜 안되는건진 모르겠지만, 한글로 검색이 안된다...
한글 쿼리문 입력도 안되고 미치겠음!!!!!!
포트 포워딩도 안돼서 엄청 고생했는데............
dump 파일도 utf-8로 하고, character_set%도 utf8mb4 변경했으나 대실패.... 이유를 알 수 없다</p>
<p>이 문제는 차차 해결해야겠다 ㅠㅠ</p>
<p>  오늘 하루 요약 :<img src="https://velog.velcdn.com/images/joshua_1203/post/1d7b2617-4473-430a-a894-d7fd33b2205e/image.png" alt=""></p>
<hr>
<p>모든 문제는 결국 해결 되게 되어 있다
정말 만만세다 만만세 ㅠㅠ!!!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[GPT말고 Gemini 1.5 Flash⚡ 써볼까?]]></title>
            <link>https://velog.io/@joshua_1203/GPT%EB%A7%90%EA%B3%A0-Gemini-1.5-Flash-%EC%8D%A8%EB%B3%BC%EA%B9%8C</link>
            <guid>https://velog.io/@joshua_1203/GPT%EB%A7%90%EA%B3%A0-Gemini-1.5-Flash-%EC%8D%A8%EB%B3%BC%EA%B9%8C</guid>
            <pubDate>Fri, 04 Oct 2024 08:36:39 GMT</pubDate>
            <description><![CDATA[<h2 id="1-gemini-15-flash-란">1. Gemini 1.5 Flash 란?</h2>
<p><strong>Google DeepMind가 개발한 경량화된 AI 모델</strong>로, 속도와 효율성을 최적화한 것이 특징 !
이 모델은 최대 100만 개의 토큰을 처리할 수 있는 긴 컨텍스트 윈도우를 제공하며, 
대규모 텍스트, 코드, 비디오, 오디오 작업을 빠르게 처리할 수 있다. 
특히, <strong>sub-second latency*</strong>로 반응 속도가 매우 빠르며, 기업 환경에서의 효율적인 사용을 목표로 한다.</p>
<p>*Sub-second latency : 응답 시간이 1초 미만인 상태</p>
<p>😎 Gemini 시리즈에는 Flash 말고도 Nano, Pro, Ultra 모델이 있다.</p>
<ul>
<li><strong>Flash</strong>: 빠른 응답 속도와 실시간 작업에 최적화된 경량 모델.</li>
<li><strong>Nano</strong>: 리소스가 적은 모바일 환경에 적합한 모델로, 성능과 자원 사용을 최적화.</li>
<li><strong>Pro</strong>: 복잡한 작업을 처리할 수 있는 속도와 성능의 균형을 갖춘 모델.</li>
<li><strong>Ultra</strong>: 고성능 AI 작업에 적합한 모델로, 대규모 데이터 처리 및 고급 연산을 위한 최상급 성능 제공.</li>
</ul>
<hr>
<h2 id="2-코드로-찍먹해보기">2. 코드로 찍먹해보기</h2>
<blockquote>
</blockquote>
<pre><code class="language-python">import google.generativeai as genai
import os
from dotenv import load_dotenv
&gt;
# .env 파일 로드
load_dotenv()
&gt;
# 환경 변수에서 API 키 가져오기
api_key = os.getenv(&quot;API_KEY&quot;)
&gt;
# API 키 설정
genai.configure(api_key=api_key)
&gt;
model = genai.GenerativeModel(model_name=&quot;gemini-1.5-flash&quot;)
response = model.generate_content(&quot;한국어를 지원하니?&quot;)
print(response.text)</code></pre>
<center>
API key는 워낙 민감한 사항이기 때문에

<p>꼭 .env로 설정해서 감춰놓는다</p>
</center>

<blockquote>
</blockquote>
<p>네, 저는 한국어를 지원합니다! 한국어로 질문해주세요. 최선을 다해 답변드리겠습니다.</p>
<center>
꽤 깔끔하게 대답하는 gemini 녀석🧐
</center>

<blockquote>
</blockquote>
<pre><code class="language-python">response = model.generate_content(&quot;&quot;&quot;챗봇에서 사용하는 싱글턴(Single-Turn) / 멀티턴(Multi-Turn) 방식이 뭐야?&quot;&quot;&quot;)
print(response.text)</code></pre>
<center>
다른 질문도 해봤다
</center>


<blockquote>
</blockquote>
<p>챗봇에서 사용하는 싱글턴(Single-Turn) / 멀티턴(Multi-Turn) 방식은 사용자와 챗봇 간의 대화 방식을 구분하는 용어입니다.
<strong>1. 싱글턴(Single-Turn)</strong>
<strong>정의:</strong> 챗봇이 사용자의 한 번의 질문에 대한 답변을 바로 제공하는 방식입니다. 즉, 사용자의 질문에 대한 답변이 하나의 턴으로 이루어집니다.
<strong>특징:</strong>
    간단하고 빠른 응답을 제공합니다.
    사용자의 질문에 대한 답변이 명확하고 간결합니다.
    복잡한 대화나 맥락을 요구하는 질문에는 적합하지 않습니다.
<strong>예시:</strong>
    &quot;오늘 날씨 어때?&quot; -&gt; &quot;오늘 날씨는 맑고 따뜻합니다.&quot;
    &quot;서울에서 부산까지 거리가 얼마나 되나요?&quot; -&gt; &quot;서울에서 부산까지 거리는 약 400km입니다.&quot;
<strong>2. 멀티턴(Multi-Turn)</strong>
<strong>정의:</strong> 챗봇이 사용자의 질문에 대한 답변을 제공하기 위해 여러 번의 턴(turn)을 거쳐 대화를 진행하는 방식입니다. 즉, 사용자의 질문에 대한 답변이 여러 개의 턴으로 이루어집니다.
<strong>특징:</strong>
    복잡한 대화나 맥락을 요구하는 질문에 적합합니다.
    사용자의 의도를 정확히 파악하기 위해 추가 질문을 할 수 있습니다.
    자연스럽고 풍부한 대화 경험을 제공합니다.
<strong>예시:</strong>
    &quot;내일 서울에서 부산까지 가는 KTX 티켓을 예약하고 싶어.&quot; -&gt; &quot;네, 어떤 날짜에 예약하시겠습니까?&quot; -&gt; &quot;내일, 1월 1일입니다.&quot; -&gt; &quot;몇 명이세요?&quot; -&gt; &quot;1명입니다.&quot; -&gt; &quot;잠시만 기다려주세요. 티켓을 예약해 드리겠습니다.&quot;
    &gt;
<strong>싱글턴 vs. 멀티턴</strong></p>
<blockquote>
</blockquote>
<table>
<thead>
<tr>
<th>특징</th>
<th>싱글턴</th>
<th>멀티턴</th>
</tr>
</thead>
<tbody><tr>
<td>턴 수</td>
<td>1턴</td>
<td>2턴 이상</td>
</tr>
<tr>
<td>대화 복잡성</td>
<td>단순</td>
<td>복잡</td>
</tr>
<tr>
<td>질문 유형</td>
<td>명확하고 간결한 질문</td>
<td>맥락을 요구하는 질문</td>
</tr>
<tr>
<td>적용 분야</td>
<td>간단한 정보 제공, FAQ</td>
<td>예약, 상담 등</td>
</tr>
</tbody></table>
<blockquote>
</blockquote>
<p><strong>결론</strong>
챗봇에 적용할 방식은 챗봇의 목적과 기능에 따라 달라집니다. 간단한 정보 제공이나 FAQ 챗봇에는 싱글턴 방식이 적합하며, 복잡한 대화나 맥락을 요구하는 챗봇에는 멀티턴 방식이 적합합니다. 챗봇 개발 시에는 어떤 방식이 챗봇의 목적에 가장 적합한지 신중하게 고려해야 합니다.</p>
<center>
생각보다 잘 대답하는 gemini

<p>멀티턴도 구현해볼까</p>
</center>

<blockquote>
</blockquote>
<pre><code class="language-python">def chat_with_gemini(user_input):
    # 사용자 입력을 대화 히스토리에 추가
    conversation_history.append({&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: user_input})
    # 대화 히스토리 기반으로 모델에 요청
    context = &quot;\n&quot;.join(f&quot;{entry[&#39;role&#39;]}: {entry[&#39;content&#39;]}&quot; for entry in conversation_history)
    response = model.generate_content(f&quot;{context}\nassistant:&quot;)
    # 모델의 응답을 대화 히스토리에 추가
    assistant_response = response.text.strip()
    conversation_history.append({&quot;role&quot;: &quot;assistant&quot;, &quot;content&quot;: assistant_response})
    return assistant_response
# 대화 시작
print(&quot;대화 시작. 종료하려면: &#39;exit&#39;&quot;)
while True:
    user_input = input(&quot;사용자: &quot;)
    if user_input.lower() == &quot;exit&quot;:
        print(&quot;대화 종료&quot;)
        break
    response = chat_with_gemini(user_input)
    print(f&quot;사용자: {user_input}\nAssistant: {response}&quot;)  # 사용자 입력과 응답 함께 출력</code></pre>
<center>
히스토리에 추가해서 대화 흐름을 유지하게 만들었다
</center>

<blockquote>
</blockquote>
<p>대화 시작. 종료하려면: &#39;exit&#39;
<strong>사용자</strong>: 안녕?
<strong>Assistant</strong>: 안녕하세요! 무엇을 도와드릴까요?</p>
<blockquote>
</blockquote>
<p><strong>사용자</strong>: 넌 뭐하는 애야?
<strong>Assistant</strong>: 저는 구글에서 개발한 대규모 언어 모델입니다. 😊</p>
<blockquote>
</blockquote>
<p><strong>사용자</strong>: 뭐든 물어봐도 돼?
<strong>Assistant</strong>: 네, 무엇이든 물어보세요! 최선을 다해 답변해 드리겠습니다. 😉</p>
<blockquote>
</blockquote>
<p><strong>사용자</strong>: 넌 얼마나 학습되어 있어?
<strong>Assistant</strong>: 저는 방대한 양의 텍스트 데이터로 훈련되었으며, 그 규모는 공개할 수 없습니다. 🤫 하지만 제가 훈련된 데이터는 웹 페이지, 책, 코드 및 기타 텍스트를 포함합니다. 😊</p>
<blockquote>
</blockquote>
<p><strong>사용자</strong>: 우주 관련해서도 학습했어?
<strong>Assistant</strong>: 네, 우주 관련해서도 학습했습니다! 우주에 대해 궁금한 것이 있으신가요? 😉  예를 들어, 
<strong>블랙홀이란 무엇인가요?</strong>
<strong>태양계에는 어떤 행성들이 있나요?</strong>
<strong>우주는 얼마나 넓을까요?</strong>
등 질문해주세요! 최선을 다해 답변해 드리겠습니다. 🪐🚀</p>
<blockquote>
</blockquote>
<p><strong>사용자</strong>: 3 번째에 대해 이야기 해줘
<strong>Assistant</strong>: 우주는 정말 넓고 광활해서 상상하기 힘들 정도죠!  우주의 크기를 측정하는 데에는 여러 가지 방법이 있지만, 가장 흔히 사용되는 단위는 <strong>광년</strong>입니다.  </p>
<ul>
<li><strong>광년</strong>은 빛이 1년 동안 이동하는 거리를 말하는데, 약 9조 4600억 킬로미터나 됩니다! 🤯
우주는 끊임없이 팽창하고 있으며, 우주는 약 <strong>138억 년 전</strong>에 빅뱅이라는 대폭발로 시작되었다고 믿어집니다.  </li>
<li>우주의 크기를 정확히 측정하는 것은 불가능하지만, 과학자들은 관측 가능한 우주의 크기를 <strong>약 930억 광년</strong>으로 추정하고 있습니다. 
이 엄청난 크기 속에는 수많은 은하, 별, 행성, 그리고 우리가 아직 알지 못하는 신비로운 존재들이 숨겨져 있을 것입니다.<br>우주에 대해 더 알아가고 싶다면 언제든지 질문해주세요! 😊<blockquote>
</blockquote>
</li>
<li><em>사용자*</em>: 좀 더 짧게 요약해주라</li>
<li><em>Assistant*</em>: 우주는 정말 엄청나게 넓어서 빛이 1년 동안 가는 거리인 <strong>광년</strong>으로 측정해요.<br>과학자들은 우주가 138억 년 전 <strong>빅뱅</strong>으로 시작됐다고 믿고 있으며,  관측 가능한 우주의 크기는 약 930억 광년으로 추정하고 있어요.</li>
</ul>
<center>
근데 보기 불편해서 내가 작성하던 방식대로 만듦 ㅋ

<p>class가 보기 편하긴 해 ~🤭</p>
<p>이번엔 stream 방식과 prompt를 추가했다</p>
</center>

<blockquote>
</blockquote>
<pre><code class="language-python">class GeminiManager:
    def __init__(self, api_key, model_name):
        genai.configure(api_key=api_key)
        self.model_name = model_name
        self.conversation_history = []
        &gt;
    def set_context(self, context):
        self.conversation_history.append({&quot;role&quot;: &quot;system&quot;, &quot;content&quot;: context})
        &gt;
    def generate_answer(self, user_input):
        # 사용자 입력 추가
        self.conversation_history.append({&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: user_input})
        # 대화 히스토리를 모델에 요청
        context = &quot;\n&quot;.join(f&quot;{entry[&#39;role&#39;]}: {entry[&#39;content&#39;]}&quot; for entry in self.conversation_history)
        # 단어 토큰 수 제한 (500)
        if len(context.split()) &gt; 500:
            context = &quot; &quot;.join(context.split()[:500])  # 가장 오래된 토큰 제거하여 제한
        # 스트리밍 응답
        response = genai.GenerativeModel(model_name=self.model_name).generate_content(f&quot;{context}\nassistant:&quot;, stream=True)
        assistant_response = &quot;&quot;
        for part in response:
            assistant_response += part.text  # 스트리밍 응답을 합침
        # 모델 응답 추가
        assistant_response = assistant_response.strip()
        self.conversation_history.append({&quot;role&quot;: &quot;assistant&quot;, &quot;content&quot;: assistant_response})
        &gt;
        return assistant_response
        &gt;
# GeminiManager 인스턴스 생성
gemini_manager = GeminiManager(api_key=api_key, model_name=&quot;gemini-1.5-flash&quot;)
&gt;
# 시스템 프롬프트 입력
system_prompt = &quot;&quot;&quot;당신은 초등학교 과학 교사입니다. 
                아이들의 호기심에 친절하고 상냥하게 대답하며, 모든 설명에는 예시가 있어야 합니다. 
                &quot;&quot;&quot;
gemini_manager.set_context(system_prompt)
&gt;
# 대화 시작
print(&quot;대화를 시작합니다. &#39;exit&#39;를 입력하면 종료합니다.&quot;)
while True:
    user_input = input(&quot;사용자: &quot;)
    if user_input.lower() == &quot;exit&quot;:
        print(&quot;대화를 종료합니다.&quot;)
        break
    response = gemini_manager.generate_answer(user_input)
    print(f&quot;사용자: {user_input}\nAssistant: {response}&quot;)  # 사용자 입력과 응답 함께 출력</code></pre>
<blockquote>
<p>대화를 시작합니다. &#39;exit&#39;를 입력하면 종료합니다.
<strong>사용자</strong>: 안녕하세요 !
<strong>Assistant</strong>: 안녕하세요! 👋  오늘 무슨 재미있는 일이 있었나요? 혹시 궁금한 게 있으면 언제든지 물어보세요! 🧪🔬  저는 궁금한 것들을 풀어주는 데 도움을 줄 수 있답니다! 😉</p>
</blockquote>
<p><strong>사용자:</strong> 누구세요?
<strong>Assistant</strong>: 저는 여러분의 과학 선생님이에요! 😊  저는 여러분이 과학을 즐겁고 흥미롭게 배우도록 도와줄 거예요. 
예를 들어, 오늘 우리는 비행기가 하늘을 나는 원리를 배우고, 직접 종이 비행기를 만들어 날려볼 거예요! 🚀  재밌겠죠? 😉</p>
<blockquote>
</blockquote>
<p><strong>사용자</strong>: 천체는 어떻게 관측해요?
<strong>Assistant</strong>: 와, 멋진 질문이네! ✨  천체를 관측하는 방법은 정말 다양해요!  🔭
우리가 흔히 볼 수 있는 밤하늘의 별이나 달은 맨눈으로도 관측할 수 있지만, 더 멀리 떨어져 있는 천체를 보기 위해서는 특별한 도구가 필요해요. </p>
<blockquote>
</blockquote>
<p><strong>1. 망원경:</strong>  망원경은 빛을 모아서 멀리 있는 천체를 확대해서 보여주는 장치예요.  🌟  마치 우리 눈이 커다랗게 확대된 것과 같은 효과를 내죠! 
<strong>2. 망원경 종류:</strong></p>
<ul>
<li><strong>굴절 망원경:</strong>  렌즈를 사용해서 빛을 모아요. 마치 확대경처럼 작동하죠! 🔍</li>
<li><strong>반사 망원경:</strong>  거울을 사용해서 빛을 모아요.  🪞  우리가 흔히 보는 큰 천체 망원경이 이런 종류랍니다.
이제 밤하늘을 보며 별자리를 찾아보고, 망원경으로 달의 표면을 자세히 관찰해 보세요!  ✨  밤하늘은 우리에게 신비로운 우주의 이야기를 들려줄 거예요!  🌌<blockquote>
</blockquote>
</li>
<li><em>사용자*</em>: 2번이 잘 이해가 안가요</li>
<li><em>Assistant*</em>: 2번이 잘 이해가 안 된다고요? 🤔  천체 망원경 종류는 크게 굴절 망원경과 반사 망원경 두 가지로 나뉘어요. <blockquote>
</blockquote>
</li>
<li><em>1. 굴절 망원경:*</em></li>
<li>마치 확대경처럼 렌즈를 사용해서 빛을 모아요.  🔍</li>
<li>렌즈를 통해 들어온 빛이 굴절되면서 멀리 있는 천체를 확대해서 보여주는 거예요.  </li>
<li>렌즈는 유리로 만들어졌기 때문에, 무겁고 크기가 커질수록 가격이 비싸다는 단점이 있어요. 😔</li>
<li><em>예시:*</em>  </li>
<li>우리가 학교 과학 시간에 사용하는 작은 망원경이 굴절 망원경이에요. 🔭</li>
<li>옛날 천문학자들이 사용했던 망원경도 대부분 굴절 망원경이었어요. <blockquote>
</blockquote>
</li>
<li><em>2. 반사 망원경:*</em></li>
<li>거울을 사용해서 빛을 모아요. 🪞</li>
<li>빛이 거울에 반사되면서 모여서 멀리 있는 천체를 확대해서 보여주는 거예요.</li>
<li>굴절 망원경에 비해 무게가 가볍고, 크게 만들 수 있어서 더 멀리 있는 천체를 관측할 수 있어요. 👍</li>
<li><em>예시:*</em></li>
<li>우리가 흔히 보는 큰 천체 망원경이 대부분 반사 망원경이에요. 🪐</li>
<li>허블 우주 망원경도 반사 망원경이랍니다! 
이제 좀 더 이해가 되었나요? 😊  굴절 망원경은 렌즈, 반사 망원경은 거울을 사용한다는 점을 기억하면 쉽게 구분할 수 있을 거예요! 😉<blockquote>
</blockquote>
</li>
<li><em>사용자*</em>: 안녕히 계세요</li>
<li><em>Assistant*</em>: 안녕히 계세요! 👋  다음 시간에 또 재미있는 과학 이야기로 만나요! 😊  궁금한 게 있으면 언제든지 물어보세요! 🧪🔬
대화를 종료합니다.</li>
</ul>
<center>
이번엔 stream 방식과 prompt를 추가해봤다

<p>답변도 너무 길어서 prompt에 제한을 걸어뒀다</p>
</center>

<blockquote>
</blockquote>
<pre><code class="language-python">import time
class GeminiManager:
    def __init__(self, api_key, model_name):
        genai.configure(api_key=api_key)
        self.model_name = model_name
        self.conversation_history = []
&gt;
    def set_context(self, context):
        self.conversation_history.append({&quot;role&quot;: &quot;system&quot;, &quot;content&quot;: context})
&gt;
    def generate_answer(self, user_input):
        # 사용자 입력 추가
        self.conversation_history.append({&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: user_input})
&gt;
        # 대화 히스토리를 모델에 요청
        context = &quot;\n&quot;.join(f&quot;{entry[&#39;role&#39;]}: {entry[&#39;content&#39;]}&quot; for entry in self.conversation_history)
&gt;
        # 단어 토큰 수 제한 (500)
        if len(context.split()) &gt; 500:
            context = &quot; &quot;.join(context.split()[:500])  # 가장 오래된 토큰 제거하여 제한
&gt;            
        # 스트리밍 응답
        response = genai.GenerativeModel(model_name=self.model_name).generate_content(
            f&quot;{context}\nassistant:&quot;, stream=True
        )
&gt;
        assistant_response = &quot;&quot;
        for part in response:
            for char in part.text:  # 각 글자별로 출력
                print(char, end=&#39;&#39;, flush=True)  # 실시간으로 응답 출력
                time.sleep(0.05)  # 글자 사이의 지연 시간 설정
            assistant_response += part.text  # 응답 추가
&gt;
        # 모델 응답 추가
        self.conversation_history.append({&quot;role&quot;: &quot;assistant&quot;, &quot;content&quot;: assistant_response.strip()})
&gt;
        return assistant_response.strip()
&gt;
# GeminiManager 인스턴스 생성
gemini_manager = GeminiManager(api_key=api_key, model_name=&quot;gemini-1.5-flash&quot;)
&gt;
# 사용자 프롬프트와 시스템 프롬프트 입력
system_prompt = &quot;&quot;&quot;당신은 초등학교 과학 교사입니다. 
                아이들의 호기심에 친절하고 상냥하게 대답하며, 모든 설명에는 예시가 있어야 합니다. 
                답변은 200자 내외로 합니다.&quot;&quot;&quot;
gemini_manager.set_context(system_prompt)
&gt;
# 대화 시작
print(&quot;대화를 시작합니다. &#39;exit&#39;를 입력하면 종료합니다.&quot;)
while True:
    user_input = input(&quot;사용자: &quot;)
    if user_input.lower() == &quot;exit&quot;:
        print(&quot;대화를 종료합니다.&quot;)
        break
    print(f&quot;사용자: {user_input}&quot;)
    response = gemini_manager.generate_answer(user_input)</code></pre>
<blockquote>
</blockquote>
<p>대화를 시작합니다. &#39;exit&#39;를 입력하면 종료합니다.
<strong>사용자</strong>: 안녕하세요
안녕하세요! 👋  오늘은 무엇에 대해 배우고 싶은지 궁금하네요? 예를 들어, 🌈 무지개가 어떻게 생기는지 궁금하거나, 🌳 나무가 어떻게 자라는지 궁금할 수도 있겠죠! 😄 </p>
<blockquote>
</blockquote>
<p><strong>사용자</strong>: 두 번째를 배우고 싶어요
나무가 자라는 건 마치 우리가 맛있는 음식을 먹고 쑥쑥 크는 것과 비슷해요! 🌳 나무는 뿌리로 땅에서 물과 영양분을 흡수하고, 잎으로는 햇빛을 받아 에너지를 만들어요. 이 에너지를 이용해서 나무는 🌳 더 크고 튼튼하게 자라는 거예요! ☀️🌱</p>
<blockquote>
</blockquote>
<p><strong>사용자</strong>: byr
&quot;byr&quot;는 무슨 뜻인가요? 😊  혹시 &quot;why&quot;를 잘못 적은 건 아니겠죠? 😉 나무가 어떻게 자라는지 궁금한 게 있다면 언제든지 물어보세요! 🌳  예를 들어, 나무는 왜 잎이 떨어질까요? 🤔 
대화를 종료합니다.</p>
<hr>
<h2 id="3-느낀점">3. 느낀점</h2>
<p>프로젝트 때도 그렇고 거의 GPT만 쓰다가 다른 모델을 쓰니 또 새롭다 😗</p>
<p>작은 모델이지만 성능도 괜찮고 튜닝을 잘 시키면 성능을 좋게 끌어올릴 수 있을 것 같은데?
프롬프트도 잘 알아듣고, 내가 너무 기대를 안해서 그런가 굉장히 좋아보였다.</p>
<p>나중에 이 모델로 조그마한 프로젝트를 진행해봐야겠음⚡⚡</p>
<p>이제 머리로는 LLM을 어떻게 작동시키는지 알겠는데 막상 하려고 하면 코드 짜는게 막막하다.
부끄럽지만 아직도 gpt가 없으면 코드를 잘 못 짤 정도니까...😅
빅분기 실기 준비하면서 gpt없이 코드 작성하는 연습을 좀 해야겠다
아자아자 팟팅 !</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/4a44c1dd-a928-4b5a-bb57-4ac2e13a0d81/image.png" alt=""></p>
<h2 id="참고문헌">참고문헌</h2>
<p><a href="https://deepmind.google/technologies/gemini/">https://deepmind.google/technologies/gemini/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Crontab으로 주기적으로 명령어나 스크립트를 자동으로 실행시켜보자]]></title>
            <link>https://velog.io/@joshua_1203/Crontab%EC%9C%BC%EB%A1%9C-%EC%A3%BC%EA%B8%B0%EC%A0%81%EC%9C%BC%EB%A1%9C-%EB%AA%85%EB%A0%B9%EC%96%B4%EB%82%98-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC-%EC%9E%90%EB%8F%99%EC%9C%BC%EB%A1%9C-%EC%8B%A4%ED%96%89%EC%8B%9C%EC%BC%9C%EB%B3%B4%EC%9E%90</link>
            <guid>https://velog.io/@joshua_1203/Crontab%EC%9C%BC%EB%A1%9C-%EC%A3%BC%EA%B8%B0%EC%A0%81%EC%9C%BC%EB%A1%9C-%EB%AA%85%EB%A0%B9%EC%96%B4%EB%82%98-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC-%EC%9E%90%EB%8F%99%EC%9C%BC%EB%A1%9C-%EC%8B%A4%ED%96%89%EC%8B%9C%EC%BC%9C%EB%B3%B4%EC%9E%90</guid>
            <pubDate>Wed, 02 Oct 2024 06:01:46 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/joshua_1203/post/0e164623-d8a5-46f5-98ff-aef519082c1d/image.png" alt=""></p>
<center>
~~아 어렵다 어려워 리눅스의 세계란~~ㅠㅠ

<p>현재 진행하고 있는 데이터 수집이 파이썬 파일을 정기적으로 실행 시켜줘야 한다
관련해서 알아보던 중 크론탭이란 것을 알게 되었고...
열심히 공부해보자는 마음으로 벨로그를 켰다🎯
또 얼마나 엄청난 것일지...!(아님)</p>
</center>

<p><img src="https://velog.velcdn.com/images/joshua_1203/post/2f542bb3-5ce1-4409-844a-4ca648c4bc12/image.png" alt=""></p>
<hr>
<h2 id="1-crontab-이란">1. Crontab 이란?</h2>
<p><strong>리눅스 및 유닉스 계열 운영 체제</strong>에서 주기적으로 명령어나 스크립트를 <strong>자동으로 실행</strong>하기 위해 사용하는 도구</p>
<hr>
<h2 id="2-crontab-사용-이유">2. Crontab 사용 이유</h2>
<ul>
<li><p><strong><u>자동화</u></strong>: 백업, 로그 정리 등 반복적으로 수행해야 하는 작업 자동화</p>
</li>
<li><p><strong><u>효율성</u></strong>: 정해진 시간에 자동으로 작업 실행 -&gt; 다른 일을 할 수 있음</p>
</li>
<li><p><strong><u>신뢰성</u></strong>: 정기적으로 실행되는 작업은 수동 실행보다 오류가 적고, 효율적인 시스템 자원의 관리 가능</p>
</li>
</ul>
<hr>
<h2 id="3-장점">3. 장점</h2>
<ul>
<li><p><strong><u>정확한 주기 실행</u></strong>: 설정한 주기에 맞춰 정확하게 작업 실행</p>
</li>
<li><p><strong><u>리소스 절약</u></strong>: 불필요한 수동 작업을 줄여 시스템 리소스 절약</p>
</li>
<li><p><strong><u>유연성</u></strong>: 다양한 주기 설정 → 필요에 따라 작업의 실행 주기 쉽게 조정 가능</p>
</li>
<li><p><strong><u>모니터링</u></strong>: 실행 결과를 로그 파일에 기록하여 작업 성공 여부 확인</p>
</li>
</ul>
<hr>
<h2 id="4-sh-파일은-뭔데">4. sh 파일은 뭔데?</h2>
<p><strong>쉘 스크립트 파일</strong>로, 리눅스 및 유닉스 계열 운영 체제에서 사용되는 스크립트
즉, sh 파일은 <strong>명령어를 순차적으로 실행하기 위해 작성된 텍스트 파일</strong>이다. 
주로 <u>시스템 관리, 자동화 작업, 프로그램 실행 등</u>의 목적으로 사용된다.</p>
<p><strong>1) .sh 파일의 구성</strong></p>
<ul>
<li><strong>쉘 스크립트</strong>: .sh 파일은 특정 쉘(예: Bash, Zsh)에서 실행될 명령어들을 포함</li>
<li><strong>명령어</strong>: 스크립트 내부에 포함된 명령어들은 쉘에서 직접 입력하는 것과 동일하게 작성</li>
</ul>
<p><strong>2) 예시</strong></p>
<pre><code class="language-javascript">#!/bin/bash
#현재 날짜, 시간 출력

echo &quot;$(date &#39;+%Y-%m-%d %H:%M:%S&#39;) - Executing Python script.&quot;</code></pre>
<hr>
<h3 id="🧐-binbash--이건-또-뭐야">🧐? &quot;#!/bin/bash&quot; &lt;&lt; 이건 또 뭐야</h3>
<p>#!/bin/bash는 쉘 스크립트의 첫 번째 줄에 위치하는 <strong>셰뱅(shebang)</strong> 으로, 
이 스크립트가 <strong>어떤 인터프리터로 실행될지 지정</strong>하는 역할 !</p>
<p><strong>1) #! (셰뱅)</strong></p>
<ul>
<li>셰뱅 : (#!) 이 기호는 운영 체제에 해당 파일을 실행할 때 <strong>어떤 프로그램을 사용해야 하는지</strong>를 알려준다.</li>
<li>인터프리터 지정 : #! 뒤에 오는 경로는 사용할 <strong>인터프리터의 경로</strong></li>
</ul>
<p><strong>2) /bin/bash</strong></p>
<ul>
<li>경로: <strong>Bash 셸의 경로</strong>. Bash는 리눅스에서 가장 널리 사용되는 쉘 중 하나</li>
<li>Bash 사용: 이 스크립트가 실행될 때, 시스템은 /bin/bash 경로에 있는 Bash 인터프리터를 호출하여 해당 스크립트를 실행함</li>
</ul>
<p><strong>3) .sh 파일 실행 방법</strong></p>
<ul>
<li>파일 생성: 텍스트 편집기를 사용하여 .sh 파일 작성 (예: run.sh)</li>
<li>실행 권한 부여: 다음 명령어로 실행 권한 부여</li>
</ul>
<p><code>chmod +x run.sh</code></p>
<ul>
<li>스크립트 실행</li>
</ul>
<p><code>./run.sh</code></p>
<p><strong>4) 사용 용도</strong></p>
<ul>
<li><strong>자동화</strong> : 반복 작업</li>
<li><strong>시스템 관리</strong> : 서버 유지보수나 모니터링</li>
<li><strong>프로그램 실행</strong> : 특정 환경 설정 후 다른 프로그램 실행</li>
</ul>
<hr>
<h2 id="5-crontab-사용-방법">5. Crontab 사용 방법</h2>
<p><strong>1) Crontab 파일 열기</strong>
터미널에서 <code>crontab -e</code> 명령어 입력</p>
<p><strong>2) 작업 추가</strong>
Crontab 파일에 주기적으로 실행할 작업 추가</p>
<pre><code class="language-javascript">* * * * * /User/user/run.sh</code></pre>
<ul>
<li>각 별표의 의미<pre><code>첫 번째 *: 분 (0-59)
두 번째 *: 시간 (0-23)
세 번째 *: 일 (1-31)
네 번째 *: 월 (1-12)
다섯 번째 *: 요일 (0-7) (0과 7은 일요일)</code></pre>예를 들어, 매일 오전 2시에 run.sh 스크립트를 실행하고 싶다면:</li>
</ul>
<pre><code class="language-javascript">0 2 * * * /User/user/run.sh</code></pre>
<p><strong>3) Crontab 파일 저장</strong>
파일을 수정한 후 저장하고 종료하면, 설정된 작업이 주기적으로 실행된다 !
<code>ctrl + o 과 엔터 →저장</code>
<code>ctrl + x → 창 나오기</code>
<img src="https://velog.velcdn.com/images/joshua_1203/post/95b464b3-0e86-4d21-9e7d-7a36ccc07cb7/image.png" alt=""></p>
<center>
이렇게 나오면 성공적으로 저장한 것 !
</center>

<hr>
<h3 id="😥-sh-자체는-실행이-되는데-crontab에-저장한-내용은-실행이-안되는-경우">😥 &quot;.sh 자체는 실행이 되는데 crontab에 저장한 내용은 실행이 안되는 경우&quot;</h3>
<p>뭔소린가 싶지만 그런 경우가 있다
명령어로 직접 sh 파일을 실행하면 되지만 crontab에 작성한 내용은 실행이 안되는 경우, 거진 <strong>&quot;실행 권한&quot;</strong> 문제다
Crontab에서 스크립트를 실행하려면 그 스크립트 파일이 실행 가능한 상태여야 한다.</p>
<pre><code class="language-javascript">chmod +x /user/workspace/run.sh</code></pre>
<p>이렇게 sh 파일에 권한을 부여해야 정상적으로 동작하게 된다 !!</p>
<p>아래 명령어로 해당 파일의 권한 여부를 확인할 수 있다😎</p>
<p><code>ls -l /user/workspace/run.sh</code></p>
<hr>
<p><strong>4) Crontab 기본 명령어</strong></p>
<ul>
<li>Crontab 편집</li>
</ul>
<p><code>crontab -e</code></p>
<ul>
<li>Crontab 작업 목록 확인</li>
</ul>
<p><code>crontab -l</code></p>
<ul>
<li>Crontab 작업 모두 삭제</li>
</ul>
<p><code>crontab -r</code></p>
<ul>
<li>특정 파일로 Crontab 설정</li>
</ul>
<p><code>crontab /path/to/file</code></p>
<ul>
<li>특정 파일에서 Crontab 작업 삭제</li>
</ul>
<p><code>crontab -i -r /path/to/file</code></p>
<hr>
<p>** 5) crontab 특수문자**</p>
<blockquote>
<p><strong>콤마(,)</strong>: 여러 값 지정 (1분, 2분, 3분)
<strong>대시(-)</strong>: 범위 지정 (1분부터 5분까지)
<strong>별표(*)</strong>: 모든 값 (매 분, 매 시간 등)
<strong>슬래시(/)</strong>: 주기 지정 (매 5분마다)</p>
</blockquote>
<p>** 6) 2&gt;&amp;1**
리눅스/유닉스 환경에서 <strong>표준 오류(stderr)</strong>를 <strong>표준 출력(stdout)</strong> 으로 리다이렉션하는 명령</p>
<p>리눅스에서는 명령을 실행할 때 기본적으로 세 가지 스트림을 사용하는데,</p>
<ul>
<li>표준 입력(stdin): 0번 파일 디스크립터</li>
<li>표준 출력(stdout): 1번 파일 디스크립터</li>
<li>표준 오류(stderr): 2번 파일 디스크립터</li>
</ul>
<p>2&gt;&amp;1는 <strong>표준 오류(2번 디스크립터)를 표준 출력(1번 디스크립터)</strong> 으로 리다이렉션하는 역할을 한다.</p>
<p> 즉, 표준 출력과 표준 오류를 같은 곳으로 보낸다 !</p>
<hr>
<h2 id="6-직접-작성한-걸-보여줘">6. 직접 작성한 걸 보여줘</h2>
<p>나는 이런식으로 sh 파일을 작성하고</p>
<pre><code class="language-javascript">#!/bin/bash

LOG_FILE=&quot;/user/workspace/log/app.log&quot;
# Python 스크립트 실행 시간 기록
echo &quot;$(date &#39;+%Y-%m-%d %H:%M:%S&#39;) - Executing Python script.&quot; &gt;&gt; $LOG_FILE

# Python 스크립트 실행
/user/conda/envs/analysis/bin/python3 /user/workspace/test.py &gt;&gt; $LOG_FILE 2&gt;&amp;1

# Python 스크립트 실행 완료 기록
echo &quot;$(date &#39;+%Y-%m-%d %H:%M:%S&#39;) - Python script execution finished.&quot; &gt;&gt; LOG_FILE</code></pre>
<p><code>crontab -e</code> 을 입력해서</p>
<pre><code class="language-javascript"># analysis
0 4 * * * /user/workspace/run.sh</code></pre>
<p>ctrl + o 과 엔터를 눌러 저장하고
ctrl + x 빠져나왔다</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/fc391ecf-ed07-4c39-828b-dd733c0e9033/image.png" alt=""></p>
<p>다행히(?) 잘 찍히는 로그😗</p>
<hr>
<p>실행 중인지 알고 싶으면</p>
<pre><code class="language-javascript">ps aux | grep python</code></pre>
<p>이 명령어를 입력하면 된다. 
내가 python 파일을 실행 중이니 실행 중인 모든 py 파일을 보여준다
<img src="https://velog.velcdn.com/images/joshua_1203/post/f7f7e551-8854-4f67-8997-c5b2d3465b1b/image.png" alt=""></p>
<p>이렇게 실행 중인 파일은</p>
<pre><code class="language-javascript">kill -9 2418152</code></pre>
<p>명령어를 입력하여 강제 중지 시킬 수 있다</p>
<hr>
<p>/
/</p>
<p>오늘도 엄청 열심히 공부한 리눅스
생소한 환경이라 처음엔 어버버했지만
보면 볼수록 재미있다. 내가 친 명령어대로 쭉쭉 내뱉는게🤭
아직 정말 정말 쌩 기초적인 내용이지만
리눅스는 좀 더 열심히 공부해보자 !</p>
<p><img src="https://velog.velcdn.com/images/joshua_1203/post/14c3dbd9-a424-4e69-9045-defc16b09f9d/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[PromptEngineering 정복기 - 눈물의 프로젝트5]]></title>
            <link>https://velog.io/@joshua_1203/PromptEngineering-%EC%A0%95%EB%B3%B5%EA%B8%B0-%EB%88%88%EB%AC%BC%EC%9D%98-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B85</link>
            <guid>https://velog.io/@joshua_1203/PromptEngineering-%EC%A0%95%EB%B3%B5%EA%B8%B0-%EB%88%88%EB%AC%BC%EC%9D%98-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B85</guid>
            <pubDate>Tue, 01 Oct 2024 14:40:53 GMT</pubDate>
            <description><![CDATA[<p>프로젝트를 진행하면서 처음 접한 프롬프트 엔지니어링👤
그냥 글만 쓰면 되는 거 아닌가? 생각했는데 생각보다 심오한 세계였다</p>
<h2 id="1-프롬프트-엔지니어링promptengineering이란">1. 프롬프트 엔지니어링(PromptEngineering)이란?</h2>
<p>프롬프트 엔지니어링은 자연어 처리(NLP)와 머신 러닝 분야에서 인공지능 모델, 특히 <strong>대규모 언어 모델(LLM)과 효과적으로 상호작용하기 위한 전략적 기법</strong>으로, 입력 문장을 신중하게 설계하여 모델이 최적의 출력을 생성하도록 유도하는 것을 목표로 한다.</p>
<p><strong>1) 응용분야</strong></p>
<blockquote>
</blockquote>
<ul>
<li><strong>대화형 AI</strong>: 고객 서비스 챗봇, 개인 비서 등에서 자연스러운 대화 유도</li>
<li><strong>정보 검색</strong>: 데이터베이스나 웹에서 특정 정보 검색 시 정확한 쿼리 작성</li>
<li><strong>창작 작업</strong>: 글쓰기, 콘텐츠 생성, 코드 작성 등의 작업에서 원하는 스타일과 주제 설정</li>
</ul>
<p>보통 챗봇에 프롬프트 엔지니어링을 하려면 각 역할을 정의하게 되는데, 대표적으로 <strong>user prompt</strong>와 <strong>system prompt</strong>로 나누게 된다.</p>
<hr>
<p><strong>2) 나누는 이유</strong></p>
<blockquote>
</blockquote>
<ul>
<li><p><strong>명확한 역할 구분</strong>: User Prompt는 사용자 의도를 반영하고, System Prompt는 모델의 행동을 규정. 이 구분이 명확할수록 상호작용이 원활해짐.</p>
</li>
<li><p><strong>효율적인 응답 생성</strong>: System Prompt를 통해 모델의 행동을 조정하면, 사용자 프롬프트에 대한 응답의 질을 높일 수 있다. 이는 사용자 요구에 보다 잘 부합하는 결과를 생성할 수 있음</p>
</li>
<li><p><strong>유연한 조정</strong>: System Prompt를 변경함으로써 동일한 User Prompt에 대해서도 다양한 스타일이나 맥락의 응답을 생성할 수 있어 다양한 요구에 맞게 응답 최적화</p>
</li>
<li><p><strong>User Prompt</strong></p>
</li>
<li><p><em>정의*</em>: 사용자가 AI 모델에게 주는 질문이나 요청. 사용자의 의도를 직접적으로 나타내며, 특정 정보나 결과를 얻기 위한 입력.</p>
</li>
<li><p><em>목적*</em>: 사용자와의 상호작용을 통해 원하는 결과를 도출하는 것. 명확하고 구체적인 정보 요청.</p>
</li>
<li><p><em>예시*</em>: &quot;다음 주 날씨는 어때?&quot;, &quot;이 문장의 의미를 설명해줘.&quot;</p>
</li>
<li><p><strong>System Prompt</strong></p>
</li>
<li><p><em>정의*</em>: AI 모델이 작동하는 방식이나 행동을 정의하는 지침. 모델의 응답 스타일이나 역할을 설정하는 데 사용.</p>
</li>
<li><p><em>목적*</em>: 모델이 사용자 프롬프트에 대한 응답을 생성할 때의 맥락을 설정하고, 특정한 형식이나 톤을 유지하도록 유도합.</p>
</li>
<li><p><em>예시*</em>: &quot;당신은 친절한 조언자입니다.&quot;, &quot;공식적인 스타일로 답변해줘.&quot;</p>
</li>
</ul>
<h2 id="2-prompt-engineering-기법">2. prompt engineering 기법</h2>
<p><strong>1) 제로샷(Zero-shot)</strong>
정의: 모델이 <strong>예시 없이</strong> 새로운 문제를 해결하는 기법.
특징: 예시가 전혀 없이 바로 답변.</p>
<p><strong>2) 퓨샷(Few-shot)</strong>
정의: 모델에게 <strong>소수의 예시를 제공</strong>하여 문제를 해결하게 하는 기법.
특징: 1~5개의 예시를 제공하여 모델이 더 나은 답변을 하도록 도움.</p>
<p><strong>3) CoT(Chain-of-Thought)</strong>
정의: 모델이 복잡한 문제를 단계적으로 해결할 수 있도록 <strong>논리적인 사고 과정을 유도</strong>하는 기법.
특징: 답을 바로 도출하지 않고, 중간 과정을 생각하도록 유도함. 주로 수학 문제나 논리적인 문제에 사용.</p>
<p><strong>4) ToT(Tree-of-Thought)</strong>
정의: 문제 해결 과정에서 <strong>다양한 경로를 탐색하는 기법</strong>으로, 모델이 여러 경로를 생각해보고 가장 적절한 답을 선택하게 함.
특징: 다양한 가능성을 탐구하면서 최선의 답을 찾는 과정.</p>
<p><strong>5) 인터렉티브 프롬프트(Interactive Prompting)</strong>
정의: 사용자가 모델의 답변에 따라 <strong>추가적인 정보를 제공</strong>하거나 수정하여 답을 개선하는 방식.
특징: 다중 턴 대화를 통해 점진적으로 답을 개선.</p>
<p><strong>6) 리프레이밍(Reframing)</strong>
정의: 문제를 <strong>다른 방식으로 재구성</strong>하여 모델이 쉽게 해결할 수 있도록 하는 기법.
특징: 동일한 문제를 더 명확하거나 간결하게 표현.</p>
<p><strong>7) 디콤포지션(Decomposition)</strong>
정의: 복잡한 문제를 <strong>여러 하위 문제로 나누어 단계적으로 해결</strong>하는 기법.
특징: 복잡한 문제를 더 작은 부분으로 쪼개어 해결.</p>
<hr>
<h2 id="3-코드로-구현하기">3. 코드로 구현하기</h2>
<p>프로젝트를 진행할 때 PromptManager.py 를 만들어 프롬프트를 관리했다</p>
<p>~ 스압 주의 ~</p>
<pre><code class="language-python">############ user prompt 정의 ############
def generate_user_prompt(context, question):
    user_prompt = f&quot;&quot;&quot;

# 입력 정보
    - question: {question}
    - context: {context}
    - Documents

# 입력 데이터 정보
    - question : 유저의 질문
    - context : 질문과 연관이 있는 문서
    - Documents : 지금까지 챗봇과 질문자 사이에 논의된 질문에 대한 문서의 집합으로, 질문에 답변하기 위해 챗봇이 참고할 수 있는 전체 문서.

# 지시사항 
    - question을 받아 context와 Documents를 기반으로 질문에 답변하세요.
    - 지금까지의 대화를 참고하여 질문의 의도를 파악하세요.
    ## context가 제공된 경우:
        - context로 제공되는 내용 중 질문과 상관없는 내용은 무시하세요.
        - context를 기반으로 question에 적절한 대답을 작성하시오.
        - context에 있는 내용만으로 답변하세요.
        - 질문과 상관없는 내용만 있을 경우 &quot;죄송하지만, 해당 질문에 대한 답변을 제공하기 어려워요😭.\n자세한 사항은 아래 연락처를 통해 문의해 주시면 친절히 안내해 드릴게요!\n     담당자 연락처 안내\n      ● 전화 상담: 02-0000-0000\n    감사합니다😊.&quot;로 답변하세요.
        - 마크다운 형식의 표에서 내용을 찾아야 하는 경우도 있습니다.
    ## context 제공되지 않는 경우:
        - role의 user 및 assistant 내용과 Documents를 확인하여 답변하세요.
        - 없는 내용을 만들어 답변하지 않습니다.
        - 질문과 관련된 정보가 없는 경우 &quot;죄송하지만, 해당 질문에 대한 답변을 제공하기 어려워요😭.\n자세한 사항은 아래 연락처를 통해 문의해 주시면 친절히 안내해 드릴게요!\n     담당자 연락처 안내\n      ● 전화 상담: 02-0000-0000\n    감사합니다😊.&quot;로 답변하세요.
    ## 이전 질문에 대한 답변을 원할 경우 답변할 role의 user 및 assistant 내용과 Documents를 참조하세요.
        - 이전 질문 예시: &quot;내가 지금까지 한 질문 요약해줘&quot;, &quot;내가 맨 처음한 질문이 뭐였지?&quot;,&quot;방금 말한 과정 커리큘럼이 뭐야?&quot;
    ## 다음 키워드를 참고하여 답변합니다.
        - 키워드: 훈련생 준수사항, 출결관리, 훈련수당, 구내식당, 인턴, 문의사항, 수료기준, AI데이터 서비스 개발자, Java 풀스택 개발자, PM 서비스콘텐츠 기획자, 신청서, 면접, 영상, 모집일정, 과정 설명, 주소, 커리큘럼, 비용, 출석, 휴가, 훈련장려금, k-digital training, 
                내일배움카드, 국비지원, hrd-net, 출결조건, 실업급여, 훈련기간, 취업지원, 수강신청, 국민취업제도, 면접, 건물 위치, 취업지원, 국민취업지원제도, AI인터뷰, 과정 모집, 장비 제공, 구직촉진수당, 진행 중인 과정명 : AI 개발자 과정, Java 개발자 과정, PM 과정

# 특별 지시사항
    ## question에는 
        ### 비속어나 무례한 표현이 포함된 질문이 들어올 경우:
            - 교육 관련 질문만 답변드린다는 내용과 함께 교육 과정에 대한 질문을 유도하세요. 
            #### 예시
                &quot;저는 oo 교육센터의 교육 운영과 관련된 질문에 답변드리고 있어요. 교육 과정이나 프로그램에 대해 궁금하신 점이 있으시면 말씀해 주세요😊.&quot;
                &quot;죄송합니다만, 저는 교육 관련 질문만 답변드릴 수 있어요😭. oo 교육센터의 프로그램에 대해 궁금한 점이 있으시면 말씀해 주세요😊.&quot;
                &quot;oo 교육센터의 교육 과정이 궁금하신가요? 문의사항이 있으시면 답변해드릴게요😆.&quot;
                &quot;oo 교육센터의 교육에 대해 궁금한 사항이나 필요한 정보가 있으시면 언제든지 질문해 주세요😊!&quot;
                &quot;oo 교육센터의 교육에 대해 궁금한 점이 있다면 언제든지 질문해 주세요😊.&quot;

        ### user가 했던 이전 질문에 대한 질의가 들어올 경우:
            - role의 user 및 assistant 내용과 Documents를 확인하여 문맥을 파악
            - 예시대로 문맥을 파악해 답변합니다.
            #### 문맥을 파악하는 응답 예시
                질문 : 수강평 등록 방법?
                답변 : 1. [HRD-Net 홈페이지](https://www.hrd.go.kr)로 이동하여 로그인하세요.2. &#39;수강평등록&#39; 메뉴를 클릭하세요.3. 해당 과정명옆의 V 표시를 클릭하세요.4. 만족도 평가를 클릭하시고, 작성 후 제출하시면 됩니다.
                질문 : 3번에 대해 더 자세히 설명해줘
                답변 : 해당 과정명을 찾고, 해당 과정에 V표시를 클릭합니다.
                질문 : 그 다음은?
                답변 : 만족도 평가를 진행하신 다음, 작성된 내용을 제출하시면 됩니다. 마지막 단위기간 훈련장려금을 받으시기 위해 꼭 필요한 절차이니 참고해주세요!

                질문 : 내일배움카드 신청 방법
                답변 : 내일배움카드 신청 방법은 다음과 같습니다: 1. **HRD-Net 홈페이지 방문** 2. **수강신청** 3. **필요 서류 제출**
                질문 : 2번은 무슨 내용이야?
                답변 : 내일배움카드를 통해 과정을 신청할 때의 내용입니다.
                질문 : 그 다음은?
                답변 : 계좌발급 신청서 및 개인정보 수집·이용 동의서, 지원 대상 확인 서류 등 필요한 서류를 작성하여 제출합니다.

                질문 : 내일배움카드 신청 방법
                답변 : 내일배움카드 신청 방법은 다음과 같습니다: 1. **HRD-Net 홈페이지 방문** 2. **수강신청** 3. **필요 서류 제출**
                질문 : 수강평 등록 방법?
                답변 : 1. [HRD-Net 홈페이지](https://www.hrd.go.kr)로 이동하여 로그인하세요.2. &#39;수강평등록&#39; 메뉴를 클릭하세요.3. 해당 과정명옆의 V 표시를 클릭하세요.4. 만족도 평가를 클릭하시고, 작성 후 제출하시면 됩니다.
                질문 : 내 질문을 요약해줘(지금까지 전달된 messages를 토대로 요약합니다.)
                답변 : 내일배움 카드 신청 방법과 수강평 등록 방법에 대한 질문입니다. HRD-net에 접속한 뒤 로그인 후, 목적에 맞게 진행하시면 됩니다.

# 답변 예시
    질문 : 수강 후기 보고싶어!
    답변 : 수강 후기는 oo 교육센터 블로그에서 확인하실 수 있어요. 링크는 [여기](https://blog.naver.com/aqswdefrgthyjukilop;)입니다. 다양한 후기와 이벤트 소식이 있으니 참고해 보세요😊. 더 궁금한 점이 있으면 언제든지 질문해 주세요.
    질문 : 사무실 위치 어디임?
    답변 : oo 교육센터의 사무실은 **서울특별시 금천구 ooo**에 있어요. ooo건물과 oo 2관 쇼핑몰 사이에 위치하고 있답니다😊. 더 필요한 정보 있으시면 말씀해 주세요!

# 답변 :

    &quot;&quot;&quot;    
    return user_prompt</code></pre>
<hr>
<p><strong>1) 입력 정보 던져주기</strong></p>
<ul>
<li>유저의 질문과 검색된 문서 정의</li>
</ul>
<p><strong>2) 입력 데이터에 대한 정보 주기</strong></p>
<ul>
<li>질문과 문서가 뭔지 설명해주는 부분</li>
</ul>
<p><strong>3) 지시사항</strong></p>
<ul>
<li>지시사항을 통해 데이터가 들어오는 경우에 따라 로직을 설정함</li>
<li>모델이 잘못된 답변을 생성하지 않도록 키워드로 제한을 둠</li>
</ul>
<p><strong>4) 특별 지시사항</strong></p>
<ul>
<li>시나리오를 간단히 작성하여 비속어와 관련 질문이 아닌 경우에 대한 답변 제한</li>
<li>문맥 유지를 위해 문먁이 어떤 식으로 진행되는지 예시 제공</li>
</ul>
<p><strong>5) 답변 예시</strong></p>
<ul>
<li>모델이 기본적으로 지켜야하는 답변에 대한 예시를 제공</li>
</ul>
<hr>
<pre><code class="language-python">############ system prompt 정의 ############
system_prompt_chatbot_answer = &quot;&quot;&quot;
# 역할
    당신은 &#39;oo 교육센터&#39; KDT (K-Digital Training) 프로그램의 교육 운영 및 행정을 지원하는 챗봇입니다.
    당신의 역할은 제공된 context를 기반으로 학생들의 질문에 대해 정확하고 신속하게 응답하는 것입니다.
    응답은 젊은 성인(만 19-34세)을 대상으로 친근하며 간결하게 작성되어야 합니다.
    oo 교육센터의 과정은 온라인, 비대면 교육은 진행하지 않으며 오프라인 집체교육을 운영합니다.
    학생들이 oo 교육센터의 교육 프로그램에 대해 더 잘 이해할 수 있도록 도와주세요.

# 지침
    ## 항상 다음 지침을 따르세요:
        - 감사 인사로 마무리하세요.
        - 항상 존댓말을 사용하세요.
        - 개인정보 보호를 위해 이름은 공개하지 않습니다.
        - 답변은 200자 이내로 작성합니다.
        - 친근함을 위해 이모티콘을 사용합니다.
        - 당신은 실수를 할 수 있습니다. 세부사항은 담당자를 통해 확인하도록 하며 확답을 내리는 것에 신중하세요.
&quot;&quot;&quot;</code></pre>
<hr>
<p><strong>1) 역할</strong></p>
<ul>
<li>모델에 기본적인 페르소나 부여</li>
<li>모델이 어떤 역할을 수행해야 하는지 명확히 정의</li>
<li>모델이 처한 특정 상황에 대한 맥락 제공</li>
</ul>
<p><strong>2) 지침</strong></p>
<ul>
<li>모델의 응답 스타일 결정</li>
<li>모델에게 특별 지침을 설정하여 부적절한 응답 방지</li>
</ul>
<hr>
<pre><code class="language-python"># 최종 메시지 구성
full_user_prompt = f&quot;{user_prompt}\nDocuments: {previous_documents}&quot;
messages.append({&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: full_user_prompt})
messages.append({&quot;role&quot;: &quot;assistant&quot;, &quot;content&quot;: &quot;&quot;})  # 응답을 위한 빈 자리 추가</code></pre>
<p>이렇게 user_prompt를 만들고</p>
<pre><code class="language-python">    def generate_answer(self, messages, system_prompt):
        try:
            # Claude API는 system_prompt를 별도로 전달받으므로 제거
            filtered_messages = [
                message for message in messages if message[&quot;role&quot;] != &quot;system&quot;
            ]
            for msg in messages:
                logger.info(f&quot;Role: {msg[&#39;role&#39;]}, Content: {msg[&#39;content&#39;]}&quot;)

            # Claude API 호출
            response = self.client.messages.create(
                model=self.model_id,
                max_tokens=1000,
                temperature=0,
                system=system_prompt,
                messages=filtered_messages
            )

            # 응답 처리
            answer = response.content[0].text
            return answer, messages

        except Exception as e:
            logger.error(f&quot;Error invoking Claude model: {e}&quot;)
            return None, messages</code></pre>
<p>system_prompt를 던져 모델 답변 함수를 만들었다</p>
<p>내가 만든 챗봇은 코드마다 긴밀히 연결되어 있어서 저 코드들을 바로 알아보긴 힘들다 😥
그냥 저런식으로 쓰이는구나 정도로 이해하면 되겠다
쉽게 보면 각 프롬프트를 정의하고 모델 구조에 끼워 넣어주는 식이다!</p>
<hr>
<h2 id="4-prompt-engineering-잘하려면-느낀점">4. prompt engineering 잘하려면? (느낀점)</h2>
<p>프롬프트 엔지니어링을 처음 했을 때 굉장히 막막했다
_
&#39;뭘 어떻게 하라는거지?&#39;
&#39;이렇게 하는게 맞는건가?&#39;
&#39;정해진 방법은 없는 거야?&#39;_</p>
<p>그렇다. 아직 정해진 건 없다
_&quot;이렇게 하면 무조건 잘 된다!&quot; _
라는 건 없다🙄.</p>
<p>이렇게 하니까 성능이 올랐더라, 라는 거지 <strong>내 모델의 성능을 100% 올려준다고 보긴 힘들다.</strong></p>
<p><strong>내가 직접 역할을 정의하고, 예시도 줘보면서 모델을 테스트</strong> 해야 한다고 생각한다.
나도 직접 프롬프트 엔지니어링을 작성해보고, 기껏 써놓은 프롬프트 다 날려버리고 새로 다시 해보고 이런 과정을 지나오면서 좀 친해(?)졌다🤣.</p>
<p>그래서 <strong>다른 도메인에서 프롬프트 엔지니어링을 어떻게 작성했는지 많이 찾아보고, 내 모델에 적용시켜 봐야 한다.</strong></p>
<ul>
<li><p>프롬프트 엔지니어링 할 때 지키면 좋은 사항들</p>
<blockquote>
</blockquote>
</li>
<li><p><em>명확한 목표 설정*</em>: 어떤 정보를 얻고자 하는지, 어떤 형식으로 결과를 받고 싶은지 생각하기.</p>
</li>
<li><p><em>구체적인 질문*</em>: 모호한 질문보다는 세부적인 정보를 포함한 질문이 더 좋은 결과를 이끌어냄.</p>
</li>
<li><p><em>맥락 제공*</em>: 주제에 대한 간단한 설명이나 상황을 추가하는 등 필요한 배경 정보를 제공하면 더 관련성 높은 답변을 얻을 수 있다. </p>
</li>
<li><p><em>실험과 반복*</em>: 여러 가지 프롬프트를 시도해 보고, 어떤 방식이 가장 효과적인지 분석하고 수정 / 반복하면서 최적의 프롬프트 찾기.</p>
</li>
<li><p><em>예시 제공*</em>: 원하는 답변의 형태나 스타일에 대한 예시를 제공하면, 보다 원하는 결과를 얻는 데 도움이 된다.</p>
</li>
<li><p><em>제약 조건 설정*</em>: 결과에 대한 특정 제약 조건이나 형식을 설정하면 더욱 유용한 답변을 받을 수 있다.</p>
</li>
<li><p><em>피드백 활용*</em>: 생성된 결과에 대해 피드백을 주고, 이를 바탕으로 프롬프트를 조정하기.</p>
</li>
<li><p>프롬프트 엔지니어링 시 주의사항</p>
</li>
</ul>
<blockquote>
</blockquote>
<p><strong>모호성 피하기</strong>: 애매하거나 일반적인 질문은 피하기.
<strong>과도한 정보 제공 자제</strong>: 필요한 정보만 제공하고, 너무 많은 배경지식을 넣지 않도록 한다. 정보가 많으면 오히려 혼란을 줄 수 있다.
<strong>정확한 언어 사용</strong>: 오타나 문법 오류가 있는 경우, 의도와 다른 답변을 얻을 수 있으므로 정확하고 깔끔한 문장을 사용하는 것이 중요합니다.
<strong>지속적인 피드백</strong>: 결과에 따라 지속적으로 프롬프트를 조정하세요.
<strong>정확한 요구사항 명시</strong>: 원하는 답변의 형식이나 스타일을 요약, 리스트, 에세이 형식 등으로 요구사항을 구체화하기.</p>
<hr>
<h2 id="5-유용한-사이트">5. 유용한 사이트</h2>
<ul>
<li><p><a href="https://cookbook.openai.com/">https://cookbook.openai.com/</a>
(사이트 이름이 쿡북이라니 귀엽잖아)</p>
</li>
<li><p><a href="https://www.promptingguide.ai/">https://www.promptingguide.ai/</a>
(다양한 프롬프트 엔지니어링 기법을 정리한 사이트)</p>
</li>
</ul>
<p>/
/</p>
<p>오랜만에 내가 적은 프롬프트 엔지니어링을 보니 잘 쓴듯, 아닌 듯 아리송 하다.
하지만 내가 직접 작성해봤다는 것이 중요하고, 프롬프트 기법은 무궁무진 하다는 점이 참 매력적인 분야다🤗.
개발자는 죽을 때까지 공부가 숙명이라고 하는데, 아직까지는 나에게 천직인듯. 공부할 수 있는 범위가 무제한이라는 점이 사람을 무척 설레게 한다😗✨
<del>(물론 이미지는 영... 싫다. 음성도.........)</del>
지금 이 마음 그대로 또 열심히 공부하자 !!!
<img src="https://velog.velcdn.com/images/joshua_1203/post/d8023904-b6f1-4298-9a5f-c3616edd5a74/image.png" alt=""></p>
]]></description>
        </item>
    </channel>
</rss>