你的大模型应用表现真的好吗?借助 Dify + Langfuse 一探究竟

news2024/11/23 12:39:56

背景介绍

众所周知,大模型应用的输出存在着一些不确定性,往往需要迭代多轮才能得到较为稳定的输出结果,因此开发者往往需要关注大模型应用的实际表现,并进行有针对性的优化。

然而常规 Web 服务的监控机制往往无法满足大模型应用的监控需求,因为大模型应用往往关注的不仅仅是响应延迟、吞吐量等基础指标,而是需要关注大模型应用输出的语义正确性。因此,本文将介绍如何借助 Dify 和 Langfuse 工具,展示如何为大模型应用必要监控,方便进行有定向优化。

基础介绍

Dify

Dify 是一款热门的开源 LLMOps 服务,作为一个大模型应用的基础设施,可以帮助开发者快速构建 LLM 应用。关于 Dify 的介绍之前整理过很多,比如 大模型应用基础服务 Dify 深度解读, 感兴趣的可以去了解下,这边就不再深入展开了。

Langfuse

Langfuse 是一款开源的大模型应用监控服务,可以为大模型应用提供监控能力。比如面对 Dify 复杂的任务流,可以借助 Langfuse 跟踪各个基础环节输出的结果,方便深入定位问题。

除了常规的内容搜集与展示外,Langfuse 还有两个值得重点关注的能力:

  1. LLM 评估,可以借助大模型评估现有业务输出的内容,充当 LLM-as-a-Judge 角色。考虑到大模型应用输出的都是大量的文本内容,常规的评估方式往往无法满足需求,因此借助 LLM 评估可以更精准快速地评估输出内容(这个功能目前 Langfuse 还处于实验阶段,私有化部署暂时还不支持,预计后续会很快上线);
  2. 数据集管理,数据集管理可以帮助我们通过批量标准手段快速测试大模型应用,在进行大模型应用优化时,可以借助数据集快速测试优化后的效果,避免负优化;

Dify 官方目前直接支持的监控方案为 LangSmith 和 Langfuse。 LangSmith 功能更强,但是需要付费,而且没有提供私有化部署的能力,因此 Langfuse 算是一个开源的经济方案。

部署与集成

服务部署

Dify 和 Langfuse 都提供了多种部署方案,常规情况下,如果希望进行私有化部署,基于 docker compose 的方案是最省心的。

Dify 的部署流程可以参考 Dify Docker Compose 部署

Langfuse 的部署流程可以参考 Langfuse Docker Compose 部署

服务集成

Dify 官方提供了对 Langfuse 的支持,因此可以在 Dify 应用中通过配置 Langfuse 地址,public key, secret key 信息,就可以快速集成 Langfuse 服务。

请添加图片描述

详细的服务集成的流程可以参考 Dify 官方文档中 Langfuse 集成

服务集成之后,在 Dify 应用中进行正常使用,就可以跟踪输出结果与应用中间环节的输出了,实际测试跟踪效果如下所示:

请添加图片描述

上图是一个 RAG 应用,可以看到 Langfuse 除了可以跟踪最终输出,右侧也可以看到中间知识检索的结果,方便深入定位各个环节中的问题。

数据集与自动化评估

在大模型应用的持续迭代中,为了验证迭代效果,往往会构建一个标准的自动化测试数据集 (Dataset)。基于标准的数据集与大模型自动化评估手段,可以快速直观看到优化后的效果差异。除此之外,Langfuse 也支持根据线上跟踪的情况动态新增数据集,比如可以将之前表现不佳的用户问题动态加入数据集,方便进行有针对性的优化:

请添加图片描述

数据集的构建

Langfuse 提供了 sdk 帮助快速构建数据集,构建数据集主要包含创建数据集,添加测试项。

创建测试集可以直接调用 create_dataset 方法:

langfuse.create_dataset(
    name="<dataset_name>",
    description="My first dataset",
    metadata={
        "author": "Alice",
        "date": "2022-01-01",
        "type": "benchmark"
    }
)

