智能体
什么是代理?¶
什么是代理?
代理是一个 自主单元,编程用于:
- 执行任务
- 做出决策
- 与其他代理通信
可以将代理视为团队的一员,具有特定技能和特定工作。代理可以有不同的角色,如“研究员”、“作家”或“客户支持”,每个角色都为团队的整体目标做出贡献。
代理属性¶
| 属性 | 参数 | 描述 |
|---|---|---|
| 角色 | role |
定义代理在团队中的功能。它决定了代理最适合执行的任务类型。 |
| 目标 | goal |
代理旨在实现的单个目标。它指导代理的决策过程。 |
| 背景故事 | backstory |
为代理的角色和目标提供上下文,丰富互动和协作动态。 |
| LLM (可选) | llm |
表示将运行代理的语言模型。它动态地从 OPENAI_MODEL_NAME 环境变量中获取模型名称,如果未指定,则默认为“gpt-4”。 |
| 工具 (可选) | tools |
代理可以用来执行任务的一组能力或函数。预期为与代理执行环境兼容的自定义类的实例。工具初始化时默认值为空列表。 |
| 函数调用 LLM (可选) | function_calling_llm |
指定将处理此代理工具调用的语言模型,如果传递,则覆盖团队函数调用 LLM。默认为 None。 |
| 最大迭代次数 (可选) | max_iter |
最大迭代次数是代理在被强制给出最佳答案之前可以执行的最大迭代次数。默认为 25。 |
| 最大 RPM (可选) | max_rpm |
最大 RPM 是代理为避免速率限制而可以每分钟执行的最大请求数。它是可选的,可以不指定,默认值为 None。 |
| 最大执行时间 (可选) | max_execution_time |
最大执行时间是代理执行任务的最大执行时间。它是可选的,可以不指定,默认值为 None,表示没有最大执行时间。 |
| 详细模式 (可选) | verbose |
将此设置为 True 会配置内部记录器以提供详细的执行日志,有助于调试和监控。默认为 False。 |
| 允许委派 (可选) | allow_delegation |
代理可以将任务或问题委托给彼此,确保每个任务都由最合适的代理处理。默认为 False。 |
| 步骤回调 (可选) | step_callback |
在代理的每个步骤之后调用的函数。这可以用于记录代理的操作或执行其他操作。它将覆盖团队的 step_callback。 |
| 缓存 (可选) | cache |
指示代理是否应使用工具使用的缓存。默认为 True。 |
| 系统模板 (可选) | system_template |
指定代理的系统格式。默认为 None。 |
| 提示模板 (可选) | prompt_template |
指定代理的提示格式。默认为 None。 |
| 响应模板 (可选) | response_template |
指定代理的响应格式。默认为 None。 |
| 允许代码执行 (可选) | allow_code_execution |
为代理启用代码执行。默认为 False。 |
| 最大重试限制 (可选) | max_retry_limit |
代理在发生错误时执行任务的最大重试次数。默认为 2。 |
| 使用系统提示 (可选) | use_system_prompt |
添加不使用系统提示的能力(以支持 o1 模型)。默认为 True。 |
| 尊重上下文窗口 (可选) | respect_context_window |
摘要策略,以避免溢出上下文窗口。默认为 True。 |
创建代理¶
代理交互
代理可以使用 crewAI 内置的委派和通信机制相互交互。这允许在团队内进行动态任务管理和问题解决。
要创建代理,通常需要使用所需的属性初始化 Agent 类的实例。以下是一个包含所有属性的概念示例:
# 示例:创建具有所有属性的代理
from crewai import Agent
agent = Agent(
role='数据分析师',
goal='提取可操作见解',
backstory="""你是大型公司的数据分析师。
你负责分析数据并向业务提供见解。
你目前正在参与一个项目,分析我们营销活动的表现。""",
tools=[my_tool1, my_tool2], # 可选,默认为空列表
llm=my_llm, # 可选
function_calling_llm=my_llm, # 可选
max_iter=15, # 可选
max_rpm=None, # 可选
max_execution_time=None, # 可选
verbose=True, # 可选
allow_delegation=False, # 可选
step_callback=my_intermediate_step_callback, # 可选
cache=True, # 可选
system_template=my_system_template, # 可选
prompt_template=my_prompt_template, # 可选
response_template=my_response_template, # 可选
config=my_config, # 可选
crew=my_crew, # 可选
tools_handler=my_tools_handler, # 可选
cache_handler=my_cache_handler, # 可选
callbacks=[callback1, callback2], # 可选
allow_code_execution=True, # 可选
max_retry_limit=2, # 可选
use_system_prompt=True, # 可选
respect_context_window=True, # 可选
)
设置提示模板¶
提示模板用于格式化代理的提示。你可以使用它们来更新代理的系统、常规和响应模板。以下是如何设置提示模板的示例:
agent = Agent(
role="{topic} 专家",
goal="弄清楚 {goal}",
backstory="我是 {role} 的大师",
system_template="""<|start_header_id|>系统<|end_header_id|>
{{ .System }}<|eot_id|>""",
prompt_template="""<|start_header_id|>用户<|end_header_id|>
{{ .Prompt }}<|eot_id|>""",
response_template="""<|start_header_id|>助手<|end_header_id|>
{{ .Response }}<|eot_id|>""",
)
引入第三方代理¶
通过使用 crewai 的 BaseAgent 类扩展第三方代理,如 LlamaIndex、Langchain、Autogen 或完全自定义代理。
BaseAgent 包含与你的团队集成所需的属性和方法,以运行并将任务委派给团队中的其他代理。
CrewAI 是一个通用多代理框架,允许所有代理协同工作以自动化任务和解决问题。
from crewai import Agent, Task, Crew
from custom_agent import CustomAgent # 你需要构建并扩展自己的代理逻辑,使用 CrewAI 的 BaseAgent 类,然后在此处导入。
from langchain.agents import load_tools
langchain_tools = load_tools(["google-serper"], llm=llm)
agent1 = CustomAgent(
role="代理角色",
goal="谁是 {input}?",
backstory="代理背景故事",
verbose=True,
)
task1 = Task(
expected_output="{input} 的简短传记",
description="{input} 的简短传记",
agent=agent1,
)
agent2 = Agent(
role="代理角色",
goal="总结 {input} 的简短传记,并在需要时进行更多研究",
backstory="代理背景故事",
verbose=True,
)
task2 = Task(
description="简短传记的 tldr 总结",
expected_output="传记的 5 个要点总结",
agent=agent2,
context=[task1],
)
my_crew = Crew(agents=[agent1, agent2], tasks=[task1, task2])
crew = my_crew.kickoff(inputs={"input": "马克·吐温"})
结论¶
代理是 CrewAI 框架的构建块。通过了解如何定义和与代理交互,你可以创建复杂的 AI 系统,利用协作智能的力量。