Функция create_agent() в LangChain

create_agent() — это основная функция LangChain. Она создаёт полный граф агента (StateGraph), включая всю логику, такую как вызов модели, выполнение инструментов и управление циклом.

Синтаксис

Синтаксис функции create_agent() выглядит следующим образом:

from langchain.agents import create_agent

agent = create_agent(
    model,                     # str | BaseChatModel:语言模型
    tools=None,                # Sequence:工具列表
    *,
    system_prompt=None,        # str | SystemMessage:系统提示
    middleware=(),             # Sequence[AgentMiddleware]:中间件列表
    response_format=None,      # ResponseFormat | type:结构化输出配置
    state_schema=None,         # type[AgentState]:自定义状态结构
    context_schema=None,       # type:运行时上下文结构
    checkpointer=None,         # Checkpointer:对话持久化
    store=None,                # BaseStore:跨会话存储
    interrupt_before=None,     # list[str]:在哪些节点前暂停
    interrupt_after=None,      # list[str]:在哪些节点后暂停
    debug=False,               # bool:是否输出详细日志
    name=None,                 # str:Agent 名称
    cache=None,                # BaseCache:缓存配置
)

Параметр model — Конфигурация модели

Параметр model принимает две формы: строку (обрабатывается init_chat_model()) или уже созданный экземпляр BaseChatModel.

Пример

from langchain.agents import create_agent
from langchain.chat_models import init_chat_model

# Способ 1: Передать строку (наиболее распространённый)
# create_agent внутренне вызывает init_chat_model() для обработки
agent = create_agent(
    model="deepseek:deepseek-v4-flash",
    system_prompt="Вы — ассистент EXAMPLE",
)

# Способ 2: Передать уже созданный экземпляр модели
# Подходит для сценариев, где нужен тонкий контроль над параметрами модели
model = init_chat_model("deepseek:deepseek-v4-flash", temperature=0.3, max_tokens=500)
agent = create_agent(
    model=model,
    system_prompt="Вы — ассистент EXAMPLE",
)

# Способ 3: Передать экземпляр модели с уже привязанными инструментами
# Менее распространено; обычно create_agent сам обрабатывает привязку инструментов
model_with_tools = init_chat_model("deepseek:deepseek-v4-flash").bind_tools([...])

Способ 1 (передача строки) рекомендуется. create_agent() автоматически обрабатывает инициализацию модели, привязку инструментов, структурированный вывод и другую логику внутри. Способ 2 подходит для сценариев, где нужно использовать один и тот же экземпляр модели вне Agent.

Параметр tools — список инструментов

Параметр tools принимает инструменты в трёх форматах:

Пример

from langchain.tools import tool
from langchain.agents import create_agent

# Формат 1: Функция, декорированная с помощью @tool (наиболее распространённый)
@tool
def search_course(keyword: str) -> str:
    """Поиск курсов EXAMPLE"""
    return f"Результаты поиска: курсы по запросу {keyword}"


# Формат 2: класс Pydantic BaseModel
from pydantic import BaseModel, Field

class WeatherQuery(BaseModel):
    """Запрос погоды"""
    city: str = Field(description="Название города")


# Формат 3: словарь (описание удалённых или встроенных инструментов)
mcp_tool = {
    "type": "mcp",
    "server_label": "weather_server",
    "server_url": "https://weather.example.com/sse",
    "allowed_tools": ["get_forecast"],
}

# Смешанное использование
agent = create_agent(
    model="deepseek:deepseek-v4-flash",
    tools=[search_course, WeatherQuery, mcp_tool],
)

Передача None или пустого списка означает, что у Агента нет доступных инструментов; в этом случае это просто чистая диалоговая модель:

Пример

from langchain.agents import create_agent
from langchain.messages import HumanMessage

# Агент без инструментов — эквивалентно прямому вызову модели
agent = create_agent(
    model="deepseek:deepseek-v4-flash",
    tools=None,
    system_prompt="Вы — ассистент EXAMPLE",
)

