Что такое LangChain?
LangChain — Python фреймворк для построения приложений на основе LLM. Предоставляет абстракции для цепочек вызовов, памяти, инструментов и агентов.
Установка
python3 -m venv langchain-env
source langchain-env/bin/activate
pip install langchain langchain-community langchain-ollama
pip install python-dotenv chromadb Подключение к Ollama
from langchain_ollama import OllamaLLM
llm = OllamaLLM(model="llama3.2", base_url="http://localhost:11434")
response = llm.invoke("Расскажи о преимуществах VDS")
print(response) Простая цепочка (Chain)
from langchain_core.prompts import ChatPromptTemplate
from langchain_ollama import OllamaLLM
prompt = ChatPromptTemplate.from_messages([
("system", "Ты помощник по хостингу."),
("user", "{question}")
])
llm = OllamaLLM(model="llama3.2")
chain = prompt | llm
result = chain.invoke({"question": "Чем VDS отличается от хостинга?"})
print(result) Агент с инструментами
from langchain.agents import create_react_agent, AgentExecutor
from langchain.tools import tool
from langchain_ollama import OllamaLLM
from langchain import hub
@tool
def get_server_info(query: str) -> str:
# Возвращает информацию о тарифах VDS
return "VDS Start 2GB RAM от 299 руб/мес"
llm = OllamaLLM(model="llama3.2", temperature=0)
tools = [get_server_info]
prompt = hub.pull("hwchase17/react")
agent = create_react_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
result = executor.invoke({"input": "Какой тариф нужен для AI-агента?"})
print(result["output"]) Частые ошибки
Большая часть ошибок в LangChain связана не с логикой цепочек, а с быстро меняющимся API: модули переезжают между пакетами быстрее, чем успевает обновляться документация в интернете.
ImportError: cannot import name 'OllamaLLM' from 'langchain_community.llms'
Интеграция с Ollama была вынесена из langchain_community в отдельный пакет langchain-ollama. Старые примеры в интернете импортируют класс из community-модуля, но актуальный класс OllamaLLM нужно импортировать именно из langchain_ollama, как показано выше. Установка одного лишь langchain без langchain-ollama — вторая частая причина этой же ошибки.
Agent stopped due to iteration limit or time limit.
Именно так выглядит ответ AgentExecutor, если агент не смог сформировать финальный ответ за отведённое число шагов (по умолчанию — 15 итераций). Это не сбой, а защитный механизм от зацикливания. Если агент регулярно упирается в лимит, проблема обычно в промпте инструмента: агент не понимает, когда пора остановиться и вернуть Final Answer.
Основные операторы LCEL
| Синтаксис | Что делает |
|---|---|
| prompt | llm | Передаёт вывод prompt на вход llm |
| chain.invoke(dict) | Синхронный вызов цепочки с параметрами |
| chain.stream(dict) | Потоковый вывод токенов по мере генерации |
| chain.batch([dict, ...]) | Параллельная обработка нескольких запросов |
Когда LangChain не подходит
- Задача — единичный запрос к модели без цепочек и памяти: прямой вызов через Ollama API будет короче и без лишних зависимостей.
- Команде важна стабильность API между обновлениями — LangChain меняет интерфейсы заметно чаще, чем большинство библиотек такого уровня.
- Нужна готовая ролевая модель команды агентов «из коробки» — для этого больше подходит CrewAI с его абстракцией ролей.
- Критична производительность на каждый запрос — слои абстракций LangChain добавляют накладные расходы по сравнению с прямыми вызовами API.
Проверка, что цепочка и агент работают
python3 -c "import langchain, langchain_ollama; print(langchain.__version__)"
ollama list Сначала убедитесь, что оба пакета установлены и совместимы. Затем прогоните простую цепочку без агента (раздел выше) — если она возвращает осмысленный текст, LLM и подключение настроены верно. Только после этого переходите к агенту: если ReAct-агент выдаёт "Agent stopped due to iteration limit", а простая цепочка работает — проблема в описании инструмента, а не в подключении к модели.
Ещё один момент, который часто упускают: LCEL-цепочки по умолчанию не кэшируют промежуточные результаты между вызовами. Если один и тот же запрос к LLM повторяется в разных ветках цепочки, он будет выполнен заново каждый раз. Для повторяющихся подзапросов стоит явно подключить кэширование на уровне LangChain или хранить промежуточные результаты самостоятельно, особенно если модель работает медленно на CPU.