《LangChain简明教程》系列文章目录
- LangChain简明教程(1)
- LangChain简明教程(2)
- LangChain简明教程(3)
- LangChain简明教程(4)
- LangChain简明教程(5)
- LangChain简明教程(6)
- LangChain简明教程(7)
- LangChain简明教程(8)
- LangChain简明教程(9)
- LangChain简明教程(10)
- LangChain简明教程(11)
LangSmith 简介
LangChain 使得原型设计 LLM 应用程序和 Agents 变得简单。然而,将 LLM 应用程序部署到生产环境可能会出乎意料地困难。需要对提示词(prompt)、链(chain)和其他组件进行大量定制和迭代,以打造一个高质量的产品。
LangSmith 的目的是为了让这一过程更简便。LangSmith 是一个用于调试、测试和监控 LLM 应用的统一平台。
如果要快速调试一个新的 chain、agent 或工具集,可视化各个组件(chains、llms、retrievers 等)之间的关系及其使用情况,评估单个组件的不同提示和 LLM,或者在一个数据集上多次运行某个 chain 以确保其始终达到一定的质量标准时,就是使用 LangSmith 的时候。此外,还可以捕获使用轨迹,并利用 LLM 或分析流水线生成观测信息。
前置条件:
- 创建一个 LangSmith 账户并创建一个 API 密钥。
- 通过查看文档来熟悉该平台。
下面开始演示使用方法。
首先,配置环境变量,以告诉 LangChain 记录追踪信息。可以通过将 LANGCHAIN_TRACING_V2
环境变量设置为 true
来实现。还可以通过设置 LANGCHAIN_PROJECT
环境变量来告诉 LangChain 将日志记录到哪个项目中(如果未设置,则会将运行记录到默认项目中)。如果该项目不存在,将自动创建该项目。此外,还必须设置 LANGCHAIN_ENDPOINT
和 LANGCHAIN_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
)函数来评估你的模型。这将执行以下操作:
- 从指定的数据集中获取示例行。
- 在每个示例上运行你的 agent(或任何自定义函数)。
- 将评估器应用于生成的运行轨迹和对应的参考示例,以生成自动化反馈。
结果将在 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 官方文档。