tipsofday: 로컬 Gemma 모델을 이용해 작성하는 일일 암호화폐 브리핑
요약
로컬에서 구동되는 Gemma 4 모델을 활용하여 암호화폐 뉴스를 분석하고, 출처와 신뢰도까지 포함한 일일 브리핑 CLI 도구 'tipsofday'를 소개합니다. 이 도구는 사용자의 기기에서 작동하므로 개인 정보 보호에 강하며, 단 하나의 명령어로 핵심 정보를 요약해 줍니다. 이 프로젝트는 오픈 소스 AI 챌린지 출품작으로, 실제 금융 시장의 흐름을 파악하는 데 도움을 주는 실용적인 개발 사례입니다.
핵심 포인트
- 로컬 Gemma 모델 기반의 암호화폐 브리핑 도구 'tipsofday' 소개
- 사용자 기기에서 구동되어 높은 개인 정보 보호를 보장함
- 단일 CLI 명령어(`tipsofday run`)로 핵심 뉴스 신호를 요약 제공
- 오픈 소스 프로젝트로, Python 기반의 테스트 및 재현 용이
이것은 Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle에 제출하는 글입니다.
한 줄 요약: 오늘날의 암호화폐 뉴스를 짧고 출처가 연결된 브리핑으로 변환해 주는
pipx install로 바로 사용할 수 있는 CLI 도구 — 사용자의 기기에서 오픈 가중치(open-weight) 모델이 작성하며, 하루에 $0.00이며, 사용자 관심 종목 목록을 누구에게도 전송하지 않습니다.
제가 만든 것 (What I Built)
그냥 지갑을 들고 하루를 시작하는 방식: 브라우저 탭 스무 개를 열고, 같은 헤드라인 다섯 개를 훑어보며, 오늘 실제로 중요한 것이 무엇인지 알아내려고 애쓰는 것입니다.
tipsofday가 그 읽기 작업을 대신해 줍니다. 단 하나의 명령어를 실행하기만 하면 됩니다:
tipsofday run --lang en
이 명령어는 오늘날의 암호화폐 피드를 읽고, 공개 API에서 실제 가격을 가져와, 로컬에서 구동되는 Gemma 4 모델이 브리핑을 작성합니다: 그날의 분위기, 출처가 포함된 주요 스토리, 오늘 가장 강력한 '뉴스 신호(news signal)'를 가진 자산 하나, 그 이유, 신뢰도 수준(confidence level), 위험 요소(risks), 그리고 어떤 것이 이 예측을 무효화할지까지입니다. 뉴스가 적거나 모순적일 때는 임의로 종목을 선택하는 대신 **
호스팅된 링크는 없으며, 이것이 핵심입니다. 모델은 사용자의 하드웨어에서 실행되기 때문에 '배포 데모(deployed demo)'는 별개의 제품이 됩니다. 이 데모는 release/demo-script.md를 따라 진행되는 60~90초 분량의 화면 녹화 영상입니다: 비행기 모드(airplane mode)로 설정하고, ollama ps 명령어로 모델이 로컬임을 증명한 후, 네트워크 연결을 다시 하고, tipsofday run으로 브리핑을 스트리밍하며, 마지막으로 eval/replay.py를 통해 가드레일(guardrails) 작동 모습을 보여줍니다.
영상에 대한 텍스트 대체본입니다 — 실제 결과물은 기본적으로 pt-BR이며, 영어는 --lang en 옵션을 사용합니다:
╭──────────────────── 오늘의 하이라이트 ──────────────────────────╮
│ BNB 신뢰도: 중간 │
│ │
...
세 가지 명령어로 직접 재현할 수 있습니다: ollama pull gemma4:e4b, pipx install ., 그리고 tipsofday run --refresh --lang en.
코드 (Code)
Apache-2.0 라이선스입니다. 전체 애플리케이션은 하나의 읽기 쉬운 Python 파일(tipsofday.py, 약 2,300줄)로 구성되어 있어 한 번에 감사(audited)하고 나중에 분할하기 용이합니다. 테스트, 리플레이 하네스(replay harness), 그리고 배포본은 같은 저장소에 있습니다.
{% embed https://github.com/adalbertobrant/tipsofday %}
tests/— 32개의 오프라인 단위 테스트 및 통합 테스트 (네트워크 연결, 모델 필요 없음). GitHub Actions를 이용한 CI가 지원되며, Python 3.11–3.14 버전을 사용합니다.eval/—freeze.py(하루 데이터를 캡처),replay.py(실제 파이프라인을 통해 동결된 HTTP 본문 제공),backtest.py, 그리고RESULTS.md파일로 구성되어 있습니다.DECISIONS.md— 모든 주목할 만한 선택 사항과 그 배경이 되는 벤치마크(benchmark)를 기록했습니다.LEGAL_NOTES.md— 이 도구가 정보 제공 목적이며 규제 경계가 어디에 있는지 설명합니다.
제가 구축한 방법 (How I Built It)
오픈 소스 AI가 핵심이지, 장식품이 아니다. 사용자가 읽는 모든 문장은 Ollama를 통해 구동되는 오픈 웨이트 모델, 기본적으로 gemma4:e4b (Apache-2.0, ~6.6 GB Q4)에 의해 작성된다. 전체 모델 레이어는 하나의 LLMBackend 인터페이스 뒤에 위치하므로, Ollama, llama.cpp GGUF, 또는 오프라인 MockBackend가 플러그 앤 플레이(drop-in swaps) 방식으로 교체 가능하며, 테스트에서는 Mock을 사용해 CI 환경에서 GPU가 필요 없도록 한다.
이 파이프라인은 맵–리듀스(map–reduce) 방식이다. 각 기사는 구조화된 통찰력(자산, 이벤트, 감성, 한 줄 요약)으로 매핑되고, 이후 순수 Python을 사용하여 자산별 가중치 감성 점수(출처 신뢰도 × 최신성)로 축소되며, 마지막 호출에서 브리핑 JSON이 작성된다.
다섯 가지 설계 규칙이 이 시스템을 지탱하고 있으며, 각 규칙은 무언가가 없었기 때문에 깨졌던 경험을 바탕으로 존재한다:
- 숫자는 모델이 아닌 API에서 온다. 출력의 모든 숫자는 시장 스냅샷과 교차 확인되며, 근거가 부족한 숫자가 포함된 문장은 제외된다.
- 웹 텍스트는 지시사항이 아니라 데이터이다. 기사 텍스트는 데이터 구분자로 감싸지며 알려진 주입 구문(injection phrasing)은 모델로 들어가는 과정과 출력되어 렌더링되기 전 단계 모두에서 제거된다.
- 선택 자산에 상한선이 있다. 마이크로캡(micro-caps)이나 유동성이 낮은 토큰은 주요 초점 자산이 될 수 없다.
- '오늘 명확한 신호 없음'은 유효한 답변이다 — 특히 뉴스가 부족할 때 올바른 답변이다.
- 로컬 SQLite 기록을 통해 추적 기록(track record) 작성이 가능하며, 이 기록은 샘플이 충분히 클 때까지 백분율 공개를 거부한다.
측정값이 실제로 말해준 것들
나는 실제 파이프라인을 통과하는 동결된 HTTP 바디를 공급하는 리플레이 하네스(replay harness)를 구축하여, 숫자들이 오프라인에서도 재현 가능하도록 했다. 모든 것이 잘못되었던 것을 포함한 전체 상세 내용은 eval/RESULTS.md에서 확인할 수 있다. 간략히 말하자면, RTX 5050 (8 GB)에서:
| English | pt-BR | |
|---|---|---|
| Valid JSON, per call | 1.00 | 1.00 |
| ... | ||
| 제가 차라리 공개하고 싶지 않은 세 가지 발견 사항이 있지만, 이를 숨기는 리뷰는 진정한 리뷰가 아닙니다: |
- 가드레일(guardrail)이 제품을 조용히 비활성화했습니다. 모델은 계속해서 BTC를 언급했고 (부정적 뉴스 ⇒ 부적격), 이로 인해 앱은 6일 중 6일 동안 "명확한 신호 없음"을 반환했습니다. 안전하지만 쓸모가 없습니다. 저는 단일 자격 재시도 기능을 추가했고, 이제 영어에서는 6일 중 4일에서 문제가 발생합니다. 포르투갈어에서는 거의 작동하지 않으며 여전히 6일 중 5일에서 거부됩니다. 이 불안정성 자체가 발견 사항입니다: 4B 모델의 판단은 언어에 의존적이며, 따라서 출력은 신호(signal)가 아닌 뉴스 요약으로 구성됩니다.
- 보안 가드레일(security guardrail)이 데드 코드(dead code)였습니다. 나중에 수행된 보안 검토에서 프롬프트 주입 스크러버(prompt-injection scrubber)—작성되고 단위 테스트까지 완료되었던—가 파이프라인에 의해 실제로 호출되는 적이 없다는 것을 발견했습니다. 따라서 주입 구문은 런타임(runtime) 어느 곳에서도 수정되지 않았고, 가져오기 경로(fetch path)는 모든 URL을 허용했습니다 (SSRF 취약점). 두 가지 모두 수정되었습니다: 이제 수정 작업은 입력과 출력 모두에서 실행되며, 비공개 호스트는 거부됩니다. 이 수정 작업은 텍스트를 보존하므로 위의 재생 수치들은 변하지 않습니다 (적대적인 날짜에 재검증됨, 두 언어 모두).
- 솔직하게 측정된 것은 n = 1 실제 하루입니다. 포착된 하루와 다섯 개의 파생 스트레스 프로브(빨강/황소, 주입, 세일즈, 희박)로 구성되어 있습니다. 이 프로브들은 정확도가 아닌 가드레일을 테스트하며, 보고서의 자체 "유효성 위협" 섹션에도 명시되어 있습니다. 백테스트는 닫힌 결과가 전혀 없음에도 불구하고 _"보고할 솔직한 내용 없음"_을 출력합니다.
또한 저는 제 자신의 지표(metric)에 버그 (파이프라인이 폐기하는 필드의 숫자를 계산함)와 제 자신의 코퍼스(corpus)에 버그 ("희박한 날" 데이터가 시장 데이터를 삭제하고 있었음)를 발견하고 수정했습니다. 둘 다 조용히 수정된 것이 아니라 RESULTS.md에 문서화되어 있습니다.
왜 오픈 이노베이션이 중요한가요?
왜냐하면 이 특정 제품은 폐쇄적인 환경에서는 작동하지 않기 때문입니다.
- 경제성은 0에서만 작동한다. 브리핑 작성 비용은 API 지출로 $0.00이며, 클라우드 환경으로 환산하면 약 $0.003입니다. 이는 호출당 반올림 오차일 뿐이며, 사용자당 일별 비즈니스 결정의 문제입니다. 사용자가 이미 소유한 하드웨어에서 작동하는 오픈 웨이트(open-weight) 모델은 '멋진 사이드 프로젝트'와 '마진이 붙는 월 $7짜리 도구'를 가르는 차이입니다.
- 약속은 프라이버시이며, 로컬 추론만이 이를 지킬 수 있다. tipsofday의 핵심 주장은 작가의 관심 종목(watchlist), 포지션, 클라이언트 이름이 절대로 노트북을 벗어나지 않는다는 것입니다. 데이터를 가져오는 과정(fetch)에는 인터넷 연결이 필요하지만, 사고(thinking) 과정은 그렇지 않습니다. 호스팅되는 API로는 이러한 약속을 할 수 없습니다.
- 구조적으로 종속되지 않는다. 이 모델은 하나의 인터페이스만 거치면 됩니다. 포크(fork)하여 Gemma를 Qwen이나 Llama로 교체하거나, 특정 틈새 시장에 맞게 파인튜닝(fine-tune)하고, Raspberry Pi에서 실행해도 코드는 신경 쓰지 않습니다. 공급업체가 가격이나 정책을 변경하더라도 누구의 워크플로우도 중단되지 않습니다.
- 감사 가능성이 신뢰보다 낫다. 오픈 웨이트와 오픈 코드는 가드레일(guardrails)이 검토 가능하고, 프롬프트가 읽기 쉬우며, 평가 하네스(eval harness)를 자신의 기계에서 재실행할 수 있다는 것을 의미합니다. 이것이 바로 제가 위에서 실패 사례를 숨기는 대신 보고할 수 있었던 이유입니다.
- 오픈 웨이트 덕분에 더치 앵글의 틈새 시장 자체가 가능해졌다. 게이밍 노트북에 탑재된 4B 모델을 프롬프트와 필터를 통해 하나의 좁은 작업에 의존할 만한 것으로 만들 수 있습니다. 이것이 바로 오픈 혁신(open innovation)이 작동하는 방식입니다: 더 큰 모델이 아니라, 더 작고 소유 가능한 모델 말입니다.
나의 에이전트 세션 (My Agent Session)
빌드는 에이전트 중심(agent-first)으로 진행되었습니다. 전체 앱은 작성된 명세서(PROMPT.md)를 기반으로 작성되었으며, 모델 레이어와 가드레일은 신뢰하기 전에 벤치마킹되었고, 평가 하네스는 제품을 치켜세우기보다는 **반증(falsify)**하려고 구축되었습니다. 이 세션은 DevRelay에 저장되고 있으며, 게시하기 전에 여기에 삽입할 예정입니다.
나의 첫 사용자 (My First User)
아직 유료 사용자가 없습니다. 따라서 사용자 테스트를 그렇게 포장하는 것보다는 솔직하게 말하고 싶습니다. 현재 상황과 계획은 다음과 같습니다:
-
이 도구는 오늘 설치 가능하며(
pipx install .) 8GB 노트북 GPU에서도 실행됩니다. -
Pro 등급($7/month: 사용자 지정 관심 목록, 기록, JSON/Markdown 내보내기, 스케줄링)은 이미 구현되어 있으므로, 답변이 '예'라면 변환 경로는 존재하며 재구축할 필요가 없습니다.
마감일 전에 이것이 변경되면 이 섹션도 함께 변경될 것입니다.
수상 부문 (Prize Categories)
- Gemma 활용 최우수작 (Best Use of Gemma) — 브리핑은 전적으로
gemma4:e4b(Google의 오픈 웨이트 Gemma 4, Apache-2.0)에 의해 작성되었으며, Ollama를 통해 로컬에서 제공됩니다. Gemma는 여기서 보조 도구가 아닙니다. 바로 작가입니다. 파이프라인의 나머지 모든 것은 Gemma가 정직하게 작업하도록 유지하는 데 존재합니다: 검증된 숫자, 정제된 입력, 그리고 모델이 지어낸 것을 걸러내는 필터입니다.
다른 파트너 기술은 사용되지 않았으므로 다른 부문도 주장하지 않습니다.
정보 도구일 뿐이며 금융 조언이 아닙니다. tipsofday는 가격을 예측하거나 누구에게 무엇을 사거나 팔라고 말하지 않습니다. 오늘 뉴스 흐름이 어떤 자산에 초점을 맞추는지 보고하고, 그 과정을 보여줍니다.
이 글은 AI 코딩 에이전트의 도움을 받아 작성되었으며, 저는 여기에 있는 모든 숫자를 저장소의 커밋된 파일(eval/RESULTS.md 및 eval/의 원본 JSON)과 대조하여 확인했습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기