如果你最近正把大模型接进业务系统,大概率会遇到一个很尴尬的场景:线上用户说聊天助手“回答得不对”,可你打开日志,只能看到用户问了什么、模型返回了什么。Prompt 是怎么拼的、用了哪个模型、消耗了多少 Token、为什么最终选了这句话,统统没有。遇到这种问题,靠普通日志一点一点拼线索,往往要花掉半天时间。

Langfuse 就是用来解决这一类问题的工具。它是一个开源的 LLM 可观测性平台,可以理解成“大模型应用的日志中心 + 链路追踪 + 评估系统”。只要在代码里埋点,它就能把一次完整的大模型调用过程记录下来:从问题进入、Prompt 组装、模型调用、结果返回,到 Token 消耗、延迟、用户反馈,全部关联成一条可回放的 Trace。

这篇文章不打算只讲概念。我会从部署 Langfuse 开始,到创建项目、获取 API Key,再到把 Python 和 Spring Boot 项目接进来,最后告诉你如何看 Trace、如何排查常见问题。整个过程按最小可运行的方式展开,文章后面还附了可以直接复制的代码和排查表格。如果你已经有大模型项目,或者正在做 Agent、RAG 这类应用,这篇文章值得收藏备用。

1. 这篇文章真正要解决的问题

1.1 LLM 应用调试为什么这么难

传统后端开发出现 Bug,可以通过异常堆栈、接口日志、数据库记录来定位问题。但 LLM 应用不同,大模型的输出具有随机性,同一个问题在不同的时间、不同的 Prompt 模板、不同的温度参数下,结果可能完全不同。你很难用“重跑一次”来复现线上问题。

举个真实场景:一个客服机器人在某个用户提问后返回了错误答案。你从数据库里拿到了用户说“请帮我查订单”,系统返回“很抱歉,我无法理解你的意思”。但你不知道:

  • 系统实际发给模型的完整 Prompt 是什么;
  • 中间有没有经过知识库检索,检索结果是什么;
  • 模型调用时 temperature 是 0.2 还是 0.9;
  • 这次调用花了多少 Token,耗时多久;
  • 用户对结果是否满意,有没有点“不喜欢”。

这些问题在普通日志体系里是割裂的。负责检索的模块写一份日志,负责模型调用的模块写一份日志,负责前端交互的模块再写一份日志。出了问题,只能人工去三个系统里对齐时间戳,效率极低。

1.2 引入 Langfuse 之后流程发生了什么变化

Langfuse 把一次 LLM 应用请求建模成一条完整的 Trace。它不仅仅是日志,而是把所有与这次请求相关的操作组织成一棵树。你可以看到整条链路里有哪些环节、每个环节的输入输出是什么、耗时多少、消耗了多少 Token、哪个环节失败或超时。

更重要的是,Langfuse 可以记录人工反馈和模型评估结果。你可以给某一次回答打上“满意”“不满意”,也可以让另一个 LLM 对回答质量自动打分。这样,线上问题不再只是一个“日志”问题,而是变成了一个“可搜索、可过滤、可评估”的数据问题。

1.3 什么样的团队和读者最需要它

如果你属于下面几类人,Langfuse 非常值得纳入工具链:

  • 正在做大模型应用开发,但还没有统一追踪方案的工程师;
  • 在开发 Agent、RAG、多轮对话系统,涉及多次模型调用和工具调用的团队;
  • 需要评估 Prompt 版本效果,却只能靠人工拿 Excel 记录测试结果的算法工程师;
  • 准备把 LLM 功能上线生产环境,但又担心出了问题无法排查的负责人。

如果你是第一次接触 Langfuse,也不用紧张。它的核心概念不复杂,安装部署可以通过 Docker Compose 完成,代码接入只需要少量埋点。

2. Langfuse 的核心概念与工作原理

2.1 从普通日志到 Trace

“Trace”这个词在分布式系统里并不新鲜,翻译成“链路追踪”,指的是从用户请求进入系统到响应返回全过程的所有调用记录。Langfuse 借用了这个概念,但它追踪的不是普通方法调用,而是大模型应用中特有的操作,比如模型调用、检索调用、工具调用、人工反馈等。

可以这样理解:一次用户提问,在 Langfuse 里对应一条 Trace;Trace 下面挂多个 Span,每个 Span 是一次局部操作;模型调用是一种特殊的 Span,Langfuse 把它叫 Generation,专门记录模型名称、参数、输入输出、Token 消耗等信息。

2.2 Trace、Span、Generation 的关系

