LangChain v1.x с LangGraph — это сейчас стандарт для production-grade агентов на Python. Не прототип на коленке, а система с памятью, RAG и инструментами, которую можно деплоить. В этой статье разберем полный путь: от установки до рабочего агента с п…
10+ лет в маркетинге, 300+ клиентских проектов: сайты, реклама, боты. Создатель GoBanana (228K+ пользователей, 11.6 млн ₽ выручки) и VibeCoderz. Делаю AI-продукты сам через Claude Code, Cursor, Windsurf и консультирую тех, кто хочет так же.
Об авторе →Создать приложение с ИИ 5 способов вайбкодинга — от лендинга до мобильного
Создать приложение с помощью ИИ реально без единой строки кода: от веб-сервиса до мобильного приложения в Google Play за один вечер. Это не гипербола: актуальные данные 2026 года. Раньше запуск приложения требовал команды разработчиков, месяцев согла…
Как создать мобильное приложение с ИИ без программиста в 2026
Создать мобильное приложение с помощью ИИ без кода реально: приложение для Android с прогнозом погоды и алгоритмом расчёта: за один вечер. CRM для малого бизнеса: за 2-3 часа. Мобильный трекер расходов с публикацией в Google Play — несколько дней. Пр…
Gemini Code 22: что это за версия и почему её ищут
Если вы ввели «Gemini Code 22» в поиске — скорее всего, вы искали информацию про версию Gemini для программирования и просто немного запутались в именовании. Ничего страшного: у Google за последний год вышло столько версий и суб-версий, что даже опыт…
Google AI Studio для вайбкодинга: как создать приложение бесплатно прямо в браузере
Google AI Studio в марте 2026 года тихо стал одним из самых мощных инструментов для вайбкодинга — и при этом остался бесплатным для старта. Никаких установок, никаких API-ключей, никакого npm. Открываешь браузер, описываешь идею на русском, получаешь…
Агентное программирование 2026: что это, как работает и как начать
Агентное программирование: когда ИИ не просто дописывает строчку кода, а сам берет задачу, планирует шаги, пишет, тестирует и делает пулл-реквест. Вы пишете «добавь rate limiting в API», а дальше агент сам открывает файлы, вносит изменения в нескольк…
Как тестировать AI-сгенерированный код в 2026 году
AI написал код за 10 минут -- но как понять, что он реально работает? Тестирование AI-кода не требует знания программирования: есть инструменты, которые сами ходят по интерфейсу, нажимают кнопки и проверяют результат. В этой статье -- конкретные пром…
LangChain v1.x с LangGraph — это сейчас стандарт для production-grade агентов на Python. Не прототип на коленке, а система с памятью, RAG и инструментами, которую можно деплоить. В этой статье разберем полный путь: от установки до рабочего агента с поиском по документам.
Ниже — пошагово: архитектура агента, RAG на своих данных, инструменты и управление памятью. Плюс разбор LangGraph для тех, кто строит мультиагентные системы.
LangChain — это Python-фреймворк для оркестрации LLM-приложений. Не просто обертка над GPT или Claude, а полноценный слой между моделью и вашей бизнес-логикой.
114 000 звезд на GitHub и регулярные коммиты — фреймворк живой и активно поддерживается командой. В январе 2026 года LangSmith Agent Builder вышел в GA, появилась возможность собирать агентов на естественном языке. Но для нетривиальных задач по-прежнему нужен код, и вот тут LangGraph становится обязательным.
По данным LangChain Survey 2026 (1 300+ разработчиков), фокус сместился с быстрых прототипов на стабильные production-системы. Большинство команд теперь используют LangGraph вместо устаревшего AgentExecutor.
Максим: «Когда мы строили первую версию RAG для NeuroScribe, взяли самый простой стек. Через две недели пришлось переписывать на LangGraph — AgentExecutor не давал нужного контроля над логикой. Если сразу строишь на LangGraph, экономишь минимум неделю итераций.»

