AI Agent 全链路搭建教程
Bot 和 Agent 的区别
传统 ChatBot 的工作方式:
用户提问 → 匹配关键词 → 返回预设答案
Agent 的工作方式:
用户提问 → 思考该做什么 → 调用工具 → 观察结果 → 再思考 → ... → 给出答案

✅
核心区别在于 推理与行动的循环(Reasoning + Acting) 。
Agent 的核心工作机制
✅
循环的四个步骤:
Thought(思考) :分析当前状态,决定下一步该做什么
Action(行动) :选择一个 Tool 并传入参数执行
Observation(观察) :获取 Tool 返回的结果
Loop(循环) :带着新的观察结果回到 Thought,直到得出最终答案
一个真实的 ReAct 执行轨迹:
代码块
Plain Text
Question: 张三上周买的 iPhone 15 发货了吗?
Thought: 用户想知道订单发货状态。我需要先查询订单信息。
Action: query_order(user_name="张三", product="iPhone 15")
Observation: {"order_id": "ORD-2024-0612-001", "status": "shipped",
"carrier": "顺丰", "tracking_no": "SF1234567890"}
Thought: 订单已发货,快递单号是 SF1234567890。我可以再查一下物流详情。
Action: query_logistics(tracking_no="SF1234567890")
Observation: {"current_status": "运输中", "location": "深圳转运中心",
"estimated_delivery": "2024-06-14"}
从零搭建智能客服 Agent
Step 1:环境准备
bash
代码块
Plain Text
pip install langchain langchain-openai langchain-community
pip install python-dotenv
Python
代码块
TOML
# .env
OPENAI_API_BASE="https://your-api-proxy.com/v1"
OPENAI_API_KEY="sk-your-key"
Step 2:定义 Tools
Tool 是 Agent 可调用的外部功能,每个 Tool 需要:名称、描述、输入参数、执行函数。
代码块
SQL
from langchain.tools import BaseTool, StructuredTool
from pydantic import BaseModel, Field
import requests
from typing import Optional
# ========== Tool 1: 查询订单 ==========
class OrderQueryInput(BaseModel):
user_name: str = Field(description="用户姓名")
product: Optional[str] = Field(default=None, description="商品名称(可选)")
Tool 描述的写法很关键——Agent 靠描述来决定调用哪个 Tool。描述要写清楚:这个工具是做什么的、需要什么参数、返回什么。描述越清晰,Agent 的决策越准确。
Step 3:创建 ReAct Agent
代码块
TOML
from langchain import hub
from langchain_openai import ChatOpenAI
from langchain.agents import create_react_agent, AgentExecutor
import os
# 加载 LLM
llm = ChatOpenAI(
model="gpt-4o-mini", # mini 版足够用,成本低
temperature=0, # Agent 场景需要确定性
openai_api_base=os.getenv("OPENAI_API_BASE"),
运行后会看到完整的 ReAct 思考链:
代码块
Plain Text
> Entering new AgentExecutor chain...
Thought: 用户想知道张三买的 iPhone 是否发货,并查询物流。
我需要先查询订单信息。
Action: query_order
Action Input: {"user_name": "张三", "product": "iPhone"}
Observation: 订单号: ORD-2024-0612-001, 商品: iPhone 15, 状态: shipped...
Thought: 订单已发货,快递单号是 SF1234567890。我需要查询物流详情。
Action: query_logistics
Action Input: {"tracking_no": "SF1234567890"}
Observation: 快递单号 SF1234567890 最新状态:运输中...
Thought: 我已经获得了所有需要的信息,可以回答用户了。
Final Answer: 张三,您的 iPhone 15 已于昨日发货...
> Finished chain.
Step 4:添加 Agent Memory(多轮对话能力)
上面的 Agent 有个问题:每次对话都是独立的,记不住之前的交流。
代码块
TOML
from langchain.memory import ConversationBufferWindowMemory
多轮对话中 Agent 会自动关联上下文。第二轮的"他"能被正确解析为"张三",就是因为 Memory 中保留了上一轮的信息。
进阶:自定义复杂工具与错误处理
4.1 带认证的工具调用
代码块
Python
import requests
from typing import Dict
class InternalAPIInput(BaseModel):
endpoint: str = Field(description="API 端点路径")
4.2 工具调用超时与重试
代码块
Python
from functools import wraps
import time
4.3 Agent 常见坑与解决方案
FAQ
Q1:ReAct 和 Function Calling 有什么区别?
Function Calling 是模型输出结构化函数调用,由外部执行;ReAct 是在 Function Calling 基础上增加了推理循环(Thought → Action → Observation)。OpenAI 的模型原生支持 Function Calling,LangChain 的 ReAct 是更上层的封装。
Q2:Tool 数量多了 Agent 会混乱吗?
一般 5-10 个 Tool 表现稳定。超过 15 个建议做 Tool Router——先让 Agent 选择大类,再在子类中选择具体 Tool。
Q3:Agent 调用外部 API 安全吗?
需要做好权限控制:Tool 内部做参数校验、API 调用加认证令牌、敏感操作(如转账)需要人工确认。
Q4:可以用国产模型做 Agent 吗?
可以。DeepSeek-V2、Qwen-Max、GLM-4 都支持 Function Calling。效果上 GPT-4o > DeepSeek-V2 > Qwen-Max,但差距在缩小。
Q5:Agent 和 RAG 怎么结合?
RAG 可以作为 Agent 的一个 Tool(search_knowledge_base)。Agent 决定何时查知识库、何时查订单系统、何时直接回答。
总结
AI Agent 的核心不是"用了什么框架",而是让大模型具备了自主决策和行动的能力。
✅
ReAct 循环 是 Agent 的灵魂——思考→行动→观察→再思考
Tool 描述 决定 Agent 的调用准确率——描述要像写给新手教程一样清晰
Memory 让 Agent 能处理多轮复杂对话——但注意控制长度
错误处理 不能少——超时、重试、最大迭代次数都是生产必备
和 RAG 结合 是终极形态——Agent 决定查什么,RAG 提供查的能力