Урок курса

Langsmith

LangChain 1.0.x: c нуля до продакшн LLM-приложений

 🔹 Что такое LangSmith?

LangSmith — полноценная DevOps‑платформа от LangChain для мониторинга и наблюдаемости LLM‑приложений. Она автоматически отслеживает все шаги выполнения ваших LangChain и LangGraph приложений.

Основные возможности LangSmith:

  • Трассировка каждого шага выполнения агента
  • Мониторинг производительности и затрат
  • Отладка и анализ ошибок
  • Оценка качества ответов
  • Визуализация сложных агентных workflow

 

 🔸 Регистрация и настройка LangSmith

Шаг 1: Регистрация

Зарегистрируйтесь на smith.langchain.com (обязательной привязки карты нет). Вы можете войти через Google или GitHub.

Шаг 2: Получение API‑ключа

Перейдите в раздел Tracing Projects → + New Project.

Шаг 3: Создание проекта

Откроется меню создания проекта. В нём нажмите Generate API Key.

В поле Configure environment вы увидите свой API‑ключ и название проекта (название можно изменить позже). Если вы используете dotenv, то эти строки нужно прописать в файле .env, как и ключ вашего LLM‑провайдера, либо использовать иной способ хранения ключей.

Шаг 4: Первое использование

После загрузки окружения Langsmith автоматически начнёт работать.

import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain.agents import create_agent

load_dotenv()
MODEL = os.getenv("OPENAI_MODEL", "gpt-5")
model = ChatOpenAI(model_name=MODEL)


def get_weather(city: str) -> str:
    """Показывает погоду в выбранном городе"""
    return f"В {city} всегда солнечно!"


agent = create_agent(
    model=model,
    tools=[get_weather],
    system_prompt="Ты полезный ассистент",
)


if os.getenv("LANGSMITH_TRACING") == "true":
    print(f"✅ LangSmith трассировка включена")
    print(f"📊 Проект: {os.getenv('LANGSMITH_PROJECT')}")
else:
    print("⚠️ LangSmith трассировка отключена")

response = agent.invoke(
    {"messages": [{"role": "user", "content": "Какая погода в Лос-Анджелесе?"}]}
)
print(response['messages'][-1].content)

На странице вы увидите, что ваш проект активировался и начнёте видеть трасировку сообщений.

 

 🔸 Проекты и API‑ключи

В дальнейшем новые проекты будут создаваться автоматически, если вы будете менять переменную окружения LANGSMITH_PROJECT. Можно просто задать название в начале проекта.

import os
os.environ["LANGSMITH_PROJECT"] = "new_project_name"

Ключи можно управлять в разделе Settings → API Keys на сайте. По сути, можно создать ключ и начать его использовать, но при создании первого проекта удобнее сделать это через + New Project, скопировав все переменные за раз.

 

 🔸 Отключение

Если захотите отключить LangSmith, замените в файле .env строку LANGSMITH_TRACING=true на false.

Или временно в коде:

import os
os.environ["LANGSMITH_TRACING"] = "false"  # Отключить
os.environ["LANGSMITH_TRACING"] = "true"   # Включить

💡 LangSmith предлагает бесплатный план Developer с 5000 трейсов в месяц. Этого достаточно для разработки и тестирования. Подробнее о платных тарифах и актуальные цены вы можете найти в личном кабинете Settings → Billing and usage.

 🔹 Просмотр и анализ трейсов

После того как вы запустили приложение с включенной трассировкой, самое время посмотреть, что именно LangSmith записал.

 

 🔸 Что можно отслеживать в трейсах

  1. Откройте https://smith.langchain.com
  2. Перейдите к вашему проекту (например, "my-local-model-project")
  3. Увидите список всех запусков (runs)

LangSmith логирует практически все аспекты работы LLM: метрики вроде задержки (latency), количество токенов, стоимость выполнения и все виды метаданных.

Основная информация в трейсе:

Общая информация

  • Время выполнения (latency) – сколько времени заняло выполнение
  • Количество токенов – входных и выходных
  • Стоимость – если используете платный API
  • Статус – успех или ошибка
  • Метаданные – теги, user_id, session_id и т.д.

Детали выполнения

  • Входные данные (inputs) – что вы отправили
  • Выходные данные (outputs) – что получили
  • Промежуточные шаги – все узлы графа
  • Иерархия вызовов – дерево выполнения

 

🔸 Пример детального трейса

Запустим тестовый запрос через граф, разбив его на два подзапроса через узлы: анализ и суммаризация.

import os
from typing import TypedDict
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langgraph.graph import StateGraph, START, END
from langchain_core.runnables import RunnableConfig

load_dotenv()
MODEL = os.getenv("OPENAI_MODEL", "gpt-5")
model = ChatOpenAI(model_name=MODEL)

class State(TypedDict):
    query: str
    analysis: str
    summary: str

def analyze_node(state: State) -> State:
    """Анализ запроса"""
    response = model.invoke(f"Проанализируй: {state['query']}")
    return {"query": state["query"], "analysis": response.content, "summary": ""}

def summarize_node(state: State) -> State:
    """Суммаризация"""
    response = model.invoke(f"Кратко суммаризуй: {state['analysis']}")
    return {
        "query": state["query"],
        "analysis": state["analysis"],
        "summary": response.content
    }

