javascript

Cohere Command — революция, которую мы пропустили

  • суббота, 22 марта 2025 г. в 00:00:02
https://habr.com/ru/articles/893232/

Исходный код, разобранный в данной статье, опубликован в этом репозитории

Длительный промежуток времени я искал модель, специально заточенную под вызов инструментов для внешних интегираций. Критерием поиска являлось минамальное колличество галлюцинаций при использовании железа с потребительского рынка

https://huggingface.co/tripolskypetr/command_r_gguf

Если десятки миллиардов параметров языковой модели потребуют покупать специлизированную видеокарту стоимостью 5 тысяч долларов, которую ещё нужно привезти и вставить в подходящую системную плату, такой бизнес нельзя масштабировать

Была поставлена задача: максимально использовать существующее железо. Исторически сложилось так, что офис укомплектован системными блоками с 32ГБ оперативной памяти и видеокартами RTX 3060 с 12ГБ видеопамяти

Результат поиска

В библиотеке моделей ollama была найдена модель command-r. Изначально, инструменты в ней были сломаны, однако, так как в issues началась ругонь, была получена копипаста, чтобы их починить.

ollama run oybekdevuz/command-r
ollama run oybekdevuz/command-r

И модель запустилась, заняв 90% ресурсов описанного выше системного блока. Вызов инструментов заработал, без тормозов и галюнов, средствами видеокарты. Это самый лучший вариант, так как мы максимально используем наше минимальное железо

Вызов инструметов заработал
Вызов инструметов заработал

Протестировали вызов инструментов. Есть различия с OpenAI: так как модель изначально позицинирует себя как оптимизированная под вызов внешних API, любое действие пользователя приходится прописывать как отдельный инструмент. В этом есть плюсы: поведение чата предсказуемо, если модель пишет, что товар добавлен в корзину, значит вместо текста-заглушки именно был отправлен HTTP запрос на сервер.

Что именно мы пропустили?

У cohere, производителя LLM, помимо облака, файлы модели в опенсорсе. Это тоже самое, что получить GGUF от GPT-4o и запустить локально. В итоге, получилось так, что на само облако мы не обратили внимание

https://docs.cohere.com/docs/rate-limits

У cohere есть free tier на 20 запросов в минуту на api key. Ограничение на количество времени, сколько живет trial токен я не нашел

https://dashboard.cohere.com/api-keys

Цена радикально более демократичная, чем в OpenAi. Однако, это не то, про что я хотел написать статью: А что если сделать карусель триальных токенов?

https://cohere.com/pricing

Весёлая карусель

Наш движок роя агентов, для подключения облачных LLM, использует адаптер: чтобы мы могли выскочить из Yandex Cloud или любого другого облака, если оно взвинтит цену подписки

import { Adapter, addCompletion, RoundRobin } from "agent-swarm-kit";
import { CompletionName } from "../enum/CompletionName";
import { CohereClientV2 } from "cohere-ai";

const getCohere = (token: string) =>
  new CohereClientV2({
    token,
  });

const COHERE_TOKENS = [process.env.COHERE_API_KEY, /* Вы знаете, что делать :-) */];

addCompletion({
  completionName: CompletionName.CohereCompletion,
  getCompletion: RoundRobin.create(COHERE_TOKENS, (apiKey) =>
    Adapter.fromCohereClientV2(getCohere(apiKey), "command-r-08-2024")
  ),
});

Соответственно, помимо запуска command-r в облаке, в академический проект был добавлен коннектор для Ollama

import { Adapter, addCompletion } from "agent-swarm-kit";
import { CompletionName } from "../enum/CompletionName";
import { singleshot } from "functools-kit";
import { Ollama } from "ollama";

const getOllama = singleshot(
  () => new Ollama({ host: "http://127.0.0.1:11434" })
);

addCompletion({
  completionName: CompletionName.OllamaCompletion,
  getCompletion: Adapter.fromOllama(getOllama(), "oybekdevuz/command-r", ""),
});

И коннектор для LMStudio. Дополнительно, GGUF образ модели был выгружен в HuggingFace по этой ссылке, для удобства запуска тем, кто предпочитает запускать модели мышкой, а не из консоли

import { Adapter, addCompletion } from "agent-swarm-kit";
import { singleshot } from "functools-kit";
import OpenAI from "openai";
import { CompletionName } from "../enum/CompletionName";

const getOpenAI = singleshot(
  () => new OpenAI({ baseURL: "http://127.0.0.1:1234/v1", apiKey: "noop" })
);

addCompletion({
  completionName: CompletionName.LMStudioCompletion,
  getCompletion: Adapter.fromLMStudio(getOpenAI(), "command_r_gguf"),
});

От себя добавлю, что локальная и облачная модели ведут себя абсолютно одинакого, что большой плюс, так как я не знаю, сколько ещё такая веселая карусель проработает...

Спасибо за внимание!

Надеюсь, компании cohere моя веселая карусель не будет сильно грустной и накладной по финансам(