Предыдущая статья с подборкой моделей для русского

draw a cat which choosing LLM model
draw a cat which choosing LLM model

Все модели из списка были проверены мной лично и ведут себя именно как написано. Мой компьютер оборудован 64ГБ оперативной памяти. По расчетам, для запуска на GPU нужны именно две видеокарты RTX 3090 с 24 ГБ видеопамяти на каждой на одном компе: llama.cpp в cortex.so должна подцепить их автоматически и использовать их память совместно (ссылка).

1. Модель для Supervisor агента

Лучше всего для целей оркестрации роя агентов подходит Gemma 3. Нужно брать именно версию 27b, так как она работает без галлюцинаций: версия 12b подходит для генерации технической документации, но вызывает несуществующие инструменты. Версия 4b игнорирует часть системного промпта. Версия 4b спамит догадками и наводящими вопросами

Ссылка на модель

2. Модель для языковых переводов

Для переводов очень хорошо работает YandexGPT 5 Lite Instruct. В отличие от Saiga, эта версия не будет вызывать инструменты, но датасет сделан самим яндексом, что улучшает её лингвистические познания при переводах с английского на русский. Можно использовать в пайплайне, для приведения ответов от последующих моделей в красивый вид

Ссылка на модель

3. Модель для финансовой аналитики

Позволяет генерировать отчёты следующего вида, на русском языке

Отчет о среднесрочной перспективе на 19/05/2025
Отчет о прогнозируемом тренде биткоина (1-3 дня)
Дата анализа: 19 мая 2025 года
Анализ сигналов индикатора MACD
Последние сигналы MACD:
19 мая 2025, 13:30 (UTC)
Тип сигнала: BUY
Цена: 103032.46
Причина: MACD пересек сигнальную линию вверх
Сила сигнала: Сильный
Стратегия: Пересечение сигнальной линии
19 мая 2025, 13:30 (UTC)
Тип сигнала: BUY
Цена: 103032.46
...
Причина: Гистограмма MACD пересекла нулевую линию вниз
Сила сигнала: Средний
Стратегия: Пересечение нулевой линии
Прогноз тренда:
На основе последних сигналов MACD можно выделить следующие тенденции:
Позитивные сигналы (BUY): Начиная с 13:15 (UTC), наблюдается серия сигналов на покупку, включая сильные сигналы, такие как пересечение MACD сигнальной линии вверх и пересечение гистограммы нулевой линии вверх. Это указывает на возможное восстановление восходящего тренда.
Негативные сигналы (SELL): В 12:30 (UTC) были зафиксированы сильные сигналы на продажу, что указывает на кратковременное снижение цены.
Вывод:
В среднесрочной перспективе (1-3 дня) вероятен восходящий тренд для биткоина, учитывая преобладание сильных сигналов на покупку в последние часы. Однако следует учитывать возможные кратковременные коррекции. Рекомендуется следить за дальнейшими сигналами MACD для подтверждения тренда.

Ссылка на модель

4. Альтернатива Gemma 3, если не нравится стиль речи

Частично игнорирует system prompt, но умеет вызывать инструменты, в том числе, с enum. Для тех, кому не нравится глянцевость языка модели gemma

Ссылка на модель

5. Модель для отладки System Prompt

Если system prompt писали несколько разработчиков, тейки внутри могут противоречить друг другу. Для выявления, удобно использовать reasoning модели. Особо примечательно, что модель Qwen3 32B может не делать рассуждение, если system prompt содержит включение текста /no_think

Ссылка на модель