LangChain ставится через pip. Для агента с инструментами нужны два пакета:
pip install langchain langchain-openaiЕсли используешь OpenRouter (он дает доступ к Gemini, DeepSeek, Claude без американской карты):
pip install langchain-openai httpxНа OpenRouter есть бесплатные модели. Зайди в раздел Models, в прайсинге выставь все значения в ноль — получишь список free-моделей. Gemini Flash хорошо подходит для тестирования: быстрый, бесплатный, справляется с несложными задачами.
Для безопасной работы с ключами не вставляй их напрямую в код. Используй getpass или .env:
from getpass import getpass
api_key = getpass("Введи API ключ: ")Минимальная версия Python — 3.10+. На более ранних версиях часть синтаксиса LangChain не работает корректно.
Агент в контексте LangChain — это LLM, который умеет принимать решения о вызове инструментов. Обычная языковая модель отвечает только из того, на чем обучена. Агент может вызвать калькулятор, запросить данные из базы или обратиться к внешнему API.
Вот три ключевых компонента любого агента:
| Компонент | Что делает | Когда нужен |
|---|---|---|
| LLM | Принимает решения, генерирует ответы | Всегда |
| Tools | Выполняют реальные действия (поиск, вычисления, API) | Когда нужны актуальные данные |
| Memory | Хранит историю диалога | Для чат-ботов и сессионных приложений |

Важный момент: даже если инструмент один — передавай его в список. LangChain требует именно список tools, не отдельный объект.
from langchain.agents import create_tool_calling_agent, AgentExecutor
# tools всегда список, даже если инструмент один
tools = [my_calculator_tool]
agent = create_tool_calling_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools)Частая ошибка — пропустить docstring. LangChain использует описание функции, чтобы объяснить агенту, когда и зачем вызывать инструмент. Без docstring create_tool_calling_agent выбросит ошибку.
from langchain.tools import tool
@tool
def get_weather(city: str) -> str:
"""Возвращает текущую погоду для указанного города.
Используй этот инструмент, когда пользователь спрашивает о погоде."""
# здесь реальный запрос к API погоды
return f"В {city} сейчас +18°C, облачно"Агент не вызовет инструмент, если не поймет его назначение из docstring. Чем точнее описание — тем лучше выборка.
RAG (Retrieval-Augmented Generation) — это способ подключить модель к своей базе знаний. Модель не додумывает из обучающих данных, а сначала ищет релевантные фрагменты в твоих документах, потом генерирует ответ на их основе.
Схема простая: документы -> чанки -> векторное хранилище -> retriever -> LLM.

Критически важный промт для предотвращения галлюцинаций:
If you don't know the answer based on the provided context, just say "I don't know".Эта инструкция останавливает модель от придумывания. Без неё даже хороший RAG начинает выдавать красиво звучащую неправду.
Два параметра, которые сильнее всего влияют на качество поиска:
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000, # символов в чанке
chunk_overlap=200 # пересечение соседних чанков
)chunk_overlap создает скользящее окно между чанками. Если информация разрезается на границе — overlap сохраняет контекст в обоих кусках. Без него часть ответов будет обрезана.
На практике: для технической документации chunk_size 800-1200 работает лучше всего. Для коротких FAQ-статей — 400-600.

Ниже полный рабочий пример. Агент принимает вопросы, ищет ответы в загруженных документах и использует LLM только для формулировки ответа.
pip install langchain langchain-openai langchain-community faiss-cpu beautifulsoup4from langchain_community.document_loaders import WebBaseLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
import bs4
# Загружаем данные с сайта
loader = WebBaseLoader(
web_paths=["https://vibecoderz.ru/blog/"],
bs_kwargs=dict(
parse_only=bs4.SoupStrainer(
class_=("post-content", "post-title", "post-header")
)
),
)
docs = loader.load()
# Разбиваем на чанки
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
chunks = splitter.split_documents(docs)from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(chunks, embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 4})from langchain_openai import ChatOpenAI
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.4)
system_prompt = """Ты — помощник по вайбкодингу.
Отвечай только на основе предоставленного контекста.
Если не знаешь ответа — скажи об этом прямо.
Контекст: {context}"""
prompt = ChatPromptTemplate.from_messages([
("system", system_prompt),
("human", "{input}"),
])
question_answer_chain = create_stuff_documents_chain(llm, prompt)
rag_chain = create_retrieval_chain(retriever, question_answer_chain)response = rag_chain.invoke({"input": "Какие AI IDE лучше всего для новичков?"})
print(response["answer"])Без памяти агент не помнит предыдущих сообщений. Каждый запрос — как первый. Для чат-бота это катастрофа.
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory
store = {}
def get_session_history(session_id: str):
if session_id not in store:
store[session_id] = ChatMessageHistory()
return store[session_id]
agent_with_memory = RunnableWithMessageHistory(
rag_chain,
get_session_history,
input_messages_key="input",
history_messages_key="chat_history",
)Для многопользовательских приложений (например, Telegram-бот) session_id — это ID чата пользователя. Каждый пользователь получает изолированную историю, чужие сообщения не смешиваются.
Чтобы сбросить историю конкретной сессии:
store["user_123"].clear()Настройка temperature: для агентов оптимальный диапазон — 0.4-0.6. Слишком низкая температура парадоксально увеличивает расход токенов: модель начинает дольше «думать» перед ответом. Слишком высокая — теряет точность на фактических вопросах.

