Проблема: данные не должны уходить наружу

В прошлом уроке ты подключил LangSmith и увидел силу трейсинга. Но у облачного SaaS есть цена, не только денежная:

  • Данные на чужих серверах. Трейс содержит реальные промпты и ответы — а там PII, коммерческая тайна, медицинские данные. Для регулируемых отраслей отправка их вовне часто запрещена.
  • Vendor lock-in. Закрытый продукт — ты зависишь от его цен, лимитов, доступности и решений вендора.
  • Стоимость на масштабе. Пер-seat и пер-трейс тарификация на больших объёмах превращается в заметную статью расходов.
  • Нет контроля. Не поменять хранилище, не дописать функциональность, не провести аудит кода.

Ответ индустрии — open-source observability, которую ты хостишь сам. Данные не покидают твой периметр, код открыт для аудита, тарификация исчезает (платишь только за свою инфраструктуру). Langfuse — самый популярный такой инструмент.

ℹ️ Self-hosted = «на своём железе, под своим контролем»

Self-hosted (self-hosting) означает, что ты разворачиваешь приложение на своей инфраструктуре — своём сервере, своём кластере, своём облачном аккаунте, — а не пользуешься чужим SaaS. Плюсы: приватность данных, контроль, отсутствие внешней тарификации. Минусы: ты отвечаешь за деплой, обновления, бэкапы и аптайм. Langfuse даёт выбор: есть и их управляемое облако, и полностью open-source self-hosted вариант.

Что такое Langfuse

Langfuse — open-source (лицензия MIT для ядра) платформа для наблюдаемости и оценки LLM-приложений. По функциям она перекликается с LangSmith, но с упором на открытость и self-hosting. Основные возможности:

  • Трейсинг — то же дерево вложенных runs (в терминах Langfuse — observations: spans, generations, events), с промптами, токенами, стоимостью, латентностью.
  • Оценка (evaluation) — датасеты, скоры, LLM-as-judge, ручная разметка, сравнение экспериментов.
  • Prompt management — версионирование и хранение промптов вне кода, чтобы менять их без деплоя (сильная сторона Langfuse).
  • Метрики и дашборды — латентность, стоимость, объёмы, качество во времени.
  • SDK-нейтральность — Python/JS SDK, интеграции с LangChain, LlamaIndex, OpenAI SDK и, важно, OpenTelemetry.
✅ Те же концепции, что в LangSmith — знания переносятся

Trace = дерево вложенных вызовов одного запроса; observation (span/generation) ≈ run; dataset + evaluator + experiment — тот же цикл оценки. Освоив LangSmith в прошлом уроке, ты уже понимаешь Langfuse — меняются названия и то, где крутится бэкенд, а не суть. Поэтому здесь фокус на отличиях и деплое, а не на повторении теории трейсов.

LangSmith vs Langfuse

Оба решают одну задачу — observability и оценка LLM. Выбор — это в первую очередь выбор между «удобный управляемый SaaS» и «открытость + контроль данных».

100%
колёсико — масштаб  ·  зажать и тянуть — перемещение
Твой агент SDK / OpenTelemetry LangSmith управляемый SaaS (closed) ✓ ноль обслуживания, всё готово ✓ глубокая интеграция с LangChain ✓ Playground, зрелый UI ✗ данные на серверах вендора ✗ closed-source, тарификация per-seat ✗ self-host только в enterprise-плане Langfuse open-source · self-hosted / cloud ✓ данные в твоём периметре (privacy) ✓ open-source (MIT), аудит кода ✓ SDK-нейтр. + OpenTelemetry + prompt mgmt ✗ ты отвечаешь за деплой/аптайм/бэкапы ✗ часть фич — платные (в облаке/enterprise) (есть и их управляемое облако)
КритерийLangSmithLangfuse
МодельУправляемый SaaS (closed-source)Open-source (MIT), cloud + self-hosted
ДанныеНа серверах вендораВ твоём периметре (при self-host)
Приватность / комплаенсОграниченно (enterprise self-host)Полный контроль, GDPR-friendly
ЭкосистемаЗаточен под LangChain/LangGraphSDK-нейтрален, OpenTelemetry
ОбслуживаниеНулевое — всё делает вендорТвоё (Docker, обновления, бэкапы)
Prompt managementЕстьЕсть, сильная сторона
Когда выбратьБыстрый старт, глубоко в LangChainПриватность, open-source, вне LangChain
⚠️ Это не «кто лучше», а «что важнее для тебя»

