Создание собственного сервиса Лама астролог на базе модели LLaMA и языка программирования Elixir

Самое главное помнить, что работа с большими языковыми моделями требует внимательного отношения к
установке зависимостей, к ресурсам сервера и к этическим аспектам использования астрологических
прогнозов. В этой статье мы подробно разберём, как собрать собственный сервис «Лама‑астролог» на базе
модели LLaMA и языка программирования Elixir.

Что такое LLaMA и зачем её использовать для астрологии?

LLaMA (Large Language Model Meta AI) – это открытая серия трансформеров, разработанных компанией
Meta. По сравнению с другими моделями (ChatGPT, DeepSeek) LLaMA отличается:

  • Низкой стоимостью инференса. Модель оптимизирована под CPU/GPU и может работать на
    обычных серверах без дорогостоящих ускорителей.
  • Гибкостью настройки. Вы можете дообучить её на специализированных датасетах, например,
    на корпусе астрологических текстов.
  • Прозрачностью. Исходный код и весы модели доступны, что упрощает интеграцию в
    проекты на Elixir.

Требования к окружению

  1. ОС: Linux/macOS (Windows поддерживается через WSL).
  2. Elixir ≥ 1.14 и Erlang/OTP ≥ 25.
  3. Python ≥ 3.9 (для сборки llama.cpp).
  4. GPU (опционально) – NVIDIA с драйверами ≥ 470 и CUDA ≥ 11.8 для ускорения.
  5. Не менее 8 ГБ ОЗУ (рекомендовано 16 ГБ) и свободное место ≈ 30 ГБ для моделей 7‑B и 13‑B.

Шаг 1. Установка llama.cpp и подготовка модели

Для работы с LLaMA в Elixir удобно использовать llama.cpp – C‑библиотеку с быстрым инференсом.

git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
make -j$(nproc) # Сборка с поддержкой AVX2/AVX512

python3 convert.py /path/to/llama-7b/ 7B.ggmlv3.q4_0.bin

Шаг 2. Обёртка для Elixir – ex_llama

Существует несколько сторонних пакетов, реализующих NIF‑интерфейс к llama.cpp. Ниже
приведён пример создания собственного wrapper.

Создаём микс‑проект

mix new llama_astrologer --sup
cd llama_astrologer

Добавляем зависимость в mix.exs

defp deps do
 [
 {:ex_llama, "~> 0.1.0", github: "yourname/ex_llama", tag: "0.1.0"},
 {:jason, "~> 1.4"}
 ]
end

Реализуем NIF‑модуль

В native/ex_llama разместите исходники C‑обёртки, которые вызывают функции из
llama.cpp. Минимальный набор функций:

  • init/1 – загрузка модели.
  • predict/2 – генерация текста по промпту.
  • close/0 – освобождение ресурсов.

Шаг 3. Подготовка астрологического датасета

Чтобы «ламa‑астролог» выдавал осмысленные предсказания, её нужно дообучить (fine‑tune) на
астрологическом корпусе:

  1. Соберите тексты: гороскопы, трактаты, объяснения планетных аспектов.
  2. Приведите их к формату jsonl с полями prompt и completion.
  3. Запустите тренировку в llama.cpp:
    ./llama-cli --model 7B.ggmlv3.q4_0.bin 
     --train data/astro_dataset.jsonl 
     --epochs 3 --lr 0.0003
    

Шаг 4. Реализация API‑слоя в Elixir

Супервизор для модели

defmodule LlamaAstrologer.Model do
 use GenServer

 @model_path "priv/models/7B.ggmlv3.q4_0.bin"

 def start_link(_opts) do
 GenServer.start_link(__MODULE__, %{}, name: __MODULE__)
 end

 @impl true
 def init(state) do
 {:ok, pid} = ExLlama.init(@model_path)
 {:ok, Map.put(state, :pid, pid)}
 end
 def predict(prompt) do
 GenServer.call(__MODULE__, {:predict, prompt})
 end

 @impl true
 def handle_call({:predict, prompt}, _from, %{pid: pid}=state) do
 {:ok, answer} = ExLlama.predict(pid, prompt, max_tokens: 200, temperature: 0.7)
 {:reply, answer, state}
 end

 def terminate(_reason, %{pid: pid}) do
 ExLlama.close(pid)
 :ok
 end
end

HTTP‑интерфейс (Plug + Cowboy)

defmodule LlamaAstrologer.Router do
 use Plug.Router

 plug :match
 plug :dispatch

 post "/predict" do
 {:ok, body, _conn} = Plug.Conn.read_body(conn)
 %{"date" => date, "sign" => sign} = Jason.decode!(body)

 prompt = """
 Ты — астролог‑ламa, обладающая древними знаниями.
 Дата рождения: #{date}
 Знак зодиака: #{sign}
 Сформулируй предсказание на ближайший месяц, учитывая текущие планетные аспекты.
 """

 answer = LlamaAstrologer.Model.predict(prompt)

 conn
 |> put_resp_content_type("application/json")
 |> send_resp(200, Jason.encode!(%{prediction: answer}))
 end


 match _ do
 send_resp(conn, 404, "Not found")
 end
end

Шаг 5. Запуск и тестирование

# Сборка проекта
mix deps.get
mix compile

iex -S mix

Отправьте запрос, например, с помощью curl:

curl -X POST http://localhost:4000/predict 
 -H "Content-Type: application/json" 
 -d '{"date":"1990-04-15","sign":"Овен"}'

В ответ вы получите JSON с предсказанием от ламы‑астролога.

Список рекомендаций «Самое главное помнить, что»

  • Ресурсы сервера. Даже оптимизированная LLaMA‑7B требует около 2 ГБ видеопамяти (или 8 ГБ ОЗУ без GPU).
  • Этика предсказаний. Астрология – спорная сфера; явно указывайте пользователям, что ответы
    генерируются ИИ и не являются профессиональными рекомендациями.
  • Контроль токсичности. Включите пост‑обработку через ex_llama с параметром
    stop и список запрещённых токенов, чтобы избежать неблагоприятных формулировок.
  • Кеширование. Часто запрашиваемые комбинации (дата+знак) можно кешировать в ETS или Redis,
    что сократит время отклика до <1 сек.
  • Обновление модели. Следите за релизами новых версий LLaMA (например, LLaMA‑2) – они
    предоставляют лучшую языковую способность и более эффективный инференс.

Создать собственного «ламa‑астролога» в Elixir – задача, доступная даже небольшим командам.
Главные этапы включают подготовку модели LLaMA, её дообучение на астрологическом корпусе,
интеграцию через NIF‑обёртку ex_llama и построение лёгкого HTTP‑API. При правильной
настройке вы получаете быстрый, масштабируемый сервис, который может обслуживать тысячи запросов
в сутки, а также открывает возможности для дальнейшего расширения (мульти‑модальный ввод,
интеграция с календарями и т.д.).

Удачной разработки и помните: самое главное, проверять результаты и не забывать о человеческом факторе!