Запуск модели Ollama на языке Go

Полноценный пример создания запроса к модели ИИ на языке программирования Go

Go пример с полными параметрами

Установите зависимости:

go mod init ollama-client
go get github.com/valyala/fasthttp

main.go:

package main

import (
	"encoding/json"
	"fmt"
	"log"
	"strings"
	"time"
	
	"github.com/valyala/fasthttp"
)

type OllamaOptions struct {
	Temperature      float32  `json:"temperature"`
	TopP             float32  `json:"top_p"`
	TopK             int      `json:"top_k"`
	NumPredict       int      `json:"num_predict"`
	Stop             []string `json:"stop"`
	RepeatPenalty    float32  `json:"repeat_penalty"`
	PresencePenalty  float32  `json:"presence_penalty"`
	FrequencyPenalty float32  `json:"frequency_penalty"`
	Seed             int64    `json:"seed,omitempty"`
	Mirostat         int      `json:"mirostat"`
	MirostatTau      float32  `json:"mirostat_tau"`
	MirostatEta      float32  `json:"mirostat_eta"`
	NumCtx           int      `json:"num_ctx"`
	NumThread        int      `json:"num_thread"`
}

type OllamaRequest struct {
	Model    string       `json:"model"`
	Prompt   string       `json:"prompt"`
	Stream   bool         `json:"stream"`
	Format   string       `json:"format,omitempty"`
	Options  OllamaOptions `json:"options"`
	Template string       `json:"template,omitempty"`
	Context  []int        `json:"context,omitempty"`
}

type OllamaResponse struct {
	Model     string `json:"model"`
	Response  string `json:"response"`
	Context   []int  `json:"context,omitempty"`
	Done      bool   `json:"done"`
	Error     string `json:"error,omitempty"`
}

type OllamaClient struct {
	BaseURL string
	Context []int
}

func NewOllamaClient(baseURL string) *OllamaClient {
	if baseURL == "" {
		baseURL = "http://localhost:11434"
	}
	return &OllamaClient{BaseURL: baseURL}
}

func (c *OllamaClient) Generate(prompt string, options OllamaOptions) (OllamaResponse, error) {
	request := OllamaRequest{
		Model:   "qwen3:4b",
		Prompt:  prompt,
		Stream:  false,
		Format:  "text",
		Options: options,
	}
	
	if len(c.Context) > 0 {
		request.Context = c.Context
	}
	
	requestBody, err := json.Marshal(request)
	if err != nil {
		return OllamaResponse{}, err
	}
	
	req := fasthttp.AcquireRequest()
	defer fasthttp.ReleaseRequest(req)
	
	req.SetRequestURI(c.BaseURL + "/api/generate")
	req.Header.SetMethod("POST")
	req.Header.SetContentType("application/json")
	req.SetBody(requestBody)
	
	resp := fasthttp.AcquireResponse()
	defer fasthttp.ReleaseResponse(resp)
	
	client := &fasthttp.Client{
		ReadTimeout: 30 * time.Second,
	}
	
	if err := client.Do(req, resp); err != nil {
		return OllamaResponse{}, err
	}
	
	var response OllamaResponse
	if err := json.Unmarshal(resp.Body(), &response); err != nil {
		return OllamaResponse{}, err
	}
	
	// Сохраняем контекст для следующих запросов
	if response.Context != nil {
		c.Context = response.Context
	}
	
	return response, nil
}

func (c *OllamaClient) ClearContext() {
	c.Context = nil
}

func main() {
	client := NewOllamaClient("")
	
	// Пример 1: Простая генерация
	options1 := OllamaOptions{
		Temperature:    0.7,
		TopP:           0.9,
		TopK:           40,
		NumPredict:     200,
		Stop:           []string{"\n", "###"},
		RepeatPenalty:  1.1,
		Seed:           42,
		Mirostat:       2,
		MirostatTau:    5.0,
		MirostatEta:    0.1,
	}
	
	fmt.Println("=== Пример 1: Простая генерация ===")
	response1, err := client.Generate("Расскажи о Go языке программирования", options1)
	if err != nil {
		log.Fatal("Ошибка:", err)
	}
	fmt.Printf("Ответ: %s\n", response1.Response)
	
	// Пример 2: Продолжение с контекстом
	options2 := OllamaOptions{
		Temperature:   0.5,
		TopP:          0.8,
		TopK:          30,
		NumPredict:    150,
		RepeatPenalty: 1.2,
	}
	
	fmt.Println("\n=== Пример 2: Продолжение с контекстом ===")
	response2, err := client.Generate("Какие у него преимущества?", options2)
	if err != nil {
		log.Fatal("Ошибка:", err)
	}
	fmt.Printf("Ответ: %s\n", response2.Response)
	
	// Пример 3: Генерация кода
	options3 := OllamaOptions{
		Temperature:  0.3,
		TopP:         0.7,
		NumPredict:   300,
		Seed:         12345,
	}
	
	fmt.Println("\n=== Пример 3: Генерация кода ===")
	response3, err := client.Generate("Напиши HTTP сервер на Go", options3)
	if err != nil {
		log.Fatal("Ошибка:", err)
	}
	fmt.Printf("Код: %s\n", response3.Response)
	
	// Очищаем контекст
	client.ClearContext()
	fmt.Println("\nКонтекст очищен")
}