Langfuse 的数据模型是树状结构。最顶层是 Trace,表示一次完整的请求链路。Trace 下面可以挂若干 Observation,而常见的 Observation 类型包括 Span 和 Generation。

概念 含义 类比
Trace 一次完整请求的全链路记录 一次用户请求
Span 链路中的一个操作片段 处理环节
Generation 一次大模型调用,是特殊的 Span LLM 请求
Event 某个瞬间发生的事情 日志埋点事件
Session 多个 Trace 的聚合 一次用户会话

实际项目中,一个 Trace 可以包含一次知识库检索 Span,也可以包含一次工具调用 Span,再包含一次模型调用 Generation。这些对象通过父级关系挂在一起,最终在 UI 上形成一条可展开的调用链。

2.3 Langfuse 做了什么

Langfuse 提供三部分能力。第一部分是数据的采集与上报,通过各语言 SDK 把 Trace 数据发送到服务端;第二部分是数据的存储与展示,服务端把数据写入数据库,并在 Web UI 中提供查询、筛选和详情页;第三部分是数据的分析与评估,你可以对 Trace 打标签、评分,也可以使用内置的评测功能对 Prompt 和模型输出做离线或在线评估。

从架构上看,Langfuse 采用客户端 SDK 和自托管服务端分离的模式。SDK 负责埋点,服务端负责接收、存储和展示。这也意味着即使生产环境的模型调用链路很复杂,只要在代码中接入 SDK,就能在不改业务逻辑的前提下增加可观测性。

2.4 和其他方案的对比

市面上的可观测性平台很多,但通用 APM 工具并不理解 LLM 调用结构。即使你把模型调用作为普通 HTTP 请求记录下来,也无法直观地看到一次对话中 Prompt、Token、参数、反馈之间的关联。Langfuse 的价值在于它天生为大模型应用设计,读取数据后能自动聚合 Token 消耗、模型调用次数、平均延迟等指标。

当然,Langfuse 不是要替代你的基础日志系统和业务数据库。它更适合作为 LLM 应用专用的可观测性层,与现有日志系统并存。你仍然可以用 Kafka、ELK 去存业务日志,但涉及“模型为什么这么回答、这次调用花了多少钱、用户反馈是什么”这类问题,Langfuse 更加高效。

3. 环境准备与安装部署

3.1 两种使用方式:SaaS 云服务与自托管

Langfuse 官方提供两种使用方式。一种是直接使用 Langfuse Cloud,注册账号后创建项目即可,省去运维成本;另一种是自托管部署,把服务部署在自己的服务器或内网。对于多数国内团队来说,自托管是更常见的选项,因为数据可以留在自己的环境中,也方便和内部系统打通。

自托管方式对基础设施的要求并不高。按我的经验,一台 2 核 4GB 内存的云服务器就能跑通开发环境,生产环境建议至少 4 核 8GB 内存,并且单独规划数据库存储。如果公司已经有 PostgreSQL,可以复用现有实例,Langfuse 的数据表会随启动自动创建。

3.2 本地部署的前置条件

在开始安装前,请确认你具备以下条件:

  • 安装了 Docker 和 Docker Compose;
  • 本机或服务器可以访问外网拉取镜像;
  • 预留一个可用的端口,默认是 3000;
  • 准备好一个安全的随机字符串,用于生成 NEXTAUTH_SECRET 和 ENCRYPTION_KEY。

如果你是在公司内网环境,Docker 镜像拉取可能受限,可以把官方镜像推送到内部镜像仓库后再部署。下面的示例以通用 Docker Compose 为基础,具体镜像 tag 请以 Langfuse 官方仓库为准,不建议固定写死旧版本号。

3.3 Docker Compose 安装步骤

建议在工作目录下创建 docker-compose.yml 文件,内容如下:

# 文件路径:docker-compose.yml
version: "3.8"

services:
  db:
    image: postgres:15-alpine
    restart: always
    environment:
      POSTGRES_USER: langfuse
      POSTGRES_PASSWORD: langfuse
      POSTGRES_DB: langfuse
    volumes:
      - langfuse_db_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U langfuse"]
      interval: 10s
      timeout: 5s
      retries: 5

  langfuse:
    image: langfuse/langfuse:latest
    restart: always
    depends_on:
      db:
        condition: service_healthy
    ports:
      - "3000:3000"
    environment:
      NEXTAUTH_URL: http://localhost:3000
      NEXTAUTH_SECRET: your_random_secret
      SALT: your_random_salt
      ENCRYPTION_KEY: your_random_encryption_key
      DATABASE_URL: postgresql://langfuse:langfuse@db:5432/langfuse
    volumes:
      - langfuse_upload_data:/data

