LangChain и MongoDB: полный стек для AI-агентов в production 2026 | AiManual
AiManual Logo Ai / Manual.
31 Мар 2026 Гайд

Как использовать LangChain с MongoDB для production-агентов: полный стек

Пошаговый гайд по созданию production-агентов с оперативной памятью, векторным поиском и observability на стеке LangChain 1.x и MongoDB Atlas. Актуально на март

Ваш агент умный, но беспамятный и слепой. Вот как это починить

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

Агент забывает, о чем вы говорили три сообщения назад. На каждый запрос он заново лезет в базу, хотя ответ уже был в истории. Вместо JSON присылает стихи. А трассировка его действий напоминает археологические раскопки — непонятно, где что сломалось.

Знакомо? Проблема не в ваших промптах. Проблема в фундаменте. Вы строили прототип, а нужна production-система. И тут на сцену выходит партнерство, о котором все говорят в 2026: LangChain и MongoDB.

Это не просто "еще одна интеграция". Это попытка убить сразу трех зайцев: дать агенту память, дать ему знания и дать вам глаза, чтобы за всем этим следить. И все в одной экосистеме.

Забудьте про туториалы 2024 года. LangChain 1.x — это другой фреймворк. А MongoDB Atlas за последние два года сделал для AI-разработчиков больше, чем за предыдущие пять. Если вы все еще используете Pinecone для векторов и Redis для памяти, вы платите за три сервиса там, где хватит одного.

Почему именно этот стек? Потому что все остальное — костыли

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

LangChain + MongoDB Atlas решают это радикально:

  • Векторный поиск встроен прямо в базу данных. Индексируете документы один раз, ищете моментально. Не нужно синхронизировать данные между системами.
  • Оперативная память (memory) — это просто коллекция в той же базе. Сессии, история чата, промежуточные состояния агента живут рядом с вашими основными данными.
  • Наблюдаемость (observability) через LangSmith интегрируется на уровне middleware в LangChain 1.x. Каждый вызов агента, каждый запрос к базе, каждый шаг в LangGraph оставляет след.
  • Развертывание через LangGraph Deploy CLI упаковывает вашего агента в Docker-контейнер вместе со всей логикой подключения к MongoDB.

Звучит как маркетинг? Отчасти да. Но после шести месяцев работы с этим стеком в продакшене, я могу сказать: это работает. И вот как это настроить, чтобы не наступить на грабли.

1 Подготовка MongoDB Atlas: не просто база, а AI-движок

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

Заходите в Atlas (на март 2026 интерфейс сильно изменился, но суть та же). Создаете кластер M60 или выше — на более слабых инстансах векторный поиск будет тормозить. Включаете опцию "Atlas Vector Search". Это важно: старый "Atlas Search" и новый "Vector Search" — разные вещи. Вам нужен второй.

# Через Atlas CLI (актуально на 2026)
atlas clusters create AgentCluster \
  --provider AWS --region EU_WEST_1 \
  --instanceSize M60 \
  --enableVectorSearch

В настройках базы данных создаете пользователя с правами `readWriteAnyDatabase`. И вот первый нюанс: для production-агентов создайте отдельную базу, а не лепите все в `test`. Назовем ее `agent_prod`.

💡
Коллега сэкономил и выбрал инстанс M40. Его агент работал отлично, пока в векторном индексе было 1000 документов. Когда загрузили 50 000 техдокументов, поиск начал занимать 4-5 секунд. Пользователи разбежались. Не повторяйте эту ошибку. Для production с большими данными берите минимум M60, а лучше M80 с выделенным индексом для векторного поиска.

2 Векторный поиск: как перестать кормить LLM мусором

Большинство агентов получают информацию из двух источников: промпт разработчика и контекст из векторного поиска. Если второй источник дает хлам, агент начинает генерировать хлам.

В Atlas Vector Search на март 2026 доступны новые типы индексов. Старый добрый `knnVector` еще работает, но для текста теперь есть `vectorSearch` с предобученными профилями для OpenAI, Cohere и открытых моделей.

Создаем индекс для коллекции `knowledge_base`:

// В Atlas UI переходим в Vector Search -> Create Index
// Используем JSON Editor
{
  "fields": [
    {
      "type": "vector",
      "path": "embedding",
      "numDimensions": 1536, // Для text-embedding-3-large
      "similarity": "cosine",
      "indexOptions": {
        "type": "vectorSearch",
        "profile": "openAIEmbeddingsV3" // Новая опция 2026 года
      }
    },
    {
      "type": "filter",
      "path": "tenant_id" // Важно для multi-tenant архитектуры
    }
  ]
}

Теперь подключаем это к LangChain. В версии 1.x интеграция стала проще, но появились новые абстракции.

