AI Sparkup

복잡한 AI 세상을 읽는 힘

Ollama의 게임체인저: 스트리밍과 도구 호출을 동시에 지원하는 로컬 AI

AI 에이전트 시대가 본격화되면서, AI 모델이 단순히 텍스트를 생성하는 것을 넘어 실제 도구를 사용하여 작업을 수행하는 능력이 핵심 요구사항으로 떠오르고 있습니다. 하지만 기존에는 스트리밍 응답과 도구 호출을 동시에 처리하는 것이 기술적 난제였습니다. 사용자는 AI가 도구를 호출할 때까지 기다려야 했고, 실시간성이 떨어지는 문제가 있었죠.

Ollama 스트리밍 도구 호출 출처: Ollama 공식 블로그

이런 한계를 뛰어넘어, 로컬 AI 플랫폼 Ollama가 최근 발표한 새로운 기능이 바로 스트리밍 응답과 도구 호출의 동시 지원입니다. 이는 로컬 AI 생태계에 있어 매우 중요한 발전으로, 개발자들이 클라우드 API에 의존하지 않고도 실시간 AI 애플리케이션을 구축할 수 있게 되었음을 의미합니다.

무엇이 달라졌나?

기존의 문제점

기존 도구 호출 방식에서는 AI 모델이 전체 응답을 생성한 후에야 도구 호출 여부를 판단할 수 있었습니다. 이는 다음과 같은 문제를 야기했습니다:

  • 긴 대기 시간: 사용자는 모든 생성이 완료될 때까지 기다려야 함
  • 제한된 실시간성: 스트리밍의 장점을 활용할 수 없음
  • 사용자 경험 저하: 응답이 느리게 느껴지는 문제

Ollama의 혁신적 해결책

Ollama의 새로운 증분 파서(Incremental Parser)는 이 문제를 근본적으로 해결합니다:

  1. 실시간 파싱: 텍스트가 생성되는 동시에 도구 호출을 감지
  2. 스마트 분리: 일반 콘텐츠와 도구 호출을 지능적으로 구분
  3. 향상된 정확성: 오탐지 및 중복 도구 호출 문제 해결

지원 모델과 실제 활용 사례

현재 도구 호출을 지원하는 주요 모델들은 다음과 같습니다:

  • Qwen3 / Qwen2.5 (코딩 특화 버전 포함)
  • Llama 3.1 / Llama 4
  • Devstral (개발 작업 특화)
  • 기타 다양한 도구 지원 모델들

실제 사용 사례: 날씨 조회

가장 간단한 예시로 날씨 조회 기능을 살펴보겠습니다:

curl http://localhost:11434/api/chat -d '{
  "model": "qwen3",
  "messages": [
    {
      "role": "user", 
      "content": "What is the weather today in Toronto?"
    }
  ],
  "stream": true,
  "tools": [
    {
      "type": "function",
      "function": {
        "name": "get_current_weather",
        "description": "Get the current weather for a location",
        "parameters": {
          "type": "object",
          "properties": {
            "location": {
              "type": "string",
              "description": "The location to get the weather for"
            },
            "format": {
              "type": "string", 
              "enum": ["celsius", "fahrenheit"]
            }
          },
          "required": ["location", "format"]
        }
      }
    }
  ]
}'

이 요청을 보내면, Ollama는 실시간으로 응답을 스트리밍하면서 동시에 날씨 조회 도구를 호출합니다. 사용자는 기다림 없이 즉시 처리 과정을 확인할 수 있죠.

AI 도구 호출 워크플로우 AI 모델이 실시간으로 도구를 호출하는 과정 (출처: Unsplash)

개발자를 위한 실무 구현 가이드

Python으로 수학 계산 도구 구현

Python 개발자라면 다음과 같이 간단하게 구현할 수 있습니다:

# 도구 함수 정의
def add_two_numbers(a: int, b: int) -> int:
    """
    두 숫자를 더합니다
    
    Args:
        a: 첫 번째 숫자
        b: 두 번째 숫자
    
    Returns:
        int: 두 숫자의 합
    """
    return a + b

from ollama import chat, ChatResponse 
messages = [{'role': 'user', 'content': 'what is three plus one?'}]

response: ChatResponse = chat(
    model='qwen3',
    messages=messages,
    tools=[add_two_numbers],  # 함수를 직접 전달 가능
    stream=True
)

for chunk in response:
    # 모델의 응답 출력
    print(chunk.message.content, end='', flush=True)
    # 도구 호출 결과 출력
    if chunk.message.tool_calls:
        print(chunk.message.tool_calls)

JavaScript로 실시간 상호작용 구현

웹 애플리케이션 개발자를 위한 JavaScript 예시:

import ollama from 'ollama';

const addTool = {
    type: 'function',
    function: {
        name: 'addTwoNumbers',
        description: 'Add two numbers together',
        parameters: {
            type: 'object',
            required: ['a', 'b'],
            properties: {
                a: { type: 'number', description: 'The first number' },
                b: { type: 'number', description: 'The second number' }
            }
        }
    }
};

