Ai Agent

Agent起源

  • 概念溯源:从泛化到特指的术语分化
在计算机科学领域,"Agent"(代理)是一个具有多重含义的术语。它既可以指代网络通信中的代理服务器,也能表示分布式系统中的自治实体。而 "AI Agent"(智能体)则是人工智能领域的专有概念,特指具备感知、决策、行动能力的智能系统。这种术语的分化,反映了计算机技术从工具属性向智能属性的演进路径。
  • 计算机术语中的”Agent”
根据 IEEE 标准,Agent 是"代表用户或其他程序,以持续、自主的方式执行特定任务的软件实体"。其核心特征是代理性(代表第三方执行操作)和自主性(无需持续人工干预)。
  • AI领域的”Agent”
国际智能体基金会(FIPA)将 AI Agent 定义为 "能够通过传感器感知环境,并通过效应器作用于环境的自治系统"。其核心特征是智能性(基于算法的决策能力)和社会性(与人类或其他 Agent 交互)。

  • LLM中”Agent”
大语言模型可以接受输入,可以分析&推理、可以输出文字、代码、媒体。然而,其无法像人类一样,拥有规划思考能力、运用各种工具与物理世界互动,以及拥有人类的记忆能力。
Al Agents是基于LLM的能够自主理解、自主规划决策、执行复杂任务的智能体
Agent的设计目的是为了处理那些简单的语言模型可能无法直接解决的问题,尤其是当这些任务涉及到多个步骤或者需要外部数据源的情况。


AI Agent基础架构

AI Agent 任务解构

  • 感知 (Perception)
  • 规划 (Planning)
  • 行动 (Action)
  • 观察 (Observation)

以上可以构成一个决策闭环:

规划

规划,可以理解为观察和思考。如果用人类来类比,当我们接到一个任务,我们的思维模式可能会像下面这样:

「a」先思考怎么完成这个任务。
「b」然后审视手头上所拥有的工具,以及如何使用这些工具高效地达成目的。
「c」再会把任务拆分成子任务。(就像咱们做思维导图一样。)
「d」在执行任务的时候,我们会对执行过程进行反思和完善,吸取教训以完善未来的步骤。
「e」执行过程中思考任务何时可以终止。

这是人类的规划能力,我们希望智能体也拥有这样的思维模式,因此可以通过 LLM 提示工程,为智能体赋予这样的思维模式。在智能体中,最重要的是让 LLM 具备这以下两个能力:

  • 任务拆解
  • 反思改进

任务拆解

通过LLM使得智能体可以把大型任务分解为更小的、更可控的子任务,从而能够有效完成复杂的任务。

反思改进

Agent对过去的行动进行自我批评和反思,从错误中学习并改进未来的步骤,从而提高最终结果的质量。

在实际任务中,试错是不可避免的,而自我反思在这个过程中起着至关重要的作用。
它允许 Agent 通过改进过去的行动决策和纠正以前的错误来进行迭代改进。

反思是Agent对事情进行更高层次、更抽象思考的结果。反思是周期性生成的,
当Agent感知到的最新事件的重要性评分之和超过一定阈值时,就会生成反思。
这可以类比为我们常用的成语“三思而后行”,做重大决策的时候,我们会反思自己先前的决策。

plan-and-execute

开发AI Agent的应用对比

框架 代理模式 特性 架构设计 核心功能 技术生态 企业级支持
LangChain 单代理 可通过组合链模拟多代理 模块化设计(链、代理、记忆、工具) 链(chains)、代理(Agents)、工具集成(tools)、记忆(memory)文档加载器 广泛集成向量数据库 社区驱动(开源)
LangGraph 单代理+复杂状态流 支持多步骤决策 有向图结构(节点=任务步骤,边=流程逻辑) 循环/分支控制、状态管理、并行节点执行 与LangChain互补、需自行扩展业务逻辑 开源
Semantic Kernel 单代理 通过插件扩展功能 插件化架构(Skills=功能模块,Planner=任务规划) 任务自动分解(Planner)、语义函数、微软生态插件(Teams, Office等) 紧密绑定Azure,.NET/C#生态优先 微软官方支持企业级SLA
AutoGen 多代理 多角色协作设计 多智能体协同(Agent=独立角色,GroupChat=协作环境) 多角色Agent定义、自主对话协商、任务自动分配 多Agent模式独特、依赖OpenAI模型 微软研究院维护、学术导向
CrewAI 多代理 角色分工协作 角色分工(Agent=团队成员,Task=目标,Process=流程) 角色与目标定义、流程可视化、工具集成 新兴框架,生态逐步扩展,兼容常见工具(如搜索引擎、API) 开源

AI Agent开发实践

first Agent

from langchain_openai import ChatOpenAI
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain_community.agent_toolkits.load_tools import load_tools
from dotenv import load_dotenv
load_dotenv()
"""产品与API
SERPAPI_API_KEY = "ee37d0eae22dbd837968f7c72b651c2feb2f3c1a3987d3cc51a11655ccbe21d4"
"""

# 定义llm
llm = ChatOpenAI(temperature=0, model="gpt-4o-mini")

# 定义工具
tools = load_tools(["serpapi", "llm-math"], llm=llm)

# 初始化agent
agent = initialize_agent(
tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, # 这里有不同的类型
verbose=True, # 是否打印日志
)

result = agent.invoke({"input": "请问现任的中国主席是谁?他的年龄的平方是多少? 请用中文告诉我这两个问题的答案"})
print(result)

工具示例创建

from langchain.agents import Tool
from langchain.agents import AgentType
from langchain.memory import ConversationBufferMemory
from langchain_openai import ChatOpenAI
from langchain_community.utilities import SerpAPIWrapper
from langchain.agents import initialize_agent
from langchain.chains import LLMMathChain
from langchain.prompts import MessagesPlaceholder
from dotenv import load_dotenv
load_dotenv()
"""AgentExecutor"""
llm = ChatOpenAI(
temperature=0,
model="gpt-4o-mini",
)

# 构建一个搜索工具
search = SerpAPIWrapper()

# 创建一个数学计算工具
llm_math_chain = LLMMathChain(
llm=llm,
verbose=True
)

tools = [
Tool(
name="Search",
func=search.run,
description="useful for when you need to answer questions about current events or the current state of the world"
),
Tool(
name="Calculator",
func=llm_math_chain.run,
description="useful for when you need to answer questions about math"
),
]


print(tools)

# 记忆组件
memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True
)

agent_chain = initialize_agent(
tools,
llm,
agent=AgentType.OPENAI_FUNCTIONS,
verbose=True,
handle_parsing_errors=True, # 处理解析错误
agent_kwargs={
"extra_prompt_messages": [MessagesPlaceholder(variable_name="chat_history"),
MessagesPlaceholder(variable_name="agent_scratchpad")],
},
memory=memory # 记忆组件
)

agent_chain.invoke({"input": "你好"})
agent_chain.invoke({"input": "我叫Cat,很高兴见到你"})
agent_chain.invoke({"input": "1+1等于几?"})
agent_chain.invoke({"input": "好厉害,刚才我们都聊了什么?"})