콘월 이층집

전체 글

openai-codex vs openai api 비교와 예시, 차이점, 장단점

반응형

지난 주(5/28)에 codex를 코드 레벨에서 제어할 수 있는 패키지가 배포되었다. 아직 정식은 아니고 베타상태이다. (6/3 기준 0.1.0b2)

 

 

openai-codex

Python SDK for Codex

pypi.org

 

기존 openai sdk와 다른 점은 컨텍스트의 주체가 다르다. 이게 무슨 말이냐면...기존 api key로 연결된 sdk를 사용할 때는 코드에서 api에 텍스트, 이미지, 파일 내용 같은 입력을 직접 보내고 응답을 받는 형태였다면, openai-codex는 codex 런타임을 열어서 session과 thread를 만들고 turn을 실행하여 로컬 파일을 읽거나 작업하게 만드는 방식이다. 

 

나름 설명한다고 썼는데 이해가 어려울 것 같아서 아래의 예시를 가지고 왔다. 두 파일을 가지고 답변을 받는다고 해보자. 

민아 : Room A 예약해둘테니 늦게오는 사람은 서있어라

 

openai api 를 호출하는 경우에는 이 텍스트 파일들을 읽어서 str로 보내는 신호에 넣어주어야한다. 반면 codex 로 호출할 때는 어느 위치에 있는지 경로를 입력으로 주면 된다. 간단한 예시라서 별 차이가 없어보이는데 복잡도가 올라갈 수록 토큰 사용량 측면에서 엄청난 차이가 발생할 여지가 있고, 최악의 경우 문제를 해결할 수 없을 것이다.

ROOT = Path(__file__).resolve().parent
QUESTION_PATH = ROOT / "examples" / "question.txt"
ANSWER_SOURCE_PATH = ROOT / "examples" / "answer-source.txt"

...
def read_question() -> str:
    return QUESTION_PATH.read_text(encoding="utf-8").strip()


def read_answer_source() -> str:
    return ANSWER_SOURCE_PATH.read_text(encoding="utf-8").strip()


def build_openai_input() -> str:
    return (
        "Answer the question using only the answer source.\n\n"
        f"Question:\n{read_question()}\n\n"
        f"Answer source:\n{read_answer_source()}\n\n"
        "Answer in Korean in one short sentence."
    )


def build_codex_prompt() -> str:
    question_path = QUESTION_PATH.relative_to(ROOT)
    answer_source_path = ANSWER_SOURCE_PATH.relative_to(ROOT)
    return (
        f"Read {question_path} and answer it using only {answer_source_path}. "
        "Answer in Korean in one short sentence. Do not edit files."
    )
...

 

참, 위 코드들은 https://github.com/ce-dric/openai-codex-file-comparison 에 올려두었다. OPENAI_API_KEY는 초기 발급받으려면 5달러를 내야하니, 굳이 돈쓰지말고 아래의 결과만 보고 가도 좋다.

GPT도 이제 지쳤다. 예약은 인간이 해라

 

이런 방식의 큰 이점은 비용 절감에 있는데, 로컬 파일 분석, 코드 수정, 로그 요약, 스크립트 생성 같은 작업을 자동화하기에도 적합하다. 단점으로는 실행 환경이 단순 API 호출보다 복잡하다는 점이다. 실행 시점에 codex 인증 상태 보장되어야하며 로컬 파일 권한과 sandbox 설정을 신경 써야된다.

 

따라서 openai-codex 는 기존 api 방식과 달리 다른 문제를 푸는 도구로 보는 편이 맞다.

- openai api : context를 준비해서 모델 API에 보내고 받는다.

- openai-codex : 코드 레벨에서 codex(agent)를 시작하고, 권한이 있는 경로 내 필요한 파일을 읽고 작업한다.

반응형

Ollama Cloud 모델로 밈 말투 모델 만들어보기 (휴먼샤갈체)

반응형

Ollama Cloud 모델로 밈 말투 모델 만들어보기

서론 (이하 잡담)

오늘은 대학원 수업이 있는 날이라 학교에 있는데 Ollama에서 메일이 왔다. MiniMax M3라는 신규 모델이 Ollama Cloud에서 지원된다는 내용이었다.

