한컴으로부터 제품 이용 및 원고료를 지원받아 작성했습니다.

 

이제는 까마득한 옛날 추억으로 남은 "아래아한글 1.5"

MS-DOS 공부보다 아래아한글의 단축키를 먼저 외웠었는데,

그런 추억을 안겨준 한컴(한글과컴퓨터)에서 새로운 솔루션을 사용해보라고 연락이 왔다.

 

 

1. 한컴 데이터 로더(Hancom Data Loader)

'한컴 데이터 로더'는 한컴이 개발한 문서 구조 분석(Document Parsing) 솔루션으로,

HWP/HWPX/PDF 등의 문서를 구조화 데이터로 변환하는 용도로 사용한다.

 

https://sdk.hancom.com/

 

 

2. 온프레미스

홈페이지를 살펴보면 SaaS 형태로만 제공해주는 것 같지만, 좀 더 살펴보면 온프레미스 형태로도 제공해준다고 한다.

다만, 미리 사용해볼 수 있는 것은 API를 이용한 SaaS 방식만 있는 것으로 보인다.

 

https://blog.hancom.com/rag-document-parsing-solution-criteria/

 

 

3. 테스트 시나리오

HWPX 파일을 '한컴 데이터 로더'로 파싱하고 임베딩 해서 RAG 데이터베이스에 넣어놓고,

사용자 질문에 대해 'LLM + RAG'를 통해 답변을 하는 것을 구현해보겠다.

 

 

 

4. 문서 파일 (HWP)

고용노동부의 정책자료실에 있는 '표준 취업규칙' 파일을 가지고 실습을 진행해보겠다.

 

https://www.moel.go.kr/policy/policydata/view.do?bbs_seq=20250300356

 

파일 내용은 다음과 같이 되어있으며, 총 163쪽 272KB 크기를 갖고 있다.

 

 

 

5. 한컴 데이터 로더 - API Key

'한컴 SDK'에서 '데이터 로더'를 찾아볼 수 있다.

앞서 말한대로 일단은 SaaS 형태로 제공되고 있기에 API 사용을 위한 계정 등록이 필요하다.

 

https://sdk.hancom.com/services/1

 

상단에 있는 'Get API'를 클릭하면 로그인 페이지를 확인할 수 있다.

 

 

회원가입 후 로그인을 한 다음, '크레딧 관리' 메뉴를 선택하면 아래와 같이 무료 크레딧을 받을 수 있다.

 

 

문서 1장당 10 Credit, 그러면 1만 크레딧이면 문서 1천장을 처리할 수 있다.

 

 

'API 관리' 메뉴를 선택하면 'OCR API' / '데이터 로더' 2가지 서비스를 사용할 수 있다는 것을 확인할 수 있다.

 

 

'데이터 로더' 서비스의 'API Key 관리' 버튼을 클릭하자.

 

 

'API Key 생성' 버튼을 누르고, 이름을 지어준 다음에 '생성하기'를 누르면 된다.

 

 

생성한 Key 값을 언제든 복사해서 사용할 수 있다.

최근에는 보안을 위해 처음에만 복사할 수 있고, 다음에 다시 재사용하지 못하는 것이 트렌드인 것 같던데...

사용하는 입장에서 이렇게 언제든 복사할 수 있는 것이 편하긴 하다! ^^

 

 

 

6. OpenRouter - API Key

임베딩, LLM 모델을 사용하기 위해서 Provider 중 하나인 OpenRouter를 활용해보도록 하겠다.

 

ChatGPT, Gemini, Claude 등을 사용해도 좋지만

가난한(?) 개발자들에게 많은 사랑을 받는 OpenRouter를 선택해보았다.

 

https://openrouter.ai/

 

회원가입/로그인 후 'Get API Key' 버튼을 클릭하면 된다.

 

 

임의로 이름 지어주고(유효기간 등은 선택사항) 'Create'하면 된다.

 

 

Create 하면 나오는 Key 값을 잘 복사해 놓아야 한다.

지금 복사해놓지 않으면 확인할 수 있는 방법이 없기에 다시 새로운 API Key를 생성해야 한다.

 

 

 

7. LLM / Embedding Model

개인적으로 최근에 사용했던 무료 모델 중에서 빠르고 괜찮은 품질을 보였던 것을 사용해보려고 한다.

 

 

 

8. Vetcor DB - Chroma (ChromaDB)

RAG를 위한 Vector Database로는 Chroma를 선택했다.

별다른 설치 없이 Local에 저장이 되는 사용하기 편한 아이라서 (개인적인 취향으로) 선택했다.

 

https://www.trychroma.com/

 

 

9. 개발환경 - Ubuntu / Python

개인적인 취향이기도 하지만,

사실 가장 호환성 좋고 가장 권장할만한 개발환경은 Ubuntu라고 믿고 있다!!!

 

 

프로그래밍 언어는 파이썬을 사용할 것이고, 파이썬 가상환경 및 패키지 관리는 uv를 사용할 것이다.

 

 

 

