Jekyll 블로그에 태그 시스템 추가하기
Jekyll 블로그에 태그 시스템을 추가하는 방법을 단계별로 설명하겠습니다. 이 가이드를 따라하면 블로그 포스트를 태그로 분류하고, 태그별 페이지를 자동으로 생성할 수 있습니다.
Jekyll 블로그의 태그 시스템 원리 이해하기
Jekyll은 정적 사이트 생성기로, 마크다운 파일을 HTML로 변환하여 웹사이트를 만듭니다. 태그 시스템은 이러한 Jekyll의 작동 방식을 활용하여 구현됩니다.
1. 태그 데이터 수집
- Jekyll은 각 포스트의 Front Matter에서 태그 정보를 읽어들입니다.
- 이 정보는
site.tags
라는 전역 변수에 저장되며, 각 태그별로 관련 포스트들이 자동으로 그룹화됩니다. - Front Matter의 tags 필드는 YAML 배열 형식으로 작성되며, Jekyll이 빌드 시점에 이를 파싱합니다.
2. 태그 페이지 생성 과정
_plugins
폴더에tag_generator.rb
파일을 생성한다.tag_generator.rb
플러그인은 사이트가 빌드될 때 실행됩니다.- 포스트에서 사용된 모든 태그를 감지하고, 각 태그별로 별도의 페이지를 자동 생성합니다.
- 생성된 페이지는 Jekyll의 페이지 생성 파이프라인을 통해 처리됩니다.
- 이 과정에서 Liquid 템플릿 엔진이 동적으로 태그별 포스트 목록을 생성합니다.
3. 레이아웃과 템플릿 시스템
- Jekyll의 Liquid 템플릿 엔진을 사용하여 태그 페이지를 동적으로 구성합니다.
{% for %}
등의 Liquid 태그로 태그별 포스트 목록을 생성합니다.- 이는 빌드 시점에 실행되어 정적 HTML로 변환됩니다.
- 레이아웃 파일은 재사용 가능한 템플릿을 제공하여 일관된 디자인을 유지합니다.
4. 사이드바와의 통합
_data/navigation.yml
의 구조는 Jekyll의 데이터 파일 시스템을 활용합니다.- 이 데이터는
site.data.navigation
으로 접근할 수 있으며, 템플릿에서 동적으로 메뉴를 생성하는 데 사용됩니다. - YAML 형식의 데이터 파일은 Jekyll이 빌드할 때 자동으로 로드되어 전역 변수로 사용됩니다.
이러한 방식으로 Jekyll은 정적 사이트임에도 불구하고, 동적인 태그 시스템을 구현할 수 있습니다. 모든 처리는 빌드 시점에 이루어지므로, 실제 서비스되는 웹사이트는 빠르고 안정적으로 동작합니다.
1. 태그 페이지 생성하기
먼저 태그 목록을 보여줄 메인 페이지를 생성합니다.
/tags/index.html
파일을 생성하고 다음 내용을 추가합니다:
---
layout: default
title: Tags
author_profile: true
sidebar:
nav: "categories"
---
<div id="main" role="main">
{% include sidebar.html %}
<div class="archive">
<h1 class="page__title">Jekyll 블로그에 태그 시스템 추가하기</h1>
{% capture site_tags %}{% for tag in site.tags %}{{ tag | first }}{% unless forloop.last %},{% endunless %}{% endfor %}{% endcapture %}
{% assign tags_list = site_tags | split:',' | sort %}
<div class="entries-{{ entries_layout | default: 'list' }}">
{% for item in (0..site.tags.size) %}{% unless forloop.last %}
{% capture this_tag %}{{ tags_list[item] | strip_newlines }}{% endcapture %}
<div class="tag-group">
<h2 id="{{ this_tag }}" class="archive__subtitle">{{ this_tag }}</h2>
{% for post in site.tags[this_tag] %}
<div class="list__item">
<article class="archive__item">
<h3 class="archive__item-title no_toc">
<a href="{{ post.url | relative_url }}">{{ post.title }}</a>
</h3>
<p class="archive__item-excerpt">
<time datetime="{{ post.date | date_to_xmlschema }}">{{ post.date | date: "%Y-%m-%d" }}</time>
</p>
</article>
</div>
{% endfor %}
</div>
{% endunless %}{% endfor %}
</div>
</div>
</div>
2. 태그 레이아웃 생성하기
개별 태그 페이지의 레이아웃을 정의하기 위해 /_layouts/tag.html
파일을 생성합니다:
---
layout: archive
---
<div id="main" role="main">
<div class="sidebar sticky">
<div itemscope itemtype="https://schema.org/Person" class="h-card">
<div class="author__content">
<h3 class="author__name p-name" itemprop="name">
<a class="u-url" rel="me" href="https://gityeop.github.io/" itemprop="url">gityeop</a>
</h3>
<div class="author__bio p-note" itemprop="description">
<p>정리용 블로그</p>
</div>
</div>
<div class="author__urls-wrapper">
<button class="btn btn--inverse">팔로우</button>
<ul class="author__urls social-icons">
<li itemprop="homeLocation" itemscope itemtype="https://schema.org/Place">
<i class="fas fa-fw fa-map-marker-alt" aria-hidden="true"></i> <span itemprop="name" class="p-locality">Korea</span>
</li>
<!--
<li>
<a href="http://link-to-whatever-social-network.com/user/" itemprop="sameAs" rel="nofollow noopener noreferrer me">
<i class="fas fa-fw" aria-hidden="true"></i> Custom Social Profile Link
</a>
</li>
-->
</ul>
</div>
</div>
<nav class="nav__list">
<input id="ac-toc" name="accordion-toc" type="checkbox" />
<label for="ac-toc">토글 메뉴</label>
<ul class="nav__items">
<li>
<span class="nav__sub-title">Programming</span>
<ul>
<li><a href="/datastructure-and-algorithm/">Data Structure and Algorithm</a></li>
<li><a href="/python-basic/">Python 기본 문법</a></li>
</ul>
</li>
<li>
<span class="nav__sub-title">AI</span>
<ul>
<li><a href="/machine-learning/">Machine Learning</a></li>
<li><a href="/math-for-ml/">인공지능을 위한 수학</a></li>
</ul>
</li>
<li>
<span class="nav__sub-title">기타</span>
<ul>
<li><a href="/github-blog/">Github Blog</a></li>
<li><a href="/productivity/">생산성</a></li>
</ul>
</li>
</ul>
</nav>
<div class="sidebar-section">
<h3><a href="/tags/">Tags</a></h3>
</div>
</div>
<article class="page" itemscope itemtype="https://schema.org/CreativeWork">
<meta itemprop="headline" content="LangChain 튜토리얼 가이드">
<meta itemprop="description" content="랭체인 튜토리얼">
<meta itemprop="datePublished" content="2024-11-22T00:00:00+00:00">
<div class="page__inner-wrap">
<header>
<h1 id="page-title" class="page__title" itemprop="headline">
<a href="https://gityeop.github.io/machine-learning/LangChain-Tutorial.md/" itemprop="url">LangChain 튜토리얼 가이드
</a>
</h1>
<p class="page__meta">
<span class="page__meta-readtime">
<i class="far fa-clock" aria-hidden="true"></i>
2 분 소요
</span>
</p>
</header>
<section class="page__content" itemprop="text">
<!-- TOC -->
<ul>
<li><a href="#langchain-%EC%86%8C%EA%B0%9C">LangChain 소개</a></li>
<li><a href="#%EA%B8%B0%EB%B3%B8-%EA%B5%AC%EC%84%B1-%EC%9A%94%EC%86%8C">기본 구성 요소</a>
<ul>
<li><a href="#llmchat-models">LLM/Chat Models</a>
<ul>
<li><a href="#groq-%EC%82%AC%EC%9A%A9">Groq 사용</a></li>
<li><a href="#openai-%EC%82%AC%EC%9A%A9">OpenAI 사용</a></li>
<li><a href="#ollama-%EC%82%AC%EC%9A%A9">Ollama 사용</a></li>
</ul>
</li>
<li><a href="#%ED%94%84%EB%A1%AC%ED%94%84%ED%8A%B8-%ED%85%9C%ED%94%8C%EB%A6%BF">프롬프트 템플릿</a></li>
<li><a href="#%EC%B6%9C%EB%A0%A5-%ED%8C%8C%EC%84%9C">출력 파서</a></li>
</ul>
</li>
<li><a href="#%EC%A3%BC%EC%9A%94-%EA%B8%B0%EB%8A%A5-%EB%B0%8F-%EC%82%AC%EC%9A%A9-%EC%98%88%EC%8B%9C">주요 기능 및 사용 예시</a>
<ul>
<li><a href="#%EC%B2%B4%EC%9D%B8-%EA%B5%AC%EC%84%B1">체인 구성</a></li>
<li><a href="#%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%B2%98%EB%A6%AC">비동기 처리</a></li>
</ul>
</li>
<li><a href="#%EC%8B%A4%EC%A0%9C-%EA%B5%AC%ED%98%84-%EC%98%88%EC%8B%9C">실제 구현 예시</a>
<ul>
<li><a href="#%EC%A7%88%EB%AC%B8-%EC%83%9D%EC%84%B1-%EC%8B%9C%EC%8A%A4%ED%85%9C">질문 생성 시스템</a></li>
<li><a href="#%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B2%80%EC%A6%9D-%EC%8B%9C%EC%8A%A4%ED%85%9C">데이터 검증 시스템</a></li>
</ul>
</li>
</ul>
<!-- /TOC -->
<h2 id="1-langchain-소개">1. LangChain 소개</h2>
<p>LangChain은 언어 모델(LLM)을 활용한 애플리케이션 개발을 위한 프레임워크다. 다양한 LLM을 쉽게 통합하고, 체인과 에이전트를 구성하여 복잡한 작업을 수행할 수 있도록 도와준다.</p>
<h2 id="2-기본-구성-요소">2. 기본 구성 요소</h2>
<h3 id="21-llmchat-models">2.1 LLM/Chat Models</h3>
<h4 id="groq-사용">Groq 사용</h4>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">langchain_groq</span> <span class="kn">import</span> <span class="n">ChatGroq</span>
<span class="c1"># Groq LLM 초기화
</span><span class="n">chat_model</span> <span class="o">=</span> <span class="nc">ChatGroq</span><span class="p">(</span>
<span class="n">temperature</span><span class="o">=</span><span class="mf">0.1</span><span class="p">,</span>
<span class="n">model_name</span><span class="o">=</span><span class="sh">"</span><span class="s">model_name</span><span class="sh">"</span><span class="p">,</span>
<span class="n">api_key</span><span class="o">=</span><span class="sh">"</span><span class="s">your_api_key</span><span class="sh">"</span>
<span class="p">)</span>
</code></pre></div></div>
<h4 id="openai-사용">OpenAI 사용</h4>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">langchain_openai</span> <span class="kn">import</span> <span class="n">ChatOpenAI</span>
<span class="c1"># OpenAI LLM 초기화
</span><span class="n">chat_model</span> <span class="o">=</span> <span class="nc">ChatOpenAI</span><span class="p">(</span>
<span class="n">temperature</span><span class="o">=</span><span class="mf">0.7</span><span class="p">,</span>
<span class="n">model_name</span><span class="o">=</span><span class="sh">"</span><span class="s">gpt-4</span><span class="sh">"</span><span class="p">,</span> <span class="c1"># 또는 "gpt-3.5-turbo"
</span> <span class="n">api_key</span><span class="o">=</span><span class="sh">"</span><span class="s">your_openai_api_key</span><span class="sh">"</span>
<span class="p">)</span>
</code></pre></div></div>
<h4 id="ollama-사용">Ollama 사용</h4>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">langchain_community.llms</span> <span class="kn">import</span> <span class="n">Ollama</span>
<span class="c1"># Ollama LLM 초기화
</span><span class="n">llm</span> <span class="o">=</span> <span class="nc">Ollama</span><span class="p">(</span>
<span class="n">model</span><span class="o">=</span><span class="sh">"</span><span class="s">llama2</span><span class="sh">"</span><span class="p">,</span> <span class="c1"># 또는 "mistral", "codellama" 등
</span> <span class="n">temperature</span><span class="o">=</span><span class="mf">0.5</span><span class="p">,</span>
<span class="n">base_url</span><span class="o">=</span><span class="sh">"</span><span class="s">http://localhost:11434</span><span class="sh">"</span> <span class="c1"># Ollama 서버 URL
</span><span class="p">)</span>
<span class="c1"># 또는 Ollama Chat 모델 사용
</span><span class="kn">from</span> <span class="n">langchain_community.chat_models</span> <span class="kn">import</span> <span class="n">ChatOllama</span>
<span class="n">chat_model</span> <span class="o">=</span> <span class="nc">ChatOllama</span><span class="p">(</span>
<span class="n">model</span><span class="o">=</span><span class="sh">"</span><span class="s">llama2</span><span class="sh">"</span><span class="p">,</span>
<span class="n">temperature</span><span class="o">=</span><span class="mf">0.5</span>
<span class="p">)</span>
</code></pre></div></div>
<h3 id="22-프롬프트-템플릿">2.2 프롬프트 템플릿</h3>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">langchain.prompts</span> <span class="kn">import</span> <span class="n">PromptTemplate</span>
<span class="c1"># 프롬프트 템플릿 생성
</span><span class="n">prompt</span> <span class="o">=</span> <span class="nc">PromptTemplate</span><span class="p">(</span>
<span class="n">template</span><span class="o">=</span><span class="sh">"</span><span class="s">Context: {context}</span><span class="se">\n</span><span class="s">Question: {question}</span><span class="se">\n</span><span class="s">Choices: {choices}</span><span class="se">\n</span><span class="s">Answer: {answer}</span><span class="sh">"</span><span class="p">,</span>
<span class="n">input_variables</span><span class="o">=</span><span class="p">[</span><span class="sh">"</span><span class="s">context</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">question</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">choices</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">answer</span><span class="sh">"</span><span class="p">]</span>
<span class="p">)</span>
</code></pre></div></div>
<h3 id="23-출력-파서">2.3 출력 파서</h3>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">langchain.output_parsers</span> <span class="kn">import</span> <span class="n">PydanticOutputParser</span>
<span class="kn">from</span> <span class="n">pydantic</span> <span class="kn">import</span> <span class="n">BaseModel</span><span class="p">,</span> <span class="n">Field</span>
<span class="c1"># Pydantic 모델 정의
</span><span class="k">class</span> <span class="nc">AnswerResponse</span><span class="p">(</span><span class="n">BaseModel</span><span class="p">):</span>
<span class="n">answer</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="nc">Field</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="sh">"</span><span class="s">답변 번호 (1-5)</span><span class="sh">"</span><span class="p">,</span> <span class="n">ge</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">le</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span>
<span class="c1"># 파서 초기화
</span><span class="n">parser</span> <span class="o">=</span> <span class="nc">PydanticOutputParser</span><span class="p">(</span><span class="n">pydantic_object</span><span class="o">=</span><span class="n">AnswerResponse</span><span class="p">)</span>
</code></pre></div></div>
<h2 id="3-주요-기능-및-사용-예시">3. 주요 기능 및 사용 예시</h2>
<h3 id="31-체인-구성">3.1 체인 구성</h3>
<p>LangChain은 여러 컴포넌트를 체인으로 연결하여 복잡한 작업을 수행할 수 있다.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 프롬프트 템플릿과 출력 파서 연결
</span><span class="n">prompt</span> <span class="o">=</span> <span class="nc">PromptTemplate</span><span class="p">(</span>
<span class="n">template</span><span class="o">=</span><span class="n">template_text</span> <span class="o">+</span> <span class="sh">"</span><span class="se">\n</span><span class="s">{format_instructions}</span><span class="sh">"</span><span class="p">,</span>
<span class="n">input_variables</span><span class="o">=</span><span class="p">[</span><span class="sh">"</span><span class="s">context</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">question</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">choices</span><span class="sh">"</span><span class="p">],</span>
<span class="n">partial_variables</span><span class="o">=</span><span class="p">{</span><span class="sh">"</span><span class="s">format_instructions</span><span class="sh">"</span><span class="p">:</span> <span class="n">parser</span><span class="p">.</span><span class="nf">get_format_instructions</span><span class="p">()}</span>
<span class="p">)</span>
</code></pre></div></div>
<h3 id="32-비동기-처리">3.2 비동기 처리</h3>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">concurrent.futures</span> <span class="kn">import</span> <span class="n">ThreadPoolExecutor</span><span class="p">,</span> <span class="n">as_completed</span>
<span class="k">def</span> <span class="nf">process_batch</span><span class="p">(</span><span class="n">batch_data</span><span class="p">,</span> <span class="n">model</span><span class="p">):</span>
<span class="k">with</span> <span class="nc">ThreadPoolExecutor</span><span class="p">()</span> <span class="k">as</span> <span class="n">executor</span><span class="p">:</span>
<span class="n">futures</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">batch_data</span><span class="p">:</span>
<span class="n">future</span> <span class="o">=</span> <span class="n">executor</span><span class="p">.</span><span class="nf">submit</span><span class="p">(</span><span class="n">process_single_item</span><span class="p">,</span> <span class="n">item</span><span class="p">,</span> <span class="n">model</span><span class="p">)</span>
<span class="n">futures</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">future</span><span class="p">)</span>
<span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">future</span> <span class="ow">in</span> <span class="nf">as_completed</span><span class="p">(</span><span class="n">futures</span><span class="p">):</span>
<span class="n">results</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">future</span><span class="p">.</span><span class="nf">result</span><span class="p">())</span>
<span class="k">return</span> <span class="n">results</span>
</code></pre></div></div>
<h2 id="4-실제-구현-예시">4. 실제 구현 예시</h2>
<h3 id="41-질문-생성-시스템">4.1 질문 생성 시스템</h3>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">generate_answer</span><span class="p">(</span><span class="n">context</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">question</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">choices</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]):</span>
<span class="sh">"""</span><span class="s">
주어진 문맥과 질문에 대한 답변을 생성한다.
Args:
context: 문제의 문맥
question: 질문 내용
choices: 선택지 목록
Returns:
AnswerResponse: 1-5 사이의 답변 번호
</span><span class="sh">"""</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># 프롬프트 준비
</span> <span class="n">messages</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">{</span><span class="sh">"</span><span class="s">role</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">system</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">content</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">문제를 해결하고 정답 번호를 선택하는 assistant다.</span><span class="sh">"</span><span class="p">},</span>
<span class="p">{</span><span class="sh">"</span><span class="s">role</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">user</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">content</span><span class="sh">"</span><span class="p">:</span> <span class="sa">f</span><span class="sh">"</span><span class="s">Context: </span><span class="si">{</span><span class="n">context</span><span class="si">}</span><span class="se">\n</span><span class="s">Question: </span><span class="si">{</span><span class="n">question</span><span class="si">}</span><span class="se">\n</span><span class="s">Choices: </span><span class="si">{</span><span class="n">choices</span><span class="si">}</span><span class="sh">"</span><span class="p">}</span>
<span class="p">]</span>
<span class="c1"># LLM에 요청
</span> <span class="n">response</span> <span class="o">=</span> <span class="n">chat_model</span><span class="p">.</span><span class="nf">invoke</span><span class="p">(</span><span class="n">messages</span><span class="p">)</span>
<span class="c1"># 응답 파싱
</span> <span class="k">return</span> <span class="n">parser</span><span class="p">.</span><span class="nf">parse</span><span class="p">(</span><span class="n">response</span><span class="p">.</span><span class="n">content</span><span class="p">)</span>
<span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Error generating answer: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">None</span>
</code></pre></div></div>
<h3 id="42-데이터-검증-시스템">4.2 데이터 검증 시스템</h3>
<p>```python
class QuestionFormatValidator(BaseModel):
id: str = Field(description=”질문 ID”)
context: str = Field(description=”문제 문맥”)
question: str = Field(description=”질문 내용”)
choices: List[str] = Field(description=”선택지 목록”)
answer: str = Field(description=”정답”)
is_error: int = Field(description=”오류 여부 (1: 오류, 0: 정상)”)
error_type: str = Field(description=”오류 유형 설명”)</p>
</section>
<footer class="page__meta">
<p class="page__taxonomy">
<strong><i class="fas fa-fw fa-tags" aria-hidden="true"></i> 태그: </strong>
<span itemprop="keywords">
<a href="/tags/#langchain" class="page__taxonomy-item p-category" rel="tag">langchain</a>
</span>
</p>
<p class="page__taxonomy">
<strong><i class="fas fa-fw fa-folder-open" aria-hidden="true"></i> 카테고리: </strong>
<span itemprop="keywords">
<a href="/#machine-learning" class="page__taxonomy-item p-category" rel="tag">machine-learning</a>
</span>
</p>
<p class="page__date"><strong><i class="fas fa-fw fa-calendar-alt" aria-hidden="true"></i> 업데이트:</strong> <time class="dt-published" datetime="2024-11-22T00:00:00+00:00">November 22, 2024</time></p>
</footer>
<section class="page__share">
<h4 class="page__share-title">공유하기</h4>
<a href="https://twitter.com/intent/tweet?text=LangChain+%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC+%EA%B0%80%EC%9D%B4%EB%93%9C%20https%3A%2F%2Fgityeop.github.io%2Fmachine-learning%2FLangChain-Tutorial.md%2F" class="btn btn--twitter" onclick="window.open(this.href, 'window', 'left=20,top=20,width=500,height=500,toolbar=1,resizable=0'); return false;" title="공유하기 Twitter"><i class="fab fa-fw fa-twitter" aria-hidden="true"></i><span> Twitter</span></a>
<a href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fgityeop.github.io%2Fmachine-learning%2FLangChain-Tutorial.md%2F" class="btn btn--facebook" onclick="window.open(this.href, 'window', 'left=20,top=20,width=500,height=500,toolbar=1,resizable=0'); return false;" title="공유하기 Facebook"><i class="fab fa-fw fa-facebook" aria-hidden="true"></i><span> Facebook</span></a>
<a href="https://www.linkedin.com/shareArticle?mini=true&url=https://gityeop.github.io/machine-learning/LangChain-Tutorial.md/" class="btn btn--linkedin" onclick="window.open(this.href, 'window', 'left=20,top=20,width=500,height=500,toolbar=1,resizable=0'); return false;" title="공유하기 LinkedIn"><i class="fab fa-fw fa-linkedin" aria-hidden="true"></i><span> LinkedIn</span></a>
</section>
<nav class="pagination">
<a href="/machine-learning/Inverted-index/" class="pagination--pager" title="Inverted Index란?
">이전</a>
<a href="/github-blog/adding-tags-to-jekyll/" class="pagination--pager" title="Jekyll 블로그에 태그 시스템 추가하기
">다음</a>
</nav>
</div>
<div class="page__comments">
<h4 class="page__comments-title">댓글남기기</h4>
<section id="utterances-comments"></section>
</div>
</article>
<div class="page__related">
<h2 class="page__related-title">참고</h2>
<div class="grid__wrapper">
<div class="grid__item">
<article class="archive__item" itemscope itemtype="https://schema.org/CreativeWork">
<h2 class="archive__item-title no_toc" itemprop="headline">
<a href="/machine-learning/pruning/" rel="permalink">모델 경량화 기법: Pruning(가지치기)
</a>
</h2>
<p class="page__meta">
<i class="far fa-calendar-alt" aria-hidden="true"></i> 2024-12-23
</p>
<p class="page__meta">
<span class="page__meta-readtime">
<i class="far fa-clock" aria-hidden="true"></i>
2 분 소요
</span>
</p>
<p class="archive__item-excerpt" itemprop="description">1. 프루닝 개념
</p>
</article>
</div>
<div class="grid__item">
<article class="archive__item" itemscope itemtype="https://schema.org/CreativeWork">
<h2 class="archive__item-title no_toc" itemprop="headline">
<a href="/machine-learning/pruning-2/" rel="permalink">모델 경량화 기법: Pruning(가지치기) - 실전편
</a>
</h2>
<p class="page__meta">
<i class="far fa-calendar-alt" aria-hidden="true"></i> 2024-12-23
</p>
<p class="page__meta">
<span class="page__meta-readtime">
<i class="far fa-clock" aria-hidden="true"></i>
1 분 소요
</span>
</p>
<p class="archive__item-excerpt" itemprop="description">1. 프루닝 구현 방법
</p>
</article>
</div>
<div class="grid__item">
<article class="archive__item" itemscope itemtype="https://schema.org/CreativeWork">
<h2 class="archive__item-title no_toc" itemprop="headline">
<a href="/aging-slowly/" rel="permalink">충분히 실천 가능한 느리게 늙는 방법 (노년내과 정희원 교수)
</a>
</h2>
<p class="page__meta">
<i class="far fa-calendar-alt" aria-hidden="true"></i> 2024-12-18
</p>
<p class="page__meta">
<span class="page__meta-readtime">
<i class="far fa-clock" aria-hidden="true"></i>
4 분 소요
</span>
</p>
<p class="archive__item-excerpt" itemprop="description">
</p>
</article>
</div>
<div class="grid__item">
<article class="archive__item" itemscope itemtype="https://schema.org/CreativeWork">
<h2 class="archive__item-title no_toc" itemprop="headline">
<a href="/machine-learning/aws-gcp/" rel="permalink">아마존 AWS와 구글 GCP 서비스 비교
</a>
</h2>
<p class="page__meta">
<i class="far fa-calendar-alt" aria-hidden="true"></i> 2024-12-16
</p>
<p class="page__meta">
<span class="page__meta-readtime">
<i class="far fa-clock" aria-hidden="true"></i>
1 분 소요
</span>
</p>
<p class="archive__item-excerpt" itemprop="description">아마존 AWS 서비스
</p>
</article>
</div>
</div>
</div>
</div>
<div class="entries-list">
{% for post in site.tags[page.tag] %}
{% include archive-single.html %}
{% endfor %}
</div>
3. 태그 자동 생성 플러그인 추가하기
태그별 페이지를 자동으로 생성하기 위한 플러그인을 추가합니다. /_plugins/tag_generator.rb
파일을 생성하고 다음 내용을 추가합니다:
Jekyll::Hooks.register :posts, :post_write do |post|
all_existing_tags = Dir.entries("_tags")
.map { |t| t.match(/(.*).md/) }
.compact.map { |m| m[1] }
tags = post['tags'].reject { |t| t.empty? }
tags.each do |tag|
generate_tag_file(tag) if !all_existing_tags.include?(tag)
end
end
def generate_tag_file(tag)
File.open("_tags/#{tag}.md", "wb") do |file|
file << "---\nlayout: tag\ntag: #{tag}\n---\n"
end
end
4. 포스트에 태그 추가하기
이제 블로그 포스트의 Front Matter에 태그를 추가할 수 있습니다:
---
title: "포스트 제목"
categories: category-name
tags:
- Tag1
- Tag2
- Tag3
---
5. 사이드바에 카테고리 메뉴 추가하기
/_data/navigation.yml
파일에 카테고리 네비게이션을 추가합니다:
# sidebar navigation
categories:
- title: Programming
children:
- title: "Data Structure and Algorithm"
url: /datastructure-and-algorithm/
- title: "Python 기본 문법"
url: /python-basic/
- title: AI
children:
- title: "Machine Learning"
url: /machine-learning/
# 필요한 만큼 카테고리 추가
주의사항
- GitHub Pages에서는 커스텀 플러그인을 지원하지 않습니다. 로컬에서 사이트를 빌드한 후 결과물을 푸시하거나, GitHub Actions를 사용해야 합니다.
- 태그 이름에는 공백 대신 하이픈(-)을 사용하는 것이 좋습니다.
결과
이제 블로그에서 다음과 같은 기능을 사용할 수 있습니다:
/tags
페이지에서 모든 태그와 관련 포스트 목록 확인- 각 태그별 전용 페이지 자동 생성
- 사이드바에서 카테고리별 포스트 쉽게 탐색
댓글남기기