Функция 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.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.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.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.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 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) | Обновить состояние | Вручную изменить состояние диалога |