# Создаём граф
workflow = StateGraph(State)
workflow.add_node("analyze", analyze_node)
workflow.add_node("summarize", summarize_node)
workflow.add_edge(START, "analyze")
workflow.add_edge("analyze", "summarize")
workflow.add_edge("summarize", END)

app = workflow.compile()

# Запуск с метаданными для удобного поиска
result = app.invoke(
    {"query": "Что такое квантовые вычисления?"},
    config=RunnableConfig(
        tags=["quantum", "research"],
        metadata={
            "user_id": "user_42",
            "session": "morning_research",
            "priority": "high"
        }
    )
)

print(result["summary"])

В LangSmith UI вы увидите:

  1. Окно проекта – в нём отображается список запросов.
  2. Trace – детальное отображение запроса с деревом этапов:
    • Анализ
    • Суммаризация
  3. Содержание сообщений в запросе.

Соотношение и последовательность этапов удобно отслеживать в режиме Waterfall.

 

Фильтрация и поиск

Веб‑интерфейс позволяет быстро фильтровать запуски по проценту ошибок, задержке, дате или даже по текстовому содержимому, используя естественный язык.

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

config = RunnableConfig(
    tags=["production", "user-facing", "v2"],
    metadata={
        "feature": "search",
        "experiment": "new_prompt_v2"
    }
)

Затем в UI:

  • Фильтр по тегу: production
  • Фильтр по ошибкам: только неудачные запуски
  • Фильтр по времени: запуски > 2 секунды
  • Поиск по контенту: найти все запуски, где упоминается «квантовая физика».

Отладка ошибок

Когда что-то пошло не так, LangSmith показывает, в чём ошибка. Допустим, проблема соединения, закончился баланс на счёте или другие ошибки:

 🔹 Prompt Engineering в LangSmith

LangSmith — это не только логирование. Платформа предлагает так же инструменты для разработки и тестирования, такие как хранение промптов. В модуле 2 мы разбирали как хранить промпты в отдельном файле YAML, так вот langsmith предоставляет альтернативу и может быть хабом для промптов и площадкой их тестирования.

 

 🔸 Playground

Интерактивная среда Playground позволяет редактировать входные данные, менять модель и температуру, а также настраивать другие параметры.

Что можно делать в Playground:

  1. Открыть любой трейс в Playground
    • Кликните на трейс → кнопка Open in Playground
    • Промпт и настройки автоматически загрузятся.
  2. Экспериментировать с промптами
    • Исходный промпт: Проанализируй: {query}
    • Можно попробовать:
      • Детально проанализируй с примерами: {query}
      • Как эксперт, объясни простым языком: {query}
      • Критически оцени и найди слабые места в: {query}
  3. Сравнивать модели. Теперь можно сравнивать несколько промптов и конфигураций моделей бок о бок в Playground LangSmith
    • Модель A: gpt-5
    • Модель B: gpt-4o
    • Модель C: claude-sonnet-4.5

💡 Для тестирования моделей нужно указать API‑ключ от них. Если у вас нет подписки Anthropic, а есть только OpenAI, то сравнивать можно лишь модели от OpenAI.

 

 🔸 Prompts

В LangSmith также возможно хранить шаблоны промптов. В песочнице вы можете сохранять и использовать их в своём проекте.

from langsmith import Client

client = Client()
prompt = client.pull_prompt("ch") # указываем имя промпта при сохранении

chain = prompt | model

result = chain.invoke({"question": "Привет"})
print(result.content)  # 你好!有什么可以帮助你的吗?

💡 Аргумент include_model=True у метода pull_prompt() позволяет подключить в шаблоне модель, указанную вами в Playground.

Задача 1

Какой URL использовать для доступа к UI LangSmith?

Выберите один вариант
Без регистрации · результат не сохраняется

Задача 2

Сопоставьте переменную окружения и её предназначение

Сопоставьте элементы

Без регистрации · результат не сохраняется

Задача 3

Какой из следующих шагов НЕ входит в процесс регистрации и настройки LangSmith?

Выберите один вариант
Без регистрации · результат не сохраняется

Задача 4

Что произойдет, если в переменной LANGSMITH_TRACING true заменить на false?

Выберите один вариант
Без регистрации · результат не сохраняется

Задача 5

 🔹 Задание: Подключение LangSmith

В этом задании вам нужно подключить и использовать LangSmith

 

 🔸Техническое задание

  1. Зарегистрируйтесь на smith.langchain.com и создайте новый проект.
  2. Возьмите граф из прошлого урока и добавьте в начало файла загрузку окружения
  3. Выполните несколько запросов через ваш граф с разными входными данными.
  4. Откройте детальные трейсы разных запусков и проанализируйте:
    • Общее время выполнения
    • Количество токенов
    • Иерархию узлов графа
    • Содержание входных и выходных данных
  5. Сделайте скриншот полученных трейсов в LangSmith
  6. Оформите краткий отчёт с аналитикой полученных метрик в .ipynb ноутбуке со скриншотами и своими комментариями

 

🔸 Кросс-рецензирование

Это задание предполагает кросс-рецензирование: другие студенты будут проверять вашу работу, а вам предстоит анализировать примеры одногруппников. После подготовки ноутбука добавьте его в репозиторий проекта (на GitHub) и пришлите ссылку на этот файл.

Открыть задание в уроке →

Продолжить с сохранением прогресса

Перейдите к уроку в учебном кабинете.

Перейти к интерактивному уроку