跟踪 CrewAI

使用自动记录的 CrewAI 跟踪

CrewAI 是一个开源框架,用于协调角色扮演、自主 AI 代理。

MLflow 跟踪CrewAI 提供了自动跟踪功能,这是用于构建多代理应用程序的开源框架。 通过调用 mlflow.crewai.autolog 函数为 CrewAI 启用自动跟踪,MLflow 将捕获 CrewAI 工作流执行的嵌套跟踪,并将其记录到活动的 MLflow 试验。

import mlflow

mlflow.crewai.autolog()

注释

在无服务器计算群集上,不会自动启用 genAI 跟踪框架的自动记录。 必须通过为要跟踪的特定集成调用适当的 mlflow.<library>.autolog() 函数来显式启用自动记录。

MLflow 跟踪自动捕获有关 CrewAI 代理的以下信息:

  • 每个任务及其执行的代理
  • 每一次 LLM 调用都包含输入提示、补全响应和各种元数据
  • 内存加载和写入操作
  • 每个操作的延迟
  • 引发的任何异常

注释

在无服务器计算群集上,不会自动启用自动记录。 必须显式调用 mlflow.crewai.autolog() 才能为此集成启用自动跟踪。

注释

目前,MLflow CrewAI 集成仅支持同步任务执行的跟踪。 目前不支持异步任务和启动。

先决条件

若要将 MLflow 跟踪与 CrewAI 配合使用,需要安装 MLflow 和 crewai 库(其中包括 crewai_tools)。

开发

对于开发环境,请安装包含 Databricks 附加程序和 crewai 的完整 MLflow 软件包:

pip install --upgrade "mlflow[databricks]>=3.1" crewai

完整 mlflow[databricks] 包包括用于 Databricks 的本地开发和试验的所有功能。

生产

对于生产部署,请安装 mlflow-tracingcrewai

pip install --upgrade mlflow-tracing crewai

mlflow-tracing 已针对生产用途进行优化。

注释

强烈建议使用 MLflow 3 来获得最佳使用 CrewAI 的跟踪体验。

在运行示例之前,需要配置环境:

对于不使用 Databricks 笔记本的用户:设置 Databricks 环境变量:

export DATABRICKS_HOST="https://your-workspace.cloud.databricks.com"
export DATABRICKS_TOKEN="your-personal-access-token"

对于 Databricks 笔记本中的用户:这些凭据会自动为您设置。

API 密钥:确保配置任何必要的 LLM 提供程序 API 密钥。 对于生产用途,请使用 AI 网关或 Databricks 机密 ,而不是硬编码的值:

export OPENAI_API_KEY="your-openai-api-key"
export SERPER_API_KEY="your-serper-api-key"
# Add other provider keys as needed

示例用法

首先,为 CrewAI 启用自动追踪,并根据需要创建一个 MLflow 实验以用于记录追踪数据。 这有助于更好地整理跟踪记录。

import mlflow
import os

# Ensure your API keys (e.g., OPENAI_API_KEY, SERPER_API_KEY) are set in your environment
# os.environ["OPENAI_API_KEY"] = "your-openai-key"
# os.environ["SERPER_API_KEY"] = "your-serper-key"

# Turn on auto tracing by calling mlflow.crewai.autolog()
mlflow.crewai.autolog()

# Set up MLflow tracking to Databricks
mlflow.set_tracking_uri("databricks")
mlflow.set_experiment("/Shared/crewai-demo")

接下来,使用 CrewAI 定义多代理工作流。 以下示例定义了一个将 Web 搜索功能用作工具的行程规划器代理。

from crewai import Agent, Crew, Task
from crewai.knowledge.source.string_knowledge_source import StringKnowledgeSource
from crewai_tools import SerperDevTool, WebsiteSearchTool

from textwrap import dedent

content = "Users name is John. He is 30 years old and lives in San Francisco."
string_source = StringKnowledgeSource(
    content=content, metadata={"preference": "personal"}
)

search_tool = WebsiteSearchTool()

class TripAgents:
    def city_selection_agent(self):
        return Agent(
            role="City Selection Expert",
            goal="Select the best city based on weather, season, and prices",
            backstory="An expert in analyzing travel data to pick ideal destinations",
            tools=[
                search_tool,
            ],
            verbose=True,
        )

    def local_expert(self):
        return Agent(
            role="Local Expert at this city",
            goal="Provide the BEST insights about the selected city",
            backstory="""A knowledgeable local guide with extensive information
        about the city, it's attractions and customs""",
            tools=[search_tool],
            verbose=True,
        )

class TripTasks:
    def identify_task(self, agent, origin, cities, interests, range):
        return Task(
            description=dedent(
                f"""
                Analyze and select the best city for the trip based
                on specific criteria such as weather patterns, seasonal
                events, and travel costs. This task involves comparing
                multiple cities, considering factors like current weather
                conditions, upcoming cultural or seasonal events, and
                overall travel expenses.
                Your final answer must be a detailed
                report on the chosen city, and everything you found out
                about it, including the actual flight costs, weather
                forecast and attractions.

                Traveling from: {origin}
                City Options: {cities}
                Trip Date: {range}
                Traveler Interests: {interests}
            """
            ),
            agent=agent,
            expected_output="Detailed report on the chosen city including flight costs, weather forecast, and attractions",
        )

    def gather_task(self, agent, origin, interests, range):
        return Task(
            description=dedent(
                f"""
                As a local expert on this city you must compile an
                in-depth guide for someone traveling there and wanting
                to have THE BEST trip ever!
                Gather information about key attractions, local customs,
                special events, and daily activity recommendations.
                Find the best spots to go to, the kind of place only a
                local would know.
                This guide should provide a thorough overview of what
                the city has to offer, including hidden gems, cultural
                hotspots, must-visit landmarks, weather forecasts, and
                high level costs.
                The final answer must be a comprehensive city guide,
                rich in cultural insights and practical tips,
                tailored to enhance the travel experience.

                Trip Date: {range}
                Traveling from: {origin}
                Traveler Interests: {interests}
            """
            ),
            agent=agent,
            expected_output="Comprehensive city guide including hidden gems, cultural hotspots, and practical travel tips",
        )

class TripCrew:
    def __init__(self, origin, cities, date_range, interests):
        self.cities = cities
        self.origin = origin
        self.interests = interests
        self.date_range = date_range

    def run(self):
        agents = TripAgents()
        tasks = TripTasks()

        city_selector_agent = agents.city_selection_agent()
        local_expert_agent = agents.local_expert()

        identify_task = tasks.identify_task(
            city_selector_agent,
            self.origin,
            self.cities,
            self.interests,
            self.date_range,
        )
        gather_task = tasks.gather_task(
            local_expert_agent, self.origin, self.interests, self.date_range
        )

        crew = Crew(
            agents=[city_selector_agent, local_expert_agent],
            tasks=[identify_task, gather_task],
            verbose=True,
            memory=True,
            knowledge={
                "sources": [string_source],
                "metadata": {"preference": "personal"},
            },
        )

        result = crew.kickoff()
        return result

trip_crew = TripCrew("California", "Tokyo", "Dec 12 - Dec 20", "sports")
result = trip_crew.run()

警告

对于生产环境,请使用 AI 网关或 Databricks 机密 ,而不是硬编码的值或环境变量来保护 API 密钥管理。

禁用自动跟踪

可以通过调用 mlflow.crewai.autolog(disable=True)mlflow.autolog(disable=True)调用全局禁用 CrewAI 的自动跟踪。