Agno构建具有内存、知识、工具和推理能力的智能体
内容概述
Agno是一个轻量级库,用于构建具有内存、知识、工具和推理能力的智能体。开发者可以使用Agno构建推理智能体、多模态智能体、智能体团队和智能体工作流。它还提供了一个美观的用户界面,用于与智能体进行交互,以及用于监控和评估智能体性能的工具。
特点
- 模型无关性:Agno提供了一个统一的接口,可与23家以上的模型提供商集成,不存在锁定问题。
- 闪电般快速:智能体平均约2微秒即可实例化(比LangGraph快10000倍),平均使用约3.75Kib内存(比LangGraph少50倍)。
- 推理优先:可以使用推理模型、推理工具或自定义的“思维链+工具使用”方法构建能够“思考”和“分析”的智能体。
- 原生多模态:Agno智能体原生支持多模态,能够接收文本、图像、音频和视频输入,并生成相应的输出。
- 先进的多智能体架构:提供了行业领先的多智能体架构,具有路由、协作和协调三种不同模式。
- 长期记忆和会话存储:提供存储和内存类,为智能体提供长期记忆和会话存储功能。
- 20多种向量数据库支持:通过与20多种向量数据库集成,为智能体添加领域知识。
- 结构化输出:智能体原生支持结构化输出,可使用原生结构化输出或JSON模式。
- 监控功能:可以在agno.com上实时监控智能体的会话和性能。
使用方法
入门步骤
- 构建第一个智能体:学习如何使用Agno构建智能体。
- 在游乐场中与智能体聊天:使用美观的智能体用户界面与智能体进行交互。
- 在agno.com上监控智能体:在agno.com上实时监控智能体的性能。
深入学习
- 智能体:学习核心智能体概念。
- 模型:使用任何模型、任何提供商,不存在锁定问题。
- 工具:使用数百种工具扩展智能体的功能。
- 知识:为智能体添加特定领域的知识。
- 向量数据库:为智能体添加语义搜索和检索功能。
- 存储:将智能体的状态和对话持久化到数据库中。
- 内存:记住用户详细信息和会话摘要。
- 嵌入:为知识库生成嵌入。
- 工作流:使用智能体构建复杂的工作流。
一、Introduction(简介)
1. 定义与用途
Agno是一个轻量级库,用于构建具有记忆、知识、工具和推理能力的智能体(Agents)。开发者可以利用Agno构建推理智能体、多模态智能体、智能体团队以及智能体工作流。它还提供了美观的用户界面,方便与智能体进行交互,同时具备监控和评估智能体性能的工具。
2. 示例代码
以下是一个使用Agno构建的智能体示例,该智能体可以研究并撰写关于某只股票的报告:
from agno.agent import Agent
from agno.models.anthropic import Claude
from agno.tools.reasoning import ReasoningTools
from agno.tools.yfinance import YFinanceTools
agent = Agent(
model=Claude(id="claude-3-7-sonnet-latest"),
tools=[
ReasoningTools(add_instructions=True),
YFinanceTools(stock_price=True, analyst_recommendations=True, company_info=True, company_news=True),
],
instructions=[
"Use tables to display data",
"Only output the report, no other text",
],
markdown=True,
)
agent.print_response("Write a report on NVDA", stream=True, show_full_reasoning=True, stream_intermediate_steps=True)
3. 关键特性
- 模型无关性:Agno提供了统一的接口,可与23家以上的模型提供商集成,不存在锁定问题,开发者可以自由选择适合的模型。
- 闪电般快速:智能体平均约2微秒即可实例化(比LangGraph快10000倍),平均使用约3.75Kib内存(比LangGraph少50倍),具有极高的性能。
- 推理优先:可以使用推理模型、推理工具或自定义的“思维链 + 工具使用”方法构建能够“思考”和“分析”的智能体,增强智能体的决策能力。
- 原生多模态:Agno智能体原生支持多模态,能够接收文本、图像、音频和视频输入,并生成相应的输出,适用于多种复杂场景。
- 先进的多智能体架构:提供了行业领先的多智能体架构,具有路由、协作和协调三种不同模式,可根据具体任务需求灵活配置。
- 长期记忆和会话存储:提供存储和内存类,为智能体提供长期记忆和会话存储功能,使智能体能够记住用户的历史交互信息。
- 20多种向量数据库支持:通过与20多种向量数据库集成,为智能体添加领域知识,提高智能体的知识检索和应用能力。
- 结构化输出:智能体原生支持结构化输出,可使用原生结构化输出或JSON模式,方便与其他系统进行数据交互。
- 监控功能:可以在agno.com上实时监控智能体的会话和性能,及时发现和解决问题。
二、Run(运行)
1. 安装依赖
在运行Agno智能体之前,需要安装必要的依赖库。例如,若使用OpenAI模型,可通过以下命令安装:
pip install agno openai
同时,需要设置相应的API密钥,如:
export OPENAI_API_KEY=sk-xxxx
2. 基本智能体运行
以下是一个创建基本智能体并运行的示例:
from agno.agent import Agent
from agno.models.openai import OpenAIChat
agent = Agent(
model=OpenAIChat(id="gpt-4o"),
description="You are an enthusiastic news reporter with a flair for storytelling!",
markdown=True
)
agent.print_response("Tell me about a breaking news story from New York.", stream=True)
此示例创建了一个新闻记者智能体,并向其询问纽约的突发新闻。
3. 带工具的智能体运行
为智能体添加工具可以扩展其功能。例如,添加DuckDuckGo搜索工具:
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.tools.duckduckgo import DuckDuckGoTools
agent = Agent(
model=OpenAIChat(id="gpt-4o"),
description="You are an enthusiastic news reporter with a flair for storytelling!",
tools=[DuckDuckGoTools()],
show_tool_calls=True,
markdown=True
)
agent.print_response("Tell me about a breaking news story from New York.", stream=True)
安装相应依赖后运行:
pip install duckduckgo-search
python agent_with_tools.py
4. 带知识库的智能体运行
智能体可以集成知识库,以提供更准确的回答。以下是一个集成PDF知识库的示例:
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.embedder.openai import OpenAIEmbedder
from agno.tools.duckduckgo import DuckDuckGoTools
from agno.knowledge.pdf_url import PDFUrlKnowledgeBase
from agno.vectordb.lancedb import LanceDb, SearchType
agent = Agent(
model=OpenAIChat(id="gpt-4o"),
description="You are a Thai cuisine expert!",
instructions=[
"Search your knowledge base for Thai recipes.",
"If the question is better suited for the web, search the web to fill in gaps.",
"Prefer the information in your knowledge base over the web results."
],
knowledge=PDFUrlKnowledgeBase(
urls=["https://agno-public.s3.amazonaws.com/recipes/ThaiRecipes.pdf"],
vector_db=LanceDb(
uri="tmp/lancedb",
table_name="recipes",
search_type=SearchType.hybrid,
embedder=OpenAIEmbedder(id="text-embedding-3-small"),
),
),
tools=[DuckDuckGoTools()],
show_tool_calls=True,
markdown=True
)
# Comment out after the knowledge base is loaded
if agent.knowledge is not None:
agent.knowledge.load()
agent.print_response("How do I make chicken and galangal in coconut milk soup", stream=True)
agent.print_response("What is the history of Thai curry?", stream=True)
安装相应依赖后运行:
pip install lancedb tantivy pypdf duckduckgo-search
python agent_with_knowledge.py
三、Metrics(指标)
在Agno中,Metrics可用于评估智能体的性能。虽然搜索结果中未明确提及Agno特有的Metrics相关内容,但一般来说,评估智能体可能会涉及以下指标:
1. 响应时间
智能体从接收到请求到给出响应的时间,反映了智能体的处理速度。响应时间越短,智能体的性能越好。
2. 准确率
智能体给出的回答与正确答案的匹配程度。例如,在问答任务中,准确率可以通过计算正确回答的问题数量与总问题数量的比例来衡量。
3. 召回率
在需要检索信息的任务中,召回率表示智能体能够检索到的相关信息占所有相关信息的比例。
4. 工具使用效率
如果智能体使用了工具,工具使用效率可以衡量工具的使用效果。例如,工具调用的成功率、工具调用的平均时间等。
5. 资源利用率
包括内存使用、CPU使用等,反映了智能体在运行过程中对系统资源的占用情况。
四、Sessions(会话)
1. 会话存储
Agno支持将会话数据存储在数据库中,以实现跨会话的连续性。例如,使用SQLite数据库存储会话信息:
from agno.agent import Agent
from agno.storage.sqlite import SqliteStorage
# 初始化存储
storage = SqliteStorage(table_name="agent_sessions", db_file="tmp/agent.db")
agent = Agent(
# 其他配置...
storage=storage,
add_history_to_messages=True,
num_history_runs=3,
markdown=True,
)
这样,智能体可以在不同的会话中保留历史交互信息,提供更个性化的服务。
2. 会话管理
智能体可以管理会话状态,例如在会话结束时保存必要的信息,在新会话开始时恢复状态。通过会话管理,智能体可以更好地理解用户的上下文,提供更连贯的交互体验。
五、State(状态)
在Agno中,智能体的状态可以包括多个方面,如当前任务、历史交互信息、知识库状态等。
1. 任务状态
智能体在执行任务过程中的状态,例如任务是否完成、任务的进度等。可以通过状态管理来跟踪任务的执行情况,确保任务按计划完成。
2. 历史交互状态
智能体保存的与用户的历史交互信息,包括用户的提问、智能体的回答等。这些信息可以用于上下文理解和个性化服务,例如在后续交互中参考历史信息,提供更准确的回答。
3. 知识库状态
知识库的状态包括知识库是否加载、知识库的更新情况等。智能体可以根据知识库的状态来决定是否需要重新加载或更新知识库,以保证回答的准确性。
六、Memory(记忆)
1. 记忆类型
Agno支持三种类型的记忆:
- 会话存储(Session Storage):保存智能体的会话信息,包括聊天历史和会话状态。会话存储是一种短期记忆,数据存储在数据库中,可实现多轮对话。例如:
from agno.memory.v2.db.sqlite import SqliteMemoryDb
from agno.memory.v2.memory import Memory
# 初始化内存
memory = Memory(
model=OpenAIChat(id="gpt-4.1"),
db=SqliteMemoryDb(table_name="user_memories", db_file="tmp/agent.db"),
)
用户记忆(User Memories):智能体可以存储通过对话了解到的关于用户的洞察和事实,帮助智能体为用户提供更个性化的响应。例如,记住用户的偏好、兴趣等信息。
会话摘要(Session Summaries):当聊天历史过长时,智能体可以存储会话的摘要信息,方便后续参考。
2. 记忆的使用
可以通过Agent.context
使用自定义的记忆实现。以下是一个使用记忆和存储的完整示例:
from agno.agent import Agent
from agno.memory.v2.db.sqlite import SqliteMemoryDb
from agno.memory.v2.memory import Memory
from agno.models.openai import OpenAIChat
from agno.storage.sqlite import SqliteStorage
from rich.pretty import pprint
# UserId for the memories
user_id = "ava"
# Database file for memory and storage
db_file = "tmp/agent.db"
# Initialize memory.v2
memory = Memory(
model=OpenAIChat(id="gpt-4.1"),
db=SqliteMemoryDb(table_name="user_memories", db_file=db_file),
)
# Initialize storage
storage = SqliteStorage(table_name="agent_sessions", db_file=db_file)
# Initialize Agent
agent = Agent(
model=OpenAIChat(id="gpt-4.1"),
memory=memory,
enable_agentic_memory=True,
enable_user_memories=True,
storage=storage,
add_history_to_messages=True,
num_history_runs=3,
markdown=True,
)
memory.clear()
agent.print_response(
"My name is Ava and I like to ski.",
user_id=user_id,
stream=True,
stream_intermediate_steps=True
)
七、Tools(工具)
1. 内置工具
Agno提供了多种内置工具,如:
- ReasoningTools:用于支持智能体的推理能力,帮助智能体进行思考和分析。
- YFinanceTools:可用于获取股票价格、分析师推荐、公司信息和公司新闻等金融信息。
- DuckDuckGoTools:用于搜索网络信息,为智能体提供实时的互联网数据。
2. 工具集成
智能体可以集成多个工具,以扩展其功能。例如:
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.tools.reasoning import ReasoningTools
from agno.tools.yfinance import YFinanceTools
agent = Agent(
model=OpenAIChat(id="gpt-4o"),
tools=[
ReasoningTools(add_instructions=True),
YFinanceTools(stock_price=True, analyst_recommendations=True, company_info=True, company_news=True),
],
# 其他配置...
)
3. 自定义工具
开发者还可以自定义工具,以满足特定的需求。自定义工具需要实现相应的接口,例如:
from agno.tools.base import BaseTool
class CustomTool(BaseTool):
def run(self, input: str) -> str:
# 实现自定义逻辑
return processed_result
然后将自定义工具集成到智能体中:
agent = Agent(
# 其他配置...
tools=[CustomTool()],
)
八、Structured Output(结构化输出)
1. 功能介绍
结构化输出确保智能体始终生成符合指定JSON Schema的响应,避免了模型遗漏必需的键或生成无效的枚举值等问题。具有以下好处:
- 可靠的类型安全性:不需要验证或重试格式不正确的响应,提高了数据的准确性和可靠性。
- 明确的拒绝:基于安全的模型拒绝现在可以通过程序检测,方便进行错误处理。
- 更简单的提示:不需要使用强烈措辞的提示来实现一致的格式化,简化了提示的编写。
2. 使用方式
结构化输出在OpenAI API中有两种形式:
- 函数调用:当构建一个应用程序,需要将模型和应用程序的功能桥接起来时非常有用。例如,让模型访问查询数据库的函数,以构建一个可以帮助用户处理订单的AI助手。
- json_schema响应格式:当想要指示模型在响应用户时使用的有结构的模式,而不是模型调用工具时,更适合使用这种方式。
3. 示例代码
以下是一个使用结构化输出进行链式思考数学辅导的示例:
from pydantic import BaseModel
from openai import OpenAI
client = OpenAI()
class Step(BaseModel):
explanation: str
output: str
class MathReasoning(BaseModel):
steps: list[Step]
final_answer: str
completion = client.beta.chat.completions.parse(
model="gpt-4o-2024-08-06",
messages=[
{"role": "system", "content": "You are a helpful math tutor. Guide the user through the solution step by step."},
{"role": "user", "content": "how can I solve 8x + 7 = -23"}
],
response_format=MathReasoning,
)
math_reasoning = completion.choices[0].message.parsed
九、Multimodal(多模态)
1. 多模态支持
Agno智能体原生支持多模态,能够处理文本、图像、音频和视频等多种数据模态。例如,智能体可以接收图像输入,并生成对图像的描述;也可以接收音频输入,并进行语音识别和处理。
2. 应用场景
- 智能客服:可以处理用户的文本、图像、语音咨询,提供更全面的服务。
- 内容生成:结合文本、图像、音频和视频生成多样化的内容,如营销图片、语音解说、视频脚本等。
- 教育辅助:通过多模态的方式呈现教学内容,提高学习效果。
3. 示例代码
虽然搜索结果中未提供完整的多模态处理示例代码,但一般来说,可以通过扩展工具链来实现多模态功能。例如,调用DALL - E生成营销图片,使用ElevenLabs合成语音解说等。
十、User - Control - Flow(用户控制流)
1. 概念
用户控制流允许用户对智能体的执行流程进行控制,例如决定智能体何时调用工具、如何处理不同的情况等。通过用户控制流,用户可以根据具体需求定制智能体的行为。
2. 应用场景
在一些复杂的任务中,用户可能需要对智能体的执行过程进行干预。例如,在一个需要多步骤处理的任务中,用户可以根据中间结果决定是否继续执行下一步,或者调整后续的处理策略。
3. 实现方式
虽然搜索结果中未详细提及Agno中用户控制流的具体实现方式,但一般可以通过在智能体的配置中添加指令或条件判断来实现。例如,在智能体的指令中设置特定的条件,当满足条件时执行相应的操作。
十一、Prompts(提示词)
1. 提示词的作用
提示词是引导智能体生成特定输出的关键。有效的提示词可以帮助智能体更好地理解用户的需求,提供更准确的回答。
2. 提示词设计原则
- 明确具体:提示词应避免歧义,清晰地表达用户的需求。例如,“Search the web for recent stock prices of Apple”比“Get Apple stock info”更易执行。
- 包含必要信息:可以提供一些额外的信息,如任务的背景、期望的输出格式等,帮助智能体更好地完成任务。
3. 示例
在创建智能体时,可以通过instructions
参数传递提示词:
agent = Agent(
# 其他配置...
instructions=[
"Use tables to display data",
"Only output the report, no other text",
],
)
十二、Knowledge(知识)
1. 知识库集成
Agno支持通过向量数据库集成知识库,为智能体提供领域特定的知识。例如,使用LanceDB数据库和PDF知识库:
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.embedder.openai import OpenAIEmbedder
from agno.knowledge.pdf_url import PDFUrlKnowledgeBase
from agno.vectordb.lancedb import LanceDb, SearchType
agent = Agent(
model=OpenAIChat(id="gpt-4o"),
description="You are a Thai cuisine expert!",
instructions=[
"Search your knowledge base for Thai recipes.",
"If the question is better suited for the web, search the web to fill in gaps.",
"Prefer the information in your knowledge base over the web results."
],
knowledge=PDFUrlKnowledgeBase(
urls=["https://agno-public.s3.amazonaws.com/recipes/ThaiRecipes.pdf"],
vector_db=LanceDb(
uri="tmp/lancedb",
table_name="recipes",
search_type=SearchType.hybrid,
embedder=OpenAIEmbedder(id="text-embedding-3-small"),
),
),
# 其他配置...
)
2. 知识检索
智能体可以使用混合搜索模式(语义搜索 + 关键词搜索)进行知识检索,提高检索的准确性和召回率。同时,还可以使用重排序模型对检索结果进行优化。
3. 知识更新
知识库可以根据需要进行更新,以保证知识的时效性。例如,定期更新PDF知识库中的内容,或者添加新的知识源。
十三、Storage(存储)
1. 存储类型
Agno支持多种存储类型,如SQLite、PostgreSQL等。以SQLite为例:
from agno.storage.sqlite import SqliteStorage
# 初始化存储
storage = SqliteStorage(table_name="agent_sessions", db_file="tmp/agent.db")
2. 存储用途
存储主要用于保存智能体的会话信息、历史交互信息、知识库状态等。通过存储,智能体可以在不同的会话中保留必要的信息,提供更连贯的服务。
3. 存储管理
可以对存储进行管理,例如定期清理过期的会话信息,优化存储的使用效率。
十四、Context(上下文)
1. 上下文的概念
在Agno中,上下文指的是智能体在处理任务时所依赖的信息,包括用户的历史提问、智能体的历史回答、知识库中的相关知识等。上下文可以帮助智能体更好地理解用户的需求,提供更准确的回答。
2. 上下文管理
智能体可以管理上下文信息,例如在每次交互后更新上下文,或者根据上下文的重要性进行筛选和排序。通过有效的上下文管理,智能体可以提高处理复杂任务的能力。
3. 上下文应用
在智能体的配置中,可以通过add_history_to_messages
参数将历史交互信息添加到当前的消息中,以增强上下文的利用:
agent = Agent(
# 其他配置...
add_history_to_messages=True,
num_history_runs=3,
markdown=True,
)
十五、Teams(团队)
1. 团队组成
Agno中的团队由团队领导者和团队成员组成:
- 团队领导者:负责协调代理(成员)之间的互动,根据为团队配置的通信模式决定如何分配任务。
- 团队成员:是单独的代理,每个代理都设计用于执行特定任务。根据操作的复杂性,团队可以有一个或多个成员。
2. 通信模式
Agno提供了三种强大的通信模式:
- 路由模式:团队领导者充当路由器,根据任务将传入请求定向到最合适的代理。例如,根据问题的类型将请求路由到不同的专业代理。
- 协作模式:当任务可以通过多个代理从不同角度并行执行时,这种模式非常理想。团队领导者将请求重定向给团队成员并收集响应,然后聚合并响应统一输出。
- 协调模式:在需要顺序处理和代理间通信的工作流中非常有用。例如,一个代理完成任务后,将结果传递给下一个代理进行后续处理。
3. 示例代码
以下是一个使用团队协作模式的示例:
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.tools.duckduckgo import DuckDuckGoTools
from agno.tools.yfinance import YFinanceTools
from agno.team import Team
# 创建维基百科代理
wikipedia_agent = Agent(
name="Wikipedia Agent",
role="Search and summarize Wikipedia content.",
model=OpenAIChat(id="gpt-4o"),
tools=[DuckDuckGoTools()],
instructions="Always include sources",
show_tool_calls=True,
markdown=True,
)
# 创建网络搜索代理
web_search_agent = Agent(
name="Web Search Agent",
role="Get real-time data from the internet.",
model=OpenAIChat(id="gpt-4o"),
tools=[DuckDuckGoTools()],
instructions="Always include sources",
show_tool_calls=True,
markdown=True,
)
# 创建团队
team = Team(
members=[wikipedia_agent, web_search_agent],
success_criteria="A comprehensive report with data support."
)
# 发送请求
team.print_response("What is the market prospect of AI chip companies?", stream=True)