LangChain简明教程(12)

《LangChain简明教程》系列文章目录

  1. LangChain简明教程(1)
  2. LangChain简明教程(2)
  3. LangChain简明教程(3)
  4. LangChain简明教程(4)
  5. LangChain简明教程(5)
  6. LangChain简明教程(6)
  7. LangChain简明教程(7)
  8. LangChain简明教程(8)
  9. LangChain简明教程(9)
  10. LangChain简明教程(10)
  11. LangChain简明教程(11)

LangSmith 简介

LangChain 使得原型设计 LLM 应用程序和 Agents 变得简单。然而,将 LLM 应用程序部署到生产环境可能会出乎意料地困难。需要对提示词(prompt)、链(chain)和其他组件进行大量定制和迭代,以打造一个高质量的产品。

LangSmith 的目的是为了让这一过程更简便。LangSmith 是一个用于调试、测试和监控 LLM 应用的统一平台。

如果要快速调试一个新的 chain、agent 或工具集,可视化各个组件(chains、llms、retrievers 等)之间的关系及其使用情况,评估单个组件的不同提示和 LLM,或者在一个数据集上多次运行某个 chain 以确保其始终达到一定的质量标准时,就是使用 LangSmith 的时候。此外,还可以捕获使用轨迹,并利用 LLM 或分析流水线生成观测信息。

前置条件:

  1. 创建一个 LangSmith 账户并创建一个 API 密钥。
  2. 通过查看文档来熟悉该平台。

下面开始演示使用方法。

首先,配置环境变量,以告诉 LangChain 记录追踪信息。可以通过将 LANGCHAIN_TRACING_V2 环境变量设置为 true 来实现。还可以通过设置 LANGCHAIN_PROJECT 环境变量来告诉 LangChain 将日志记录到哪个项目中(如果未设置,则会将运行记录到默认项目中)。如果该项目不存在,将自动创建该项目。此外,还必须设置 LANGCHAIN_ENDPOINTLANGCHAIN_API_KEY 环境变量。

注意:也可以使用 Python 中的上下文管理器来记录追踪信息,例如:

from langchain.callbacks.manager import tracing_v2_enabled

with tracing_v2_enabled(project_name="My Project"):
    agent.run("How many people live in canada as of 2023?")

但是,在这里使用环境变量。

%pip install openai tiktoken pandas duckduckgo-search --quiet

import os
from uuid import uuid4

unique_id = uuid4().hex[0:8]
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_PROJECT"] = f"Tracing Walkthrough - {unique_id}"
os.environ["LANGCHAIN_ENDPOINT"] = "https://api.smith.langchain.com"
os.environ["LANGCHAIN_API_KEY"] = "<YOUR-API-KEY>"  # Update to your API key

# Used by the agent in this tutorial
os.environ["OPENAI_API_KEY"] = "<YOUR-OPENAI-API-KEY>"

创建 LangSmith 的 client,以与 API 进行交互:

from langsmith import Client

client = Client()

创建一个 LangChain 组件并将运行记录到平台。在本示例中,创建一个可以访问通用搜索工具(DuckDuckGo)的 ReAct 风格的 agent。该 agent 的 prompt 可以在此处的 Hub 中查看:

from langchain import hub
from langchain.agents import AgentExecutor
from langchain.agents.format_scratchpad import format_to_openai_function_messages
from langchain.agents.output_parsers import OpenAIFunctionsAgentOutputParser
from langchain.chat_models import ChatOpenAI
from langchain.tools import DuckDuckGoSearchResults
from langchain.tools.render import format_tool_to_openai_function

# Fetches the latest version of this prompt
prompt = hub.pull("wfh/langsmith-agent-prompt:latest")

llm = ChatOpenAI(
    model="gpt-3.5-turbo-16k",
    temperature=0,
)

tools = [
    DuckDuckGoSearchResults(
        name="duck_duck_go"
    ),  # General internet search using DuckDuckGo
]

llm_with_tools = llm.bind(functions=[format_tool_to_openai_function(t) for t in tools])

runnable_agent = (
    {
        "input": lambda x: x["input"],
        "agent_scratchpad": lambda x: format_to_openai_function_messages(
            x["intermediate_steps"]
        ),
    }
    | prompt
    | llm_with_tools
    | OpenAIFunctionsAgentOutputParser()
)

agent_executor = AgentExecutor(
    agent=runnable_agent, tools=tools, handle_parsing_errors=True
)

以上示例正在多个输入上并发地运行 agent 以减少延迟。运行记录会在后台自动发送到 LangSmith,因此执行延迟不会受到影响:

inputs = [
    "What is LangChain?",
    "What's LangSmith?",
    "When was Llama-v2 released?",
    "What is the langsmith cookbook?",
    "When did langchain first announce the hub?",
]

results = agent_executor.batch([{"input": x} for x in inputs], return_exceptions=True)

results[:2]

假设已经成功配置了环境,agent 追踪信息将会显示在应用程序的 Projects(项目)部分。恭喜!

不过看起来这个 agent 并没有有效地使用工具。我们来对此进行评估,以便建立一个基准。

除了记录运行数据之外,LangSmith 还允许对 LLM 应用程序进行测试和评估。

