5个Lang:3-LangSmith简单实践

LangSmith与LangChain集成实践

今天介绍一个AI生产力工具:LangSmith。本篇文章主要在Tracing部分的实操,包括环境准备、如何将你的LangChain程序和LangSimth平台打通,如何使用LangSimth调试Prompt,以及如何进行在线数据标注和收集,为后面的自动化评估作准备。

在开始之前,我们先来了解下为什么要有LangSmith:

维护一个生产级的 LLM 应用,我们需要做什么?

  • 各种指标监控与统计:访问记录、响应时长、Token用量、计费等等

  • 调试 Prompt,Prompt 版本管理(便于升级/回滚)

  • 测试/验证系统的相关评估指标

  • 数据集管理(便于回归测试)

LangSimth平台帮助你快速、可视化完成上面的流程。它允许您调试、测试、评估和监控构建在任何LLM框架上的链和智能代理,并与LangChain无缝集成。

1. 环境准备

LangSmith是LangChain 官方的 SaaS 服务,现已开源。

平台入口:https://www.langchain.com/langsmith

文档地址:https://python.langchain.com/docs/langsmith/walkthrough

注册登录之后,需要生成API key

在这里插入图片描述

!pip install langchain langchain_openai
Requirement already satisfied: langchain in /usr/local/lib/python3.10/dist-packages (0.1.16)
Requirement already satisfied: langchain_openai in /usr/local/lib/python3.10/dist-packages (0.1.3)
Requirement already satisfied: PyYAML>=5.3 in /usr/local/lib/python3.10/dist-packages (from langchain) (6.0.1)
Requirement already satisfied: SQLAlchemy<3,>=1.4 in /usr/local/lib/python3.10/dist-packages (from langchain) (2.0.29)
Requirement already satisfied: aiohttp<4.0.0,>=3.8.3 in /usr/local/lib/python3.10/dist-packages (from langchain) (3.9.5)
Requirement already satisfied: async-timeout<5.0.0,>=4.0.0 in /usr/local/lib/python3.10/dist-packages (from langchain) (4.0.3)
Requirement already satisfied: dataclasses-json<0.7,>=0.5.7 in /usr/local/lib/python3.10/dist-packages (from langchain) (0.6.4)
Requirement already satisfied: jsonpatch<2.0,>=1.33 in /usr/local/lib/python3.10/dist-packages (from langchain) (1.33)
Requirement already satisfied: langchain-community<0.1,>=0.0.32 in /usr/local/lib/python3.10/dist-packages (from langchain) (0.0.34)
Requirement already satisfied: langchain-core<0.2.0,>=0.1.42 in /usr/local/lib/python3.10/dist-packages (from langchain) (0.1.46)
Requirement already satisfied: langchain-text-splitters<0.1,>=0.0.1 in /usr/local/lib/python3.10/dist-packages (from langchain) (0.0.1)
Requirement already satisfied: langsmith<0.2.0,>=0.1.17 in /usr/local/lib/python3.10/dist-packages (from langchain) (0.1.51)
Requirement already satisfied: numpy<2,>=1 in /usr/local/lib/python3.10/dist-packages (from langchain) (1.25.2)
Requirement already satisfied: pydantic<3,>=1 in /usr/local/lib/python3.10/dist-packages (from langchain) (2.7.0)
Requirement already satisfied: requests<3,>=2 in /usr/local/lib/python3.10/dist-packages (from langchain) (2.31.0)
Requirement already satisfied: tenacity<9.0.0,>=8.1.0 in /usr/local/lib/python3.10/dist-packages (from langchain) (8.2.3)
Requirement already satisfied: openai<2.0.0,>=1.10.0 in /usr/local/lib/python3.10/dist-packages (from langchain_openai) (1.23.6)
Requirement already satisfied: tiktoken<1,>=0.5.2 in /usr/local/lib/python3.10/dist-packages (from langchain_openai) (0.6.0)
Requirement already satisfied: aiosignal>=1.1.2 in /usr/local/lib/python3.10/dist-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (1.3.1)
Requirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (23.2.0)
Requirement already satisfied: frozenlist>=1.1.1 in /usr/local/lib/python3.10/dist-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (1.4.1)
Requirement already satisfied: multidict<7.0,>=4.5 in /usr/local/lib/python3.10/dist-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (6.0.5)
Requirement already satisfied: yarl<2.0,>=1.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (1.9.4)
Requirement already satisfied: marshmallow<4.0.0,>=3.18.0 in /usr/local/lib/python3.10/dist-packages (from dataclasses-json<0.7,>=0.5.7->langchain) (3.21.1)
Requirement already satisfied: typing-inspect<1,>=0.4.0 in /usr/local/lib/python3.10/dist-packages (from dataclasses-json<0.7,>=0.5.7->langchain) (0.9.0)
Requirement already satisfied: jsonpointer>=1.9 in /usr/local/lib/python3.10/dist-packages (from jsonpatch<2.0,>=1.33->langchain) (2.4)
Requirement already satisfied: packaging<24.0,>=23.2 in /usr/local/lib/python3.10/dist-packages (from langchain-core<0.2.0,>=0.1.42->langchain) (23.2)
Requirement already satisfied: orjson<4.0.0,>=3.9.14 in /usr/local/lib/python3.10/dist-packages (from langsmith<0.2.0,>=0.1.17->langchain) (3.10.1)
Requirement already satisfied: anyio<5,>=3.5.0 in /usr/local/lib/python3.10/dist-packages (from openai<2.0.0,>=1.10.0->langchain_openai) (3.7.1)
Requirement already satisfied: distro<2,>=1.7.0 in /usr/lib/python3/dist-packages (from openai<2.0.0,>=1.10.0->langchain_openai) (1.7.0)
Requirement already satisfied: httpx<1,>=0.23.0 in /usr/local/lib/python3.10/dist-packages (from openai<2.0.0,>=1.10.0->langchain_openai) (0.27.0)
Requirement already satisfied: sniffio in /usr/local/lib/python3.10/dist-packages (from openai<2.0.0,>=1.10.0->langchain_openai) (1.3.1)
Requirement already satisfied: tqdm>4 in /usr/local/lib/python3.10/dist-packages (from openai<2.0.0,>=1.10.0->langchain_openai) (4.66.2)
Requirement already satisfied: typing-extensions<5,>=4.7 in /usr/local/lib/python3.10/dist-packages (from openai<2.0.0,>=1.10.0->langchain_openai) (4.11.0)
Requirement already satisfied: annotated-types>=0.4.0 in /usr/local/lib/python3.10/dist-packages (from pydantic<3,>=1->langchain) (0.6.0)
Requirement already satisfied: pydantic-core==2.18.1 in /usr/local/lib/python3.10/dist-packages (from pydantic<3,>=1->langchain) (2.18.1)
Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2->langchain) (3.3.2)
Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2->langchain) (3.7)
Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2->langchain) (2.0.7)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2->langchain) (2024.2.2)
Requirement already satisfied: greenlet!=0.4.17 in /usr/local/lib/python3.10/dist-packages (from SQLAlchemy<3,>=1.4->langchain) (3.0.3)
Requirement already satisfied: regex>=2022.1.18 in /usr/local/lib/python3.10/dist-packages (from tiktoken<1,>=0.5.2->langchain_openai) (2023.12.25)
Requirement already satisfied: exceptiongroup in /usr/local/lib/python3.10/dist-packages (from anyio<5,>=3.5.0->openai<2.0.0,>=1.10.0->langchain_openai) (1.2.1)
Requirement already satisfied: httpcore==1.* in /usr/local/lib/python3.10/dist-packages (from httpx<1,>=0.23.0->openai<2.0.0,>=1.10.0->langchain_openai) (1.0.5)
Requirement already satisfied: h11<0.15,>=0.13 in /usr/local/lib/python3.10/dist-packages (from httpcore==1.*->httpx<1,>=0.23.0->openai<2.0.0,>=1.10.0->langchain_openai) (0.14.0)
Requirement already satisfied: mypy-extensions>=0.3.0 in /usr/local/lib/python3.10/dist-packages (from typing-inspect<1,>=0.4.0->dataclasses-json<0.7,>=0.5.7->langchain) (1.0.0)
# 设置OpenAI KEY环境变量
import os
import getpass
os.environ['OPENAI_API_KEY'] = getpass.getpass('OpenAI API Key:')
OpenAI API Key:··········

