Ollama용 Go 클라이언트: SDK 비교 및 Qwen3/GPT-OSS 예제

Ollama를 Go와 통합하기: SDK 가이드, 예제 및 프로덕션 베스트 프랙티스

Page content

이 가이드에서는 Ollama용 Go SDK에 대한 포괄적인 개요를 제공하고 기능 세트를 비교합니다.

Ollama에 호스팅된 Qwen3 및 GPT-OSS 모델을 호출하는 실용적인 Go 예제를 탐구해 보겠습니다. 여기에는 생수 REST API 호출과 공식 Go 클라이언트를 통한 호출 방식이 모두 포함되며, Qwen3의 사고(thinking) 모드와 비사고(non-thinking) 모드의 상세한 처리 방안도 다룹니다.

go and ollama

왜 Ollama + Go인가?

Ollama는 generate(텍스트 생성)와 chat(대화) 워크로드를 위해 설계된 작고 실용적인 HTTP API(일반적으로 http://localhost:11434에서 실행됨)를 노출하며, 내장된 스트리밍 지원 및 모델 관리 기능을 갖추고 있습니다. 공식 문서는 /api/generate와 /api/chat의 요청/응답 구조와 스트리밍 의미를 상세히 다루고 있습니다.

Go은 HTTP에 대한 강력한 표준 라이브러리 지원, 뛰어난 JSON 처리, 네이티브 동시성(concurrency) 원시 자료구조, 그리고 컴파일 시 오류를 잡아 주는 정적 타입 인터페이스 덕분에 Ollama 클라이언트를 구축하는 데 훌륭한 선택지입니다. Ollama가 vLLM, Docker Model Runner, LocalAI 및 클라우드 제공업체와 어떻게 비교되는지, 그리고 언제 각각을 선택해야 하는지 확인하려면 LLM 호스팅: 로컬, 셀프 호스티드 및 클라우드 인프라 비교를 참고하세요.

2025년 10월 기준, 가장 많이 고려하게 될 Go SDK 옵션은 다음과 같습니다.


Ollama용 Go SDK — 무엇이 사용 가능한가?

SDK / 패키지 상태 및 “소유자” 범위 (Generate/Chat/Streaming) 모델 관리 (pull/list 등) 추가 사항 / 노트
github.com/ollama/ollama/api Ollama 저장소 내부의 공식 패키지. ollama CLI 자체에서 사용됨 REST에 매핑된 전체 커버리지. 스트리밍 지원 예 정석적인 Go 클라이언트로 간주됨. API가 문서와 밀접하게 일치함.
LangChainGo (github.com/tmc/langchaingo/llms/ollama) Ollama LLM 모듈이 포함된 커뮤니티 프레임워크 (LangChainGo) 프레임워크 추상을 통한 Chat/Completion + 스트리밍 제한적 (모델 관리가 주요 목적이 아님) Go에서 체인(chains), 도구(tools), 벡터 스토어를 원한다면 우수. 하지만 순수 SDK라고 보기 어려움.
github.com/swdunlop/ollama-client 커뮤니티 클라이언트 Chat에 초점. 도구 호출(tool-calling) 실험에 적합 부분적 도구 호출 실험을 위해 제작됨. 1:1 완전한 표면(surface)은 아님.
기타 커뮤니티 SDK (예: ollamaclient, 서드파티 “go-ollama-sdk`) 커뮤니티 다양함 다양함 품질과 커버리지에 편차가 있음. 저장소별로 평가 필요.

권장 사항: 프로덕션 환경에서는 **github.com/ollama/ollama/api**를 우선 사용하세요—코어 프로젝트와 함께 유지 관리되며 REST API를 거울링합니다.


Ollama에서의 Qwen3 & GPT-OSS: 사고 모드 vs 비사고 모드 (알아둘 점)

  • Ollama의 사고 모드는 활성화되었을 때 모델의 “추론(reasoning)”과 최종 출력을 분리합니다. 우리의 Ollama 치트시트는 지원되는 모델 전반에 걸쳐 사고(thinking) 활성화/비활성화 플래그(--think, --hidethinking)를 문서화하고 있습니다.
  • **(https://www.glukhov.org/ko/llm-performance/benchmarks/qwen3-30b-vs-gpt-oss-20b/ “Qwen3:30b vs GPT-OSS:20b: 기술적 세부 사항, 성능 및 속도 비교”)**는 동적 전환을 지원합니다: 시스템/사용자 메시지에 /think 또는 /no_think를 추가하여 턴별로 모드를 전환할 수 있으며, 최근 지시가 우선합니다.
  • GPT-OSS: 사용자들의 보고에 따르면, 사고(thinking) 비활성화(예: /set nothink 또는 --think=false)는 gpt-oss:20b에서 신뢰할 수 없을 수 있습니다. UI에서 노출하지 말아야 할 추론 부분을 필터링/숨기는 방안을 계획해야 합니다.

Part 1 — 생수 REST를 통한 Ollama 호출 (Go, net/http)

공유 타입

먼저, 예제 전반에서 사용할 공통 타입과 헬퍼 함수를 정의해 보겠습니다:

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"time"
)

// ---- Chat API Types ----

type ChatMessage struct {
	Role    string `json:"role"`
	Content string `json:"content"`
}

type ChatRequest struct {
	Model    string        `json:"model"`
	Messages []ChatMessage `json:"messages"`
	// 일부 서버는 사고(thinking) 컨트롤을 불리언 플래그로 노출합니다.
	// 제외되더라도 /think 또는 /no_think 태그를 통해 Qwen3를 제어할 수 있습니다.
	Think   *bool          `json:"think,omitempty"`
	Stream  *bool          `json:"stream,omitempty"`
	Options map[string]any `json:"options,omitempty"`
}

type ChatResponse struct {
	Model     string `json:"model"`
	CreatedAt string `json:"created_at"`
	Message   struct {
		Role     string `json:"role"`
		Content  string `json:"content"`
		Thinking string `json:"thinking,omitempty"` // 사고(thinking)가 켜져 있을 때 존재
	} `json:"message"`
	Done bool `json:"done"`
}

// ---- Generate API Types ----

type GenerateRequest struct {
	Model   string         `json:"model"`
	Prompt  string         `json:"prompt"`
	Think   *bool          `json:"think,omitempty"`
	Stream  *bool          `json:"stream,omitempty"`
	Options map[string]any `json:"options,omitempty"`
}

type GenerateResponse struct {
	Model     string `json:"model"`
	CreatedAt string `json:"created_at"`
	Response  string `json:"response"`           // 비스트림용 최종 텍스트
	Thinking  string `json:"thinking,omitempty"` // 사고(thinking)가 켜져 있을 때 존재
	Done      bool   `json:"done"`
}

// ---- Helper Functions ----

func httpPostJSON(url string, payload any) ([]byte, error) {
	body, err := json.Marshal(payload)
	if err != nil {
		return nil, err
	}
	c := &http.Client{Timeout: 60 * time.Second}
	resp, err := c.Post(url, "application/json", bytes.NewReader(body))
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()
	return io.ReadAll(resp.Body)
}

// bptr은 불리언 값의 포인터를 반환합니다
func bptr(b bool) *bool { return &b }

Chat — 사고(thinking) ON인 Qwen3 (그리고 OFF로 전환하는 방법)

func chatQwen3Thinking() error {
	endpoint := "http://localhost:11434/api/chat"

	req := ChatRequest{
		Model:   "qwen3:8b-thinking", // 가져온 :*-thinking 태그 중 어떤 것이든 가능
		Think:   bptr(true),
		Stream:  bptr(false),
		Messages: []ChatMessage{
			{Role: "system", Content: "You are a precise assistant."},
			{Role: "user",   Content: "Explain recursion with a short Go example."},
		},
	}

	raw, err := httpPostJSON(endpoint, req)
	if err != nil {
		return err
	}
	var out ChatResponse
	if err := json.Unmarshal(raw, &out); err != nil {
		return err
	}
	fmt.Println("🧠 thinking:\n", out.Message.Thinking)
	fmt.Println("\n💬 answer:\n", out.Message.Content)
	return nil
}

// 다음 턴에서 사고(thinking)를 OFF로 전환하려면:
// (a) Think=false를 설정하고, 그리고/또는
// (b) 가장 최근 시스템/사용자 메시지에 "/no_think"를 추가 (Qwen3 소프트 스위치).
// Qwen3는 멀티턴 챗에서 가장 최근의 /think 또는 /no_think 지시를 따릅니다.
func chatQwen3NoThinking() error {
	endpoint := "http://localhost:11434/api/chat"

	req := ChatRequest{
		Model:  "qwen3:8b-thinking",
		Think:  bptr(false),
		Stream: bptr(false),
		Messages: []ChatMessage{
			{Role: "system", Content: "You are brief. /no_think"},
			{Role: "user",   Content: "Explain recursion in one sentence."},
		},
	}

	raw, err := httpPostJSON(endpoint, req)
	if err != nil {
		return err
	}
	var out ChatResponse
	if err := json.Unmarshal(raw, &out); err != nil {
		return err
	}
// 사고(thinking)가 비어 있을 것으로 예상하지만, 방어적으로 처리합니다.
	if out.Message.Thinking != "" {
		fmt.Println("🧠 thinking (unexpected):\n", out.Message.Thinking)
	}
	fmt.Println("\n💬 answer:\n", out.Message.Content)
	return nil
}

(Qwen3의 /think와 /no_think 소프트 스위치는 Qwen 팀에 의해 문서화되어 있으며, 멀티턴 챗에서는 마지막 지시가 우선합니다.)

Chat — 사고(thinking)가 있는 GPT-OSS (주의 사항 포함)

func chatGptOss() error {
	endpoint := "http://localhost:11434/api/chat"

	req := ChatRequest{
		Model:  "gpt-oss:20b",
		Think:  bptr(true),   // 지원되는 경우 분리된 추론(reasoning)을 요청
		Stream: bptr(false),
		Messages: []ChatMessage{
			{Role: "user", Content: "What is dynamic programming? Explain the core idea."},
		},
	}

	raw, err := httpPostJSON(endpoint, req)
	if err != nil {
		return err
	}
	var out ChatResponse
	if err := json.Unmarshal(raw, &out); err != nil {
		return err
	}
// 알려진 특이점: 사고(thinking)를 비활성화해도 gpt-oss:20b에서 추론(reasoning)이 완전히 억제되지 않을 수 있습니다.
// 노출하지 않으려면 항상 UI에서 사고(thinking)를 필터링/숨기세요.
	fmt.Println("🧠 thinking:\n", out.Message.Thinking)
	fmt.Println("\n💬 answer:\n", out.Message.Content)
	return nil
}

사용자들의 보고에 따르면, gpt-oss:20b에서 사고(thinking)를 비활성화하는 것(예: /set nothink 또는 --think=false)이 무시될 수 있으므로, 필요 시 클라이언트 사이드 필터링을 계획하세요.

Generate — Qwen3와 GPT-OSS

func generateQwen3() error {
	endpoint := "http://localhost:11434/api/generate"
	req := GenerateRequest{
		Model:  "qwen3:4b-thinking",
		Prompt: "In 2–3 sentences, what are B-Trees used for in databases?",
		Think:  bptr(true),
	}
	raw, err := httpPostJSON(endpoint, req)
	if err != nil {
		return err
	}
	var out GenerateResponse
	if err := json.Unmarshal(raw, &out); err != nil {
		return err
	}
	if out.Thinking != "" {
		fmt.Println("🧠 thinking:\n", out.Thinking)
	}
	fmt.Println("\n💬 answer:\n", out.Response)
	return nil
}

func generateGptOss() error {
	endpoint := "http://localhost:11434/api/generate"
	req := GenerateRequest{
		Model:  "gpt-oss:20b",
		Prompt: "Briefly explain backpropagation in neural networks.",
		Think:  bptr(true),
	}
	raw, err := httpPostJSON(endpoint, req)
	if err != nil {
		return err
	}
	var out GenerateResponse
	if err := json.Unmarshal(raw, &out); err != nil {
		return err
	}
	if out.Thinking != "" {
		fmt.Println("🧠 thinking:\n", out.Thinking)
	}
	fmt.Println("\n💬 answer:\n", out.Response)
	return nil
}

REST 형식과 스트리밍 동작은 Ollama API 레퍼런스에서 직접 가져온 것입니다.


Part 2 — 공식 Go SDK를 통한 Ollama 호출 (github.com/ollama/ollama/api)

공식 패키지는 REST API에 해당하는 메서드를 가진 Client를 노출합니다. Ollama CLI 자체가 이 패키지를 사용하여 서비스에 통신하므로 호환성을 위해 가장 안전한 선택지입니다.

설치

go get github.com/ollama/ollama/api

Chat — Qwen3 (사고 ON / OFF)

package main

import (
	"context"
	"fmt"
	"log"

	"github.com/ollama/ollama/api"
)

func chatWithQwen3Thinking(ctx context.Context, thinking bool) error {
	client, err := api.ClientFromEnvironment() // 설정된 경우 OLLAMA_HOST를 따름
	if err != nil {
		return err
	}

	req := &api.ChatRequest{
		Model: "qwen3:8b-thinking",
		// 많은 서버 빌드에서 사고(thinking)를 최상위 플래그로 노출합니다.
		// 추가로, 메시지 내의 /think 또는 /no_think를 통해 Qwen3를 제어할 수 있습니다.
		Think: api.Ptr(thinking),
		Messages: []api.Message{
			{Role: "system", Content: "You are a precise assistant."},
			{Role: "user",   Content: "Explain merge sort with a short Go snippet."},
		},
	}

	var resp api.ChatResponse
	if err := client.Chat(ctx, req, &resp); err != nil {
		return err
	}

	if resp.Message.Thinking != "" {
		fmt.Println("🧠 thinking:\n", resp.Message.Thinking)
	}
	fmt.Println("\n💬 answer:\n", resp.Message.Content)
	return nil
}

func main() {
	ctx := context.Background()
	if err := chatWithQwen3Thinking(ctx, true); err != nil {
		log.Fatal(err)
	}
// 예제: 비사고(non-thinking)
	if err := chatWithQwen3Thinking(ctx, false); err != nil {
		log.Fatal(err)
	}
}

Chat — GPT-OSS (추론을 방어적으로 처리)

func chatWithGptOss(ctx context.Context) error {
	client, err := api.ClientFromEnvironment()
	if err != nil {
		return err
	}
	req := &api.ChatRequest{
		Model: "gpt-oss:20b",
		Think: api.Ptr(true),
		Messages: []api.Message{
			{Role: "user", Content: "What is memoization and when is it useful?"},
		},
	}
	var resp api.ChatResponse
	if err := client.Chat(ctx, req, &resp); err != nil {
		return err
	}
// 추론(reasoning)을 숨기려는 경우, 플래그와 무관하게 여기서 처리하세요.
	if resp.Message.Thinking != "" {
		fmt.Println("🧠 thinking:\n", resp.Message.Thinking)
	}
	fmt.Println("\n💬 answer:\n", resp.Message.Content)
	return nil
}

Generate — Qwen3 & GPT-OSS

func generateWithQwen3(ctx context.Context) error {
	client, err := api.ClientFromEnvironment()
	if err != nil {
		return err
	}
	req := &api.GenerateRequest{
		Model:  "qwen3:4b-thinking",
		Prompt: "Summarize the role of a B-Tree in indexing.",
		Think:  api.Ptr(true),
	}
	var resp api.GenerateResponse
	if err := client.Generate(ctx, req, &resp); err != nil {
		return err
	}
	if resp.Thinking != "" {
		fmt.Println("🧠 thinking:\n", resp.Thinking)
	}
	fmt.Println("\n💬 answer:\n", resp.Response)
	return nil
}

func generateWithGptOss(ctx context.Context) error {
	client, err := api.ClientFromEnvironment()
	if err != nil {
		return err
	}
	req := &api.GenerateRequest{
		Model:  "gpt-oss:20b",
		Prompt: "Explain gradient descent in simple terms.",
		Think:  api.Ptr(true),
	}
	var resp api.GenerateResponse
	if err := client.Generate(ctx, req, &resp); err != nil {
		return err
	}
	if resp.Thinking != "" {
		fmt.Println("🧠 thinking:\n", resp.Thinking)
	}
	fmt.Println("\n💬 answer:\n", resp.Response)
	return nil
}

공식 패키지의 표면(surface)은 REST 문서와 일치하며 코어 프로젝트와 함께 업데이트됩니다.


스트리밍 응답

실시간 스트리밍을 위해 요청에서 Stream: bptr(true)를 설정하세요. 응답은 줄-분리(JSON Lines)된 JSON 청크로 전달됩니다:

func streamChatExample() error {
	endpoint := "http://localhost:11434/api/chat"
	req := ChatRequest{
		Model:  "qwen3:8b-thinking",
		Think:  bptr(true),
		Stream: bptr(true), // 스트리밍 활성화
		Messages: []ChatMessage{
			{Role: "user", Content: "Explain quicksort algorithm step by step."},
		},
	}

	body, _ := json.Marshal(req)
	resp, err := http.Post(endpoint, "application/json", bytes.NewReader(body))
	if err != nil {
		return err
	}
	defer resp.Body.Close()

	decoder := json.NewDecoder(resp.Body)
	for {
		var chunk ChatResponse
		if err := decoder.Decode(&chunk); err == io.EOF {
			break
		} else if err != nil {
			return err
		}
		
		// 도착한 사고(thinking)와 콘텐츠(content)를 처리
		if chunk.Message.Thinking != "" {
			fmt.Print(chunk.Message.Thinking)
		}
		fmt.Print(chunk.Message.Content)
		
		if chunk.Done {
			break
		}
	}
	return nil
}

공식 SDK를 사용할 경우, 스트리밍 청크를 처리하기 위해 콜백 함수를 사용하세요:

func streamWithOfficialSDK(ctx context.Context) error {
	client, _ := api.ClientFromEnvironment()
	
	req := &api.ChatRequest{
		Model: "qwen3:8b-thinking",
		Think: api.Ptr(true),
		Messages: []api.Message{
			{Role: "user", Content: "Explain binary search trees."},
		},
	}
	
	err := client.Chat(ctx, req, func(resp api.ChatResponse) error {
		if resp.Message.Thinking != "" {
			fmt.Print(resp.Message.Thinking)
		}
		fmt.Print(resp.Message.Content)
		return nil
	})
	
	return err
}

Qwen3 사고(thinking) vs 비사고(non-thinking) 작업 (실용적 가이드)

  • 두 가지 레버(조절 수단):

    1. Ollama의 사고(thinking) 기능이 지원하는 불리언 thinking 플래그; 그리고
    2. Qwen3의 소프트 스위치 명령어 /think와 /no_think (최신 시스템/사용자 메시지 내). 최근 지시가 다음 턴(s)을 지배합니다.
  • 기본 태세: 빠른 응답에는 비사고(non-thinking); 단계별 추론이 필요한 작업(수학, 계획, 디버깅, 복잡한 코드 분석)에는 **사고(thinking)**로 에스컬레이션.

  • 스트리밍 UI: 사고(thinking)가 활성화되면 스트리밍 프레임에서 번갈아 나타나는 추론/컨텐츠를 볼 수 있습니다—버퍼링하거나 별도로 렌더링하고 사용자에게 “추론 보기” 토글을 제공하세요. (스트리밍 형식에 대한 API 문서 참조.)

  • 멀티턴 대화: Qwen3는 이전 턴의 사고(thinking) 모드를 기억합니다. 대화 중반에 전환하려면 신뢰성을 위해 플래그와 소프트 스위치 명령을 모두 사용하세요.

GPT-OSS 관련 노트

  • 비활성화를 시도했더라도 추론(reasoning)이 존재한다고 간주하세요; UX에서 표시하지 않아야 한다면 클라이언트에서 필터링하세요.
  • GPT-OSS를 사용하는 프로덕션 애플리케이션에서는 필요 시 추론 패턴을 감지하고 제거할 수 있는 클라이언트 사이드 필터링 로직을 구현하세요.
  • 행동이 다양한 양자화 및 버전 간에 달라질 수 있으므로, 사용 중인 특정 GPT-OSS 모델 변형을 철저히 테스트하세요.

모범 사례 및 프로덕션 팁

에러 처리 및 타임아웃

항상 적절한 타임아웃 처리와 에러 회복 메커니즘을 구현하세요:

func robustChatRequest(ctx context.Context, model string, messages []api.Message) (*api.ChatResponse, error) {
	// 합리적인 타임아웃 설정
	ctx, cancel := context.WithTimeout(ctx, 2*time.Minute)
	defer cancel()
	
	client, err := api.ClientFromEnvironment()
	if err != nil {
		return nil, fmt.Errorf("creating client: %w", err)
	}
	
	req := &api.ChatRequest{
		Model:    model,
		Messages: messages,
		Options: map[string]interface{}{
			"temperature": 0.7,
			"num_ctx":     4096, // 컨텍스트 윈도우 크기
		},
	}
	
	var resp api.ChatResponse
	if err := client.Chat(ctx, req, &resp); err != nil {
		return nil, fmt.Errorf("chat request failed: %w", err)
	}
	
	return &resp, nil
}

연결 풀링 및 재사용

매 요청마다 새 클라이언트를 생성하는 대신 Ollama 클라이언트를 재사용하세요:

type OllamaService struct {
	client *api.Client
}

func NewOllamaService() (*OllamaService, error) {
	client, err := api.ClientFromEnvironment()
	if err != nil {
		return nil, err
	}
	return &OllamaService{client: client}, nil
}

func (s *OllamaService) Chat(ctx context.Context, req *api.ChatRequest) (*api.ChatResponse, error) {
	var resp api.ChatResponse
	if err := s.client.Chat(ctx, req, &resp); err != nil {
		return nil, err
	}
	return &resp, nil
}

환경 구성

유연한 배포를 위해 환경 변수를 사용하세요:

export OLLAMA_HOST=http://localhost:11434
export OLLAMA_NUM_PARALLEL=2
export OLLAMA_MAX_LOADED_MODELS=2

공식 SDK는 api.ClientFromEnvironment()를 통해 OLLAMA_HOST를 자동으로 존중합니다.

모니터링 및 로깅

프로덕션 시스템에 대해 구조화된 로깅을 구현하세요:

func loggedChat(ctx context.Context, logger *log.Logger, req *api.ChatRequest) error {
	start := time.Now()
	client, _ := api.ClientFromEnvironment()
	
	var resp api.ChatResponse
	err := client.Chat(ctx, req, &resp)
	
	duration := time.Since(start)
	logger.Printf("model=%s duration=%v error=%v tokens=%d", 
		req.Model, duration, err, len(resp.Message.Content))
	
	return err
}

결론

  • Go 프로젝트에 대해, **github.com/ollama/ollama/api**가 가장 완전하고 프로덕션에 적합한 선택지입니다. Ollama 코어 프로젝트와 함께 유지 관리되며, 공식 CLI에서 사용되고, 보장이 되는 호환성을 갖춘 포괄적인 API 커버리지를 제공합니다.

  • 더 높은 수준의 추상화가 필요한 경우, 체인, 도구, 벡터 스토어 및 RAG 파이프라인이 필요할 때 LangChainGo를 고려해 보세요. 단, 편의를 위해 저수준 컨트롤을 일부 포기해야 합니다.

  • Qwen3는 플래그와 메시지 레벨 토글(/think, /no_think)을 통해 사고 모드에 대한 깔끔하고 신뢰할 수 있는 컨트롤을 제공하여, 빠른 응답과 깊은 추론이 모두 필요한 애플리케이션에 이상적입니다.

  • GPT-OSS의 경우, 사고 비활성화 플래그가 일관되게 존중되지 않을 수 있으므로, 필요 시 클라이언트 사이드에서 **추론 출력을 정리(sanitize)**하는 방안을 항상 계획하세요.

  • 프로덕션에서는 적절한 에러 처리, 연결 풀링, 타임아웃, 모니터링을 구현하여 견고한 Ollama 기반 애플리케이션을 구축하세요.

Go의 강력한 타이핑, 뛰어난 동시성 지원, Ollama의 직관적인 API는 단순한 챗봇부터 복잡한 RAG 시스템까지 AI 기반 애플리케이션 구축을 위한 이상적인 스택을 만듭니다.

핵심 요약

접근 방식을 선택하기 위한 빠른 참고 자료:

사용 사례 권장 접근 방식 이유
프로덕션 애플리케이션 github.com/ollama/ollama/api 공식 지원, 완전한 API 커버리지, 코어 프로젝트와 함께 유지 관리
RAG/체인/도구 파이프라인 LangChainGo 고수준 추상화, 벡터 스토어와의 통합
학습/실험 net/http를 이용한 생수 REST 완전한 투명성, 의존성 없음, 교육적
빠른 프로토타이핑 공식 SDK 단순성과 성능의 균형
스트리밍 챗 UI 콜백이 있는 공식 SDK 내장 스트리밍 지원, 깔끔한 API

모델 선택 가이드:

  • Qwen3: 컨트롤 가능한 사고 모드, 신뢰할 수 있는 멀티턴 대화가 필요한 애플리케이션에 최적
  • GPT-OSS: 뛰어난 성능이지만 사고/추론 출력에 대한 방어적 처리 필요
  • 기타 모델: 사고 행동은 모델 패밀리마다 다르므로 철저히 테스트 필요

참고 자료 & 추가 읽기

공식 문서

Go SDK 대안

모델별 리소스

관련 주제

기타 유용한 링크

Ollama가 다른 로컬 및 클라우드 LLM 인프라와 비교하는 더 넓은 관점의 비교를 위해 우리의 LLM 호스팅: 로컬, 셀프 호스티드 및 클라우드 인프라 비교를 확인하세요.

구독하기

시스템, 인프라, AI 엔지니어링에 관한 새 글을 받아보세요.