처음에는 그냥 “아, 또 새 모델이 나왔구나” 정도로 넘기려다가, 문득 궁금해졌다. 나는 Ollama Pro를 구독하고 있지는 않은데, 그럼 Cloud 모델을 아예 못 쓰는 걸까? 아니면 API key만 있으면 어느 정도는 호출이 되는 걸까?

요즘 이런 건 직접 눌러봐야 속이 편하다.

먼저 API 호출부터 확인

기존 프로젝트에 Ollama API key가 들어있는 .env가 있어서, 간단한 테스트 스크립트를 하나 만들었다. 블로그에 그대로 올리기에는 내 로컬 경로가 너무 강하게 박혀있으니, 대충 구조만 적으면 이런 식이다.

처음에는 정말 단순하게 “호출이 되나?”만 봤다.

import os
import requests

OLLAMA_API_KEY = os.environ["OLLAMA_API_KEY"]

response = requests.post(
    "https://ollama.com/api/generate",
    headers={"Authorization": f"Bearer {OLLAMA_API_KEY}"},
    json={
        "model": "minimax-m3:cloud",
        "prompt": "오늘 대전의 날씨는?",
        "stream": False,
    },
    timeout=60,
)

print(response.status_code)
print(response.json())

결과는 성공이었다.

{
  "ok": true,
  "status_code": 200,
  "model": "minimax-m3:cloud",
  "content": "",
  "done": true,
  "done_reason": "stop",
  "error": null
}

다만 처음에는 응답 내용이 비어있어서 스트리밍 출력 쪽도 확인했다. 이후 스크립트를 수정해서 스트리밍으로 토큰이 흘러나오게 만들었고, 일반 프롬프트 응답도 정상적으로 확인했다.

Tool calling도 되나?

요즘 모델을 볼 때는 단순 채팅보다 tool calling이 되는지가 더 궁금하다. 특히 Claude Code나 Codex 같은 에이전트에 붙이려면 이 부분이 중요하다.

테스트해보니 MiniMax M3 자체는 tool call을 반환할 수 있었다. 다만 중요한 점은 모델이 도구를 “직접 실행”하는 게 아니라, tool call JSON을 반환하면 클라이언트 쪽에서 그 함수를 실행해주고 결과를 다시 모델에게 넘겨야 한다는 점이다.

실제로 날씨 API를 호출하거나 파일을 읽거나 웹을 검색하는 건 앱/에이전트 쪽 책임이다. 이걸 안 붙이면 “툴 콜링이 안 되는 것처럼” 보인다.

ollama run minimax-m3:cloud도 되나?

궁금해서 CLI에서도 바로 실행해봤다.

ollama run minimax-m3:cloud

동작했다.

여기서 조금 의외였던 점은, 구독하지 않아도 Free 사용량 안에서는 Cloud 모델 접근이 가능하다는 점이었다. 물론 사용량은 소모된다.

Ollama의 사용량은 고정 토큰제가 아니라 GPU 사용 시간에 가까운 방식으로 보인다. 짧은 프롬프트 하나를 돌렸을 때 사용량이 1.5%에서 1.7% 정도로 올라갔다. 이걸 단순 토큰 수로 환산하기는 어렵다. 모델 크기, 생각 시간, 출력 길이, 캐시 여부에 따라 달라지는 구조에 가깝다.

ICL(In-Context Learning)

요즘 릴스에서 자주 보이는 말투가 있다.

“샤걀!”
“여러분 저 됐어요!”
“영상 낋여왔어요.”
“다음에도 낋여올게요.”

뭔가 과장된 쇼츠 자막 같고, 갑자기 숙연해지고, 소근소근하다가, 현실 자각을 하는 그런 말투다. 나는 이걸 그냥 “휴먼샤갈체”라고 부르기로 했다.

당연히 이런 걸 실제 fine-tuning까지 할 필요는 없다. Ollama에는 Modelfile이 있으니, 시스템 프롬프트와 예시만 잘 넣어도 어느 정도 말투 고정이 가능하다.

Modelfile 만들기

처음에는 예시 대화를 MESSAGE user, MESSAGE assistant로 넣었다. 그런데 이렇게 하니 ollama run을 실행할 때마다 예시 대화가 주르륵 보이는 문제가 있었다.

이건 별로였다. 모델을 처음 실행했는데 예시가 계속 보이면 사용하는 입장에서는 너무 지저분하다.