向测试集中添加测试项可以调用 create_dataset_item() 方法:

langfuse.create_dataset_item(
    dataset_name="<dataset_name>",
    input={
        "text": "hello world"
    },
    expected_output={
        "text": "hello world"
    },
    metadata={
        "model": "llama3",
    }
)

创建完成后就可以在 Langfuse 网页端实时查看了。

Dify 任务提交

为了进行批量自动化测试,需要获取数据集中所有的测试项,依次提交给 Dify 服务,并将本次任务与测试项进行绑定:

# 调用 dify 接口发送消息,获取 dify 响应

async def send_chat_message(
    query: str,
    inputs: dict = {},
    url: str = os.getenv("DIFY_API_BASE", ""),
    api_key: str = os.getenv("DIFY_API_KEY", ""),
    response_mode: Literal["streaming", "blocking"] = "blocking",
    user: str = "auto_test",
    file_array: list = [],
):
    chat_url = f"{url}/chat-messages"
    headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}
    payload = {
        "inputs": inputs,
        "query": query,
        "response_mode": response_mode,
        "conversation_id": "",
        "user": user,
        "files": file_array,
    }
    async with aiohttp.ClientSession() as session:
        async with session.post(chat_url, headers=headers, json=payload) as response:
            ret = await response.json()
            status = ret.get("status")
            message = ret.get("message")
            if status and message:
                raise ValueError(f"{status}: {message}")
            return ret

async def run_dataset_item(item, run_name):
    response = await send_chat_message(item.input)

    # 将 dify 返回的 message_id 与 langfuse 中的 trace id 进行关联

    item.link(
        trace_or_observation=None,
        run_name=run_name,
        trace_id=response["message_id"],
        observation_id=None,
    )
    return response

如果在 Dify 中绑定了 Langfuse 服务,那么 Dify 处理消息时,就会将完整的调用链路发送给 Langfuse。如果通过 item.link() 执行了数据集的绑定,那么实际就能看到批量测试结果,而且点击 trace 列可以跟踪单次跳转的详情。类似如下所示:

请添加图片描述
实际测试发现,Dify 的监控消息是异步发送给 Langfuse, 因此如果异步任务堆积,可能会导致 Langfuse 推送延迟。

自动化评估

后续官方的私有化部署自动化评估发布之后,应该只需要配置大模型即可进行自动评估了。而目前阶段可以基于第三方框架进行评估,之后再上传至 Langfuse 中。常规 RAG 的评估框架之前的文章中 从开发到部署,搭建离线私有大模型知识库, 可以选择 ragas, trulens 等。

计算评估得分后调用 Langfuse 中的 score() 方法,将得分传入 Langfuse:

langfuse_generation = langfuse.generation(
    name="guess-countries",
    input=messages,
    output=openai_completion,
    model="gpt-3.5-turbo",
    start_time=generationStartTime,
    end_time=datetime.now()
)

# 自定义评估方法 evaluate_func,计算所需的评估得分

langfuse_generation.score(
    name="exact_match",
    value=evaluate_func(completion, item.expected_output)
)

个人实际选择 ragas 作为评估方法,评估完成后可以在网页端直接查看:

请添加图片描述

总结

本文是对 Dify + Langfuse 的初步实践,从个人使用体验来看,由于 Dify 官方提供了完整的支持,Langfuse 的接入变得相对简单,可以快速跟踪现有大模型应用的执行链路。

但是目前 Langfuse 还处于快速迭代中,自动化测评的集成还不是很完善,需要自己做必要的代码开发,才能真正满足全自动化测试的需求。但是整体而言,在 Dify 应用中,Langfuse 还是一个不错的选择,推荐大家尝试一下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2137295.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java计算机毕设课设—户籍管理系统(附源码、文章、相关截图、部署视频)

这是什么系统&#xff1f; 资源获取方式在最下方 java计算机毕设课设—户籍管理系统(附源码、文章、相关截图、部署视频) 户籍管理系统旨在管理户籍信息和身份证服务&#xff0c;系统分为前台信息展示与后台数据处理两大模块&#xff0c;结合功能性需求与非功能性需求以确保…