LangGraph — это библиотека поверх LangChain для построения агентов как графов. Каждая функция или LLM-вызов — это вершина (node), передача данных между ними — ребра (edges).
Ключевое отличие от AgentExecutor: в LangGraph у тебя полный контроль над тем, что происходит на каждом шаге. Можно добавить человека в петлю (human-in-the-loop), сделать условную логику, распараллелить шаги.
from langgraph.graph import StateGraph, END
from typing import TypedDict, Annotated
import operator
class AgentState(TypedDict):
messages: Annotated[list, operator.add]
approval: str
def research_node(state: AgentState):
# LLM ищет информацию
result = llm.invoke(state["messages"])
return {"messages": [result], "approval": ""}
def check_approval(state: AgentState):
# условная логика: продолжать или нет
if state["approval"] == "yes":
return "summarize"
return "research"
graph = StateGraph(AgentState)
graph.add_node("research", research_node)
graph.add_conditional_edges("research", check_approval, {
"research": "research",
"summarize": "summarize"
})Состояние (state) в LangGraph — это общий «блокнот», который видят все ноды. Думай о нем как о контексте всего пайплайна.
Чтобы LLM возвращал JSON вместо произвольного текста, используй Pydantic:
from pydantic import BaseModel
from langchain_openai import ChatOpenAI
class ResearchResult(BaseModel):
title: str
summary: str
confidence: float
llm = ChatOpenAI(model="gpt-4o-mini")
structured_llm = llm.with_structured_output(ResearchResult)
result = structured_llm.invoke("Исследуй тему: LangGraph в production")
print(result.title) # прямой доступ к полям без парсингаЭто надежнее, чем просить модель ответить в формате JSON — Pydantic гарантирует структуру на уровне типов.

| Задача | Лучший выбор | Почему |
|---|---|---|
| Простой чат-бот с FAQ | RAG без агента | Быстро, дешево, предсказуемо |
| Агент с внешними API | create_tool_calling_agent | Стандартный подход для инструментов |
| Сложный мультишаговый пайплайн | LangGraph | Полный контроль над логикой |
| Human-in-the-loop сценарии | LangGraph + interrupt | Единственный правильный вариант |
| MVP за один день | LangChain + FAISS | Минимум зависимостей |
Совет из реальной практики: если нода агента работает с большим объемом данных (1000+ страниц), не загружай всё в один контекст. Разбивай на этапы: первый агент делает резюме по каждому документу, второй — резюме резюме. Качество результата заметно лучше.

Для простого деплоя через FastAPI:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Query(BaseModel):
question: str
session_id: str
@app.post("/ask")
async def ask(query: Query):
response = agent_with_memory.invoke(
{"input": query.question},
config={"configurable": {"session_id": query.session_id}}
)
return {"answer": response["answer"]}Для продакшена добавь Redis для хранения истории вместо in-memory словаря — иначе при перезапуске сервера все сессии сбросятся.
LangSmith помогает отслеживать каждый вызов агента: видно, какие инструменты вызывались, сколько токенов потрачено, где возникли ошибки. Для дебага production-агентов незаменим.
| Модель | Цена (1M токенов) | Лучше всего для LangChain агентов |
|---|---|---|
| Claude Sonnet 4.6 | $3 / $15 | Сложный reasoning, надежный вызов инструментов |
| Gemini 3.1 Pro | $2 / $12 | Большие кодовые базы (до 1M токенов контекста) |
| GPT-5.4 | $2.5 / $15 | RAG с техническими документами |
| DeepSeek V3.2 | $0.28 / $0.42 | Прототипирование, бюджетные решения |
| Gemini Flash (бесплатно) | $0 | Разработка и тестирование |
Для начала — Gemini Flash через OpenRouter. Когда агент заработает, переходи на Claude Sonnet 4.6 или GPT-5.4 для продакшена: они значительно надежнее вызывают инструменты и реже галлюцинируют в RAG.

