<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>걸어서개발한바퀴</title>
    <link>https://walkaroundthedevelop.tistory.com/</link>
    <description>개발여행 가 봅시다~</description>
    <language>ko</language>
    <pubDate>Tue, 19 May 2026 11:45:00 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>jinmc</managingEditor>
    <image>
      <title>걸어서개발한바퀴</title>
      <url>https://tistory1.daumcdn.net/tistory/4307106/attach/a0551b25a0474ad4afab89540aafdc80</url>
      <link>https://walkaroundthedevelop.tistory.com</link>
    </image>
    <item>
      <title>Mac mini M4(24GB)로 OpenClaw 세팅하기 (로컬 LLM + MCP 툴 추천까지)</title>
      <link>https://walkaroundthedevelop.tistory.com/206</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 &amp;ldquo;내 컴퓨터에서 24/7로 돌아가는 개인 AI 비서&amp;rdquo;를 만들 때 가장 많이 언급되는 조합이 &lt;b&gt;Mac mini + OpenClaw&lt;/b&gt;입니다. OpenClaw는 메신저(텔레그램/슬랙/디스코드 등)로 들어오는 요청을 받아서, 웹/파일/툴을 실제로 실행해주는 &lt;b&gt;에이전트 런타임&lt;/b&gt;에 가깝습니다.&lt;/p&gt;
&lt;p data-end=&quot;505&quot; data-start=&quot;352&quot; data-ke-size=&quot;size16&quot;&gt;다만 OpenClaw 생태계는 최근 확산 속도가 매우 빠르고(인기 + 확장 기능), 그만큼 &lt;b&gt;보안 이슈도 크게 터진 상태&lt;/b&gt;라서 &amp;ldquo;설치만 하면 끝&amp;rdquo;은 아닙니다. 스킬(확장) 설치는 특히 주의가 필요합니다.&lt;/p&gt;
&lt;p data-end=&quot;540&quot; data-start=&quot;507&quot; data-ke-size=&quot;size16&quot;&gt;이 글에서는 &lt;b&gt;Mac mini M4 24GB 기준&lt;/b&gt;으로,&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;627&quot; data-start=&quot;541&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;560&quot; data-start=&quot;541&quot;&gt;OpenClaw 기본 설치&lt;/li&gt;
&lt;li data-end=&quot;576&quot; data-start=&quot;561&quot;&gt;24/7 구동 세팅&lt;/li&gt;
&lt;li data-end=&quot;598&quot; data-start=&quot;577&quot;&gt;로컬 모델(Ollama) 연결&lt;/li&gt;
&lt;li data-end=&quot;627&quot; data-start=&quot;599&quot;&gt;MCP 툴 추천&lt;br /&gt;까지 한 번에 정리합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;632&quot; data-start=&quot;629&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;669&quot; data-start=&quot;634&quot; data-ke-size=&quot;size26&quot;&gt;0) 이 글의 전제 (Mac mini M4 24GB 기준)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;810&quot; data-start=&quot;670&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;730&quot; data-start=&quot;670&quot;&gt;**클라우드 모델(Claude/OpenAI 등)**만 쓰면 24GB는 충분하고, 오히려 여유가 남습니다.&lt;/li&gt;
&lt;li data-end=&quot;810&quot; data-start=&quot;731&quot;&gt;&lt;b&gt;로컬 모델&lt;/b&gt;까지 같이 굴리면 모델 크기에 따라 체감이 갈립니다. (7B~8B 급은 현실적으로 가능, 14B 이상은 기대치 관리 필요)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;815&quot; data-start=&quot;812&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;841&quot; data-start=&quot;817&quot; data-ke-size=&quot;size26&quot;&gt;1) 사전 준비 (macOS 기본 툴)&lt;/h2&gt;
&lt;p data-end=&quot;884&quot; data-start=&quot;842&quot; data-ke-size=&quot;size16&quot;&gt;OpenClaw는 Node 기반으로 돌아가니, 기본적으로 아래가 필요합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;967&quot; data-start=&quot;886&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;921&quot; data-start=&quot;886&quot;&gt;Xcode Command Line Tools (git 포함)&lt;/li&gt;
&lt;li data-end=&quot;932&quot; data-start=&quot;922&quot;&gt;Homebrew&lt;/li&gt;
&lt;li data-end=&quot;967&quot; data-start=&quot;933&quot;&gt;Node.js (가이드에 따라 버전 요구가 있을 수 있음)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1064&quot; data-start=&quot;969&quot; data-ke-size=&quot;size16&quot;&gt;참고로 Mac mini에서 OpenClaw 설치/준비 과정은 커뮤니티에서도 비슷하게 정리되어 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;1069&quot; data-start=&quot;1066&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1100&quot; data-start=&quot;1071&quot; data-ke-size=&quot;size26&quot;&gt;2) OpenClaw 설치 (가장 단순한 방법)&lt;/h2&gt;
&lt;p data-end=&quot;1168&quot; data-start=&quot;1101&quot; data-ke-size=&quot;size16&quot;&gt;공식 설치 스크립트로 진행하는 방식이 가장 빠릅니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;curl -fsSL &lt;a href=&quot;https://openclaw.ai/install.sh&quot;&gt;https://openclaw.ai/install.sh&lt;/a&gt; | bash openclaw --version openclaw status &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1294&quot; data-start=&quot;1268&quot; data-ke-size=&quot;size16&quot;&gt;설치 후에는 초기 설정(온보딩)으로 들어갑니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;openclaw onboard &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1383&quot; data-start=&quot;1326&quot; data-ke-size=&quot;size16&quot;&gt;여기서 모델 제공자(클라우드 or 로컬), 채널(텔레그램/슬랙 등)을 선택하고 토큰을 넣는 흐름입니다.&lt;/p&gt;
&lt;hr data-end=&quot;1388&quot; data-start=&quot;1385&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1418&quot; data-start=&quot;1390&quot; data-ke-size=&quot;size26&quot;&gt;3) 24/7로 &amp;ldquo;항상 켜져있는&amp;rdquo; 상태 만들기&lt;/h2&gt;
&lt;p data-end=&quot;1451&quot; data-start=&quot;1419&quot; data-ke-size=&quot;size16&quot;&gt;OpenClaw를 &amp;ldquo;비서&amp;rdquo;로 쓰려면 맥이 잠들면 끝입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1551&quot; data-start=&quot;1453&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1507&quot; data-start=&quot;1453&quot;&gt;&lt;b&gt;시스템 설정 &amp;rarr; 배터리/전원&lt;/b&gt;에서 &amp;ldquo;디스플레이 끄기&amp;rdquo;와 &amp;ldquo;컴퓨터 잠자기&amp;rdquo;를 분리해서 관리&lt;/li&gt;
&lt;li data-end=&quot;1551&quot; data-start=&quot;1508&quot;&gt;가능하면 **Sleep 방지(필요할 때만)**를 걸어두는 식이 깔끔합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1644&quot; data-start=&quot;1553&quot; data-ke-size=&quot;size16&quot;&gt;추가로, OpenClaw 설정을 손으로 만졌으면 재시작이 필요합니다(구성 파일 수정 후 반영).&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;openclaw gateway restart &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1687&quot; data-start=&quot;1684&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1706&quot; data-start=&quot;1689&quot; data-ke-size=&quot;size26&quot;&gt;4) (중요) 보안 기본값&lt;/h2&gt;
&lt;p data-end=&quot;1824&quot; data-start=&quot;1707&quot; data-ke-size=&quot;size16&quot;&gt;최근 OpenClaw 스킬/확장 생태계에서 &lt;b&gt;악성 스킬 이슈가 실제로 터졌습니다.&lt;/b&gt; 특히 &amp;ldquo;터미널에 이 명령 실행하세요&amp;rdquo; 류는 위험합니다.&lt;/p&gt;
&lt;p data-end=&quot;1832&quot; data-start=&quot;1826&quot; data-ke-size=&quot;size16&quot;&gt;권장 원칙:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1950&quot; data-start=&quot;1833&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1859&quot; data-start=&quot;1833&quot;&gt;스킬은 &lt;b&gt;공식/신뢰 가능한 출처만&lt;/b&gt; 설치&lt;/li&gt;
&lt;li data-end=&quot;1879&quot; data-start=&quot;1860&quot;&gt;설치 전 &lt;b&gt;레포/코드 확인&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1921&quot; data-start=&quot;1880&quot;&gt;OpenClaw가 접근 가능한 권한(파일/쉘/네트워크)을 &lt;b&gt;최소화&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1950&quot; data-start=&quot;1922&quot;&gt;외부로 열어야 한다면(원격) 인증/접근제어 필수&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1955&quot; data-start=&quot;1952&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1993&quot; data-start=&quot;1957&quot; data-ke-size=&quot;size26&quot;&gt;5) 로컬 모델을 쓰려면: Ollama 연동이 제일 편합니다&lt;/h2&gt;
&lt;p data-end=&quot;2115&quot; data-start=&quot;1994&quot; data-ke-size=&quot;size16&quot;&gt;Mac mini에서 로컬 LLM은 보통 &lt;b&gt;Ollama&lt;/b&gt;가 설치/운영이 쉽고, OpenClaw도 Ollama를 provider로 문서화해두었습니다.&lt;/p&gt;
&lt;h3 data-end=&quot;2143&quot; data-start=&quot;2117&quot; data-ke-size=&quot;size23&quot;&gt;5-1) Ollama 설치 &amp;amp; 모델 받기&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;brew install ollama ollama serve &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2219&quot; data-start=&quot;2190&quot; data-ke-size=&quot;size16&quot;&gt;모델은 일단 아래 중 하나로 시작하는 게 무난합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2315&quot; data-start=&quot;2220&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2258&quot; data-start=&quot;2220&quot;&gt;qwen2.5:7b-instruct (가성비/툴콜 기대치 괜찮음)&lt;/li&gt;
&lt;li data-end=&quot;2286&quot; data-start=&quot;2259&quot;&gt;llama3.1:8b-instruct (범용)&lt;/li&gt;
&lt;li data-end=&quot;2315&quot; data-start=&quot;2287&quot;&gt;(메모리 여유 있으면) gemma 계열도 선택지&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;ollama pull qwen2.5:7b-instruct &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;2400&quot; data-start=&quot;2362&quot; data-ke-size=&quot;size23&quot;&gt;5-2) OpenClaw에서 Ollama provider 연결&lt;/h3&gt;
&lt;p data-end=&quot;2573&quot; data-start=&quot;2401&quot; data-ke-size=&quot;size16&quot;&gt;OpenClaw는 Ollama의 OpenAI 호환 엔드포인트 방식으로 붙는 흐름을 지원합니다. &lt;br /&gt;대부분은 온보딩에서 &amp;ldquo;Local/Ollama&amp;rdquo; 고르면 자동으로 잡히고, 수동이라면 설정 파일에 Ollama baseUrl을 넣고 재시작합니다.&lt;/p&gt;
&lt;p data-end=&quot;2649&quot; data-start=&quot;2575&quot; data-ke-size=&quot;size16&quot;&gt;예시로 커뮤니티에서 공유된 설정은 이런 형태입니다(포맷 참고용).&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;models&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;providers&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;ollama&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;baseUrl&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;http://localhost:11434/v1&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;apiKey&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;ollama-local&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;api&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;openai-completions&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;models&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;id&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;qwen2.5:7b-instruct&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;qwen2.5:7b-instruct&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2964&quot; data-start=&quot;2959&quot; data-ke-size=&quot;size16&quot;&gt;수정 후:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;openclaw gateway restart openclaw status &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;3059&quot; data-start=&quot;3020&quot; data-ke-size=&quot;size23&quot;&gt;5-3) 로컬 모델 추천 (Mac mini M4 24GB 기준)&lt;/h3&gt;
&lt;p data-end=&quot;3075&quot; data-start=&quot;3060&quot; data-ke-size=&quot;size16&quot;&gt;현실적인 추천만 정리합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3213&quot; data-start=&quot;3077&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3122&quot; data-start=&quot;3077&quot;&gt;&lt;b&gt;업무/툴콜/에이전트&lt;/b&gt;: qwen2.5:7b-instruct 류부터&lt;/li&gt;
&lt;li data-end=&quot;3160&quot; data-start=&quot;3123&quot;&gt;&lt;b&gt;대화/범용&lt;/b&gt;: llama3.1:8b-instruct&lt;/li&gt;
&lt;li data-end=&quot;3213&quot; data-start=&quot;3161&quot;&gt;14B 이상은 돌아가도 &amp;ldquo;빠릿함&amp;rdquo; 기대하면 실망할 확률이 큽니다(특히 멀티스텝 에이전트).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3218&quot; data-start=&quot;3215&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3250&quot; data-start=&quot;3220&quot; data-ke-size=&quot;size26&quot;&gt;6) MCP 툴(=MCP 서버) 뭐 쓰면 좋은가?&lt;/h2&gt;
&lt;p data-end=&quot;3358&quot; data-start=&quot;3251&quot; data-ke-size=&quot;size16&quot;&gt;MCP는 에이전트가 외부 기능을 표준 방식으로 붙이는 프로토콜이고, 서버 레퍼런스/목록은 공식 저장소에 계속 업데이트됩니다.&lt;/p&gt;
&lt;h3 data-end=&quot;3389&quot; data-start=&quot;3360&quot; data-ke-size=&quot;size23&quot;&gt;6-1) &amp;ldquo;무조건 깔아둘만한&amp;rdquo; MCP 툴 3종&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;3427&quot; data-start=&quot;3390&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;3427&quot; data-start=&quot;3390&quot;&gt;&lt;b&gt;Playwright MCP (웹 자동화/브라우저 조작)&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3537&quot; data-start=&quot;3428&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3461&quot; data-start=&quot;3428&quot;&gt;검색/클릭/로그인/스크래핑까지 에이전트가 직접 실행 가능&lt;/li&gt;
&lt;li data-end=&quot;3537&quot; data-start=&quot;3462&quot;&gt;공식 Playwright MCP 서버 레포가 따로 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3568&quot; data-start=&quot;3539&quot; data-ke-size=&quot;size16&quot;&gt;설정 예시(클라이언트에 mcpServers로 추가):&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;mcpServers&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;playwright&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;command&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;npx&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;args&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;@playwright/mcp@latest&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;3734&quot; data-start=&quot;3699&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;3734&quot; data-start=&quot;3699&quot;&gt;&lt;b&gt;File system 계열 (로컬 파일 읽기/쓰기)&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3776&quot; data-start=&quot;3735&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3776&quot; data-start=&quot;3735&quot;&gt;&amp;ldquo;작업 결과를 파일로 저장&amp;rdquo;, &amp;ldquo;로그/리포트 생성&amp;rdquo; 같은 자동화에 필수&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;3792&quot; data-start=&quot;3778&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;3792&quot; data-start=&quot;3778&quot;&gt;&lt;b&gt;Git MCP&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3835&quot; data-start=&quot;3793&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3835&quot; data-start=&quot;3793&quot;&gt;코드 수정/커밋/브랜치 작업을 에이전트가 안전하게 수행하게 만들 때 유용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3913&quot; data-start=&quot;3837&quot; data-ke-size=&quot;size16&quot;&gt;(MCP 서버들을 한눈에 찾을 때는 디렉토리 사이트도 편합니다. )&lt;/p&gt;
&lt;h3 data-end=&quot;3943&quot; data-start=&quot;3915&quot; data-ke-size=&quot;size23&quot;&gt;6-2) &amp;ldquo;상황 따라 가치가 큰&amp;rdquo; MCP 툴&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4223&quot; data-start=&quot;3944&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4079&quot; data-start=&quot;3944&quot;&gt;&lt;b&gt;Web Search (Brave/Tavily 등)&lt;/b&gt;: 실시간 정보가 핵심인 워크플로우에서 효율 상승 (OpenClaw 웹검색 구성도 여러 방식이 언급됩니다).&lt;/li&gt;
&lt;li data-end=&quot;4132&quot; data-start=&quot;4080&quot;&gt;&lt;b&gt;DB(Postgres 등)&lt;/b&gt;: 사내 데이터/개인 데이터 자동 요약, 리포팅에 강함&lt;/li&gt;
&lt;li data-end=&quot;4223&quot; data-start=&quot;4133&quot;&gt;&lt;b&gt;YouTube/Transcript&lt;/b&gt;: 영상 요약/스크립트 자동화 파이프라인에 좋음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;4228&quot; data-start=&quot;4225&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;4254&quot; data-start=&quot;4230&quot; data-ke-size=&quot;size26&quot;&gt;7) 참고 링크 (공식/주요 레퍼런스)&lt;/h2&gt;
&lt;p data-end=&quot;4279&quot; data-start=&quot;4255&quot; data-ke-size=&quot;size16&quot;&gt;아래는 &amp;ldquo;원문 확인용&amp;rdquo;으로 같이 첨부합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;OpenClaw GitHub (공식): &lt;a href=&quot;https://github.com/openclaw/openclaw&quot;&gt;https://github.com/openclaw/openclaw&lt;/a&gt; OpenClaw Docs (공식): &lt;a href=&quot;https://docs.openclaw.ai&quot;&gt;https://docs.openclaw.ai&lt;/a&gt; Ollama &amp;harr; OpenClaw (Ollama 문서): &lt;a href=&quot;https://docs.ollama.com/integrations/openclaw&quot;&gt;https://docs.ollama.com/integrations/openclaw&lt;/a&gt; OpenClaw Ollama Provider (공식): &lt;a href=&quot;https://docs.openclaw.ai/providers/ollama&quot;&gt;https://docs.openclaw.ai/providers/ollama&lt;/a&gt; Playwright MCP Server (공식): &lt;a href=&quot;https://github.com/microsoft/playwright-mcp&quot;&gt;https://github.com/microsoft/playwright-mcp&lt;/a&gt; MCP 서버 모음(공식): &lt;a href=&quot;https://github.com/modelcontextprotocol/servers&quot;&gt;https://github.com/modelcontextprotocol/servers&lt;/a&gt; MCP 예제(공식): &lt;a href=&quot;https://modelcontextprotocol.io/examples&quot;&gt;https://modelcontextprotocol.io/examples&lt;/a&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;4741&quot; data-start=&quot;4738&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;4749&quot; data-start=&quot;4743&quot; data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-end=&quot;4921&quot; data-start=&quot;4750&quot; data-ke-size=&quot;size16&quot;&gt;Mac mini M4 24GB면 OpenClaw 운용 자체는 충분히 됩니다. 다만 체감 품질은 &lt;b&gt;(1) 어떤 모델을 붙이느냐&lt;/b&gt;와 &lt;b&gt;(2) MCP 툴을 어떻게 구성하느냐&lt;/b&gt;, 그리고 &lt;b&gt;(3) 스킬/확장 보안 습관&lt;/b&gt;에서 갈립니다.&lt;/p&gt;</description>
      <category>agents</category>
      <author>jinmc</author>
      <guid isPermaLink="true">https://walkaroundthedevelop.tistory.com/206</guid>
      <comments>https://walkaroundthedevelop.tistory.com/206#entry206comment</comments>
      <pubDate>Wed, 11 Feb 2026 15:53:09 +0900</pubDate>
    </item>
    <item>
      <title>[mcp tools] playwright tool에 관한 설명</title>
      <link>https://walkaroundthedevelop.tistory.com/205</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;LLM 에이전트 시대에 다시 주목받는 브라우저 자동화 도구&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;최근 AI 에이전트, MCP, 자동화와 같은 키워드가 확산되면서 &lt;/span&gt;&lt;b&gt;&lt;span&gt;Playwright&lt;/span&gt;&lt;/b&gt;&lt;span&gt;라는 이름도 자주 등장하고 있습니다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;이 때문에 &amp;ldquo;LLM 전용 라이브러리인가?&amp;rdquo;라고 오해하는 경우가 많은데, 결론부터 말씀드리면 &lt;/span&gt;&lt;b&gt;&lt;span&gt;Playwright는 LLM 라이브러리가 아니라 브라우저 자동화 도구&lt;/span&gt;&lt;/b&gt;&lt;span&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;다만 &lt;/span&gt;&lt;b&gt;&lt;span&gt;AI 에이전트가 실제 웹 환경과 상호작용하기 위해 거의 필수적으로 사용되기 때문에&lt;/span&gt;&lt;/b&gt;&lt;span&gt; LLM 생태계에서 함께 언급되는 경우가 많습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;1. Playwright의 정체&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Playwright는 마이크로소프트에서 개발한 &lt;/span&gt;&lt;b&gt;&lt;span&gt;웹 브라우저 자동 제어 라이브러리&lt;/span&gt;&lt;/b&gt;&lt;span&gt;입니다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;코드를 통해 사람이 브라우저에서 수행하는 다양한 행동을 그대로 재현할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;예를 들면 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;웹사이트 접속&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;버튼 클릭 및 입력 자동화&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;로그인 처리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;스크롤 이동&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;파일 다운로드&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;스크린샷 촬영&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;즉, &lt;/span&gt;&lt;b&gt;&lt;span&gt;사용자의 브라우저 행동을 코드로 자동화하는 도구&lt;/span&gt;&lt;/b&gt;&lt;span&gt;라고 이해하시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;또한 지원 범위도 넓습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;Chromium, Firefox, WebKit 모두 지원&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Node.js, Python, Java, .NET 환경 사용 가능&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;과거에는 Selenium이 널리 사용되었지만,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;현재는 &lt;/span&gt;&lt;b&gt;&lt;span&gt;속도, 안정성, 개발 편의성 측면에서 Playwright로 이동하는 흐름&lt;/span&gt;&lt;/b&gt;&lt;span&gt;이 뚜렷합니다.&lt;/span&gt;&lt;/p&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;2. 그런데 왜 LLM 분야에서 자주 등장할까?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;핵심 이유는 단순합니다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;LLM은 대화를 생성할 수는 있지만, 직접 행동할 수는 없습니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그래서 AI 에이전트 구조에서는 항상 다음과 같은 흐름이 필요합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;LLM &amp;rarr; Tool 호출 &amp;rarr; 외부 환경에서 실제 행동 &amp;rarr; 결과 반환&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;여기서 &lt;/span&gt;&lt;b&gt;&lt;span&gt;웹에서의 실제 행동을 담당하는 대표적인 도구가 바로 Playwright&lt;/span&gt;&lt;/b&gt;&lt;span&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;대표적인 활용 예시는 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;로그인해야 접근 가능한 페이지 데이터 수집&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;검색 &amp;rarr; 페이지 이동 &amp;rarr; 정보 추출 자동화&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;버튼 클릭 이후에만 나타나는 동적 데이터 확보&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;화면 캡처 후 Vision 모델에 전달&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이러한 작업은 단순 HTTP 요청 기반 크롤링으로는 불가능하며,&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span&gt;실제 브라우저 제어가 반드시 필요&lt;/span&gt;&lt;/b&gt;&lt;span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;따라서 다음과 같이 정리할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;Playwright는 LLM의 &amp;lsquo;손과 눈&amp;rsquo; 역할을 수행합니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;3. MCP Tool 구조에서 중요한 이유&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MCP(Model Context Protocol) 환경에서는&lt;/span&gt;&lt;br /&gt;&lt;span&gt;LLM이 외부 시스템을 직접 조작할 수 없고 &lt;/span&gt;&lt;b&gt;&lt;span&gt;반드시 Tool을 통해 행동&lt;/span&gt;&lt;/b&gt;&lt;span&gt;해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이때 Playwright 기반 Tool을 연결하면 다음과 같은 작업이 가능해집니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&amp;ldquo;검색을 수행해 주세요&amp;rdquo;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;ldquo;특정 사이트에 로그인해 주세요&amp;rdquo;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;ldquo;버튼을 눌러 결과를 가져와 주세요&amp;rdquo;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;즉, &lt;/span&gt;&lt;b&gt;&lt;span&gt;AI가 실제 웹을 조작하는 단계&lt;/span&gt;&lt;/b&gt;&lt;span&gt;가 구현됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 때문에 최근 에이전트 아키텍처에서는&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Playwright가 &lt;/span&gt;&lt;b&gt;&lt;span&gt;기본 인프라 구성 요소처럼 사용&lt;/span&gt;&lt;/b&gt;&lt;span&gt;되고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;4. 언제 Playwright를 사용하면 좋을까?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;다음과 같은 상황이라면 Playwright 사용이 적합합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;로그인 기반 데이터 수집이 필요한 경우&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;React, Vue 등 동적 렌더링 페이지 크롤링&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;사용자 행동 시뮬레이션 테스트 자동화&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;AI 에이전트의 웹 액션 실행&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;반대로 &lt;/span&gt;&lt;b&gt;&lt;span&gt;단순 정적 페이지 크롤링&lt;/span&gt;&lt;/b&gt;&lt;span&gt;이라면&lt;/span&gt;&lt;br /&gt;&lt;span&gt;굳이 Playwright까지 사용할 필요는 없습니다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;이 경우에는 &lt;/span&gt;&lt;span&gt;requests&lt;/span&gt;&lt;span&gt;와 &lt;/span&gt;&lt;span&gt;BeautifulSoup&lt;/span&gt;&lt;span&gt; 조합이 더 가볍고 효율적입니다.&lt;/span&gt;&lt;/p&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;5. 한 줄 정리&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span&gt;LLM 전용 라이브러리는 아님&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span&gt;본질은 브라우저 자동화 도구&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;그러나 &lt;/span&gt;&lt;b&gt;&lt;span&gt;AI 에이전트 시대에는 사실상 필수 인프라&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;h2 data-end=&quot;65&quot; data-start=&quot;43&quot; data-ke-size=&quot;size26&quot;&gt;  Playwright 공식 레포&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;217&quot; data-start=&quot;67&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;141&quot; data-start=&quot;67&quot;&gt;&lt;b&gt;Playwright (Node.js, 종합)&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/microsoft/playwright&quot;&gt;https://github.com/microsoft/playwright&lt;/a&gt;&lt;/li&gt;
