Первый агент LangChain
Агент — это основная концепция LangChain. Она позволяет ИИ автоматически решать, когда вызывать инструменты, и после получения результатов работы инструментов продолжать размышлять, пока задача не будет выполнена.
Что такое агент
Обычный вызов модели — это обмен в формате «один вопрос — один ответ»:
You send a message, the model responds, and that's it.
Агент работает иначе. Он входит в циклДумай-Действуй-Наблюдай:
The model determines that a tool needs to be called → executes the tool and gets the result → the model continues reasoning based on the result → may call a tool again → until it reaches a final answer.
Например, если вы спросите "Какая сегодня погода в Ханчжоу?", обычная модель может ответить только на основе данных о погоде из своей обучающей выборки (которые могут быть устаревшими на несколько месяцев). Агент же самостоятельно вызовет инструмент запроса погоды, чтобы получить данные в реальном времени, а затем ответит вам на основе этих реальных данных.
Создайте своего первого агента
Весь процесс требует всего трёх шагов: (1) определить инструменты; (2) создать Агента; (3) запустить его.
Шаг 1: Определите функции инструментов
Используйте декоратор@tool, чтобы превратить обычную функцию Python в инструмент, который Агент может вызвать:
Пример
from dotenv import load_dotenv
load_dotenv()
from langchain.tools import tool
# Шаг 1: Определите инструмент с помощью декоратора @tool
# Строка документации функции — это описание инструмента
# Модель использует описание, чтобы решить, когда вызывать этот инструмент
@tool
def get_weather(city: str) -> str:
"""Запросить погоду для указанного города.
Аргументы:
city: Название города, например "Hangzhou", "Beijing"
"""
# Здесь используются фиктивные данные для демонстрации
# В реальном проекте вы можете заменить это на реальный вызов API погоды
weather_data = {
"Hangzhou": "Солнечно, 25°C, влажность 60%",
"Пекин": "Облачно, 18°C, влажность 45%",
"Шанхай": "Небольшой дождь, 22°C, влажность 80%",
}
return weather_data.get(city, f"Данные о погоде для {city} не найдены")
@tool
def calculate(expression: str) -> str:
"""Выполняет математические вычисления. Поддерживает базовые операции, такие как сложение, вычитание, умножение и деление.
Аргументы:
expression: математическое выражение, например, "3 * 7 + 2"
"""
try:
# Безопасно вычислить математическое выражение
result = eval(expression, {"__builtins__": {}}, {})
return f"Результат вычисления: {expression} = {result}"
except Exception as e:
return f"Ошибка вычисления: {e}"
Строка документации (часть функции """...""") очень важна. Модель читает описание инструмента, чтобы решить, вызывать ли инструмент и какие параметры передавать. Чем понятнее описание, тем меньше вероятность, что модель неправильно его использует.
Шаг 2: Создание агента
Пример
from langchain.agents import create_agent
from langchain.chat_models import init_chat_model
# Инициализация модели
model = init_chat_model("openai:gpt-4o-mini")
# Создайте агента, передав модель и список инструментов
agent = create_agent(
model=model,
tools=[get_weather, calculate],
system_prompt="Вы полезный помощник, который использует инструменты для ответа на вопросы.",
)
| Параметр | Описание | Обязательно? |
|---|---|---|
| model | Используемая языковая модель | Да |
| tools | Список инструментов; Агент может вызывать эти инструменты | Нет (если не передан, Агент не может вызывать инструменты) |
| system_prompt | Системный промпт, который определяет роль и поведение Агента | нет |
Шаг 3: Запуск Агента
Пример
# Построение входного сообщения
# Первый элемент в списке сообщений обычно является HumanMessage (сообщение пользователя)
from langchain.messages import HumanMessage
inputs = {"messages": [HumanMessage(content="Какая сегодня погода в Ханчжоу?")]}
# invoke() запускает Агента и возвращает конечное состояние
result = agent.invoke(inputs)
# Просмотр истории сообщений (включает вызовы инструментов ИИ и результаты возврата инструментов)
print("=== Полная история сообщений ===")
for msg in result["messages"]:
print(f"[{msg.type}] {msg.content[:100]}") # Взять первые 100 символов
print("\n=== Final reply ===")
# Последнее сообщение AI — это окончательный ответ
print(result["messages"][-1].content)
Вывод:
=== 完整消息历史 === [human] 杭州今天天气怎么样? [ai] [tool] 晴,25°C,湿度 60% [ai] 今天杭州的天气是晴天,气温25°C,湿度60%。非常适合出门活动! === 最终回复 === 今天杭州的天气是晴天,气温25°C,湿度60%。非常适合出门活动!
Анализ потока выполнения агента
Полный процесс выполнения вышеприведённого примера выглядит следующим образом:
- Пользователь отправляет сообщение: "Какая сегодня погода в Ханчжоу?"
- После получения сообщения модель решает: нужно запросить погоду → она возвращает tool_call (вызов get_weather с параметром city="Hangzhou").
- Агент выполняет инструмент get_weather → возвращает "Солнечно, 25°C, влажность 60%"
- Модель получает результат инструмента → определяет, что задача выполнена → генерирует окончательный ответ
Это цикл АгентаThink-Act-Observe.

