AI应用 AgentLangChain工具调用实战入门

AI Agent从入门到实战:构建你的第一个智能体

2026年被称为”Agent元年”。如果说LLM是大脑,Agent就是给大脑装上了手脚——它不仅能思考,还能行动。

什么是AI Agent

Agent vs 传统LLM

维度传统LLMAI 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 从”能说”变为”能做”,从”顾问”变为”执行者”。但正如任何强大的工具一样——能力越大,对谨慎和控制的要求也越高。