&lt;li data-end=&quot;217&quot; data-start=&quot;143&quot;&gt;&lt;b&gt;Playwright Python&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/microsoft/playwright-python&quot;&gt;https://github.com/microsoft/playwright-python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>agents</category>
      <author>jinmc</author>
      <guid isPermaLink="true">https://walkaroundthedevelop.tistory.com/205</guid>
      <comments>https://walkaroundthedevelop.tistory.com/205#entry205comment</comments>
      <pubDate>Wed, 11 Feb 2026 15:31:22 +0900</pubDate>
    </item>
    <item>
      <title>맥(Mac)에서 n8n 로컬 서버를 외부로 연결하는 가장 깔끔한 방법 (Cloudflare Tunnel)</title>
      <link>https://walkaroundthedevelop.tistory.com/204</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;n8n은 정말 강력한 워크플로우 자동화 툴입니다. 보통 도커(Docker)나 npm을 통해 맥 로컬(localhost:5678)에 띄워서 사용하곤 하는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 로컬에서만 돌리다 보면 &lt;b&gt;치명적인 단점&lt;/b&gt;이 하나 있습니다. 바로 &lt;b&gt;외부 서비스의 Webhook을 받을 수 없다&lt;/b&gt;는 점입니다. Slack, Google Sheets, GitHub 등 외부 서비스가 내 로컬 n8n에 신호를 보내려면 **공인된 주소(Public URL)**가 필요하기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공유기 포트포워딩은 보안상 찝찝하고, ngrok은 무료 버전 제한이 귀찮습니다. 오늘은 &lt;b&gt;Cloudflare Tunnel&lt;/b&gt;을 이용해 무료이면서도 보안상 안전하게 외부 접속을 허용하는 방법을 정리해 드립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1분 만에 끝나는 **'간편 방법'**과 도메인을 고정해서 쓰는 &lt;b&gt;'정석 방법'&lt;/b&gt; 두 가지가 있으니 상황에 맞춰 골라보세요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;준비물&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Mac&lt;/b&gt; (Homebrew 설치됨)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;n8n&lt;/b&gt; (로컬 5678 포트에서 실행 중)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;(선택)&lt;/b&gt; Cloudflare 계정과 도메인 (정석 방법 사용 시 필요)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;공통 단계: Cloudflared 설치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 방법을 쓰든 Cloudflare의 데몬 툴인 cloudflared가 필요합니다. 터미널을 열고 설치해 줍니다.&lt;/p&gt;
