<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Replicated</title>
    <link>https://lagooneng.tistory.com/</link>
    <description>멀티플레이 게임 개발자</description>
    <language>ko</language>
    <pubDate>Sat, 30 May 2026 01:04:20 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>라구넹</managingEditor>
    <image>
      <title>Replicated</title>
      <url>https://tistory1.daumcdn.net/tistory/5449001/attach/8f2230f04d7b4129bebf05c99702148b</url>
      <link>https://lagooneng.tistory.com</link>
    </image>
    <item>
      <title>MatchMaking Svr #1 : UDP Hole Punching + Relay Fallback</title>
      <link>https://lagooneng.tistory.com/628</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/Lagooneng/MatchMakingSvr&quot;&gt;https://github.com/Lagooneng/MatchMakingSvr&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776696279918&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - Lagooneng/MatchMakingSvr: C++ TURN-like matchmaking svr (UDP Hole-Punching + UDP relay fallback)&quot; data-og-description=&quot;C++ TURN-like matchmaking svr (UDP Hole-Punching + UDP relay fallback) - Lagooneng/MatchMakingSvr&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/Lagooneng/MatchMakingSvr&quot; data-og-url=&quot;https://github.com/Lagooneng/MatchMakingSvr&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/KR2D9/dJMb9hC3nod/aaxKDvNLr34OYlJwGJnhf1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/Lagooneng/MatchMakingSvr&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/Lagooneng/MatchMakingSvr&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/KR2D9/dJMb9hC3nod/aaxKDvNLr34OYlJwGJnhf1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - Lagooneng/MatchMakingSvr: C++ TURN-like matchmaking svr (UDP Hole-Punching + UDP relay fallback)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;C++ TURN-like matchmaking svr (UDP Hole-Punching + UDP relay fallback) - Lagooneng/MatchMakingSvr&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언리얼 엔진 OSS 디버깅 안되는 거 너무 불편해서 그냥 매치메이킹 서버를 만들고자 시도 중이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UDP Hole Punching으로 직접 IP 알아내게 하고 실패 시 릴레이하게 해놨는데..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생각해보니 리슨 서버라 릴레이 하는 건 의미가 없긴 한 문제가 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언리얼을 데디로 싹 뜯어 고치거나 아니면 언리얼 네트워크 계층을 뜯어 고치거나..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아니면 다른 방법이 없나..? rnd를 좀 많이 해봐야겠다&lt;/p&gt;</description>
      <category>Game Svr/MatchMakingSvr</category>
      <author>라구넹</author>
      <guid isPermaLink="true">https://lagooneng.tistory.com/628</guid>
      <comments>https://lagooneng.tistory.com/628#entry628comment</comments>
      <pubDate>Mon, 20 Apr 2026 23:52:53 +0900</pubDate>
    </item>
    <item>
      <title>RAG, MCP</title>
      <link>https://lagooneng.tistory.com/627</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;검색 증강 생성(RAG)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Retrieval-Agumented Generation&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- LLM이 모든 지식이 있는 건 아니고 할로시네이션(환각)이 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 효과적인 방법이 프롬프트 일부에 지식을 제공하는 것, 이 지식은 컨텍스트의 일부로서 입력됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 파인 튜닝보다 훨씬 적은 노력과 비용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 정보의 변동성이 큰 분야에 효과적 대응 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 최신 정보가 중요한 분야나 특정 도메인의 응용 프로그램에서 큰 강점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 86.1613%; height: 209px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 12.9845%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 36.0077%; height: 17px;&quot;&gt;RAG&lt;/td&gt;