volumes:
  langfuse_db_data:
  langfuse_upload_data:

这里有几个容易踩坑的地方:

  • NEXTAUTH_URL 必须和实际访问地址一致。如果你通过 http://服务器IP:3000 访问,就把这个地址改成 http://服务器IP:3000 ,否则登录回调会失败;
  • ENCRYPTION_KEY SALT 不要全部用同一个字符串,尽量用 openssl rand -hex 16 生成随机值;
  • DATABASE_URL 中的用户名、密码、数据库名要和 db 服务里配置的保持一致。

配置完成后,执行启动命令:

docker compose up -d

启动后查看服务状态:

docker compose ps

如果看到 langfuse db 两个服务状态均为 Up ,并且 langfuse 服务没有循环重启,说明部署基本成功。第一次启动需要初始化数据库,等待时间通常在一分钟以内,可以用 docker compose logs -f langfuse 观察日志。

3.4 访问 Langfuse Web UI

浏览器打开 http://localhost:3000 ,如果是在服务器上部署,请使用服务器的 IP 或域名。首次访问会看到注册页面,Langfuse 使用邮箱注册的方式,注册成功后即为超级管理员。生产环境中,建议在注册后立刻配置 SMTP 邮箱,并限制公开注册,避免团队成员随意注册导致账号管理混乱。

4. 创建项目与获取 API Key

4.1 登录 Langfuse 控制台

成功注册并登录后,你会进入 Langfuse 的主界面。主界面左侧导航包括项目列表、Trace 列表、数据集、评测、设置等模块。Langfuse 采用“项目”作为资源隔离单位,每个项目内的 Trace、数据集、配置互不影响。一般建议按业务线划分项目,比如“客服机器人”“知识库助手”“内容生成服务”各建一个项目。

4.2 创建项目

点击界面上的“New Project”按钮,输入项目名称,比如 demo-chatbot ,创建后会自动进入该项目。项目创建后,你可以邀请其他团队成员加入,也可以继续进行配置。

这里需要留意:密钥信息是按项目维度管理的。不同项目使用不同的 Public Key 和 Secret Key,千万不要在 A 项目中使用 B 项目的 Key,否则数据会记到错误项目里。

4.3 获取 Public Key、Secret Key 与 Host

进入项目后,在项目设置页面找到 API Keys 区域。Langfuse 会为每个项目生成一对密钥:

  • Public Key:用于标识项目,类似用户名;
  • Secret Key:用于身份认证,类似密码;
  • Host:部署服务地址,自托管时是 http://localhost:3000 ,云服务时是官方域名。

Public Key 可以暴露在前端,但 Secret Key 必须妥善保管。实际上,SDK 上报数据时需要同时携带这两个 Key,服务端会用它们来识别项目和校验身份。把 Secret Key 提交到 Git 仓库是最常见的安全事故,正确做法是通过环境变量注入。

4.4 推荐的环境变量配置方式

在项目根目录创建 .env 文件,把密钥和 Host 填进去:

# 文件路径:.env
LANGFUSE_PUBLIC_KEY=pk-lf-your-public-key
LANGFUSE_SECRET_KEY=sk-lf-your-secret-key
LANGFUSE_HOST=http://localhost:3000

SDK 在初始化时会自动读取这些环境变量,这样代码里就不需要写死密钥。不同语言的处理方式稍有区别,但思路一致:密钥只在启动环境中存在,不进入版本控制。

5. 项目接入:Python 与 Spring Boot 示例

5.1 Python 项目接入 Langfuse

先用一个最小可运行的 Python 示例把链路跑通。假设你已经有一个基于 OpenAI SDK 的调用,现在需要把这次调用记录到 Langfuse。

首先安装依赖:

pip install langfuse openai

然后创建 langfuse_demo.py

# 文件路径:langfuse_demo.py
import os
from langfuse.decorators import observe
from openai import OpenAI

os.environ.setdefault("LANGFUSE_PUBLIC_KEY", "pk-lf-你的公钥")
os.environ.setdefault("LANGFUSE_SECRET_KEY", "sk-lf-你的私钥")
os.environ.setdefault("LANGFUSE_HOST", "http://localhost:3000")

client = OpenAI()

