开源模型应用落地-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)

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

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

相关文章

webshell工具-冰蝎流量特征和加密方式

一、冰蝎原理 1.1 简介 冰蝎是一款基于Java开发的动态加密通信流量的新型Webshell客户端,由于通信流量被加密,传统的WAF、IDS 设备难以检测,给威胁狩猎带来较大挑战。冰蝎其最大特点就是对交互流量进行对称加密,且加密密钥是由随…

基于Ruoyi-Cloud-Plus重构黑马项目-学成在线

文章目录 一、系统介绍二、系统架构图三、参考教程四、演示图例机构端运营端用户端开发端 一、系统介绍 毕设:基于主流微服务技术栈的在线教育系统的设计与实现 前端仓库:https://github.com/Xiamu-ssr/Dragon-Edu-Vue3 后端仓库:https://g…

【NodeMCU实时天气时钟温湿度项目 9】为项目增加智能配网功能(和风天气版)

今天是第九专题,主要介绍智能配网的方法途径和具体实现。在项目开发和调试阶段,设置 WIFI 连接信息,通常是在项目中修改源程序代码完成的。项目调试完成后,客户应用环境中如何实现WIFI连接信息(ssid 和 password&#…

【基础详解】快速入门入门 SQLite数据可

简介 SQLite 是一个开源的嵌入式关系数据库,实现了自给自足的、无服务器的、配置无需的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库系统不同,比如 MySQL、PostgreSQL 等,SQLite 不需要在系统中设置…

Unity功能——设置Camera,实现玩家被攻击后晃动效果

一、方法说明: 来源:siki学院:Unity项目捕鱼达人,功能学习记录; 效果摘要:通过调整相机移动,视觉感觉玩家面板剧烈晃动,实现被boss攻击时的震动效果。 使用场景说明: …

通过继承React.Component创建React组件-5

在React中,V16版本之前有三种方式创建组件(createClass() 被删除了),之后只有两种方式创建组件。这两种方式的组件创建方式效果基本相同,但还是有一些区别,这两种方法在体如下: 本节先了解下用extnds Reac…

Java | Leetcode Java题解之第112题路径总和

题目: 题解: class Solution {public boolean hasPathSum(TreeNode root, int sum) {if (root null) {return false;}if (root.left null && root.right null) {return sum root.val;}return hasPathSum(root.left, sum - root.val) || has…

国内快速下载hugging face大模型的方法

由于众所周知的原因,从hugging face下载大模型比较困难,幸好国内有人做了镜像站,可以通过国内的镜像站进行快速下载,以下是配置方法。 我的系统是ubuntu 22,这里记录的方法只对debian/ubuntu有效。 git-lfs/INSTALLI…

信息系统项目管理师0130:工具与技术(8项目整合管理—8.7监控项目工作—8.7.2工具与技术)

点击查看专栏目录 文章目录 8.7.2 工具与技术8.7.2 工具与技术 专家判断监控项目工作过程中,应征求具备如下领域相关专业知识或接受过相关培训的个人或小组的意见,涉及的领域包括:挣值分析;数据的解释和情境化;持续时间和成本的估算技术;趋势分析;关于项目所在的行业以及…

【LSTM】LSTM cell的门结构学习笔记

文章目录 1. LSTM cell2. 门结构3. 门的公式4. 门的参数5. 重点关系厘清 1. LSTM cell 如文章 LSTM网络与参数学习笔记 中介绍, LSTM cell指的是一个包含隐藏层所有神经元的结构.但是LSTM门控单元的公式如何理解、门和LSTM cell神经元如何对应、门函数的参数维度、不同时间步不…

鸿蒙 DevEco Studio 3.1 Release 下载sdk报错的解决办法

鸿蒙 解决下载SDK报错的解决方法 最近在学习鸿蒙开发,以后也会记录一些关于鸿蒙相关的问题和解决方法,希望能帮助到大家。 总的来说一般有下面这样的报错 报错一: Components to install: - ArkTS 3.2.12.5 - System-image-phone 3.1.0.3…

leecode 1206|跳表的设计

跳表 跳表,一种链表数据结构,其增删改茶的效率能和平衡树相媲美 leecode1206 可以看上面的那个动画,动画效果很贴切。 我简单讲讲它的机制吧,每个节点不单单是一个,测试好几层,然后同一层的节点和统一节点…

Tomcat部署项目的方式

目录 1、Tomcat发布项目的方式 方式1: 直接把项目发布到webapps目录下 方式2:项目发布到ROOT目录 方式3:虚拟路径方式发布项目 方式4:(推荐)虚拟路径,另外的方式! 方式5:发布多个网站 1、…

掩码生成蒸馏——知识蒸馏

摘要 https://arxiv.org/pdf/2205.01529 知识蒸馏已成功应用于各种任务。当前的蒸馏算法通常通过模仿教师的输出来提高学生的性能。本文表明,教师还可以通过指导学生的特征恢复来提高学生的表示能力。从这一观点出发,我们提出了掩码生成蒸馏&#xff08…

【字典树(前缀树) 异或 离线查询】1707. 与数组中元素的最大异或值

本文涉及知识点 字典树(前缀树) 位运算 异或 离线查询 LeetCode1707. 与数组中元素的最大异或值 给你一个由非负整数组成的数组 nums 。另有一个查询数组 queries ,其中 queries[i] [xi, mi] 。 第 i 个查询的答案是 xi 和任何 nums 数组…

C++ | Leetcode C++题解之第97题交错字符串

题目&#xff1a; 题解&#xff1a; class Solution { public:bool isInterleave(string s1, string s2, string s3) {auto f vector <int> (s2.size() 1, false);int n s1.size(), m s2.size(), t s3.size();if (n m ! t) {return false;}f[0] true;for (int i …

264 基于matlab的自适应语音盲分离

基于matlab的自适应语音盲分离&#xff0c;当a和b同时对着传声器A,B说话且传声器靠得很近时&#xff0c;传声器A,B会同时接受到a和b的声音&#xff0c;即a和b产生了混叠干扰&#xff0c;此时通过自适应语音盲分离系统可以将a,b的声音分离开&#xff0c;使得一个信道只有一个人的…

2024.05.25学习记录

1、面经复习&#xff1a; JS异步进阶、vue-react-diff、vue-router模式、requestldleCallback、React Fiber 2、代码随想录刷题、动态规划 3、组件库使用storybook

python抽取pdf中的参考文献

想将一份 pdf 论文中的所有参考文献都提取出来&#xff0c;去掉不必要的换行&#xff0c;放入一个 text 文件&#xff0c;方便复制。其引用是 ieee 格式的&#xff0c;形如&#xff1a; 想要只在引用序号&#xff08;如 [3]&#xff09;前换行&#xff0c;其它换行都去掉&…

VTK 数据处理:特征边提取

VTK 数据处理&#xff1a;特征边提取 VTK 数据处理&#xff1a;特征边提取原理实例 1&#xff1a;边界边提取实例 2&#xff1a;模型特征边提取实例 3&#xff1a;利用 vtkFeatureEdges 提取的边界补洞实例 4&#xff1a;利用 vtkFillHolesFilter 补洞 VTK 数据处理&#xff1a…