大家好,老 J。
上一期我们讲了 Agent 是什么,并用 30 行代码实现了第一个智能体。
但那个 Agent 还很“简陋”——它没有记忆,每次对话都是全新的;它的工具是写死的;它的规划能力很基础。
这一期,我们来深度解析 Agent 的四大核心组件:规划、记忆、工具、行动。
一、Agent 核心架构回顾
┌─────────────────────────────────────────────────────────────────┐│ AI Agent 核心架构 │├─────────────────────────────────────────────────────────────────┤│ ││ ┌─────────────────────────────────────────────────────────┐ ││ │ Agent │ ││ │ │ ││ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ ││ │ │ 规划 │ │ 记忆 │ │ 工具 │ │ ││ │ │Planning │ │ Memory │ │ Tools │ │ ││ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ ││ │ │ │ │ │ ││ │ └───────────────┼───────────────┘ │ ││ │ │ │ ││ │ ▼ │ ││ │ ┌─────────────┐ │ ││ │ │ 行动 │ │ ││ │ │ Action │ │ ││ │ └─────────────┘ │ ││ └─────────────────────────────────────────────────────────┘ ││ │└─────────────────────────────────────────────────────────────────┘二、规划(Planning):Agent 的大脑
2.1 什么是规划?
规划是 Agent 的决策中枢,负责:
• 理解用户意图 • 分解复杂任务 • 决定执行步骤 • 选择合适工具
2.2 主流规划模式
| ReAct | |||
| CoT | |||
| ToT | |||
| Plan-and-Solve |
2.3 ReAct 模式详解
┌─────────────────────────────────────────────────────────────────┐│ ReAct 执行流程 │├─────────────────────────────────────────────────────────────────┤│ ││ 用户:「帮我查一下北京天气,然后告诉我要不要带伞」 ││ ││ ┌─────────────────────────────────────────────────────────┐ ││ │ Thought: 用户想知道北京天气和带伞建议 │ ││ │ 我需要先查询天气 │ ││ │ │ ││ │ Action: get_weather │ ││ │ Action Input: {"city": "北京"} │ ││ │ Observation: 北京今天晴,25°C,湿度45% │ ││ │ │ ││ │ Thought: 天气是晴天,不需要带伞 │ ││ │ 但紫外线较强,建议防晒 │ ││ │ │ ││ │ Final Answer: 北京今天天气晴朗,25°C, │ ││ │ 不需要带伞,但建议涂防晒 │ ││ └─────────────────────────────────────────────────────────┘ ││ │└─────────────────────────────────────────────────────────────────┘2.4 代码实现:ReAct Agent
# react_agent.pyfrom langchain.agents import AgentExecutor, create_react_agentfrom langchain.tools import toolfrom langchain_openai import ChatOpenAI@tooldefget_weather(city: str) -> str:"""获取天气"""returnf"{city}:晴天,25°C"@tooldefget_uv_index(city: str) -> str:"""获取紫外线指数"""returnf"{city}:紫外线指数 7(强)"llm = ChatOpenAI(model="gpt-4", temperature=0)# ReAct 提示词模板REACT_PROMPT = """你是一个智能助手,使用 ReAct 模式工作。可用工具:{tools}工具名称:{tool_names}格式:Thought: 思考Action: 工具名Action Input: 参数Observation: 结果(重复)Final Answer: 最终答案Question: {input}{agent_scratchpad}"""agent = create_react_agent(llm, [get_weather, get_uv_index], REACT_PROMPT)executor = AgentExecutor(agent=agent, tools=[get_weather, get_uv_index])result = executor.invoke({"input": "北京天气怎么样?需要防晒吗?"})print(result["output"])三、记忆(Memory):Agent 的长期记忆
3.1 记忆的类型
| 短期记忆 | ||
| 长期记忆 | ||
| 工作记忆 | ||
| 语义记忆 |
3.2 短期记忆实现
# memory_agent.pyfrom langchain.memory import ConversationBufferMemoryfrom langchain.chains import ConversationChain# 创建带记忆的对话链memory = ConversationBufferMemory(return_messages=True)conversation = ConversationChain( llm=llm, memory=memory, verbose=True)# 多轮对话print(conversation.predict(input="我叫张三"))print(conversation.predict(input="我叫什么名字?")) # 能记住3.3 长期记忆:RAG(检索增强生成)
┌─────────────────────────────────────────────────────────────────┐│ RAG 工作流程 │├─────────────────────────────────────────────────────────────────┤│ ││ 用户问题 ──► 向量化 ──► 检索相似文档 ──► 增强 Prompt ──► 生成回答 ││ │ │ ││ ▼ ▼ ││ ┌──────────┐ ┌──────────┐ ││ │ 向量数据库 │ │ 知识文档 │ ││ │ (Chroma) │ │ (PDF/MD) │ ││ └──────────┘ └──────────┘ ││ │└─────────────────────────────────────────────────────────────────┘# rag_agent.pyfrom langchain_community.vectorstores import Chromafrom langchain_openai import OpenAIEmbeddingsfrom langchain.text_splitter import CharacterTextSplitter# 1. 加载文档withopen("knowledge.txt") as f: documents = f.read()# 2. 分割文档text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)texts = text_splitter.split_text(documents)# 3. 向量化并存储embeddings = OpenAIEmbeddings()vectorstore = Chroma.from_texts(texts, embeddings)# 4. 检索 + 生成retriever = vectorstore.as_retriever(search_kwargs={"k": 3})from langchain.chains import RetrievalQAqa_chain = RetrievalQA.from_chain_type( llm=llm, retriever=retriever)result = qa_chain.invoke("公司年假怎么计算?")四、工具(Tools):Agent 的双手
4.1 什么是工具?
工具是 Agent 与外部世界交互的接口:
• 调用 API(天气、邮件、数据库) • 执行代码(计算、脚本) • 操作文件(读、写、删除) • 调用其他服务
4.2 工具定义规范
from langchain.tools import tool@tooldefsend_email(recipient: str, subject: str, content: str) -> str:"""发送邮件到指定邮箱"""# 实际调用邮件 APIreturnf"邮件已发送至 {recipient}"# 工具会被自动解析为:{"name": "send_email","description": "发送邮件到指定邮箱","parameters": {"type": "object","properties": {"recipient": {"type": "string"},"subject": {"type": "string"},"content": {"type": "string"} },"required": ["recipient", "subject", "content"] }}4.3 常见工具类型
| 搜索 | ||
| 计算 | ||
| 网络 | ||
| 文件 | ||
| 数据库 |
五、行动(Action):Agent 的执行力
5.1 行动的类型
| 工具调用 | ||
| 信息输出 | ||
| 自我反思 | ||
| 任务分解 |
5.2 行动循环代码
# action_loop.pyclassSimpleAgent:def__init__(self, llm, tools, max_iterations=5):self.llm = llmself.tools = {tool.name: tool for tool in tools}self.max_iterations = max_iterationsdefrun(self, task: str): thought = taskfor i inrange(self.max_iterations):# 1. 思考下一步 action, action_input = self.think(thought)# 2. 执行行动if action == "Final Answer":return action_input# 3. 观察结果if action inself.tools: observation = self.tools[action].run(action_input)else: observation = f"未知工具: {action}"# 4. 更新思考 thought = f"{thought}\nAction: {action}\nObservation: {observation}"return"达到最大迭代次数,未完成任务"# 使用示例agent = SimpleAgent(llm, [weather_tool, calculator_tool])result = agent.run("查北京天气并计算25+36")六、完整实战:多组件协作 Agent
# full_agent.pyimport osfrom langchain.agents import AgentExecutor, create_react_agentfrom langchain.tools import toolfrom langchain.memory import ConversationBufferMemoryfrom langchain_openai import ChatOpenAIfrom langchain_community.vectorstores import Chromafrom langchain_openai import OpenAIEmbeddings# ============ 1. 定义工具 ============@tooldefget_weather(city: str) -> str:"""获取天气""" weathers = {"北京": "晴25°C", "上海": "多云22°C"}return weathers.get(city, "未知城市")@tooldefcalculate(expr: str) -> str:"""数学计算"""returnstr(eval(expr))@tooldefsearch_knowledge(query: str) -> str:"""搜索知识库(RAG)"""# 模拟向量检索returnf"关于'{query}'的知识:这是一个重要知识点..."# ============ 2. 配置记忆 ============memory = ConversationBufferMemory( memory_key="chat_history", return_messages=True)# ============ 3. 配置 LLM ============llm = ChatOpenAI(model="gpt-4", temperature=0)# ============ 4. ReAct 提示词 ============PROMPT = """你是一个智能助手,有记忆能力,可以使用工具。对话历史:{chat_history}可用工具:{tools}工具名称:{tool_names}格式:Thought: 思考Action: 工具名Action Input: 参数Observation: 结果Final Answer: 最终答案Question: {input}{agent_scratchpad}"""# ============ 5. 创建 Agent ============agent = create_react_agent( llm=llm, tools=[get_weather, calculate, search_knowledge], prompt=PROMPT)executor = AgentExecutor( agent=agent, tools=[get_weather, calculate, search_knowledge], memory=memory, verbose=True, max_iterations=5)# ============ 6. 执行 ============if __name__ == "__main__":# 第一轮print(executor.invoke({"input": "我叫张三"}))# 第二轮(能记住名字)print(executor.invoke({"input": "我叫什么名字?"}))# 第三轮(调用工具)print(executor.invoke({"input": "北京天气如何?再帮我算 100+200"}))七、核心组件对比总结
| 规划 | ||||
| 记忆 | ||||
| 工具 | ||||
| 行动 |
八、下期预告
AI Agent 智能体从入门到实战(三):LangChain 实战
• LangChain 核心组件详解 • Chain 的串联与组合 • 自定义工具开发 • 构建复杂 Agent 工作流
我是老 J,下期见。
关注不迷路啊?代码在像你招手哦!!!
夜雨聆风