В мире, где со всех углов люди кричат про AI, сложно оставаться в стороне и не использовать этот инструмент. Давайте представим, что в ваш проект нужно «затащить» LLM. Как это сделать? Сегодня расскажу, как подключить Flutter/Dart-приложение к локальному серверу Ollama с помощью пакета ollama_dart.
Ollama — это инструмент для запуска языковых моделей локально, на своем компьютере. Кстати, вот отличная статья о нем на Хабре. Он дает:
▫️ приватность
▫️ полный контроль
▫️ отсутствие зависимости от облачных API
Допустим, сервер Ollama уже запущен. Как теперь связать его с Flutter/Dart-приложением? Сделать это легко с помощью библиотеки ollama_dart, которая позволяет:
✔️ отправлять одиночные запросы
✔️ работать со стримингом ответов
✔️ использовать разные типы запросов: completion, chat, embeddings
✔️ выбирать любые доступные модели
Чтобы подключить Ollama, достаточно импортировать пакет и инициализировать клиента. По умолчанию он стучится на `
http://localhost:11434/api`, но вы можете указать свой URL и добавить заголовки:import 'package:ollama_dart/ollama_dart.dart';
final client = OllamaClient(baseUrl: 'some_url', headers: {});
После этого можно сразу отправлять запросы на генерацию текста. Например, с помощью метода
generateCompletion:final generated = await client.generateCompletion(
request: GenerateCompletionRequest(
model: 'mistral:latest',
prompt: 'Why is the sky blue?',
),
);
print(generated.response);
// The sky appears blue because of a phenomenon called Rayleigh scattering...
Если вам нужно получать ответы по мере генерации, можно использовать
generateChatCompletionStream. Представьте, что у нас есть чат-бот, и мы хотим вести с ним полноценный диалог, при этом видеть ответ модели по мере того, как она его формирует.
На примере ниже создается поток (`stream`) для чат-комплешена. Сначала мы задаем системную роль, которая описывает поведение модели, а затем отправляем сообщение пользователя:
final stream = client.generateChatCompletionStream(
request: GenerateChatCompletionRequest(
model: 'mistral:latest',
messages: [
Message(
role: MessageRole.system,
content: 'You are a helpful assistant.',
),
Message(
role: MessageRole.user,
content: 'List the numbers from 1 to 9 in order.',
),
],
),
);
await for (final chunk in stream) {
print(chunk.message?.content);
}
При работе с моделями можно выбирать разные версии, например
llama3 или mistral:latest, а также настраивать параметры генерации, такие как temperature — для степени креативности, numPredict — для ограничения длины ответа и topP — для управления вероятностным сэмплированием (и это еще не весь список доступных опций). Например:final generated = await client.generateCompletion(
request: const GenerateCompletionRequest(
model: 'mistral:latest',
prompt: 'Сочини мне историю про кита',
options: RequestOptions(
temperature: 0.7,
numPredict: 150,
),
),
);
Чтобы работа с LLM через Ollama была максимально продуктивной, стоит:
▪️ детализировать промт, указывая tone of voice, роль модели и примеры ответа
▪️ экспериментировать с разными моделями – результаты могут сильно отличаться
▪️ использовать стриминг для больших текстов, чтобы экономить память и быстрее получать частичные ответы
Вы можете использовать
ollama_dart для создания локальных чат-ботов, для генерации текста или интеграции LLM в существующие приложения. 📎На этом все, чтобы узнать больше, советую заглянуть в официальную библиотеку
ollama_dart и прочитать про Ollama
