LLM 应用上线后最让人头疼的不是「能跑」,而是「跑了之后不知道好不好、也不知道为什么不好」。一次对话里模型调了哪、检索了什么、为什么答偏了,全是一团黑。langfuse 就是来解决这个的开源平台——把追踪、评测、提示词管理收进一个能自托管的工程里。这篇讲它解决什么问题、怎么上手、以及哪些点值得抄。

它解决什么问题

一句话:帮你开发、监控、评测和调试 AI 应用。四件事对应四个能力块。追踪(tracing)负责把 LLM 调用和相关的检索、embedding、Agent 动作串成一条 trace,出错时能翻出完整调用链和用户会话。评测(evaluation)支持 LLM-as-judge、代码评测器、用户反馈采集和人工标注,让你持续知道模型输出到底行不行。数据集(datasets)做测试集和基准,发布前先跑一轮。提示词管理集中管理版本、迭代 prompt,配 Playground 缩短反馈闭环。

这几个块的底层模型是一致的:trace 由一串 span 组成,一个 span 是一次 LLM 调用、一次检索或一个工具调用,span 上可以挂输入输出、token 用量、耗时和评分。把「发生了什么」和「好不好」都挂在同一条调用链上,是它能做评测的基础——不然评分就成了没有锚点的孤立数字。

上手

最省事的路径是 docker compose 起一套,几分钟自托管:

git clone --depth=1 https://github.com/langfuse/langfuse.git
cd langfuse
docker compose up

要自己托管到生产,推荐走 Kubernetes(Helm)或云上的 Terraform 模板,底层存储是 ClickHouse。然后埋点,Python 里用一个 @observe 装饰器就能把任意函数包成可追踪的 span:

from langfuse import observe
from langfuse.openai import openai  # openai 集成,自动记录模型参数

@observe()
def answer(question):
    return openai.chat.completions.create(
        model="gpt-4o",
        messages=[{"role": "user", "content": question}],
    ).choices[0].message.content

@observe()
def main():
    return answer("langfuse 是干什么的?")

main()

关键在 from langfuse.openai import openai 这一句——它是 OpenAI SDK 的 drop-in 替换,不用改调用代码,模型参数、token 用量就自动进 trace 了。其他框架(LangChain、LlamaIndex、LiteLLM 等)也有对应的回调集成。追踪跑起来之后,评测的闭环长这样:先建一个数据集(一批「输入 + 期望输出」),再定义一个评分器,跑一轮就能拿到每个用例的分数:

# 评测闭环:数据集 + LLM-as-judge 评分(示意)
def score_answers(dataset, judge):
    results = []
    for item in dataset:
        got = answer(item["input"])
        verdict = judge(item["input"], got, item["expected"])
        results.append({"input": item["input"], "score": verdict.score})
    return results

可复用的点

最值得抄的不是某个功能,而是它把「追踪」和「评测」串成一个闭环:先靠 trace 看到哪次输出不对,再从那条 trace 跳进 Playground 迭代,把修好的用例沉淀进数据集,下次发布前自动回归。很多团队只做了埋点追踪,缺了评测和数据集这两步,结果就是「看得见问题,但不知道有没有变好」。这套「观测→迭代→回归」的闭环,才是 LLM 工程里真正值钱的地方——它把一个玄学的「调 prompt」变成了可复现的工程动作。

集成面也值得一提:除了 OpenAI 的 drop-in 替换,LangChain、LlamaIndex、LiteLLM、Vercel AI SDK、Dify、Flowise 这些主流技术栈都有现成接入,等于说不用自己写埋点适配。这对「先观测起来、再决定要不要自己搭」的团队很友好——先用现成集成把 trace 收起来,看到价值了再逐步细化自定义 span,成本曲线比一上来就自建观测系统要平滑得多。

局限

几个点要清楚。一是自托管不等于零成本,ClickHouse 和整套服务要自己运维,数据量大起来对资源有要求,嫌麻烦就用托管版(有免费额度)。二是埋点有侵入性,虽然装饰器和 drop-in 集成能省不少,但自定义链路还得手动加 span,代码里会散落追踪逻辑。三是它的价值边界在「观测和评测」,不是模型网关也不是 Agent 框架——你仍然需要别的东西去构建应用本身,langfuse 是那层「看和评」的。如果只是想要个看日志的工具,它偏重;如果想把 LLM 应用当成正经工程来迭代,它这套闭环很对路。