Комментарии (3)


  1. gmtd
    21.06.2025 01:42

    Какая LLM позволит дать ответ в точности с переданной JSON схемой?


    1. tripolskypetr Автор
      21.06.2025 01:42

      Так как шаблонизаторы движков open source языковых моделей не очень, я бы рекомендовал вам использовать для этого рекурсивный вызов инструмента с наводящими вопросами.

      Доверять параметру enum так же не стоит, он сериализуется на вход языковой моделе, но не проверяется движком, который запускает gguf, на своей стороне

      import {
        addTool,
        commitToolOutput,
        commitToolOutputForce,
        execute,
        Schema,
      } from "agent-swarm-kit";
      import { str, Subject } from "functools-kit";
      import { z } from "zod";
      import { ToolName } from "src/enum/ToolName";
      import commitAppAction from "src/utils/commitAppAction";
      import { IPizzaOrder } from "src/model/interfaces";
      
      // См https://deepwiki.com/tripolskypetr/functools-kit/3.2-subject-and-behaviorsubject
      const pizzaSubject = new Subject<{ district: string; size: string; clientId: string }>()
      
      // Список районов Москвы
      const MOSCOW_DISTRICTS = [
        "АРБАТ",
        "БАСМАННЫЙ",
        "ЗАМОСКВОРЕЧЬЕ",
        "КРАСНОГОРСК",
        "ПРЕСНЕНСКИЙ",
        "ТАГАНСКИЙ",
        "ТВЕРСКОЙ",
        "ХАМОВНИКИ",
        "МЕЩАНСКИЙ",
        "ЯКИМАНКА",
      ];
      
      // Доступные размеры пиццы в сантиметрах
      const PIZZA_SIZES = [25, 30, 35, 40];
      
      addTool({
        toolName: ToolName.OrderPizzaTool,
        type: "function",
        call: async ({ toolId, clientId, agentName, params }) => {
          const { district, size } = params;
      
          // Проверка наличия района
          if (!district) {
            await commitToolOutput(
              toolId,
              "Пожалуйста, укажите район Москвы для доставки пиццы",
              clientId,
              agentName
            );
            await execute(`Узнай недостающие данные и вызови инструмент ${ToolName.OrderPizzaTool} еще раз!`, clientId, agentName);
            return;
          }
      
          // Проверка наличия размера
          if (!size) {
            await commitToolOutput(
              toolId,
              "Пожалуйста, укажите размер пиццы в сантиметрах",
              clientId,
              agentName
            );
            await execute(`Узнай недостающие данные и вызови инструмент ${ToolName.OrderPizzaTool} еще раз!`, clientId, agentName);
            return;
          }
      
          // Проверка валидности района
          if (!MOSCOW_DISTRICTS.includes(String(district).toUpperCase())) {
            await commitToolOutput(
              toolId,
              str.newline("Доставка возможна только в следующие районы:", MOSCOW_DISTRICTS),
              clientId,
              agentName
            );
            await execute(`Попроси пользователя указать верный район для доставки. Как получишь новый район, вызови инструмент ${ToolName.OrderPizzaTool} еще раз`, clientId, agentName);
            return;
          }
      
          // Проверка валидности размера
          if (!PIZZA_SIZES.includes(Number(size))) {
            await commitToolOutput(
              toolId,
              str.newline("Доступны только следующие размеры пиццы (в см):", PIZZA_SIZES),
              clientId,
              agentName
            );
            await execute(`Попроси пользователя указать верный размер пиццы. Как получишь новый район, вызови инструмент ${ToolName.OrderPizzaTool} еще раз`, clientId, agentName);
            return;
          }
      
          // Сохранение данных заказа в памяти для последующих заказов
          await Schema.updateSessionMemory(clientId, {
            district: district,
            size: size,
          });
      
          // Логирование параметров заказа
          console.log(`Заказ пиццы: Район - ${district}, Размер - ${size} см`);
      
          // Отправка действия для обработки заказа
          await pizzaSubject.next({ clientId, district, size })
      
          // Уведомление об успешном оформлении заказа
          await commitToolOutput(
            toolId,
            str.newline(["Заказ пиццы успешно оформлен. Перейди к оплате."]),
            clientId,
            agentName
          );
          await execute(`Заказ сформирован успешно. Более не вызывай инструмент ${oolName.OrderPizzaTool}`, clientId, agentName);
        },
        function: {
          name: ToolName.OrderPizzaTool,
          description: "Инструмент для заказа пиццы с доставкой по Москве",
          parameters: {
            type: "object",
            properties: {
              district: {
                type: "string",
                description: "Район Москвы для доставки пиццы",
                enum: MOSCOW_DISTRICTS,
              },
              size: {
                type: "number",
                description: "Размер пиццы в сантиметрах",
                enum: PIZZA_SIZES,
              },
            },
            required: ["district", "size"],
          },
        },
      });

      Вам потребуется использовать этот код внутри context scope, чтобы задать отдельный subject на каждый запрос пользователя. Более подробно по ссылке


    1. S_A
      21.06.2025 01:42

      посмотрите outlines. ollama его поддерживает из коробки.

      про plutus не знал, надо смотреть