10. 라이브러리 설치

본격적인 코딩을 하기 전에 필요한 라이브러리들을 설치하자.

 

 

> uv add chromadb requests python-dotenv

 

앞서 살펴본대로 RAG를 위한 chromadb, API 통신을 위한 requests, 환경변수를 위한 python-dotenv 라이브러리들이다.

 

 

11. 환경 변수

앞에서 생성한 Key 값 및 사용할 모델 정보를 환경 변수로 설정하자.

 

 

> nano .env

 

HANCOM_API_KEY=...
HANCOM_WEBHOOK_URL=...

OPENROUTER_API_KEY=...
EMBED_MODEL=nvidia/nemotron-3-embed-1b:free
LLM_MODEL=nvidia/nemotron-3-ultra-550b-a55b:free

 

'한컴 데이터 로더'를 이용하여 문서를 변환할 때 약간의 시간을 필요로 한다.

그래서 변환 요청한 뒤, 변환이 완료되면 알림(webhook)을 보내줄 URL을 알려주도록 하고 있다.

 

하지만, 이번에는 webhook을 받아서 처리하는 서버 부분을 따로 구현하지 않고

그냥 완료 여부를 체크해서 결과를 받아오도록 처리할 예정이다.

 

그래서, HANCOM_WEBHOOK_URL 값은 아무것이나 넣어줘도 괜찮다.

 

 

12. 한컴 데이터 로더를 이용한 HWP(X) 변환 - convert.py

준비는 끝났다. 이제 하나씩 구현해보자.

HWP(X) 파일을 '한컴 데이터 로더'를 이용해 변환한 뒤에 JSON 형태의 파일로 다운로드를 받는 부분이다.

 

 

'한컴 데이터 로더'를 사용하기 위한 Key값과 Webhook URL 정보들을 확보하고

HWP 파일을 보낸 뒤 변환이 끝날 때까지 기다렸다가

변환이 끝나면 다운로드를 받는 과정이다.

 

 

'한컴 데이터 로더'에 업로드하는 과정은 다음과 같다.

 

 

앞서 말했지만 변환 과정에는 시간이 걸리기에

'한컴 데이터 로더'에서 권하는 방식은 변환이 끝난 뒤 정해진 URL로 Webhook을 받아서

그 때 다운로드를 받는 것이다.

 

하지만, 여기에서는 그냥 주기적으로 완료 여부를 확인하는 방식으로 구현했다.

 

 

변환 결과를 다운로드 받는 부분이다.

 

 

다운로드를 받은 파일이 제대로 되어있는지 여부와 얼만큼의 양인지 확인까지 해봤다.

 

그런데, '한컴 데이터 로더'에서 내려받는 파일의 확장자가 일반적이지 않은 ".aijson"이다.

표준 포맷은 아니고, '한컴 데이터 로더'에서 사용하는 JSON 형태의결과 파일이다.

 

그런데, 공식 문서에서 '.aijson' 파일의 구조를 아래와 같이 가이드 하고 있는데

 

https://documents.sdk.hancom.com/dataloader-api/intro

 

 

 

실제 파일을 보면 구성과 내용이 다르다.

가이드 문서의 업데이트가 필요하지 싶다.

 

 

이렇게 구현한 것을 실제 실행한 화면은 다음과 같다.

 

 

 

13. 문서 자르기 - chunk.py

앞에서 HWP 파일을 다룰 수 있는 데이터 형태로 변환을 했다면,

이제는 그 데이터를 연산하기 위한 유닛으로 조각을 내서 그룹핑을 해야 한다.

 

 

앞 단계에서 만들어진 ".aijson" 파일을 입력으로 받아서

텍스트 부분만 추출한 뒤에

정해진 CHUNK_SIZE와 CHUNK_OVERLAP 값을 참고하여 청크 목록을 만든다.

 

 

".aijson" 파일도 근간은 json 파일이기 때문에, 그냥 json.load()로 읽어들이면 된다.

우리가 필요로 하는 부분은 'body' 배열이기에 존재 여부를 확인해보았다.

 

 

우리가 사용할 것은 text 이기에 그것만 추출했다.

 

 

text 묶음을 가지고 CHUNK_SIZE 만큼씩 잘라냈다.

검색 결과에서 앞/뒤로 잘릴 수가 있으므로 CHUNK_OVERLAP 크기만큼 겹치도록 한다.

 

 

실제 실행 화면은 아래와 같다.

 

 

이렇게 만들어진 JSON 파일 본문은 아래와 같이 생겼다.

 

 

 

14. 임베딩 및 데이터 저장 - embed.py

이제 Vector Database에 입력을 하면 된다.

그런데, 그냥 넣으면 안되고 embedding을 해서 넣어줘야 한다.

 

 

Chunking된 JSON 파일을 입력으로 받아서

embedding 모델을 통해 변환 후 chromadb에 저장을 하도록 했다.

 

 

id, text 필드가 잘 있는지 확인해서 읽어들인다.

 

 

