LangChainMiddleExperience
Какие legacy API LangChain важно отличать от актуального v1-подхода, чтобы не строить новый проект на устаревшей модели?
Ключевые deprecated паттерны LangChain: AgentExecutor → create_react_agent (LangGraph), LLMChain → LCEL (prompt | llm | parser), ConversationBufferMemory → RunnableWithMessageHistory; пакеты разделены на langchain-core, langchain-openai, langchain-community.
Основные deprecated паттерны LangChain
AgentExecutor → LangGraph
AgentExecutor — устаревший способ запуска агентов. Начиная с LangChain 0.2+, официальная рекомендация — langgraph.prebuilt.create_react_agent.
# Устаревший подход (LangChain 0.1)
from langchain.agents import initialize_agent, AgentType
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION)
# Современный подход (LangGraph)
from langgraph.prebuilt import create_react_agent
agent = create_react_agent(llm, tools)
result = agent.invoke({"messages": [("human", "вопрос")]})
LLMChain → LCEL
LLMChain deprecated в пользу LCEL (LangChain Expression Language) с оператором |.
# Устаревший подход
from langchain.chains import LLMChain
chain = LLMChain(llm=llm, prompt=prompt)
result = chain.run(question="что такое Python?")
# Современный подход (LCEL)
from langchain_core.output_parsers import StrOutputParser
chain = prompt | llm | StrOutputParser()
result = chain.invoke({"question": "что такое Python?"})
ConversationChain / ConversationBufferMemory → RunnableWithMessageHistory
Старый Memory API (ConversationBufferMemory, ConversationChain) заменён на RunnableWithMessageHistory.
# Современный подход
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_community.chat_message_histories import ChatMessageHistory
store = {}
def get_session_history(session_id: str):
if session_id not in store:
store[session_id] = ChatMessageHistory()
return store[session_id]
chain_with_history = RunnableWithMessageHistory(
prompt | llm | StrOutputParser(),
get_session_history,
input_messages_key="question",
history_messages_key="history",
)
result = chain_with_history.invoke(
{"question": "Привет"},
config={"configurable": {"session_id": "user-1"}},
)
Разделение пакетов (0.1 → 0.2+)
langchain— тонкий слой оркестрации, без провайдеров.langchain-core— базовые абстракции (Runnable,BaseMessage,BaseTool). Самый стабильный пакет.langchain-openai,langchain-anthropic— провайдеры, версионируются отдельно.langchain-community— менее поддерживаемые интеграции; предпочитайте первоклассные пакеты провайдеров.
Подводные камни
- Примеры из Google/StackOverflow часто используют
from langchain.llms import OpenAI(0.1) — в 0.3 этоfrom langchain_openai import ChatOpenAI. initialize_agentсAgentTypeмолча работает в 0.2, но выдаёт DeprecationWarning — в будущих версиях будет удалён.- Миграция Memory API нетривиальна:
RunnableWithMessageHistoryтребует передаватьsession_idчерез config, а не хранить в объекте цепочки. langchain-communityсодержит сотни интеграций с разным качеством поддержки — проверяйте дату последнего коммита перед использованием.- LCEL несовместим со старым
.run()API — при миграции проверяйте форму входных данных (строка vs dict).
What hurts your answer
- Рассказывать устаревший подход как актуальную практику
- Не отличать личный legacy-опыт от состояния экосистемы в 2026 году
- Игнорировать migration notes и deprecated API
What they're listening for
- Понимает актуальное состояние LangChain
- Отличает современные практики от legacy-подходов
- Учитывает миграции, deprecated API и совместимость