Що таке 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.