2. 打通LangChain和LangSmith

要打通 LangChain 和 LangSmith 很简单,只需要在环境变量中加入如下4个信息:

import os
LANGCHAIN_API_KEY = "ls__xxxxxx"  # LangChain API Key
os.environ["LANGCHAIN_ENDPOINT"] = "https://api.smith.langchain.com"  #LangSmith的服务端点

os.environ["LANGCHAIN_TRACING_V2"]="true"
os.environ["LANGCHAIN_PROJECT"]="test-001" #自定义项目名称

示例代码:

from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.schema.output_parser import StrOutputParser
from langchain.schema.runnable import RunnablePassthrough
from langchain.schema import HumanMessage
from langchain.prompts.chat import HumanMessagePromptTemplate
from langchain.prompts import ChatPromptTemplate

model = ChatOpenAI()

prompt_template = """
我的名字叫【{name}】,我的个人介绍是【{description}】。
请根据我的名字和介绍,帮我想一段有吸引力的自我介绍的句子,以此来吸引读者关注和点赞我的账号。
"""
prompt = ChatPromptTemplate.from_messages([
    HumanMessagePromptTemplate.from_template(prompt_template)
])

# 定义输出解析器
parser = StrOutputParser()

chain = (
    prompt
    | model
    | parser
)

## invoke的第一个参数,传入json格式的参数,key与prompt中的参数名一致
response = chain.invoke({'name': 'Arron', 'description': '热爱AI,持续学习,持续干货输出'})
print(response)
"大家好,我是Arron,一个对AI充满热爱并持续学习的人。在这里,我会不断分享最新的干货内容,让我们一起探索AI的无限可能!期待与你们一起交流学习!"

