Проблема: данные не должны уходить наружу
В прошлом уроке ты подключил LangSmith и увидел силу трейсинга. Но у облачного SaaS есть цена, не только денежная:
- Данные на чужих серверах. Трейс содержит реальные промпты и ответы — а там PII, коммерческая тайна, медицинские данные. Для регулируемых отраслей отправка их вовне часто запрещена.
- Vendor lock-in. Закрытый продукт — ты зависишь от его цен, лимитов, доступности и решений вендора.
- Стоимость на масштабе. Пер-seat и пер-трейс тарификация на больших объёмах превращается в заметную статью расходов.
- Нет контроля. Не поменять хранилище, не дописать функциональность, не провести аудит кода.
Ответ индустрии — open-source observability, которую ты хостишь сам. Данные не покидают твой периметр, код открыт для аудита, тарификация исчезает (платишь только за свою инфраструктуру). Langfuse — самый популярный такой инструмент.
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.
Trace = дерево вложенных вызовов одного запроса; observation (span/generation) ≈ run; dataset + evaluator + experiment — тот же цикл оценки. Освоив LangSmith в прошлом уроке, ты уже понимаешь Langfuse — меняются названия и то, где крутится бэкенд, а не суть. Поэтому здесь фокус на отличиях и деплое, а не на повторении теории трейсов.
LangSmith vs Langfuse
Оба решают одну задачу — observability и оценка LLM. Выбор — это в первую очередь выбор между «удобный управляемый SaaS» и «открытость + контроль данных».
| Критерий | LangSmith | Langfuse |
|---|---|---|
| Модель | Управляемый SaaS (closed-source) | Open-source (MIT), cloud + self-hosted |
| Данные | На серверах вендора | В твоём периметре (при self-host) |
| Приватность / комплаенс | Ограниченно (enterprise self-host) | Полный контроль, GDPR-friendly |
| Экосистема | Заточен под LangChain/LangGraph | SDK-нейтрален, 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 и др.).
# клонируем репозиторий и поднимаем стек
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 хорош, чтобы попробовать и разрабатывать. Для продакшена нужны отдельно поднятые и бэкапируемые хранилища, масштабирование, TLS, реплики — обычно через Kubernetes/Helm или managed-БД. Не держи прод на дефолтном compose: потеряешь данные при первом же сбое диска. Точный набор компонентов сверяй с актуальной документацией Langfuse — он меняется между версиями.
Подключение из кода
После деплоя подключение почти как у LangSmith — переменные окружения (плюс LANGFUSE_HOST с адресом твоего инстанса) и декоратор @observe для произвольного кода.
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-инструментированных приложений — это тема следующего урока.
Langfuse умеет хранить и версионировать промпты вне кода: правишь промпт в UI, приложение подтягивает нужную версию без передеплоя, а трейсы связываются с версией промпта. Это закрывает боль «поменяли промпт → надо катить релиз» и естественно стыкуется с оценкой: видно, какая версия промпта дала какое качество.
Типичные ошибки
Self-hosting — это ответственность за деплой, обновления, бэкапы и аптайм. Если приватность не критична и команда мала — управляемое облако (LangSmith или Langfuse Cloud) сэкономит недели. Выбирай self-host под реальную потребность.
Дефолтный compose — для dev. В проде без внешних бэкапируемых хранилищ, реплик и мониторинга ты потеряешь трейсы при первом сбое. Готовь prod-деплой отдельно.
Ядро открыто (MIT), но часть возможностей — платные (в облаке/enterprise), а self-host стоит денег на инфраструктуру и людей. «Бесплатно» ≠ «без затрат». Считай TCO, а не только лицензию.
Без явного LANGFUSE_HOST SDK по умолчанию шлёт данные в облако Langfuse — то есть наружу, мимо твоего self-hosted инстанса. Ради приватности всегда указывай адрес своего сервера.
Шпаргалка
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
- Подними Langfuse локально через
docker compose, зайди в UI на:3000, создай проект и получи ключи. - Подключи через SDK любого агента из модулей 03–05 (не забудь
LANGFUSE_HOST!). Открой трейс, разверни дерево observations. - Сравни этот трейс с трейсом того же агента в LangSmith из прошлого урока: что совпадает по сути, что называется иначе?
- Для своего кейса выпиши, критична ли приватность данных. По таблице сравнения аргументируй, что бы ты выбрал — LangSmith или Langfuse — и почему.
- Попробуй prompt management: заведи промпт в Langfuse, подтяни его версию из кода, поменяй в UI без передеплоя и убедись, что приложение взяло новую версию.
- Прикинь prod-деплой: какие компоненты нельзя оставлять на дефолтном compose? Что нужно бэкапить? (Сверься с актуальной документацией.)
- Со звёздочкой: собери мини-датасет и запусти оценку (evaluator) в Langfuse — повтори цикл из LangSmith-урока, но на своём инстансе.
Что дальше
И LangSmith, и Langfuse умеют принимать трейсы через OpenTelemetry — открытый стандарт телеметрии, не привязанный ни к какому вендору. Следующий урок — как инструментировать агентов через OpenTelemetry, чтобы не зависеть от конкретной платформы observability.