본문 바로가기
AI

젬마4(Gemma4) AI에이전트 만들기 함수호출 실전가이드 1 - 코딩 어시스턴트

by 심독 2026. 4. 19.

사고 모드·멀티모달 입력을 활용한 실전 에이전트 구축


들어가며: "에이전트"가 가능해진 오픈 모델

GPT-4o나 Claude를 에이전트로 사용하면 API 비용이 빠르게 쌓인다.
에이전트는 단일 요청이 아니라 수십 번의 함수 호출과 반복 추론으로 이루어지기 때문이다.

 

젬마 4는 이 문제를 근본적으로 바꿨다.

  • 전 모델에서 네이티브 함수 호출을 지원하고,
  • 사고 모드(Thinking Mode)로 다단계 추론을 수행하며,
  • τ2-bench 에이전틱 점수가 전 세대 대비 +1,200% 향상되었다.
  • 그리고 이 모든 것이 로컬에서 무료로 실행된다.

이 글은 젬마 4로 실제 동작하는 에이전트를 만드는 실전 방법 중 첫 번째로
나만의 코딩 어시스턴트를 만들어본다.


1. 젬마 4의 에이전트 핵심 기능

사고 모드 (Thinking Mode)

복잡한 추론이 필요할 때 사고 모드를 활성화하면
모델이 최대 4,000+ 토큰의 내부 추론을 거친 후 최종 답변을 제공한다.
AIME 수학 문제에서 89.2%를 달성한 것도 이 기능 덕분이다.

# Ollama에서 사고 모드 활성화
import ollama

response = ollama.chat(
    model="gemma4:e4b",
    messages=[
        {"role": "user", "content": "이 알고리즘의 시간 복잡도를 단계별로 분석해줘: [코드]"}
    ],
    "think": True # ✅ thinking 모드 활성화
)
print(response["message"]["content"])

2. 실전 예제: 로컬 멀티모달 코딩 어시스턴트

젬마 4 + Ollama + Gradio 코딩 어시스턴트 구현이다.
모든 처리가 로컬에서 이루어진다.

 

특징:

  • 왼쪽 코드 에디터 + 오른쪽 AI 채팅 분할 화면
  • 이미지·코드 파일 첨부 입력 지원
  • 에디터의 현재 코드를 컨텍스트로 자동 주입
  • 스트리밍 응답

핵심 코드 구조:

import gradio as gr
import requests
import json
import base64

OLLAMA_URL = "http://localhost:11434/api/chat"
MODEL = "gemma4:e4b"

def chat_with_agent(message, history, editor_code, files):
    history = history or []
    message = message or ""
    editor_code = editor_code or ""
    files = files or []

    if not message.strip():
        yield history
        return

    if editor_code.strip():
        text_prompt = f"현재 에디터 코드:\n```\n{editor_code}\n```\n\n질문: {message}"
    else:
        text_prompt = message

    payload = {
        "model": MODEL,
        "messages": [{"role": "user", "content": text_prompt}],
        "think": True, # thinking 모드 활성화
        "stream": True
    }

    # 이미지 처리
    images = []
    for file in (files or []):
        try:
            with open(file.name, "rb") as f:
                img_b64 = base64.b64encode(f.read()).decode()
            images.append(img_b64)
        except Exception as e:
            print("이미지 오류:", e)

    if images:
        payload["messages"][0]["images"] = images

    new_history = history + [
        {"role": "user", "content": message},
        {"role": "assistant", "content": ""}
    ]

    try:
        with requests.post(OLLAMA_URL, json=payload, stream=True, timeout=120) as r:
            r.raise_for_status()
            for line in r.iter_lines():
                if line:
                    chunk = json.loads(line)
                    if "message" in chunk:
                        delta = chunk["message"].get("content", "")
                        new_history[-1]["content"] += delta
                        yield new_history
    except requests.exceptions.ConnectionError:
        new_history[-1]["content"] = "❌ Ollama 서버에 연결할 수 없습니다."
        yield new_history
    except Exception as e:
        new_history[-1]["content"] = f"❌ 에러 발생: {str(e)}"
        yield new_history


# Gradio 6.x: theme은 Blocks가 아닌 launch()로 이동
with gr.Blocks() as demo:
    gr.Markdown("## 🤖 Gemma4 Dev Chat")

    with gr.Row():
        code_editor = gr.Code(
            language="python",
            label="코드 에디터",
            lines=20
        )
        with gr.Column(scale=1):
            # Gradio 6.x: type 파라미터 없음, messages 형식이 기본값
            chatbot = gr.Chatbot(height=500)
            msg_input = gr.Textbox(
                placeholder="메시지를 입력하세요 (Enter 전송 / Shift+Enter 줄바꿈)",
                lines=2
            )
            file_input = gr.File(file_count="multiple", file_types=["image"])

    msg_input.submit(
        chat_with_agent,
        inputs=[msg_input, chatbot, code_editor, file_input],
        outputs=chatbot
    ).then(
        lambda: "",
        None,
        msg_input
    )

# theme은 여기로
demo.launch(theme=gr.themes.Soft())

 

실행 방법:

# 1. Ollama에서 모델 실행
ollama serve
ollama pull gemma4:e4b

# 2. Gradio 앱 실행
pip install gradio requests
python app.py
# → http://localhost:7860 접속

# 3. 코드 에디터에 다음과 같이 입력(일부러 틀린 코드)
print(hello)

# 4. Textbox에 다음과 같이 입력
hello라고 출력하고 싶어.  뭐가 문제야?

# 5. File에 파일을 올리고 관련된 질문도 가능

 

▲ 실행 화면

사례: 의료 영상 분석
PACS 시스템에 연동되는 로컬 AI 리포트 보조 도구를 젬마 4 E4B 기반으로 구축할 수 있다.
의료 이미지는 보안상 클라우드 전송이 불가능한 경우가 많다.
젬마 4의 이미지 입력 기능으로 X-ray 이미지와 환자 기록 텍스트를 함께 처리하고,
함수 호출로 내부 의료 DB를 조회하는 에이전트를 만들 수 있다.
모든 처리가 병원 내 서버에서 완결되어 규정 준수 문제가 해소되었다.


마치며

젬마 4는 에이전트 구축에 있어 처음으로 "오픈 소스이면서 실제로 쓸 만한" 선택지가 되었다.
τ2-bench 에이전틱 점수 86.4%는 단순한 숫자가 아니라,
모델이 실제 도구를 호출하고 다단계 작업을 자율적으로 처리할 수 있다는 뜻이다.

  • 데이터를 외부에 보내지 않고,
  • API 비용 없이,
  • 자신의 하드웨어에서 동작하는 에이전트.

이것이 젬마 4가 열어주는 새로운 가능성이다.

 

젬마 4 설치 및 프로젝트 생성에 대해 알고 싶으면 다음 글을 참고하기 바란다.
구글 젬마 4(Gemma 4) 무작정 따라하기 - 초보자용 AI 스튜디오부터 로컬 구동까지

반응형