当前位置: 首页 > news >正文

开源模型应用落地-LangSmith试炼-入门初体验-数据集评估(三)

一、前言

    LangSmith是一个用于构建生产级 LLM 应用程序的平台,它提供了调试、测试、评估和监控基于任何 LLM 框架构建的链和智能代理的功能,并能与LangChain无缝集成。通过使用LangSmith帮助开发者深入了解模型在不同场景下的表现,让开发者能够更高效地进行模型相关的开发、调试和管理。

    本篇将学习 Evaluate 功能,主要用于评估和衡量在多样化数据上的性能和完整性。它提供了集成的评估和追踪框架,允许用户检查回归问题、比较系统,并轻松识别和修复错误来源及性能问题。


二、术语

2.1.LangChain

    是一个全方位的、基于大语言模型这种预测能力的应用开发工具。LangChain的预构建链功能,就像乐高积木一样,无论你是新手还是经验丰富的开发者,都可以选择适合自己的部分快速构建项目。对于希望进行更深入工作的开发者,LangChain提供的模块化组件则允许你根据自己的需求定制和创建应用中的功能链条。

    LangChain本质上就是对各种大模型提供的API的套壳,是为了方便我们使用这些 API,搭建起来的一些框架、模块和接口。

   LangChain的主要特性:
        1.可以连接多种数据源,比如网页链接、本地PDF文件、向量数据库等
        2.允许语言模型与其环境交互
        3.封装了Model I/O(输入/输出)、Retrieval(检索器)、Memory(记忆)、Agents(决策和调度)等核心组件
        4.可以使用链的方式组装这些组件,以便最好地完成特定用例。
        5.围绕以上设计原则,LangChain解决了现在开发人工智能应用的一些切实痛点。

2.2.LangSmith

    是一个用于构建生产级 LLM 应用程序的平台,它提供了调试、测试、评估和监控基于任何 LLM 框架构建的链和智能代理的功能,并能与 LangChain 无缝集成。其主要作用包括:

  • 调试与测试:通过记录langchain构建的大模型应用的中间过程,开发者可以更好地调整提示词等中间过程,优化模型响应。
  • 评估应用效果:langsmith可以量化评估基于大模型的系统的效果,帮助开发者发现潜在问题并进行优化。
  • 监控应用性能:实时监控应用程序的运行情况,及时发现异常和错误,确保其稳定性和可靠性。
  • 数据管理与分析:对大语言模型此次的运行的输入与输出进行存储和分析,以便开发者更好地理解模型行为和优化应用。
  • 团队协作:支持团队成员之间的协作,方便共享和讨论提示模板等。
  • 可扩展性与维护性:设计时考虑了应用程序的可扩展性和长期维护,允许开发者构建可成长的系统。

2.3.LangChain和LangSmith的关系

        LangSmith是LangChain的一个子产品,是一个大模型应用开发平台。它提供了从原型到生产的全流程工具和服务,帮助开发者构建、测试、评估和监控基于LangChain或其他 LLM 框架的应用程序。

        LangSmith与LangChain 的关系可以概括为:LangChain是一个开源集成开发框架,而 LangSmith是基于LangChain 构建的一个用于大模型应用开发的平台。


三、前提条件

3.1.安装虚拟环境

conda create --name langsmith python=3.10
conda activate langsmith
pip install -U langsmith -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install openai -i https://pypi.tuna.tsinghua.edu.cn/simple

3.2.创建API key

操作入口:LangSmithhttps://smith.langchain.com/settings未登录的需要先进行登录:

登录成功:

点击Settings:

点击Create API Key:

记录API Key:

3.3.设置环境变量

windows:

linux:

export LANGCHAIN_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

ps:

1.需要替换3.2创建的API Key

3.4.生成样例数据

建议使用GPT去生成,例如:输入“请生成10条酒店的评论,需要包含好评和差评的标识,数据以JSON格式返回,具体参见示例:{"comment":"这个酒店设施太老旧,房间有异味,下次都不来了","reviews":"差评"}