@observe()
def ask_llm(question: str) -> str:
    response = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[
            {"role": "system", "content": "你是一个专业技术助手。"},
            {"role": "user", "content": question},
        ],
    )
    return response.choices[0].message.content

if __name__ == "__main__":
    result = ask_llm("Langfuse 是什么?")
    print(result)

这段代码使用了 @observe() 装饰器。运行后,Langfuse SDK 会自动开启一个 Trace,并把函数输入、输出和运行时信息上报到服务端。如果使用了支持的模型调用方式,SDK 还能捕获模型名称和 Token 使用情况。

这类装饰器方式的优点是侵入性小,适合快速接入。但如果你需要更精细地控制调用链,比如把“检索答案”和“生成回答”整理成不同的 Span,则需要使用手动 Trace 方式。

下面是一个手动创建 Trace 和 Generation 的示例:

# 文件路径:langfuse_manual_demo.py
from langfuse import Langfuse
from openai import OpenAI

langfuse = Langfuse()
client = OpenAI()

def build_trace(question: str):
    trace = langfuse.trace(name="manual-trace")

    retrieval_span = trace.span(name="retrieve-context")
    context = "Langfuse 是开源的 LLM 可观测性平台。"
    retrieval_span.end(output=context)

    generation = trace.generation(
        name="generate-answer",
        model="gpt-4o-mini",
        model_parameters={"temperature": 0.7},
        input={"question": question, "context": context},
    )

    response = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[
            {"role": "system", "content": "基于上下文回答问题。"},
            {"role": "user", "content": f"问题:{question}\n上下文:{context}"},
        ],
    )

    answer = response.choices[0].message.content
    generation.end(output=answer)
    trace.update(output=answer)

    return answer

if __name__ == "__main__":
    print(build_trace("Langfuse 是做什么的?"))

上面代码中, trace.span 创建了一个检索操作片段, trace.generation 创建了一次模型调用记录。每个对象都有 end(output=...) 方法,用来标记操作结束并记录输出。手动方式虽然代码多了一些,但链路的组织更清晰,也更适合复杂业务。

需要注意的是,Langfuse SDK 会在后台异步上报数据,脚本结束前最好等待数据发送完成。在测试脚本里可以调用 langfuse.flush() 强制刷盘,避免脚本刚结束进程就被销毁导致数据丢失。

5.2 Spring Boot 项目接入 Langfuse

Langfuse 官方提供了 Java SDK,也有面向 Spring Boot 的集成方案。核心思路和 Python 一样:添加依赖、配置环境变量、在方法上使用注解或手动创建 Trace。

pom.xml 中引入依赖:

<dependency>
    <groupId>com.langfuse</groupId>
    <artifactId>langfuse-java</artifactId>
    <version>请以官方最新版本为准</version>
</dependency>

application.yml 中配置连接信息:

