AI应用 AgentLangChain工具调用实战入门
云
云铭
进化之路 · 扫码阅读
微信 · 浏览器扫码
在手机上获得更好的阅读体验
AI Agent从入门到实战:构建你的第一个智能体
2026年被称为”Agent元年”。如果说LLM是大脑,Agent就是给大脑装上了手脚——它不仅能思考,还能行动。
什么是AI Agent
Agent vs 传统LLM
| 维度 | 传统LLM | AI Agent |
|---|---|---|
| 能力边界 | 只生成文本 | 能使用工具、执行操作 |
| 交互模式 | 一问一答 | 多步自主规划 |
| 信息来源 | 训练数据 | 训练数据 + 实时搜索 + API |
| 任务复杂度 | 单次任务 | 多步复杂任务 |
| 典型场景 | 对话、写作、翻译 | 自动化工作流、数据分析、代码执行 |
| 记忆能力 | 对话上下文 | 长期记忆和知识积累 |
Agent的核心架构
┌──────────────────────────────────┐
│ AI Agent │
│ ┌────────────────────────────┐ │
│ │ LLM(大脑) │ │
│ │ 推理、规划、决策 │ │
│ └────────────────────────────┘ │
│ ↓ ↑ │
│ ┌────────┴──────────┴────────┐ │
│ │ 工具层 │ │
│ │ ┌─────┐ ┌──────┐ ┌─────┐ │ │
│ │ │搜索 │ │代码 │ │API │ │ │
│ │ │引擎 │ │执行器│ │调用 │ │ │
│ │ └─────┘ └──────┘ └─────┘ │ │
│ └────────────────────────────┘ │
│ ↓ ↑ │
│ ┌────────────────────────────┐ │
│ │ 记忆层 │ │
│ │ 短期记忆 + 长期记忆 │ │
│ └────────────────────────────┘ │
└──────────────────────────────────┘
Agent = LLM + 工具 + 记忆 + 规划能力
核心概念:ReAct模式
思考-行动-观察循环
Thought(思考):我需要做什么?下一步是什么?
↓
Action(行动):调用一个工具
↓
Observation(观察):工具返回了什么?
↓
(重复,直到任务完成)
↓
Final Answer(最终答案)
这类似于人类解决复杂问题的方式:先思考,再行动,根据结果调整,最终给出答案。
实战:构建第一个Agent
环境准备
pip install langchain langchain-openai langchain-community
pip install duckduckgo-search # 搜索工具
pip install python-dotenv # 环境变量管理
最简单的Agent
import os
from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_react_agent
from langchain.tools import Tool
from langchain_community.tools import DuckDuckGoSearchRun
from langchain.prompts import PromptTemplate
# 1. 初始化LLM
llm = ChatOpenAI(
model="gpt-4",
temperature=0, # Agent场景建议低温,保证稳定性
api_key=os.getenv("OPENAI_API_KEY")
)
# 2. 定义工具
search = DuckDuckGoSearchRun()
def calculate(expression: str) -> str:
"""安全的计算器工具"""
try:
# 只允许数字和基本运算符
import re
if not re.match(r'^[\d\+\-\*/\(\)\.\s]+$', expression):
return "错误:只能包含数字和 + - * / ( )"
result = eval(expression)
return str(result)
except Exception as e:
return f"计算错误: {e}"
tools = [
Tool(
name="Search",
func=search.run,
description="搜索互联网获取实时信息。输入搜索关键词。"
),
Tool(
name="Calculator",
func=calculate,
description="执行数学计算。输入数学表达式。"
),
]
# 3. 创建Agent
# ReAct prompt模板
prompt = PromptTemplate.from_template("""
你是一个有用的AI助手。你可以使用以下工具:
{tools}
工具名称:{tool_names}
使用以下格式回答:
Question: 用户的问题
Thought: 思考需要做什么
Action: 工具名称
Action Input: 工具的输入
Observation: 工具返回的结果
...(可重复Thought/Action/Action Input/Observation多次)
Thought: 我现在知道答案了
Final Answer: 对用户问题的最终回答
开始!
Question: {input}
{agent_scratchpad}
""")
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True, # 打印思考过程
max_iterations=5, # 最多5轮循环
handle_parsing_errors=True,
)
# 4. 运行Agent
response = agent_executor.invoke({
"input": "今天的特斯拉股价是多少?相比昨天涨了还是跌了?"
})
print(response["output"])
Agent的输出示例
> Entering new AgentExecutor chain...
Thought: 我需要查找特斯拉今天的股价,以及对比昨天的价格。
Action: Search
Action Input: TSLA stock price today 2026
Observation: Tesla (TSLA) stock closed at $245.30 today, down 2.1% from previous close.
Thought: 我已经知道今天收盘价$245.30,下跌2.1%。
可以通过计算得到昨天收盘价。
Action: Calculator
Action Input: 245.30 / (1 - 0.021)
Observation: 250.56
Thought: 我现在有了完整信息。
Final Answer: 特斯拉今天收盘价为$245.30,相比昨天的$250.56下跌了2.1%。
构建实用Agent:智能文档助手
能读文件、搜索、总结的Agent
import PyPDF2
from langchain.tools import tool
class DocumentAssistant:
"""智能文档助手Agent"""
def __init__(self, llm):
self.llm = llm
self.tools = self._create_tools()
self.agent = self._create_agent()
def _create_tools(self):
@tool
def read_file(file_path: str) -> str:
"""读取文件内容。支持.txt和.pdf。输入文件路径。"""
if file_path.endswith('.pdf'):
reader = PyPDF2.PdfReader(file_path)
text = ""
for page in reader.pages:
text += page.extract_text()
return text[:5000] # 限制长度
else:
with open(file_path, 'r', encoding='utf-8') as f:
return f.read()[:5000]
@tool
def search_web(query: str) -> str:
"""搜索互联网获取补充信息。输入搜索查询。"""
search = DuckDuckGoSearchRun()
return search.run(query)
@tool
def summarize(text: str) -> str:
"""总结长文本。输入需要总结的文本。"""
response = self.llm.invoke(
f"请用3-5个要点总结以下内容:\n\n{text}"
)
return response.content
return [read_file, search_web, summarize]
def ask(self, question: str) -> str:
return self.agent.invoke({"input": question})["output"]
# 使用示例
assistant = DocumentAssistant(llm)
result = assistant.ask(
"请分析我桌面上这份PDF合同的关键条款,特别关注违约责任部分"
)
Agent设计的四个关键决策
1. 工具粒度
太粗:一个"万能"工具
└── Agent难以精确控制行为
太细:上百个微工具
└── Agent选择困难,token消耗巨大
最佳:10-20个内聚的工具,有清晰的职责边界
2. 工具描述的重要性
# ❌ 不好的工具描述
Tool(name="api", func=api_call, description="调用API")
# ✅ 好的工具描述
Tool(
name="GetWeather",
func=get_weather,
description="获取指定城市当前天气和未来3天预报。" + \
"输入格式:城市名称(如'北京')或'城市,国家代码'(如'Tokyo,JP')"
)
工具描述是Agent选择工具的唯一依据——写不好描述,Agent就选不对工具。
3. 错误处理
def robust_tool(func):
"""工具装饰器:统一错误处理"""
@functools.wraps(func)
def wrapper(*args, **kwargs):
try:
result = func(*args, **kwargs)
if result is None or result == "":
return "工具返回了空结果,请尝试其他方式"
return result
except TimeoutError:
return "工具调用超时,请缩小查询范围后重试"
except Exception as e:
return f"工具调用失败: {str(e)}。请尝试其他方法或工具。"
return wrapper
4. 最大迭代次数
简单查询:max_iterations=3
中等任务:max_iterations=5
复杂任务:max_iterations=10
设置太少 → Agent无法完成复杂任务
设置太多 → Agent可能在错误的路径上"死循环"
设置技巧 → 监控verbose输出,根据实际情况调整
常见问题与解决
Q1: Agent陷入循环怎么办?
# 监控Agent的思维链
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
max_iterations=5,
early_stopping_method="generate", # 达到上限时强制输出
return_intermediate_steps=True, # 返回中间步骤用于调试
)
Q2: Agent选了错误的工具?
- 改进工具描述,增加正例和反例
- 在Prompt中增加few-shot示例
- 考虑将相关工具合并或拆得更清楚
Q3: Agent的回复质量不稳定?
# 降低temperature
llm = ChatOpenAI(model="gpt-4", temperature=0)
# 添加输出格式约束
prompt += "\n\n你的Final Answer必须包含:[具体格式要求]"
从Demo到生产
Demo Agent → 生产Agent 需要:
□ 输入校验和注入防护
□ 工具的权限控制(只读/读写/管理员)
□ 用量监控和预算控制
□ 完整的日志和可观测性
□ 用户确认(高风险操作需要人类审批)
□ 降级方案(Agent失败时的兜底策略)
Agent 是 2026 年 AI 应用最激动人心的方向。它让 AI 从”能说”变为”能做”,从”顾问”变为”执行者”。但正如任何强大的工具一样——能力越大,对谨慎和控制的要求也越高。