[
{
"comment": "这家酒店环境很好,交通便利,服务员非常友好,下次还会来!",
"reviews": "好评"
},
{
"comment": "房间虽小但很干净整洁,性价比很高,下次还会选择这里。",
"reviews": "好评"
},
{
"comment": "酒店的游泳池和健身房设施一流,住宿体验非常棒,下次有机会一定再来。",
"reviews": "好评"
},
{
"comment": "早餐种类很丰富,味道也不错,服务态度很好,对得起这个价格。",
"reviews": "好评"
},
{
"comment": "酒店位置非常优越,临近著名景点,出行非常方便,下次有机会一定会再入住。",
"reviews": "好评"
},
{
"comment": "房间设施有些陈旧,卫生情况一般,不太符合我的预期,下次不会再选择这里。",
"reviews": "差评"
},
{
"comment": "服务员的态度不太友好,办理入住和退房的效率也比较低下,不太满意。",
"reviews": "差评"
},
{
"comment": "酒店停车场收费很高,且位置不太好找,感觉性价比不太高,不会再来了。",
"reviews": "差评"
},
{
"comment": "房间隔音效果很差,能听到走廊和邻居的声音,影响睡眠质量,希望能够改进。",
"reviews": "差评"
},
{
"comment": "酒店餐厅的菜品种类和口味都一般,性价比不高,下次不会再选择这里。",
"reviews": "差评"
}
]


四、技术实现

4.1.准备数据集

# -*-  coding = utf-8 -*-
import osfrom langsmith import Client
from langsmith import schemas as ls_schemasos.environ['LANGCHAIN_TRACING_V2'] = 'true'
os.environ['LANGCHAIN_API_KEY'] = 'lsv2_pt_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'if __name__ == '__main__':# 初始化数据from langsmith import Clientfrom langsmith import schemas as ls_schemasclient = Client()# Create a datasetexamples = [{"comment": "这家酒店环境很好,交通便利,服务员非常友好,下次还会来!","reviews": "好评"},{"comment": "房间虽小但很干净整洁,性价比很高,下次还会选择这里。","reviews": "好评"},{"comment": "酒店的游泳池和健身房设施一流,住宿体验非常棒,下次有机会一定再来。","reviews": "好评"},{"comment": "早餐种类很丰富,味道也不错,服务态度很好,对得起这个价格。","reviews": "好评"},{"comment": "酒店位置非常优越,临近著名景点,出行非常方便,下次有机会一定会再入住。","reviews": "好评"},{"comment": "房间设施有些陈旧,卫生情况一般,不太符合我的预期,下次不会再选择这里。","reviews": "差评"},{"comment": "服务员的态度不太友好,办理入住和退房的效率也比较低下,不太满意。","reviews": "差评"},{"comment": "酒店停车场收费很高,且位置不太好找,感觉性价比不太高,不会再来了。","reviews": "差评"},{"comment": "房间隔音效果很差,能听到走廊和邻居的声音,影响睡眠质量,希望能够改进。","reviews": "差评"},{"comment": "酒店餐厅的菜品种类和口味都一般,性价比不高,下次不会再选择这里。","reviews": "差评"}]dataset_name = "Comment Queries"dataset = client.create_dataset(dataset_name=dataset_name, data_type=ls_schemas.DataType.kv)inputs=[]outputs=[]for example in examples:inputs.append({'comment':example['comment']})outputs.append({'reviews':example['reviews']})client.create_examples(inputs=inputs, outputs=outputs, dataset_id=dataset.id)

调用结果:

4.2.定义目标任务

openai = wrappers.wrap_openai(Client())@traceabledef label_text(text):messages = [{"role": "system","content": "请分析下面的用户评论,并确定它是积极还是消极。如果是积极,用“好评”回答,如果是消极,用“差评”回答。",},{"role": "user", "content": text},]result = openai.chat.completions.create(messages=messages, model="gpt-3.5-turbo", temperature=0)return result.choices[0].message.content

4.3.配置评估器对输出进行评分,运行评估并查看结果

