2026-05-15 13:45:21 +07:00
2026-05-15 13:45:21 +07:00
2026-05-15 13:45:21 +07:00
2026-05-15 13:45:21 +07:00
2026-05-15 13:45:21 +07:00
2026-05-15 13:45:21 +07:00
2026-05-15 13:45:21 +07:00
2026-05-15 13:45:21 +07:00
2026-05-15 13:45:21 +07:00
2026-05-15 13:45:21 +07:00
2026-05-15 13:45:21 +07:00
2026-05-15 13:45:21 +07:00
2026-05-15 13:45:21 +07:00
2026-05-15 13:45:21 +07:00

go-llama-new.cpp

Go-обёртка над llama.cpp с API, совместимым с go-skynet/go-llama.cpp: те же имена типов, функций и экспортируемых переменных (LLama, New, Predict, SetContext, EnableEmbeddings и т.д.).

Ядро собирается из локальных исходников llama.cpp (не из submodule внутри репозитория). Пути к исходникам задаются в файле build.conf, переменные окружения для этого не используются.

Требования

  • Go 1.21 или новее (с поддержкой CGO)
  • Компилятор C++ с поддержкой C++17 (g++ / clang++)
  • CMake 3.14+
  • make, ar
  • OpenMP (обычно пакет libgomp в Linux)
  • Инструменты сборки: git, build-essential (или аналог)

Для линковки также нужны статические библиотеки, которые CMake собирает из llama.cpp: libllama.a, libllama-common.a, libllama-common-base.a, libggml*.a, libcpp-httplib.a.

Настройка путей

Отредактируйте build.conf в корне модуля:

# Пути к исходникам llama.cpp (без переменных окружения)
LLAMA_CPP_PATH=/home/admin/cpp/llama.cpp
LLAMA_BUILD_PATH=/home/admin/cpp/llama.cpp/build
Параметр Описание
LLAMA_CPP_PATH Каталог с исходниками llama.cpp (include/, common/, src/ и т.д.)
LLAMA_BUILD_PATH Каталог сборки CMake (там появятся build/src/libllama.a и др.)

После изменения build.conf выполните make — будет пересоздан cgo_flags.go с актуальными путями для CGO.

Сборка

Сборка состоит из двух этапов: сначала нативное ядро llama.cpp, затем Go-модуль с C-обёрткой binding.

1. Сборка llama.cpp

mkdir -p /home/admin/cpp/llama.cpp/build
cd /home/admin/cpp/llama.cpp/build

cmake .. \
  -DCMAKE_BUILD_TYPE=Release \
  -DBUILD_SHARED_LIBS=OFF

cmake --build . --target llama llama-common -j"$(nproc)"

Проверка, что библиотеки на месте:

ls -la build/src/libllama.a
ls -la build/common/libllama-common.a
ls -la build/common/libllama-common-base.a
ls -la build/ggml/src/libggml.a

Цель make в каталоге модуля при необходимости запустит эту же сборку автоматически (см. Makefile).

2. Сборка C-обёртки (libbinding.a)

В каталоге модуля:

cd /path/to/go-llama-new.cpp
make

Будет выполнено:

  1. Генерация cgo_flags.go из build.conf
  2. Компиляция binding.cppbinding.o
  3. Создание архива libbinding.a

Очистка артефактов обёртки:

make clean

3. Сборка Go-модуля

go build ./...

Или пример:

go build -o llama-example ./examples/
go run ./examples/main.go /path/to/model.gguf "Привет, мир"

При первой сборке CGO скомпилирует binding.cpp ещё раз и слинкует его с библиотеками из LLAMA_BUILD_PATH (см. cgo_flags.go).

Использование в своём проекте

import llama "go-llama-new.cpp"

func main() {
    model, err := llama.New("/path/to/model.gguf",
        llama.SetContext(4096),
        llama.SetGPULayers(0),
    )
    if err != nil {
        panic(err)
    }
    defer model.Free()

    text, err := model.Predict("Привет",
        llama.SetTokens(128),
        llama.SetTemperature(0.8),
    )
    if err != nil {
        panic(err)
    }
    println(text)
}

В go.mod вашего проекта:

require go-llama-new.cpp v0.0.0

replace go-llama-new.cpp => /path/to/go-llama-new.cpp

Перед go build в проекте-потребителе должны быть собраны llama.cpp и libbinding.a (шаги 12 выше).

Опциональные теги сборки

Как в оригинальном go-llama.cpp:

Тег Назначение
openblas Дополнительная линковка с OpenBLAS (llama_openblas.go)
cublas CUDA (llama_cublas.go) — требует отдельной сборки llama.cpp с GGML_CUDA=ON

Пример:

go build -tags openblas ./...

Для GPU нужно пересобрать llama.cpp с нужными опциями CMake (например -DGGML_CUDA=ON) и убедиться, что пути в build.conf указывают на эту сборку.

Устранение неполадок

неопределённая ссылка на llama_compiler / llama_commit / llama_build_number

Не слинкована libllama-common-base.a. Убедитесь, что в cgo_flags.go в LDFLAGS есть -lllama-common-base, и пересоберите:

make
go build ./...

cannot find -lllama или -lllama-common

Проверьте LLAMA_BUILD_PATH в build.conf и выполните сборку llama.cpp (шаг 1).

CGO отключён

go env CGO_ENABLED   # должно быть 1

Установите gcc/g++, если CGO выключен из-за отсутствия компилятора C.

Изменили путь к llama.cpp

  1. Обновите build.conf
  2. make (обновит cgo_flags.go и libbinding.a)
  3. go build ./...

Структура репозитория

.
├── build.conf          # пути к llama.cpp
├── binding.h
├── binding.cpp         # C API для CGO
├── cgo_flags.go        # флаги CGO (генерируется make)
├── llama.go
├── options.go
├── Makefile
├── examples/main.go
└── README.md

Лицензия

Следует лицензиям llama.cpp и исходного go-llama.cpp. Используйте в соответствии с условиями соответствующих проектов.

Description
LLama.cpp golang bindings
Readme 45 KiB
Languages
Go 49.4%
C++ 47.3%
Makefile 3.3%