Нет docstring у инструмента. LangChain не понимает, когда вызывать инструмент. Всегда добавляй описание — конкретное, без воды.
Температура слишком низкая. При temperature=0 агент на простых задачах тратит больше токенов, чем при 0.4-0.6. Проверено на практике.
Нет chunk_overlap в RAG. Информация на границах чанков теряется. Минимальный overlap — 10-20% от chunk_size.
Один инструмент передан не как список. tools=my_tool вместо tools=[my_tool] — частая ошибка у новичков.
Смешиваются сессии разных пользователей. В Telegram-боте обязательно используй session_id = str(message.chat.id), иначе история одного пользователя попадет другому.
Чем LangChain отличается от простого вызова API OpenAI?
LangChain добавляет оркестрацию: память, инструменты, RAG, цепочки вызовов. Прямой API-вызов — это один запрос и один ответ. LangChain позволяет строить системы с логикой и состоянием.
Нужен ли LangGraph для простого агента?
Нет. Для базового агента с 2-3 инструментами хватает create_tool_calling_agent. LangGraph нужен, когда логика становится нелинейной: условные переходы, параллельные ноды, human-in-the-loop.
Можно ли использовать LangChain без OpenAI?
Да. LangChain поддерживает любую модель через адаптеры: Claude, Gemini, DeepSeek, Mistral. OpenRouter дает доступ к десяткам моделей через одно API.
Какой векторный стор выбрать для продакшена?
FAISS хорош для локальной разработки и небольших объемов. Для продакшена — Qdrant, Weaviate или Pinecone. Они поддерживают горизонтальное масштабирование и метадата-фильтры.
Как контролировать расходы на токены?
Устанавливай max_tokens на уровне модели, добавляй verbose=False в AgentExecutor чтобы убрать лишние логи, используй более дешевые модели для простых задач (DeepSeek V3.2 за $0.28/1M токенов).
Как избежать галлюцинаций в RAG?
Добавь в системный промт: «Если ответ отсутствует в контексте — скажи об этом прямо». Не позволяй модели додумывать. Это единственный надежный способ.
Работает ли LangChain с русским языком?
Да, но качество embedding для русского текста ниже. Для лучших результатов используй модели с мультиязычными embedding (text-embedding-3-large от OpenAI или multilingual-e5).
LangChain — Python-фреймворк для создания приложений на основе LLM. Предоставляет инструменты для цепочек, агентов, памяти и RAG.
LangGraph — библиотека для построения агентов как направленных графов. Позволяет описывать сложную логику с ветвлениями и циклами.
RAG (Retrieval-Augmented Generation) — подход, при котором LLM сначала ищет релевантную информацию в базе знаний, затем генерирует ответ на её основе.
Agent — LLM, способный принимать решения о вызове внешних инструментов для выполнения задачи.
Tool — функция, которую агент может вызвать. Примеры: поиск в интернете, калькулятор, запрос к API.
Vector Store — база данных для хранения векторных представлений текста. Позволяет искать документы по смысловой близости.
Embedding — числовое представление текста в векторном пространстве. Похожие по смыслу тексты имеют близкие векторы.
Chunk — фрагмент документа после разбивки. Размер чанка влияет на точность поиска в RAG.
Session ID — уникальный идентификатор сессии пользователя. Используется для изоляции истории диалогов.
LangSmith — платформа для мониторинга и дебага LangChain приложений. Показывает трассировку каждого вызова.
Если ты ещё не пробовал LangChain — начни с самого простого: установи библиотеку, получи бесплатный ключ через OpenRouter (модель Gemini Flash), и запусти базовый RAG на своих документах. Это займет полтора часа, не больше.
Для тех, кто уже работает с LangChain, следующий шаг — перейти с AgentExecutor на LangGraph. Разница в контроле над логикой огромная, и в production это ощущается.
Посмотри каталог AI-инструментов — там собраны все актуальные IDE и ассистенты, с которыми LangChain интегрируется лучше всего. Отдельные обзоры есть на Claude Code, Cursor и GitHub Copilot.
Если строишь агента под конкретную задачу и хочешь разобрать архитектуру — запишись на консультацию к Максиму. Разберем стек, чанкинг, выбор модели и схему деплоя под твой кейс.
Обновлено: март 2026