LangChain на Mac OS: Разработка ИИ-приложений локально
Полное руководство по установке LangChain на Mac OS. Подключение локальных моделей через Ollama, настройка Python и векторных баз данных (RAG) на Apple Silicon.
LangChain — это не нейросеть. Это фреймворк-оркестратор, который объединяет большие языковые модели (LLM) с внешними источниками данных: файлами, базами данных, API и инструментами. Если Ollama запускает модель, то LangChain строит вокруг неё рабочий процесс: читает документы, формирует промпт, вызывает модель, парсит ответ и записывает результат.
На Mac Mini с Apple Silicon этот стек работает полностью локально, без облачных API и подписок. Ниже — пошаговая настройка от установки Python до готового RAG-приложения.
Подготовка окружения
Установка Homebrew
Homebrew — пакетный менеджер для macOS. Если он не установлен:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
После установки добавьте Homebrew в PATH (для Apple Silicon путь отличается от Intel):
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
Установка Python через pyenv
Системный Python в macOS устаревший и не подходит для разработки. Используйте pyenv для управления версиями:
brew install pyenv
pyenv install 3.12
pyenv global 3.12
Добавьте pyenv в shell-конфигурацию:
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
source ~/.zshrc
Проверьте:
python --version
# Python 3.12.x
Создание проекта
mkdir langchain-mac && cd langchain-mac
python -m venv venv
source venv/bin/activate
Установка зависимостей
pip install langchain langchain-community langchain-core langchain-text-splitters
pip install chromadb # векторная база данных
pip install pypdf # загрузка PDF-документов
pip install sentence-transformers # модели эмбеддингов
Подключение локальной LLM через Ollama
Ollama позволяет запускать языковые модели на Apple Silicon без дополнительной настройки. LangChain поддерживает Ollama как провайдер LLM из коробки.
Установка Ollama
brew install ollama
ollama pull llama3.1:8b
Модель загрузится и будет доступна по адресу http://localhost:11434.
Базовый пример
from langchain_community.llms import Ollama
llm = Ollama(model="llama3.1:8b")
response = llm.invoke("Объясни, что такое RAG в трёх предложениях.")
print(response)
Выбор модели
Производительность LangChain-приложения напрямую зависит от модели. Рекомендации для Mac Mini:
| Модель | Размер | RAM для запуска | Скорость (M4, 16 ГБ) | Назначение |
|---|---|---|---|---|
| Llama 3.1 8B | 4.7 ГБ | 8 ГБ | 25–30 токенов/сек | Универсальная |
| Gemma 2 9B | 5.4 ГБ | 8 ГБ | 20–25 токенов/сек | Код и анализ |
| Qwen 2.5 14B | 8.7 ГБ | 12 ГБ | 15–18 токенов/сек | Русский язык |
| Mistral 7B | 4.1 ГБ | 8 ГБ | 28–32 токена/сек | Быстрый универсал |
| Llama 3.3 70B Q4 | 40 ГБ | 48 ГБ | 5–8 токенов/сек | Максимальное качество |
Для Mac Mini с 16 ГБ RAM оптимальный выбор — модели размером до 8B параметров. При 24 ГБ можно запускать 14B, при 32 ГБ — 32B.
Chains: цепочки вызовов
Основная концепция LangChain — цепочки (Chains). Каждая цепочка принимает входные данные, обрабатывает их через последовательность шагов и возвращает результат.
Простая цепочка с промпт-шаблоном
from langchain_community.llms import Ollama
from langchain_core.prompts import ChatPromptTemplate
llm = Ollama(model="llama3.1:8b")
prompt = ChatPromptTemplate.from_messages([
("system", "Ты — технический эксперт по Apple Mac Mini. Отвечай кратко и по делу."),
("user", "{question}")
])
chain = prompt | llm
result = chain.invoke({"question": "Сколько мониторов поддерживает Mac Mini M4?"})
print(result)
Оператор | (pipe) соединяет компоненты цепочки. Данные проходят слева направо: промпт форматируется → передается в LLM → возвращается ответ.
Цепочка с парсингом вывода
from langchain_core.output_parsers import StrOutputParser
chain = prompt | llm | StrOutputParser()
result = chain.invoke({"question": "Какой SSD стоит в Mac Mini M4?"})
# result — чистая строка без метаданных
RAG: ответы на основе ваших документов
Retrieval-Augmented Generation (RAG) — основной паттерн использования LangChain. Суть: модель отвечает не из собственных знаний, а на основе контекста, извлеченного из ваших документов.
Архитектура RAG
- Загрузка документов (PDF, TXT, Markdown)
- Разбиение на фрагменты (chunks)
- Создание эмбеддингов (числовых представлений текста)
- Сохранение в векторную базу данных (ChromaDB)
- Поиск релевантных фрагментов по запросу пользователя
- Передача найденных фрагментов в LLM как контекст
- Генерация ответа
Полный пример RAG-приложения
from langchain_community.llms import Ollama
from langchain_community.document_loaders import PyPDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.embeddings import OllamaEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
# 1. Загрузка PDF
loader = PyPDFLoader("manual.pdf")
documents = loader.load()
# 2. Разбиение на фрагменты
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
chunks = splitter.split_documents(documents)
# 3. Создание эмбеддингов и сохранение в ChromaDB
embeddings = OllamaEmbeddings(model="llama3.1:8b")
vectorstore = Chroma.from_documents(chunks, embeddings, persist_directory="./chroma_db")
# 4. Настройка ретривера
retriever = vectorstore.as_retriever(search_kwargs={"k": 4})
# 5. Промпт с контекстом
prompt = ChatPromptTemplate.from_template("""
Ответь на вопрос, используя только предоставленный контекст.
Если ответа нет в контексте, скажи "Информация не найдена".
Контекст: {context}
Вопрос: {question}
""")
# 6. Сборка цепочки
llm = Ollama(model="llama3.1:8b")
chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
# 7. Запрос
answer = chain.invoke("Какие порты есть у Mac Mini M4?")
print(answer)
Производительность RAG на Mac Mini
| Этап | Время (Mac Mini M4, 16 ГБ) |
|---|---|
| Загрузка PDF (100 страниц) | 2–3 сек |
| Создание эмбеддингов (100 чанков) | 15–30 сек |
| Поиск по базе (1 запрос) | 50–100 мс |
| Генерация ответа (Llama 3.1 8B) | 3–5 сек |
При повторных запросах эмбеддинги загружаются из ChromaDB на диске — этап создания пропускается. Время ответа: 3–6 секунд.
Агенты: LLM с доступом к инструментам
LangChain Agents — расширение цепочек, где модель самостоятельно решает, какие инструменты вызвать для ответа на вопрос.
from langchain_community.llms import Ollama
from langchain.agents import initialize_agent, Tool
from langchain_community.utilities import DuckDuckGoSearchAPIWrapper
llm = Ollama(model="llama3.1:8b")
search = DuckDuckGoSearchAPIWrapper()
tools = [
Tool(
name="web_search",
func=search.run,
description="Поиск актуальной информации в интернете"
)
]
agent = initialize_agent(tools, llm, agent="zero-shot-react-description")
result = agent.run("Какая последняя цена Mac Mini M4 в России?")
print(result)
Агент сам решит, нужен ли ему поиск в интернете, сформулирует запрос, получит результат и сформирует ответ.
Структура проекта
Рекомендуемая организация файлов для LangChain-приложения:
langchain-mac/
venv/ # виртуальное окружение
chroma_db/ # векторная база данных
documents/ # исходные документы для RAG
chains/
rag_chain.py # RAG-цепочка
summary_chain.py # цепочка суммаризации
tools/
search.py # инструменты для агентов
main.py # точка входа
requirements.txt # зависимости
Рекомендации по производительности
- Используйте
OllamaEmbeddingsвместоHuggingFaceEmbeddings— Ollama оптимизирован под Apple Silicon и использует Metal для ускорения - Храните ChromaDB на SSD (по умолчанию так и есть на Mac Mini) — скорость поиска зависит от IOPS
- Для больших документов (1000+ страниц) увеличьте
chunk_sizeдо 2000 и уменьшитеchunk_overlapдо 100 — это сократит количество эмбеддингов и ускорит индексацию - При работе с несколькими цепочками одновременно, запускайте Ollama как фоновый сервис:
ollama serve
Евгений Александров
Евгений работает с платформой Apple более 12 лет. В прошлом — сертифицированный сервисный инженер (ACMT). В настоящий момент специализируется на высоконагруженных системах, кластеризации Apple Silicon и оптимизации локальных AI/LLM агентов.
Читать все материалы автораЧасто задаваемые вопросы
Актуальна ли эта информация?
Могу ли я задать вопрос автору?
Подходит ли это руководство для моей модели Mac Mini?
Комментарии (2)
Оставить комментарий
А для Mac Mini M2 это тоже работает? У меня базовая конфигурация на 8 ГБ.
Да, на M2 тоже работает. Проверил на своём — всё ок.
Спасибо за статью! Всё получилось с первого раза, инструкция очень подробная.
Рад, что помогло! Если будут ещё вопросы — пишите.