그래서 구조를 바꿨다.

FROM minimax-m3:cloud

TEMPLATE {{ .Prompt }}

SYSTEM """
너는 한국어 숏폼 밈 말투 '휴먼샤갈체' 어시스턴트다.
...
"""

예시는 MESSAGE가 아니라 SYSTEM 안에 “스타일 예시”로 넣었다. 그대로 복사하지 말고 리듬만 참고하라는 식으로 작성했다.

모델 빌드와 실행

로컬에서 먼저 만들었다.

ollama create human-chagall-style -f Modelfile
ollama run human-chagall-style

초기 버전은 꽤 웃겼지만, 조금 문제가 있었다. 답변이 너무 길어지거나, 같은 표현만 반복하거나, MiniMax M3 특유의 thinking이 길게 나왔다.

특히 Thinking...이 오래 보이는 점이 체감상 답답했다.

ollama run --hidethinking human-chagall-style

이렇게 하면 생각 과정 출력은 숨길 수 있다. 다만 실제로 생각을 덜 하는 건 아니고, 화면에 덜 보이게 하는 쪽에 가깝다.

업로드

이제 공개 모델로 올렸다. 올리는 방법은 아래와 같다.

ollama create cedric_private/human-chagall-style -f Modelfile
ollama push cedric_private/human-chagall-style

결과적으로 아래 주소에 올라가서 모델 카드나 설명을 확인이 가능하다.

https://ollama.com/cedric_private/human-chagall-style

실행은 이렇게 하면 된다. 물론, ollama cli 설치와 로그인이 되어있어야한다. (무료임)

ollama run --hidethinking cedric_private/human-chagall-style

올리고 나서 알게 된 점

업로드 후 모델 페이지에 들어가보니 시스템 프롬프트가 그대로 보였다.

처음에는 “아니 이게 다 보이네?” 싶었는데, 생각해보면 Ollama의 Modelfile 기반 모델은 원래 레이어 정보가 노출되는 구조다. SYSTEM, TEMPLATE, PARAMETER 같은 것들이 모델 정보로 표시된다.

즉, Ollama에 공개 모델로 올릴 때는 시스템 프롬프트를 비밀이라고 생각하면 안 된다.

비밀 프롬프트를 숨기고 싶다면 모델에 넣지 말고, 앱이나 API 호출 시점에 system message로 주입하는 편이 낫다. 하지만 이번 모델은 애초에 장난감에 가깝고, 사람들이 바로 호출하기 편한 게 더 중요해서 그냥 공개로 두기로 했다.

정리

이번에 확인한 건 대충 이렇다.

  • Ollama Free 계정에서도 Cloud 모델을 어느 정도 호출할 수 있다.
  • minimax-m3:cloud는 CLI와 API 양쪽에서 호출 가능했다.
  • Tool calling은 모델만 되는 게 아니라, 클라이언트가 tool 실행 루프를 구현해야 한다.
  • Ollama Modelfile로 말투 모델을 쉽게 만들 수 있다.
  • 공개 모델로 올리면 시스템 프롬프트는 보인다고 생각해야 한다.
  • minimax-m3:cloud 기반 커스텀 모델도 ollama push로 공유 가능했다.

결론적으로, 엄청난 fine-tuning을 한 건 아니지만 “이런 말투로 대답하는 모델을 Ollama에서 바로 실행하게 만들기” 정도는 꽤 간단했다.

그리고 무엇보다,

ollama run --hidethinking cedric_private/human-chagall-style

이 한 줄로 휴먼샤갈체를 부를 수 있게 됐다.

샤걀.

여러분 저 모델 배포 됐어요.

반응형

학교 크레딧으로 OpenCode 세팅하기

반응형

서론 (이하 잡담)

기존에는 Claude Pro를 할인 가격(월 11달러)으로 사용하고 있었으나, 할인 기간이 종료되면 월 22달러로 인상될 예정이었다. 고작 생맥주 한두잔 값이지만, 나름 디지털 월세를 줄여보자는 마음에 다른 대안을 찾아보고자 한다.

5시간마다 압박을 주던 Claude

 

