LangChain补充七:Hub和LangSmith入门

news/2024/11/15 11:07:30/文章来源:https://www.cnblogs.com/ssyfj/p/18330612

一:Hub简介

https://blog.csdn.net/DEVELOPERAA/article/details/139983286

(一)简介

1.早期

最开始的LangChainHub,类似于github一样,可以理解为LangChain 工具包 或者说 组件中心,里面提供了高质量的组件方便开发者使用。确确实实是一个分享和探索Prompt、链 和Agent的地方。
比如,我们要基于reAct机制实现一个Agent,如果自己写一堆Prompt(提示词)那就太费劲了。此时,在LangChainHub就有许多现成可用的Prompt模板,使用简单又省事,所以LangChainHub迅速流行开。

2.现在

后来LangChainHub被放到了LangSmith里,早期的时候LangChainHub有Prompt、Chain、Agent,现在也只有Prompt。

3.原因

  • 可能是后续为了商业化,将常用的prompt模板放入了LangSmith中,后续LangSmith是有各种付费计划
  • 聚焦于Prompt,毕竟Prompt比较独立 而且易于交付。而Chains 和 Agents 相对来说,交付难度高一些,变动性也低,所以官方直接将 Chains 和 Agents 沉淀到自己的核心库里,这样也能保证Chains 和 Agents 的质量,保证自己的口碑。

(二)Hub实例分析:这里以react代理的模板

要实现一个reAct机制,如果我们自己写提示词,太复杂了,现有的模板
https://smith.langchain.com/hub/hwchase17/react
告诉LLM,它可以使用一堆什么格式的工具,然后先推理,选择合适的工具,执行之后,进行观察,观察完了之后,继续推理,如果有答案了,就回复用户。
使用方法:
from langchain import hub
prompt = hub.pull("hwchase17/react")

案例见:LangChain补充四:Agent知识点和案例补充

(三)进行提示语版本管理

langsmith在hub上提供以下实用功能:
  1. 编辑提示语及提示语版本
  2. 类似Playground的提示语运行环境
  3. 在应用中加载提示语
  4. 与他人共享提示语
上面的这些prompt,比如:https://smith.langchain.com/hub/hwchase17/react都是public,公开
我们可以创建自己的prompt使用,并且可以分版本号使用
from langchain import hub
prompt = hub.pull("study")
可以拉取自己的prompt使用

二:LangSmith简介

https://docs.smith.langchain.com/
https://langchain114.com/docs/langsmith/walkthrough/
https://blog.csdn.net/FrenzyTechAI/article/details/132695264

(一)简介

https://langchain114.com/docs/langsmith/walkthrough/
LangChain 使得原型设计大型语言模型(LLM)应用程序和代理变得容易。
然而,将 LLM 应用程序交付到生产环境可能会异常困难。
可能需要大量定制和迭代prompt、chain和其他组件,以创建高质量的产品。
为了帮助这个过程,推出了 LangSmith,一个统一的平台,用于调试、测试和监控LLM 应用程序。

(二)简单使用

https://www.alang.ai/langchain/101/lc09

1.进入官网:https://smith.langchain.com/,创建一个 API 密钥,添加环境变量

  • 获取API密钥
  • 设置环境变量
LANGCHAIN_TRACING_V2:设置为true让 LangChain 记录追踪信息
LANGCHAIN_PROJECT:设置环境变量来告诉 LangChain 记录到哪个项目(如果这个变量没有设置,运行将被记录到 default 项目)。 这会自动为你创建项目(如果它不存在的话)。
LANGCHAIN_ENDPOINT:设置langsmith地址,https://api.smith.langchain.com
LANGCHAIN_API_KEY:设置API密钥,langsmith的密钥,不同于openAI的key

2.记录运行日志

设置完环境变量后,正常执行langchain代码,会自动在langsmith创建project
from langchain_openai import ChatOpenAIllm = ChatOpenAI()llm.invoke("what's generative ai?")
点击可以查看输入输出和token花费

3.记录复杂运行日志

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthroughllm = ChatOpenAI()prompt = ChatPromptTemplate.from_messages([("system", "You are world class technical documentation writer."),("user", "{input}")
])translate_prompt = ChatPromptTemplate.from_messages([("system", "Translate to simplified Chinese."),("user", "{input}")
])output_parser = StrOutputParser()chain = prompt | llm | output_parser \| {"input": RunnablePassthrough()} \| translate_prompt | llm | output_parseroutput = chain.invoke({"input": "what's generative ai?"})
可以看到调用链!

(三)在数据集上运行评估

https://blog.csdn.net/qq839019311/article/details/139198336
https://docs.smith.langchain.com/old/evaluation/quickstart
LangSmith 集成了 LangChain 的评估功能,为我们提供了一个系统化的 AI 调用链评估工具。主要包括以下几步:
  1. 在 LangSmith 创建数据集
  2. 开发一个 AI 应用的调用链(即业务逻辑)
  3. 在数据集上运行评估
  4. 在 LangSmith 界面查看评估结果