Как заставить агента вызывать несколько инструментов
Настоящая сила агента заключается в его способности автоматически комбинировать несколько инструментов:
Пример
inputs = {"messages": [HumanMessage(
content="Какова разница температур между Ханчжоу и Пекином сегодня?"
)]}
result = agent.invoke(inputs)
print("=== Полная история сообщений ===")
for msg in result["messages"]:
if msg.type == "tool":
print(f"[tool {msg.name}] {msg.content}")
else:
print(f"[{msg.type}] {msg.content[:120]}")
print("\n=== Final reply ===")
print(result["messages"][-1].content)
Вывод:
=== 完整消息历史 === [human] 杭州和北京今天温差多少度? [ai] [tool get_weather] 晴,25°C,湿度 60% [tool get_weather] 多云,18°C,湿度 45% [tool calculate] 计算结果: 25 - 18 = 7 [ai] 今天杭州和北京的温差是7°C. === 最终回复 === 今天杭州和北京的温差是7°C.
Агент автоматически выполнил три шага: (1) запросил погоду в Ханчжоу; (2) запросил погоду в Пекине; (3) вычислил разницу температур. Вам не нужно писать какую-либо логику для управления этими шагами; Агент автоматически выполняет планирование и исполнение.
Обратите внимание, что Агент выполнил два вызова инструментов (get_weather("Hangzhou") и get_weather("Beijing")) во время своего первого вызова модели, и они были выполнены параллельно. Модель автоматически определяет, какие вызовы инструментов можно распараллелить.
Полный код
Пример
from dotenv import load_dotenv
load_dotenv()
from langchain.tools import tool
from langchain.agents import create_agent
from langchain.chat_models import init_chat_model
from langchain.messages import HumanMessage
# Определить инструменты
@tool
def get_weather(city: str) -> str:
"""Запросить погоду для указанного города.
Аргументы:
city: Название города, например "Hangzhou", "Beijing"
"""
weather_data = {
"Hangzhou": "Солнечно, 25°C, влажность 60%",
"Пекин": "Облачно, 18°C, влажность 45%",
"Шанхай": "Небольшой дождь, 22°C, влажность 80%",
}
return weather_data.get(city, f"Данные о погоде для {city} не найдены")
@tool
def calculate(expression: str) -> str:
"""Выполняет математические вычисления. Поддерживает базовые операции, такие как сложение, вычитание, умножение и деление.
Аргументы:
expression: математическое выражение, например, "3 * 7 + 2"
"""
try:
result = eval(expression, {"__builtins__": {}}, {})
return f"Результат вычисления: {expression} = {result}"
except Exception as e:
return f"Ошибка вычисления: {e}"
# Создание агента
model = init_chat_model("openai:gpt-4o-mini")
agent = create_agent(
model=model,
tools=[get_weather, calculate],
system_prompt="Вы полезный помощник, который использует инструменты для ответа на вопросы.",
)
# Запуск агента
def ask(question: str):
"""Отправить вопрос агенту и вывести результат"""
inputs = {"messages": [HumanMessage(content=question)]}
result = agent.invoke(inputs)
print(f"Вопрос: {question}")
print(f"Ответ: {result['messages'][-1].content}")
print("-" * 50)
return result
# Проверьте несколько вопросов
ask("Какая сегодня погода в Ханчжоу?")
ask("Какая сегодня разница температур между Ханчжоу и Пекином?")
ask("Example (Beginner Tutorial) — отличная обучающая платформа. Если 3 моих друга порекомендовали её, плюс ещё 2, сколько всего человек её порекомендовали?")
Вывод:
Question: 杭州今天天气怎么样? Answer: 今天杭州的天气是晴天,气温25°C,湿度60%。非常适合出门活动! -------------------------------------------------- Question: 杭州和北京今天温差多少度? Answer: 今天杭州和北京的温差是7°C. -------------------------------------------------- Question: Example 是一个非常棒的学习平台,如果我有 3 个朋友都推荐了,再加上 2 个,一共多少人推荐? Answer: 一共 5 人推荐了Example! --------------------------------------------------
Обратите внимание на третий вопрос: Агент может понять, что "количество людей, которые порекомендовали" — это задача на вычисление, и автоматически вызывает инструмент calculate. Это показывает, что решения о вызове инструментов основаны на семантическом понимании модели, а не на жёстко заданных правилах.
Синхронное и асинхронное выполнение
Агенты поддерживают асинхронный режим, подходящий для использования в асинхронных средах, таких как веб-сервисы:
Пример
import asyncio
from langchain.messages import HumanMessage
async def main():
# ainvoke() — это асинхронная версия invoke()
inputs = {"messages": [HumanMessage(content="Какая погода в Ханчжоу?")]}
result = await agent.ainvoke(inputs)
print(result["messages"][-1].content)
# Запустите асинхронную функцию
asyncio.run(main())
Итог
К этому моменту вы освоили самое основное использование LangChain:
- используйте@toolДекораторы превращают функции Python в инструменты
- используйтеcreate_agent()Создайте агента, который может автоматически вызывать инструменты
- используйтеagent.invoke()Запустите агента и получите результаты