LangChain补充七:Hub和LangSmith入门
一: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")
案例见:
(三)进行提示语版本管理
langsmith在hub上提供以下实用功能:
- 编辑提示语及提示语版本
- 类似Playground的提示语运行环境
- 在应用中加载提示语
- 与他人共享提示语
上面的这些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.comLANGCHAIN_API_KEY
:设置API密钥,langsmith的密钥,不同于openAI的key2.记录运行日志
设置完环境变量后,正常执行langchain代码,会自动在langsmith创建project
from langchain_openai import ChatOpenAI
llm = 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 RunnablePassthrough
llm = 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_parser
output = 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 调用链评估工具。主要包括以下几步:
- 在 LangSmith 创建数据集
- 开发一个 AI 应用的调用链(即业务逻辑)
- 在数据集上运行评估
- 在 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 Client
inputs=[]
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 ChatOpenAI
llm = 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 == required
return {"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 Client
llm = 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 == required
return {"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即可