# 配置评估器对输出进行评分
def correct_label(root_run: Run, example: Example) -> dict:score = root_run.outputs.get("output") == example.outputs.get("reviews")return {"score": int(score), "key": "correct_label"}dataset_name = "Comment Queries"# 运行评估并查看结果
results = evaluate(lambda inputs: label_text(inputs["comment"]),data=dataset_name,evaluators=[correct_label],experiment_prefix="Comment Queries",description="Testing the baseline system.",  # optional
)

调用结果:

IDEA输出:

LangSmith 控制输出:

结论:

上面运行的10个样本数据中,有4个模型的输出结果跟预期不一致(期望输出“差评”,实际输出“差评。”),所以正确率为60%。

4.4.代码优化

在上一步评估测试后,正确率只有60%,接下来,尝试优化代码,再次进行评估。

我们修改System Prompt,改为:“请分析下面的用户评论,并确定它是积极还是消极。如果是积极,只需要回答“好评”两字,如果是消极,只需要回答“差评”两字。

@traceable
def label_text(text):messages = [{"role": "system","content": "请分析下面的用户评论,并确定它是积极还是消极。如果是积极,只需要回答“好评”两字,如果是消极,只需要回答“差评”两字。",},{"role": "user", "content": text},]result = openai.chat.completions.create(messages=messages, model="gpt-3.5-turbo", temperature=0)return result.choices[0].message.content

调用结果:

IDEA输出:

LangSmith 控制输出:

结论:

上面运行的10个样本数据中,所有输出结果跟预期一致,准确率100%。


五、附带说明

5.1. 如何查看数据下不同的实验结果

5.2. 数据集备选方案

除了按照4.1.准备数据集以外,还可以选用已有的数据集,具体参见:

开源模型应用落地-LangSmith试炼-入门初体验-数据集管理(二)-CSDN博客

5.3. 完整代码

# -*-  coding = utf-8 -*-
import os
from langsmith import wrappers, traceable
from langsmith.schemas import Example, Run
from langsmith.evaluation import evaluate
from openai import Clientos.environ["OPENAI_API_KEY"] = 'sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
os.environ['LANGCHAIN_TRACING_V2'] = 'true'
os.environ['LANGCHAIN_API_KEY'] = 'lsv2_pt_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'if __name__ == '__main__':# 初始化数据# from langsmith import Client# from langsmith import schemas as ls_schemas# client = Client()## # Create a dataset# examples = [#     {#         "comment": "房间宽敞明亮,设施很新,服务态度也很好,下次还会来!",#         "reviews": "positive"#     },#     {#         "comment": "我预定的房间竟然被打包了,前台也没有解决,太令人失望了。",#         "reviews": "negative"#     },#     {#         "comment": "游泳池很干净,健身房设施齐全,总的来说是个不错的酒店。",#         "reviews": "positive"#     },#     {#         "comment": "房间有些陈旧,床垫也有些许问题,不太舒服。",#         "reviews": "negative"#     },#     {#         "comment": "酒店位置很好,离市中心很近,交通很方便,值得推荐。",#         "reviews": "positive"#     },#     {#         "comment": "我订的双人间竟然只给安排了单人房,太不专业了。",#         "reviews": "negative"#     },#     {#         "comment": "餐厅的菜品很丰富,味道不错,早餐种类也很多,很满意。",#         "reviews": "positive"#     },#     {#         "comment": "酒店走廊一直有一股怪味,让人感觉不太干净。",#         "reviews": "negative"#     },#     {#         "comment": "前台服务人员很热情友好,贴心解决了我的问题,很满意。",#         "reviews": "positive"#     },#     {#         "comment": "这个酒店隔音效果太差,晚上睡觉都会被吵醒。",#         "reviews": "negative"#     }# ]## dataset_name = "Comment Queries"# dataset = client.create_dataset(dataset_name=dataset_name, data_type=ls_schemas.DataType.kv)## inputs=[]# outputs=[]# for example in examples:#     inputs.append({'comment':example['comment']})#     outputs.append({'reviews':example['reviews']})## client.create_examples(inputs=inputs, outputs=outputs, dataset_id=dataset.id)openai = wrappers.wrap_openai(Client())@traceabledef label_text(text):messages = [{"role": "system","content": "请分析下面的用户评论,并确定它是正面评价还是负面评价。如果是正面评价,用“positive”回答,如果是负面评价,用“negative”回答。",},{"role": "user", "content": text},]result = openai.chat.completions.create(messages=messages, model="gpt-3.5-turbo", temperature=0)return result.choices[0].message.contentdef correct_label(root_run: Run, example: Example) -> dict:score = root_run.outputs.get("output") == example.outputs.get("reviews")return {"score": int(score), "key": "correct_label"}dataset_name = "Comment Queries"results = evaluate(lambda inputs: label_text(inputs["comment"]),data=dataset_name,evaluators=[correct_label],experiment_prefix="Comment Queries",description="Testing the baseline system.",  # optional)

