⚖️ Старый vs Новый: initialize_agent → LangGraph

← К оглавлению урока

⚡ Что меняем

  • initialize_agent / AgentExecutor (устар.) → LangGraph create_react_agent
  • ConversationBufferMemorycheckpointer + thread_id
  • Tool(func=...) → декоратор @tool с docstring

Сравнение 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) + инструменты + память; меняется лишь способ их связать.