在这里,使用 LangSmith 创建一个基准数据集,并在一个 agent 上运行 AI 辅助评估器。按照以下几个步骤进行操作:

  • 创建一个 LangSmith 数据集:

以下代码中,使用 LangSmith 客户端从上面的问题输入和标签列表创建一个数据集,这些数据将用于衡量新 agent 的性能。数据集是由多个示例组成,而示例本质上就是可以用于测试应用程序的“输入-输出”对:

outputs = [
    "LangChain is an open-source framework for building applications using large language models. It is also the name of the company building LangSmith.",
    "LangSmith is a unified platform for debugging, testing, and monitoring language model applications and agents powered by LangChain",
    "July 18, 2023",
    "The langsmith cookbook is a github repository containing detailed examples of how to use LangSmith to debug, evaluate, and monitor large language model-powered applications.",
    "September 5, 2023",
]

dataset_name = f"agent-qa-{unique_id}"

dataset = client.create_dataset(
    dataset_name,
    description="An example dataset of questions over the LangSmith documentation.",
)

for query, answer in zip(inputs, outputs):
    client.create_example(
        inputs={"input": query}, outputs={"output": answer}, dataset_id=dataset.id
    )
  • 初始化一个用于基准测试的新 agent:

LangSmith 使能够帮助开发者评估任何 LLM、chain、agent,甚至自定义函数。对话式 agent 是有状态的(它们具有记忆功能);为了确保在数据集运行之间不会共享此状态,我们将传入一个 chain_factory(即构造函数)函数,以便在每次调用时进行初始化:

# Since chains can be stateful (e.g. they can have memory), we provide
# a way to initialize a new chain for each row in the dataset. This is done
# by passing in a factory function that returns a new chain for each row.
def agent_factory(prompt):
    llm_with_tools = llm.bind(
        functions=[format_tool_to_openai_function(t) for t in tools]
    )
    runnable_agent = (
        {
            "input": lambda x: x["input"],
            "agent_scratchpad": lambda x: format_to_openai_function_messages(
                x["intermediate_steps"]
            ),
        }
        | prompt
        | llm_with_tools
        | OpenAIFunctionsAgentOutputParser()
    )
    return AgentExecutor(agent=runnable_agent, tools=tools, handle_parsing_errors=True)
  • 配置评估:

在 UI 中手动对比 chain 的结果是有效的,但这可能会很耗时。使用自动化指标和 AI 辅助反馈来评估组件的性能会更加高效:

from langchain.evaluation import EvaluatorType
from langchain.smith import RunEvalConfig

evaluation_config = RunEvalConfig(
    evaluators=[
        EvaluatorType.QA,
        EvaluatorType.EMBEDDING_DISTANCE,
        RunEvalConfig.LabeledCriteria("helpfulness"),
        RunEvalConfig.LabeledScoreString(
            {
                "accuracy": """
Score 1: The answer is completely unrelated to the reference.
Score 3: The answer has minor relevance but does not align with the reference.
Score 5: The answer has moderate relevance but contains inaccuracies.
Score 7: The answer aligns with the reference but has minor errors or omissions.
Score 10: The answer is completely accurate and aligns perfectly with the reference."""
            },
            normalize_by=10,
        ),
    ],
    custom_evaluators=[],
)
  • 运行 agent 和评估器:使用 run_on_dataset(或异步的 arun_on_dataset)函数来评估你的模型。这将执行以下操作:
  1. 从指定的数据集中获取示例行。
  2. 在每个示例上运行你的 agent(或任何自定义函数)。
  3. 将评估器应用于生成的运行轨迹和对应的参考示例,以生成自动化反馈。

结果将在 LangSmith 应用程序中可见:

chain_results = run_on_dataset(
    dataset_name=dataset_name,
    llm_or_chain_factory=functools.partial(agent_factory, prompt=prompt),
    evaluation=evaluation_config,
    verbose=True,
    client=client,
    project_name=f"runnable-agent-test-5d466cbc-{unique_id}",
    tags=[
        "testing-notebook",
        "prompt:5d466cbc",
    ],
)

现在我们已经有了测试运行的结果,可以对 agent 进行修改并重新进行基准测试。尝试使用一个不同的 prompt,看看结果会如何:

candidate_prompt = hub.pull("wfh/langsmith-agent-prompt:39f3bbd0")

chain_results = run_on_dataset(
    dataset_name=dataset_name,
    llm_or_chain_factory=functools.partial(agent_factory, prompt=candidate_prompt),
    evaluation=evaluation_config,
    verbose=True,
    client=client,
    project_name=f"runnable-agent-test-39f3bbd0-{unique_id}",
    tags=[
        "testing-notebook",
        "prompt:39f3bbd0",
    ],
)

LangSmith 支持在网页应用中将数据导出为常见的格式,如 CSV 或 JSONL。也可以使用客户端获取运行记录,以便进行进一步分析、存储到自己的数据库中,或与他人共享。下面从评估运行中获取这些运行轨迹:

runs = client.list_runs(project_name=chain_results["project_name"], execution_order=1)

# After some time, these will be populated.
client.read_project(project_name=chain_results["project_name"]).feedback_stats

这只是一个快速入门指南,但 LangSmith 还有更多使用方式,可以帮助你加速开发流程并产出更优的结果。

如需了解如何更好地利用 LangSmith,请查阅 LangSmith 官方文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CS创新实验室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值