大模型(LLM)技术的应用日益广泛,但如同其他自动化工具一样,最终都需要回到成本效益的考量。本文将深入探讨如何利用 LangSmithLangFuse 这两大工具进行 LLM追踪,从而更好地理解和优化大模型的性能、成本以及整体价值。

1. LLM追踪的重要性:从成本到价值

在评估大模型项目时,仅仅关注模型本身的能力是不够的。我们需要深入了解模型的实际运行情况,例如Token消耗量、响应时间、错误率等。LLM追踪 提供了这种洞察力,帮助我们从单纯的技术评估转向全面的价值评估。

例如,一个RAG(Retrieval-Augmented Generation)应用,每次会话消耗2万Token,输入输出比例为50:50,并且使用了Gemini-Flash-2.5模型。初步计算显示,该应用每次会话可以为用户节省3分钟的工作时间。假设有8位员工,平均每小时需要执行此任务3次,且时薪为1美元。从表面上看,这个项目似乎很有价值。

但是,如果这些员工是按小时计费的,节省的时间可以直接降低劳动力成本,那么结论很可能是肯定的。但如果他们是固定员工,节省的时间可能只是让他们做更多其他的工作,或者需要额外的补偿成本。

因此,LLM追踪不仅能帮助我们量化Token消耗带来的成本,还能帮助我们更全面地评估大模型项目的实际收益,并结合具体情况(员工类型、业务需求)做出更明智的决策。更进一步,在某些情况下,即使 LLM 方案的成本高于人工流程,我们仍然可能选择采用 LLM,例如当某个流程过度依赖于特定人员时,引入 LLM 可以降低风险。 总而言之,最终要看 LLM 能否带来超越成本的价值。

2. LangSmith:LangChain生态系统的追踪利器

LangSmith 是 LangChain 生态系统的重要组成部分,提供 LLM追踪、评估和提示管理等功能。它提供了免费计划(具有一定的限制),足以进行初步的演示和探索。 LangSmith 尤其适合已经在使用 LangChain 的开发者。

如何使用 LangSmith 进行追踪?

  1. 注册并获取API Key: 访问 LangSmith 官方网站并注册账号。在控制台中生成 API Key,并设置追踪项目名称。请务必妥善保管API Key,切勿泄露。
  2. 配置环境变量: 将 API Key、LangSmith Endpoint 和项目名称添加到环境变量中。例如:
GOOGLE_API_KEY=<你的 Google API Key>
LANGSMITH_TRACING=true
LANGSMITH_ENDPOINT="https://api.smith.langchain.com"
LANGSMITH_API_KEY="<你的 API Key>"
LANGSMITH_PROJECT="<你的追踪名称>"
  1. 集成 LangChain 代码: LangSmith 与 LangChain 实现了深度集成,无需修改大量代码即可启用追踪。以下是一个示例:
from dotenv import load_dotenv
from langchain.chat_models import init_chat_model
from langchain_core.prompts import ChatPromptTemplate
from pydantic import BaseModel, Field
from langchain_core.output_parsers import JsonOutputParser

# 加载环境变量
load_dotenv()

# 初始化 Gemini 模型
model = init_chat_model("gemini-2.0-flash", model_provider="google_genai", temperature=0)

# 创建结构化输出
class Ingredients(BaseModel):
    ingredients: list = Field(..., description="Ingredients list of input menu")
parser = JsonOutputParser(pydantic_object=Ingredients)

# 创建提示
based_prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            """You are my chef assistant, your job is to list ingredients of the dish that I give to you.Your output should be in this format. {format_instructions}""",
        ),
        ("human", "{user_input}"),
    ]
)

# 添加格式指令
json_prompt = based_prompt.partial(format_instructions=parser.get_format_instructions())

# 链接
chain = json_prompt | model | parser

# 调用
print(chain.invoke('pizza'))