&lt;td style=&quot;width: 36.7944%; height: 17px;&quot;&gt;Fine-tuning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 64px;&quot;&gt;
&lt;td style=&quot;width: 12.9845%; height: 64px;&quot;&gt;정의&lt;/td&gt;
&lt;td style=&quot;width: 36.0077%; height: 64px;&quot;&gt;최신의 외부 데이터에서 적절한 문서 검색 및 답변을 생성해 LLM 모델의 정확성과 신뢰성을 향상시키는 방식&lt;/td&gt;
&lt;td style=&quot;width: 36.7944%; height: 64px;&quot;&gt;사전 학습된 모델에 각 개별 기업의 도메인 특화 데이터를 추가 학습시켜 맞춤형 모델로 업데이트 하는 방식&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 64px;&quot;&gt;
&lt;td style=&quot;width: 12.9845%; height: 64px;&quot;&gt;이점&lt;/td&gt;
&lt;td style=&quot;width: 36.0077%; height: 64px;&quot;&gt;외부 데이터에 대한 상시적 접근 가능&lt;br /&gt;데이터의 최신성 유지에 용이&lt;br /&gt;근거가 확실한 데이터를 기반으로 답변 생성&lt;/td&gt;
&lt;td style=&quot;width: 36.7944%; height: 64px;&quot;&gt;양질의 라벨링 데이터만 있다면 높은 품질의 모델 생성 가능&lt;br /&gt;업데이트가 빈번하지 않은 특정 도메인에서 유용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 43px;&quot;&gt;
&lt;td style=&quot;width: 12.9845%; height: 43px;&quot;&gt;도전과제&lt;/td&gt;
&lt;td style=&quot;width: 36.0077%; height: 43px;&quot;&gt;관련 없는 문서를 검색할 가능성이 있어 효율적인 검색 모델을 구축해야 함&lt;/td&gt;
&lt;td style=&quot;width: 36.7944%; height: 43px;&quot;&gt;충분한 데이터가 없거나 양질의 데이터가 아닌 경우 모델의 퀄리티가 낮아질 수 있음&lt;br /&gt;모델의 지식은 마지막 훈련 데이터까지만 한정됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 12.9845%; height: 21px;&quot;&gt;유스케이스&lt;/td&gt;
&lt;td style=&quot;width: 36.0077%; height: 21px;&quot;&gt;새로운 데이터가 자주 업데이트 되는 기업&lt;/td&gt;
&lt;td style=&quot;width: 36.7944%; height: 21px;&quot;&gt;특정 작업용 애플리케이션&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Indexing&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG 시스템 구축의 첫 단계, 프롬프트에게 제공할 지식 데이터베이스를 구축하는 단계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 문서 분할&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대량의 텍스트 데이터를 관리하기 쉬운 작은 단위로 분할&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이렇게 나눈 작은 단위를 청크라 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 임베딩&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 각 청크를 컴퓨터가 이해할 수 있는 형태로 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 자연어 처리 모델로 청크를 벡터로 변환하고, 이후 텍스트 간의 유사성을 계산하는데 활용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 완성된 임베딩 벡터들을 효율적으로 저장하고 검색할 수 있는 벡터 데이터베이스에 보관&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Retrieval&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 프롬프트와 연관성이 있는 지식을 벡터 데이터베이스에서 검색하여 가져오는 과정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 질문 임베딩&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자의 질문(프롬프트)을 벡터로 변환, 문서 청크들과 비교 가능해짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 유사성 비교&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이 질문 벡터와 저장된 문서 청크 벡터 간의 유사성 계산&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 주로 사용되는 방법은 코사인 유사도나 유클리디안 거리 등의 수학적 척도&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;76&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5rJhw/dJMcai2Rnm5/W6BK9m3B1TD2yvWeb1MCKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5rJhw/dJMcai2Rnm5/W6BK9m3B1TD2yvWeb1MCKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5rJhw/dJMcai2Rnm5/W6BK9m3B1TD2yvWeb1MCKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5rJhw%2FdJMcai2Rnm5%2FW6BK9m3B1TD2yvWeb1MCKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;372&quot; height=&quot;76&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;76&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 코사인 유사도: 두 벡터의 내적을 두 벡터 길이의 곱으로 나눈 값&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 관련 문서 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 유사도 점수를 바탕으로 가장 높은 상위 k개의 문서 청크를 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Generation&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색된 문서 청크는 원래의 질문과 결합되어 추가 컨텍스트를 형성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결합된 텍스트와 질문은 모델에 입력되어 최종 답변을 생성하는데 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG의 종류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Naive RAG&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Advanced RAG&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Modular RAG&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* FAISS&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대용량 벡터 검색 라이브러리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 페이스북에서 개발 및 배포한 밀집 벡터의 유사도 측정과 클러스터링에 효율적인 라이브러리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* RAG을 사용하면 LLM의 답변 속도가 현저히 느려질 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성능 최적화를 위해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 문서 길이 제한 및 요약&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 임베딩 성능 개선&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 캐시 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- LLM 로딩 최적화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Vector database&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;llm이 정보를 효율적으로 검색하고 처리할 수 있도록 지원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;속성 유사성으로 결과를 제공하는 의미론적 검색 어플리케이션에서 특히 중요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LangChain의 문서 관리 도구&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Document Loader가 다양한 소스에서 문서를 불러오고 처리하는 과정을 담당&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 주요 목적은 효율적으로 문서 데이터를 수집하고 사용 가능한 형식으로 변환하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벡터 데이터베이스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 벡터 형식의 데이터를 저장, 쿼리하고 분석하는데 특화된 데이터베이스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 벡터 저장, 유사성 측정, 인덱싱, 쿼리 처리, 스케일링&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Pinecone, Chroma, Weviate, Milvus, Faiss, Qdrant..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Chroma는 LLM 앱을 위한 최적화가 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벡터 DB 선택 시 고려 사항&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 확장성: 데이터 증가에 따른 성능 유지 가능 여부&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 검색 성능: 유사도 기반 검색 정확도와 속도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 유연성: 다양한 데이터 형식, 모델과의 연동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용 편의성: API, 문서화, 배포의 난이도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 신뢰성: 오픈소스 커뮤니티 또는 상용 지원 여부&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Chroma&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- RAG 구축 시 많이 사용되는 오픈소스 벡터 데이터베이스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 벡터 임베딩을 다루기 위한 다양한 기능 지원 (문서 및 질의 임베딩, 메타데이터 저장, 검색)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 단순한 사용성, 유사도 순위 제공, 빠른 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MCP (Model Context Protocol)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- llm과 외부 데이터 소스 및 앱 간 안전하고 표준화된 상호작용을 정의하는 개방형 프로토콜&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기존의 API 연동 방식이 모델마다, 도구마다 개별적으로 필요했던 복잡성을 해소하고 llm 기반 애플리케이션 개발과 확장성과 신뢰성을 높이는 것을 목표로 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MCP vs tool calling&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- MCP는 도구의 발견, 연결, 호출, 보안을 위한 표준화된 통신 및 아키텍처&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Tool Calling은 llm이 도구를 사용하도록 만드는 언어&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 98.7213%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.0775%;&quot;&gt;구분&lt;/td&gt;
&lt;td style=&quot;width: 44.5294%;&quot;&gt;Tool Calling&lt;/td&gt;
&lt;td style=&quot;width: 46.5683%;&quot;&gt;MCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.0775%;&quot;&gt;개념적 역할&lt;/td&gt;
&lt;td style=&quot;width: 44.5294%;&quot;&gt;llm의 의도 파악 및 도구 사용 결정 언어&lt;/td&gt;
&lt;td style=&quot;width: 46.5683%;&quot;&gt;llm과 외부 도구, 데이터 간 표준 통신 인프라&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.0775%;&quot;&gt;핵심 기능&lt;/td&gt;
&lt;td style=&quot;width: 44.5294%;&quot;&gt;1. 모델이 호출할 함수의 JSONSchema 이해&lt;br /&gt;2. 사용자 요청에 따라 함수 호출 필요 여부 및 인수 결정&lt;/td&gt;
&lt;td style=&quot;width: 46.5683%;&quot;&gt;1. 외부 도구, 데이터의 발견 및 등록 표준화&lt;br /&gt;2. 보안, 인증, 전송 규격 정의&lt;br /&gt;3. 다양한 llm 간의 도구 재사용성 보장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.0775%;&quot;&gt;구현 방식&lt;/td&gt;
&lt;td style=&quot;width: 44.5294%;&quot;&gt;llm 내부의 추론 과정에서 json 객체를 출력하여 호출 의도를 표현&lt;/td&gt;
&lt;td style=&quot;width: 46.5683%;&quot;&gt;Host - Client - Server 구조를 갖는 외부 프로토콜&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.0775%;&quot;&gt;상호 운용성&lt;/td&gt;
&lt;td style=&quot;width: 44.5294%;&quot;&gt;모델 제공 업체에 의해 정의된 특정 json 스키마에 의존&lt;/td&gt;
&lt;td style=&quot;width: 46.5683%;&quot;&gt;개방형 표준이므로 llm 종류와 무관하게 모든 mcp 규격을 따르는 도구를 사용 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.0775%;&quot;&gt;보안/인증&lt;/td&gt;
&lt;td style=&quot;width: 44.5294%;&quot;&gt;보통 툴 콜링 자체는 보안을 안다루고 실제 호출은 별도의 api 키나 인증 방식으로 처리&lt;/td&gt;
&lt;td style=&quot;width: 46.5683%;&quot;&gt;보안 및 인증 메커니즘을 내제&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MCP의 기본 아키텍처&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호스트 애플리케이션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자가 상호작용하는 최종 인터페이스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자의 요청을 받아서 llm에 전달하고 최종 응답을 사용자에게 보여줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MCP 클라이언트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 호스트 애플리케이션 내부에 통합되어 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- llm과 mcp 서버 간의 통신을 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- llm이 도구를 사용해야 한다고 판단하면 이 클라이언트가 mcp 서버에 요청을 보냄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MCP 서버&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 실제 외부 기능이나 데이터 소스에 연결되는 로직을 포함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 클라이언트로부터 mcp 규격에 맞는 요청을 받아 실제 작업을 수행하고 그 결과를 다시 클라이언트에 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MCP가 가져온 변화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;툴 재사용성 증가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 한 번 MCP 서버로 구현된 도구는 다양한 llm에서 코드 수정없이 재사용될 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안 및 감사 용이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- MCP는 보안, 접근 제어, 감사 기록 등에 대한 명확한 규약을 포함하고 있어 기업 환경에서 llm 에이전트를 안전하게 배포 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에이전트 기능 확장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- llm 에이전트가 RAG을 넘어 복잡한 업무 자동화를 수행할 수 있게 되어 llm의 유틸리티를 극대화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MCP 개발 프레임워크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로토콜 표준을 중심으로 다양한 서버 및 클라이언트 구현체가 존재&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LangChain&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기존의 에이전트 프레임워크로 MCP 서버를 도구처럼 활용할 수 있는 어댑터를 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;smolagent (Hugging Face)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 허깅 페이스의 LocalPythonExecutor와 함께 사용하여 MCP를 AI 어시스턴트와 통합 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GitHub MCP&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 코드 작성 지원을 위해 클로드와 협업하는 코딩 도우미 서버의 한 종류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FastAPI-MCP&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 개발자가 자신만의 MCP 서버를 쉽게 구축할 수 있도록 돕는 라이브러리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cursor MCP Installer&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 개발 편의성을 위해 Cursor IDE에 MCP 서버를 자동으로 추가하는 도구&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>학부/딥러닝</category>
      <author>라구넹</author>
      <guid isPermaLink="true">https://lagooneng.tistory.com/627</guid>
      <comments>https://lagooneng.tistory.com/627#entry627comment</comments>
      <pubDate>Wed, 10 Dec 2025 00:55:18 +0900</pubDate>
    </item>
    <item>
      <title>AI Agent, Context Engineering</title>
      <link>https://lagooneng.tistory.com/626</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;AI 에이전트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자를 대신하여 작업을 수행하는 소프트웨어 시스템 또는 프로그램&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 자율적으로 행동하며 목표를 설정하고 계획을 세우고 작업을 실행하여 결과를 얻을 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 능동형 AI&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 에이전트의 주요 특징&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 자율성 : AI 에이전트는 사람의 개입없이 독립적으로 작업을 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 목표 지향성 : 에이전트는 특정 목표를 설정하고 이를 달성하기 위해 노력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 환경 인식 및 상호 작용 : 주변 환경을 인지하고 데이터를 수집하고 외부 환경과 상호 작용할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 학습 능력 : 에이전트는 학습을 통해 지속적으로 성능을 향상 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 추론 및 의사 결정 : 복잡한 문제 해결 및 의사 결정을 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에이전트의 종류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Zero-shot ReAct&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 작업과 도구 설명을 보고 사용할 도구를 결정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ReAct는 Reasoning + Acting&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Resoning은 생각(Chain-of-Thought, COT), Acting은 외부 도구 실행을 의미&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 가장 기본이 되는 에이전트 유형&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Structured Input ReAct&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 인풋이 여러 개인 도구를 사용할 때 필요한 에이전트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Conversational&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대화 + ReAct로 대화 히스토리 저장을 위한 메모리가 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Self-ask with search&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 인터넷 검색 후 답변하는 에이전트로 검색 도구가 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ReAct document store&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 문서 저장소 + ReAct로 문서 검색 도구가 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에이전트의 작업 절차&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Input : 사용자가 에이전트에 작업 할당&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Thought : 에이전트가 작업을 완수하기 위해 무엇을 할 지 생각&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Action / Action Input : 사용할 도구를 결정하고 도구의 입력(함수의 입력값)을 결정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Observation : 도구의 출력 결과를 관찰&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 관찰 결과 작업을 완료했다는 판단에 도달할 때까지 2~4 반복&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AI Agent 프레임워크&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AI 에이전트 플랫폼은 자율 에이전트를 생성, 배포 및 관리할 수 있는 소프트웨어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 일반적으로 코드가 필요 없는 도구로 일상 업무에서 반복되는 작업을 자동화하는데 도움&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 무언가를 하기 위한 단계별 프로세스를 만들 수 있다면 그것은 자동화될 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI Agent 프레임워크 선택 시 고려 사항&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 다양한 LLM 및 소프트웨어 API와 쉽게 통합할 수 있는가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 운영 비용이 적절한가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AI 에이전트 플랫폼이 사용자의 개입 없이 복잡한 작업을 자동으로 실행할 수 있는가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 처리 속도는 적절한가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 적절한 보안 설정 및 관리가 가능한가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 도움을 줄 수 있는 사용자 커뮤니티가 있는가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주요 프레임워크&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LangChain &amp;amp; LangGraph&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 가장 대표적인 AI 에이전트 개발 프레임워크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- LLM을 활용하여 에이전트를 구축하는데 필요한 다양한 도구와 기능을 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CrewAI&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 파이썬 기반 오픈소스 프레임워크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 여러 AI 에이전트들이 협력하여 문제를 해결하는 분산형 AI 에이전트의 구축을 지원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 팀워크와 협업을 중시하는 AI 시스템에 적합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LlamdaIndex&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AI 에이전트가 데이터베이스나 다양한 외부 데이터소스를 처리하고 검색할 수 있도록 도와주는 프레임워크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 검색 기반 AI 시스템이나 지식 관리 시스템을 구축하는데 유용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AutoGen&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서로 다른 분야를 담당하는 네 가지 전문 에이전트와 이를 조율하는 오케스트레이터로 구성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 다양한 산업에 즉시 적용할 수 있는 모듈을 바탕으로 반복적인 작업을 자동화하거나 대량의 데이터를 처리하는데 유용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agent 개발에 자주 사용되는 LangChain 요소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp; OpenAI의 ChatGPT 등 여러 LLM 제공 업체와 연결하는 인터페이스를 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프롬프트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- LLM에 입력될 프롬프트를 구성하고 관리하는 PromptTemplate과 같은 도구를 포함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이는 모델의 출력을 제어하고 특정 작업에 맞게 지시하는데 중요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;체인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 일련의 구성 요소를 연결하여 복잡한 작업을 자동화하는 구조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- LLMChain, ConversationChain 등이 대표적&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;에이전트&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- LLM을 추론 엔진으로 사용하여 어떤 도구를 사용할지 결정하고 일련의 관찰과 행동을 반복하며 목표를 달성하도록 설계된 고급 구성 요소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;도구&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 언어 모델이 외부 세계와 상호작용하고 특정 작업을 수행할 수 있도록 지원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 검색, DB, 파일 시스템, API, 사용자 정의 도구&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대화 기록이나 이전 상호작용의 컨텍스트를 저장하고 검색하여 모델이 연속된 상호작용에서 일관된 응답을 할 수 있도록 돕는 역할&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서 로더 및 텍스트 분할기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- RAG 파이프라인에서 다양한 형식의 문서를 불러오고 처리하기 쉬운 작은 청크로 분할하는데 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리트리버&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자 쿼리를 기반으로 가장 관련성이 높은 문서를 벡터 저장소 등에서 검색하는 구성 요소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;LangChain Agents&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ReAct 기반 에이전트 개발을 지원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구성요소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Agent : 의사 결정을 담당하는 핵심 컴포넌트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Tools : 에이전트가 사용할 수 있는 기능들의 집합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Toolkits : 관련된 도구들의 그룹&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AgentExecutor : 에이전트의 실행을 관리하는 컴포넌트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* ReAct&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Reasoning and Actng의 약자, 챗봇이 추론과 행동을 체계적으로 결합하여 문제를 해결하고 정보를 제공하는 프레임워크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심 기능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 추론 : 모델이 문제 해결을 위해 필요한 계획을 유도하고 추적하며 업데이트할 수 있도록 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 헹동 : 외부 환경과 상호작용하여 필요한 정보를 수집하고 이를 바탕으로 작업을 수행&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* RAG&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Retrieval-Augumented Generation (검색 증강 생성)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- llm이 답변을 생성할 때 외부 데이터베이스에서 관련 정보를 검색하여 이를 바탕으로 더 정확하고 최신 정보를 제공하게 하는 기술&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- LLM이 학습한 시점 이후의 새로운 정보도 답변에 반영 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 할로시네이션 줄여주고 출처를 제시해서 신뢰도를 높임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- LLM 자체를 재학습 시키는 대신 외부 데이터베이스만 업데이트하면 되므로 비용과 시간을 절약&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 특정 기업의 내부 문서 등 독점적인 정보를 활용하여 전문 분야에 맞는 답변을 제공 가능&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Context Engineering&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;context : llm이 응답을 생성할 때 참고할 수 있는 입력 정보의 범위&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;context 구성 요소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- prompt : 사용자가 입력한 전체 텍스트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- system / instruction : 모델의 역할이나 스타일을 지정하는 초기 지침&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- user / assistant messages : 이전 대화 내용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- rerieved docments(선택적) : RAG 등에서 외부 검색 결과를 추가하여 문맥 확장 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Context window&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- LLM이 한 번에 처리할 수 있는 토큰의 최대 길이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요약&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Context Engineering은 대형 언어 모델의 성능을 극대화하기 위해 정보 환경을 체계적으로 설계하는 것&lt;br /&gt;- 단순히 프롬프트를 최적화하는 Prompt Engineering을 넘어서는 개념&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 작업 수행에 필요한 전체 정보(시스템 지시사항, 대화 히스토리, 검색 문서, 출력 예약 공간 등)를 동적으로 조립 및 최적화하여 보다 정교하고 응답성 높은 AI 시스템을 구축할 수 있게 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 에이전트가 매 단계마다 필요한 정보만을 적절히 선택, 압축, 저장, 격리해서 llm의 컨텍스트 윈도우에 넣는 전략적 시스템 설계 작업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이를 통해 개발 생산성, 복잡한 응용 프로그램의 설계, AI 응용의 실질적인 효율성을 크게 향상 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 60.9303%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.3333%;&quot;&gt;항목&lt;/td&gt;