embedding 모델을 통해 변환한 값들을 embeddings에 저장을 한다.

 

 

그렇게 한 뒤에 chromadb에 저장을 하도록 했고,

이를 실행한 화면은 다음과 같다.

 

 

이렇게 입력한 내용이 제대로 되었는지가 궁금해서 점검하는 코드도 추가 작성해보았다.

 

 

 

15. 사용자 인터페이스 - ask.py

이제 사용자의 질문에 답하는 부분을 구현하면 된다.

저장된 Vector DB에 query를 보내기 위해서는 embedding 과정을 거쳐야 된다.

 

 

사용자의 질문을 받으면 embedding을 한 뒤에

그 값을 가지고 Vector DB 검색을 하고

검색 결과를 가지고 답변을 작성한 뒤에 출력하는 흐름이다.

 

 

앞서 사용한 동일한 embedding model을 사용한다.

 

 

chromadb에 query를 날려 유사한 청크를 찾는다.

 

 

검색 결과를 근거로 해서 답변을 작성한다.

 

 

실제 실행한 결과는 아래와 같다.

 

 

검색 결과가 없으면 없다고 답변을 잘하고 있다.

 

 

 

16. 결론 - '한컴 데이터 로더'를 사용해본 경험

RAG를 이용해서 사용자 질문에 답변을 하는 가장 기본적인 workflow를 구현해보았다.

 

"한컴 데이터 로더"를 사용하는 것의 의미를 찾자면

HWP(X) 문서로 작성된 데이터를 다룰 수 있다는 점일 것이다.

 

변환된 내용을 보면 상당히 깔끔하게 잘 변환된 것을 확인할 수 있었다.

그리고, 단순히 텍스트만 추출되는 것이 아니라 편집 정보들을 포함해서 알려준다.

이러한 정보들을 활용하면 더 재미있는 결과도 뽑아낼 수 있을 것이다.

 

안타깝게도(?) 내가 일하는 곳에서는 HWP(X) 문서를 사용하지 않지만,

정부에서 발표하거나 배포하는 문서들을 데이터화 해야한다고 하면

문서 자동화를 위한 사내 업무용으로 도입을 할 수도 있을 것 같다.

 

내부망을 사용하고 있기에 지금과 같은 SaaS 형태로는 사용할 수 없을 것이고,

온프레미스 문서 처리 방식으로 사용한다고 하면 보안적인 측면에서도 상당한 메리트가 있을 것으로 보인다.

 

[ RAG 전처리 도구로서 '한컴 데이터 로더' 특징 ]

이번에 직접 사용해보면서 파악하게 된 '한컴 데이터 로더'의 특징을 정리해봤는데,

RAG 전처리 도구를 고를 때 이런 부분을 비교해보면서 살펴보면 좋을 것 같다.

지원 파일 유형 HWP, HWPX, PDF  
서비스 형태 SaaS(API), 온프레미스 온프레미스를 직접 테스트해보지는 못했다,
문서 변환 소요 시간 상당히 빠름 (약 0.3초/page) 163페이지 변환에 약 50초 소요
비용 10 크레딧/페이지 내용 무관하게 페이지 단위 비용 청구
변환 대상 텍스트, 이미지, 문서서식 JSON 형태로 데이터화

 

기존에 사용해봤던 Docling 같은 도구와 비교해보면 변환 속도라던지, HWP(X) 지원 측면에서 확실한 강점이 있는 것 같다.

일반적으로 텍스트 추출에 특화되어 있는데, 문서 서식을 포함한 정보를 분석해주는 부분에 있어서도

'한컴 데이터 로더'가 강점이 있다.

 

 

17. 뒷 이야기

테스트를 위해 사용한 문서가 163 페이지이다 보니, 한 번 실행할 때마다 1630원씩 소모가 되었다.

보통은 사용하는 토큰에 따른 비용이 발생하는데, '한컴 데이터 로더'는 문서 페이지 단위로 10원씩 크레딧이 소모된다.

 

 

그러다보니 입력하는 문서에 제목만 덜렁 있는 페이지가 있거나 하는 경우, 상당히 억울할 수 있을 것 같다 😅

비용 절감을 위해서는 공백이나 빈칸 없이 페이지를 빽빽하게 만든 다음에 업로드를 해야하겠다.

 

 

지금까지 "한컴 데이터 로더"를 살펴보았고,

사용해 본 경험은 '꽤 괜찮았'고, HWP(X) 파일을 다룰 일이 있을 때 도입 검토할 가치는 충분할 것 같다.

 

다만, 가이드 페이지를 조금 더 보완하면 더 좋은 사용자 경험이 될 것이다.

 

Webhook URL이 마땅치 않을 때 어떻게 해야하는지,

AIJSON 파일에 대한 포맷 정합성 및 각 필드에 대한 설명이라던지 그다지 친절한 가이드는 아니었다.

 

 

18. Live Demo

