База знаний

LangChain на Mac OS: Разработка ИИ-приложений локально

Полное руководство по установке LangChain на Mac OS. Подключение локальных моделей через Ollama, настройка Python и векторных баз данных (RAG) на Apple Silicon.

Редакция Mac-Mini.ru ·
LangChainPythonOllamaRAGApple 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 8B4.7 ГБ8 ГБ25–30 токенов/секУниверсальная
Gemma 2 9B5.4 ГБ8 ГБ20–25 токенов/секКод и анализ
Qwen 2.5 14B8.7 ГБ12 ГБ15–18 токенов/секРусский язык
Mistral 7B4.1 ГБ8 ГБ28–32 токена/секБыстрый универсал
Llama 3.3 70B Q440 ГБ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

  1. Загрузка документов (PDF, TXT, Markdown)
  2. Разбиение на фрагменты (chunks)
  3. Создание эмбеддингов (числовых представлений текста)
  4. Сохранение в векторную базу данных (ChromaDB)
  5. Поиск релевантных фрагментов по запросу пользователя
  6. Передача найденных фрагментов в LLM как контекст
  7. Генерация ответа

Полный пример 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
Фото автора: Евгений Александров
Mac Hardware Expert & Tech Lead

Евгений Александров

Евгений работает с платформой Apple более 12 лет. В прошлом — сертифицированный сервисный инженер (ACMT). В настоящий момент специализируется на высоконагруженных системах, кластеризации Apple Silicon и оптимизации локальных AI/LLM агентов.

Читать все материалы автора

Часто задаваемые вопросы

Актуальна ли эта информация?
Статья опубликована 17 апреля 2026 г. и регулярно обновляется. Все инструкции проверены на актуальных версиях macOS.
Могу ли я задать вопрос автору?
Да, используйте форму комментариев ниже. Автор и сообщество обычно отвечают в течение 24 часов.
Подходит ли это руководство для моей модели Mac Mini?
В статье указаны конкретные модели, для которых актуальна информация. Если ваша модель не упомянута, задайте вопрос в комментариях.

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

Оставить комментарий

ВН
Виктор Николаев 3 дня назад

Спасибо за статью! Всё получилось с первого раза, инструкция очень подробная.

РM
2 дня назад

Рад, что помогло! Если будут ещё вопросы — пишите.

ЕС
Елена Смирнова 1 неделю назад

А для Mac Mini M2 это тоже работает? У меня базовая конфигурация на 8 ГБ.

СК
6 дней назад

Да, на M2 тоже работает. Проверил на своём — всё ок.