#包含input输入的数据和output输出的对应标签
examples = [{"comment": "这家酒店环境很好,交通便利,服务员非常友好,下次还会来!","reviews": "好评"},{"comment": "房间虽小但很干净整洁,性价比很高,下次还会选择这里。","reviews": "好评"},{"comment": "酒店的游泳池和健身房设施一流,住宿体验非常棒,下次有机会一定再来。","reviews": "好评"},{"comment": "早餐种类很丰富,味道也不错,服务态度很好,对得起这个价格。","reviews": "好评"},{"comment": "酒店位置非常优越,临近著名景点,出行非常方便,下次有机会一定会再入住。","reviews": "好评"},{"comment": "房间设施有些陈旧,卫生情况一般,不太符合我的预期,下次不会再选择这里。","reviews": "差评"},{"comment": "服务员的态度不太友好,办理入住和退房的效率也比较低下,不太满意。","reviews": "差评"},{"comment": "酒店停车场收费很高,且位置不太好找,感觉性价比不太高,不会再来了。","reviews": "差评"},{"comment": "房间隔音效果很差,能听到走廊和邻居的声音,影响睡眠质量,希望能够改进。","reviews": "差评"},{"comment": "酒店餐厅的菜品种类和口味都一般,性价比不高,下次不会再选择这里。","reviews": "差评"}
]

1.在LangSmith创建数据集

from langsmith import Clientinputs=[]
outputs=[]
for example in examples:inputs.append({'comment':example['comment']})outputs.append({'reviews':example['reviews']})#创建数据集
client = Client()
dataset_name = "Hotel Reviews Dataset"
dateset = client.create_dataset(dataset_name,description="Hotel reviews dataset for comment and query")
client.create_examples(dataset_id=dateset.id,inputs=inputs,outputs=outputs)

2.开发一个 AI 应用的调用链

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAIllm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
prompt = ChatPromptTemplate.from_messages([("system","请分析下面的用户评论,并确定它是积极还是消极。如果是积极,用“好评”回答,如果是消极,用“差评”回答。"),("human","{comment}"),
])
chain = prompt | llm | StrOutputParser()
测试调用链
res = chain.invoke(input={"comment":"这家酒店环境很好,交通便利,服务员非常友好,下次还会来!"})

3.配置评估器(可以自定义,也可以使用现成的)

@run_evaluator
def correct_label(run, example) -> EvaluationResult:prediction = run.outputs.get("output") or ""    #调用链返回的预测值required = example.outputs.get("reviews") or "" #数据集中的标签score = prediction == requiredreturn {"score": int(score), "key": "correct_label"}eval_config = RunEvalConfig(custom_evaluators=[correct_label],  # 自定义评估器#evaluators参数配置现有的
)dataset_name = "Hotel Reviews Dataset"
client = Client()client.run_on_dataset(dataset_name=dataset_name,llm_or_chain_factory=chain,evaluation=eval_config,verbose=True,project_name="Hotel Reviews Project",project_metadata={"version": "1.0.0"},
)
可以发现输出结果跟预期不一致(期望输出“差评”,实际输出“差评。”),因此需要prompt优化
请分析下面的用户评论,并确定它是积极还是消极。如果是积极,只需要回答“好评”两字,如果是消极,只需要回答“差评”两字。

4.查看评估结果

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain.smith import RunEvalConfig, run_on_dataset
from langsmith.evaluation import EvaluationResult, run_evaluator
from langsmith import Clientllm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
prompt = ChatPromptTemplate.from_messages([("system","请分析下面的用户评论,并确定它是积极还是消极。如果是积极,只需要回答“好评”两字,如果是消极,只需要回答“差评”两字。"),("human","{comment}"),
])
chain = prompt | llm | StrOutputParser()@run_evaluator
def correct_label(run, example) -> EvaluationResult:prediction = run.outputs.get("output") or ""    #调用链返回的预测值required = example.outputs.get("reviews") or "" #数据集中的标签score = prediction == requiredreturn {"score": int(score), "key": "correct_label"}eval_config = RunEvalConfig(custom_evaluators=[correct_label],  # 自定义评估器
)dataset_name = "Hotel Reviews Dataset"
client = Client()client.run_on_dataset(dataset_name=dataset_name,llm_or_chain_factory=chain,evaluation=eval_config,verbose=True,project_name="Hotel Reviews Project 02",project_metadata={"version": "1.0.0"},
)
注意:如果第二次对同一个数据集评估,会出现session重复问题,修改project_name即可

(四)LangSmith在微调中的作用

LLM 学习新知识有两种主要方式:权重更新和提示。权重更新可以通过预训练或微调来实现,而提示则可以通过检索增强生成(RAG)等方式来实现。模型的权重类似于长期记忆,而提示则类似于短期记忆。

LangSmith在微调中的作用:数据集收集/清理和评估

 

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

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

相关文章