'한컴 데이터 로더'를 그냥 일단 한 번 체험해보고 싶은 분들을 위한 Live Demo 페이지도 있다.

 

https://livedemo.sdk.hancom.com/dataloader

 

데모 페이지는 5 페이지까지만 변환을 해준다.

그런데, 화면을 어떻게 분석해 주는지 눈으로 확인할 수 있어서 너무 좋다 !!!

 

 

RAG에 관심이 있다면, 특히 HWP(X) 문서 데이터 추출에 관심이 있다면 꼭 한 번 사용해보기 바란다.

반응형

제목에 낚인 분도 계실 것 같다.

우리 엘론 머스크 형님의 Grok 하고 나도 햇갈려서 뭔가 이상해했었다.

 

Groq은 사실 H/W 업체로 봐야 한다.

  - https://groq.com/

 

 

보다 빠르고 낮은 가격에 인퍼런싱을 할 수 있는 LPU 업체인 것이다.

 

LPU가 뭐냐고?

`LLM Processing Unit`이라고, LLM 처리를 위한 칩이다.

  - https://groq.com/lpu-architecture

 

 

그 기술력을 인정 받아서 25년 12월, 200억 달러(약 30조)에 Nvidia에서 인수했다.

  - https://news.hada.io/topic?id=25318

 

 

  - https://www.cnbc.com/2025/12/24/nvidia-buying-ai-chip-startup-groq-for-about-20-billion-biggest-deal.html

 

 

그리고,

Groq은 자신들의 칩 성능을 증명하기 위해서 `오픈 웨이트 모델`들의 API를 제공하는 서비스를 했는데

저렴한 가격과 함께 좋은 성능을 보여 생각보다 꽤 괜찮은 인기를 얻고 있다.

 

 

다양한 모델들을 제공하고 있지는 않은데,

모델 자체의 다양성 보다는 다양한 용도에 걸쳐서 골고루 제공하고 있다.

 

 

 

Groq에 대해서는 그만 알아보고

API를 사용해보기 위해 회원 가입을 빠르게 해보자 !!!

  - https://console.groq.com/home

 

 

물론 공짜는 아니다 !!!

성능(속도)에 자신이 있기에 가장 앞에 TPS를 내세우고 있다.

  - https://groq.com/pricing

 

 

공짜가 아니라서 서운해하면 안된다.

Free Plan 에서도 꽤 쓸만큼 제공해준다.

  - https://console.groq.com/docs/rate-limits

 

 

각 필드가 어떤 의미인지 모르겠다고 ?!

그럴줄 알고 친절하게 다 설명해준다.

 

 

API를 사용하기 위해서는 당연히 Key를 발급 받아야 한다.

오른쪽 위 메뉴에서 `API Keys`를 클릭하자.

  - https://console.groq.com/home

 

 

`Create API Key`를 클릭하면 된다.

  - https://console.groq.com/keys

 

 

적당히 이름과 만료 기간을 정해주면 된다.

 

 

이렇게 생성한 Key 값을 잘 적어두자.

 

 

어떻게 사용할지 모를 때에는 공식 문서를 살펴봐야 한다.

  - https://console.groq.com/docs/overview

 

 

응?! 뭐지 Getting Start 동영상이 비공개 ????

하지만, 우리는 빠르게 `Quick Start`를 살펴보도록 하자.

  - https://console.groq.com/docs/quickstart

 

 

나는 uv를 사랑하기에 uv 방식으로 따라해봤다.

 

 

groq 패키지를 설치하자.

 

 

소스 코드는 `Quick Start`에 있는 것 그대로 해봤다.

 

 

아까 받아놓은 Key 값을 환경 변수로 설정하고

Python 실행하면 ... 꽤 빠르게 결과가 나온다.

 

 

대시보드를 보면 API를 얼마나 사용했는지 확인도 할 수 있다.

  - https://console.groq.com/dashboard/metrics

 

 

이것 저것 실험할 때 잘 사용해봐야겠다 !!!!

반응형

오늘은 재미있는 컨텐츠로 포스팅 !!!

 

GPT, Gemini, Opus, Sonnet, Grok, DeepSeek 중에 누가 제일 똑똑할까?

아니, 누가 돈을 제일 잘 벌까?

아니, 아니, 누가 게임을 제일 잘 할까?

 

그 호기심에 대한 답까지는 아니지만,

살짝 엿볼 수 있는 재미있는 사이트가 있다.

 

LLM Holdem

- https://llmholdem.com/

 

 

LLM 끼리 둘러 앉아서 홀덤을 하고 있다 !!!

 

현재 순위를 한 번 살펴보면, GPT 5.2가 제일 잘 하고 있다.

- https://llmholdem.com/leaderboard

 

 

지켜보기만 하는 것은 재미가 없으니,

직접 `Create Room`을 해서 Join을 해보자.

 

 

나랑 상대할 LLM을 고를 수도 있다.

 

 

나쁜 것들!

나를 탕진시키고 지들끼리 게임을 하고 있다니 ... ㅠㅠ

 

