使用LangSmith来快速学习LangChain

news2024/11/25 0:55:30

好风凭借力,送我上青云!

什么是LangSmith

LangSmith is a platform for building production-grade LLM applications.

It lets you debug, test, evaluate, and monitor chains and intelligent agents built on any LLM framework and seamlessly integrates with LangChain, the go-to open source framework for building with LLMs.

LangSmith is developed by LangChain, the company behind the open source LangChain framework.

LangSmith 是一个用于构建生产级 LLM 应用程序的平台。
它允许您调试、测试、评估和监控基于任何 LLM 框架构建的链和智能代理,并无缝集成 LangChain(用于构建 LLM 的首选开源框架)。
LangSmith 由 LangChain 开发,LangChain 是开源 LangChain 框架背后的公司。

LangSmith的目标很宏大,但是实际上还是处于早期阶段,目前最实用的功能还是调试、跟踪LangChain应用,但是单是这一项的价值都已经无可估量,可以大大缩减你学习LangChain的时间,提高用LangChain开发LLM应用的效率。

用LangChain来完成大语言模型的应用原型/代理很简单,但是,要交付实际的大语言应用异常困难:可能要大量定制、迭代Prompt、链和其他组件。LangSmith可以帮你快速调试链、代理或者一组工具,可视化各种组件(链、llms、检索器retrievers等)如何交互及使用,评估不同的Prompts等等。

注册与设置

注册

登录 https://smith.langchain.com/ 可以直接用Discord、GitHub、Google账号登录,也可以用自己邮箱注册。现在已经不需要邀请码。

生成API Key

在这里插入图片描述

注意生成Key的时候就复制下来,后面丢了就只能重新生成。

设置环境变量

Linux用下面的命令设置环境变量:

export LANGCHAIN_TRACING_V2=true
export LANGCHAIN_ENDPOINT="https://api.smith.langchain.com"
export LANGCHAIN_API_KEY="<your-api-key>"
export LANGCHAIN_PROJECT="langchain_for_llm_application_development"

Windows可以用下面的命令:

setx LANGCHAIN_TRACING_V2 true
setx LANGCHAIN_ENDPOINT "https://api.smith.langchain.com"
setx LANGCHAIN_API_KEY <your-api-key>
setx LANGCHAIN_PROJECT langchain_for_llm_application_development

LANGCHAIN_TRACING_V2是设置LangChain是否开启日志跟踪模式。

LANGCHAIN_PROJECT 是要跟踪的项目名称,如果LangSmith平台上还没有这个项目,会自动创建。如果不设置这个环境变量,会把相关信息写到default项目。这里的项目不一定要跟你实际的项目一一对应,可以理解为分类或者标签。你只要在运行某个应用前改变这一项,就会把相关的日志写到这个下面。可以按开发、生产环境分,也可以按日期分等等。

LANGCHAIN_API_KEY就是上面生成的LangSmith的key。

设置好环境变量就可以了,代码无需任何变动!完全没有侵入性的感觉真好。当然,如果要较真的话,引入LangChain的时候代码就已经侵入了,但是我们本来就要用LangChain,那就不用管这个了。

使用

我们可以使用LangSmith调试:出乎意料的最终结果、代理为何一直在循环、链为何比预期慢、代理使用了多少个令牌等等。

我们来看一个RouterChain的例子(源码来自黄佳老师的课程):

'''欢迎来到LangChain实战课
https://time.geekbang.org/column/intro/100617601
作者 黄佳'''
import warnings
warnings.filterwarnings('ignore')

# 设置OpenAI API密钥
# import os
# os.environ["OPENAI_API_KEY"] = 'Your Key'
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())  # read local .env file
from langchain.chat_models import AzureChatOpenAI

# 构建两个场景的模板
flower_care_template = """
你是一个经验丰富的园丁,擅长解答关于养花育花的问题。
下面是需要你来回答的问题:
{input}
"""

flower_deco_template = """
你是一位网红插花大师,擅长解答关于鲜花装饰的问题。
下面是需要你来回答的问题:
{input}
"""

