详细介绍:第14章 AI Agent——构建自主智能助理
1. 项目概述
如果说LLM是“大脑”,那么Agent就是赋予这个大脑“身体”和“工具”的系统,使其能够感知环境、做出决策、并采取行动。Agent是当前AI领域最激动人心的前沿方向之一,它代表着从被动响应到主动执行的范式转变。本项目将带你进入Agent的世界,构建一个能够自主规划和执行任务的智能助理。
核心目标:
开发一个具备基本Agent能力的AI助理,它能够:
- 理解复杂指令:接收一个高层次的目标,例如“查询今天北京的天气,并计算100美元按当前汇率是多少人民币”。
- 自主规划 (Planning):将复杂目标分解成一系列可执行的子任务。
- 工具使用 (Tool Use):调用外部API(如天气查询、汇率计算)来获取信息或执行操作。
- 结果整合 (Synthesis):整合所有子任务的结果,形成最终的、符合用户目标的答案。
你将学习到的核心技术:
- Agent框架:理解主流Agent框架(如LangChain, LlamaIndex)的核心思想和组件。
- ReAct (Reason + Act) 思想:学习Agent如何通过“思考”和“行动”的循环来完成任务。
- Function Calling:掌握如何利用LLM的Function Calling能力,使其能够结构化地调用外部工具。
- 任务分解与执行:了解Agent如何处理依赖关系,一步步完成复杂任务。
Agent工作流程图
graph TDA[用户输入高层目标] --> B{Agent核心循环}subgraph sLoop[Agent核心循环]B1[思考 - Reasoning: 我应该做什么?] --> B2[规划 - Planning: 分解任务,选择工具]B2 --> B3[行动 - Action: 调用工具API]B3 -- 返回结果 --> B4[观察 - Observation: 分析工具结果]B4 --> B1endB -- 任务完成 --> C[整合最终答案]C --> D[返回给用户]subgraph sTools[外部工具 - APIs]T1[天气查询API]T2[汇率计算API]T3[搜索引擎API]endB3 --> T1B3 --> T2B3 --> T3
2. 核心概念:Agent = LLM + 规划 + 工具
一个基础的Agent系统可以被看作是以下三个核心组件的结合:
- LLM (大脑):作为认知核心,负责理解、推理、规划和决策。
- 规划 (Planning):将用户的复杂目标分解为一系列可管理的小步骤。最经典的模式是ReAct,即
Reason
(思考下一步该做什么)和Act
(执行选择的动作)的交替循环。 - 工具 (Tools):赋予Agent与外部世界交互的能力。工具可以是任何东西:一个函数、一个API端点、一个数据库查询等。通过Function Calling,LLM可以输出结构化的JSON来指定调用哪个工具以及传递什么参数。
3. 项目实战:构建一个LangChain Agent
LangChain是一个强大的Agent开发框架,它极大地简化了构建Agent的复杂性。我们将使用LangChain和OpenAI的Function Calling能力来构建我们的智能助理。
3.1 环境准备
!pip install -q langchain langchain_openai langchain_community duckduckgo-search
3.2 定义我们的工具 (Tools)
我们将为Agent提供两个工具:一个用于网络搜索,一个用于数学计算。
import os
from langchain_community.tools import DuckDuckGoSearchRun
from langchain_core.tools import Tool
# 设置你的OpenAI API密钥
# os.environ["OPENAI_API_KEY"] = "your_openai_api_key"
# 1. 搜索工具
search_tool = DuckDuckGoSearchRun()
# 2. 计算器工具 (使用lambda函数快速定义一个简单的工具)
# LangChain会自动推断出这个函数的输入和输出
calculator_tool = Tool(
name="Calculator",
func=lambda expression: eval(expression), # 注意:eval有安全风险,仅用于演示
description="当你需要计算数学表达式时使用。"
)
# 将所有工具放入一个列表
tools = [search_tool, calculator_tool]
3.3 初始化LLM和Agent
我们将使用支持Function Calling的OpenAI模型,并使用LangChain提供的便捷函数来创建一个Agent。
from langchain_openai import ChatOpenAI
from langchain.agents import create_openai_functions_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
# 选择一个支持Function Calling的模型
llm = ChatOpenAI(model="gpt-3.5-turbo-1106", temperature=0)
# 设计Agent的Prompt
# 这个Prompt模板告诉Agent它的角色、可用的工具,以及如何与用户互动
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个乐于助人的AI助理。你可以使用工具来回答问题。"),
("user", "{input}"),
# MessagesPlaceholder是Agent存储其思考和行动历史的地方
MessagesPlaceholder(variable_name="agent_scratchpad"),
])
# 创建Agent
# 这个函数将LLM、工具和Prompt绑定在一起
agent = create_openai_functions_agent(llm, tools, prompt)
# 创建Agent执行器 (Agent Executor)
# 这是Agent的运行环境,负责执行Agent的决策
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True # 设置为True可以看到Agent的完整思考过程
)
3.4 运行Agent并测试
现在,我们可以向Agent提出一个需要结合使用工具才能完成的复杂问题。
# 提出一个复杂问题
# 这个问题需要Agent先搜索百度的市值,然后用计算器进行汇率转换
question = "百度目前的市值是多少美元?如果1美元等于7.2人民币,那么换算成人民币是多少?"
# 运行Agent
response = agent_executor.invoke({"input": question})
print("\n--- Agent的最终回答 ---")
print(response["output"])
当你运行上述代码并设置verbose=True
时,你将在控制台看到非常详细的输出,它会展示Agent的完整“心路历程”:
- Thought: 用户想知道百度的市值(美元)并换算成人民币。我需要先搜索百度的市值,然后用计算器计算。第一步是搜索。
- Action:
DuckDuckGoSearchRun(query="百度市值")
- Observation: (返回搜索结果,例如“百度市值约为350亿美元”)
- Thought: 我已经知道市值是350亿美元了。现在我需要计算
350 * 7.2
。 - Action:
Calculator(expression="350 * 7.2")
- Observation: (返回计算结果
2520
) - Thought: 我已经完成了所有步骤,现在可以给出最终答案了。
- Final Answer: 百度目前的市值约为350亿美元,换算成人民币约为2520亿元。
4. 总结与展望
通过这个项目,你已经成功构建并运行了一个具备基本规划和工具使用能力的AI Agent。这只是Agent世界的冰山一角,但它为你打开了通往更高级AI应用的大门。
可以探索的扩展方向:
- 更复杂的工具:尝试集成更强大的API,例如发送邮件、操作日历、查询数据库,甚至控制智能家居设备。
- 多Agent协作:设计一个系统,其中包含多个专门的Agent(如“研究员Agent”、“程序员Agent”、“报告撰写Agent”),它们可以相互协作,共同完成一个宏大的任务。
- 记忆与学习:为你的Agent增加长期记忆能力(通常通过向量数据库实现),使其能够记住过去的交互,并从中学习,变得越来越“懂你”。
- 开源Agent框架:除了LangChain,还可以探索其他优秀的开源Agent框架,如
AutoGen
(微软)、LlamaIndex
等,它们在多Agent协作等领域提供了独特的解决方案。
Agent技术的发展日新月异,它正在重新定义人与机器的协作方式。掌握Agent开发,你将站在AI应用创新的最前沿。