# langchain-mongodb версии 0.3.x (актуально на март 2026)
from langchain_mongodb.vectorstores import MongoDBAtlasVectorSearch
from langchain_openai import OpenAIEmbeddings

# Инициализация эмбеддингов с новой моделью text-embedding-3-large
embeddings = OpenAIEmbeddings(
    model="text-embedding-3-large",
    dimensions=1536  # Можем уменьшить размерность для экономии
)

# Подключение к векторному хранилищу
vector_store = MongoDBAtlasVectorSearch(
    collection=your_mongo_collection,
    embedding=embeddings,
    index_name="your_vector_index_name",
    text_key="content",  # Поле с текстом
    embedding_key="embedding",  # Поле с векторами
)

# Поиск с фильтрацией по tenant_id
retriever = vector_store.as_retriever(
    search_type="similarity",
    search_kwargs={
        "k": 5,
        "pre_filter": {"tenant_id": {"$eq": "company_123"}}  # Новый параметр 2026
    }
)

Зачем `pre_filter`? Без него агент будет искать документы по всем клиентам, что нарушает изоляцию данных. Это частая ошибка в multi-tenant системах.

3 Оперативная память: чтобы агент не страдал склерозом

Память в агентах — это больное место. В прототипах используют `ConversationBufferMemory`, который хранит все в оперативке. Перезапустили сервер — история стерлась. В production так нельзя.

В LangChain 1.x появилась абстракция `ChatMessageHistory` с бэкендами для разных хранилищ. Нас интересует MongoDB.

from langchain_mongodb.chat_message_histories import MongoDBChatMessageHistory
from langchain_core.chat_history import BaseChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory

# Создаем историю сообщений, привязанную к сессии
message_history = MongoDBChatMessageHistory(
    session_id="user_123_session_456",
    connection_string=MONGO_URI,
    database_name="agent_prod",
    collection_name="chat_histories",
)

# Добавляем TTL индекс для автоматической очистки старых сессий
# Это делается один раз в MongoDB:
# db.chat_histories.createIndex({ "created_at": 1 }, { expireAfterSeconds: 604800 }) # 7 дней

Теперь интегрируем память в агента. Самый надежный способ в 2026 — использовать `RunnableWithMessageHistory`.

# Создаем базового агента (упрощенно)
agent = create_agent_chain(llm, tools, prompt)

# Оборачиваем в RunnableWithMessageHistory
get_session_history = lambda session_id: MongoDBChatMessageHistory(
    session_id=session_id,
    connection_string=MONGO_URI,
    database_name="agent_prod",
    collection_name="chat_histories",
)

agent_with_memory = RunnableWithMessageHistory(
    agent,
    get_session_history,
    input_messages_key="input",
    history_messages_key="chat_history",
)

Теперь история каждого диалога сохраняется в MongoDB и подгружается при новом обращении. Агент помнит контекст даже после перезапуска сервиса.

Не храните всю историю диалога в одном документе. В MongoDB есть ограничение на размер документа (16MB). Если диалог очень долгий, он не влезет. Лучше хранить каждое сообщение как отдельный документ в коллекции и связывать их по `session_id`.

4 Собираем агента с LangGraph: state management для взрослых

Простые цепочки (chains) ломаются в production. Агент должен уметь принимать решения, возвращаться назад, обрабатывать ошибки. Для этого LangChain развивает LangGraph — фреймворк для построения агентов с управлением состоянием.

Состояние (state) агента мы тоже храним в MongoDB. Это позволяет перезапускать агента с того же места.

from langgraph.graph import StateGraph, MessagesState
from langgraph.checkpoint.mongodb import MongoDBCheckpointSaver
from langchain_openai import ChatOpenAI

# Определяем состояние агента
class AgentState(MessagesState):
    retrieved_docs: list = []
    tool_calls: list = []
    tenant_id: str

# Создаем чекпоинты в MongoDB
checkpointer = MongoDBCheckpointSaver(
    namespace="agent_checkpoints",
    connection_string=MONGO_URI,
    db_name="agent_prod",
    collection_name="agent_states",
    ttl_seconds=86400,  # Автоочистка через 24 часа
)

# Строим граф агента
graph_builder = StateGraph(AgentState)
# ... добавляем ноды и ребра ...

graph = graph_builder.compile(checkpointer=checkpointer)

Теперь каждый запуск агента создает чекпоинт в MongoDB. Если агент упал посреди выполнения, вы можете восстановить его состояние. Это критично для долгих многошаговых задач.

Больше о построении production-агентов с управлением контекстом читайте в нашем руководстве по middleware в LangChain 1.0.

5 Наблюдаемость с LangSmith: что делает ваш агент в 3 часа ночи?

Без наблюдаемости агент в production — черный ящик. Вы не знаете, почему он принял то или иное решение, сколько токенов потратил, как часто ошибается.