# 构建提示信息
prompt_infos = [
    {
        "key": "flower_care",
        "description": "适合回答关于鲜花护理的问题",
        "template": flower_care_template,
    },
    {
        "key": "flower_decoration",
        "description": "适合回答关于鲜花装饰的问题",
        "template": flower_deco_template,
    }
]

# 初始化语言模型
# from langchain.llms import OpenAI
# llm = OpenAI()
llm = AzureChatOpenAI(deployment_name="GPT-4", temperature=0)

# 构建目标链
from langchain.chains.llm import LLMChain
from langchain.prompts import PromptTemplate

chain_map = {}

for info in prompt_infos:
    prompt = PromptTemplate(
        template=info['template'],
        input_variables=["input"]
    )
    print("目标提示:\n", prompt)
    
    chain = LLMChain(
        llm=llm,
        prompt=prompt,
        verbose=True
    )
    chain_map[info["key"]] = chain

# 构建路由链
from langchain.chains.router.llm_router import LLMRouterChain, RouterOutputParser
from langchain.chains.router.multi_prompt_prompt import MULTI_PROMPT_ROUTER_TEMPLATE as RounterTemplate

destinations = [f"{p['key']}: {p['description']}" for p in prompt_infos]
router_template = RounterTemplate.format(destinations="\n".join(destinations))
print("路由模板:\n", router_template)

router_prompt = PromptTemplate(
    template=router_template,
    input_variables=["input"],
    output_parser=RouterOutputParser(),
)
print("路由提示:\n", router_prompt)

router_chain = LLMRouterChain.from_llm(
    llm,
    router_prompt,
    verbose=True
)

# 构建默认链
from langchain.chains import ConversationChain
default_chain = ConversationChain(
    llm=llm,
    output_key="text",
    verbose=True
)

# 构建多提示链
from langchain.chains.router import MultiPromptChain

chain = MultiPromptChain(
    router_chain=router_chain,
    destination_chains=chain_map,
    default_chain=default_chain,
    verbose=True
)

# 测试1
print(chain.run("如何为玫瑰浇水?"))

虽然黄佳老师加了很多print输出信息,但是代码的逻辑还是不容易看清楚。

查看运行情况

运行一次上面的程序,然后打开LangSmith,找到最近一次的运行:
在这里插入图片描述

从图中,我们可以很直观的看到LangChain组件的调用顺序(如果有用过微服务的Zipkin,对这个界面应该不陌生)、每一步耗费的时间、调用OpenAI消耗的Token数。

使用Playground

面向LLM编程,很多时候就是要迭代Prompt。在LangSmith里除了可以直接看到输入给LLM的Prompt和输出结果,更方便的是里面还集成了Playground,可以直接修改Prompt来看输出的结果。

点击上图右上角的Playground,进去后你会发现你调用LLM的各种参数、Prompt都帮你设置好了(OpenAI的Key还要设置,只保存在本地浏览器)。

这样,你就可以修改你的Prompt,重新运行,观察Prompt改变引起的结果变化。

在Playground里执行的过程会记录到“playground”这个项目。
在这里插入图片描述

添加到数据集

在查看运行情况的界面,点击右上角的“Add to Dataset”,可以把对应的输入、输出添加到数据集,后面大模型或者Prompt有了调整,可以用数据集来测试、评估。
在这里插入图片描述

Hub

LangSmith里面还有一个有趣的功能是Hub。在Hub里,可以发现、分享和对Prompt进行版本控制。Hub感觉是借用GitHub的概念,也可以叫PromptHub?

对别人分享出来的Prompt,你可以点爱心收藏(收藏了之后没找到相应的入口 😅),也可以Fork、试运行。
在这里插入图片描述

总的来说,LangSmith还处于快速开发的阶段(LangChain本身也才0.0.348版),某些功能还比较简陋。从另一方面来说,我们可以和它一起成长,更快速掌握LangChain,打造自己的LLM应用。

参考

  1. LangSmith文档:https://docs.smith.langchain.com/

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

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

相关文章

oracle12c的job没有自动执行,手动运行提示任务1%正在运行问题