Оба — зрелые инструменты. LangSmith выигрывает в скорости старта и интеграции с LangChain; Langfuse — в приватности, открытости и SDK-нейтральности. Если данные нельзя отдавать наружу или ты не в экосистеме LangChain — Langfuse. Если нужен минимум возни и ты уже на LangGraph — LangSmith. Многие начинают с облака (любого) и переезжают на self-hosted Langfuse, когда приватность становится критичной.

Self-hosting через Docker

Главная причина выбрать Langfuse — поднять её у себя. Для локального старта/разработки хватает docker compose: он поднимает веб-приложение и хранилища (Postgres и др.).

Локальный self-host Langfuse (dev)
bash
# клонируем репозиторий и поднимаем стек
git clone https://github.com/langfuse/langfuse.git
cd langfuse
docker compose up -d

# UI на http://localhost:3000
# → регистрируешь пользователя, создаёшь проект,
#   получаешь LANGFUSE_PUBLIC_KEY и LANGFUSE_SECRET_KEY
⚠️ Docker compose — для разработки, не для прода

Одноузловой docker compose хорош, чтобы попробовать и разрабатывать. Для продакшена нужны отдельно поднятые и бэкапируемые хранилища, масштабирование, TLS, реплики — обычно через Kubernetes/Helm или managed-БД. Не держи прод на дефолтном compose: потеряешь данные при первом же сбое диска. Точный набор компонентов сверяй с актуальной документацией Langfuse — он меняется между версиями.

Подключение из кода

После деплоя подключение почти как у LangSmith — переменные окружения (плюс LANGFUSE_HOST с адресом твоего инстанса) и декоратор @observe для произвольного кода.

Трейсинг через Langfuse SDK
python
import os
os.environ["LANGFUSE_PUBLIC_KEY"] = "pk-lf-..."
os.environ["LANGFUSE_SECRET_KEY"] = "sk-lf-..."
os.environ["LANGFUSE_HOST"] = "http://localhost:3000"   # ТВОЙ self-hosted инстанс!

from langfuse import observe

@observe()                       # функция станет observation в трейсе
def research(topic: str) -> str:
    docs = search_web(topic)     # вложенные @observe → дерево трейса
    return summarize(docs)

@observe()
def search_web(topic: str) -> list[str]:
    ...

research("рынок EV 2025")        # трейс появится в твоём Langfuse UI

Ключевое отличие от LangSmith в этом коде — строка LANGFUSE_HOST: данные летят на твой сервер, а не на облако вендора. Всё остальное — тот же принцип: обернул функции, получил дерево трейса. А через OpenTelemetry Langfuse принимает трейсы из любых OTel-инструментированных приложений — это тема следующего урока.

✅ Prompt management — недооценённый бонус

Langfuse умеет хранить и версионировать промпты вне кода: правишь промпт в UI, приложение подтягивает нужную версию без передеплоя, а трейсы связываются с версией промпта. Это закрывает боль «поменяли промпт → надо катить релиз» и естественно стыкуется с оценкой: видно, какая версия промпта дала какое качество.

Типичные ошибки

❌ Ошибка 1: self-host ради галочки

Self-hosting — это ответственность за деплой, обновления, бэкапы и аптайм. Если приватность не критична и команда мала — управляемое облако (LangSmith или Langfuse Cloud) сэкономит недели. Выбирай self-host под реальную потребность.

