Skip to content

Power Query для Excel

llama.cpp поставляется со встроенным веб-сервером, который предоставляет API, совместимый с форматом OpenAI. В свою очередь, Power Query отлично умеет делать HTTP POST-запросы с помощью встроенной функции Web.Contents.

Ниже приведена пошаговая инструкция, как настроить такую связку.

Шаг 1: Запуск сервера llama.cpp

Section titled “Шаг 1: Запуск сервера llama.cpp”

Вам нужно запустить модель в режиме сервера. Если вы используете консольный llama.cpp, команда будет выглядеть примерно так (в новых версиях файл называется llama-server):

Terminal window
llama-server -m path/to/your/model.gguf --port 8080 -c 2048

Где -c 2048 — размер контекста. Вы можете добавить параметр --n-gpu-layers, чтобы ускорить генерацию, если у вас есть подходящая видеокарта.

После этого локальная модель будет доступна по адресу http://localhost:8080 и сможет принимать запросы в формате OpenAI (эндпоинт /v1/chat/completions).

Шаг 2: Создание функции в Power Query

Section titled “Шаг 2: Создание функции в Power Query”

Откройте Power BI или Excel, перейдите в Power Query (Get Data -> Blank Query / Получить данные -> Пустой запрос). Откройте Расширенный редактор (Advanced Editor) и вставьте следующий M-код:

let
// Функция принимает ваш промпт как текст
CallLocalLlama = (promptText as text) =>
let
url = "http://localhost:8080/v1/chat/completions",
// Формируем тело запроса в формате OpenAI
requestBody = [
messages = { [role = "user", content = promptText] },
temperature = 0.7,
max_tokens = -1 // -1 для генерации до упора, либо укажите нужное число
],
// Настраиваем параметры HTTP-запроса
options = [
Headers = [#"Content-Type"="application/json"],
Content = Json.FromValue(requestBody),
Timeout = #duration(0, 0, 5, 0) // Таймаут 5 минут (важно для локальных моделей)
],
// Отправляем запрос и получаем ответ
response = Web.Contents(url, options),
// Парсим JSON-ответ
jsonResponse = Json.Document(response),
// Достаем сгенерированный текст из структуры ответа
resultText = jsonResponse[choices]{0}[message][content]
in
resultText
in
CallLocalLlama

Сохраните запрос под именем, например, GetLlamaResponse.

Шаг 3: Настройка доступов в Power Query

Section titled “Шаг 3: Настройка доступов в Power Query”

Когда вы впервые запустите эту функцию (или нажмете “Готово”), Power Query запросит учетные данные для доступа к http://localhost:8080.

  1. Выберите тип аутентификации “Анонимный” (Anonymous).
  2. В параметрах уровня конфиденциальности (Privacy Levels) может потребоваться выбрать “Public” (Общедоступный) или “Организационный” для localhost, либо вообще включить настройку «Игнорировать уровни конфиденциальности» (Ignore Privacy Levels) в параметрах текущего файла. Иначе Power Query может заблокировать передачу данных из вашей таблицы в веб-запрос из соображений безопасности (Firewall data privacy).

Шаг 4: Использование функции

Section titled “Шаг 4: Использование функции”

Теперь вы можете применить созданную функцию к любой таблице. Например, если у вас есть таблица с отзывами клиентов (столбец Review), вы можете:

  1. Выбрать вкладку “Добавление столбца” (Add Column).
  2. Нажать “Вызвать пользовательскую функцию” (Invoke Custom Function).
  3. Выбрать функцию GetLlamaResponse и указать ей на вход столбец Review (или добавить дополнительный текст-промпт через слияние столбцов, например: "Сделай краткую выжимку этого отзыва: " & [Review]).
  • Скорость работы (Таймауты): Локальные LLM работают медленнее облачных API. В моем коде задан Timeout = #duration(0, 0, 5, 0) (5 минут). Если модель долго думает, стандартный таймаут Power Query в 100 секунд прервет запрос. При необходимости увеличьте это значение.
  • Производительность при пакетной обработке: Помните, что Power Query будет обрабатывать каждую строку таблицы последовательно (один за другим). Если у вас 10 000 строк данных, а локальная модель тратит по 5 секунд на ответ, обновление таблицы займет почти 14 часов. Используйте это только для небольших наборов данных.