&lt;div&gt;
&lt;div id=&quot;code-textarea-d852d2b4-07db-42b5-aa89-fc3f8e34ec6c-1aaf4131-26d6-4501-af41-25bbca9411ba-29&quot;&gt;
&lt;div aria-hidden=&quot;true&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div contenteditable=&quot;true&quot; data-language=&quot;shell&quot;&gt;
&lt;pre id=&quot;code_1767750673496&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew install cloudflared&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div aria-hidden=&quot;true&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;방법 1: 1분 컷! 초간단 연결 (Quick Tunnel)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;추천 대상:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지금 당장 외부 접속 테스트만 해보고 싶은 분&lt;/li&gt;
&lt;li&gt;도메인이 없는 분&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡한 설정이나 로그인 필요 없이 명령어 한 줄이면 됩니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-textarea-d852d2b4-07db-42b5-aa89-fc3f8e34ec6c-1aaf4131-26d6-4501-af41-25bbca9411ba-38&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div contenteditable=&quot;true&quot; data-language=&quot;shell&quot;&gt;
&lt;pre id=&quot;code_1767750683935&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cloudflared tunnel --url http://localhost:5678&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div aria-hidden=&quot;true&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&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;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-textarea-d852d2b4-07db-42b5-aa89-fc3f8e34ec6c-1aaf4131-26d6-4501-af41-25bbca9411ba-42&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div aria-hidden=&quot;true&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div aria-hidden=&quot;true&quot;&gt;
&lt;pre id=&quot;code_1767750704823&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Your quick Tunnel has been created! Visit it at:
https://random-word-1234.trycloudflare.com&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div aria-hidden=&quot;true&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저 &lt;a href=&quot;https://....trycloudflare.com&quot;&gt;https://....trycloudflare.com&lt;/a&gt; 주소가 바로 여러분의 외부 접속 주소입니다. 브라우저에 입력하면 내 로컬 n8n이 뜹니다!&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⚠️ 주의할 점 (치명적 단점)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식은 프로그램을 껐다 켜거나 재부팅하면 &lt;b&gt;URL 주소가 매번 바뀝니다.&lt;/b&gt;&lt;br /&gt;n8n Webhook URL을 Slack 같은 곳에 등록해 뒀는데, 재부팅할 때마다 주소가 바뀌면 매번 설정을 바꿔줘야 해서 &lt;b&gt;장기적으로 쓰기엔 매우 불편합니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;방법 2: 주소 고정하기 (Named Tunnel)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;추천 대상:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;n8n을 계속 켜두고 자동화를 돌릴 분&lt;/li&gt;
&lt;li&gt;내 도메인(예: n8n.mydomain.com)을 쓰고 싶은 분&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL이 바뀌지 않도록 내 도메인에 고정하는 방법입니다. &lt;b&gt;Cloudflare에 가입되어 있고 도메인이 등록되어 있어야 합니다.&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 로그인&lt;/h3&gt;
&lt;div&gt;
&lt;div id=&quot;code-textarea-d852d2b4-07db-42b5-aa89-fc3f8e34ec6c-1aaf4131-26d6-4501-af41-25bbca9411ba-57&quot;&gt;
&lt;div contenteditable=&quot;true&quot; data-language=&quot;shell&quot;&gt;
&lt;pre id=&quot;code_1765242145096&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cloudflared tunnel login&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div aria-hidden=&quot;true&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저가 뜨면 Cloudflare에 로그인하고 사용할 도메인을 선택(Authorize)해 줍니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 터널 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터널의 이름을 지어줍니다. (예: n8n-local)&lt;/p&gt;
&lt;div&gt;
&lt;div id=&quot;code-textarea-d852d2b4-07db-42b5-aa89-fc3f8e34ec6c-1aaf4131-26d6-4501-af41-25bbca9411ba-62&quot;&gt;
&lt;div contenteditable=&quot;true&quot; data-language=&quot;shell&quot;&gt;
&lt;pre id=&quot;code_1765242152391&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cloudflared tunnel create n8n-local&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div aria-hidden=&quot;true&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 생성되는 **Tunnel ID(UUID)**를 잘 봐두세요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 도메인 연결 (DNS 라우팅)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내 도메인(n8n.mydomain.com)으로 들어오면 방금 만든 터널로 연결되도록 설정합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div id=&quot;code-textarea-d852d2b4-07db-42b5-aa89-fc3f8e34ec6c-1aaf4131-26d6-4501-af41-25bbca9411ba-67&quot;&gt;
&lt;div aria-hidden=&quot;true&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;# 사용법: cloudflared tunnel route dns &amp;lt;터널이름&amp;gt; &amp;lt;서브도메인&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div contenteditable=&quot;true&quot; data-language=&quot;shell&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1765242162012&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cloudflared tunnel route dns n8n-local n8n.mydomain.com&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div aria-hidden=&quot;true&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. n8n 환경변수 설정 (중요!)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n8n에게 **&quot;나의 공식 주소는 &lt;a href=&quot;https://n8n.mydomain.com&quot;&gt;https://n8n.mydomain.com&lt;/a&gt; 야&quot;**라고 알려줘야 합니다. 이 설정을 안 하면 n8n UI에서 Webhook URL을 생성할 때 여전히 localhost 주소를 보여줘서 헷갈립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n8n을 실행할 때 아래 환경변수를 추가해 주세요.&lt;br /&gt;(Docker 사용 시 -e 옵션으로 추가)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1765242172543&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export WEBHOOK_URL=https://n8n.mydomain.com
n8n start&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-textarea-d852d2b4-07db-42b5-aa89-fc3f8e34ec6c-1aaf4131-26d6-4501-af41-25bbca9411ba-74&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div aria-hidden=&quot;true&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 터널 실행&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 마지막으로 터널을 가동합니다.&lt;/p&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1765242182302&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cloudflared tunnel run --url http://localhost:5678 n8n-local&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 &lt;a href=&quot;https://n8n.mydomain.com&quot;&gt;https://n8n.mydomain.com&lt;/a&gt;으로 접속해 보세요. 언제 접속해도 주소가 변하지 않는 나만의 n8n 서버가 완성되었습니다!  &lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;요약: 뭘 써야 하나요?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 방법 1 (Quick Tunnel)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;장점:&lt;/b&gt; 명령어 한 줄로 즉시 실행. 가입 필요 없음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단점:&lt;/b&gt; 재시작하면 주소가 바뀜 (random.trycloudflare.com)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;용도:&lt;/b&gt; &quot;지금 잠깐 테스트만 할래!&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 방법 2 (Named Tunnel)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;장점:&lt;/b&gt; 주소가 영구 고정됨 (n8n.mydomain.com). 안정적.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단점:&lt;/b&gt; Cloudflare 도메인 필요. 초기 설정 필요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;용도:&lt;/b&gt; &quot;제대로 자동화 시스템 구축할래!&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음엔 &lt;b&gt;방법 1&lt;/b&gt;로 통신이 잘 되는지 테스트해 보시고, 본격적으로 n8n 워크플로우를 만드실 때는 &lt;b&gt;방법 2&lt;/b&gt;로 정착하시는 것을 추천합니다.&lt;/p&gt;</description>
      <category>agents</category>
      <author>jinmc</author>
      <guid isPermaLink="true">https://walkaroundthedevelop.tistory.com/204</guid>
      <comments>https://walkaroundthedevelop.tistory.com/204#entry204comment</comments>
      <pubDate>Tue, 9 Dec 2025 10:03:09 +0900</pubDate>
    </item>
    <item>
      <title>Google 에이전트 스택 비교 &amp;mdash; ADK &amp;middot; Agent Builder &amp;middot; Agent Engine &amp;middot; A2A (+ Agent Starter Pack)</title>
      <link>https://walkaroundthedevelop.tistory.com/203</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Google은 에이전트 개발을 &lt;b&gt;프레임워크(ADK)&lt;/b&gt;, &lt;b&gt;전주기 제품군(Agent Builder)&lt;/b&gt;, &lt;b&gt;관리형 런타임(Agent Engine)&lt;/b&gt; 으로 나눠 제공합니다. 이름이 비슷하지만 역할과 책임이 명확히 다르므로, 선택 전에 개념을 정리하시는 게 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;364&quot; data-start=&quot;355&quot; data-ke-size=&quot;size26&quot;&gt;한 줄 정의&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1186&quot; data-start=&quot;365&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;532&quot; data-start=&quot;365&quot;&gt;&lt;b&gt;ADK (Agent Development Kit)&lt;/b&gt;: 오픈소스, 코드 중심 프레임워크입니다. Gemini에 최적화되어 있지만 &lt;b&gt;모델&amp;middot;배포 비종속&lt;/b&gt;(agnostic)으로 설계되어 다른 프레임워크/런타임과도 호환됩니다. &lt;a href=&quot;https://google.github.io/adk-docs/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://google.github.io/adk-docs/&lt;/a&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;span data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;694&quot; data-start=&quot;533&quot;&gt;&lt;b&gt;Vertex AI Agent Builder&lt;/b&gt;: 에이전트 &lt;b&gt;전주기(빌드&amp;rarr;배포&amp;rarr;거버넌스)&lt;/b&gt; 를 아우르는 제품군입니다. 빌드는 ADK 등으로 하고 배포&amp;middot;운영은 Agent Engine을 쓰는 흐름을 가이드합니다. &lt;a href=&quot;https://cloud.google.com/agent-builder/overview&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://cloud.google.com/agent-builder/overview&lt;/a&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;span data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;865&quot; data-start=&quot;695&quot;&gt;&lt;b&gt;Vertex AI Agent Engine&lt;/b&gt;: &lt;b&gt;관리형 런타임/운영&lt;/b&gt; 레이어입니다. 배포&amp;middot;확장&amp;middot;관측&amp;middot;평가&amp;middot;메모리 등 운영 기능을 제공하며, ADK/LangGraph/LangChain 등 &lt;b&gt;여러 프레임워크를 지원&lt;/b&gt;합니다. &lt;a href=&quot;https://cloud.google.com/agent-builder/agent-engine/overview&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://cloud.google.com/agent-builder/agent-engine/overview&lt;/a&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;span data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1023&quot; data-start=&quot;866&quot;&gt;&lt;b&gt;A2A (Agent-to-Agent Protocol)&lt;/b&gt;: 프레임워크/벤더를 가로지르는 &lt;b&gt;에이전트 상호운용 표준&lt;/b&gt;입니다. 현재는 Linux Foundation 산하 오픈 표준으로 문서화되어 있습니다. &lt;a href=&quot;https://a2a-protocol.org/latest/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://a2a-protocol.org/latest/&lt;/a&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;span data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1186&quot; data-start=&quot;1024&quot;&gt;&lt;b&gt;Agent Starter Pack&lt;/b&gt;: Google Cloud용 &lt;b&gt;프로덕션 템플릿/인프라 번들&lt;/b&gt;입니다. 템플릿, CI/CD, 관측, 보안, 그리고 Agent Engine/Cloud Run 배포 흐름을 제공합니다. &lt;a href=&quot;https://github.com/GoogleCloudPlatform/agent-starter-pack&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/GoogleCloudPlatform/agent-starter-pack&lt;/a&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;span data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;1210&quot; data-start=&quot;1193&quot; data-ke-size=&quot;size26&quot;&gt;각 도구를 빠르게 이해하기&lt;/h2&gt;
