🦜🕸️LangGraph
⚡ Создание языковых агентов в виде графов ⚡
Обзор
LangGraph — это библиотека для создания приложений с сохранением состояния и множеством акторов, использующих модели изучения языков (LLMs), используемая для создания агентных и многоагентных рабочих процессов. В отличие от других фреймворков LLM, она предлагает следующие основные преимущества: циклы, управляемость и сохранение состояния. LangGraph позволяет определить потоки, включающие циклы, что необходимо для большинства агентных архитектур, отличая её от решений, основанных на DAG. Как фреймворк низкого уровня, он предоставляет детальный контроль как над потоком, так и над состоянием вашего приложения, что важно для создания надёжных агентов. Кроме того, LangGraph включает встроенное сохранение, позволяющее использовать расширенные функции участия человека и памяти.
LangGraph вдохновлён Pregel и Apache Beam. Публичный интерфейс заимствует идеи из NetworkX. LangGraph создан компанией LangChain Inc, разработчиками LangChain, но может использоваться без LangChain.
Платформа LangGraph — это инфраструктура для развёртывания агентов LangGraph. Это коммерческое решение для развёртывания агентных приложений в производственной среде, построенное на основе фреймворка с открытым исходным кодом LangGraph. Платформа LangGraph состоит из нескольких компонентов, которые работают вместе для поддержки разработки, развёртывания, отладки и мониторинга приложений LangGraph: LangGraph Server (API), LangGraph SDKs (клиенты для API), LangGraph CLI (инструмент командной строки для создания сервера), LangGraph Studio (интерфейс/отладчик).
Чтобы узнать больше о LangGraph, ознакомьтесь с нашим первым курсом LangChain Academy, Введение в LangGraph, доступным бесплатно здесь.
Ключевые особенности
-
Циклы и ветвление: Реализуйте циклы и условные конструкции в своих приложениях.
-
Сохранение состояния: Автоматически сохраняйте состояние после каждого шага в графе. Приостанавливайте и возобновляйте выполнение графа в любой момент для поддержки восстановления ошибок, рабочих процессов с участием человека, путешествий во времени и многого другого.
-
Человек в цикле: Прерывайте выполнение графа для одобрения или редактирования следующего действия, запланированного агентом.
-
Поддержка потоковой передачи: Передача выходных данных по мере их создания каждым узлом (включая потоковую передачу т окенов).
-
Интеграция с LangChain: LangGraph бесшовно интегрируется с LangChain и LangSmith (но не требует их).
Платформа LangGraph
Платформа LangGraph — это коммерческое решение для развёртывания агентных приложений в производственной среде, построенное на основе фреймворка с открытым исходным кодом LangGraph. Вот некоторые распространённые проблемы, возникающие в сложных развёртываниях, которые решает платформа LangGraph:
- Поддержка потоковой передачи: Сервер LangGraph предоставляет несколько режимов потоковой передачи, оптимизированных для различных потребностей приложений
- Фоновое выполнение: Запускает агентов асинхронно в фоновом режиме
- Поддержка долгоработающих агентов: Инфраструктура, способная обрабатывать долгоработающие процессы
- Двойное текстирование: Обработка ситуации, когда вы получаете два сообщения от пользователя до того, как агент сможет ответить
- Обработка всплесков: Очередь задач для обеспечения устойчивой обработки запросов без потерь, даже при высоких нагрузках
Установка
pip install -U langgraph
Пример
Одной из центральных концепций LangGraph является состояние. Каждое выполнение графа создает состояние, которое передается между узлами графа по мере их выполнения, и каждый узел обновляет это внутреннее состояние своим возвращаемым значением после выполнения. Способ, которым граф обновляет свое внутреннее состояние, определяется либо выбранным типом графа, либо пользовательской функцией.
Давайте рассмотрим простой пример агента, который может использовать инструмент поиска.
pip install langchain-anthropic
export ANTHROPIC_API_KEY=sk-...
При желании, мы можем настроить LangSmith для лучшего наблюдения.
export LANGSMITH_TRACING=true
export LANGSMITH_API_KEY=lsv2_sk_...
from typing import Annotated, Literal, TypedDict
from langchain_core.messages import HumanMessage
from langchain_anthropic import ChatAnthropic
from langchain_core.tools import tool
from langgraph.checkpoint.memory import MemorySaver
from langgraph.graph import END, START, StateGraph, MessagesState
from langgraph.prebuilt import ToolNode
# Определяем инструменты, которые агент может использовать
@tool
def search(query: str):
"""Вызов для поиска в интернете."""
# Это заглушка, но не говорите об этом LLM...
if "sf" in query.lower() or "san francisco" in query.lower():
return "60 градусов и туманно."
return "90 градусов и солнечно."
tools = [search]
tool_node = ToolNode(tools)
```python
model = ChatAnthropic(model="claude-3-5-sonnet-20240620", temperature=0).bind_tools(tools)
# Определяем функцию, которая определяет, продолжать или нет
def should_continue(state: MessagesState) -> Literal["tools", END]:
messages = state['messages']
last_message = messages[-1]
# Если LLM вызывает инструмент, тогда мы направляем на узел "tools"
if last_message.tool_calls:
return "tools"
# В противном случае мы останавлив аемся (отвечаем пользователю)
return END
# Определяем функцию, которая вызывает модель
def call_model(state: MessagesState):
messages = state['messages']
response = model.invoke(messages)
# Мы возвращаем список, потому что это будет добавлено к существующему списку
return {"messages": [response]}
# Определяем новый граф
workflow = StateGraph(MessagesState)
# Определяем два узла, между которыми будем циклировать
workflow.add_node("agent", call_model)
workflow.add_node("tools", tool_node)
# Устанавливаем точку входа как `agent`
# Это означает, что этот узел вызывается первым
workflow.add_edge(START, "agent")
# Теперь добавляем условное ребро
workflow.add_conditional_edges(
# Сначала мы определяем стартовый узел. Мы используем `agent`.
# Это означает, что это ребра, которые будут использованы после вызова узла `agent`.
"agent",
# Далее, мы передаем функцию, которая определяет, какой узел будет вызван следующим.
should_continue,
)
# Теперь добавляем обычное ребро от `tools` к `agent`.
# Это означает, что после вызова `tools` узел `agent` вызывается следующим.
workflow.add_edge("tools", 'agent')
# Инициализируем память для сохранения состояния между запусками графа
checkpointer = MemorySaver()
# Наконец, мы его компилируем!
# Это компилирует его в LangChain Runnable,
# что означает, что вы можете использовать его, как и любой другой runnable.
# Обратите внимание, что при компиляции графа мы (опционально) передаем память
app = workflow.compile(checkpointer=checkpointer)