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):
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 resultTextin CallLocalLlamaСохраните запрос под именем, например, GetLlamaResponse.
Шаг 3: Настройка доступов в Power Query
Section titled “Шаг 3: Настройка доступов в Power Query”Когда вы впервые запустите эту функцию (или нажмете “Готово”), Power Query запросит учетные данные для доступа к http://localhost:8080.
- Выберите тип аутентификации “Анонимный” (Anonymous).
- В параметрах уровня конфиденциальности (Privacy Levels) может потребоваться выбрать “Public” (Общедоступный) или “Организационный” для localhost, либо вообще включить настройку «Игнорировать уровни конфиденциальности» (Ignore Privacy Levels) в параметрах текущего файла. Иначе Power Query может заблокировать передачу данных из вашей таблицы в веб-запрос из соображений безопасности (Firewall data privacy).
Шаг 4: Использование функции
Section titled “Шаг 4: Использование функции”Теперь вы можете применить созданную функцию к любой таблице.
Например, если у вас есть таблица с отзывами клиентов (столбец Review), вы можете:
- Выбрать вкладку “Добавление столбца” (Add Column).
- Нажать “Вызвать пользовательскую функцию” (Invoke Custom Function).
- Выбрать функцию
GetLlamaResponseи указать ей на вход столбецReview(или добавить дополнительный текст-промпт через слияние столбцов, например:"Сделай краткую выжимку этого отзыва: " & [Review]).
Важные нюансы:
Section titled “Важные нюансы:”- Скорость работы (Таймауты): Локальные LLM работают медленнее облачных API. В моем коде задан
Timeout = #duration(0, 0, 5, 0)(5 минут). Если модель долго думает, стандартный таймаут Power Query в 100 секунд прервет запрос. При необходимости увеличьте это значение. - Производительность при пакетной обработке: Помните, что Power Query будет обрабатывать каждую строку таблицы последовательно (один за другим). Если у вас 10 000 строк данных, а локальная модель тратит по 5 секунд на ответ, обновление таблицы займет почти 14 часов. Используйте это только для небольших наборов данных.