&lt;td style=&quot;width: 23.3866%;&quot;&gt;Prompt Engineering&lt;/td&gt;
&lt;td style=&quot;width: 29.7503%;&quot;&gt;Context Engineering&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.3333%;&quot;&gt;범위&lt;/td&gt;
&lt;td style=&quot;width: 23.3866%;&quot;&gt;단일 입력, 출력&lt;/td&gt;
&lt;td style=&quot;width: 29.7503%;&quot;&gt;전체 시스템 흐름, 메모리, 도구 통합&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.3333%;&quot;&gt;지속성&lt;/td&gt;
&lt;td style=&quot;width: 23.3866%;&quot;&gt;일회성&lt;/td&gt;
&lt;td style=&quot;width: 29.7503%;&quot;&gt;멀티턴, 세션 또는 장기 메모리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.3333%;&quot;&gt;목표&lt;/td&gt;
&lt;td style=&quot;width: 23.3866%;&quot;&gt;명확한 지시&lt;/td&gt;
&lt;td style=&quot;width: 29.7503%;&quot;&gt;정황 환경 구성, 상태 유지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.3333%;&quot;&gt;기술&lt;/td&gt;
&lt;td style=&quot;width: 23.3866%;&quot;&gt;문장 조정, 예시, few-shot&lt;/td&gt;
&lt;td style=&quot;width: 29.7503%;&quot;&gt;RAG, 스크래치패드, 동적 데이터, 툴 체인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.3333%;&quot;&gt;스케일&lt;/td&gt;
&lt;td style=&quot;width: 23.3866%;&quot;&gt;소규모 테스트&lt;/td&gt;
&lt;td style=&quot;width: 29.7503%;&quot;&gt;실전 시스템, 다양한 유저 및 플로우&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LangChain에서 제공하는 네가지 핵심 전략&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- write : 정보를 외부 스크래치패드나 메모리에 기록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- select : 필요한 정보를 필요할 때 컨텍스트로 불러오기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- compress : 긴 기록은 요약 등으로 축소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- isolate : 서로 다른 주제는 분리 저장 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Write : 컨텍스트를 어디에 남길 것인가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자가 말한 중요한 내용을 에이전트가 직접 기억을 못하니 외부 메모리에 명시적으로 기록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- LangChain애서는 Memory, Dict, Scratchpad, Vector Stroe 등..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Select : 기억을 다 보여줄 필요는 없고 필요한 것만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기록해둔 많은 정보 중 꼭 필요한 정보만 선별해서 LLM에게 전달&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 긴 대화, 많은 기록을 모두 집어넣으면 토큰이 증가하고 답변 정확도가 떨어지고, 관련없는 정보 때문에 핵심을 놓침&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 방법: 조건 필터링, 태그 기반 메모리 조회, Vector Similarity 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Compress : 핵심만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 에이전트가 기억하고 있는 긴 기록이나 복잡한 출력 결과를 핵심 정보만 남겨 요약하거나 정제해서 LLM에게 전달하는 전략&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 긴 기록을 그대로 넣으면 토큰이 초과하거나 llm이 핵심을 못잡거나..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- llm 써서 요약하거나 rule-based 방식으로 요약 또는 추출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Isolate : 서로 다른 주제는 분리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 하나의 사용자와 여러 주제를 동시에 다룰 때 정보가 섞이지 않도록 각 주제별로 따로 나누어 저장하고 사용할 때도 명확히 구분해서 불러오기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- llm 기반 에이전트는 모든 걸 연결하려는 경향이 있어 분리가 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 메모리 구조를 주제별로 나누거나 아예 에이전트를 다르게 설계&lt;/p&gt;</description>
      <category>학부/딥러닝</category>
      <author>라구넹</author>
      <guid isPermaLink="true">https://lagooneng.tistory.com/626</guid>
      <comments>https://lagooneng.tistory.com/626#entry626comment</comments>
      <pubDate>Mon, 8 Dec 2025 02:15:28 +0900</pubDate>
    </item>
    <item>
      <title>LangChain, LangGraph</title>
      <link>https://lagooneng.tistory.com/625</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Ollama&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자가 자신의 컴퓨터에 대규모 언어 모델을 쉽게 설치하고 실행할 수 있도록 돕는 도구&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 인터넷 연결 없이도 로컬 환경에서 AI 모델을 활용할 수 있게 해주며 복잡한 LLM 기능을 더 쉽게 사용할 수 있도록 감싸주는 래퍼 역할&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 허깅페이스에서 모델을 직접 다운로드하여 사용하는 것보다 훨씬 빠른 처리 속도 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Prompt Engineering&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Prompt&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자가 LLM에게 질의 시 제공하는 지침이나 입력의 집합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모델의 응답을 안내하고 문맥을 이해하며, 질문에 답하거나 문장을 완성하거나 대화를 나누는 등 관련성 있고 일관된 언어 기반 출력을 생성하는데 도움을 주는 역할&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 하지만 일반적으로 사용자들이 일반적인 질문을 하게 되면 원하는 결과가 나오지 않는 경우가 많음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- prompt engineering이 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Prompt engineering&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 목표: 사용자의 의도와 원하는 결과를 전달하는 프롬프트를 만들어 모델의 성능, 정확성, 유용성을 극대화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구성 요소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Instructions&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모델에게 무엇을 해야 하는지, 제공된 경우 외부 정보를 어떻게 사용해야 하는지, 쿼리와 어떻게 처리해야 하는지, 출력물을 어떻게 구성해야 하는지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;External Information or context(s)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모델에 대한 추가 지식의 원천. 프롬프트에 수동으로 삽입될 수 있고, 벡터 데이터베이스를 통해 검색된 정보일 수도 있고, 다른 수단을 통해 가져올 수도 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;User input or query&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자가 시스템에 입력한 쿼리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Output indicator&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 생성될 텍스트의 시작을 나타냄. (출력의 유형이나 형식을 지정)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;효율적인 프롬프트의 예&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역할(Role)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목표(Goal)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맥락(Context)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지시사항(Instructions)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제약사항(Constraints)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과설정(Output)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 형식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 길이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 톤 &amp;amp; 매너&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Chain-of-Thought(CoT) Prompting&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 복잡한 작업에서 언어 모델의 성능을 향상시키기 위해 사용되는 기술&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 언어 모델이 답을 찾아가는 과정에서 생각을 말로 표현하거나(think aloud) 단계별 추론 과정(step-by-step reasoning)을 따르도록 유도하는 방식으로 구성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 문제를 제기하는 것 뿐만 아니라 문제를 해결하기 위해 취할 수 있는 일련의 논리적 단계를 포함하여 프롬프트를 구성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Few-shot prompting&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대규모 언어 모델에서 새로운 작업이 수행될 때, &lt;b&gt;몇 개의 예시를 제공&lt;/b&gt;하여 모델이 작업의 맥락과 요구 사항을 이해하도록 하는 기법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모델이 특정 작업을 배우기 위해 대량의 데이터나 사전 훈련 없이도 효과적으로 작동할 수 있게 도움을 줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빠른 학습 : 모델이 새로운 작업에 대해 빠르게 적응해야 할 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적은 데이터 : 많은 예시를 제공할 수 없는 상황에서 유용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일관성 유지 : 모델이 특정 스타일이나 형식을 일관되게 유지해야 할 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;zero-shot prompting : 예시 제공 없이 질의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;one ~ : 하나의 예시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Few ~ : 몇 개의 예시&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;LangChain&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 언어 모델을 활용하여 애플리케이션과 파이프라인을 신속하게 구축할 수 있는 플랫폼&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LangChain 프레임워크의 구성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;랭체인 라이브러리&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 파이썬과 자바스크립트 라이브러리를 포함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 다양한 컴포넌트의 인터페이스와 통합, 이 컴포넌트들을 체인과 에이전트로 결합할 수 있는 기본 런타임, 그리고 체인과 에이전트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;랭체인 템플릿&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 다양한 작업을 위한 쉽게 배포할 수 있는 참조 아키텍처 모음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 개발자들이 특정 작업에 맞춰 빠르게 애플리케이션을 구축할 수 있도록 지원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;랭서브&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 랭체인 체인을 REST API로 배포할 수 있게 하는 라이브러리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 개발자들은 자신의 애플리케이션을 외부 시스템과 쉽게 통합 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;랭스미스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 개발자 플랫폼으로 LLM 프레임워크에서 구축된 체인을 디버깅, 테스트, 평가, 모니터링 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 랭체인과의 원활한 통합을 지원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1765121556819&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from langchain_core.prompts import ChatPromptTemplate