대출 받아서 다시 참여할까? 하다가 ... 어?! 지들끼리 짜고 하는 거 아냐? 라는 생각이 ... ㅋㅋ

 

 

재미로 살펴보자 ^^

반응형

혼자 개발하면 외롭다.

특히, 코드 리뷰를 받고 싶은데 내 마음 같은 사람 만나기도 어렵고 ...

 

우리의 구글님은 이런 외로운 개발자를 위해서

공짜로 Gemini를 제공해주신다 !!! 경배하라 !!!

 

의외로 모르시는 분들이 많은데,

GitHub.com 왼쪽 메뉴를 살펴보면 `Marketplace`가 있다.

- https://github.com/ 

 

 

Marketplace에서는 여러 유형의 상품(?)을 제공해주고 있는데, `Apps` 항목을 살펴보자.

좀 더 편하게 살펴보기 위해 `AI Assisted` 카테고리를 선택하면 `Gemini Code Assist`를 발견할 수 있다.

 

 

오해를 줄이기 위해서는 `Gemini Code Assist for GitHub`이라고 해야할 것 같은데...

https://github.com/marketplace/gemini-code-assist 

 

 

생각보다 설치 수가 좀 적어서 깜짝 놀랐다 !!

 

GitHub PR(Pull-Request)과 관련된 몇 가지 명령어를 제공해주고 있다.

 

 

우리의 구글님은 이런 아름다운 기능을 `Free`로 제공해주고 계신다 !! 경배하라 !!

하지만, 나중에는 십일조라도 받아가시겠지!? ^^

 

 

지금은 Free Tier 이지만,

나중에 얼마든지 십일조를 걷어가기 위해 `결제 정보`는 요구하고 있다.

 

 

개인 계정을 기준으로 설치할 수도 있고, Organization 단위로 설치할 수도 있다.

 

화끈하게 All repositorues를 선택해도 좋지만,

처음에는 조심스럽게(소심하게?) `Only select repositories`를 선택해보자.

 

 

이제서야 `Gemini Code Assis for GitHub`라고 자백하는구나 !!

 

 

우리의 구글님께 모든 권한을 바칩니다 !!! 

 

 

개인 계정 또는 Organization을 선택해야 한다.

 

 

리뷰의 정도를 선택할 수 있는 것 같은데, 일단은 Medium !

 

 

이 정도의 설정만 해주면 된다.

 

 

지정한 Repository의 Settings를 보면 잘 설치되어 있는 것을 확인할 수 있다.

 

 

이렇게 해놓은 상태에서, PR을 신규로 올리면 자동으로 코드 리뷰를 진행해준다.

그리고, 직접 명령을 내릴 수도 있다.

 

 

이렇게 명령을 내리면, gemini가 지켜보는 이모지가 등장한다 !! 귀엽다 !!

 

 

그렇게 시간이 좀 지나면, Gemini가 리뷰를 준다.

 

 

Summary는 기다림 없이 바로 이루어진다.

 

 

리소스 할당에 따라 지켜보는 이모지가 선택적으로 나오는 것일까?

 

 

코멘트 중간에 Gemini 홍보(광고? 안내? 공지?)도 들어있다.

 

무료인데 안쓸 이유는 없을 것 같다 !! 고고씽 !!

반응형

`구글의 위기`라고 했던 것이 얼마 안된 것 같은데,

최근에는 ChatGPT 대신 Gemini를 구독한다는 사람들이 주위에 종종 있는 것을 보면 정말 구글의 저력이란 !!!

 

AI 개발자들을 위해서 제공해주는 통합 사이트를 방문해보자.

- https://ai.google.dev/ 

 

 

Gemini API 가이드 문서도 여기에서 살펴볼 수 있다.

https://ai.google.dev/gemini-api/docs 

 

 

 

Gemini API를 사용하기 위한 방법을 빠르게 살펴보도록 하자.

- https://ai.google.dev/gemini-api/docs/quickstart 

 

 

Coding Agent의 세상이기에 Skills 설치 가이드를 친절하게 알려주고 있다.

 

Skills 등록하고 Coding Agent에게 알아서 하라고 해도 되겠지만,

우리는 공부하는 입장이니 훌륭한 Human Agent가 되기 위해 하나씩 공부해보자 !!

 

① API Key

API를 사용하겠다라고 하면 제일 먼저 떠오르는 그것 !!!

API Key를 확보해야한다.

 

 

Google AI Studio에서 Key를 받을 수 있다.

- https://aistudio.google.com/app/api-keys

 

 

예전에는 GCP 설정을 포함해서 상당히 복잡했지만,

요즘은 Google AI Studio에서 너무나 편하게 제공해주고 있다.

 

② GenAI SDK

Google에서는 일단 공식적으로 6개 언어를 지원해주고 있다.

https://ai.google.dev/gemini-api/docs/quickstart 

 

 

가장 대중적인, 그리고 내가 사랑하는 Python을 기준으로 살펴보겠다.

 