相关文章:

开源模型应用落地-LangSmith试炼-入门初体验-数据集评估(三)

一、前言 LangSmith是一个用于构建生产级 LLM 应用程序的平台,它提供了调试、测试、评估和监控基于任何 LLM 框架构建的链和智能代理的功能,并能与LangChain无缝集成。通过使用LangSmith帮助开发者深入了解模型在不同场景下的表现,让开发者能…...

设计模式 15 Decorator Pattern 装饰器模式

设计模式 15 Decorator Pattern 装饰器模式 1.定义 Decorator Pattern 装饰器模式是一种结构型设计模式,它允许在运行时给对象添加新的行为或职责,而无需修改对象的源代码。这种模式通过创建一个包装对象,也称为装饰器,来包裹原…...

cuda11.8安装torch2.0.1

pip install torch2.0.1 torchvision0.15.2 torchaudio2.0.2 --index-url https://download.pytorch.org/whl/cu118...

新手困 ViewModel与Activting的databinding2个对象 区别

在Android开发中,ViewModel与Activity的Binding并不是同一个概念,它们分别指的是不同的功能和用途。 ViewModel: ViewModel是一个为UI界面提供数据的类,它负责管理Activity或Fragment的数据。ViewModel类持有数据的引用,即使配置…...

Cocos Creator 声音播放与管理详解

Cocos Creator 是一款非常流行的游戏开发引擎,它提供了丰富的功能和工具,让开发者可以轻松构建出高质量的游戏。在游戏开发中,声音是一个非常重要的元素,可以为游戏增添氛围和趣味性。在本文中,我们将详细介绍Cocos Cr…...

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 5月26日,星期日

每天一分钟,知晓天下事! 2024年5月26日 星期日 农历四月十九 1、 医保局:支持将符合条件的村卫生室纳入医保定点,方便农村居民就医。 2、 网传养老金储备严重不足?央视辟谣:这笔钱二十多年来从未动用过&a…...

IDEA快速生成类注释和方法注释的方法