from langchain_ollama import ChatOllama

template = &quot;&quot;&quot;
	당신은 QA(Question-Answering)을 수행하는 Assistant입니다.
	{question}에 대해 설명하세요
	5문장 이내로 으로 답변하세요.
	&quot;&quot;&quot;

prompt = ChatPromptTemplate.from_template(template)

llm_model = ChatOllama(model=&quot;PetrosStav/gemma3-tools:4b&quot;)

rag_chain = prompt | llm_model

def answer_for(question):
	print(&quot;Answer :&quot;)
	for chunk in rag_chain.stream({&quot;question&quot;: question}):
		print(chunk.content, end=&quot;&quot;, flush=True)
	
	print(&quot;\n&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;랭체인 예시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1765121675299&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;template = &quot;&quot;&quot;
	당신은 QA(Question-Answering)을 수행하는 Assistant입니다.
	{month}에 적합한 {event}를 추천해 주세요.
	5문장 이내로 으로 답변하세요.
	&quot;&quot;&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 여러 변수를 전달도 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;chat prompt&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ChatPromptTemplate은 대화형 상황에서 여러 메시지 입력을 기반으로 단일 메시지 응답을 생성하는데 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대화형 모델이나 챗봇 개발에 주로 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 입력은 여러 메시지를 원소로 갖는 리스트로 구성, 각 메시지는 역할(role)과 내용(content)으로 구성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메시지의 유형&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SystemMessage : 시스템의 기능을 설명&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- HumanMessage : 사용자의 질문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AIMessage : AI 모델의 응답을 제공 (대화의 history를 기억시키는 역할)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- FunctionMessage : 특정 함수 호출의 결과&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ToolMessage : 도구 호출의 결과&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대화의 유형&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 싱글턴(single-turn) : 바로 직전의 질문에만 대답&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 멀티턴(multi-turn) : 이전 대화를 계속 기억해 나가면서 대화를 이어나가는 것, 전체 대화의 맥락을 이해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 멀티턴 구현 시 기본적인 답변 기능에 이전 대화 기록 저장 기능 추가 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1765122330180&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from langchain_core.prompts import ChatPromptTemplate
from langchain_ollama import ChatOllama

message = [
	(&quot;system&quot;, &quot;너는 여행관련 전문가야.&quot;), # 역할 부여
	(&quot;system&quot;, &quot;너는 한국어로 대화해.&quot;), # 작업지시
	(&quot;placeholder&quot;, &quot;{chat_history}&quot;), # 대화이력 저장
	(&quot;user&quot;, &quot;{user_input}&quot;), # 사용자 입력
]

chat_prompt = ChatPromptTemplate.from_messages(message)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;placeholder : 원하는 위치에 동적으로 삽입될 메시지를 추가하기 위한 기능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 여기선 이전 대화 히스토리를 저장하는데 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1765122401543&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;llm_model = ChatOllama(model=&quot;PetrosStav/gemma3-tools:4b&quot;)

rag_chain = chat_prompt | llm_model

chat_history = [
	(&quot;ai&quot;, &quot;안녕하세요, 저는 여행 전문가 브라이언 입니다. 반갑습니다.&quot;),
	(&quot;user&quot;, &quot;안녕, 나는 길동이야&quot;),
	(&quot;user&quot;, &quot;나는 여행을 좋아해. 너는 어떤 여행지를 추천해줄 수 있어?&quot;),
	(&quot;ai&quot;, &quot;세계 여러 나라의 여행지를 추천해 줄 수 있습니다. &quot;),
]

def answer_for(user_input):
	chat_history.append(
		(&quot;human&quot;, user_input,)
	)
    
	whole_answer = &quot;&quot;
    
	for chunk in rag_chain.stream({&quot;chat_history&quot;: chat_history, &quot;user_input&quot;: user_input}):
		print(chunk.content, end=&quot;&quot;, flush=True)
		whole_answer += chunk.content
		chat_history.append(
			(&quot;ai&quot;, whole_answer,)
		)
        
		print(&quot;\n&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런식으로 히스토리까지 연결 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;LangGraph&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기존 랭체인의 장점은 유지하면서도 더 복잡하고 상태(State)를 가진 다단계 추론 프로세스(Agentic Workflow)를 명확하게 정의하고 제어하기 위해 등장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 랭체인이 LLM 애플리케이션 개발을 위한 도구 상자 역할을 했다면 LangGraph는 그 도구들을 조합하여 유한 상태 기계 형태의 복잡한 추론 흐름을 구현하는데 초점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;랭체인의 한계와 해결책&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡한 제어 흐름의 구현 어려움&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 유연한 그래프 구조를 통해 조건부 분기, 루프, 순환 구조를 쉽게 정의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상태 관리의 불투명성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 중앙 집중식 상태 객체를 통해 워크플로우 전체의 상태 변화를 명확하게 추적하고 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순환 추론의 비효율성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 에이전트가 도구를 호출하고 결과를 관찰한 후 다시 행동을 결정하는 복잡한 루프 구조를 기본 요소로 지원하여 효율성을 높임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시각화 및 디버깅의 어려움&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 그래프 구조 덕분에 워크플로우의 흐름을 시각적으로 파악하고 디버깅하기 쉬워짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;랭그래프 등장 배경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 결국 워크플로우 간 상태관리를 하며 플로우를 더 쉽게 작성할 수 있도록 하는 프레임워크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 랭체인 에이전트는 Production 용도에는 적합하지 않다는 권고, 랭그래프 사용을 권장함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 71.5116%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.7199%;&quot;&gt;비고&lt;/td&gt;
&lt;td style=&quot;width: 25.711%;&quot;&gt;LangChain&lt;/td&gt;
&lt;td style=&quot;width: 27.0806%;&quot;&gt;LangGraph&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.7199%;&quot;&gt;prompt&lt;/td&gt;
&lt;td style=&quot;width: 25.711%;&quot;&gt;Reasoning 과정 직접 작성&lt;/td&gt;
&lt;td style=&quot;width: 27.0806%;&quot;&gt;단순한 Agent 역할 부여&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.7199%;&quot;&gt;ReAct의 구현&lt;/td&gt;
&lt;td style=&quot;width: 25.711%;&quot;&gt;프롬프트로 정의&lt;br /&gt;+ 랭체인 내부 구현&lt;/td&gt;
&lt;td style=&quot;width: 27.0806%;&quot;&gt;LangGraph로 구현&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.7199%;&quot;&gt;Function Call&lt;/td&gt;
&lt;td style=&quot;width: 25.711%;&quot;&gt;프롬프트를 이용해서 LLM이 툴을 사용하게 유도&lt;/td&gt;
&lt;td style=&quot;width: 27.0806%;&quot;&gt;LLM 학습 당시 구현한 Tool Call API 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.7199%;&quot;&gt;Tool 사용 가능 모델&lt;/td&gt;
&lt;td style=&quot;width: 25.711%;&quot;&gt;모든 모델&lt;/td&gt;
&lt;td style=&quot;width: 27.0806%;&quot;&gt;Tool Call이 가능한 모델&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tool Calling (도구 호출)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 자체적으로 수행할 수 없는 작업을 식별&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 필요한 데이터를 얻거나 작업을 수행하기 위해 외부 도구에 작업을 위임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 도구에서 얻은 결과를 활용하여 사용자에게 응답을 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도구 호출을 사용하는 이유&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- LLM은 실시간 정보에 접근 불가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 외부 도움 없이는 특수 작업을 수행할 수 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 도구 호출을 통해 다른 시스템과 협업하여 한계 극복&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도구 호출 처리 과정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 사용자 입력 : 사용자가 AI가 직접 답을 알지 못하거나 외부 데이터가 필요할 수 있는 질문 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 도구 식별 : 모델은 질문에 답하기 위해 도구를 사용해야 함을 감지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 도구 요청 : 모델은 도구에 대한 요청을 형식화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 도구 실행 : 도구는 요청을 처리하고 결과를 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 응답 구성 : AI는 도구의 응답을 사용자 친화적인 답변으로 통합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LangGraph 정의 단계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- State 정의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 노드 정의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 그래프 정의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 그래프 컴파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 그래프 시각화&lt;/p&gt;</description>
      <category>학부/딥러닝</category>
      <author>라구넹</author>
      <guid isPermaLink="true">https://lagooneng.tistory.com/625</guid>
      <comments>https://lagooneng.tistory.com/625#entry625comment</comments>
      <pubDate>Mon, 8 Dec 2025 01:02:46 +0900</pubDate>
    </item>
    <item>
      <title>Hugging face</title>
      <link>https://lagooneng.tistory.com/624</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Hugging face&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기계학습 모델을 구축, 배포 및 교육하기 위한 도구와 리소스를 개발하는 프랑스계 미국 회사이자 오픈 소스 커뮤니티&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트랜스포머나 데이터셋 같은 AI 프레임워크를 제공하는 세계 최대의 인공지능 플랫폼 중 하나&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다양한 오픈소스 LLM 모델들과 라이브러리를 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델명&lt;/p&gt;
&lt;pre id=&quot;code_1765114111114&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;meta-llama/Llama-3.1-8B-Instruct&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;meta-llama : 모델 개발업체 / 개발자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Llama-3.1-8B-Instruct : 모델명(checkpoint)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.1 : 버전&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8B : 매개변수의 수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Instruct&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 있는 것 : 사용자 명령에 반응하는 특화된 훈련을 통해 명령에 더 정확하게 답하거나 특정 작업을 수행하는데 최적화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 없는 것 : 일반적인 언어 패턴을 학습하여 모든 종류의 텍스트 생성에 적합한 범용 모델&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 일반 노트북이나 데탑은 4B 이하 모델이 현실적&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Instruction Tuning&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모델이 사용자 지시나 명령에 더 잘 반응하도록 훈련하는 과정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모델이 명령어와 그에 따른 응답 쌍으로 이루어진 데이터셋을 학습&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Context In LLM&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모델이 답변을 생성할 때 고려하는 정보&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구성요소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 인풋 텍스트(프롬프트)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대화 기록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 유저 프로필&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 학습된 데이터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 외부 데이터(RAG)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Context(window) Length&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모델이 텍스트를 생성하거나 이해할 때 받을 수 있는 입력 정보의 양&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 입력 토큰의 수로 측정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이 값이 클 수록 유리하나 계산이 지수적으로 증가&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM 모델의 저장 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Safetensor&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 딥러닝 모델의 가중치를 저장하기 위해 설계된 새로운 바이너리 파일 포맷&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 높은 보안성, 빠른 로딩 속도, 메모리 효율성, 프레임워크 독립성 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 구성 요소: JSON 헤더, 바이너리 데이터 블록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GGUF (GPT-Generated Unified Format)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- llama.cpp 프로젝트에서 개발된 포맷&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- llm을 효율적으로 저장하고 CPU 및 GPU에서 실행할 수 있도록 최적화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- safetensors와 마찬가지로 pickle 기반의 보안 취약점을 해결하고 모델 로딩 속도 및 효율성을 개선하는데 중점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Ollama의 모델들은 이 포맷&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ONNX (Open Neural Network)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Meta, Microsoft 주도 개발&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 딥러닝 모델을 표현하기 위한 개방향 표준 포맷&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 다양한 딥러닝 프레임워크에서 학습된 모델을 ONNX 형식으로 변환하여 다른 프레임워크나 런타임에서 추론할 수 있도록 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 프레임워크 독립적이며 추론 성능 최적화에 유리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제공 라이브러리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Transformer&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 허깅페이스 라이브러리 중 가장 핵심적 모듈&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 트랜스포머 기반의 다양한 모델을 파이토치, 텐서플로우로 각각 구현해놓은 모듈이며 각 모델에 맞는 tokenizer도 구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사전 학습된 최첨단 모델들을 쉽게 다운로드하고 훈련시킬 수 있는 API와 도구 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Pipeline을 통한 고수준 추상화 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지원 작업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- NLP : 텍스트 분류, 텍스트 생성, 개체명 인식, 질의응답, 빈칸 채우기, 요약, 번역&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CV : 이미지 분류, 이미지 분할, 객체 탐지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 오디오 : 오디오 분류, 자동 음성 인식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 멀티모달 : 시각 질의응답, 문서 질의응답, 이미지 캡션 달기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Tokenizer&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 텍스트 데이터를 컴퓨터가 처리할 수 있도록 토큰화 작업을 지원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 토큰화 뿐만 아니라 텍스트 정규화, 불용어 제거, 패딩 등 다양한 전처리 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 토큰화 후 숫자 인코딩 수헹&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;datasets&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 자연어처리, 컴퓨터 비전, 오디오 처리 등 다양한 머신러닝 작업에 사용되는 수많은 데이터셋을 쉽게 다룰 수 있도록 도와주는 라이브러리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;diffuser&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 딥러닝 기반의 생성형 AI 모델, 특히 텍스트-이미지 생성과 관련된 작업을 지원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;accelerate&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 딥러닝 모델의 분산 학습과 하드웨어 가속화를 지원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대규모 모델을 효과적으로 학습하기 위해서는 여러 GPU를 사용한 병렬처리가 필수적인데 매우 복잡한 과정이 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이러한 작업을 추상화를 통해 간단한 API로 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pipeline&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- transformers 라이브러리의 가장 기본 객체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모델 사용을 위한 인터페이스 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 전처리 + 후처리 과정을 모델과 연결하여 쉽게 NLP 모델을 사용할 수 있게 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Transformer를 사용하는 가장 간단한 수단&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pipeline으로 가능한 작업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- sentiment-analysis : 감정 분석&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- question-answering : 질의 응답&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- text-generation : 텍스트 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- translation : 번역&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- summarzation : 요약&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- image-classification : 이미지 분류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- object-detection : 객체 탐지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- image-to-text : 이미지에 캡션 달기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- feature-extraction : 특징 추출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- fill-mask : 마스크 채우기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ner : 개체명 인식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- zero-shot-classification : 제로샷 분류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Type of ansert&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 추출적(Extractive) 질의 응답 : 주어진 문맥에서 답변을 추출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 생성적(Abstractive) 질의 응답 : 문맥에서 질문에 올바르게 답하는 답변을 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>학부/딥러닝</category>
      <author>라구넹</author>
      <guid isPermaLink="true">https://lagooneng.tistory.com/624</guid>
      <comments>https://lagooneng.tistory.com/624#entry624comment</comments>
      <pubDate>Sun, 7 Dec 2025 23:42:42 +0900</pubDate>
    </item>
    <item>
      <title>자연어 처리 : Seq2Seq, Attention, Transformer</title>
      <link>https://lagooneng.tistory.com/623</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Seq2Seq&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 번역과 같은 시퀀스 변환 문제를 다루는데 있어 기존 방법론의 비효율성과 한계를 극복하려는 시도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;통계 기반 번역의 한계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 방대한 특징 공학&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 지역적 문맥 의존성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 희소성 문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순환 신경망의 고정길이 입력의 한계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기계 번역처럼 입력 문장의 길이와 출력 문장의 길이가 서로 다른 문제를 효율적으로 다룰 수 있는 일반화된 프레임워크 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Seq2Seq는 인코더와 디코더라는 두 개의 모듈로 구성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 인코더는 입력 문장의 모든 단어들을 순차적으로 입력 받은 뒤에 마지막에 이 모든 단어 정보들을 압축해서 하나의 벡터로 만듦&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt;컨텍스트 벡터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 입력 문장의 정보가 하나의 컨텍스트 벡터로 모두 압축되면 인코더는 컨텍스트 벡터를 디코더로 전송&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 디코더는 컨텍스트 벡터를 받아서 번역된 단어를 한 개씩 순차적으로 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Encoder&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 입력 시퀀스를 읽고 그 시퀀스에 담긴 모든 정보를 압축된 형태의 문맥 벡터로 변환하는 역할&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 입력 문장은 단어 토큰화를 통해 단어 단위로 쪼개지고 단어 토큰 각각은 RNN 셀의 각 시점의 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 인코더 RNN 셀의 마지막 시점의 은닉 상태를 디코더 RNN 셀로 넘겨주는데 이것이 컨텍스트 벡터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Decoder&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 인코더가 생성한 문맥 벡터를 입력받아 이를 기반으로 목표 언어 또는 목표 형식의 새로운 시퀀스를 생성하는 역할&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 초기 입력으로 문장을 시작하는 심볼 &amp;lt;sos&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기본적으로 다음에 올 단어를 예측하고 그 예측한 단어를 다음 시점의 RNN 셀의 입력으로 넣는 행위를 반복&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 문장의 끝을 의미하는 심볼인 &amp;lt;eos&amp;gt;가 다음 단어로 예측될 때까지 반복&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디코더의 훈련&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 디코더에게 인코더가 보낸 컨텍스트 벡터와 실제 정답인 상황을 입력받았을 때, 그 다음에 나와야 하는 정답 상황을 알려주며 훈련&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BART&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 시퀀스-투-시퀀스 모델의 사전 훈련을 위한 denosing autoencoder&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 입력 문장을 망가뜨린 다음 원래 문장을 복구하도록 훈련됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사전 훈련 작업은 원래 문장의 순서를 무작위로 섞고 텍스트의 일부 구간을 단일 마스크 토큰으로 대체하는 새로운 인필링 방식을 포함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 인코더에는 손상된 토큰이 입력되고 디코더에는 원래 토큰이 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BART 활용 분야&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 요약, 기계 번역, 질의 응답, 텍스트 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Attention Mechanism&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Seq2Seq는 RNN에 기반하여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 하나의 고정된 크기의 벡터에 모든 정보를 압축하려고 하다 보니 정보 손실이 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기울기 소실 문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Attention 등장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 디코더에서 출력 단어를 예측하는 매 시점마다 인코더에서 전체 입력 문장을 다시 한 번 참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 단, 예측해야 할 단어와 연관이 있는 입력 단어 부분을 좀 더 집중(attention)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Attention weight(score)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 디코더의 현재 hidden state와 인코더의 모든 hidden states 간의 유사성을 계산&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 내적이나 다른 유사도 척도를 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이렇게 계산된 attention score에 softmax 적용하여 0 ~ 1 사이로 정규화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 정규화된 attention weight와 인코더의 hidden states를 사용하여 가중 평균 계산&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 문맥 벡터 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Transformer&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 어텐션 메커니즘은 LSTM의 고정된 컨텍스트 벡터 문제를 해결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 하지만 복잡하고 무거워짐 =&amp;gt; 트랜스포머의 등장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트랜스포머 모델은 문장 속 단어와 같은 순차 데이터 내의 관계를 추적해 맥락과 의미를 학습하는 신경망&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 어텐션 또는 셀프어텐션, 서로 떨어져 있는 데이터 요소들의 의미가 관계에 따라 미묘하게 달라지는 부분까지 감지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 병렬 프로세싱에 적합하여 모델의 실행 속도 또한 빨라짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어텐션만으로 인코더와 디코더를 구성함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 인코더와 디코더가 N개로 구성됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트랜스포머는 단어 입력을 순차적으로 받는 방식이 아닌 일괄 입력 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 단어의 위치 정보를 알려줘여 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 각 단어의 임베딩 벡터에 위치 정보들을 더하여 모델의 입력으로 사용.. -&amp;gt; 포지셔널 인코딩&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심 메커니즘&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 멀티 헤드 어텐션 : 단어 간의 관계를 여러 개의 헤드로 나누어 병렬적으로 처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 포지셔널 인코딩&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 피드 포워드 네트워크 : 어텐션을 거친 결과를 받아 일반적인 신경망처럼 비선형적인 변환을 가함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트랜스포머의 인코더와 디코더의 각 부분은 태스크에 따라 독립적 사용 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Encoder 모델&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 응용 분야: 문장 분류, 명명된 개체 인식, 질문 답변&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ALBERT, BERT, DistillBERT, ELECTRA, RoBERTa&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Decoder 모델&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 응용 분야: 텍스트 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- GPT, GPT-2, Transformer XL, Gemini&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Encoder-Decoder 모델&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 응용 분야: 번역 또는 요약&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- BART, mBART, Marian, T5&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주요 생성형 AI 모델들은 왜 디코더만 사용하는가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 입력을 모두 하나의 토큰 시퀀스로 보고 이전 토큰만 참고하여 다음 토큰을 확률적으로 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 인코더가 필요 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론- 트랜스포머가 바꾼 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RNN의 순차성을 어텐션의 병렬성으로 완전히 대체하여..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 속도 향상: GPU를 활용한 병렬 처리가 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 장거리 의존성 해결: 문장이 아무리 길어도 모든 단어를 동시에 참고하여 정확한 의미를 파악&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 현대 AI의 기반&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM의 등장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1950~1980 : 규칙 기반의 언어 처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 언어 번역 등의 작업을 엄격한 규칙과 논리적 절차를 따름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1990년대 : 통계적 접근법의 도입&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 언어 패턴을 분석하고 이를 수학적 모델로 표현하려는 시도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2000년대 : 머신러닝과 데이터의 확장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 머신러닝의 발전, 복잡한 언어 모델의 등장, 인터넷 사용의 증가로 훈련 데이터셋 증가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2018년 : 딥러닝과 트랜스포머 등장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- GPT 개발, 구글 BERT 발표&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2020년: GPT-3 출시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2022년: ChatGPT 출시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2023년: 오픈소스 llm, gpt4 출시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM : large language model&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sLLM : smaller large language model&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SLM : small language model&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM과 소프트웨어 개발&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM은 소프트웨어 개발 과정에서 코드 생성, 코드 리뷰, TC 생성 등 자동화 및 지원 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 코드 리뷰에 많은 시간을 할애하는 대규모 프로젝트에서 유용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM은 자연어로 작성된 요구사항을 바탕으로 코드 생성 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 분석에서도 활용, 한 프로그래밍 언어에서 다른 언어로 번역하는데도 사용 가능&lt;/p&gt;</description>
      <category>학부/딥러닝</category>
      <author>라구넹</author>
      <guid isPermaLink="true">https://lagooneng.tistory.com/623</guid>
      <comments>https://lagooneng.tistory.com/623#entry623comment</comments>
      <pubDate>Sun, 7 Dec 2025 19:10:14 +0900</pubDate>
    </item>
    <item>
      <title>자연어 처리 : RNN, LSTM</title>
      <link>https://lagooneng.tistory.com/622</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;RNN (Recurrent Neural Network)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 일반적인 신경망에서는 데이터를 입력하면 연산이 입력층에서 은닉층을 거쳐 출력층까지 차근차근 진행되고 이 과정에서 입력 데이터는 모든 노드를 딱 한 번식 지나가게 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- FFNets는 입력 데이터의 시간 순서를 무시하고 현재 주어진 데이터만 가지고 판단&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 입력 데이터의 시간 순서도 반영하여 학습하는 모델이 RNN&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RNN 기본&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;many-to-one 구조 : 텍스트 분류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;many-to-many 구조 : 개체명 인식, 품사 태깅&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;one-to-many 구조 : 텍스트 생성, 챗봇&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LSTM : RNN의 단점 보완&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Seq2Seq&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 입력된 시퀀스로부터 다른 도메인의 시퀀스를 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 인코더-디코더 구조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 챗봇, 기계 번역, 내용 요약, Speech to Text&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Attention mechanism&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 입력 문장이 길면 번역 품질이 떨어지는 현상에 대한 대안&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Transformer&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 2017년 구글 발표, 기존의 Seq2Seq 구조인 인코더-디코더를 따르면서도 어텐션만으로 구현한 모델 (RNN 안씀)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 오늘날 대부분의 LLM은 Tranformer 기반&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RNN은 이전 은닉층의 결과가 다음같에 다시 같은 은닉층의 결과로 들어가도록 연결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 입력과 출력을 시퀀스 단위로 처리하는 시퀀스 모델&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 입력: 번역하고자 하는 문장 (단어의 시퀀스)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 출력: 번역된 문장 (단어의 시퀀스)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RNN에서 은닉층에서 활성화 함수를 통해 결과를 내보내는 역할을 하는 노드가 셀&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 메모리 셀 또는 RNN 셀 이라고도 표현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 현재 시점 t에서 메모리 셀이 갖고 있는 값은 과거의 메모리 셀들의 값에 영향을 받음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 메모리 셀이 보관하고 있는 값을 은닉 상태(hidden state)라고 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RNN은 입력과 출력의 길이를 다르게 설계 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 일대다 : 텍스트 제네레이션, 이미지 캡션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 다대일 : 텍스트 분류, 감정 분류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 다대다 : 텍스트 번역 챗봇&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RNN의 활용 분야&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 시퀀스 데이터를 다루는데 적합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 배열 또는 시계열 데이터의 형태를 갖는 데이터에서 패턴 인식에 좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기본적인 구조의 RNN을 바닐라 RNN (Keras 는 SimpleRNN 제공)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;keras.layers.SimpleRNN&lt;/p&gt;
&lt;pre id=&quot;code_1765093795461&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;model = keras.Sequential([
	keras.layers.SimpleRNN(units=10, return_sequences=False, input_shape=[4,1]),
	keras.layers.Dense(1)
])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- units : RNN 레이어의 출력 벡터(은닉상태 벡터)의 차원(크기)을 결정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- return_sequences : False는 마지막 타임 스텝의 은닉 상태만, True는 전체 시퀀스의 은닉 상태를 모두 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;input_shape의 정의 형태&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- timesteps(시퀀스 길이) : 하나의 샘플이 가지는 시간 단계의 수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- input_dim : 각 시간 단곈에서의 입력 데이터 벡터의 차원(특징 수)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RNN의 단점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 시간 격차가 크면 기울기 소실되어 정보 전달이 잘 안됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;LSTM(Long Short term Memory Network)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- RNN의 기울기 소실 문제를 해결하기 위해 제안&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- LSTM은 RNN의 특별한 한 종류로, 긴 의존 기간을 필요로 하는 학습을 수행할 능력을 갖음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 반복 모듈의 구조가 다름. 4개의 레이어가 특별한 방식으로 서로 정보를 주고 받도록 설계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이전의 정보 중 필요한 것을 취사선택하고 현재 입력과 결합하여 출력 정보를 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 과거 기억을 보존하되 필요가 없어진 기억을 지워버리는 기능을 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Forget Gate&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이전 단계에서 얻은 정보를 버릴지 말지를 결정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 불필요한 정보의 축적을 방지하고 중요한 정보에 집중할 수 있도록 도움&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Input Gate&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 새로운 정보가 주어졌을 때 이 정보를 셀 상태에 어떻게 업데이트 할 지를 결정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Output Gate&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 현재 셀 상태를 바탕으로 어떤 정보를 출력할지를 결정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cell State&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 일종의 컨베이어 벨트, 과거 정보를 미래로 전달하는 역할&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LSTM의 장단점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 길이가 긴 입력에 대해서도 효과적으로 처리할 수 있도록 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 게이트의 도입으로 계산 복잡도가 증가 -&amp;gt; 모델 학습 시간의 증가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- RNN과 마찬가지로 입력값을 순차적으로 처리하기 때문에 대량의 데이터를 빠르게 처리하는데 한계(병렬처리 불가)&lt;br /&gt;- 길이가 매우 긴 입력에 대해서는 여전히 한계가 있음&lt;/p&gt;</description>
      <category>학부/딥러닝</category>
      <author>라구넹</author>
      <guid isPermaLink="true">https://lagooneng.tistory.com/622</guid>
      <comments>https://lagooneng.tistory.com/622#entry622comment</comments>
      <pubDate>Sun, 7 Dec 2025 18:09:22 +0900</pubDate>
    </item>
    <item>
      <title>자연어 처리 : Word representation</title>
      <link>https://lagooneng.tistory.com/621</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;자연어 : 우리가 일상 생활에서 사용하는 언어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자연어 처리 : 이러한 자연어의 의미를 분석하여 컴퓨터가 처리할 수 있도록 하는 작업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자연어 처리의 어려움&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Ambigurity (교착어) : 형태소, 구문, 의미론적 모호성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Variation (다양성) : 시대에 따라 계속 변화하여 확장성, 다양성, 유연성이 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Sparsity&amp;nbsp; (언어 모델) : 단어의 의미적인 내용을 컴퓨터가 이해하는 수치화된 의미 벡터로 표현하기 어려움&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1950년대 규칙 기반&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1990년대 통계 시반&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2013~ 신경망 기반&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Corpus (코퍼스, 말뭉치)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 체계적으로 수집되고 구성된 텍스트 모음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- NLP 연구를 위해 특정 목적으로 정제한 많은 수의 문장의 집합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 특정 언어, 방언, 주제, 스타일 또는 시대를 대표하는 텍스트들을 포함할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 목적에 따라 문장의 성분 품사를 기입하거나 대응되는 번역문을 쌍(multi lingual corpus)으로 기입하기도 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 자연어 처리 분야에서 말뭉치는 언어 모델을 훈련하고 언어의 통계적 패턴을 분석하며 다양한 컴퓨터 기반 언어 연구에 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Tokenization (토큰화)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 주어진 코퍼스에서 토큰이라 불리는 단위로 나누는 작업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Hello World -&amp;gt; &quot;Hello&quot;, &quot;World&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 한글의 경우 토큰 분리 기준이 쉽지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Word representation&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 자연어를 컴퓨터로 처리하기 위해서는 텍스트를 수치 형태로 표현할 수 있어야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 텍스트를 수치로 변환하는 과정이 word representation (word embedding도 같은 의미)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 단어를 벡터로 표현하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;One hot vector&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 각 문장에서 나타나는 단어들을 모아 binary vector로 표현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- N개의 단어는 N차원 벡터 생성 (sparse representation)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모든 단어의 유사도(cosine similarity)가 동일해지는 단점이 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 단어 수가 많아질 수록 벡터의 차원 증가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 단어를 벡터로 표현할 때 실수를 사용하는 방법도 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Sparse representation&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 강아지 = [0 0 0 0 1 0 0 0... 0]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Dense representation&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 강아지 = [0.2 1.8 1.1 ......]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dense 표현이 더 차원이 적음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Padding&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 자연어 처리를 하다 보면 각 문장은 서로 길이가 다를 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 여러 문장의 길이를 임의로 동일하게 맞춰주는 작업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Word2vec&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 단어 벡터 간 유의미한 유사도를 반영할 수 있도록 단어의 의미를 수치화할 수 있는 방법이 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 중요한 정보만 남기고 적은 차원에서 단어를 표현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대량의 코퍼스를 비지도 학습 방법으로 프리 트레이닝한 모델 (Word2vec, ELMo, BERT, ALBERT 등의 공통점)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;비슷한 문맥에 등장하는 단어는 비슷한 의미를 지닌다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 학습된 단어 벡터에서&lt;b&gt; 단어의 의미가 벡터 공간 상의 거리, 길이, 각도&lt;/b&gt; 등으로 표현됨 (문법, 의존 관계 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분산 표현(distributed representation) 방법 적용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 분포 가설(distributional hypothesis)라는 가정 하에 만들어진 표현 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 비슷한 문맥에서 등장하는 단어들은 비슷한 의미를 가진다는 가정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 분산 표현은 분포 가설을 이용해서 텍스트를 학습하고 단어의 의미를 벡터의 여러 차원에 분산하여 표현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방법에서 각 단어에 대응하는 벡터 값은 훈련 데이터(코퍼스)를 학습한 결과로 만들어짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;훈련 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CBOW(Continuous Bag og Words) : 주변에 있는 단어들을 입력으로 중간에 있는 단어들을 예측&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Skip-Gram : 중간에 있는 단어들을 입력으로 주변 단어들을 예측&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CBOW&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Window size 만큼의 주변 단어로 중심 단어를 예측함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 입력, 출력 모두 원 핫 벡터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 히든 레이어의 수 1개, 활성함수 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 학습이 완료되면 특정 단어에 대한 가중합이 그 단어에 대한 임베딩 벡터가 됨 (임베딩 벡터의 길이 M == 은닉층의 길이)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 분야를 위한 word2vec 모델을 만들 수도 있고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사전에 훈련된 모델을 사용하는 것도 가능&lt;/p&gt;</description>
      <category>학부/딥러닝</category>
      <category>word representaiton</category>
      <category>Word2vec</category>
      <author>라구넹</author>
      <guid isPermaLink="true">https://lagooneng.tistory.com/621</guid>
      <comments>https://lagooneng.tistory.com/621#entry621comment</comments>
      <pubDate>Sun, 7 Dec 2025 16:31:06 +0900</pubDate>
    </item>
    <item>
      <title>전이 학습 (Transfer Learning)</title>
      <link>https://lagooneng.tistory.com/620</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;전이학습&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기계학습에서 한 문제를 해결하면서 얻은 지식을 저장해두었다가, 관련있는 문제를 해결할 때 활용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ImageNet 문제를 해결할 때 사용한 DNN 모델을 다른 이미지 분류 문제를 다른 이미지 분류 문제에 활용하는 것이 예&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재사용되는 요소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 신경망 구조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 학습된 가중치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DenseNet121&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1765044991373&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
from keras.applications import DenseNet121
from keras.applications.densenet import preprocess_input
from keras.applications.densenet import decode_predictions

model = DenseNet121(weights='imagenet')

image = load_img('경로.jpg', target_size=(224, 224))
image = img_to_array(image)
image = image.reshape((1, image.shape[0], image.shape[1], image.shape[2]))

image = preprocess_input(image)
pred = model.predict(image)

label = decode_predictions(pred)
label = label[0][0]
print('%s (%.2f%%)' % (label[1], label[2]*100))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지 보고 뭔지 분류하는 코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1765045348033&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from tensorflow.keras.models import Model
import matplotlib.pyplot as plt

this_layer = model.layers[2]
tmp_model = Model(inputs=model.input, outputs=this_layer.output)
feature_map =tmp_model.predict(image, verbose=0)

print('Layer Name: ', this_layer.name)
print('feature map shape: ', feature_map.shape)

plt.imshow(feature_map[0, :, :, 0], cmap='gray')
plt.show()
plt.imshow(feature_map[0, :, :, 1], cmap='gray')
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 컨볼루션 레이어 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CIFAR-10 Classification&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작은 컬러 이미지로 구성된 이미지 분류용 벤치마크 데이터셋&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목표&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ImageNet의 데이터셋으로 구축된 MobileNetV3 모델에 대해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cifar 데이터셋으로 전이 학습하기.. MobilNetV3 모델의 아키텍처 변형&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1765045549019&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from keras import optimizers
from keras.datasets import cifar10
from keras.models import Sequential
from keras.layers import Dropout, Flatten, Dense
from tensorflow.python.keras.utils import np_utils
from keras.applications import MobileNetV3Small
import keras.backend as K
K.clear_session()

img_width, img_height = 32, 32
base_model = MobileNetV3Small(weights='imagenet',
include_top=False,
input_shape= (img_width, img_height, 3))

base_model.trainable = False # fix original weights
base_model.summary()

nb_epoch = 50 
nb_classes = 10&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;준비 단계 코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;weights='imagenet' -&amp;gt; imageNet으로 학습된 가중치 가져옴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;include_top=False -&amp;gt; MobileNetV2의 마지막 Fully Connected Layer 제거&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;base_model.trainable = False -&amp;gt; 사전 학습된 가중치 고정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1765045680172&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(X_train, y_train), (X_test, y_test) = cifar10.load_data()
y_train = np_utils.to_categorical(y_train, nb_classes)
y_test = np_utils.to_categorical(y_test, nb_classes)

model = Sequential()
model.add(base_model)
model.add(Flatten())
model.add(Dense(1024,activation=('relu')))
model.add(Dense(512,activation=('relu')))
model.add(Dense(256,activation=('relu')))
model.add(Dense(128,activation=('relu')))
model.add(Dense(10,activation=('softmax')))

model.summary()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;준비해놨던 모델에 덧붙이기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1765045719182&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;model.compile(loss='binary_crossentropy',
	optimizer=optimizers.SGD(learning_rate=1e-2),
	metrics=['accuracy'])
model.fit(X_train, y_train,
	validation_data=(X_test, y_test),
	epochs=nb_epoch,
	batch_size=200,
	verbose=1)

scores = model.evaluate(X_test, y_test, verbose=0)
print(&quot;loss: %.2f&quot; % scores[0])
print(&quot;acc: %.2f&quot; % scores[1])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학습&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 전이 학습에서 base model의 파라미터 값들을 갱신할지 말지를 정할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;base_model.trainable = False&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 베이스 모델의 파라미터 값들은 고정하고 사용자가 추가한 레이어들의 파라미터에 대해서만 갱신이 일어나도록 함(오류 역전파시)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 학습이 빠르게 진행될 수 있으나 모델의 성능이 저하될 가능성이 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Keras Regression&lt;/p&gt;
&lt;pre id=&quot;code_1765047619225&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split
from keras.datasets import boston_housing

(X_train, y_train), (X_test, y_test) = boston_housing.load_data()
model = Sequential()
model.add(Dense(16, input_dim=13, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1)) # output

model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(X_train, y_train, epochs=200, batch_size=10)

Y_prediction = model.predict(X_test).flatten()
for i in range(10):
	real_price = y_test[i]
	predicted_price = Y_prediction[i]
	print('Real Price: {:.3f}, Predicted Price: {:.3f}'.format(real_price,
			predicted_price))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보스턴 집값&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터 비전에서 딥러닝 활용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 이미지 분류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 지역화된 이미지 분류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 물체 감지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 물체 세그멘트화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 스타일 변화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 이미지 색칠&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 이미지 복원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. 해상도 올리기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. 이미지 합성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>학부/딥러닝</category>
      <author>라구넹</author>
      <guid isPermaLink="true">https://lagooneng.tistory.com/620</guid>
      <comments>https://lagooneng.tistory.com/620#entry620comment</comments>
      <pubDate>Sun, 7 Dec 2025 04:01:56 +0900</pubDate>
    </item>
    <item>
      <title>코드 최적화 : 최적화 기법</title>
      <link>https://lagooneng.tistory.com/619</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;핍홀 최적화 기법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 일반적으로 목적 코드가 생성된 다음 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 몇 개의 연속적인 명령어를 하나의 명령어나 더 짧은 명령어로 변환하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 연속적인 몇 개 명령어의 집합을 핍홀(peephole)또는 창(window)라고 부름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 중복 명령어 제거, 도달 불가능한 코드 제거, 제어 흐름 최적화, 대수학적 간소화, 세기 감축, 하드웨어 명령어 사용 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;중복 명령어 제거&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 중복되는 LOAD나 STORE 명령문 제거&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 33.4884%; height: 35px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 35px;&quot;&gt;LOAD R1, x&lt;br /&gt;STORE x, R1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 스토어는 제거 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어차피 x의 값이 R1에 적재되어 있기 때문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 33.2558%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;x = y;&lt;br /&gt;z = x + 10;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;을 목적 코드로 변환하고 중복된 명령어가 있는지 찾기&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 33.0233%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;LOAD R1, y&lt;br /&gt;STORE x, R1&lt;br /&gt;LOAD R1, x&lt;br /&gt;ADD R1, 10&lt;br /&gt;STORE z, R1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째 로드는 불필요함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;도달 불가능한 코드 제거&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;불필요한 코드는 도달 불가능한 코드와 죽은 코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 죽은 코드는 지역 최적화 기법에서 설명&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 도달 불가능한 코드는 무조건 분기 바로 다음 문장에 있는 라벨이 없는 명령어 같은 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1765009094455&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    if A = B then goto L3
    A = 2
    goto L5
L3: if A = B then goto L5
    A = 3
L5:&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 A = 3은 도달 불가능한 코드이므로 제거 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제어 흐름 최적화&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중간 코드 생성은 분기에 대한 분기, 조건 분기에 대한 분기, 분기에 대한 조건 분기를 생성하는데 이러한 불필요한 분기들 제거 가능&lt;/p&gt;
&lt;pre id=&quot;code_1765009225824&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    goto L5
L5: goto L1

변경 후

    goto L1
L5: goto L1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;대수학적 간소화&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수학적인 대수 법칙을 이용하여 식을 간소화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x = y + 0 =&amp;gt; x = y&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;x = 0 + y&lt;span&gt; =&amp;gt; x = y&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;x = y - 0&lt;span&gt;&amp;nbsp; =&amp;gt; x = y&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;x = y * 1 =&amp;gt; x = y&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;x + y =&amp;gt; y + x&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;교환 법칙을 만족하는 연산자를 필요로 할 때마다 적용하여 식을 간소화 가능&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;- a = 3 * b / 3는 *가 교환 법칙을 만족.. a = b * 3 / 3이니 a = b * 1, 다시 a = b&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;세기 감축&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;- 수행 비용이 높은 연산자를 수행 비용이 낮은 연산자로 대체하는 것&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;- 거듭 제곱은 곱셉, 곱셈은 덧셈, 나눗셈은 곱셈..&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;세기 감축하기 (^을 거듭 제곱이라 가정)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 36.9767%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;y = x ^ 2 =&amp;gt; y = x * x&lt;br /&gt;y = x * 2 =&amp;gt; y = x + x&lt;br /&gt;y = x / 5 =&amp;gt; x * 0.2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하드웨어 명령어 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 특정 연산을 효율적으로 구현하기 위한 하드웨어 명령어 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 어떤 기계는 자동 증가와 자동 감소 모드는 피연산자로부터 값을 사용하기 전이나 후에 피연산자에 1을 증가시키거나 감소시킬 때 사용.. 하드웨어로 구현하기에 매우 큰 비용 절감&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 매개변수 전달에서 자료를 스택에 삽입하거나 삭제할 때도 명령어를 사용하여 품질을 향상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;지역 최적화 기법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부분적인 관점에서 비효율적인 코드를 구분해내고 좀 더 효율적인 코드로 개선하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기본 블록 안에서 최적화가 이뤄짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 공통 부분식 제거, 복사 전파, 죽은 코드 제거, 상수 폴딩, 대수학적 간소화 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공통 부분식 제거&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램에서 공통된 부분이 여러번 나타나는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 공통 부분식이 한 번만 계산되도록 함으로써 코드를 효율적으로 만들 수 있는데 이러한 방법이 공통 부분식 제거&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1765009831288&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;A = B + C + D;
E = B + C + F;
K = (B + C) * G;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B + C는 3개의 치환문에 공통&lt;/p&gt;
&lt;pre id=&quot;code_1765009868843&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;T1 = B + C;
A = T1 + D;
E = T1 + F;
K = T1 * G;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;복사 전파&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;f = g 형태를 치환문이라 하는데, 이후 가능하면 f 대신 g를 사용하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 안쓰이면 치환문을 삭제 (죽은 코드 제거로)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1765009938277&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;x = t3;
a[t2] = t5;
a[t4] = x;
goto B2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를&lt;/p&gt;
&lt;pre id=&quot;code_1765010032895&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;x = t3;
a[t2] = t5;
a[t4] = t3;
goto B2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;죽은 코드 제거&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 변수가 특정 프로그램 지정 이후 전혀 사용하지 않는 값을 계산하는 문장&lt;/p&gt;
&lt;pre id=&quot;code_1765010088923&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a[t2] = t5;
a[t4] = t3;
goto B2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 예시가 이렇게 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상수 폴딩&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴파일을 할 때 상수를 포함하는 연산이 계산될 수 있으면 미리 계산해서 코드 줄이는 거&lt;/p&gt;
&lt;pre id=&quot;code_1765010154357&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;X = 3.14
Y = 2 * X&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 Y = 6.28로 변환됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대수학적 간소화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 핍홀 최적화에서 설명됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;루프 최적화 기법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 코드의 10%가 실행 시간의 90%를 차지하는 게 루프, 최적화에서 매우 중요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- while, do-while, for 등..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 코드 이동, 세기 감축, 귀납 변수 최적화, 루프 교환, 루프 전개&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;코드 이동&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 식의 값이 루프 수행 횟수와 상관없이 항상 같은 값(루프 불변)이라면 루프 수행 전에 미리 계산할 수 있도록 루프 내부로 들어가기 전의 루프 외부로 이동하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1765010351057&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for(k = 1; k &amp;lt;= 1000; k++)
    c[k] = 2 * (p - q) * (n - k + 1) / (sqrt(n) + n);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를&lt;/p&gt;
&lt;pre id=&quot;code_1765010400278&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fact = 2 * (p - q);
denom = sqrt(n) + n;
for(k = 1; k &amp;lt;= 1000; k++)
    c[k] = fact * (n - k + 1) / denom;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세기 감축&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 핍홀 최적화에서 설명됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;귀납 변수 최적화&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루프를 돌 때마다 값이 일률적으로 변하는 변수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 세기 감축으로 최적화 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이러한 변수로는 반복문 제어 변수 및 반복문 제어 변수에 특정 형태로 의존하는 다른 변수들&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 선정된 귀납 변수는 레지스터에 할당되어 보다 간단히 계산 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 코드를 변경하는 데는 코드 이동도 포함될 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1765010560549&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;L1: j = j - 1
    t4 = 4 * j
    t5 = a[t4]
    if t5 &amp;gt; v goto L1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;귀납 변수는 1씩 감소하는 t와 4씩 감소하는 t4&lt;/p&gt;
&lt;pre id=&quot;code_1765010617138&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;L1: j = j - 1
    t4 = t4 - 4
    t5 = a[t4]
    if t5 &amp;gt; v goto L1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 세기 감축 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;루프 융합&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루프의 오버헤드를 줄이기 위한 방법, 루프의 범위가 같은 경우 하나의 루프로 만드는 것&lt;/p&gt;
&lt;pre id=&quot;code_1765010727655&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for(j = 1; j &amp;lt;= 100; j++)
    a[j] = b[j] + c[j];
for(j = 1; j &amp;lt;= 100; j++)
    b[j] = 5 + c[j];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸&lt;/p&gt;
&lt;pre id=&quot;code_1765010749837&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for(j = 1; j &amp;lt;= 100; j++)
    a[j] = b[j] + c[j];
    b[j] = 5 + c[j];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 묶을 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;루프 교환&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부 루프와 외부 루프를 교환하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 참조 지역성을 개선&lt;/p&gt;
&lt;pre id=&quot;code_1765010928361&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for(j = 1; j &amp;lt;= 100; j++)
{
    for(k = 1; k &amp;lt;= 200; k++)
    {
        a[j, k] = j + k;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸&lt;/p&gt;
&lt;pre id=&quot;code_1765010956336&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for(k = 1; j &amp;lt;= 200; k++)
{
    for(j = 1; j &amp;lt;= 100; j++)
    {
        a[j, k] = j + k;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;루프 전개&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루프의 계산을 빠르게 하기 위해 루프를 펼치는 효과를 내는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 증가와 조건 검사의 횟수가 감소하기 때문에 수행되는 명령어의 수가 줄어듦&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 제어 변수의 최종 값을 증가시킬 수도 있고, 제어 변수의 값을 바꿔서 구현할 수도 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- store나 조건부 분기 명령은 선행 제어를 어렵게 하여 이런 경우 효과가 반감될 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 루프 전개를 위해선 반복 횟수를 컴파일 시간에 알아야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1765024043078&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int x;
for(x = 0; x &amp;lt; 100; x++)
{
    delete(x);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우&lt;/p&gt;
&lt;pre id=&quot;code_1765024066582&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int x;
for(x = 0; x &amp;lt; 100; x += 5)
{
    delete(x);
    delete(x + 1);
    delete(x + 2);
    delete(x + 3);
    delete(x + 4);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;전역 최적화 기법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램의 전체적인 흐름 분석을 통해 일련의 비효율적인 코드를 좀 더 효율적인 코드로 만드는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 지역 최적화와는 달리 블록 간 정보와 흐름 그래프를 이용하고 프로그램의 전체적인 흐름 분석을 통한 최적화 기법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 전역적 공통 부분식 제거, 상수 폴딩, 도달 불가능한 코드 제거&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;전역적 공통 부분식 제거&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기본 블록 간에 나타나는 공통 부분식에 대해서도 단 한 번만 계산하게도록 함으로써 코드를 개선&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상수 폴딩&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 하나의 기본 블록 내에서 정의를 못 찾으면 이전 블록에서 찾아서 폴딩&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;도달 불가능한 코드 제거&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 예를 들어, 상수 폴딩 후 발견된 갈 수 없는 기본 블록에 대한 제거 ()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;기계 종속적 최적화 기법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기계의 특성에 따라 아주 달라질 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 중복된 LOAD 명령어 제거, 효율적인 명령어 선택, 레지스터 할당과 배정, 명령어 스케줄링 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;중복 명령어 제거&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 핍홀 최적화에서 설명됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;효율적인 명령어 선택&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 동일한 기능을 가진 더 효율적인 명령어로 대치함으로써 최적화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스코드&amp;nbsp; x = x + 1에 대한 명령어는..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LOAD R1, x&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ADD R1, 10&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;STORE x, R1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이와 같은 명령어에 대해 컴퓨터가 레지스터나 메모리에서 1을 증가시키는 INC 명령어를 가진다면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;INC x&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 로 대치 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;레지스터 할당과 배정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목적 코드의 생성에서 중요한 고려 대상 중의 하나는 레지스터를 어떻게 이용하느냐 하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레지스터가 더 빠르니까 중요. 저정과 로드를 위한 명령이 필요 없어짐, 하지만 레지스터는 극히 한정, 레지스터 할당 방법이 문제가 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레지스터 할당 방법은 지역적 할당 방법과 전역적 할당 방법이 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지역적 할당 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 프로그램을 기본 블록으로 분할했을 때 각 기본 블록 내에서 변수를 레지스터에 할당하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전역적 할당 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 전체 프로시저를 고려하여 할당&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레지스터 할당 방법은 그래프 착색 방법으로 NP 완전 문제라 경험적인 방법에 의해 할당해되 전역적으로 잘 사용되는 자료는 되도록 레지스터에 넣어두는 편이 좋고, 지역적으로는 한 번 레지스터로 꺼내온 자료를 되도록 그곳에 보관하고 이용하는 편이 좋다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;명령어 스케줄링&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 식의 연산 순서 변경에 의해 연산이 임시 결과를 저장하거나 로드하는 횟수를 최소화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 임시 변수 기억 공간을 절약하고 효율적인 코드를 생산&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 레지스터로 효율적인 명령어 만들기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A * B - C * D를 계산하는데 하나의 레지스터 R0만을 이용할 수 있고, 일반적인 연산자 우선순위라 가정하면 다음과 같은 8개의 명령을 가짐&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 45.1163%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;LOAD R0, A&lt;br /&gt;MULT R0, B&lt;br /&gt;STORE temp1, R0&lt;br /&gt;LOAD R0, C&lt;br /&gt;MULT R0, D&lt;br /&gt;STORE temp2, R0&lt;br /&gt;LOAD R0, temp1&lt;br /&gt;SUBT R0, temp2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;식의 순서를 변경하여 효율적인 명령어를 만들면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A * B가 계산되기 전에 C * D를 먼저 계산하게 하면&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 45.1163%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;LOAD R0, C&lt;br /&gt;MULT R0, D &lt;br /&gt;STORE temp1, R0&lt;br /&gt;LOAD R0, A&lt;br /&gt;MULT R0, B &lt;br /&gt;SUBT R0, temp1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>학부/오토마타와 컴파일러</category>
      <author>라구넹</author>
      <guid isPermaLink="true">https://lagooneng.tistory.com/619</guid>
      <comments>https://lagooneng.tistory.com/619#entry619comment</comments>
      <pubDate>Sat, 6 Dec 2025 22:33:47 +0900</pubDate>
    </item>
  </channel>
</rss>