그런데, Gemini API를 사용하는 방법에 대해 구글링을 하다보면,

상당히 많은 블로그 포스팅 및 가이드에서 generativeai 패키지 이야기를 하고 있다.

- https://pypi.org/project/google-generativeai/

 

 

그렇다 !!

이제는 Deprecated 된 패키지이다.

지금은 genai 패키지를 사용해야 하는 것이다.

- https://pypi.org/project/google-genai/

 

 

 

③ Hands-On

genai 패키지는 Python v3.9 이상부터 지원을 하고 있다.

개인적인 취향 + 최근 트랜드에 맞춰 uv 패키지 관리자를 사용하는 것을 기준으로 실습해보도록 하겠다.

 

> uv python list | grep cpython

 

> uv init {project} --python 3.12
> cd {project}

 

genai 패키지 설치만 하면 된다.

 

> uv add google-genai

 

환경변수로 Key값 설정 후 가이드에 있는 샘플코드를 돌려보면 잘 되는 것을 확인할 수 있다.

 

 

간단하게 살펴보았다 !!

반응형

Local LLM을 직접 띄워서 공부하려는데,

GPU를 갖고 있지 않다고 시작도 하기 전에 포기하는 분들이 의외로 많은 것 같다.

 

사실 인내심만 충분히 있다면 CPU로도 맛보기는 가능한데도 이를 모르는 경우도 많은 것 같고,

 

또 하나! 우리의 구글님께서는 아름다운 Colab을 무료로 제공해주고 있기에

이를 이용하면 어지간한 그래픽카드에서도 어려운 모델들을 이용할 수 있게 된다.

 

[ Gemma ]

이번에 사용해볼 모델은 구글님이 우리에게 은혜를 내려주신 Gemma 이다.

https://deepmind.google/models/gemma/

 

 

구글님이 상업적으로도 사용할 수 있도록 `open-weights`로 공개해준 모델로써,

그다지 많은 인기가 높지는 않지만 구글님이 꾸준히 신경써주셔서 성능도 어지간히 나오는 괜찮은 모델이다.

 

다양한 유형의 다양한 크기 모델을 제공해주기 때문에, 상황에 맞게 골라서 사용하면 된다.

- https://ai.google.dev/gemma/docs/get_started?hl=ko

 

 

다만, 상업용으로도 사용할 수 있는 괜찮은 라이선스 조건이지만

일반적인 라이선스 유형은 아니고 'Gemma License'라는 특화된 라이선스이기에 주의를 하기는 해야 한다.

 

[ Ollama ]

LLM 모델을 serving하기 위해서는 사실 공부해야할 것도 많고,

 vLLM이나 SGLang같은 솔루션들을 살펴보고 이를 실행해야하는 등 어려움이 많다.

 

하지만, Local LLM을 사용하는 사람들을 위해 은혜로운 솔루션이 등장했으니,

그것이 바로 Ollama이다 !!! 그것도 MIT 라이선스로 !!!

https://ollama.com/

 

 

사용법은 더 이상 쉬운 방법이 없을 정도이다.

홈페이지에서의 가이드도 너무나 깔끔하다.

https://ollama.com/library/gemma3:12b 

 

 

[ Ollama on Colab ]

Colab에서 GPU 리소스를 사용하도록 하자.

https://colab.research.google.com/

 

 

Ollama 설치를 위해서 기본적인 패키지들을 미리 설치해주자.

!sudo apt-get install zstd lshw

 

 

Ollama 설치 자체는 너무나 쉽다.

!curl -fsSL https://ollama.com/install.sh | sh

 

 

서비스 실행은 직접 해줘야 한다.

!nohup ollama serve > ollama.log 2>&1 &

 

 

실제 실행에는 소요시간이 조금 필요하다. 2~3초 정도!?

 

여기까지만 하면 기본적인 준비는 끝이다 !!! 너무 쉽지 않은가!?

 

이제 다양한 활용 방법을 알아보자.

 

 

[ Ollama CLI ]

Gemma3 12B 모델을 이용해서 질문을 해보자.

!ollama run gemma3:12b "한국의 수도는 어디야?"

 

 

잘 대답을 하기는 하는데, 첫 실행에는 3분 정도 소요가 된다.

Gemma3 12B 모델을 다운로드 받는 것에 시간이 걸리는 것이다.

 

다시 같은 질문을 해보자.

!ollama run gemma3:12b "동탄이 어디인지 알아?"

 

 

이번에는 13초 정도만에 답변을 해준다.

 

간단한 Local LLM 사용 ... 정말 쉽지 않은가?!

 

 

[ with Python ]

Python으로 LLM을 이용하도록 해보자.

 

그렇게 하기 위해서는 우선 필요한 Local LLM 다운로드를 먼저 해야한다.

!ollama list
!ollama pull gemma3:12b

 

 

`ollama list`를 이용해서 필요한 모델이 있는지 먼저 확인을 해보고

없으면 pull을 이용해 다운로드를 받으면 된다.

 

