不知道各位彦祖亦菲平时在开发大模型应用的时候有没有用到什么监控追踪工具。想象一下,假如我们正在开发一个基于检索增强生成(RAG)模型的应用,这个应用需要跟踪每个步骤的响应时间、结果准确性,甚至是用户交互的流畅度。这些数据对于优化用户体验和提升系统性能至关重要。

那么,如何确保我们的LLM应用在性能上不掉链子,同时又能实时捕捉到每一个细微的反馈,以便快速迭代和优化呢?

我是用的langfuse来跟踪的,它提供了一系列的功能,Langfuse能够捕捉产品的完整上下文,包括外部API或工具调用、上下文、提示等。

Langfuse的核心功能包括LLM可观测性、提示管理、LLM评估、数据集管理、LLM指标分析等。这些功能共同构成了一个完整的LLM应用开发生态系统,使我们能够更高效地构建、优化和管理他们的LLM应用。

就在前几天,langfuse发布了一个自去年年初推出以来最大的更新,v3.0.0的发布。

先看看架构图的变化:

v2.png

v3.png

  • v3版本引入了Async Worker和Redis,它们用于提高系统的可扩展性和性能。

  • v3版本增加了Clickhouse和S3 / Blob Storage,用于存储和处理不同类型的数据。

为什么选择Clickhouse,官方大概得原因是这些:

Clickhouse因其在处理大规模数据、分析查询优化、丰富的功能集以及对自托管用户的友好性而被选中。同时,Clickhouse的社区支持和在现代可观测性工具中的流行也影响了这一决策。

redis 主要用于处理缓存和队列的使用场景。

用s3来存储处理大量且结构不那么固定的数据,比如模型的输入和输出。

OK,介绍完最近的大版本升级。我们简单看看这个langfuse到底能干啥。

这里我们用langfuse的云服务,https://cloud.langfuse.com/

注册登录获取key一气呵成~

安装sdk

pip install langfuse openai

trace

import os
from langfuse.decorators import observe
from langfuse.openai import OpenAI # OpenAI integration


os.environ["LANGFUSE_SECRET_KEY"] = "sk-lf-..."
os.environ["LANGFUSE_PUBLIC_KEY"] = "pk-lf-..."
os.environ["LANGFUSE_HOST"] = "https://cloud.langfuse.com"  # 🇪🇺 EU region

@observe()
def story():
    client = OpenAI(
        api_key="",
        base_url="=",
    )
    return client.chat.completions.create(
        model="gpt-3.5-turbo",
        max_tokens=100,
        messages=[
          {"role": "system", "content": "You are a great storyteller."},
          {"role": "user", "content": "Once upon a time in a galaxy far, far away..."}
        ],
    ).choices[0].message.content
 
@observe()
def main():
    return story()
 
main()

运行这段代码之后,可以在dashboard看到一条记录。

dashboard.png

点进traces可以看到运行的详细情况,可以很方便的看到每一步花费的时间、输入输出以及花费的token数。

trace_detail.png

这里可以很方便的给每一次的流程进行打分或者加入到数据集用来后续的测试评估。

score.png

提示词管理

prompt_set.png

我们还可以用langfuse来管理提示词,提示词正文里面支持变量,然后可以设置提示词对应的config,这里最佳实践可以是用来设置提示词对应的模型参数~

提示词新建成功之后,我们需要在这里把标签设置为production才能在后续的sdk中获取到,每次更新提示词也是需要把对应版本的提示词标记为production。

p_prod.png

from langfuse import Langfuse

langfuse = Langfuse()
langfuse_prompt = langfuse.get_prompt("story")
print(langfuse_prompt.prompt)
compiled_prompt = langfuse_prompt.compile(criticlevel="expert", movie="Dune 2", nums=100)
print(compiled_prompt)
print(langfuse_prompt.config)

# 输出:
给我写一个童话故事,字数{{nums}}以内。
给我写一个童话故事,字数100以内。
{'model': 'gpt-3.5-turbo'}

总结

本文到这里就结束了,但关于langfuse的介绍还有很多可以展开的地方,比如数据集处理和模型评估等功能。对于对langfuse感兴趣的朋友们来说,这只是一个开始。langfuse作为一个实用的工具,相信已经有不少技术爱好者在使用了,​欢迎大家在评论区分享自己使用langfuse的经验和想法!

欢迎大家关注我的公众号~

Snipaste_2024-12-07_11-05-00.png