1.生成类、接口、枚举、注解等文件的注释,不仅仅是class 2.生成方法注释的 可在方法上方空行输入/** 按enter键快速生成。生成的样式如下: PS:生成的返回值带一堆英文文字说明,感觉没必要 如果想生成比较全面的方法注释,如作者&…...

[集群聊天服务器]----(七)业务模块之一对一聊天、添加好友函数、好友类以及离线消息类

接着[集群聊天服务器]----(六)业务模块之用户注册、登录、退出以及客户端异常退出函数中对于业务模块的用户注册、登录、退出以及客户端异常退出函数的剖析,现在我们对点对点聊天以及添加好友的实现进行剖析。 点对点聊天 当客户端输入msgidONE_CHAT_MSG时&#x…...

java中使用jedis连接redis

4.java中使用jedis连接redis...

【多线程开发 2】从代码到实战TransmittableThreadLocal

【多线程开发 2】从代码到实战TransmittableThreadLocal 本文将从以下几个点讲解TransmittableThreadLocal(为了方便写以下简称ttl): 前身 是什么? 可以用来做什么? 源码原理 实战 前身 ThreadLocal 要了解ttl就要先了解Java自带的类…...

【车载以太网测试从入门到精通】——SOME/IP协议测试

系列文章目录 【车载以太网测试从入门到精通】系列文章目录汇总 文章目录 系列文章目录前言一、SOME/IP时间参数1.INITIAL_DELAY时间2.REPETITIONS_MAX次数3.REPETITIONS_BASE_DELAY时间4.CYCLIC_OFFER_DELAY时间5.TIME_TO_LIVE时间6.SUBSCRIBE_RETRY_DELAY时间二、SOME/IP服务…...

作业39 sqrt应用

目录 判断完全平方数 题目描述 输出所有因数 题目描述 因子求和 题目描述 判断素数 题目描述 判断完全平方数 题目描述 输入一个整数,判断他是否是完全平方数,如果是,输出yes,否则输出no 样例 样例…...

springboot 实现跨域的几种方式

1、跨域的原因: 由于同源策略(Same Origin Policy)的限制,浏览器不允许跨域请求。同源策略规定,A网页设置的Cookie、LocalStorage和IndexDB无法被同源以外的网页读取。 2、原因: 1)浏览器的同源策略(Same Origin Policy)限制了跨域请求。主要…...

springmvc Web上下文初始化

Web上下文初始化 web上下文与SerlvetContext的生命周期应该是相同的&#xff0c;springmvc中的web上下文初始化是由ContextLoaderListener来启动的 web上下文初始化流程 在web.xml中配置ContextLoaderListener <listener> <listener-class>org.springframework.…...

Verilog实战学习到RiscV - 2 : wire 和 reg 的区别

Verilog: wire 和 reg 的区别 1 引言 看Verilog例子过程中&#xff0c;总是分不清 wire 和 reg 的区别。这篇文章把两者放在一起总结一下&#xff0c;并且对比何时使用它们。 1.1 wire &#xff1a;组合逻辑 wire 是 Verilog 设计中的简单导线&#xff08;或任意宽度的总线…...

OpenGL给定直线起点和终点不同的颜色,使用中点Bresenham画线

用鼠标左键按下确定直线起点&#xff0c;鼠标左键抬起确定直线终点。放一部分代码。 // 中点Bresenham算法.cpp : 定义控制台应用程序的入口点。 //#include "stdafx.h" #include <GL/glut.h> #include <iostream> #include <cmath>int windowWidt…...

IT行业的现状与未来发展趋势:从云计算到量子计算的技术变革

随着技术的不断进步&#xff0c;IT行业已经成为推动全球经济和社会发展的关键力量。从云计算、大数据、人工智能到物联网、5G通信和区块链&#xff0c;这些技术正在重塑我们的生活和工作方式。本文将深入探讨当前IT行业的现状&#xff0c;并展望未来发展趋势&#xff0c;旨在为…...

电脑远程控制另一台电脑怎么弄?

可以远程控制另一台电脑吗&#xff1f; “你好&#xff0c;我对远程访问技术不太了解。现在&#xff0c;我希望我的朋友可以远程控制我的Windows 10电脑&#xff0c;以便她能帮我解决一些问题。请问&#xff0c;有没有免费的方法可以实现这种远程控制&#xff1f;我该如何操作…...

软件设计师备考 | 案例专题之面向对象设计 概念与例题

相关概念 关系 依赖&#xff1a;一个事物的语义依赖于另一个事物的语义的变化而变化 关联&#xff1a;一种结构关系&#xff0c;描述了一组链&#xff0c;链是对象之间的连接。分为组合和聚合&#xff0c;都是部分和整体的关系&#xff0c;其中组合事物之间关系更强。两个类之…...

UniApp 2.0可视化开发工具:引领前端开发新纪元

一、引言 在移动互联网迅猛发展的今天&#xff0c;移动应用开发已经成为前端开发的重要方向之一。为了简化移动应用开发流程&#xff0c;提高开发效率&#xff0c;各大开发平台不断推出新的工具和框架。UniApp作为一款跨平台的移动应用开发框架&#xff0c;自诞生以来就备受开…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API&#xff0c;让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API&#xff0c;你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...