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

背景介绍

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

然而常规 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 retasync 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.mzph.cn/news/879449.shtml

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

相关文章

python绘制3d建筑

import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d.art3d import Poly3DCollection# 随机生成建筑块数据 def generate_building_blocks(num_blocks, grid_size100, height_range(5, 50), base_size_range(10, 30)):buildings []for _ in range(…

sqli-labs靶场自动化利用工具——第1关

文章目录 概要整体架构流程技术细节执行效果小结 概要 Sqli-Labs靶场对于网安专业的学生或正在学习网安的朋友来说并不陌生&#xff0c;或者说已经很熟悉。那有没有朋友想过自己开发一个测试脚本能实现自动化化测试sqli-labs呢&#xff1f;可能有些人会说不是有sqlmap&#xf…

中国矿业大学《2023年868+2007年自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《25届中国矿业大学868自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2007年复试真题 2023年初试真题 Part1&#xff1a;完整版真题 2007年复试真题 2…

【Python基础】Python错误和异常处理(详细实例)

本文收录于 《Python编程入门》专栏&#xff0c;从零基础开始&#xff0c;分享一些Python编程基础知识&#xff0c;欢迎关注&#xff0c;谢谢&#xff01; 文章目录 一、前言二、Python中的错误类型三、Python异常处理机制3.1 try-except语句3.2 try-except-else语句3.3 try-fi…

TiDB 扩容过程中 PD 生成调度的原理及常见问题丨TiDB 扩缩容指南(一)

导读 作为一个分布式数据库&#xff0c;扩缩容是 TiDB 集群最常见的运维操作之一。本系列文章&#xff0c;我们将基于 v7.5.0 具体介绍扩缩容操作的具体原理、相关配置及常见问题的排查。 通常&#xff0c;我们根据当前资源状态来决定是否需要调整 TiKV 节点的规模&#xff0…

探索螺钉设计:部分螺纹与全螺纹,哪种更适合你的项目?

为什么有些螺钉有部分螺纹? 螺钉由头部、柄部和尖端组成&#xff0c;是世界上zui常用的紧固件之一。与螺栓一样&#xff0c;它们旨在将多个对象或表面连接在一起。但是&#xff0c;在比较不同类型的螺钉时&#xff0c;您可能会注意到其中一些都具有部分螺纹杆。 什么是螺柄&a…

Python | Leetcode Python题解之第397题整数替换

题目&#xff1a; 题解&#xff1a; class Solution:def integerReplacement(self, n: int) -> int:ans 0while n ! 1:if n % 2 0:ans 1n // 2elif n % 4 1:ans 2n // 2else:if n 3:ans 2n 1else:ans 2n n // 2 1return ans

Python_两个jpg图片文件名称互换

项目场景 处理Adobe Photoshop导出的两个切片的顺序错误问题 小编在进行图片切片处理的时候&#xff0c;发现用PS导出的切片顺序错误&#xff0c;例如用PS导出的切片分别为test_01.jpg&#xff0c;test_02.jpg&#xff0c;但实际的使用需求是将两个图片的顺序调换&#xff0c…

self-play RL学习笔记

让AI用随机的路径尝试新的任务&#xff0c;如果效果超预期&#xff0c;那就更新神经网络的权重&#xff0c;使得AI记住多使用这个成功的事件&#xff0c;再开始下一次的尝试。——llya Sutskever 这两天炸裂朋友圈的OpenAI草莓大模型o1和此前代码能力大幅升级的Claude 3.5&…

基于less和scss 循环生成css

效果 一、less代码 复制代码 item-count: 12; // 生成多少个 .item 类.item-loop(n) when (n > 0) {.icon{n} {background: url(../../assets/images/menu/icon{n}.png) no-repeat;background-size: 100% 100%;}.item-loop(n - 1);}.item-loop(item-count);二、scss代码 f…

【人工智能】Transformers之Pipeline(十七):文本分类(text-classification)