result = agent.invoke({
    "messages": [HumanMessage(content="Подходит ли Python для полных новичков?")]
})
print(result["messages"][-1].content)

Параметр system_prompt — системный промпт

Определяет поведенческую роль Агента и правила ограничений. Поддерживает строки и объекты SystemMessage.

Пример

from langchain.agents import create_agent
from langchain.messages import SystemMessage

# Способ 1: строка (просто и напрямую)
agent = create_agent(
    model="deepseek:deepseek-v4-flash",
    system_prompt="Вы консультант по обучению EXAMPLE. Отвечайте кратко, не более 100 символов.",
)

# Способ 2: объект SystemMessage (можно повторно использовать в нескольких Агентах)
system_msg = SystemMessage(
    content="Вы консультант по обучению EXAMPLE. Отвечайте кратко, не более 100 символов."
)
agent = create_agent(
    model="deepseek:deepseek-v4-flash",
    system_prompt=system_msg,
)

system_prompt является необязательным, но если он не указан, модель будет отвечать в роли "универсального помощника". Для приложений с четкими бизнес-сценариями рекомендуется всегда задавать system_prompt, чтобы ограничить границы поведения модели.

Параметр state_schema - Пользовательское состояние

По умолчанию AgentState включает только messages, jump_to и structured_response. Если вам нужны дополнительные поля состояния, вы можете расширить его:

Пример

from typing import Annotated
from langchain.agents import create_agent, AgentState
from langchain.messages import HumanMessage
from langchain.tools import tool, InjectedState
from typing_extensions import TypedDict


# Расширьте AgentState и добавьте пользовательские поля
class LearningAgentState(AgentState):
    """Пользовательское состояние, добавляющее поля, связанные с прогрессом обучения"""
    user_level: str                       # Уровень пользователя
    completed_topics: list[str]           # Список завершенных тем


@tool
def track_progress(
    topic: str,
    state: Annotated[dict, InjectedState],
) -> str:
    """Запись прогресса обучения пользователя.

    Аргументы:
topic: Название только что завершенной темы
    """

    completed = state.get("completed_topics", [])
    completed.append(topic)
    return (
        f"Прогресс обучения записан. На данный момент завершено {len(completed)} тем:"
        f"{', '.join(completed)}"
    )


agent = create_agent(
    model="deepseek:deepseek-v4-flash",
    tools=[track_progress],
    state_schema=LearningAgentState,  # Использование пользовательского состояния
    system_prompt="Вы — учебный ассистент EXAMPLE.",
)

# Начальное значение пользовательского состояния должно быть предоставлено во время выполнения
result = agent.invoke({
    "messages": [HumanMessage(content="Изучение основ Python завершено. Пожалуйста, запишите это для меня.")],
    "user_level": "Начинающий",
    "completed_topics": ["Основы HTML"],
})

print(f"Уровень пользователя: {result.get('user_level')}")
print(f"Пройденные темы: {result.get('completed_topics')}")
print(f"Ответ: {result['messages'][-1].content[:100]}")

Вывод:

User level: 入门
Completed topics: ['HTML 基础', 'Python 基础']
Reply: Learning progress recorded. Completed 2 topics: HTML Basics, Python Basics

Возвращаемое значение — CompiledStateGraph

create_agent() возвращает объектCompiledStateGraph, который является скомпилированным графом LangGraph и предоставляет несколько способов запуска:

МетодОписаниеСценарий использования
invoke(input, config)Синхронный запуск, ожидание полного результатаСкрипты, простые интерфейсы
ainvoke(input, config)Асинхронный запуск, ожидание полного результатаВеб-сервисы
stream(input, config, stream_mode)Синхронный потоковый запускОтображать промежуточные шаги в реальном времени
astream(input, config, stream_mode)Асинхронный потоковый запускWebSocket, SSE
get_state(config)Получить текущее состояниеПросмотреть/восстановить состояние диалога
update_state(config, values)Обновить состояниеВручную изменить состояние диалога
Другие расширения