Agno:使用简单代码构建AI智能体

580 阅读6分钟

使用Agno框架,你可以用简洁的代码构建强大的智能体。

人工智能(更具体地说是大语言模型[LLMs])的创新如此迅速,以至于让我们应接不暇,这让那些想要学会所有技术的人感到疯狂。

这就是为什么我不再试图学习所有的智能体AI框架——即LangChain、LangGraph、LlamaIndex、AutoGen、Agno、CrewAI以及许多其他框架——而是开始专注于其中一个,这样我就能学到真正重要的东西,也就是构建健壮且高性能的智能体。

查看了这些框架的文档后,我决定选择Agno

在这篇文章中,我们将学习构建简单AI智能体的基础知识,帮助你完成日常任务。

跟我来吧。

构建你的第一个AI智能体

智能体是赋予了工具能力的LLMs,可以执行以下操作:

  • 访问互联网
  • 发送邮件
  • 安排会议
  • 管理计算机文件

如果一个模型只能接收提示并返回文本响应,而无法执行任何其他任务,那么它就不是智能体。

使用Agno构建AI智能体非常简单。为此,我们使用Agent类。对于智能体AI的hello world,我们需要做以下工作。

使用uv包构建虚拟环境。

# 命令1:安装UV包
pip install uv

# 命令2:初始化新项目
# 确保导航到项目的父文件夹(如 C:/Desktop)
uv init <项目名称>

# 命令3:初始化新的虚拟环境
uv venv

# 命令4:激活虚拟环境
.venv\Scripts\activate (Windows)

# 或者
source .venv/bin/activate (Linux/macOS)

导入模块。

  • Agent类,使与LLM的连接成为可能。
  • os包,用于与存储API密钥的环境变量交互。
  • model模块,在这个例子中是Geminimodel就像智能体的大脑。它决定智能体如何思考并根据通过提示和工具接收到的指令采取行动。
from agno.agent import Agent
from agno.models.google import Gemini
import os

创建智能体。

# 创建智能体
agent = Agent(
    model= Gemini(id="gemini-1.5-flash",
                  api_key = os.environ.get("GEMINI_API_KEY")),
    description= "一个助理智能体",
    instructions= ["要简洁。返回markdown表格"],
    expected_output= "包含月份、季节和平均温度的表格", 
    markdown= True,
    monitoring= True
    )

用提示运行智能体并打印响应。

# 运行智能体
response = agent.print_response("纽约一年中每个月的天气如何?",
                                markdown=True)

这就是你将在终端屏幕上看到的内容。 很好。不过,你一定在想我们不需要智能体来询问天气。我们可以直接问Gemini。我同意这个观点。

我添加这一部分的原因是为了让你学习如何创建最简单的智能体的基础知识,不需要任何工具或花哨的功能。

现在让我们看看这个Agent类还能提供什么。以下是我认为在创建智能体时最有用的参数。所以,请记笔记。

  • model:智能体的大脑。选择你偏好的,如Gemini、Claude、ChatGPT**、Mistral。
  • system_message:重要信息,将设定你的机器人的人格和语调(例如,你是一个友好的职业教练...
  • description:智能体的描述,添加到系统消息的开头
  • instructions:类似于系统提示,但用于任务级别,设置目标(例如,根据用户输入为用户提供职业建议)。
  • tools:提供给模型的工具列表
  • goal:此任务的目标
  • success_criteria:智能体的成功标准
  • expected_output:提供智能体的预期输出(例如,一个名为'summary_report.md'的markdown格式文件)。
  • context:工具和提示函数可用的上下文
  • add_context:当你使用context参数时需要。如果为True,将上下文添加到用户提示中。
  • retries:尝试重试的次数
  • delay_between_retries:重试之间的延迟
  • exponential_backoff:如果为True,每次重试之间的延迟会翻倍。当你的智能体遇到*错误429[请求过多]*时很有用
  • markdown:如果为True,添加使用markdown格式化输出的指令
  • monitoring:将智能体信息记录到agno.com仪表板进行监控

查看此页面中的完整参数列表:docs.agno.com/reference/a…

集成工具

接下来,我们将通过为简单的"机器人"提供工具,将其转换为智能体。工具可以是Python中用户自定义的简单函数,也可以是Agno框架中的工具。

docs.agno.com/tools/intro…

YouTube摘要智能体

让我们想象一位正在准备讲座的老师。这位老师当时忙于批改作业,无法为晚上的课程做充分准备。

这位老师确实需要一些技术帮助,所以他创建了一个简单的智能体来"观看"YouTube视频并帮助他准备课程。

他导入了一些模块。

# 导入
import os
from agno.agent import Agent
from agno.models.google import Gemini
from youtube_transcript_api import YouTubeTranscriptApi

然后创建一个获取YouTube转录的函数。该函数将被AI智能体用作自定义工具。

def get_yt_transcript(video_id:str) -> str:

    """
    使用此函数通过视频ID获取YouTube视频的转录。

    参数
    ----------
    video_id : str
        YouTube视频的ID。

    返回值
    -------
    str
        视频的转录内容。
    """

    # 实例化
    ytt_api = YouTubeTranscriptApi()

    # 获取
    yt = ytt_api.fetch(video_id)

    # 返回
    return ''.join([line.text for line in yt])

现在,创建智能体。

  • description:智能体的角色描述。
  • instructions:确定要执行的任务。
  • tools:智能体使用的自定义工具。这是一个简单的Python函数。
  • expected_output:期望的输出结果。
# 创建智能体
agent = Agent(
    model= Gemini(id="gemini-1.5-flash",
                  api_key = os.environ.get("GEMINI_API_KEY")),
                  description= "你是一个总结YouTube视频的助手。",
                  instructions= ["将视频的概念分解为5个要点",
                                 "为我创建类比来教授学生",
                                 "创建2个问题来测试学生的理解"],
                  tools=[get_yt_transcript],
                  expected_output= "包含5个要点和2个问题的视频摘要。",
                  markdown=True,
                  show_tool_calls=True)


# 运行智能体
prompt = """总结ID为'pg19Z8LL06w'的视频文本""" 
agent.print_response(prompt, markdown=True)

以及响应结果:

部署选项

作为智能体的部署选项,可以通过不同方式进行部署。

  1. 本地部署。如果你只是为自己运行这个智能体,就不需要部署。只需在你的机器上运行即可视为已部署。
  2. Streamlit。第二简单的选项是创建Streamlit网络应用并使用其内置的部署工具进行部署。
  3. Railway(付费) 。与Streamlit类似,使用Railway,你可以直接从GitHub仓库部署。
  4. Docker + 云服务提供商。你可以将应用添加到容器中,并使用AWS或Azure进行部署。

结语

智能体是大语言模型的有用应用。它们可以帮助我们解决许多问题。

我想留下的几个额外建议是:

  • 使用智能体解决单一任务。
  • 不要过度复杂化。如果你的智能体需要使用超过3个工具,也许你应该考虑创建一个相互交互和协作的智能体团队
  • 完善你的提示。给出清晰的描述指令来帮助你的智能体表现更好。
  • 阅读文档。正确使用参数。这会产生很大的差别。
  • 例如,如果在使用context参数时不使用add_context=True,你的智能体可能会出现意外行为。
  • 将智能体用于真正需要大语言模型的任务。如果你可以用简单的Python函数完成某事,就不要为此创建智能体。