&lt;h3 data-end=&quot;1242&quot; data-start=&quot;1212&quot; data-ke-size=&quot;size23&quot;&gt;ADK &amp;mdash; &amp;ldquo;코드로 만드는&amp;rdquo; 에이전트 프레임워크&lt;/h3&gt;
&lt;p data-end=&quot;1447&quot; data-start=&quot;1243&quot; data-ke-size=&quot;size16&quot;&gt;에이전트 오케스트레이션, 툴 연동, 멀티에이전트 구성 등을 코드로 설계할 수 있도록 한 모듈식 프레임워크입니다. &lt;b&gt;model/deploy agnostic&lt;/b&gt; 철학을 공식 문서가 명시하고, 샘플 레포와 배포 가이드를 함께 제공합니다. 필요 시 Agent Engine으로 배포하는 경로도 지원합니다. &lt;a href=&quot;https://google.github.io/adk-docs/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://google.github.io/adk-docs/&lt;/a&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;span data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-end=&quot;1483&quot; data-start=&quot;1449&quot; data-ke-size=&quot;size23&quot;&gt;Agent Builder &amp;mdash; &amp;ldquo;전주기를 감싸는&amp;rdquo; 제품군&lt;/h3&gt;
&lt;p data-end=&quot;1684&quot; data-start=&quot;1484&quot; data-ke-size=&quot;size16&quot;&gt;Vertex AI 콘솔과 문서를 중심으로, &lt;b&gt;빌드(ADK 등 프레임워크)&lt;/b&gt; &amp;rarr; &lt;b&gt;스케일(Agent Engine)&lt;/b&gt; &amp;rarr; &lt;b&gt;거버넌스/관측&lt;/b&gt; 흐름을 제공합니다. 구성 요소로 Sessions, Memory Bank, Code Execution, Example Store 등이 연결됩니다. &lt;a href=&quot;https://cloud.google.com/agent-builder/overview&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://cloud.google.com/agent-builder/overview&lt;/a&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;span data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-end=&quot;1723&quot; data-start=&quot;1686&quot; data-ke-size=&quot;size23&quot;&gt;Agent Engine &amp;mdash; &amp;ldquo;운영을 책임지는&amp;rdquo; 관리형 런타임&lt;/h3&gt;
&lt;p data-end=&quot;2028&quot; data-start=&quot;1724&quot; data-ke-size=&quot;size16&quot;&gt;프로덕션 배포&amp;middot;확장&amp;middot;관측(Trace/Logging/Monitoring)과 &lt;b&gt;Memory Bank, Sessions, Evaluation, Code Execution&lt;/b&gt; 등을 제공하며, &lt;b&gt;ADK&amp;middot;LangChain&amp;middot;LangGraph&amp;middot;AG2&amp;middot;LlamaIndex 등&lt;/b&gt; 다양한 프레임워크 지원 상태를 표로 명시합니다(&amp;ldquo;Full/SDK Integration/Custom template&amp;rdquo; 구분). 또한 &lt;b&gt;Agent Starter Pack&lt;/b&gt;과의 연결을 공식 가이드에서 권장합니다. &lt;a href=&quot;https://cloud.google.com/agent-builder/agent-engine/overview&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://cloud.google.com/agent-builder/agent-engine/overview&lt;/a&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;span data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-end=&quot;2058&quot; data-start=&quot;2030&quot; data-ke-size=&quot;size23&quot;&gt;A2A &amp;mdash; &amp;ldquo;프레임워크를 넘나드는&amp;rdquo; 상호운용&lt;/h3&gt;
&lt;p data-end=&quot;2246&quot; data-start=&quot;2059&quot; data-ke-size=&quot;size16&quot;&gt;에이전트가 서로를 &lt;b&gt;발견&amp;middot;위임&amp;middot;협업&lt;/b&gt;할 수 있게 하는 표준입니다. 내부 기억/툴/로직을 공유하지 않고 메시지 규격만으로 상호작용하도록 설계되어 보안성과 벤더 중립성을 동시에 지향합니다. MCP와는 &lt;b&gt;에이전트&amp;harr;툴&lt;/b&gt;과 &lt;b&gt;에이전트&amp;harr;에이전트&lt;/b&gt;로 역할을 분담합니다. &lt;a href=&quot;https://a2a-protocol.org/latest/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://a2a-protocol.org/latest/&lt;/a&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;span data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-end=&quot;2280&quot; data-start=&quot;2248&quot; data-ke-size=&quot;size23&quot;&gt;Agent Starter Pack &amp;mdash; &amp;ldquo;운영 뼈대&amp;rdquo;&lt;/h3&gt;
&lt;p data-end=&quot;2518&quot; data-start=&quot;2281&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ReAct, RAG, 멀티에이전트, 실시간(라이브) 에이전트&lt;/b&gt; 등 템플릿과 함께, &lt;b&gt;Terraform 기반 인프라&amp;middot;CI/CD(GCB/GitHub Actions)&amp;middot;관측(Cloud Trace/Logging)&lt;/b&gt; 구성을 포함합니다. &lt;b&gt;Agent Engine/Cloud Run&lt;/b&gt; 배포 플로우와 &lt;b&gt;ADK&amp;middot;A2A 베이스 템플릿&lt;/b&gt;도 포함되어 있습니다.&lt;a href=&quot;https://github.com/GoogleCloudPlatform/agent-starter-pack&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt; https://github.com/GoogleCloudPlatform/agent-starter-pack&lt;/a&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;span data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr data-end=&quot;2523&quot; data-start=&quot;2520&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2544&quot; data-start=&quot;2525&quot; data-ke-size=&quot;size26&quot;&gt;권장 아키텍처(현실적인 흐름)&lt;/h2&gt;
&lt;p data-end=&quot;2737&quot; data-start=&quot;2545&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ADK로 로컬/개발 환경에서 빌드&amp;middot;테스트 &amp;rarr; Agent Engine으로 배포/운영(관측&amp;middot;보안&amp;middot;평가) &amp;rarr; Agent Builder로 전주기 관리 &amp;rarr; 필요 시 A2A로 멀티에이전트/이기종 연동&lt;/b&gt;, 인프라는 Agent Starter Pack으로 표준화하시는 것을 권합니다.&amp;nbsp;&lt;span data-state=&quot;closed&quot;&gt;&lt;span data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;2737&quot; data-start=&quot;2545&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;a href=&quot;https://cloud.google.com/agent-builder/overview&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://cloud.google.com/agent-builder/overview&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-end=&quot;2756&quot; data-start=&quot;2744&quot; data-ke-size=&quot;size26&quot;&gt;기능 비교 한눈에&lt;/h2&gt;
&lt;div&gt;&lt;br /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 157px;&quot; border=&quot;1&quot; data-end=&quot;3425&quot; data-start=&quot;2758&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;항목&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;ADK&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;Agent Builder&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;Agent Engine&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;A2A&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;Agent Starter Pack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot; data-end=&quot;2923&quot; data-start=&quot;2855&quot;&gt;
&lt;td style=&quot;height: 40px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2860&quot; data-start=&quot;2855&quot;&gt;역할&lt;/td&gt;
&lt;td style=&quot;height: 40px;&quot; data-end=&quot;2874&quot; data-start=&quot;2860&quot; data-col-size=&quot;sm&quot;&gt;코드 기반 프레임워크&lt;/td&gt;
&lt;td style=&quot;height: 40px;&quot; data-end=&quot;2884&quot; data-start=&quot;2874&quot; data-col-size=&quot;sm&quot;&gt;전주기 제품군&lt;/td&gt;
&lt;td style=&quot;height: 40px;&quot; data-end=&quot;2897&quot; data-start=&quot;2884&quot; data-col-size=&quot;sm&quot;&gt;관리형 런타임/운영&lt;/td&gt;
&lt;td style=&quot;height: 40px;&quot; data-end=&quot;2907&quot; data-start=&quot;2897&quot; data-col-size=&quot;sm&quot;&gt;상호운용 표준&lt;/td&gt;
&lt;td style=&quot;height: 40px;&quot; data-end=&quot;2923&quot; data-start=&quot;2907&quot; data-col-size=&quot;sm&quot;&gt;프로덕션 템플릿/인프라&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot; data-end=&quot;3002&quot; data-start=&quot;2924&quot;&gt;
&lt;td style=&quot;height: 20px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2930&quot; data-start=&quot;2924&quot;&gt;개방성&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot; data-end=&quot;2948&quot; data-start=&quot;2930&quot; data-col-size=&quot;sm&quot;&gt;오픈소스, 모델/배포 비종속&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot; data-end=&quot;2963&quot; data-start=&quot;2948&quot; data-col-size=&quot;sm&quot;&gt;Vertex AI 제품&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot; data-end=&quot;2982&quot; data-start=&quot;2963&quot; data-col-size=&quot;sm&quot;&gt;Google Cloud 서비스&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot; data-end=&quot;2990&quot; data-start=&quot;2982&quot; data-col-size=&quot;sm&quot;&gt;오픈 표준&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot; data-end=&quot;3002&quot; data-start=&quot;2990&quot; data-col-size=&quot;sm&quot;&gt;오픈소스(레포)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot; data-end=&quot;3109&quot; data-start=&quot;3003&quot;&gt;
&lt;td style=&quot;height: 40px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;3011&quot; data-start=&quot;3003&quot;&gt;주요 기능&lt;/td&gt;
&lt;td style=&quot;height: 40px;&quot; data-end=&quot;3035&quot; data-start=&quot;3011&quot; data-col-size=&quot;sm&quot;&gt;오케스트레이션, 멀티에이전트, 툴 연동&lt;/td&gt;
&lt;td style=&quot;height: 40px;&quot; data-end=&quot;3056&quot; data-start=&quot;3035&quot; data-col-size=&quot;sm&quot;&gt;Build&amp;middot;Scale&amp;middot;Govern&lt;/td&gt;
&lt;td style=&quot;height: 40px;&quot; data-end=&quot;3075&quot; data-start=&quot;3056&quot; data-col-size=&quot;sm&quot;&gt;배포&amp;middot;스케일&amp;middot;관측&amp;middot;평가&amp;middot;메모리&lt;/td&gt;
&lt;td style=&quot;height: 40px;&quot; data-end=&quot;3090&quot; data-start=&quot;3075&quot; data-col-size=&quot;sm&quot;&gt;에이전트 간 통신 규격&lt;/td&gt;
&lt;td style=&quot;height: 40px;&quot; data-end=&quot;3109&quot; data-start=&quot;3090&quot; data-col-size=&quot;sm&quot;&gt;템플릿&amp;middot;CI/CD&amp;middot;관측&amp;middot;보안&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot; data-end=&quot;3205&quot; data-start=&quot;3110&quot;&gt;
&lt;td style=&quot;height: 40px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;3121&quot; data-start=&quot;3110&quot;&gt;프레임워크 호환&lt;/td&gt;
&lt;td style=&quot;height: 40px;&quot; data-end=&quot;3125&quot; data-start=&quot;3121&quot; data-col-size=&quot;sm&quot;&gt;&amp;ndash;&lt;/td&gt;
&lt;td style=&quot;height: 40px;&quot; data-end=&quot;3133&quot; data-start=&quot;3125&quot; data-col-size=&quot;sm&quot;&gt;상위 개념&lt;/td&gt;
&lt;td style=&quot;height: 40px;&quot; data-end=&quot;3164&quot; data-start=&quot;3133&quot; data-col-size=&quot;sm&quot;&gt;ADK&amp;middot;LangGraph&amp;middot;LangChain 등 지원&lt;/td&gt;
&lt;td style=&quot;height: 40px;&quot; data-end=&quot;3180&quot; data-start=&quot;3164&quot; data-col-size=&quot;sm&quot;&gt;프레임워크 불문 상호운용&lt;/td&gt;
&lt;td style=&quot;height: 40px;&quot; data-end=&quot;3205&quot; data-start=&quot;3180&quot; data-col-size=&quot;sm&quot;&gt;ADK&amp;middot;LangGraph&amp;middot;A2A 템플릿&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3430&quot; data-start=&quot;3427&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3441&quot; data-start=&quot;3432&quot; data-ke-size=&quot;size26&quot;&gt;선택 가이드&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3974&quot; data-start=&quot;3442&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3559&quot; data-start=&quot;3442&quot;&gt;&lt;b&gt;코드 유연성이 최우선&lt;/b&gt;이시면, ADK로 시작하신 뒤 운영 요구가 생기면 Agent Engine에 올리시는 구성이 합리적입니다.&amp;nbsp;&lt;span data-state=&quot;closed&quot;&gt;&lt;span data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;3689&quot; data-start=&quot;3560&quot;&gt;&lt;b&gt;조직 단위 거버넌스/표준화&lt;/b&gt;가 필요하시면, Agent Builder 관점에서 설계하고 런타임은 Agent Engine을 기본값으로 두시길 권합니다.&amp;nbsp;&lt;span data-state=&quot;closed&quot;&gt;&lt;span data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;3854&quot; data-start=&quot;3690&quot;&gt;&lt;b&gt;프로덕션 운영(관측&amp;middot;보안&amp;middot;평가&amp;middot;장기 메모리)&lt;/b&gt; 을 전제로 하시면, Agent Engine의 관리형 기능을 우선 고려하시고, 배포 뼈대는 Agent Starter Pack으로 고정하시는 게 유지보수에 유리합니다.&amp;nbsp;&lt;span data-state=&quot;closed&quot;&gt;&lt;span data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;3974&quot; data-start=&quot;3855&quot;&gt;&lt;b&gt;멀티에이전트/이기종 프레임워크 연동&lt;/b&gt; 방향이면, 초기 설계에서 A2A 메시지 스키마를 포함해 두시면 재작업 비용을 줄일 수 있습니다.&amp;nbsp;&lt;span data-state=&quot;closed&quot;&gt;&lt;span data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3979&quot; data-start=&quot;3976&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3989&quot; data-start=&quot;3981&quot; data-ke-size=&quot;size26&quot;&gt;참고 자료&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4604&quot; data-start=&quot;3990&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4111&quot; data-start=&quot;3990&quot;&gt;&lt;b&gt;ADK 개요/철학/배포 경로&lt;/b&gt;: ADK Docs &amp;amp; GitHub(모델&amp;middot;배포 비종속 명시, Agent Engine 배포 가이드 포함).&amp;nbsp;&lt;span data-state=&quot;closed&quot;&gt;&lt;span data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;4219&quot; data-start=&quot;4112&quot;&gt;&lt;b&gt;Agent Builder 개요&lt;/b&gt;: 전주기 제품군 정의 및 &amp;ldquo;ADK로 빌드, Engine으로 배포&amp;rdquo; 워크플로.&amp;nbsp;&lt;span data-state=&quot;closed&quot;&gt;&lt;span data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;4398&quot; data-start=&quot;4220&quot;&gt;&lt;b&gt;Agent Engine 개요&lt;/b&gt;: 런타임&amp;middot;평가&amp;middot;Sessions&amp;middot;Memory Bank&amp;middot;Code Execution, &lt;b&gt;지원 프레임워크 표&lt;/b&gt;, &lt;b&gt;Agent Starter Pack 연계&lt;/b&gt;. 마지막 업데이트: 2025-11-05(UTC).&amp;nbsp;&lt;span data-state=&quot;closed&quot;&gt;&lt;span data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;4481&quot; data-start=&quot;4399&quot;&gt;&lt;b&gt;A2A 공식 문서&lt;/b&gt;: 표준 소개, 핵심 개념, MCP와의 관계.&amp;nbsp;&lt;span data-state=&quot;closed&quot;&gt;&lt;span data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;4604&quot; data-start=&quot;4482&quot;&gt;&lt;b&gt;Agent Starter Pack&lt;/b&gt;: 템플릿 목록(ADK/A2A 포함), CI/CD&amp;middot;관측&amp;middot;보안 구성, Engine/Cloud Run 배포.&amp;nbsp;&lt;span data-state=&quot;closed&quot;&gt;&lt;span data-testid=&quot;webpage-citation-pill&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>agents</category>
      <author>jinmc</author>
      <guid isPermaLink="true">https://walkaroundthedevelop.tistory.com/203</guid>
      <comments>https://walkaroundthedevelop.tistory.com/203#entry203comment</comments>
      <pubDate>Fri, 7 Nov 2025 13:35:45 +0900</pubDate>
    </item>
    <item>
      <title>  n8n을 인트라넷 전용으로 만들기 (인터넷 차단하기)</title>
      <link>https://walkaroundthedevelop.tistory.com/202</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;회사 내부에서 n8n을 쓰다 보면 &amp;ldquo;혹시 n8n에서 인터넷으로 데이터가 빠져나가면 어떡하지?&amp;rdquo; 하는 걱정이 생깁니다.&lt;br /&gt;저희도 똑같은 고민을 했고, 결국 &lt;b&gt;n8n은 인트라넷만 쓰고, 인터넷은 절대 못 쓰게&lt;/b&gt; 만드는 방법을 찾았습니다.&lt;br /&gt;아래처럼 하면 됩니다. ✨&lt;/p&gt;
