Первый агент 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 в инструмент, который Агент может вызвать:

Пример

# Путь к файлу: 04_first_agent.py
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: Создание агента

Пример

# Шаг 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: Запуск Агента

Пример

# Шаг 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%。非常适合出门活动!

Анализ потока выполнения агента

Полный процесс выполнения вышеприведённого примера выглядит следующим образом:

  1. Пользователь отправляет сообщение: "Какая сегодня погода в Ханчжоу?"
  2. После получения сообщения модель решает: нужно запросить погоду → она возвращает tool_call (вызов get_weather с параметром city="Hangzhou").
  3. Агент выполняет инструмент get_weather → возвращает "Солнечно, 25°C, влажность 60%"
  4. Модель получает результат инструмента → определяет, что задача выполнена → генерирует окончательный ответ

Это цикл Агента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")) во время своего первого вызова модели, и они были выполнены параллельно. Модель автоматически определяет, какие вызовы инструментов можно распараллелить.


Полный код

Пример

# Путь к файлу: 04_first_agent.py (полная версия)
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()Запустите агента и получите результаты
Другие расширения