基于.NET的土特产销售系统—计算机毕业设计源码27155

摘要 随着Internet技术的发展&#xff0c;土特产销售系统应运而生&#xff0c;土特产销售系统为广大提供了一个更为便利的商品查询、购买、管理平台。为了充分满足用户在线购买土特产的需求&#xff0c;特开发了本土特产销售系统。 本土特产销售系统的开发采用的是C#语言&#…

Python 数学建模——傅里叶变换时间序列分析

文章目录 前言原理Python 库函数实现单周期函数多周期函数真实数据挑战 前言 在数学建模过程中&#xff0c;得到一个序列 x 1 , ⋯ , x n x_1,\cdots,x_n x1​,⋯,xn​&#xff0c;我们首先要进行数据分析&#xff0c;其中就包括分析数据的周期性。这里的周期性不是数学上严格…

升级VMware

1、vm17pro安装包 VMware Workstation 17 Pro软件下载&#xff1a; 官网下载&#xff1a;Download VMware Workstation Pro 2、点击下一步更改地址 3、注册码 VMware Workstation 17 Pro注册码&#xff1a; 4A4RR-813DK-M81A9-4U35H-06KND 4、打开虚拟机 注&#xff1a; 升…

Oracle 11gR2打PSU补丁详细教程

1 说明 Oracle的PSU&#xff08;Patch Set Update&#xff09;补丁是Oracle公司为了其数据库产品定期发布的更新包&#xff0c;通常每季度发布一次。PSU包含了该季度内收集的一系列安全更新&#xff08;CPU&#xff1a;Critical Patch Update&#xff09;以及一些重要的错误修…

集群聊天服务器项目【C++】(四)cmake介绍和简单使用

我们上次用shell命令和vscode编译链接muduo库服务端代码&#xff0c;本章节实现编写CMakeLists.txt来编译项目。本次简单介绍CMake&#xff0c;并用Cmake编译上次的muduo服务器代码。 1.为什么使用cmake 我们在编译项目时&#xff0c;如果编写Makefile的话&#xff0c;常常会…

大数据处理技术:MapReduce综合实训

目录 1 实验名称 2 实验目的 3 实验内容 4 实验原理 5 实验过程或源代码 5.1 WordCount词频统计 5.2 HDFS文件读写 5.3 倒排索引 5.4 网页排序——PageRank算法 6 实验结果 6.1 WordCount词频统计 6.2 HDFS文件读写 6.3 倒排索引 6.4 网页排序——PageRank算法 1…

无人机飞手教员组装、调试高级教学详解

随着无人机技术的飞速发展&#xff0c;其在航拍、农业、救援、监测等多个领域的应用日益广泛&#xff0c;对专业无人机飞手的需求也随之增加。作为无人机飞手教员&#xff0c;掌握无人机的高级组装、调试技能不仅是教学的基础&#xff0c;更是培养学生成为行业精英的关键。本教…

面试官问:你为什么对这个职位感兴趣?

当面试官问到你为什么对某个职位感兴趣时&#xff0c;你的回答应该反映出你对该职位的热情&#xff0c;以及你如何能够为公司带来价值。 重点&#xff1a;在面试前一定要去研究下这家公司&#xff0c;包括他们的团队&#xff0c;文化&#xff0c;产品&#xff0c;服务等各个方…

SOMEIP_ETS_109: SD_Do_not_specify_a_port

测试目的&#xff1a; 验证DUT能够拒绝不包含端口号&#xff08;端口号为0&#xff09;的SubscribeEventgroup消息。 描述 本测试用例旨在确保DUT遵循SOME/IP协议&#xff0c;当接收到没有指定端口的SubscribeEventgroup消息时&#xff0c;能够正确地拒绝该订阅尝试。 测试…

单链表各种接口的实现(C)