# 文件路径:src/main/resources/application.yml
langfuse:
  host: ${LANGFUSE_HOST:http://localhost:3000}
  public-key: ${LANGFUSE_PUBLIC_KEY:}
  secret-key: ${LANGFUSE_SECRET_KEY:}

Java 代码中可以使用注解方式标注需要追踪的方法。具体注解名称和参数在不同 SDK 版本中可能不同,这里只展示接入思路:

// 示意代码,安装依赖后以官方文档为准
@Observed(name = "askLlm")
public String askLlm(String question) {
    return llmClient.complete(question);
}

如果希望在方法内部手动拆分子 Span,可以获取当前 Trace 对象,再创建 Span。Java SDK 的 API 设计整体和 Python 保持一致,都是 Trace -> Span/Generation 的模型。团队如果有 Java 和 Python 混合调用,Langfuse 也能在同一个 UI 中把它们连接起来,因为 Trace 节点可以跨语言共享。

5.3 项目接入的必要配置清单

接入时请逐项确认:

  • 依赖版本是否和 Langfuse 服务端版本兼容;
  • 环境变量是否在应用启动前正确加载;
  • 项目 Public Key 和 Secret Key 是否对应同一个项目;
  • Host 是否填写为“服务端地址”,而不是默认的 https://cloud.langfuse.com
  • 如果前端直接上报数据,是否只使用了 Public Key,没有把 Secret Key 暴露在浏览器中。

6. 运行结果与效果验证

6.1 运行 Python 脚本

在本地执行:

python langfuse_demo.py

如果脚本正常输出模型返回结果,说明调用成功。此时 Langfuse SDK 已经把 Trace 数据发送到服务端。如果服务端没有出现 Trace,优先检查环境变量值和网络连通性。

6.2 在 Langfuse UI 中验证 Trace

回到 Langfuse 控制台,进入刚才创建的项目,点击左侧的 “Traces” 菜单。正常情况下,你会看到刚刚运行产生的一条 Trace 记录,列表上会显示 Trace 名称、创建时间、调用次数、Token 消耗等信息。

点击 Trace 名称进入详情页,可以看到如下信息:

  • Trace 的完整输入和输出;
  • 每个 Span 的执行顺序和耗时;
  • 模型调用的模型名、参数、输入输出;
  • Token 统计和成本统计(如果模型信息完整);
  • 自定义 metadata 字段。

如果页面里能清晰看到 ask_llm 这条 Span,并且输入是“Langfuse 是什么?”,输出是模型返回的答案,说明接入成功。

6.3 常见的成功标志

判断接入是否成功,重点看三个标志:

  • UI 中能看到新的 Trace,并且 Trace 数量随调用次数增长;
  • Trace 详情页能展开 Span/Generation 结构;
  • 记录中能看到 Token 数字,而不是全部为 0。

看到这三条,说明 Langfuse 已经在正常工作了。下一步可以尝试给 Trace 增加 metadata、评分或人工反馈,把可观测性从“记录”升级为“评估”。

6.4 如果 Trace 没有出现怎么办

Trace 没有出现时,第一步不要急着改代码,先看 SDK 日志。Langfuse SDK 日志里通常会输出上报失败的原因。常见的场景是连接超时、密钥无效、数据格式错误。先打开服务端日志和 SDK 日志,把错误信息拿到,再按照下一节的排查表处理。

7. 常见问题与排查思路

在自托管和项目接入过程中,下面这些问题出现频率最高,建议收藏备用。

问题现象 可能原因 排查方式 解决方案
浏览器无法访问 Langfuse 页面 端口未开放或 Docker 容器未启动 检查服务器安全组和防火墙,执行 docker compose ps 开放 3000 端口,或调整端口映射
注册页面提交后一直转圈 NEXTAUTH_URL 配置错误 查看 langfuse 容器日志,确认回调地址 将 NEXTAUTH_URL 改为实际访问地址
SDK 上报时报 401 Public Key 或 Secret Key 错误 检查环境变量和项目 Key 重新复制对应项目的 Key
SDK 上报超时 Host 配置成云服务地址或网络不通 用 curl 测试 Host 地址 改为自托管服务地址,检查网络
UI 中看不到 Trace SDK 没有正确上报或数据未刷新 查看 SDK 日志,调用 flush() 后重试 等待几秒刷新页面,或修复上报链路
Token 成本全部为 0 模型名称未识别或未配置定价 检查 Generation 日志中的 model 字段 使用官方支持的模型名,或在设置中配置模型信息
Docker 容器一直重启 数据库连接失败或环境变量缺失 执行 docker compose logs db 和 logs langfuse 检查 DATABASE_URL 和数据库健康状态
数据库表无法自动创建 数据库权限不足 查看服务端日志中的 SQL 错误 给数据库用户授予 DDL 权限
升级后页面报错 服务端版本与数据库迁移不匹配 查看版本升级说明和迁移日志 按官方文档顺序升级,提前备份数据库

除了表格中的问题,还有一种情况容易被忽视:本地写了 LANGFUSE_HOST=http://localhost:3000 ,但在 Docker 容器内部运行 SDK 时,这个 localhost 指向的是容器本身,并不是宿主机。这时需要把 Host 改成 http://宿主机IP:3000 ,或者使用 Docker 网络别名。

8. 最佳实践与工程建议

8.1 统一封装 SDK 调用,避免到处埋点

Langfuse 虽然提供装饰器,很容易直接集成,但如果整个团队随处在业务代码里堆积埋点逻辑,后期维护会很痛苦。更稳妥的方式是做一个公共封装模块,统一处理 Langfuse 的初始化、密钥加载、Trace 创建、数据上报。业务代码只关心自己的逻辑,由封装层决定是否上报、上报哪些字段、是否需要采样。

封装之后,团队成员不需要理解 Langfuse 的完整 API,只要调用统一的 traceService @Observed 即可。这样也方便将来更换可观测性平台时只改动一个模块。

8.2 注意敏感信息脱敏

打开 Trace 详情页后,你会看到调用链上的所有输入和输出。这意味着用户的个人信息、业务敏感字段、内部 API Key 都可能被完整记录下来。这既是 Langfuse 的优势,也是隐私风险。

生产环境建议在 SDK 上报前对敏感字段做脱敏处理。比如在 trace.update 之前把用户手机号替换为掩码,或使用 Langfuse 提供的 mask 能力,只保留必要信息。同时,应当对 Langfuse 控制台的访问权限做严格控制,不是所有人都能查看线上 Trace。

8.3 合理设置采样率与流量控制

如果把生产环境所有请求都无条件上报,会产生大量数据,增加存储和服务端压力,还会暴露过多噪音。更合理的策略是按需采样:普通接口按 10% 到 20% 采样,重点模块或异常流程全量采样。

Langfuse SDK 支持在一定程度上控制采样逻辑,你也可以在封装层自行实现。比如只对 level=ERROR 的 Trace 或者包含特定用户 ID 的请求全量上报。核心原则是:可观测性数据要有,但不要为所有流量买单。

8.4 善用 metadata 和标签

Trace 越丰富,后续排查效率越高。建议在创建 Trace 时加入业务元数据,比如用户 ID、渠道、项目版本、Prompt 版本号、环境名称。出现问题时,你可以直接在 UI 中按这些字段过滤,快速缩小范围。

标签功能也很有用。比如给线上异常回答打上 bad_case 标签,后续可以统一筛选出所有坏案例,作为数据集用于评测或 Prompt 优化。Langfuse 的标签不是简单打上去就结束,它和数据集功能结合后,可以形成一个“线上问题发现 -> 收集样本 -> 离线评测 -> 优化 Prompt”的闭环。

8.5 建立评估与反馈机制

Langfuse 不只是监控工具,还可以做评估。你可以为项目创建数据集,保存一组标准测试问题,用不同 Prompt 版本或模型版本运行后,在 Langfuse 中对比结果。也可以在代码中记录用户点击“满意”或“不满意”的反馈,让模型效果从“主观感觉”变成“可量化指标”。

生产环境建议至少做两件事:一是记录用户反馈,二是定期导出坏案例。很多团队花大量时间优化 Prompt,却总是凭感觉判断改得好不好,有了 Langfuse 的数据支撑,优化才真正有依据。

8.6 自托管环境的安全与备份

自托管 Langfuse 意味着你要承担数据库和服务的运维责任。生产部署时,至少要注意以下几点:

  • 不要使用默认密码,为 PostgreSQL 设置独立账号和强密码;
  • 为 Langfuse 服务设置 HTTPS 访问,避免 Secret Key 和 Token 数据在传输过程中被窃取;
  • 定期备份数据库卷,尤其是数据库中的 Trace 数据和配置数据;
  • 升级前先备份数据库,并阅读官方升级说明,避免数据库迁移失败;
  • 控制控制台注册入口,避免陌生人注册后访问到项目数据。

8.7 版本兼容与升级策略

Langfuse 迭代速度很快,SDK 和服务端的版本需要保持一个合理匹配范围。如果 SDK 使用了最新 API,而服务端是半年前的版本,上报数据可能失败。建议在项目里固定 SDK 版本,升级时先在测试环境验证,确认 UI 中能看到 Trace 后再更新生产环境。

对于长期项目,更推荐把 Langfuse 的部署文件、SDK 版本、配置模板放到独立仓库中管理,和业务代码分开。这样升级时可以先对比变更,避免因为版本问题影响业务。

9. 总结与后续学习方向

Langfuse 解决的核心问题,是让大模型应用从“代码能跑”升级为“问题可查、效果可评”。你不需要一次性把它的所有功能都用起来,最务实的路径是:先部署一个最小环境,接入一个方法的 Trace,然后在 UI 里观察一遍调用链;再逐步加入手动 Span、metadata、用户反馈和数据集评测。

如果你正在做 Agent 应用,试着把工具调用和模型调用分别记录成不同 Span,你会发现排查“AI 为什么走错工具”变得非常直观。如果你在做 RAG,可以把检索结果作为 Span 输入记录下来,方便分析答案是否受错误上下文影响。不要把所有逻辑塞进一个函数,尽量让每个环节都有清晰的 Span。

对于团队而言,可以考虑把 Langfuse 作为 LLM 应用的标配基础设施。它和学习成本不算高,但带来的排查效率提升非常明显。建议先在一个非核心项目里跑通完整流程,再逐步推广到核心业务。

下一步值得深入的方向包括:Langfuse 的 Prompt 管理功能、数据集与在线评测、以及如何和 CI/CD 流程结合。当你开始用数据而不是感觉去优化大模型时,Langfuse 的价值会越来越大。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