async function runCalculation(model) {
    const messages = [{ role: 'user', content: 'What is 2 plus 3?' }];
    
    for await (const chunk of await ollama.chat({
        model: model,
        messages: messages,
        tools: [addTool],
        stream: true
    })) {
        if (chunk.message.tool_calls) {
            // 도구 호출 정보 처리
            for (const tool of chunk.message.tool_calls) {
                console.log('도구 호출:', tool);
            }
        } else {
            // 스트리밍 응답 처리
            process.stdout.write(chunk.message.content);
        }
    }
}

기술적 혁신: 증분 파서의 작동 원리

Ollama의 새로운 파서가 특별한 이유는 다음과 같습니다:

1. 모델별 맞춤 처리

각 모델이 사용하는 도구 호출 템플릿을 직접 참조하여, 도구 호출의 시작 부분(prefix)을 정확히 감지합니다. 이를 통해 일반 텍스트와 도구 호출을 명확히 구분할 수 있습니다.

2. 유연한 폴백 메커니즘

일부 모델들은 도구 호출 시 예상과 다른 형식을 사용할 수 있습니다. 파서는 이런 경우를 대비해 JSON 형식을 감지하는 폴백 메커니즘을 제공합니다.

3. 중복 호출 방지

기존에는 모델이 이전 도구 호출을 참조할 때 중복된 호출이 발생하는 문제가 있었습니다. 새로운 파서는 상태 관리를 통해 이 문제를 해결했습니다.

AI 도구 파싱 과정 실시간 파싱과 도구 호출 과정의 시각화 (출처: Unsplash)

실무 적용 시 고려사항

성능 최적화

도구 호출의 정확성과 결과 품질을 높이려면 다음 사항들을 고려해야 합니다:

컨텍스트 윈도우 확장

curl -X POST "http://localhost:11434/api/chat" -d '{
  "model": "llama3.2",
  "messages": [...],
  "options": {
    "num_ctx": 32000  # 32K로 컨텍스트 확장
  }
}'

더 큰 컨텍스트 윈도우(32K 이상)를 사용하면 도구 호출의 성능과 결과 품질이 현저히 향상됩니다. 단, 메모리 사용량이 증가한다는 점을 고려해야 합니다.

Model Context Protocol(MCP)과의 호환성

이번 업데이트의 또 다른 중요한 의미는 Model Context Protocol(MCP)과의 호환성입니다. MCP는 AI 모델이 외부 시스템과 표준화된 방식으로 소통할 수 있게 해주는 프로토콜인데, Ollama의 새로운 스트리밍 도구 호출 기능 덕분에 MCP를 사용하는 개발자들도 이제 실시간으로 채팅 콘텐츠와 도구 호출을 동시에 스트리밍할 수 있게 되었습니다.

특히 32K 이상의 컨텍스트 윈도우를 사용할 때 MCP 환경에서의 도구 호출 성능과 결과 품질이 크게 개선되는 것으로 알려져 있습니다. 이는 AI 에이전트가 더 복잡하고 연속적인 작업을 수행할 수 있게 해주는 중요한 발전입니다.

도구 설계 원칙

효과적인 도구를 설계하려면:

  1. 명확한 설명: 도구의 목적과 사용법을 구체적으로 명시
  2. 적절한 매개변수: 필요한 정보만 요구하되, 충분히 구체적으로
  3. 오류 처리: 예상 가능한 오류 상황에 대한 대응 방안 마련

개발 생태계에 미치는 영향

이번 Ollama의 업데이트는 단순한 기능 추가를 넘어, 로컬 AI 생태계 전체에 중요한 의미를 갖습니다:

클라우드 의존도 감소

개발자들은 이제 클라우드 API의 비용과 제약 없이도 고성능 AI 에이전트를 구축할 수 있습니다. 특히 프라이버시가 중요한 기업 환경에서 큰 장점을 제공합니다.

실시간 애플리케이션의 가능성 확대

스트리밍과 도구 호출의 결합으로, 사용자와 AI가 더욱 자연스럽게 상호작용하는 애플리케이션 개발이 가능해졌습니다.

개발 접근성 향상

복잡한 인프라 없이도 Python, JavaScript, cURL 등 익숙한 도구로 AI 에이전트를 구축할 수 있어, 더 많은 개발자들이 AI 애플리케이션 개발에 참여할 수 있습니다.

마무리하며

Ollama의 스트리밍 도구 호출 지원은 로컬 AI의 가능성을 한 단계 끌어올린 중요한 발전입니다. 실시간 응답성과 도구 활용 능력을 동시에 확보함으로써, 개발자들은 더욱 풍부하고 실용적인 AI 애플리케이션을 구축할 수 있게 되었습니다.

특히 개인정보 보호가 중요한 환경이나 인터넷 연결이 제한적인 상황에서도 강력한 AI 에이전트를 활용할 수 있다는 점은 매우 큰 의미를 갖습니다. 앞으로 로컬 AI 생태계가 어떻게 발전해 나갈지 기대가 됩니다.


참고자료:

Comments