有个oracle12c上的job&#xff0c;提交到dbms_job&#xff0c;不知道什么时候开始&#xff0c;停下来了&#xff0c;没有自动运行。 手动关闭这个job&#xff0c;重新打开&#xff0c;不行&#xff1b;删除JOB&#xff0c;重新创建&#xff0c;也不行。 参考拙作&#xff1a; …

Leetcode 39 组合总和

题意理解&#xff1a; 一个 无重复元素 的整数数组 candidates 和一个目标整数 target 从candidates 取数字&#xff0c;使其和 target &#xff0c;有多少种组合&#xff08;candidates 中的 同一个 数字可以 无限制重复被选取&#xff09; 这道题和之前一道组合的区别&am…

【USB、串口、COM口、TTL、RS-232、RS-485区别详解】

USB&#xff0c;串口&#xff0c;COM口&#xff0c;TTL&#xff0c;RS-232&#xff0c;RS-485区别详解 1. USB&#xff0c;串口&#xff0c;COM口&#xff0c;TTL&#xff0c;RS-232&#xff0c;RS-485区别详解2 USB转TTL2 RS-232转TTL3 USB4 UART5 STM32串口异步通讯需要定义的…

2024年AI视频识别技术的6大发展趋势预测

随着人工智能技术的快速发展&#xff0c;AI视频识别技术也将会得到进一步的发展和应用。2023年已经进入尾声&#xff0c;2024年即将来临&#xff0c;那么AI视频识别技术又将迎来怎样的发展趋势&#xff1f;本文将对2023年的AI视频技术做一个简单的盘点并对2024年的发展趋势进行…

c/c++中一些不常用但有用的知识

1.变长数组 bool fun(int cnt) {unsigned char data[cnt];return true; } 在 C 语言中&#xff0c;变长数组&#xff08;Variable Length Arrays&#xff0c;VLA&#xff09;是 C99 标准引入的特性&#xff0c;允许使用变量来定义数组的长度。因此&#xff0c;在 C 版本的代码…

Oauth2.0 认证

目录 前言 1.介绍 2.Oauth2.0过程详解 3.Oauth 整合到 Spring Boot 实践 4.方法及配置详解&#xff1a; 总结 前言 Oauth2.0 是非常流行的网络授权表准&#xff0c;已经广泛应用在全球范围内&#xff0c;比较大的公司&#xff0c;如腾讯等都有大量的应用场景。 1.介绍 …

Qt工程文件分离、Qtimer定时器、Qt Creator 常用快捷键

Qt 工程文件分离 不含 UI 的文件分离 以堆栈窗体的代码为例。 firstpagewidget.h #ifndef FIRSTPAGEWIDGET_H #define FIRSTPAGEWIDGET_H#include <QtWidgets> // 记得修改class firstPageWidget : public QWidget {Q_OBJECT public:explicit firstPageWidget(QW…

Python表单处理

目录 通过Flask处理表单 通过Flask-WTF处理表单 通过Flask-WTF验证表单 通过Flask处理表单 表单是在网页中搜集用户信息的各种表单控件的集合区域&#xff0c;表单控件包括文本框、单选框、复选框、提交按钮等&#xff0c;用于实现客户端和服务器端之间的数据交互。 利用F…

uniapp各种小程序分享 share - 主要流程 - 微信、抖音、快手、qq

参考 小程序环境 分享 | uni-app官网uni-app,uniCloud,serverless,分享,uni.share(OBJECT),分享到微信聊天界面示例代码,分享到微信朋友圈示例代码,uni.share 在App端各社交平台分享配置说明,uni.shareWithSystem(OBJECT),plus.share.sendWithhttps://uniapp.dcloud.net.cn/a…

监控pod 容器外网请求网络带宽,过滤掉内网、基于k8spacket开发

首先安装k8spacket 安装k8spacket遇到问题&#xff0c;下载插件一直能不能下载成功&#xff0c;pod不能启动。所有手动下载处理。 helm repo add k8spacket https://k8spacket.github.io/k8spacket-helm-chart helm pull k8spacket/k8spacket打开values.yaml 文件 手动下载插…