在LangSmith中查看项目test-001,结果如下图所示:

在这里插入图片描述

<think> 我们正在讨论的是commons-lang:commons-lang这个jar包的作用。根据Apache Commons Lang项目的官方描述,这个库提供了一系列针对Java标准库的实用工具类和方法,主要目的是填补Java标准库(java.lang)的不足,提供更多的工具和功能,使得开发者能够更高效地进行开发。 主要作用包括: 1. **字符串处理**:提供了StringUtils类,包含大量字符串操作方法,如空值安全的判断、截取、反转、拆分、连接等。 2. **数值处理**:NumberUtils类提供数字转换、判断等。 3. **对象操作**:ObjectUtils类提供对象的null安全操作,如默认值处理、比较等。 4. **日期时间处理**:DateUtils和DateFormatUtils类提供日期格式化和计算(如日期加减、比较等)。 5. **数组操作**:ArrayUtils类提供数组的合并、子数组、反转、查找等。 6. **系统属性**:SystemUtils类用于获取系统属性(如操作系统类型、Java版本等)。 7. **异常处理**:ExceptionUtils类提供异常堆栈信息的处理。 8. **随机数生成**:RandomUtils和RandomStringUtils类提供更便捷的随机数生成。 9. **构建器模式**:ToStringBuilder、EqualsBuilder、HashCodeBuilder等帮助生成toString、equals和hashCode方法。 此外,它还包含一些其他工具类,如SerializationUtils(序列化工具)、EnumUtils(枚举工具)等。 这个库在Java开发中被广泛使用,特别是在需要大量基础工具类支持的场景下,可以避免重复造轮子。 下面我们以代码示例来展示一些常用功能: 示例1:使用StringUtils处理字符串 ```java import org.apache.commons.lang.StringUtils; public class StringExample { public static void main(String[] args) { // 判断字符串是否为空(null或空字符串) String str = null; System.out.println(StringUtils.isEmpty(str)); // 输出: true // 判断字符串是否为空白(null、空字符串或仅包含空白字符) System.out.println(StringUtils.isBlank(" ")); // 输出: true // 反转字符串 System.out.println(StringUtils.reverse("hello")); // 输出: olleh // 截取字符串 System.out.println(StringUtils.substring("hello world", 6)); // 输出: world } } ``` 示例2:使用DateUtils进行日期操作 ```java import org.apache.commons.lang.time.DateUtils; import java.util.Calendar; import java.util.Date; public class DateExample { public static void main(String[] args) { Date now = new Date(); // 加一天 Date tomorrow = DateUtils.addDays(now, 1); // 减一个月 Date lastMonth = DateUtils.addMonths(now, -1); // 设置时间为当天的开始(00:00:00) Date startOfDay = DateUtils.truncate(now, Calendar.DATE); } } ``` 示例3:使用ArrayUtils操作数组 ```java import org.apache.commons.lang.ArrayUtils; public class ArrayExample { public static void main(String[] args) { int[] array = {1, 2, 3}; // 添加元素到数组 int[] newArray = ArrayUtils.add(array, 4); // [1,2,3,4] // 反转数组 ArrayUtils.reverse(newArray); // [4,3,2,1] // 查找元素 int index = ArrayUtils.indexOf(newArray, 3); // 1 } } ``` 需要注意的是,Apache Commons Lang有两个主要版本:2.x和3.x。其中,2.x的包名为`org.apache.commons.lang`,而3.x的包名为`org.apache.commons.lang3`。我们这里讨论的是2.x版本(commons-lang),而3.x版本(commons-lang3)是向后不兼容的升级,增加了一些新特性并删除了一些过时的方法。 因此,在选择版本时,需要根据项目需求来决定。对于新项目,推荐使用commons-lang3。 综上所述,commons-lang:commons-lang jar包的作用是提供Java标准库的扩展工具类,帮助开发者更高效地完成常见任务。 相关问题: 1. commons-lang和commons-lang3有什么区别? 2. 如何在Maven项目中引入commons-lang3. StringUtils类有哪些常用的字符串操作方法? 4. 如何用ToStringBuilder生成对象的toString方法? </think> ### `commons-lang:commons-lang` JAR 包的核心作用 `commons-lang` 是 **Apache Commons Lang** 库的核心组件,提供对 Java 标准库(`java.lang`)的扩展工具类,主要作用包括: #### 1. **增强基础数据类型操作** - **字符串处理**:空值安全操作(如 `StringUtils.isBlank()`)、截取/反转/拆分等[^1] ```java // 示例:安全判断空字符串 StringUtils.isBlank(null); // true StringUtils.isBlank(" "); // true ``` - **数值处理**:类型安全转换(`NumberUtils.toInt()`)、范围检查等 - **数组工具**:高效合并/查找/反转(`ArrayUtils.addAll()`) #### 2. **对象操作增强** - **空值安全处理**:`ObjectUtils.defaultIfNull()` 避免 NPE - **对象比较**:深度比较 `EqualsBuilder.reflectionEquals()` - **哈希码生成**:`HashCodeBuilder` 自动生成合规的 `hashCode()` ```java // 自动生成 hashCode public int hashCode() { return new HashCodeBuilder(17, 37) .append(name) .append(age) .toHashCode(); } ``` #### 3. **日期时间工具** - **日期计算**:`DateUtils.addDays()` 实现安全日期加减 - **格式化/解析**:线程安全的 `DateFormatUtils` 替代 `SimpleDateFormat` ```java String dateStr = DateFormatUtils.ISO_DATE_FORMAT.format(new Date()); ``` #### 4. **系统与环境工具** - **系统属性**:`SystemUtils` 获取 OS/JVM 信息(如 `SystemUtils.IS_JAVA_1_8`) - **随机生成**:`RandomStringUtils` 生成随机字符串/UUID #### 5. **异常处理工具** - **异常链解析**:`ExceptionUtils.getRootCause()` 快速定位根本原因 - **堆栈跟踪**:`ExceptionUtils.getStackTrace()` 转字符串 --- ### 典型应用场景 - 🔧 **减少样板代码**:自动生成 `equals()`/`hashCode()`/`toString()` - 🛡️ **防御式编程**:空值检查、参数验证(`Validate.notNull()`) - ⏱️ **日期安全操作**:避免 `Calendar` 复杂操作 - 📦 **数据转换**:类型转换(`String` ↔ 数字/日期) --- ### 版本说明 - **`commons-lang 2.x`**:传统版本(包路径 `org.apache.commons.lang`) - **`commons-lang3 3.x`**:升级版(包路径 `org.apache.commons.lang3`),推荐新项目使用 --- ### Maven 依赖示例 ```xml <!-- 传统版本 --> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> <!-- 新版推荐 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.12.0</version> </dependency> ``` --- ### 相关问题 1. `commons-lang` 和 `commons-lang3` 有哪些主要区别?[^1] 2. 如何用 `StringUtils` 高效处理中文字符串? 3. `EqualsBuilder` 在深度比较对象时有哪些性能陷阱? 4. 为什么 `DateFormatUtils` 比 `SimpleDateFormat` 更安全? 5. 如何用 `RandomStringUtils` 生成符合密码学要求的随机字符串
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值