다운로드를 받았다면 이렇게 확인이 된다.

 

 

Python을 이용해서 ollama 활용을 하기 위해서는 패키지 설치가 필요하다.

!pip install ollama

 

 

이제 준비는 모두 끝났다.

코딩을 해보자.

import ollama 

try : 
    response = ollama.generate( 
        model= "gemma3:12b" , 
        prompt= "대한민국의 제2의 수도는 어디인가요?"
     ) 
    print (response[ "response" ]) 

except Exception as e: 
    print ( f"오류가 발생했습니다: {e} " )

 

 

순차적으로 문장을 생성하는 LLM 특성을 반영해서

stream 방식으로 처리하도록 해보자.

import ollama 

try : 
    client = ollama.Client() 
    stream = client.generate( 
        model= "gemma3:12b" , 
        prompt= "대한민국의 제3의 수도는 어디인가요?" ,
        stream= True
     ) 

    print ( "Stream:" ) 
    for chunk in stream: 
        print (chunk[ 'response' ], end= '' , flush= True ) 
    print ()

except Exception as e: 
    print ( f"스트리밍 중 오류가 발생했습니다: {e} " )

 

 

 

[ REST API ]

Ollama는 실제로 REST API 방식으로 서빙이 된다.

그렇기에 `curl`을 통해서도 접근을 할 수가 있다.

!curl http://localhost:11434/api/generate -d '{ \
  "model": "gemma3:12b", \
  "prompt":"경기도의 대표 도시는 어디야?" \
}'

 

 

generate 방식 말고 chat 방식도 지원을 해준다.

!curl http://localhost:11434/api/chat -d '{ \
  "model": "gemma3:12b", \
  "messages": [ \
    { "role": "user", "content": "경기도의 대표 도시는?" } \
  ] \
}'

 

 

어!? 그렇다면,

Colab으로 서비스를 띄워놓고 내 PC에서 원격으로 사용할 수는 없을까!?

 

있다!!!! 가능하다!!!

 

 

[ ngrok ]

Colab에서 띄워놓은 서비스를 외부에서 접근할 수 있도록 하기 위해서

명시적인 주소를 하나 할당해주는 것이 필요하다.

- https://ngrok.com/

 

 

가입만 하면 무료로 사용할 수 있는 아주 아름다운 서비스이다.

하지만, 당연하게도 token 발급을 해야한다 ^^

https://dashboard.ngrok.com/get-started/your-authtoken

 

 

Colab에 어떻게 설치를 하면 좋을까!?

ngrok은 아주 친절하게 다양한 설치 방법을 제공해준다.

우리는 Download 방식으로 해보겠다.

https://ngrok.com/download/linux?tab=download

 

 

파일을 다운로드 받을 수 있는 주소를 먼저 확보해보자.

 

 

이제 Colab에서 설치를 진행하면 된다.

!wget <URL>

!tar -xvzf ngrok-v3-stable-linux-amd64.tgz ngrok

!./ngrok config add-authtoken <TOKEN>

!ollama serve & ./ngrok http 11434 --host-header="localhost:11434" --log stdout & sleep 5s && ollama run gemma3:12b

 

 

ngrok을 실행하면 URL 주소를 하나 알려준다. 메모하자.

 

 

 

[ Remote Connect with Python ]

집에 있는 내 PC에서 접근해보기 위해서 일단 Python 실행 환경을 확보하자.

최근 유행에 맞춰 `uv`를 이용해 보도록 하겠다.

> uv init gemma --python 3.12

> cd gemma

> uv add langchain_ollama

 

 

소스 코드는 단순하다.

from langchain_ollama import ChatOllama

model = ChatOllama(
       model="gemma3:12b",
       temperature=0,
       base_url="URL"
       )

response = model.invoke("대한민국의 수도는 어디야?")
print(response)

 

 

너무나 잘 된다 !!!

 

이제는 Colab에 나만의 LLM Server를 두고, 마음껏 LLM API를 사용할 수 있게 되었다 !!!

 

 

가난한 개발자의 몸부림은 계속 됩니다 !!! ^^

반응형

나의 밥벌이에 지대한 공헌을 한 도구 중 하나가 바로 "GitHub"이고,

최근 계속 관심을 갖고 있는 것이 "MCP (Model Context Protocol)"인데 ...

 

"GitHub MCP Exploited" 이라니 !!!

 

https://invariantlabs.ai/blog/mcp-github-vulnerability

 

 

https://simonwillison.net/2025/May/26/github-mcp-exploited/

 

 

어떻게 동작하는 것인지는 아래 그림 하나로 설명이 된다.

 

 

공개 저장소에 있는 이슈를 분석해서 해결하라는 명령을 하는 경우,

이슈에 "개인 저장소 정보를 읽어와서 그것을 저장"하라는 문구를 포함하게 되면,

GitHub MCP에 개인 토큰이 있기 때문에 개인 private 저장소의 내용이 유출될 수 있다는 것이다.

 