&lt;hr data-end=&quot;274&quot; data-start=&quot;271&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;284&quot; data-start=&quot;276&quot; data-ke-size=&quot;size26&quot;&gt;1. 준비&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;359&quot; data-start=&quot;285&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;333&quot; data-start=&quot;285&quot;&gt;n8n은 Docker + docker-compose로 돌리고 있다고 가정합니다.&lt;/li&gt;
&lt;li data-end=&quot;359&quot; data-start=&quot;334&quot;&gt;서버는 회사 내부망에 연결돼 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;444&quot; data-start=&quot;361&quot; data-ke-size=&quot;size16&quot;&gt;※ 여기서는 예시로 &lt;b&gt;192.168.100.0/24&lt;/b&gt; 대역을 사용합니다.   실제 적용 시에는 &lt;b&gt;각자 회사 내부망 대역&lt;/b&gt;에 맞춰 수정하세요.&lt;/p&gt;
&lt;hr data-end=&quot;449&quot; data-start=&quot;446&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;474&quot; data-start=&quot;451&quot; data-ke-size=&quot;size26&quot;&gt;2. 방화벽 규칙 세팅 (진짜 핵심)&lt;/h2&gt;
&lt;p data-end=&quot;546&quot; data-start=&quot;476&quot; data-ke-size=&quot;size16&quot;&gt;리눅스 서버에서 아래 명령어를 실행합니다.&lt;br /&gt;(관리자 권한 필요 &amp;rarr; sudo su 하거나 각 줄마다 sudo 붙이기)&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;# (1) DOCKER-USER 체인을 싹 비웁니다.&lt;/span&gt;&lt;/span&gt;&lt;span&gt; iptables -F DOCKER-USER &lt;/span&gt;&lt;span&gt;&lt;span&gt;# (2) 기존 연결은 그대로 허용&lt;/span&gt;&lt;/span&gt;&lt;span&gt; iptables -A DOCKER-USER -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT &lt;/span&gt;&lt;span&gt;&lt;span&gt;# (3) 도커 컨테이너 &amp;rarr; 회사 내부망(예: 192.168.100.0/24)만 허용&lt;/span&gt;&lt;/span&gt;&lt;span&gt; iptables -A DOCKER-USER -i br+ -d 192.168.100.0/24 -j ACCEPT iptables -A DOCKER-USER -i docker0 -d 192.168.100.0/24 -j ACCEPT &lt;/span&gt;&lt;span&gt;&lt;span&gt;# (4) 나머지 전부 차단 (즉, 인터넷은 막힘)&lt;/span&gt;&lt;/span&gt;&lt;span&gt; iptables -A DOCKER-USER -i br+ -j DROP iptables -A DOCKER-USER -i docker0 -j DROP &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1060&quot; data-start=&quot;1008&quot; data-ke-size=&quot;size16&quot;&gt;  이렇게 하면 &lt;b&gt;n8n 컨테이너는 인트라넷만 통신 가능, 인터넷은 완전히 차단&lt;/b&gt;됩니다.&lt;/p&gt;
&lt;hr data-end=&quot;1065&quot; data-start=&quot;1062&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1077&quot; data-start=&quot;1067&quot; data-ke-size=&quot;size26&quot;&gt;3. 확인하기&lt;/h2&gt;
&lt;h3 data-end=&quot;1101&quot; data-start=&quot;1079&quot; data-ke-size=&quot;size23&quot;&gt;① 내부망 테스트 (통과해야 함)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;docker &lt;/span&gt;&lt;span&gt;&lt;span&gt;exec&lt;/span&gt;&lt;/span&gt;&lt;span&gt; -it n8n ping -c 3 192.168.100.10 &lt;/span&gt;&lt;span&gt;&lt;span&gt;# 내부 서버 IP (각자 환경에 맞게 수정)&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1209&quot; data-start=&quot;1188&quot; data-ke-size=&quot;size23&quot;&gt;② 외부망 테스트 (막혀야 함)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;docker &lt;/span&gt;&lt;span&gt;&lt;span&gt;exec&lt;/span&gt;&lt;/span&gt;&lt;span&gt; -it n8n sh -lc &lt;/span&gt;&lt;span&gt;&lt;span&gt;'wget -qO- --timeout=5 http://1.1.1.1; echo &quot;exit code=$?&quot;'&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1369&quot; data-start=&quot;1309&quot; data-ke-size=&quot;size16&quot;&gt;  download timed out 같은 메시지가 나오면 성공입니다.&lt;br /&gt;즉, 인터넷은 막혔다는 뜻!&lt;/p&gt;
&lt;hr data-end=&quot;1374&quot; data-start=&quot;1371&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1389&quot; data-start=&quot;1376&quot; data-ke-size=&quot;size26&quot;&gt;4. 영구 저장하기&lt;/h2&gt;
&lt;p data-end=&quot;1410&quot; data-start=&quot;1390&quot; data-ke-size=&quot;size16&quot;&gt;재부팅해도 규칙이 유지되도록 하려면:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;apt-get update apt-get install -y netfilter-persistent netfilter-persistent save &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1509&quot; data-start=&quot;1506&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1536&quot; data-start=&quot;1511&quot; data-ke-size=&quot;size26&quot;&gt;5. 추가 보안 설정 (n8n 환경변수)&lt;/h2&gt;
&lt;p data-end=&quot;1584&quot; data-start=&quot;1538&quot; data-ke-size=&quot;size16&quot;&gt;docker-compose.yml 안에 아래 환경변수를 추가하면 더 안전합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;environment:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;N8N_DIAGNOSTICS_ENABLED=false&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;# 텔레메트리 끄기&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;N8N_VERSION_NOTIFICATIONS_ENABLED=false&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;N8N_TEMPLATES_ENABLED=false&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;N8N_COMMUNITY_PACKAGES_ENABLED=false&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;# 커스텀 노드 설치 금지&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;NODES_EXCLUDE=[&quot;n8n-nodes-base.httpRequest&quot;,&quot;n8n-nodes-base.smtp&quot;,&quot;n8n-nodes-base.slack&quot;,&quot;n8n-nodes-base.executeCommand&quot;,&quot;n8n-nodes-base.code&quot;]&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;N8N_SECURE_COOKIE=false&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;# (테스트용, 운영은 HTTPS 권장)&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1998&quot; data-start=&quot;1995&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2008&quot; data-start=&quot;2000&quot; data-ke-size=&quot;size26&quot;&gt;6. 결론&lt;/h2&gt;
&lt;p data-end=&quot;2018&quot; data-start=&quot;2009&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 세팅하면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2134&quot; data-start=&quot;2020&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2051&quot; data-start=&quot;2020&quot;&gt;✅ n8n은 &lt;b&gt;회사 내부 시스템&lt;/b&gt;만 접근 가능&lt;/li&gt;
&lt;li data-end=&quot;2091&quot; data-start=&quot;2052&quot;&gt;❌ &lt;b&gt;외부 인터넷으로는 절대 못 나감&lt;/b&gt; (데이터 유출 방지)&lt;/li&gt;
&lt;li data-end=&quot;2134&quot; data-start=&quot;2092&quot;&gt;  추가로 n8n 자체의 위험한 노드나 커스텀 노드도 막을 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2139&quot; data-start=&quot;2136&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2152&quot; data-start=&quot;2141&quot; data-ke-size=&quot;size26&quot;&gt;✨ 한 줄 요약&lt;/h2&gt;
&lt;blockquote data-end=&quot;2222&quot; data-start=&quot;2153&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2222&quot; data-start=&quot;2155&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;DOCKER-USER 체인에 인트라넷만 허용하고 나머지 DROP&amp;rdquo; &amp;rarr; 이걸로 n8n은 내부 전용 서비스가 된다!&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <category>Deep Learning/NLP</category>
      <author>jinmc</author>
      <guid isPermaLink="true">https://walkaroundthedevelop.tistory.com/202</guid>
      <comments>https://walkaroundthedevelop.tistory.com/202#entry202comment</comments>
      <pubDate>Thu, 25 Sep 2025 17:23:11 +0900</pubDate>
    </item>
    <item>
      <title>  딥러닝 환경을 위한 Multi-CUDA 설치의 필요성과 실전 가이드</title>
      <link>https://walkaroundthedevelop.tistory.com/201</link>
      <description>&lt;h2 data-end=&quot;301&quot; data-start=&quot;276&quot; data-ke-size=&quot;size26&quot;&gt;1.   왜 CUDA 버전이 문제일까?&lt;/h2&gt;
&lt;p data-end=&quot;367&quot; data-start=&quot;303&quot; data-ke-size=&quot;size16&quot;&gt;딥러닝 프레임워크(TensorFlow, PyTorch 등)는 &lt;b&gt;특정 CUDA 버전과만 호환&lt;/b&gt;됩니다. 예를 들어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;463&quot; data-start=&quot;369&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;418&quot; data-start=&quot;369&quot;&gt;&lt;b&gt;TensorFlow 2.13&lt;/b&gt; &amp;rarr; &lt;b&gt;CUDA 11.8&lt;/b&gt; + cuDNN 8.6&lt;/li&gt;
&lt;li data-end=&quot;463&quot; data-start=&quot;419&quot;&gt;&lt;b&gt;PyTorch 2.1&lt;/b&gt; &amp;rarr; 기본적으로 &lt;b&gt;CUDA 12.x&lt;/b&gt;까지 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;596&quot; data-start=&quot;465&quot; data-ke-size=&quot;size16&quot;&gt;그런데 시스템에 최신 CUDA(예: 12.8)가 설치되어 있다고 해서 &lt;b&gt;모든 프레임워크가 자동으로 잘 작동하지는 않습니다.&lt;/b&gt;&lt;br /&gt;오히려 맞지 않는 버전이면 GPU를 전혀 사용하지 못하고, CPU로만 실행되어 성능 저하가 발생합니다.&lt;/p&gt;
&lt;hr data-end=&quot;601&quot; data-start=&quot;598&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;631&quot; data-start=&quot;603&quot; data-ke-size=&quot;size26&quot;&gt;2. ⚠️ 기존 CUDA를 지우는 건 위험하다&lt;/h2&gt;
&lt;p data-end=&quot;663&quot; data-start=&quot;633&quot; data-ke-size=&quot;size16&quot;&gt;많은 분들이 이 오류 메시지를 보면 이렇게 생각합니다:&lt;/p&gt;
&lt;blockquote data-end=&quot;706&quot; data-start=&quot;665&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;706&quot; data-start=&quot;667&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;CUDA 버전을 바꿔야 하니까 기존 걸 삭제하고 다시 설치해야겠다!&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;725&quot; data-start=&quot;708&quot; data-ke-size=&quot;size16&quot;&gt;하지만 이는 위험한 선택입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;821&quot; data-start=&quot;727&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;769&quot; data-start=&quot;727&quot;&gt;다른 프로젝트나 프레임워크에 &lt;b&gt;의도치 않은 영향을 줄 수 있습니다.&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;821&quot; data-start=&quot;770&quot;&gt;시스템 전체에 설치된 CUDA를 제거하면 &lt;b&gt;다른 ML 환경이 망가질 수도 있습니다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;826&quot; data-start=&quot;823&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;859&quot; data-start=&quot;828&quot; data-ke-size=&quot;size26&quot;&gt;3. ✅ 해결책은? Multi-CUDA 환경 설정!&lt;/h2&gt;
&lt;p data-end=&quot;935&quot; data-start=&quot;861&quot; data-ke-size=&quot;size16&quot;&gt;Multi-CUDA는 말 그대로, &lt;b&gt;여러 개의 CUDA 버전을 동시에 설치&lt;/b&gt;하고 필요할 때마다 그 중 하나를 사용하는 방법입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1096&quot; data-start=&quot;937&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;962&quot; data-start=&quot;937&quot;&gt;시스템 CUDA 12.8은 그대로 유지 ✅&lt;/li&gt;
&lt;li data-end=&quot;1007&quot; data-start=&quot;963&quot;&gt;CUDA 11.8은 /opt/cuda-11.8 같은 별도 경로에 설치 ✅&lt;/li&gt;
&lt;li data-end=&quot;1096&quot; data-start=&quot;1008&quot;&gt;사용하려는 환경(Python/conda env)에서 &lt;b&gt;LD_LIBRARY_PATH&lt;/b&gt;와 &lt;b&gt;PATH&lt;/b&gt;만 설정하여 CUDA 11.8을 사용하도록 설정 ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1101&quot; data-start=&quot;1098&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1135&quot; data-start=&quot;1103&quot; data-ke-size=&quot;size26&quot;&gt;4.   Multi-CUDA가 필요한 대표적인 상황&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;상황설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1390&quot; data-start=&quot;1137&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1390&quot; data-start=&quot;1165&quot;&gt;
&lt;tr data-end=&quot;1227&quot; data-start=&quot;1165&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1200&quot; data-start=&quot;1165&quot;&gt;TensorFlow와 PyTorch를 둘 다 사용하는 경우&lt;/td&gt;
&lt;td data-end=&quot;1227&quot; data-start=&quot;1200&quot; data-col-size=&quot;sm&quot;&gt;서로 요구하는 CUDA 버전이 다르기 때문&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1281&quot; data-start=&quot;1228&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1258&quot; data-start=&quot;1228&quot;&gt;회사/팀에서 다양한 CUDA 기반 툴을 쓰는 경우&lt;/td&gt;
&lt;td data-end=&quot;1281&quot; data-start=&quot;1258&quot; data-col-size=&quot;sm&quot;&gt;시스템 CUDA를 바꿀 수 없을 때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1335&quot; data-start=&quot;1282&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1309&quot; data-start=&quot;1282&quot;&gt;Docker를 쓰지 않는 로컬 개발 환경에서&lt;/td&gt;
&lt;td data-end=&quot;1335&quot; data-start=&quot;1309&quot; data-col-size=&quot;sm&quot;&gt;독립적인 CUDA 환경 구성이 필요할 때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1390&quot; data-start=&quot;1336&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1370&quot; data-start=&quot;1336&quot;&gt;커스텀 빌드의 CUDA 의존성이 있는 라이브러리 사용 시&lt;/td&gt;
&lt;td data-end=&quot;1390&quot; data-start=&quot;1370&quot; data-col-size=&quot;sm&quot;&gt;예: TensorRT, XLA&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1395&quot; data-start=&quot;1392&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1429&quot; data-start=&quot;1397&quot; data-ke-size=&quot;size26&quot;&gt;5.   Multi-CUDA 설치 및 설정 (요약)&lt;/h2&gt;
&lt;h3 data-end=&quot;1460&quot; data-start=&quot;1431&quot; data-ke-size=&quot;size23&quot;&gt;① CUDA 11.8 설치 (시스템과 별도로)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1752136427504&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo mkdir -p /opt/cuda-11.8 cd /tmp 

wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run 

chmod +x cuda_11.8.0_520.61.05_linux.run sudo ./cuda_11.8.0_520.61.05_linux.run --silent --toolkit --installpath=/opt/cuda-11.8&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1770&quot; data-start=&quot;1752&quot; data-ke-size=&quot;size23&quot;&gt;② cuDNN 8.6 설치&lt;/h3&gt;
&lt;p data-end=&quot;1792&quot; data-start=&quot;1772&quot; data-ke-size=&quot;size16&quot;&gt;cuDNN 아카이브에서 다운로드 후:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1752136453440&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tar -xzvf cudnn-8.6-linux-x64.tgz sudo cp cuda/include/* /opt/cuda-11.8/include/ 
sudo cp cuda/lib64/* /opt/cuda-11.8/lib64/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1961&quot; data-start=&quot;1931&quot; data-ke-size=&quot;size23&quot;&gt;③ Conda 환경에서만 CUDA 11.8 사용&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1752136497972&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 활성화된 conda env 내에 환경 변수 자동 설정 
mkdir -p $CONDA_PREFIX/etc/conda/activate.d 
echo 'export PATH=/opt/cuda-11.8/bin:$PATH' &amp;gt;&amp;gt; $CONDA_PREFIX/etc/conda/activate.d/env.sh 
echo 'export LD_LIBRARY_PATH=/opt/cuda-11.8/lib64:$LD_LIBRARY_PATH' &amp;gt;&amp;gt; $CONDA_PREFIX/etc/conda/activate.d/env.sh&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2257&quot; data-start=&quot;2254&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2284&quot; data-start=&quot;2259&quot; data-ke-size=&quot;size26&quot;&gt;6. ✅ GPU가 제대로 인식되는지 확인&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1752136517817&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python -c &quot;import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1752136534743&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;2471&quot; data-start=&quot;2468&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2507&quot; data-start=&quot;2473&quot; data-ke-size=&quot;size26&quot;&gt;7. ✨ 정리: Multi-CUDA는 선택이 아니라 필수&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;항목내용
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2692&quot; data-start=&quot;2509&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2692&quot; data-start=&quot;2537&quot;&gt;
&lt;tr data-end=&quot;2567&quot; data-start=&quot;2537&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2556&quot; data-start=&quot;2537&quot;&gt;기존 CUDA 제거 필요 여부&lt;/td&gt;
&lt;td data-end=&quot;2567&quot; data-start=&quot;2556&quot; data-col-size=&quot;sm&quot;&gt;❌ 필요 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2611&quot; data-start=&quot;2568&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2587&quot; data-start=&quot;2568&quot;&gt;여러 CUDA 공존 가능 여부&lt;/td&gt;
&lt;td data-end=&quot;2611&quot; data-start=&quot;2587&quot; data-col-size=&quot;sm&quot;&gt;✅ 가능 (버전 별 디렉토리로 분리)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2662&quot; data-start=&quot;2612&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2629&quot; data-start=&quot;2612&quot;&gt;Conda 환경 격리 설정&lt;/td&gt;
&lt;td data-end=&quot;2662&quot; data-start=&quot;2629&quot; data-col-size=&quot;sm&quot;&gt;✅ PATH/LD_LIBRARY_PATH로 제어 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2692&quot; data-start=&quot;2663&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2669&quot; data-start=&quot;2663&quot;&gt;리스크&lt;/td&gt;
&lt;td data-end=&quot;2692&quot; data-start=&quot;2669&quot; data-col-size=&quot;sm&quot;&gt;거의 없음 (루트 경로 안 건드림)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2697&quot; data-start=&quot;2694&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2708&quot; data-start=&quot;2699&quot; data-ke-size=&quot;size26&quot;&gt;  마무리&lt;/h2&gt;
&lt;p data-end=&quot;2861&quot; data-start=&quot;2710&quot; data-ke-size=&quot;size16&quot;&gt;딥러닝 프로젝트를 여러 개 운영하거나, TensorFlow와 PyTorch를 동시에 써야 하는 상황이라면 Multi-CUDA 환경 구축은 거의 &lt;b&gt;필수에 가깝습니다.&lt;/b&gt; 이 글에서 소개한 방식은 시스템을 깨뜨리지 않으면서도 안정적으로 CUDA 환경을 구성하는 방법입니다.&lt;/p&gt;
&lt;p data-end=&quot;2958&quot; data-start=&quot;2863&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;기존 CUDA를 지우지 않고 새로운 CUDA 버전으로 TensorFlow를 GPU에서 돌리는 법&amp;rdquo;&lt;/b&gt;&lt;br /&gt;이 주제에 고민이 있었다면, 이제는 걱정 없이 도전해보세요!&lt;/p&gt;</description>
      <category>환경설정</category>
      <author>jinmc</author>
      <guid isPermaLink="true">https://walkaroundthedevelop.tistory.com/201</guid>
      <comments>https://walkaroundthedevelop.tistory.com/201#entry201comment</comments>
      <pubDate>Thu, 10 Jul 2025 17:35:53 +0900</pubDate>
    </item>
    <item>
      <title>  BM25란 무엇인가? (TF-IDF와의 비교 및 이후 발전)</title>
      <link>https://walkaroundthedevelop.tistory.com/200</link>
      <description>&lt;h2 data-end=&quot;147&quot; data-start=&quot;123&quot; data-ke-size=&quot;size26&quot;&gt;1. 왜 TF-IDF만으로는 부족할까?&lt;/h2&gt;
&lt;p data-end=&quot;243&quot; data-start=&quot;149&quot; data-ke-size=&quot;size16&quot;&gt;검색 시스템이나 정보 검색(IR) 분야에서는 문서 내 특정 단어가 &lt;b&gt;얼마나 중요한지&lt;/b&gt;를 판단해야 합니다.&lt;br /&gt;가장 널리 알려진 기법이 바로 &lt;b&gt;TF-IDF&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;269&quot; data-start=&quot;245&quot; data-ke-size=&quot;size16&quot;&gt;하지만 TF-IDF만으로는 한계가 있습니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;350&quot; data-start=&quot;270&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;308&quot; data-start=&quot;270&quot;&gt;단어가 &lt;b&gt;너무 자주 등장하면 점수가 비정상적으로 커지는&lt;/b&gt; 문제&lt;/li&gt;
&lt;li data-end=&quot;350&quot; data-start=&quot;309&quot;&gt;&lt;b&gt;문서 길이&lt;/b&gt;를 고려하지 않아서, 긴 문서가 무조건 유리해지는 문제&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;390&quot; data-start=&quot;352&quot; data-ke-size=&quot;size16&quot;&gt;이러한 문제를 해결하기 위해 등장한 것이 바로 &lt;b&gt;BM25&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;420&quot; data-start=&quot;397&quot; data-ke-size=&quot;size26&quot;&gt;2. TF-IDF란? (개념과 수식)&lt;/h2&gt;
&lt;h3 data-end=&quot;447&quot; data-start=&quot;422&quot; data-ke-size=&quot;size23&quot;&gt;✅ Term Frequency (TF)&lt;/h3&gt;
&lt;p data-end=&quot;483&quot; data-start=&quot;449&quot; data-ke-size=&quot;size16&quot;&gt;한 문서에서 특정 단어가 얼마나 자주 등장하는지를 나타냅니다.&lt;/p&gt;
&lt;pre id=&quot;code_1745823982073&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;TF(t, d) = (문서 d에서 단어 t가 등장한 횟수) &amp;divide; (문서 d의 전체 단어 수)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-end=&quot;604&quot; data-start=&quot;566&quot; data-ke-size=&quot;size23&quot;&gt;✅ Inverse Document Frequency (IDF)&lt;/h3&gt;
&lt;p data-end=&quot;650&quot; data-start=&quot;606&quot; data-ke-size=&quot;size16&quot;&gt;전체 문서 중 해당 단어를 포함하는 문서 수에 따라 단어의 희귀성을 반영합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1745823997630&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;IDF(t) = log( (전체 문서 수) &amp;divide; (1 + 단어 t가 등장한 문서 수) )&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;892&quot; data-start=&quot;853&quot; data-ke-size=&quot;size16&quot;&gt;※ 여기서 1을 더하는 이유는 0으로 나누는 것을 방지하기 위함입니다.&lt;/p&gt;
&lt;h3 data-end=&quot;836&quot; data-start=&quot;824&quot; data-ke-size=&quot;size23&quot;&gt;✅ TF-IDF&lt;/h3&gt;
&lt;p data-end=&quot;875&quot; data-start=&quot;838&quot; data-ke-size=&quot;size16&quot;&gt;최종적으로 TF와 IDF를 곱해, 문서 내 중요 단어를 추출합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1745824156990&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;TF-IDF(t, d) = TF(t, d) &amp;times; IDF(t)&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-end=&quot;1008&quot; data-start=&quot;954&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;989&quot; data-start=&quot;980&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;요약:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1053&quot; data-start=&quot;990&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1015&quot; data-start=&quot;990&quot;&gt;문서 내에서 많이 등장하는 단어이면서,&lt;/li&gt;
&lt;li data-end=&quot;1053&quot; data-start=&quot;1016&quot;&gt;전체 문서에서는 드물게 등장하는 단어에 높은 점수를 부여합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1071&quot; data-start=&quot;1055&quot; data-ke-size=&quot;size23&quot;&gt;❗ TF-IDF의 한계&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1128&quot; data-start=&quot;1072&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1102&quot; data-start=&quot;1072&quot;&gt;단어가 많이 등장할수록 점수가 무한히 커질 수 있음&lt;/li&gt;
&lt;li data-end=&quot;1128&quot; data-start=&quot;1103&quot;&gt;문서 길이에 따른 불공평한 점수 부여 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;1156&quot; data-start=&quot;1135&quot; data-ke-size=&quot;size26&quot;&gt;3. BM25란? (개념과 수식)&lt;/h2&gt;
&lt;p data-end=&quot;1241&quot; data-start=&quot;1158&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;BM25&lt;/b&gt;는 &quot;Best Matching 25&quot;의 약자입니다.&lt;br /&gt;(25는 여러 버전을 거쳐 가장 성능이 좋았던 버전 번호라고 알려져 있습니다.)&lt;/p&gt;
&lt;p data-end=&quot;1266&quot; data-start=&quot;1243&quot; data-ke-size=&quot;size16&quot;&gt;BM25는 TF-IDF의 문제를 보완해서:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1332&quot; data-start=&quot;1267&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1305&quot; data-start=&quot;1267&quot;&gt;&lt;b&gt;단어 빈도&lt;/b&gt;가 일정 이상 많아져도 점수가 포화되도록 조정하고&lt;/li&gt;
&lt;li data-end=&quot;1332&quot; data-start=&quot;1306&quot;&gt;&lt;b&gt;문서 길이&lt;/b&gt;에 따라 점수를 조정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1350&quot; data-start=&quot;1334&quot; data-ke-size=&quot;size23&quot;&gt;✅ BM25 점수 공식&lt;/h3&gt;
&lt;pre id=&quot;code_1745824207706&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Score(q, d) = &amp;Sigma; (각 단어 t에 대해)
IDF(t) &amp;times; [ f(t, d) &amp;times; (k1 + 1) ] &amp;divide; [ f(t, d) + k1 &amp;times; (1 - b + b &amp;times; (문서 길이 &amp;divide; 평균 문서 길이)) ]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1473&quot; data-start=&quot;1469&quot; data-ke-size=&quot;size16&quot;&gt;여기서,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1649&quot; data-start=&quot;1474&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1505&quot; data-start=&quot;1474&quot;&gt;f(t, d) = 문서 d에서 단어 t가 등장한 횟수&lt;/li&gt;
&lt;li data-end=&quot;1526&quot; data-start=&quot;1506&quot;&gt;문서 길이 = 문서 d의 단어 수&lt;/li&gt;
&lt;li data-end=&quot;1553&quot; data-start=&quot;1527&quot;&gt;평균 문서 길이 = 전체 문서들의 평균 길이&lt;/li&gt;
&lt;li data-end=&quot;1603&quot; data-start=&quot;1554&quot;&gt;k1 = 단어 빈도에 대한 민감도를 조절하는 파라미터 (보통 1.2 ~ 2.0 사용)&lt;/li&gt;
&lt;li data-end=&quot;1649&quot; data-start=&quot;1604&quot;&gt;b = 문서 길이에 대한 보정 정도를 조절하는 파라미터 (보통 0.75 사용)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1654&quot; data-start=&quot;1651&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1677&quot; data-start=&quot;1656&quot; data-ke-size=&quot;size26&quot;&gt;4. TF-IDF와 BM25 비교&lt;/h2&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;/span&gt;
&lt;div&gt;구분TF-IDFBM25
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1869&quot; data-start=&quot;1679&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1869&quot; data-start=&quot;1716&quot;&gt;
&lt;tr data-end=&quot;1762&quot; data-start=&quot;1716&quot;&gt;
&lt;td data-end=&quot;1727&quot; data-start=&quot;1716&quot;&gt;단어 빈도 처리&lt;/td&gt;
&lt;td data-end=&quot;1741&quot; data-start=&quot;1727&quot;&gt;등장할수록 선형 증가&lt;/td&gt;
&lt;td data-end=&quot;1762&quot; data-start=&quot;1741&quot;&gt;등장할수록 점진적 증가 (포화)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1803&quot; data-start=&quot;1763&quot;&gt;
&lt;td data-end=&quot;1774&quot; data-start=&quot;1763&quot;&gt;문서 길이 고려&lt;/td&gt;
&lt;td data-end=&quot;1784&quot; data-start=&quot;1774&quot;&gt;고려하지 않음&lt;/td&gt;
&lt;td data-end=&quot;1803&quot; data-start=&quot;1784&quot;&gt;문서 길이에 따라 점수 보정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1831&quot; data-start=&quot;1804&quot;&gt;
&lt;td data-end=&quot;1816&quot; data-start=&quot;1804&quot;&gt;의미적 흐름 반영&lt;/td&gt;
&lt;td data-end=&quot;1821&quot; data-start=&quot;1816&quot;&gt;약함&lt;/td&gt;
&lt;td data-end=&quot;1831&quot; data-start=&quot;1821&quot;&gt;다소 개선됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1869&quot; data-start=&quot;1832&quot;&gt;
&lt;td data-end=&quot;1841&quot; data-start=&quot;1832&quot;&gt;계산 복잡성&lt;/td&gt;
&lt;td data-end=&quot;1846&quot; data-start=&quot;1841&quot;&gt;간단&lt;/td&gt;
&lt;td data-end=&quot;1869&quot; data-start=&quot;1846&quot;&gt;약간 복잡함 (파라미터 조정 필요)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1874&quot; data-start=&quot;1871&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1888&quot; data-start=&quot;1876&quot; data-ke-size=&quot;size26&quot;&gt;5. 간단한 예시&lt;/h2&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;/span&gt;
&lt;div&gt;문서내용
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1963&quot; data-start=&quot;1890&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1963&quot; data-start=&quot;1912&quot;&gt;
&lt;tr data-end=&quot;1940&quot; data-start=&quot;1912&quot;&gt;
&lt;td data-end=&quot;1919&quot; data-start=&quot;1912&quot;&gt;문서 A&lt;/td&gt;
&lt;td data-end=&quot;1940&quot; data-start=&quot;1919&quot;&gt;&quot;고양이 고양이 고양이 귀엽다&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1963&quot; data-start=&quot;1941&quot;&gt;
&lt;td data-end=&quot;1948&quot; data-start=&quot;1941&quot;&gt;문서 B&lt;/td&gt;
&lt;td data-end=&quot;1963&quot; data-start=&quot;1948&quot;&gt;&quot;고양이 사랑스럽다&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1979&quot; data-start=&quot;1965&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;TF-IDF 기준:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2016&quot; data-start=&quot;1980&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2016&quot; data-start=&quot;1980&quot;&gt;문서 A가 &quot;고양이&quot;를 더 많이 포함하므로 점수가 높게 나옴.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2030&quot; data-start=&quot;2018&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;BM25 기준:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2103&quot; data-start=&quot;2031&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2070&quot; data-start=&quot;2031&quot;&gt;&quot;고양이&quot;가 일정 횟수 이상 등장하면 점수 증가가 둔화되기 때문에,&lt;/li&gt;
&lt;li data-end=&quot;2103&quot; data-start=&quot;2071&quot;&gt;문서 A와 문서 B가 비슷한 수준으로 평가될 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2108&quot; data-start=&quot;2105&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1912&quot; data-start=&quot;1898&quot; data-ke-size=&quot;size26&quot;&gt;6. BM25의 한계&lt;/h2&gt;
&lt;p data-end=&quot;1957&quot; data-start=&quot;1914&quot; data-ke-size=&quot;size16&quot;&gt;아무리 좋은 알고리즘이라 해도 한계는 존재합니다. BM25도 예외는 아닙니다.&lt;/p&gt;
&lt;p data-end=&quot;1976&quot; data-start=&quot;1959&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;BM25의 주요 한계점:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2126&quot; data-start=&quot;1977&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2044&quot; data-start=&quot;1977&quot;&gt;단어의 &lt;b&gt;의미적 유사성&lt;/b&gt;을 고려하지 못합니다.&lt;br /&gt;예를 들어, &quot;자동차&quot;와 &quot;차량&quot;은 다른 단어로 인식됩니다.&lt;/li&gt;
&lt;li data-end=&quot;2082&quot; data-start=&quot;2045&quot;&gt;질의어의 &lt;b&gt;순서&lt;/b&gt;나 &lt;b&gt;구조적 관계&lt;/b&gt;를 반영하지 못합니다.&lt;/li&gt;
&lt;li data-end=&quot;2126&quot; data-start=&quot;2083&quot;&gt;&lt;b&gt;자연어 질의&lt;/b&gt;에서 복잡한 의도나 뉘앙스를 완전히 파악하기 어렵습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-end=&quot;2161&quot; data-start=&quot;2128&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2161&quot; data-start=&quot;2130&quot; data-ke-size=&quot;size16&quot;&gt;즉, BM25는 여전히 &quot;단어 매칭&quot; 중심의 방식입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;2166&quot; data-start=&quot;2163&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2185&quot; data-start=&quot;2168&quot; data-ke-size=&quot;size26&quot;&gt;7. BM25 이후의 발전&lt;/h2&gt;
&lt;p data-end=&quot;2234&quot; data-start=&quot;2187&quot; data-ke-size=&quot;size16&quot;&gt;최근 정보 검색 시스템은 BM25를 넘어서기 위해 다양한 방향으로 발전하고 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;2254&quot; data-start=&quot;2236&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;BM25 이후 발전 방향:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2481&quot; data-start=&quot;2255&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2324&quot; data-start=&quot;2255&quot;&gt;&lt;b&gt;신경망 기반 랭킹 모델:&lt;/b&gt;&lt;br /&gt;BERT, T5 같은 대형 언어모델을 이용해 문장 간 의미를 더 깊게 파악합니다.&lt;/li&gt;
&lt;li data-end=&quot;2398&quot; data-start=&quot;2325&quot;&gt;&lt;b&gt;하이브리드 검색 시스템:&lt;/b&gt;&lt;br /&gt;BM25 기반 키워드 검색과 임베딩 기반 의미 검색을 결합하여 서로의 단점을 보완합니다.&lt;/li&gt;
&lt;li data-end=&quot;2481&quot; data-start=&quot;2399&quot;&gt;&lt;b&gt;의미론적 검색(semantic search):&lt;/b&gt;&lt;br /&gt;자연어 질의에 대해 문맥적 의미를 고려해 검색하는 방식이 주류로 떠오르고 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2486&quot; data-start=&quot;2483&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2501&quot; data-start=&quot;2488&quot; data-ke-size=&quot;size26&quot;&gt;8. 실무 적용 팁&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2689&quot; data-start=&quot;2503&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2566&quot; data-start=&quot;2503&quot;&gt;Elasticsearch, Vespa 같은 검색엔진에서는 기본 검색 알고리즘으로 &lt;b&gt;BM25&lt;/b&gt;를 사용합니다.&lt;/li&gt;
&lt;li data-end=&quot;2637&quot; data-start=&quot;2567&quot;&gt;파라미터 튜닝:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2637&quot; data-start=&quot;2580&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2607&quot; data-start=&quot;2580&quot;&gt;k1 값을 높이면 단어 빈도 영향이 커집니다.&lt;/li&gt;
&lt;li data-end=&quot;2637&quot; data-start=&quot;2610&quot;&gt;b 값을 높이면 문서 길이 보정이 강해집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2689&quot; data-start=&quot;2638&quot;&gt;작은 데이터셋에서는 기본값 (k1 = 1.5, b = 0.75)으로 시작해도 무방합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2694&quot; data-start=&quot;2691&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2707&quot; data-start=&quot;2696&quot; data-ke-size=&quot;size26&quot;&gt;9. 참고 자료&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2830&quot; data-start=&quot;2709&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2761&quot; data-start=&quot;2709&quot;&gt;&lt;a href=&quot;https://wikidocs.net/31698&quot; data-end=&quot;2761&quot; data-start=&quot;2711&quot;&gt;WikiDocs - TF-IDF 설명&lt;/a&gt;&lt;/li&gt;
&lt;li data-end=&quot;2830&quot; data-start=&quot;2762&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Okapi_BM25&quot; data-end=&quot;2830&quot; data-start=&quot;2764&quot;&gt;Wikipedia - Okapi BM25&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2835&quot; data-start=&quot;2832&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2847&quot; data-start=&quot;2837&quot;&gt;✅ 요약 한 줄&lt;/h1&gt;
&lt;blockquote data-end=&quot;2905&quot; data-start=&quot;2849&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2905&quot; data-start=&quot;2851&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;TF-IDF는 기본, BM25는 실전형 기준선, 그리고 미래는 신경망 기반 의미 검색이다!&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <category>Deep Learning/NLP</category>
      <category>BM25</category>
      <category>tf-idf</category>
      <author>jinmc</author>
      <guid isPermaLink="true">https://walkaroundthedevelop.tistory.com/200</guid>
      <comments>https://walkaroundthedevelop.tistory.com/200#entry200comment</comments>
      <pubDate>Mon, 28 Apr 2025 16:14:06 +0900</pubDate>
    </item>
    <item>
      <title>tflite를 사용했을 때 output tensor 모양 확인하기</title>
      <link>https://walkaroundthedevelop.tistory.com/199</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;모바일에서 돌아갈수 있는 tflite모델을 돌리는데 있어서 output tensor의 갯수를 맞추는 것도 중요하다고 생각합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741063953647&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import tensorflow as tf

# 모델 파일 로드
interpreter = tf.lite.Interpreter(model_path=&quot;efficientdet-lite0.tflite&quot;)
interpreter.allocate_tensors()

# 입력 및 출력 텐서 정보 가져오기
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()

print(&quot;Input Details:&quot;, input_details)
print(&quot;Output Details:&quot;, output_details)&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741063991599&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input Details: [{'name': 'serving_default_inputs:0', 'index': 0, 
			  'shape': array([  1, 256, 256,   3], dtype=int32), 
              'shape_signature': array([  1, 256, 256,   3], dtype=int32), 
              'dtype': &amp;lt;class 'numpy.float32'&amp;gt;, 'quantization': (0.0, 0), 
              'quantization_parameters': {'scales': array([], dtype=float32), 
              'zero_points': array([], dtype=int32), 'quantized_dimension': 0}, 
              'sparsity_parameters': {}}]
Output Details: [{'name': 'StatefulPartitionedCall:0', 'index': 431, 
				  'shape': array([    1, 12276,     4], dtype=int32), 
                  'shape_signature': array([    1, 12276,     4], dtype=int32), 
                  'dtype': &amp;lt;class 'numpy.float32'&amp;gt;, 'quantization': (0.0, 0), 
                  'quantization_parameters': {'scales': array([], dtype=float32), 
                  'zero_points': array([], dtype=int32), 'quantized_dimension': 0}, 
                  'sparsity_parameters': {}}, {'name': 'StatefulPartitionedCall:1', 
                  'index': 429, 'shape': array([    1, 12276,    19], dtype=int32), 
                  'shape_signature': array([    1, 12276,    19], dtype=int32), 
                  'dtype': &amp;lt;class 'numpy.float32'&amp;gt;, 'quantization': (0.0, 0), 
                  'quantization_parameters': {'scales': array([], dtype=float32), 
                  'zero_points': array([], dtype=int32), 'quantized_dimension': 0}, 
                  'sparsity_parameters': {}}]&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;보면, output shape이 [1, 12276, 19] 이렇게 나오는데, 20이 class output length입니다.&lt;/p&gt;</description>
      <category>모바일</category>
      <author>jinmc</author>
      <guid isPermaLink="true">https://walkaroundthedevelop.tistory.com/199</guid>
      <comments>https://walkaroundthedevelop.tistory.com/199#entry199comment</comments>
      <pubDate>Tue, 4 Mar 2025 14:58:58 +0900</pubDate>
    </item>
    <item>
      <title>Mediapipe Model Maker를 이용한 Object Detection 실습기</title>
      <link>https://walkaroundthedevelop.tistory.com/198</link>
      <description>&lt;h2 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;1. 시작: TFLite Model Maker의 문제&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;원래는 TFLite Model Maker를 이용해서 Object Detection 모델을 학습하려고 했습니다. TFLite Model Maker는 TensorFlow Lite 모델을 간편하게 만들 수 있는 라이브러리로, 데이터셋만 준비하면 비교적 쉽게 모델을 학습하고 변환할 수 있습니다. 하지만 라이브러리를 설치하고 실행하는 과정에서 여러 가지 오류가 발생했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;대표적인 문제는 다음과 같습니다:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;라이브러리 의존성 충돌&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;특정 버전의 TensorFlow Lite와 호환되지 않는 문제&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Colab 환경에서 제대로 동작하지 않는 버그&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이러한 문제들로 인해 결국 TFLite Model Maker를 포기하고, &lt;/span&gt;&lt;span&gt;&lt;b&gt;Mediapipe Model Maker&lt;/b&gt;&lt;/span&gt;&lt;span&gt;를 활용하기로 결정했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;2. Mediapipe Model Maker로 전환&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Mediapipe Model Maker는 Google의 Mediapipe 프레임워크를 활용하여 Object Detection 모델을 학습할 수 있도록 지원하는 도구입니다. Mediapipe는 주로 실시간 컴퓨터 비전에 강점을 가지며, 모바일 및 임베디드 환경에서도 원활하게 동작합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;TFLite Model Maker 대신 Mediapipe Model Maker를 선택한 이유는 다음과 같습니다:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;Colab 환경에서 원활하게 실행 가능&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;비교적 간단한 API를 제공&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;TensorFlow 기반이라 TFLite와 호환 가능&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;따라서 Mediapipe Model Maker를 활용하여 Object Detection 모델을 학습하고 배포하는 과정을 진행했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;3. Colab에서 Mediapipe Model Maker 실행하기&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;3.1. 환경 설정 및 라이브러리 설치&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Colab에서 Mediapipe Model Maker를 실행하기 위해 필요한 라이브러리를 설치했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;!pip install mediapipe-model-maker&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;설치 후 의존성 충돌이 발생하지 않는지 확인한 뒤, 다음 단계로 진행했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;3.2. Colab에서 GPU 설정 문제 해결&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Colab 환경에서 GPU를 제대로 인식하지 못하는 문제가 발생했습니다. 해결을 위해 다음과 같은 단계를 수행했습니다:&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-spread=&quot;true&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;Colab에서 런타임 유형을 변경:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;런타임&lt;/span&gt;&lt;span&gt; &amp;gt; &lt;/span&gt;&lt;span&gt;런타임 유형 변경&lt;/span&gt;&lt;span&gt; &amp;gt; &lt;/span&gt;&lt;span&gt;하드웨어 가속기&lt;/span&gt;&lt;span&gt;를 &lt;/span&gt;&lt;span&gt;GPU&lt;/span&gt;&lt;span&gt;로 설정&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;현재 GPU 상태 확인:&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;import tensorflow as tf
print(&quot;Num GPUs Available:&quot;, len(tf.config.list_physical_devices('GPU')))&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;만약 &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;이 출력되면 GPU가 제대로 인식되지 않은 것임&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;NVIDIA 드라이버 및 CUDA 버전 확인:&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;diff&quot;&gt;&lt;code&gt;!nvidia-smi&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;이 명령어를 실행했을 때, GPU 정보가 제대로 표시되지 않으면 런타임을 다시 시작하거나 CPU 모드로 실행한 후 다시 GPU로 변경&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;TensorFlow 및 Keras 버전 조정 (2.16 이상에서 오류 발생)&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;!pip install tensorflow[and-cuda]==2.15.1 keras==2.15.0 tensorboard==2.15.2 tensorflow-hub&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;설치 후 버전 확인:&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;import tensorflow as tf
import keras

print(&quot;TensorFlow Version:&quot;, tf.__version__)
print(&quot;Keras Version:&quot;, keras.__version__)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;위 코드에서 TensorFlow 2.15.1, Keras 2.15.0이 제대로 표시되면 정상적으로 설정된 것임&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;위 과정을 거친 후, GPU가 정상적으로 인식되었음을 확인한 뒤 학습을 진행했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;3.3. 데이터셋 준비&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Object Detection을 위해 적절한 데이터셋이 필요했습니다. 이번 실험에서는 3마리 개(dog)를 식별하는 모델을 만들기로 했습니다. 데이터를 수집하고 라벨링하는 과정은 다음과 같습니다:&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;Open Images Dataset 또는 기존 이미지 데이터를 활용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;이미지와 바운딩 박스를 포함한 라벨링 파일(.csv 또는 .json) 준비&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Mediapipe Model Maker의 데이터 포맷에 맞게 변환&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;데이터셋 다운로드 및 준비 과정은 다음과 같이 진행했습니다:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;!wget https://storage.googleapis.com/mediapipe-assets/dogs2.zip --no-check-certificate
!unzip dogs2.zip

train_dataset_path = &quot;dogs/train&quot;
validation_dataset_path = &quot;dogs/validate&quot;

train_data = object_detector.Dataset.from_pascal_voc_folder(
    'dogs copy/train',
    cache_dir=&quot;/tmp/od_data/train&quot;,
)

val_data = object_detector.Dataset.from_pascal_voc_folder(
    'dogs copy/validate',
    cache_dir=&quot;/tmp/od_data/validatation&quot;
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Object Detection을 위해 적절한 데이터셋이 필요했습니다. 이번 실험에서는 3마리 개(dog)를 식별하는 모델을 만들기로 했습니다. 데이터를 수집하고 라벨링하는 과정은 다음과 같습니다:&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;Open Images Dataset 또는 기존 이미지 데이터를 활용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;이미지와 바운딩 박스를 포함한 라벨링 파일(.csv 또는 .json) 준비&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Mediapipe Model Maker의 데이터 포맷에 맞게 변환&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;3.4. 모델 학습&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;데이터 준비가 끝난 후, Mediapipe Model Maker를 사용하여 학습을 시작했습니다. 간단한 코드 예제는 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;from mediapipe_model_maker import object_detector

# 하이퍼파라미터 설정
hparams = object_detector.HParams(batch_size=8, learning_rate=0.3, epochs=50, export_dir='exported_model')
options = object_detector.ObjectDetectorOptions(
    supported_model=object_detector.SupportedModels.MOBILENET_V2,
    hparams=hparams
)

# 모델 생성 및 학습
model = object_detector.ObjectDetector.create(
    train_data=train_data,
    validation_data=val_data,
    options=options
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Mediapipe Model Maker는 EfficientDet 기반의 다양한 모델을 지원하며, 원하는 모델을 선택하여 학습할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;3.5. 모델 평가 및 변환&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;학습이 완료된 후, 모델을 평가하고 TFLite 포맷으로 변환하여 모바일 환경에서 사용할 준비를 했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# 모델 평가
metrics = model.evaluate(val_data)
print(&quot;Evaluation metrics:&quot;, metrics)

# TFLite 변환
model.export(export_dir='exported_model')&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;4. 결론 및 느낀 점&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이번 실험을 통해 Mediapipe Model Maker를 사용하여 Object Detection 모델을 성공적으로 학습할 수 있었습니다. 처음에는 TFLite Model Maker를 사용하려고 했지만, 여러 가지 문제로 인해 Mediapipe Model Maker로 전환했고, 결과적으로 더 간편하고 빠르게 모델을 만들 수 있었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Mediapipe Model Maker의 장점:&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;✅ Colab 환경에서 쉽게 실행 가능 ✅ TensorFlow Lite와 호환되어 모바일 배포 가능 ✅ 직관적인 API 제공&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;하지만 단점도 있었습니다: ❌ 공식 문서가 상대적으로 부족하여 디버깅이 어려운 부분이 있음 ❌ 일부 고급 기능(예: 커스텀 모델 구조 변경)에 제약이 있음 ❌ Colab에서 GPU 설정이 원활하지 않아 추가적인 설정이 필요함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;앞으로는 Mediapipe Model Maker의 다양한 기능을 더 실험해보고, 실제 프로젝트에 적용할 방법을 모색해볼 계획입니다. Mediapipe Model Maker를 활용하여 Object Detection을 고려하는 분들에게 도움이 되었길 바랍니다!&lt;/span&gt;&lt;/p&gt;</description>
      <category>Deep Learning/Computer Vision</category>
      <category>mediapipe-model-maker</category>
      <category>TFlite</category>
      <author>jinmc</author>
      <guid isPermaLink="true">https://walkaroundthedevelop.tistory.com/198</guid>
      <comments>https://walkaroundthedevelop.tistory.com/198#entry198comment</comments>
      <pubDate>Thu, 13 Feb 2025 10:20:31 +0900</pubDate>
    </item>
    <item>
      <title>AWS RAG Agent 워크샵</title>
      <link>https://walkaroundthedevelop.tistory.com/197</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;aws를 이용해서 streamlit, bedrock, lamda를 이용해서 application을 만드는 워크샵입니다.&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;a href=&quot;https://github.com/kwangwl/amazon-bedrock-workshop/blob/main/stock_agent_workshop/guardrails.py&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/kwangwl/amazon-bedrock-workshop/blob/main/stock_agent_workshop/guardrails.py&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739339402375&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;amazon-bedrock-workshop/stock_agent_workshop/guardrails.py at main &amp;middot; kwangwl/amazon-bedrock-workshop&quot; data-og-description=&quot;amazon-bedrock-workshop. Contribute to kwangwl/amazon-bedrock-workshop development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/kwangwl/amazon-bedrock-workshop/blob/main/stock_agent_workshop/guardrails.py&quot; data-og-url=&quot;https://github.com/kwangwl/amazon-bedrock-workshop/blob/main/stock_agent_workshop/guardrails.py&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cRxJQV/hyYfCyNxGn/stsNdrmZeYlvO6AdID5OZK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/jwkEu/hyYf4PBYo8/qi0vLBkkIcTOs3fni06iMk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/kwangwl/amazon-bedrock-workshop/blob/main/stock_agent_workshop/guardrails.py&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/kwangwl/amazon-bedrock-workshop/blob/main/stock_agent_workshop/guardrails.py&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cRxJQV/hyYfCyNxGn/stsNdrmZeYlvO6AdID5OZK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/jwkEu/hyYf4PBYo8/qi0vLBkkIcTOs3fni06iMk/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;amazon-bedrock-workshop/stock_agent_workshop/guardrails.py at main &amp;middot; kwangwl/amazon-bedrock-workshop&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;amazon-bedrock-workshop. Contribute to kwangwl/amazon-bedrock-workshop development by creating an account on GitHub.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;AWS를 활용하여 &lt;/span&gt;&lt;span&gt;&lt;b&gt;Streamlit, Bedrock, Lambda&lt;/b&gt;&lt;/span&gt;&lt;span&gt;를 이용해 AI 애플리케이션을 구축하는 워크샵입니다. 이 워크샵에서는 AWS의 강력한 AI 및 서버리스 기능을 활용하여 실전 프로젝트를 진행하며, RAG(Retrieval-Augmented Generation) 기법을 적용한 지능형 애플리케이션을 만들어봅니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;워크샵 개요&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 워크샵에서는 AWS의 다양한 서비스를 조합하여 LLM 기반 애플리케이션을 구축하는 방법을 배웁니다. RAG 기술을 활용해 정보를 검색하고, 대형 언어 모델(LLM)을 통해 보다 정확하고 맥락에 맞는 응답을 생성하는 시스템을 구축합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;주요 학습 내용&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Streamlit&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 직관적인 사용자 인터페이스(UI) 개발&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Amazon Bedrock&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: LLM을 활용한 자연어 처리 및 AI 기능 적용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;AWS Lambda&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 서버리스 컴퓨팅을 활용한 API 및 데이터 처리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Amazon S3 &amp;amp; DynamoDB&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 데이터를 저장하고 효율적으로 관리하는 방법&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;RAG (Retrieval-Augmented Generation)&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 검색과 생성 모델을 결합하여 최적화된 응답을 생성하는 방법&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;보안 및 배포 전략&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: AWS IAM을 활용한 보안 관리 및 애플리케이션 배포 전략&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;워크샵에서 배우는 내용&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;1. Streamlit을 활용한 대화형 웹 애플리케이션 제작&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;Streamlit을 사용하여 간단한 UI를 구축하는 방법&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;사용자 입력을 받아 AI 모델과 연동하는 방식&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;2. Amazon Bedrock을 사용한 LLM 기반 AI 활용&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;Amazon Bedrock에서 제공하는 다양한 AI 모델을 탐색&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;LLM을 활용하여 자연어 처리를 수행하는 방법&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;3. Lambda를 이용한 API 연결 및 서버리스 환경 구성&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;Lambda를 통해 요청을 처리하고 데이터를 반환하는 방식&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;서버리스 환경에서 비용 효율적으로 AI 서비스를 운영하는 방법&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;4. RAG 기법을 적용한 검색 및 응답 최적화&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;Amazon OpenSearch 또는 자체 데이터베이스를 이용하여 검색 기능 강화&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;RAG 모델을 활용해 기존 LLM보다 높은 정확도의 응답을 생성하는 방법&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;5. 보안 및 데이터 보호 가이드라인 적용&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;AWS IAM을 활용한 권한 및 인증 관리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;데이터 보안 및 개인정보 보호를 고려한 AI 서비스 운영 방법&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;실습 및 코드 예제&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;워크샵에서는 단계별 실습을 통해 AI 애플리케이션을 직접 구축해볼 수 있습니다. 실습 과정에서 사용할 예제 코드와 가이드라인은 아래 GitHub 링크에서 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;  &lt;/span&gt;&lt;a href=&quot;https://github.com/kwangwl/amazon-bedrock-workshop/blob/main/stock_agent_workshop/guardrails.py&quot;&gt;&lt;span&gt;AWS RAG Agent 워크샵 GitHub Repository&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 워크샵을 통해 AWS의 다양한 AI 및 서버리스 서비스를 활용하여 실제 애플리케이션을 구축하는 경험을 쌓고, AI 기반 서비스의 가능성을 탐색할 수 있습니다!&lt;/span&gt;&lt;/p&gt;</description>
      <category>Data Science</category>
      <category>AWS</category>
      <category>Bedrock</category>
      <author>jinmc</author>
      <guid isPermaLink="true">https://walkaroundthedevelop.tistory.com/197</guid>
      <comments>https://walkaroundthedevelop.tistory.com/197#entry197comment</comments>
      <pubDate>Wed, 12 Feb 2025 14:50:12 +0900</pubDate>
    </item>
  </channel>
</rss>