借助大语言模型快速升级你的 Java 应用程序

大家都知道我爱小 Q。在我“转码”的征程中,它就像上帝之手,在我本该枯燥漫长的学习进程中拉满快进条。 不仅是我,最近 Amazon Q Developer 还帮助 Amazon 一个由 5 人组成的团队在短短两天内将 1,000 多个生产应用程序从 Java 8 升级到 Java 17(每个应用程序的平均时间不到…

8080端口被占用

微服务项目,启动时发生8080端口占用,但是其他启动了并没有使用到8080端口。 cmd命令窗口查看: netstat -aon | findstr "8080"右键添加需要了解的列表查看8080端口占用的pid比如占用端口的服务是VMware NAT Servic。 在服务管理器(services.msc)中停止VMware NA…

[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-20 读写I2C接口的RTC时钟芯片

软件版本:Anlogic -TD5.9.1-DR1_ES1.1 操作系统:WIN10 64bit 硬件平台:适用安路(Anlogic)FPGA 实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台:https://milianke.tmall.com/ 登录"米联客"FPGA社区 http://www.uisrc.com 视频课程、答疑解惑! 1概述 …

【YashanDB知识库】如何远程连接、使用YashanDB?

问题现象 在各个项目实施中,我们经常遇到客户、开发人员需要连接和使用YashanDB但不知如何操作的问题,本文旨在介绍远程连接、使用YashanDB的几种方式。 问题的风险及影响 无风险 问题影响的版本 历史版本~23.2 问题发生原因 无 解决方法及规避方式 不需要规避 问题分析和处理…

GIS场景零代码拖拽式编辑,支持TMS/WMS/WMTS等多种GIS协议

在三维GIS领域,编辑场景和处理影像数据通常是一个复杂且费时的过程,但现在有了山海鲸可视化,这一切都变得简单有趣。这款免费可视化工具为您提供了零代码拖拽式编辑的体验,让您无需编程知识就能轻松创建和优化GIS场景。通过直观的界面,您只需动动鼠标就能完成从场景编辑到…

【攻防技术系列+代理转发】ICMPSH 工具

虚拟机环境搭建: 【Kali】,192.168.10.131 【window7】,192.168.10.1工具: ICMPSH(基于网络层) Wireshark实验开始前,确保两台主机可以ping通。如果遇到环境ping不通的情况,可以借鉴以下解决方案。 重启网卡:有来有回的过程,数据长度为74。 【kali】: sysctl -w net…

人大金仓踩坑指南

现在越来越多的项目要求-切换国产数据库系统,或达梦(性能高),或人大金仓(扩展性高,更稳定),跨平台如果上来就干,坑还是不少的,本人有幸踩个遍.1. 软件有效期,人大金仓可不便宜,不少政府采购网上都是标价10万+, 测试时候用专业版玩一玩就好到期后,可以直接下载其他版…

linux shell read 按列读取txt文本

前言全局说明一、说明 通常情况下,如果文本里有多列数据,会先读入,然后用 grep 和 awk 先拆分成行,在拆分成列。这样费时费力,遇到特殊字符行,还不好处理。 在解决别的问题时候,无意发现 read 有直接按列读取的功能。二、文件 2.1 存放两列数据的文件 文件名:list.txt…

什么是云计算?

云计算是一种服务的模式(商业模式):将信息类资源以服务的方式提供给用户使用,用户可以便捷的、按需计费的、弹性的从云端获取到信息技术的服务。 云计算技术栈层级:CPU CPU的组成: 1、运算器(算术逻辑单元) 2、控制器() 3、存储器(命令和需要运算的数据) 1、高速缓…

Linux shell mktemp -d命令生成临时文件

前言全局说明一、说明二、mktemp 命令 2.1 创建临时文件 mktemp 2.1 创建临时目录 mktemp -d三、命令行示例 mktemp ll /tmp/tmp.fvi5gFbDgr四、sh 脚本使用 4.1 创建 tmpfile=$(mktemp)4.2 删除 rm "$tmpfile"免责声明:本号所涉及内容仅供安全研究与教学使用,如出…

Linux shell mktemp命令生成临时文件

前言全局说明一、说明二、mktemp 命令 mktemp三、命令行示例 mktemp ll /tmp/tmp.fvi5gFbDgr四、sh 脚本使用 4.1 创建 tmpfile=$(mktemp)4.2 删除 rm "$tmpfile"免责声明:本号所涉及内容仅供安全研究与教学使用,如出现其他风险,后果自负。参考、来源: ChatGPT 作…

「代码随想录算法训练营」第二十三天 | 贪心算法 part1

455. 分发饼干题目链接:https://leetcode.cn/problems/assign-cookies/ 题目难度:简单 文章讲解:https://programmercarl.com/0455.分发饼干.html 视频讲解:https://www.bilibili.com/video/BV1MM411b7cq 题目状态:初次有贪心算法的总体概念,有点懵思路: 先将饼干尺寸大…