올해 초에 OMO 프로젝트가 유명해짐에 따라 찍먹해본 OpenCode를 둘러보다 마침 학교 포탈 계정을 통해 위탁 업체가 제공하는 크레딧이 있어 이를 연동하기로 했다. 이번 학기에 추가된 기능인거같은데 생각보다 이용률이 되는지 최신 모델들도 반영이 되어있다. (채팅 한정) 

위탁업체는 마인드로직이라는 회사

 

잠깐 OpenCode 이야기

올해 초 OpenCode에 local llm 설정해본다고 온갖 설정을 해둔 탓에 뭐부터 건드려야 될지도 모르겠어서 그냥 초기화를 진행했다. 전에는 앤트로픽도 oauth 연결을 지원했던 것 같은데 현재는 codex만 가능하다. gemini 쪽은 다른 방법으로 연결이 가능한데 계정 블락의 위험이 있으니 시도해보지 않는 걸 추천한다. 

 

너무 중요한 API key 관리 방법...

참, 시작 전에 이야기할 게 있다. 함수 파라미터로 api 키를 넣다보니 에이전트들이 파일을 읽으면서 키가 노출되는 경우가 많았다. 가령 expand 해보면 키가 그대로 노출되어있다던지... 물론, 일전에 보였던 키들은 자동 충전이 막혀있어 별 문제는 없다. 요즘에는 doppler 라는 서비스를 활용하고 있는데, cli 로 로그인을 해두면 에이전트들한테 읽히게 하기 편해서 이 방법을 사용하고 있다. 프롬프트에 "doppler cli 보고 키 찾아서..." 를 추가해주면 알아서 잘 찾는다. 이런 도구들은 한번 설정하기가 귀찮지, 한번 해두면 편하다. 프로젝트마다 '.env' 파일을 수기로 작성하는 노력도 괜찮지만...귀찮다.

https://www.doppler.com/

 

무튼, 직접 설정 파일을 수정하는 번거로움 마저도 줄이기 위하여 antigravity(agy)로 글로벌 설정 파일(opencode.jsonc)의 provider 섹션에 FactChat로 자동 추가하도록 했다. 위탁사에서 팩트체크 기능을 api 호출로 만들어뒀는지는 몰라도 FactChat으로 설정해둔 건 굳이 바꾸지 않았다. (적당한 변수명 짓는 게 세상에서 제일 어려움)

연동 완

 

직접 하는 방법도 있는데, 4월 초 수정된 문서임에도 오래전 모델들이 기재되어있어 추천하지는 않는다. (이제는 사라진, 지원 안되는 모델들도 있음...) 

https://docs.mindlogic.ai/docs/cnu-ac/gateway/getting-started/overview#api-gateway

분명한 한계점, 그럼에도 활용하기 위한 고민

단일 모델로 사용하는데는 사실상 문제가 없으나, opencode의 특징을 살리기 위해서는 모델 스위칭을 지원해야한다. 

{
  "$schema": "https://opencode.ai/config.json",
  "model": "factchat/gpt-5.5",
  "small_model": "factchat/gemini-3.5-flash",
  "agent": {
    "plan": {
      "model": "factchat/gemini-3.1-pro-preview"
    },
    "build": {
      "model": "factchat-codex/gpt-5.3-codex"
    },
    "general": {
      "model": "factchat/claude-sonnet-4-6"
    },
    "explore": {
      "model": "factchat/gemini-3.5-flash"
    }
    ...

 

설정 파일(opencode.jsonc)에 뼈대를 잡고 에이전트가 단계를 나누어 일하도록 라우팅을 매핑했다. 아쉽게도 하위 호출은 동작하지 않고 단일 통합 모델인 GPT 5.5 FactChat만 호출되는 걸 발견했다. 이는 게이트웨이 엔드포인트 자체의 라우팅 제한이 걸려있는 것 같다. 호출 전후를 비교해보고 토큰 수 대비 크레딧 감소량을 비례식을 세워보면, 매달 주어지는 5,000 크레딧은 약 263만 토큰 정도가 된다.  그럼 매달 주어지는 이 크레딧의 활용처는 어디가 좋을까. 아무래도 작업을 위한 에이전트로서의 활용보다는 github에 이슈트래커 정도로 활용해보는 게 좋을 것 같다. 263만 토큰이면 A4 기준 2500장 정도의 내용이라고 하니..

https://opencode.ai/docs/ko/github/

반응형

+ 최근 글