运行上述代码后,LangChain 会自动将追踪信息记录到 LangSmith 中。您可以登录 LangSmith 控制台,查看追踪数据,并深入了解 LLM 的使用情况。例如,您可以查看每个步骤的耗时、Token 消耗量以及输入输出内容。

实际案例:利用LangSmith 优化提示词

假设您正在开发一个基于 LLM 的客服机器人。通过 LangSmith 的追踪功能,您发现某个特定提示词会导致模型产生大量无效回答,从而浪费 Token。通过分析追踪数据,您可以识别出问题提示词,并进行优化,例如更明确地表达意图或提供更多的上下文信息。

3. LangFuse:开源LLM工程平台,自托管的追踪方案

LangFuse 是一个开源的 LLM 工程平台,提供追踪、评估、提示管理和指标监控等功能。与 LangSmith 不同的是,LangFuse 提供了云服务和自托管两种部署方式。 如果您对数据安全性和隐私有更高的要求,或者希望更好地控制底层架构,自托管的 LangFuse 可能是更好的选择。

如何使用自托管的 LangFuse 进行追踪?

  1. 部署 LangFuse: 按照 LangFuse 官方文档,使用 Docker Compose 在本地部署 LangFuse。
git clone https://github.com/langfuse/langfuse.git
cd langfuse
docker compose up

部署完成后,可以通过 localhost:3000 访问 LangFuse 控制台。

  1. 注册并获取API Key: 在 LangFuse 控制台中注册账号,创建组织、项目并生成 API Key(包括 Secret Key 和 Public Key)。
  2. 配置环境变量: 将 API Key 和 LangFuse Host 添加到环境变量中。
GOOGLE_API_KEY=<你的 Google API Key>
LANGFUSE_SECRET_KEY="<你的 LangFuse Secret Key>"
LANGFUSE_PUBLIC_KEY="<你的 LangFuse Public Key>"
LANGFUSE_HOST="<你的 LangFuse HOST>"
  1. 安装 LangFuse Python 包: 由于 LangChain 对 LangFuse v3 的集成尚未完全完善,建议安装 LangFuse v2.60.8。
pip install langfuse==2.60.8
  1. 集成 LangChain 代码: 在 LangChain 代码中导入 LangFuse 的 CallbackHandler,并将其添加到 Runnable 的 invoke 方法中。
from dotenv import load_dotenv
from langchain.chat_models import init_chat_model
from langchain_core.prompts import ChatPromptTemplate
from pydantic import BaseModel, Field
from langchain_core.output_parsers import JsonOutputParser
from langfuse.langchain import CallbackHandler

# 加载环境变量
load_dotenv()

# 初始化 Gemini 模型
model = init_chat_model("gemini-2.0-flash", model_provider="google_genai", temperature=0)

# 创建结构化输出
class Ingredients(BaseModel):
    ingredients: list = Field(..., description="Ingredients list of input menu")
parser = JsonOutputParser(pydantic_object=Ingredients)

# 创建提示
based_prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            """You are my chef assistant, your job is to list ingredients of the dish that I give to you.Your output should be in this format. {format_instructions}""",
        ),
        ("human", "{user_input}"),
    ]
)

# 添加格式指令
json_prompt = based_prompt.partial(format_instructions=parser.get_format_instructions())

# 链接
chain = json_prompt | model | parser

# 调用
print(chain.invoke('pizza', config={"callbacks": [CallbackHandler()]}))

运行上述代码后,您可以在 LangFuse 控制台中查看追踪数据。

LangFuse 的高级追踪选项: Session 和 Annotation

LangFuse 提供了更丰富的追踪选项,例如 session_idannotation

  • Session: 使用 session_id 可以将多个相关的请求关联到同一个会话中,从而更好地跟踪用户行为。例如:
tracing_option = {
    'tags': ['medium'],
    'trace_name': '01',
    'user_id': 'chanon',
    'session_id': '01'
}
print(chain.invoke('pizza', config={"callbacks": [CallbackHandler(**tracing_option)]}))

