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

news2024/10/5 16:45:43

一、前言

    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 os

from langsmith import Client
from langsmith import schemas as ls_schemas

os.environ['LANGCHAIN_TRACING_V2'] = 'true'
os.environ['LANGCHAIN_API_KEY'] = 'lsv2_pt_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

if __name__ == '__main__':

    # 初始化数据
    from langsmith import Client
    from langsmith import schemas as ls_schemas
    client = Client()

    # Create a dataset
    examples = [
        {
        "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())

    @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

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 Client

os.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())

    @traceable
    def 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.content


    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
    )

    

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

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

相关文章

论文阅读_管理模型的记忆_MemGPT

1 2 3 4 5 6 7 8 9英文名称: MemGPT: Towards LLMs as Operating Systems 中文名称: MemGPT:将LLMs打造成操作系统 链接: https://arxiv.org/abs/2310.08560 代码: https://github.com/cpacker/MemGPT 作者: Charles Packer, Sarah Wooders, Kevin Lin, Vivian Fang…

推荐10款优秀的组件库(一)

1.Ant Desgin UI 网址: https://ant-design-mobile.antgroup.com/zh Ant Design - 一套企业级 UI 设计语言和 React 组件库 "Ant Design Mobile"是一个在线的移动端Web体验平台,让你探索移动端Web的体验极限。 添加图片注释,不…

安全设计 | 安全设计不得马虎!微软STRIDE威胁建模方法让你事半功倍,快速发现应用安全隐患!

STRIDE威胁建模方法最早发表于2006年11月的《MSDN杂志》,作者是微软的工程师Shawn Hernan、Scott Lambert 、Tomasz Ostwald 和 Adam Shostack。那我们为什么要进行威胁建模? 如何使用数据流图对系统进行威胁建模?如何减轻威胁?接…

STM32F1之OV7725摄像头

目录 1. 摄像头简介 2. OV7725 摄像头简介 3. OV7725 引脚 4. OV7725 功能框架图 5. SCCB时序 5.1 SCCB 的起始、停止信号及数据有效性 5.2 SCCB 数据读写过程 1. 摄像头简介 在各类信息中,图像含有最丰富的信息,作为机…

从0开始学统计-蒙彼利埃尔悖论与条件概率

1.什么叫均衡可比? "均衡可比"指的是在进行比较时,确保所比较的对象或情况具有相似的特征和条件,以保持比较的公正性和准确性。这个概念通常应用于研究设计和数据分析中,以确保比较结果的可信度和有效性。 在研究中&a…

HTML静态网页成品作业(HTML+CSS)——企业酒店官网网页(5个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有5个页面。 二、作品演示 三、代…

SpringCloud系列(26)--OpenFeign超时控制

前言:在上一章节中我们简单的介绍了如何使用OprnFeign去调用微服务,因为消费侧和服务侧是两个不同的微服务,这样可能会出现超时的现象,例如服务侧需要3秒处理任何才能返回结果,但消费侧可能2秒就断开连接了&#xff0c…

C++代码错误解决1(函数模板)

1、代码如下 //示例函数模板的使用 #include <iostream> #include <string> using namespace std; template <typename T>//函数模板 T max(T a,T b) {return a>b?a:b; } int main() {int a,b;cout<<"input two integers to a&b:"…

文章解读与仿真程序复现思路——电力系统保护与控制EI\CSCD\北大核心《计及温控厌氧发酵和阶梯碳交易的农村综合能源低碳经济调度》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

如何处理时间序列的缺失数据

您是否应该删除、插入或估算&#xff1f; 世界上没有完美的数据集。每个数据科学家在数据探索过程中都会有这样的感觉&#xff1a; df.info()看到类似这样的内容&#xff1a; 大多数 ML 模型无法处理 NaN 或空值&#xff0c;因此如果您的特征或目标包含这些值&#xff0c;则在…

自己手写一个单向链表【C风格】

//单链表 #include <iostream> #define MAX_SIZE 20 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0typedef int ElemType;//元素的类型 typedef int Status;//返回状态typedef struct Node {ElemType data;//链表中保存的数据struct Node* next;//指向下…

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

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

自定义一个复杂的React Table表格组件-06

前面基本了解了组件的基本用法&#xff0c;在本节会实现一个更高级的例子。另外需要注意本节代码是采用V15版本的createClass()、React.DOM和JSX实现的&#xff0c;有时间的同学可以改成类实现的方式。 html的世界中最复杂的UI控制就是表格了&#xff0c;原因是table它依赖本地…

Vitis HLS 学习笔记--控制驱动TLP-处理deadlock

目录 1. 简介 2. 代码解析 2.1 HLS kernel代码 2.2 查看接口报告 2.3 TestBench 2.4 Dataflow 报告 3. Takeaways 4. 总结 1. 简介 本文是对《Hardware Acceleration Tutorials: FIFO Sizing for Performance and Avoiding Deadlocks》实验内容的详细解释。 首先需要…

AI视频教程下载:用提示工程在GPT商店构建10个GPTs

你将学到什么&#xff1f; 深入了解ChatGPT平台和GPT商店的生态系统。 开发为多样化应用定制GPT模型的专业知识。 掌握高效内容生成的AI自动化技术。 学习高级提示工程以优化ChatGPT输出。 获取构建AI驱动的数字营销和广告解决方案的技能。 了解如何为SEO写作和优化创建专…

从0开始学统计-多个婴儿连续夭折是谋杀吗?

1.什么是小概率事件&#xff1f; 小概率事件是指在一次随机试验中发生概率非常低的事件。一般来说&#xff0c;小概率事件的发生概率远低于一定的阈值&#xff0c;通常取0.05或0.01。在统计学中&#xff0c;这些阈值被称为显著性水平&#xff08;significance level&#xff0…

CIC滤波器

CIC滤波器结构简单&#xff0c;没有乘法器&#xff0c;只有加法器、积分器和寄存器&#xff0c;适合工作在高抽样率条件下&#xff0c;而且CIC滤波器是一种基于零点相消的FIR滤波器。 CIC滤波器分为单级和多级滤波器。 1.在单极滤波器中&#xff1a; 当CIC滤波器的长度M远大于…

【css3】04-css3转换

目录 1 2D转换 2 3D转换 3 案例&#xff1a;旋转的魔方 1 2D转换 ## 2D转换 ☞ 位移 transform: translate(100px,100px); 备注&#xff1a; 位移是相对元素自身的位置发生位置改变 ☞ 旋转 transform: rotate(60deg); 备注&am…

LabVIEW虚拟测试实验室开发

LabVIEW虚拟测试实验室开发 在当代的科技和工业进步中&#xff0c;测试与测量扮演着至关重要的角色。随着技术的发展&#xff0c;测试系统也变得日益复杂和成本昂贵&#xff0c;同时对测试结果的准确性和测试过程的效率要求越来越高。开发了一种基于LabVIEW的虚拟测试实验室的…

新能源汽车的电驱热管理

前言 新能源汽车的电驱热管理是指维持电动汽车电池、电机和电控系统在适宜的工作温度范围内&#xff0c;保障车辆高效、安全、稳定运行的技术方案。随着新能源汽车的快速发展和普及&#xff0c;电驱热管理技术也日益成为关注焦点。本文将从电池、电机和电控系统三个方面介绍新…