LangSmith интегрируется с LangChain через middleware. Настраивается один раз.

from langsmith import Client
from langchain_core.tracers.langsmith import LangSmithTracer

client = Client(
    api_url="https://api.langchain.com",  # Актуальный URL на 2026
    api_key="your_langsmith_api_key",
)

tracer = LangSmithTracer(
    client=client,
    project_name="production-agent-mongodb",
    tags=["mongodb", "atlas", "production"],
)

# Добавляем tracer к вашему агенту
agent_with_tracing = agent.with_config({
    "callbacks": [tracer],
    "run_name": "Agent with MongoDB backend",
})

Теперь в LangSmith вы видите каждый шаг: вызовы к LLM, запросы к векторной базе, использование инструментов, время выполнения. Особенно полезно отслеживать префильтры векторного поиска — убедитесь, что агент не видит данные чужих клиентов.

Подробнее о мониторинге читайте в статье LangChain: практическое руководство по мониторингу AI-агентов в production.

6 Развертывание: из кода в Docker одной командой

Самая новая часть стека — LangGraph Deploy CLI. Она превращает вашего агента в Docker-контейнер с API, метриками и health-checks.

Устанавливаете CLI (версия 2.x на март 2026):

pip install langgraph-deploy

# Создаете конфигурацию развертывания
langgraph deploy init --stack mongodb-atlas

В файле `deploy.yaml` указываете подключение к MongoDB и настройки агента:

# deploy.yaml
version: '2'
stack: mongodb-atlas
services:
  agent:
    type: langgraph
    entrypoint: agent.graph:graph
    env:
      MONGO_URI: ${MONGO_URI}
      OPENAI_API_KEY: ${OPENAI_API_KEY}
    resources:
      memory: 2Gi
      cpu: 1000m

mongodb:
  atlas_cluster: AgentCluster
  database: agent_prod
  vector_indexes:
    - name: knowledge_base_vector
      collection: knowledge_base
  # Автоматически создаст индексы при первом развертывании

Запускаете развертывание:

langgraph deploy up --env prod

CLI соберет Docker-образ, запустит его в вашем кластере Kubernetes (или совместимом облаке), проверит подключение к MongoDB Atlas и поднимет API. Весь процесс занимает 5-7 минут.

Больше о развертывании читайте в обзоре LangGraph Deploy CLI.

Где этот стек ломается? Реальные кейсы из 2026

Технологии идеальны в демках. В production все иначе. Вот три проблемы, с которыми столкнулись команды, и как их решали.

Проблема Симптомы Решение
Рост размера истории Агент тормозит, MongoDB использует много памяти, поиск по истории медленный Внедрить "суммаризацию" старых сообщений. Хранить полный текст последних 20 сообщений, а более старые заменять сжатым суммаризованным версиями.
Конфликт индексов Векторный поиск работает медленно, обычные запросы к коллекции тоже тормозят Создать отдельную коллекцию только для векторных данных. Не смешивать операционные данные и векторы в одном месте.
Сессии-зомби В базе накапливаются тысячи старых сессий, TTL индекс не срабатывает Добавить фоновый процесс, который раз в день удаляет сессии без активности больше 7 дней. TTL индекс в MongoDB срабатывает не мгновенно.

Самая частая ошибка — пытаться использовать одну коллекцию MongoDB для всего. Разделяйте данные: отдельная коллекция для чат-историй, отдельная для векторных документов, отдельная для чекпоинтов агента. Это упростит масштабирование и резервное копирование.

А что дальше? Куда движется экосистема

К концу 2026 LangChain и MongoDB планируют еще более глубокую интеграцию. Ходят слухи о встроенном кэшировании промптов прямо в Atlas, где результаты запросов к LLM будут автоматически сохраняться и использоваться при повторении одинаковых вопросов. Это сократит costs и latency.

Еще один тренд — агенты, которые сами обновляют свои векторные базы знаний. Представьте агента поддержки, который после успешного решения проблемы автоматически добавляет новый кейс в базу знаний, создает эмбеддинг и индексирует его. LangGraph с его циклами и чекпоинтами идеально подходит для таких автономных сценариев.

Но главный совет на сегодня: не гонитесь за новыми фичами. Возьмите этот стек, настройте базовую наблюдаемость через LangSmith, надежно сохраняйте состояние в MongoDB и убедитесь, что ваш агент не пересекает границы данных между клиентами. Остальное приложится.

И помните: самый опасный агент — не тот, который ошибается, а тот, который ошибается молча. Наблюдаемость — не опция, а необходимость. Без нее вы никогда не узнаете, что ваш production-агент уже неделю дает клиентам советы из документации конкурента потому, что векторный индекс случайно проиндексировал не те файлы.

Подписаться на канал