机器视觉相机镜头光源选型

镜头选型工具 - HiTools - 海康威视 Hikvisionhttps://www.hikvision.com/cn/support/tools/hitools/cl8a9de13648c56d7f/ 海康机器人-机器视觉产品页杭州海康机器人股份有限公司海康机器人HIKROBOT是面向全球的机器视觉和移动机器人产品及解决方案提供商&#xff0c;业务聚焦于…

HCIP —— BGP 基础 (下)

BGP 的状态机 --- 建立对等体之间的TCP会话&#xff1a;指定建立对等体的对象 六种状态机 Idle状态 Idle 等待状态&#xff08;相当于OSPF的down状态&#xff09;--- 采用TCP单播建邻 Idle 状态下&#xff0c;启动BGP协议后必须指定建立对等体的目标之后&#xff0c;才能进入…

【vSphere | VM】虚拟机自定义规范Ⅲ —— 创建 Linux 虚拟机自定义规范

目录 4. 创建关于Linux系统的虚拟机自定义规范4.1 新建 Linux 虚拟机自定义规范&#xff08;1&#xff09;名称和目标操作系统&#xff08;2&#xff09;计算机名称&#xff08;3&#xff09;时区&#xff08;4&#xff09;自定义脚本&#xff08;5&#xff09;网络&#xff08…

shell脚本发邮件

首先下载mailx [rootemail ~]# yum -y install mailx 修改配置文件 [rootemail ~]# vim /etc/mail.rc set from2760592774qq.com #你的QQ邮箱或者网易邮箱其他邮箱 set smtpsmtp.qq.com #QQ邮箱就写这个&#xff0c;网易邮箱写smtp.163.com set smtp-auth-user27605927…

微型5G智能网关助力打造智能清洁机器人

智能机器人不断融入我们的生活&#xff0c;提供了越来越多样化的服务&#xff0c;例如专用于卫生清洁的机器人&#xff0c;就已经广泛应用于酒店、体育馆、大型商场、写字楼、工地等各种场景&#xff0c;相较于人工&#xff0c;机器人在此类具有高度重复性、劳动量大的工作中具…

WMS条码扫描管理:实现仓库管理的高效与精准

随着企业运营的日益复杂化&#xff0c;仓库管理系统&#xff08;WMS&#xff09;已成为许多企业实现物流和供应链优化的关键工具。其中&#xff0c;条码扫描管理是WMS系统的重要组成部分&#xff0c;它对于提高仓库操作效率、增强库存准确性以及优化整体运营具有显著意义。本文…

GPT-4V 在机器人领域的应用

在科技的浩渺宇宙中&#xff0c;OpenAI如一颗璀璨的星辰&#xff0c;于2023年9月25日&#xff0c;以一种全新的方式&#xff0c;向世界揭示了其最新的人工智能力作——GPT-4V模型。这次升级&#xff0c;为其旗下的聊天机器人ChatGPT装配了语音和图像的新功能&#xff0c;使得用…

EMC VNX Unified存储NAS控制台常见问题解答

每次遇到VNX unfied的case就是一坨屎&#xff0c;很多客户根本不理解什么是Unifed storage&#xff0c;EMC的Clariion中端存储系统还分Block和Unified的产品。这个blog就是简单介绍一下VNX Unified存储的管理控制台&#xff0c;英文是 control station, 简称为CS。 顾名思义&a…

vivado时序方法检查10

TIMING-41 &#xff1a; 内部管脚上定义的前向时钟无效 前向时钟 <clock_group> 是在管脚 <netlist_element> 上定义的 &#xff0c; 而不是在端口 <netlist_element> 上定义的。 描述 前向时钟是在连接到输出端口的叶节点管脚上定义的 &#xff0c…

【python可视化系统源码】基于爬虫与可视化的电影推荐系统课题背景、目的、意义、研究思路、研究方法

该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等学习内容。 目录 一、项目介绍&#xff1a; 二、文档学习资料&#xff1a; 三、模块截图&#xff1a; 四、开发技术与运行环境&#xff1a; 五、代码展示&#xff1a; 六、数据库表截图&#xff1a…