使用LangSmith来快速学习LangChain

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

什么是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/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】——队列实现二叉树的功能

前言&#xff1a;二叉树的实现方式多种多样&#xff0c;有数组实现满二叉树&#xff0c;有链表实现完全二叉树&#xff0c;今天我们就用队列来实现二叉树。 创建二叉树&#xff1a; typedef int BTDataType; typedef struct BinaryTreeNode {BTDataType data;struct BinaryTre…

人工智能,不止于模型:四步实现完整工作流

工程师越来越多地致力于将人工智能 (AI) 集成到自己的项目和应用中&#xff0c;同时不断着力提升自己的 AI 技能。 面对 AI 问题&#xff0c;工程师首先要了解什么是 AI&#xff0c;以及如何将它纳入当前工作流&#xff0c;这看似简单&#xff0c;实则未必容易。在 Google 中搜…

TechSmith Camtasia 2023 v23.2.0.47710 中文激活授权版(附安装教程+激活补丁)

Camtasia2023破解版是一款非常专业的屏幕录像软件。该软件集屏幕录制和视频剪辑功能于一体的软件&#xff0c;提供屏幕录制、区域录制、摄像头录制等多种录制方式&#xff0c;Camtasia2023版本带来了新的动态背景库、霓虹光标图像、录制语音旁白等多种新功能&#xff0c;适用于…

管理类联考——英语二——真题篇——按题型分类——小作文

文章目录 2023-建议信2022-邀请信2021-邀请信2020-建议信2019-建议信2018-道歉信2017-接受邀请信2016-建议信2015-通知2014-介绍信2013-邀请信 2023-建议信 Part A 47. Directions:   An art exhibition and a robot show are to be held on Sunday, and your friend David …

QT之常用按钮组件

QT之常用按钮组件 导入图标 布局 显示选中 实验结果 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }void Widget::on_push…

Shell变量的奇妙用法,让你的Shell脚本更简洁高效

当涉及到命令行工具和脚本编写时&#xff0c;Shell变量是一个非常重要的概念。利用Shell变量的一些奇妙用法&#xff0c;我们可以用一个简单的表达式实现复杂操作&#xff0c;使我们的命令更加简洁高效。 本文将介绍一些常用的Shell变量操作符&#xff0c;包括字符串操作、数组…

LeedCode刷题---滑动窗口问题

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、长度最小的子数组 题目链接&#xff1a;长度最小的子数组 题目描述 给定一个含有 n 个正整数的数组和一个正整数 target 。…

mybatis 的快速入门以及基于spring boot整合mybatis(一)

MyBatis基础 MyBatis是一款非常优秀的持久层框架&#xff0c;用于简化JDBC的开发 准备工作&#xff1a; 1&#xff0c;创建sprong boot工程&#xff0c;引入mybatis相关依赖2&#xff0c;准备数据库表User&#xff0c;实体类User3&#xff0c; 配置MyBatis&#xff08;在applic…

公网域名如何解析到内网IP服务器——快解析域名映射外网访问

在本地搭建主机应用后&#xff0c;由于没有公网IP或没有公网路由权限&#xff0c;在需要发布互联网时&#xff0c;就需要用到外网访问内网的一些方案。由于内网IP在外网不能直接访问&#xff0c;通常就用通过外网域名来访问内网的方法。那么&#xff0c;公网域名如何解析到内网…

初识人工智能,一文读懂迁移学习的知识文集(4)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

Linux权限理解(1)

目录 1.shell命令以及运行原理 2.Linux权限的概念 Linux权限管理 01.文件访问者的分类&#xff08;人&#xff09; 02.文件类型和访问权限&#xff08;事物属性&#xff09; a) 文件类型 b)基本权限 03.文件权限值的表示方法 04.文件访问权限的相关设置方法 a)chmod …

微前端 前置知识2--- monorepo架构

目录 前言 pnpm vs npm pnpm设计思想 硬连接 软链接 &#xff08;符号链接&#xff09; 原理 pnpm 指令 monorepo架构 介绍 配置monorepo pnpm --filter 前言 我们采用的是微前端一个主应用&#xff0c;和多个子应用&#xff0c;我们肯定不会一个一个去install安装…

【计算机网络】HTTP请求

目录 前言 HTTP请求报文格式 一. 请求行 HTTP请求方法 GET和POST的区别 URL 二. 请求头 常见的Header 常见的额请求体数据类型 三. 请求体 结束语 前言 HTTP是应用层的一个协议。实际我们访问一个网页&#xff0c;都会像该网页的服务器发送HTTP请求&#xff0c;服务…

ASO优化:帮助实现企业和用户的共赢

大数据时代APP拉获新客&#xff0c;ASO优化应该这么玩&#xff01; 市场那么大&#xff0c;用户那么广。企业设计的APP如何在茫茫人群中精准地把自己送到用户面前&#xff0c;并与ta产生沟通呢。随着时代的发展&#xff0c;数据成为企业竞争的核心。APP的营销发展离不开数据推…

“深入理解作用域、解构和箭头函数——实用案例详解”

目录 学习目标&#xff1a; 学习内容&#xff1a; 学习时间&#xff1a; 学习内容讲解&#xff1a; 作用域 • 局部作用域 全局作用域 作用域链 JS垃圾回收机制 拓展-JS垃圾回收机制-算法说明 闭包 变量提升 函数进阶 函数提升 函数参数 箭头函数 解构赋值 对象解构 遍历数…

Android引用SDK包实现高德地图展示

一、准备工作 注册高德地图开放平台 注册过程我就不多说了&#xff0c;挺简单的&#xff0c;需要登录&#xff0c;然后注册成为开发者&#xff0c;还需要支付宝认证、手机号码验证、邮箱验证挺多的&#xff0c;但是速度很快。基本上随时验证随时注册成功。新建应用新建…

案例二:SQL Server数据库的备份和还原

1、备份类型。 在 SQL Server 中提供了三种常用的备份类型&#xff0c;分别是完整备份&#xff0e;差异备份和事务日志备份。 完整备份&#xff1a; 完整备份包括对整个数据库、部分事务日志、数据库结构和文件结构的备份。完整备份代表的是备份完成时刻的数据库。 完整备份是…

基础课22——听见voc客户之声

1.什么是VOC 1993年&#xff0c;客户之声&#xff08;Voice of the Customer&#xff0c;简称VoC&#xff09;第一次出现&#xff0c;在麻省理工同名论文中&#xff0c;VoC被形容为对客户要求的详细理解&#xff0c;产品开发的共同语言和产品创新的跳板。 图片来源百度 但30年…

【每日一题】下一个更大的数值平衡数

Tag 【模拟】【取模运算】 题目来源 2048. 下一个更大的数值平衡数 解题思路 方法一&#xff1a;模拟 思路 观察到数据量 0 < n < 1 0 6 0< n <10^6 0<n<106&#xff0c;我们可能返回的数值平衡数最大是 1224444&#xff0c;这个范围可以在时间要求内…

油猴(Tampermonkey)浏览器插件简单自定义脚本开发

介绍 浏览器插件&#xff0c;包括油猴插件和其他插件&#xff0c;通过它们可以实现浏览器网页的定制化与功能增强。 其他插件一般只有某种具体的功能&#xff0c;且已经写死而不能更改&#xff0c;比如Adblock插件只用于去广告。 油猴插件是一款用于管理用户脚本的插件&…