Сравнение 1: сборка агента
В старых руководствах (и в формулировках лекции) агента собирали через initialize_agent/AgentExecutor. В современном стеке используют LangGraph.
🟡 Классический LangChain (устар.)
from langchain.agents import initialize_agent, AgentType
agent = initialize_agent(
tools, llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True)
agent.run("...")
# initialize_agent помечен deprecated
🟢 Современный LangGraph
from langgraph.prebuilt import create_react_agent
agent = create_react_agent(
llm, tools, checkpointer=memory)
agent.invoke({"messages": [("user", "...")]},
config)
# единый граф, память и стриминг «из коробки»
Сравнение 2: память
🟡 Память как объект (из лекции)
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory(
memory_key="chat_history")
# привязывается к агенту;
# для нескольких диалогов — неудобно
🟢 Checkpointer + thread_id
memory = MemorySaver()
agent = create_react_agent(llm, tools,
checkpointer=memory)
config = {"configurable": {"thread_id": "user-42"}}
# каждый thread_id — отдельный диалог
Сравнение 3: объявление своего инструмента
🟡 Tool(func=...) (как в лекции)
date_tool = Tool(
name="Datetime",
func=get_current_date,
description="Returns current datetime.")
🟢 Декоратор @tool
from langchain_core.tools import tool
@tool
def get_current_date() -> str:
"""Returns current datetime in ISO format."""
return datetime.now().isoformat()
# имя и описание берутся из функции и docstring
⚠️ Конкретные имена импортов и сигнатуры зависят от версий LangChain/LangGraph. Идея неизменна: «мозг» (LLM) + инструменты + память; меняется лишь способ их связать.