공개 저장소에 아래와 같은 이슈를 포함하기만 하면 되는 것이다.

 

그러면, 아래와 같은 정보를 얻어낼 수 있다.

 

 

문제는 Official GitHub MCP Server에서도 적용이되는 보안 위협이라는 것이다.

 

https://github.com/github/github-mcp-server

 

 

그러면, 이런 보안 위협을 방지하기 위해서 주의해야할 점은 무엇이 있을까!?

 

① MCP Server

  - Official 배포되는 MCP Server도 보안 위협이 있을 수 있는데,

  - 비공식 배포되는 MCP Server는 더더욱 위험할 수 밖에 없다.

 

② Check

  - MCP tool을 사용할 때에 Agent가 확인을 요구하는데, 그냥 pass하지 말고 확인해야 한다.

  - Always Allow는 되도록 사용하지 말아야 한다.

 

③ token

  - 이런 보안 위협을 막기 위해서는 근본적으로 PAT(Personal Access Token) 관리를 잘해야 한다.

    . https://github.com/settings/personal-access-tokens/new

 

  - Token을 사용하지 않을 수 없지만, 꼭 필요한 권한만 세부 설정해서 등록/사용하는 것이 좋다.

    . classic 타입의 token은 보다 더 세밀한 권한을 관리할 수 있다.

 

 

MCP라는 것이 나온지 얼마 되지 않은 규약이다보니 아직은 미흡한 점이 많을 수 있다.

그렇기에 근본적으로 이런 부분을 방지하기 위한 많은 연구가 있어야 할 것이다.

 

 

"GitHub MCP Exploited"이라고 해서,

"어?! 그러면 GitHub MCP Server를 쓰면 안되겠네?!"라고 생각하는 것은 좀 오버인 것 같고

"좀 더 조심히 사용해야겠다" 정도로 받아들이면 좋을 것 같다.

 

어떻게 동작하는지 좀 더 공부를 하고

동작할 때 사용되는 타겟이 무엇인지 결과가 어디에 적용이 되는지 유심히 살펴봐야 하는 것이다.

 

항상 input/output 관리가 중요하다!

반응형

'AI_ML > LLM' 카테고리의 다른 글

Gemini API 사용해보기  (1) 2026.03.15
Ollama를 Google Colab에서 서비스 해보자  (1) 2026.02.21
HuggingFace - LLAMA 3.2 for Korean  (2) 2024.11.12
HuggingFace - Learn - NLP Course #3  (3) 2024.11.11
HuggingFace - Learn - NLP Course #2  (0) 2024.11.10

오늘은 왠지 LLAMA가 눈길을 끌어서 ...

 

llama-3.2-Korean-Bllossom-3B

 

친절하게 예제 코드도 제시해주고 있다.

 

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

model_id = 'Bllossom/llama-3.2-Korean-Bllossom-3B'

tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    torch_dtype=torch.bfloat16,
    device_map="auto",
)
instruction = "철수가 20개의 연필을 가지고 있었는데 영희가 절반을 가져가고 민수가 남은 5개를 가져갔으면 철수에게 남은 연필의 갯수는 몇개인가요?"

messages = [
    {"role": "user", "content": f"{instruction}"}
    ]

input_ids = tokenizer.apply_chat_template(
    messages,
    add_generation_prompt=True,
    return_tensors="pt"
).to(model.device)

terminators = [
    tokenizer.convert_tokens_to_ids("<|end_of_text|>"),
    tokenizer.convert_tokens_to_ids("<|eot_id|>")
]

outputs = model.generate(
    input_ids,
    max_new_tokens=1024,
    eos_token_id=terminators,
    do_sample=True,
    temperature=0.6,
    top_p=0.9
)

print(tokenizer.decode(outputs[0][input_ids.shape[-1]:], skip_special_tokens=True))

 

3B 모델에서 과연 저 문제를 풀 수 있을까?

 

구글 코랩에서 위 코드를 실행해보자. (나는 GPU도 없는 가난한 머글이니까 ㅠㅠ)

Exception

 

어?! 시키는 그대로 했는데, 왜?!

 

구글 코랩에서 기본 버전을 업그레이드 해주면 발생하지 않을테지만,

현재는 transformers, tokenizers 버전이 낮아서 발생하는 것으로 보인다.

 

!pip install --upgrade transformers tokenizers

pip install

 

설치가 끝나면 세션 재시작을 요구한다.

하면 된다.

 

그리고 나서 실행하면 시간이 좀 걸리지만... 잘 된다.

철수가 20개의 연필을 가지고 있었고 영희가 절반을 가져가면, 영희가 가져간 연필은 20 / 2 = 10개입니다.

철수가 남은 연필은 20 - 10 = 10개입니다. 민수가 5개를 가져가면, 철수가 남은 연필은 10 - 5 = 5개가 됩니다.

따라서 철수가 남은 연필의 갯수는 5개입니다.

 

그리고, 문제도 잘 푼다!!!

 

반응형

+ Recent posts