❌ Ошибка 2: docker compose в проде

Дефолтный compose — для dev. В проде без внешних бэкапируемых хранилищ, реплик и мониторинга ты потеряешь трейсы при первом сбое. Готовь prod-деплой отдельно.

❌ Ошибка 3: думать «open-source = всё бесплатно»

Ядро открыто (MIT), но часть возможностей — платные (в облаке/enterprise), а self-host стоит денег на инфраструктуру и людей. «Бесплатно» ≠ «без затрат». Считай TCO, а не только лицензию.

❌ Ошибка 4: забыть LANGFUSE_HOST

Без явного LANGFUSE_HOST SDK по умолчанию шлёт данные в облако Langfuse — то есть наружу, мимо твоего self-hosted инстанса. Ради приватности всегда указывай адрес своего сервера.

Шпаргалка

Langfuse — всё в одном месте
text
LANGFUSE = open-source (MIT) observability для LLM: трейсинг + оценка + prompt mgmt
  главная фишка: SELF-HOSTED → данные в твоём периметре, код открыт

ЗАЧЕМ (боль LangSmith как SaaS):
  данные на чужих серверах · vendor lock-in · цена на масштабе · нет контроля
  → регулируемые отрасли (банк/мед/гос), GDPR, приватность

КОНЦЕПЦИИ = как в LangSmith (знания переносятся):
  trace = дерево · observation (span/generation) ≈ run · dataset+evaluator+experiment

LANGSMITH vs LANGFUSE:
  LangSmith  — SaaS, ноль обслуживания, глубоко в LangChain, данные у вендора
  Langfuse   — open-source, self-host, приватность, SDK-нейтрален + OpenTelemetry
  выбор = «удобство SaaS» vs «открытость + контроль данных» (не «кто лучше»)

SELF-HOST: docker compose up (DEV!) → UI :3000 → ключи pk-lf / sk-lf
  ПРОД: внешние БД, бэкапы, реплики, TLS (K8s/Helm) — НЕ дефолтный compose

КОД: env PUBLIC_KEY + SECRET_KEY + LANGFUSE_HOST(!) · декоратор @observe()
  LANGFUSE_HOST = твой сервер (иначе данные уйдут в их облако)
  + prompt management: версии промптов вне кода, без передеплоя

ГРАБЛИ: self-host ради галочки · compose в проде · «open-source=бесплатно» · забыть HOST

Практическое задание

Задание: подними self-hosted observability

  1. Подними Langfuse локально через docker compose, зайди в UI на :3000, создай проект и получи ключи.
  2. Подключи через SDK любого агента из модулей 03–05 (не забудь LANGFUSE_HOST!). Открой трейс, разверни дерево observations.
  3. Сравни этот трейс с трейсом того же агента в LangSmith из прошлого урока: что совпадает по сути, что называется иначе?
  4. Для своего кейса выпиши, критична ли приватность данных. По таблице сравнения аргументируй, что бы ты выбрал — LangSmith или Langfuse — и почему.
  5. Попробуй prompt management: заведи промпт в Langfuse, подтяни его версию из кода, поменяй в UI без передеплоя и убедись, что приложение взяло новую версию.
  6. Прикинь prod-деплой: какие компоненты нельзя оставлять на дефолтном compose? Что нужно бэкапить? (Сверься с актуальной документацией.)
  7. Со звёздочкой: собери мини-датасет и запусти оценку (evaluator) в Langfuse — повтори цикл из LangSmith-урока, но на своём инстансе.

Что дальше

И LangSmith, и Langfuse умеют принимать трейсы через OpenTelemetry — открытый стандарт телеметрии, не привязанный ни к какому вендору. Следующий урок — как инструментировать агентов через OpenTelemetry, чтобы не зависеть от конкретной платформы observability.