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")

案例见: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 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 调用链评估工具。主要包括以下几步:
  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 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即可

(四)LangSmith在微调中的作用

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

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

 
posted @ 2024-07-29 17:27  山上有风景  阅读(294)  评论(0编辑  收藏  举报