0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Golang】Go と Ollama で自家製 自動翻訳 API を作る

Last updated at Posted at 2025-10-15

Ollama とは、恐れずに一言で説明すると「GGUF フォーマット1の LLM をローカルで実行できるアプリ」です。Docker と同じく Go 言語(以下 golang)で書かれています。

Golang で Ollama の API を叩きたい

Google や DeepL などの翻訳 API を叩くのもいいのですが、すぐに無料枠を使い切ったり、有料ライセンスにしても、意図せず叩きすぎてビックリする課金で逆にビンタを喰らうのが怖いのです。

そこで、M4 Mac mini (16GB) で Ollama は動くし、llama3.2 程度であれば普通にサクサク動くので、ローカルで翻訳 API を golang で構築できないかなと思いました。

Ollama の公式 Go クライアント・ライブラリについて

Ollama の公式クライアント・ライブラリに Python などはあるものの、golang の記載がありませんでした。

3rd パーティ製を使うのかと思ったのですが、本体のソースコードのパッケージにありました。当然すぎるのか、どこにも明記されていないので自分のググラビリティ(備忘録)として。

動作環境(macOS)
$ sw_vers
ProductName:		macOS
ProductVersion:		26.0.1
BuildVersion:		25A362

$ ollama --version
ollama version is 0.12.5

$ go version
go version go1.25.2 darwin/arm64

$ go list -m all | grep github.com/ollama/ollama
github.com/ollama/ollama v0.12.5

この記事では macOS を前提としていますが、Ollama のアプリ自体は Windows 版や Linux 版もあるのでダウンロード以外は、大きな違いはないと思います。

TL; DR (今北産業)

翻訳 API と言っちゃうと、たいそうなイメージですが、基本的に Ollama の API を叩いた結果を JSON 出力するだけの「プロキシ的な API」のベースです。

流れ的には以下をするだけ。

  1. Ollama 本体のソースコードに API クライアントの GO パッケージが内包されているので、それを利用する
  2. ローカルに立ち上げた Ollama サーバーへ翻訳のリクエストをする
  3. レスポンスは JSON で出力させ、パースした翻訳結果を出力する

「どうすれば安定したフォーマットでレスポンスを LLM から受け取れるか」がポイントなので、あとは用途にあわせて自由に実装できます。

Ollama の Go モジュールをインストール
$ go get github.com/ollama/ollama
info
// Ollama API クライアントのパッケージ
import "github.com/ollama/ollama/api"
ソースコード
package main

import (
	"context"
	"encoding/json"
	"fmt"
	"log"
	"strings"

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

// Translation はモデルからのレスポンスの JSON 用構造体です.
type Translation struct {
	English string `json:"english"`
}

func main() {
    // 利用可能モデル一覧: https://ollama.com/search
    const modelName = "llama3.2"

    japaneseText := "私は昨日、友達と映画を見に行きました。"

	client, err := api.ClientFromEnvironment()
	if err != nil {
		log.Fatalf("failed to create Ollama client: %v", err)
	}

	// JSON 出力を強制する翻訳指示のプロンプト(ここが要だったりする)
	prompt := fmt.Sprintf(`
Translate the following Japanese sentence to English.

Output ONLY valid JSON in the format:
{"english": "<translation here>"}

Japanese: %s
`, japaneseText)

	req := &api.GenerateRequest{
		Model:  modelName, 
		Prompt: prompt,
	}

	var sb strings.Builder

	err = client.Generate(context.Background(), req, func(resp api.GenerateResponse) error {
		sb.WriteString(resp.Response)
		return nil
	})
	if err != nil {
		log.Fatalf("generation failed: %v", err)
	}

	// 受信した JSON のパースと出力
	var result Translation
	output := strings.TrimSpace(sb.String())

	if err := json.Unmarshal([]byte(output), &result); err != nil {
		log.Fatalf("failed to parse JSON: %v\nRaw output:\n%s", err, output)
	}

	fmt.Println("Returned Raw Output:\n\n", output)
	fmt.Println("🇯🇵 Original Sentence  :", japaneseText)
	fmt.Println("🗣️ English Translation:", result.English)
}
Ollama アプリのインストール(macOS の場合で、未インストールの場合)
$ # Apple Silicon の場合 Metal 対応版が入り Mac の GPU が利用できる
$ # Intel Mac の場合は CPU で動作する
$ brew install ollama

$ # Windows/Linux --> https://ollama.com/download
Ollama サーバーの起動
$ # 別ターミナルで実行すること
$ ollama serve
学習モデルのダウンロード
$ ollama pull llama3.2
pulling manifest 
pulling dde5aa3fc5ff: 100% ▕████████████████████████████████████████████████████████▏ 2.0 GB                         
pulling 966de95ca8a6: 100% ▕████████████████████████████████████████████████████████▏ 1.4 KB                         
pulling fcc5a6bec9da: 100% ▕████████████████████████████████████████████████████████▏ 7.7 KB                         
pulling a70ff7e570d9: 100% ▕████████████████████████████████████████████████████████▏ 6.0 KB                         
pulling 56bb8bd477a5: 100% ▕████████████████████████████████████████████████████████▏   96 B                         
pulling 34bb5ab01051: 100% ▕████████████████████████████████████████████████████████▏  561 B                         
verifying sha256 digest 
writing manifest 
success
サンプル・コードの実行
$ go run main.go
Returned Raw Output:
 {"english": "I went to see a movie with friends yesterday."}

🇯🇵 Original Sentence  : 私は昨日、友達と映画を見に行きました。
🗣️ English Translation: I went to see a movie with friends yesterday.
  1. GGUF とは、Meta 社(旧 Facebook 社)の学習モデル LLaMA をベースとした、オープンな学習モデル Llama に「推論の実行に必要な情報」を埋め込んだバイナリ・フォーマットです。

    Georgi Gerganov 氏が、オリジナルの LLaMA 向けに GGML (Georgi Gerganov Machine Learning) として発案し、LLaMA の派生学習モデル(Llama 系の学習モデル)でも使えるように互換を持たせた後継のフォーマットが GGUF です。

    学習モデルの拡張子は .gguf で、Ollama の公式からダウンロードできるモデル以外にも、Hugging Face に公開されている GGUF の野良モデルもダウンロードして手動で設置すると利用できます。

    このバイナリ・データを、同氏が開発した軽量推論プログラム「llama.cpp」に読み込むだけで推論を実行できます。llama.cpp は C/C++ で書かれており、FFI としても機能するため他のプログラム言語からも利用できます。Ollama も cgo としてバックエンドに llama.cpp を使っています。

    llama.cpp の特筆すべき点は、NVIDIA の GPU がなくても実行できることです。

    Apple Silicon の Metal(M 系 Mac の GPU ライブラリ)、AMD の GPU や Linux の Vulkan にも対応しており、いずれの GPU 機能が使えない場合は CPU でマルチスレッド動作すると言う、非 Windows/NVIDIA ユーザーの救世主です。

    ここまで読んで「すげー」と感じた方は、ぜひ llama.cpp のリポジトリに「いいね」しに行ってあげてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?