tracing_option = {
    'tags': ['medium'],
    'trace_name': '02',
    'user_id': 'chanon',
    'session_id': '01'
}
print(chain.invoke('plaza', config={"callbacks": [CallbackHandler(**tracing_option)]}))

在 LangFuse 控制台中,您可以查看整个会话的 Token 消耗量和对话内容。

  • Annotation: 可以使用 annotation 对 LLM 的响应进行评分,从而评估模型的性能。例如:
import uuid
from langfuse import Langfuse

predefined_run_id = str(uuid.uuid4())

tracing_option = {
    'tags': ['medium'],
    'trace_name': '03',
    'user_id': 'chanon',
    'session_id': '01'
}
print(chain.invoke('plaza', config={
    "callbacks": [CallbackHandler(**tracing_option)],
    "run_id": predefined_run_id,
}))

langfuse = Langfuse()

langfuse.score(
    trace_id=predefined_run_id,
    name="correct",
    value=0,
    data_type="BOOLEAN",
    comment="Incorrect answer",
)

在 LangFuse 控制台中,您可以查看每个追踪的评分结果。

实际案例:利用LangFuse的 Session 分析用户行为

假设您正在开发一个电商平台的 LLM 助手。通过 LangFuse 的 Session 功能,您可以跟踪用户与助手的交互过程,了解用户在不同阶段的需求和问题。例如,您可以发现用户在搜索商品后,经常会咨询商品的退换货政策。根据这些数据,您可以优化助手的提示词,主动提供退换货政策信息,从而提升用户体验。

4. 数据导出与分析:从追踪到洞察

无论是 LangSmith 还是 LangFuse,都提供了数据导出功能,可以将追踪数据导出为 CSV 格式,从而进行更深入的分析。 例如,您可以分析不同提示词的 Token 消耗量和响应时间,或者评估不同模型的性能指标。

LangFuse 数据导出示例:

from dotenv import load_dotenv
import pandas as pd
from langfuse import Langfuse

load_dotenv()

def pydantic_list_to_dataframe(pydantic_list):
    data = []
    for item in pydantic_list:
        data.append(item.dict())
    return pd.DataFrame(data)

langfuse = Langfuse()

score = langfuse.api.score.get(limit=5)
traces = langfuse.api.trace.list(limit=5)
observations = langfuse.api.observations.get_many(limit=5)
sessions = langfuse.api.sessions.list(limit=5)

pydantic_list_to_dataframe(traces.data).to_csv('traces.csv')
pydantic_list_to_dataframe(observations.data).to_csv('observations.csv')
pydantic_list_to_dataframe(sessions.data).to_csv('sessions.csv')
pydantic_list_to_dataframe(score.data).to_csv('score.csv')

实际案例:利用导出的数据进行 A/B 测试

您可以将不同的提示词或模型部署到不同的用户群组,并使用 LangSmith 或 LangFuse 收集追踪数据。然后,将导出的数据导入到数据分析工具中,例如 Python 的 Pandas 库,进行 A/B 测试,评估不同方案的性能指标,从而选择最优方案。

5. 总结:LLM追踪,驱动大模型应用的持续优化

LLM追踪 是大模型应用开发过程中不可或缺的一环。通过 LangSmithLangFuse 这两大工具,我们可以深入了解模型的运行情况,量化成本和收益,并最终实现大模型应用的持续优化。 选择哪个工具取决于您的具体需求和偏好。 如果您已经在使用 LangChain,并且对数据安全性要求不高,LangSmith 可能是更方便的选择。 如果您对数据安全性有更高的要求,或者希望更好地控制底层架构,自托管的 LangFuse 可能是更好的选择。 无论您选择哪个工具, 记住 LLM追踪 的最终目标是帮助您更好地理解和优化大模型,从而创造更大的价值。