目录 一、引言 二、文本分类&#xff08;text-classification&#xff09; 2.1 概述 2.2 DistilBERT—BERT 的精简版&#xff1a;更小、更快、更便宜、更轻便 2.3 应用场景​​​​​​​ 2.4 pipeline参数 2.4.1 pipeline对象实例化参数 2.4.2 pipeline对象使用参数 …

【Hot100】LeetCode—287. 寻找重复数

目录 1- 思路题目识别快慢指针-类比链表判环 2- 实现⭐31. 下一个排列——题解思路 3- ACM 实现 原题链接&#xff1a;287. 寻找重复数 1- 思路 题目识别 识别1 &#xff1a;给定一个数组&#xff0c;寻找数组中的重复数。必须用 O(1) 的空间复杂度&#xff0c;且不能修改数组…

VMware Fusion Pro 13 Mac版虚拟机 安装Win11系统教程

Mac分享吧 文章目录 Win11安装完成&#xff0c;软件打开效果一、VMware安装Windows11虚拟机1️⃣&#xff1a;准备镜像2️⃣&#xff1a;创建虚拟机3️⃣&#xff1a;虚拟机设置4️⃣&#xff1a;安装虚拟机5️⃣&#xff1a;解决连不上网问题 安装完成&#xff01;&#xff0…

fuxa搭建与使用(web组态)

1. 安装Node.js -> npm安装 参考网址&#xff1a;https://blog.csdn.net/WHF__/article/details/129362462 一、安装运行 C:\WINDOWS\system32>node -v v20.17.0 C:\WINDOWS\system32>npm -v 10.8.2 二、环境配置 在安装路径&#xff08;D:\Program_Files\nodejs&a…

[数据集][目标检测]车油口挡板开关闭合检测数据集VOC+YOLO格式138张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;138 标注数量(xml文件个数)&#xff1a;138 标注数量(txt文件个数)&#xff1a;138 标注类别…

【2024.08】图模互补:知识图谱与大模型融合综述-笔记

阅读目的&#xff1a;假设已有一个知识图谱&#xff0c;如何利用图谱增强模型的问答&#xff0c;如何检索知识图谱、知识图谱与模型的文本如何相互交互、如何利用知识图谱增强模型回答的可解释性。 从综述中抽取感兴趣的论文进一步阅读。 来源&#xff1a;图模互补&#xff1…

Docker零基础入门

参考课程https://www.bilibili.com/video/BV1VC4y177re/?vd_source=b15169a302bee35f484245aecc69d4dd 参考书籍Docker 实践 - 面向 AI 开发人员的 Docker 实践 (dockerpractice.readthedocs.io) 1. 什么是Docker 1.1. Docker起源 随着计算机的发展,计算机上已经可以运行多…

CAN通讯常见错误纠正

CAN通讯常见错误 1.在使用CAN设备进行数据通讯时&#xff0c;有时候参数配置不当可能就会导致通讯的失败&#xff0c;如下图1所示&#xff0c;出现通信错误的原因是两个设备的波特率配置不一致导致。 图1 2.有时候在配置参数的时候&#xff0c;不能只关注波特率速度配置一致就…

Script-server: 一款开源的脚本管理工具,为你的Python脚本提供一个直观的 Web UI

在日常工作中&#xff0c;我们经常会使用各种脚本来自动化任务&#xff0c;提升效率。但传统的脚本管理方式往往伴随着一些困扰&#xff1a;复杂的命令行操作、难以理解的脚本参数、缺乏直观的反馈等等。这些问题&#xff0c;让原本应该便捷的脚本管理变得繁琐。 Script-server…

太速科技-基于XC7Z100+AD9361的双收双发无线电射频板卡

基于XC7Z100AD9361的双收双发无线电射频板卡 一、板卡概述 基于XC7Z100AD9361的双收双发无线电射频板卡是基于Xilinx ZYNQ FPGA和ADI的无线收发芯片AD9361开发的专用功能板卡&#xff0c;用于4G小基站&#xff0c;无线图传&#xff0c;数据收发等领域。 二、板卡…