给你的 Agent 装个黑匣子:Langfuse 调用追踪实战

单轮聊天出错,看一眼输出就知道问题。但 Agent 跑十几步、调了五六个工具、还把上下文越滚越长之后,用户一句「结果不对」甩过来,你根本无从下手——它当时到底检索了哪段文档、调了哪个工具、中间哪一步开始跑偏?这就是为什么 2026 年做 Agent,可观测性是必需品,不是锦上添花。Langfuse 是这一范畴里常用的开源选择。 它解决什么 Langfuse 的核心是 trace:一次 Agent 运行从开始到结束,被记成一棵树。每个节点记录输入、输出、耗时、token 数、错误。你可以在网页上回放:这一步模型看到的上下文是什么,那一步工具返回了什么。 三步接进来 自托管一行 docker 起 Langfuse,或用云版拿一对公钥私钥; 在你的 Agent 代码里装它的 SDK,用装饰器或上下文管理器包住模型调用与工具函数; 给每步打上 name 和元数据(任务 id、用户 id),跑几次,控制台就能看到轨迹树。 对用 OpenAI Agents SDK、LangChain、Dify 的项目,Langfuse 都有现成集成,基本是填两个环境变量的事。 怎么用起来 复现 bug:用户报障时,按任务 id 拉出那一次 trace,定位是检索错了还是工具返回错了; 找成本黑洞:按 token 排序,找出那几个每轮都把超长上下文重发的步骤,针对性做压缩; 回归对比:改完提示词,对比新旧 trace 的步数与失败率。 判断 Agent 从 demo 走向生产,最后一公里往往不是「它够不够聪明」,而是「它出错时你能不能修好」。给 Agent 装上 Langfuse 这个黑匣子,等于给飞行记录仪——飞得多高是模型的事,坠机了能黑匣子读数,才是工程团队的底气。 补充一个进阶用法:给 trace 打标签。按部门、按场景、按用户等级打标签,事后就能对比「市场部的 Agent 平均跑几步、花多少 token」和研发的差异。这种横向对比,往往能直接定位到那个一直没被注意的高成本流程——它跑得勤,却没人意识到它在烧钱。 去论坛讨论 这篇文章里的观点,欢迎到硅基AGI论坛讨论。按标题搜索:Agent观测

2026-10-08 · 1 min · 63 words · AI 实战派
langfuse observability

Langfuse 可观测性:开源的 LLM 监控方案

LLM 应用的可观测性困境 当你的 LLM 应用从 Demo 走向生产,一系列问题随之而来:某个请求为什么返回了错误结果?Prompt 改动后效果到底是变好还是变差?不同模型的延迟和成本如何对比?传统 APM 工具(如 Datadog)对 LLM 场景缺乏原生支持。Langfuse 作为开源的 LLM 可观测性平台,正填补了这一空白。 Langfuse 核心功能 功能矩阵 功能模块 说明 Tracing 请求级全链路追踪,含 LLM 调用、工具调用、检索流程 Prompt Management Prompt 版本管理、AB 测试、在线编辑 Analytics 延迟、Token 用量、成本统计 Evaluation 人工标注 + 自动评估(基于规则或模型裁判) User Feedback 用户点赞/点踩采集与关联 Model Usage 多模型/多项目用量看板 Tracing:全链路追踪 集成方式 Python SDK(推荐) from langfuse import Langfuse from langfuse.decorators import observe langfuse = Langfuse() @observe() # 自动创建 trace def chat_bot(user_message: str): # 嵌套的 @observe 会自动建立父子关系 retrieved_docs = retrieve(user_message) # 被 trace answer = generate_response(user_message, retrieved_docs) # 被 trace return answer @observe(as_type="generation") def generate_response(question, docs): response = openai.chat.completions.create( model="gpt-4o", messages=[{"role": "user", "content": f"基于以下内容回答:{docs}\n问题:{question}"}], ) return response.choices[0].message.content @observe(as_type="span") def retrieve(query): # 检索逻辑 return vector_db.search(query) OpenAI SDK 集成(Drop-in) from langfuse.openai import openai # 只需替换 import,所有 OpenAI 调用自动被 trace response = openai.chat.completions.create( model="gpt-4o", messages=[{"role": "user", "content": "Hello"}], metadata={"user_id": "user_123"}, # 附加用户信息 ) LangChain 集成 from langfuse.callback import CallbackHandler handler = CallbackHandler() chain.invoke( {"input": "什么是量子计算?"}, config={"callbacks": [handler]} ) Trace 结构 Trace (chat_bot 调用) ├── Span (retrieve - 向量检索) │ └── Generation (embedding 调用) ├── Generation (generate_response - LLM 调用) │ ├── input: "基于以下内容..." │ ├── output: "量子计算是..." │ ├── model: gpt-4o │ ├── tokens: {input: 350, output: 280} │ └── cost: $0.0091 └── Span (后处理) 自定义 Span from langfuse import Langfuse langfuse = Langfuse() trace = langfuse.trace(name="rag-pipeline", user_id="user_123") span = trace.span(name="document-retrieval", input={"query": "量子计算"}) # ... 执行检索 ... span.end(output={"docs": [...]}) gen = trace.generation( name="answer-generation", model="gpt-4o", input={"messages": [...]}, output={"content": "..."}, usage={"prompt_tokens": 350, "completion_tokens": 280}, ) Prompt 管理 版本化 Prompt from langfuse import Langfuse langfuse = Langfuse() # 获取生产环境的 Prompt(自动缓存) prompt = langfuse.get_prompt( name="summarizer", version=2, # 指定版本,或省略获取最新 ) # 编译 Prompt(变量替换) compiled = prompt.compile( text="一段需要总结的长文本...", max_length="200" ) # 直接用于 LLM 调用 response = openai.chat.completions.create( model=prompt.config["model"], messages=[{"role": "user", "content": compiled}], ) Prompt AB 测试 import random # 50% 用户用 v1,50% 用 v2 version = random.choice(["v1", "v2"]) prompt = langfuse.get_prompt(name="customer-support", version=version) # Langfuse 自动记录每个请求使用了哪个版本 trace = langfuse.trace(name="support-chat") trace.update(metadata={"prompt_version": version}) 在线编辑 Langfuse Web UI 提供 Prompt 在线编辑器: ...

2026-06-24 · 3 min · 629 words · AI 实战派
🔗 硅基 AGI 论坛 · silicon-agi.com | 📡 RSS 订阅
鲁ICP备2026018361号