顺序表的优缺点 顺序表的问题 头部和中部的插入删除效率都不行&#xff0c; O ( N ) O(N) O(N)空间不够了&#xff0c;扩容有一定消耗&#xff08;尤其是异地扩容&#xff09;开新空间&#xff0c;拷贝数据&#xff0c;释放旧空间扩容逻辑&#xff0c;可能还存在空间浪费 多扩…

Springboot项目总结

1.为了调用写在其他包里面的类的方法 但是不使用new来实现调用这个类里面的方法&#xff0c;这个时候我们就需要将这个类注入到ioc容器里面&#xff0c;通过ioc容器来实现自动生成一个对象。 对ioc容器的理解&#xff1a;自动将一个对象实现new. 考察了and 和 or组合使用&…

vscode技巧-eslint配置

开发环境 jsvue3axios 下载插件 Eslint、Prettfier 配置过程 1.配置eslint 进入settings&#xff0c;输入eslint&#xff0c;在settings.json中替换一下文件 // #每次保存的时候自动格式化 {"editor.codeActionsOnSave": {"source.fixAll.eslint": &…

海康威视摄像机和录像机的监控与回放

文章目录 海康威视摄像机和录像机的监控与回放1、海康威视监控设备简介1.1、摄像机二次开发1.1.1&#xff1a;协议选择1.1.2&#xff1a;ffmpeg软件转流 2、各种流媒体协议介绍2.1&#xff1a;流媒体协议介绍2.1.1&#xff1a;RTSP (实时流传输协议)2.1.2&#xff1a;RTMP (实时…

Java语言程序设计基础篇_编程练习题**18.26 (创建一个迷宫)

目录 题目&#xff1a;**18.26 (创建一个迷宫) 习题思路 代码示例 输出结果 题目&#xff1a;**18.26 (创建一个迷宫) 编写一个程序&#xff0c;在迷宫中寻找一条路径&#xff0c;如图18-13a所示。该迷宫由一个8 x 8 的棋盘表示。路径必须满足下列条件&#xff1a; 路径在迷…

日志收集工具 Fluentd vs Fluent Bit 的区别

参考链接&#xff1a; FluentdFluentd BitFluentd & Fluent Bit | Fluent Bit: Official Manual Fluentd 与 Fluent Bit 两者都是生产级遥测生态系统&#xff01; 遥测数据处理可能很复杂&#xff0c;尤其是在大规模处理时。这就是创建 Fluentd 的原因。 Fluentd 不仅仅是…

国产化中间件正在侵蚀开源中间件

开源中间件的发展趋势表明&#xff0c;它们将继续在技术创新和生态建设中发挥重要作用&#xff0c;尤其是在云计算、大数据等新兴技术领域。开源中间件如Apache Kafka、RabbitMQ、ActiveMQ和RocketMQ等在市场上有着广泛的应用。它们在技术社区中得到了良好的支持&#xff0c;并…

k8s中控制器的使用

目录 一、什么是控制器 二、控制器常用类型 三、replicaset控制器 1、replicaset功能 2、replicaset参数说明 3、replicaset示例 四、deployment控制器 1、deployment控制器的功能 2、deployment控制器示例 &#xff08;1&#xff09;版本迭代 &#xff08;2&#x…

MySql的基础讲解

一、初识MySql 数据库&#xff1a;按照数据结构来组织、存储和管理数据的仓库&#xff1b;是一个长期存储在计算机内的、有组织的、可共享 的、统一管理的大量数据的集合&#xff1b; OLTP&#xff1a;联机事务处理&#xff0c;主要是对数据库的增删改查。 OLTP 主要用来记录…

【研赛论文】数学建模2024华为杯论文word/latex模板

国赛结束&#xff0c;研究生瞩目的研赛马上就要来了&#xff0c;相信研究生同学也是在努力的准备当中&#xff0c;在这里祝愿大家能够获得一个好的名次。一举冲出重围&#xff0c;拿下国奖。在数模比赛当中&#xff0c;论文是参赛者唯一能够与评阅老师进行沟通的方式&#xff0…