当前位置:首页 > 技术分享 > 正文内容

AI Agent从原理到实战:手把手教你打造一个能自主干活的智能体

admin1周前 (07-08)技术分享43

先看一个场景,感受Agent的魅力

假设你给AI布置一个任务:

"帮我查一下本周AI领域最热门的三个开源项目,然后整理成一份Markdown格式的周报,发送到我的邮箱。"

传统RAG能做到的:根据你的知识库回答一些历史问题。

AI Agent能做到的

  1. 自主搜索GitHub,找出本周热门AI项目

  2. 阅读每个项目的README,提取关键信息

  3. 按照模板格式整理成周报

  4. 调用邮件服务发送到你指定的邮箱

  5. 整个过程完成后,告诉你"任务已完成"

这就是Agent的威力——它不再是被动回答问题的对话工具,而是主动完成任务的数字助手。


第一章:Agent到底是什么?——用一个比喻讲清楚

在动手之前,我们先建立对Agent的直观认知。

1.1 Agent = 大脑 + 手脚

text
┌─────────────────────────────────────────────────┐
│                    AI Agent                      │
│                                                  │
│   ┌─────────────┐    ┌────────────────────────┐ │
│   │   大脑       │    │        手脚            │ │
│   │  (大模型)    │    │    (工具集)            │ │
│   │             │    │                        │ │
│   │  思考策略    │◄──►│  搜索引擎             │ │
│   │  分解任务    │    │  代码执行器           │ │
│   │  决策判断    │    │  API调用              │ │
│   │  反思复盘    │    │  数据库查询           │ │
│   └─────────────┘    │  文件读写             │ │
│                      └────────────────────────┘ │
└─────────────────────────────────────────────────┘

核心逻辑:大模型(大脑)决定"做什么",工具集(手脚)负责"怎么做"。

1.2 三种主流架构模式

目前Agent有三种主流实现范式,我帮你梳理好了:

模式核心思想优点适用场景
ReAct思考→行动→观察→循环简单透明,易于调试任务步骤可枚举的场景
Plan-and-Execute先列计划,再依次执行结构清晰,适合复杂任务多步骤、有依赖关系的任务
Multi-Agent多个Agent协作,各司其职专业化分工,能力强大规模、跨领域的复杂问题

新手建议:从ReAct开始,这是最经典也最易理解的模式。本文也重点围绕ReAct展开。


第二章:实战——从零搭建一个ReAct Agent

我们用LangChain实现一个最简单的Agent,让它具备搜索+计算两种能力。

2.1 准备工作

bash
pip install langchain langchain-openai langchain-community tavily-python

工具说明:Tavily是一个专为AI设计的搜索引擎API,比普通搜索更适合Agent场景。你也可以替换为百度搜索API或自定义工具。

2.2 定义工具(Agent的"手脚")

python
from langchain.tools import toolfrom langchain_community.tools.tavily_search import TavilySearchResultsimport math# 内置工具:搜索search_tool = TavilySearchResults(
    api_key="你的Tavily密钥",
    max_results=3,
    include_answer=True)# 自定义工具:计算器@tooldef calculator(expression: str) -> str:
    """
    用于执行数学计算。输入一个数学表达式,返回计算结果。
    例如:输入 "2 + 3 * 4",返回 "14"
    """    try:
        # 安全计算(仅允许数字和基本运算符)
        allowed = set("0123456789+-*/.() ")
        if not all(c in allowed for c in expression):
            return "错误:表达式包含非法字符"
        result = eval(expression)
        return f"计算结果:{result}"
    except Exception as e:
        return f"计算错误:{str(e)}"# 工具列表tools = [search_tool, calculator]

2.3 构建Agent(核心部分)

python
from langchain_openai import ChatOpenAIfrom langchain.agents import create_react_agent, AgentExecutorfrom langchain.prompts import PromptTemplate# 初始化大模型llm = ChatOpenAI(
    model="gpt-4o-mini",  # 推荐用GPT-4级模型,推理能力强
    temperature=0,
    api_key="你的OpenAI密钥")# ReAct提示词模板react_prompt = PromptTemplate.from_template("""你是一个能调用工具的智能助手。你拥有以下工具:

{tools}

工具名称:{tool_names}

请使用以下格式回答:

Question: 用户的问题
Thought: 你需要思考下一步做什么
Action: 你要调用的工具名称,必须是 [{tool_names}] 中的一个
Action Input: 传给工具的输入参数
Observation: 工具返回的结果
...(Thought/Action/Action Input/Observation 可以重复多次)
Thought: 我现在知道最终答案了
Final Answer: 给用户的最终回答

开始!

Question: {input}
Thought: {agent_scratchpad}
""")# 创建Agentagent = create_react_agent(
    llm=llm,
    tools=tools,
    prompt=react_prompt)# Agent执行器(负责运行循环)agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,  # 打印思考过程,方便调试
    max_iterations=5,  # 防止死循环
    handle_parsing_errors=True)

2.4 测试运行

python
# 测试问题result = agent_executor.invoke({
    "input": "2024年诺贝尔物理学奖得主是谁?他/她的年龄是多少?"})print("\n=== 最终答案 ===")print(result["output"])

运行效果(Verbose模式输出)

text
> Entering new AgentExecutor chain...

Thought: 我需要搜索2024年诺贝尔物理学奖得主的信息
Action: tavily_search_results_json
Action Input: "2024年诺贝尔物理学奖得主"

Observation: [{'title': '2024年诺贝尔物理学奖...', 'content': 'John J. Hopfield 和 Geoffrey E. Hinton...'}]

Thought: 现在我知道得主是John J. Hopfield和Geoffrey E. Hinton,我需要查他们的年龄。
Action: tavily_search_results_json
Action Input: "John J. Hopfield 出生日期"

Observation: John J. Hopfield 出生于1933年7月15日...

Thought: 我现在可以计算年龄了。
Action: calculator
Action Input: "2024 - 1933"

Observation: 计算结果:91

Thought: 我现在知道最终答案了。
Final Answer: 2024年诺贝尔物理学奖得主是John J. Hopfield(91岁)和Geoffrey E. Hinton(76岁)。

这就是一个完整的ReAct Agent工作流程。它自己决定该搜索什么、什么时候需要计算,最终给出综合答案。


第三章:打造你的定制工具库

内置工具不够用?自己写一个,比想象中简单。

3.1 工具开发的黄金法则

一个好的工具应该具备:

要素说明示例
清晰的名称让AI一眼明白用途get_weather 而非 func_a
详细的文档字符串告诉AI何时该用、怎么用"查询指定城市的实时天气,输入城市名称"
明确的输入输出参数类型和返回值格式要清晰输入字符串,返回JSON
健壮的错误处理工具失败不能拖垮整个Agenttry-except包裹,返回友好错误信息

3.2 实战:写一个"网页内容读取"工具

python
import requestsfrom bs4 import BeautifulSoupfrom langchain.tools import tool@tooldef fetch_webpage(url: str) -> str:
    """
    获取指定网页的正文文本内容。
    用于当用户需要阅读某篇文章、新闻或文档时使用。
    输入:完整的网页URL(必须以http开头)
    返回:网页的纯文本正文(截断至3000字符)
    """    try:
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
        }
        response = requests.get(url, headers=headers, timeout=10)
        response.raise_for_status()
        
        soup = BeautifulSoup(response.text, 'html.parser')
        
        # 移除脚本和样式
        for tag in soup(['script', 'style', 'nav', 'footer', 'header']):
            tag.decompose()
        
        # 提取正文
        text = soup.get_text(separator='\n', strip=True)
        
        # 截断防止过长
        if len(text) > 3000:
            text = text[:3000] + "...(内容已截断)"
        
        return text    except requests.exceptions.Timeout:
        return "错误:请求超时,请检查URL是否有效"
    except Exception as e:
        return f"错误:获取网页失败 - {str(e)}"

3.3 注册工具

python
# 扩展工具列表more_tools = [search_tool, calculator, fetch_webpage]# 重新创建Agent(其他代码不变)agent = create_react_agent(llm, more_tools, react_prompt)

第四章:进阶技巧——让Agent更可靠

4.1 防止无限循环

Agent可能会陷入"思考→行动→观察→再思考→再行动..."的死循环。

解决方案

python
agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    max_iterations=5,  # 硬限制最多5步
    early_stopping_method="generate",  # 达到限制时强制输出)

最佳实践:根据任务复杂度设置 max_iterations。简单任务3-5步,复杂任务可放宽到10-15步。

4.2 增加"记忆"能力

让Agent记住历史对话,避免重复搜索相同内容。

python
from langchain.memory import ConversationBufferMemory

memory = ConversationBufferMemory(
    memory_key="chat_history",
    return_messages=True)agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    memory=memory,  # 加入记忆
    verbose=True)# 连续对话agent_executor.invoke({"input": "周杰伦是谁?"})agent_executor.invoke({"input": "他唱过哪些代表作?"})  # 能记住上一轮话题

4.3 添加人工确认机制

某些敏感操作(发送邮件、修改数据)应加入人类把关。

python
from langchain.agents import AgentExecutordef human_approval(step_output):
    """每步执行前询问用户是否继续"""
    print(f"\n[Agent即将执行] {step_output}")
    user_input = input("是否继续?(y/n): ")
    return user_input.lower() == 'y'agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    step_callback=human_approval,  # 伪代码,实际需结合回调
    verbose=True)

第五章:从Demo到生产——别忘了这些事

当你的Agent在本地跑通后,上线前还有几个重要事项:

5.1 成本控制

Agent每多调用一轮,就多消耗一次Token。做好预算管理:

python
# 估算单次任务成本def estimate_cost(iterations, tokens_per_step=500):
    # GPT-4o-mini: ~$0.15/1M input, ~$0.60/1M output
    input_tokens = iterations * tokens_per_step
    output_tokens = iterations * 200
    cost = (input_tokens * 0.15 + output_tokens * 0.60) / 1_000_000
    return f"预估单次成本: ${cost:.4f}"print(estimate_cost(5))  # 输出:预估单次成本: $0.0010

省钱策略

  • gpt-4o-mini 替代 gpt-4-turbo(成本低30倍,推理能力足够)

  • 缓存常见问题的答案,避免重复调用

  • 设置单次任务的Token上限

5.2 安全与合规

风险防护措施
工具被恶意利用工具层面的权限控制(只读/读写隔离)
Prompt注入攻击对用户输入做敏感词过滤和长度限制
泄露隐私数据禁止工具访问包含敏感信息的文件/API
生成有害内容接入内容安全审核API(如阿里云绿网)

5.3 监控与可观测性

生产环境必须能看清Agent每一步在做什么:

python
import logging# 启用LangChain的详细日志logging.basicConfig(level=logging.INFO)langchain_logger = logging.getLogger("langchain")langchain_logger.setLevel(logging.INFO)# 或集成到LangSmith进行更专业的追踪# from langsmith import Client# 配置LANGCHAIN_TRACING_V2=true

写在最后

回顾一下我们走过的路:

  1. 理解了Agent的本质:大脑(LLM)+ 手脚(工具)的组合

  2. 动手搭建了ReAct Agent:掌握了搜索和计算两种基础工具

  3. 学会了扩展自定义工具:把任何API都变成Agent的能力

  4. 掌握了生产化要点:成本、安全、监控一个都不能少

AI Agent是当下最令人兴奋的领域之一。如果说RAG让AI"博闻强识",那么Agent就让AI"知行合一"。你现在的每一个尝试,都是在为未来的"数字员工"时代积累经验。

下一步做什么?

  • 把你的RAG系统变成一个工具,让Agent能检索你的知识库

  • 尝试Plan-and-Execute模式,处理更复杂的多步任务

  • 搭建多Agent系统,让"搜索专家"和"写作专家"分工协作

动手写你的第一个Agent吧,哪怕只是让AI帮你查天气、算数学题。迈出第一步,你就已经超越了99%只停留在"对话"层面的开发者。


相关文章

AI模型部署与API服务实战——从本地模型到线上服务

一、引言:模型训练完了,然后呢?很多AI学习者在本地训练出模型后,都会面临同一个问题:"模型在Jupyter Notebook里跑得很好,但怎么让别人也用上?"答案是:将模型封装成...

从调包侠到AI开发者:我的实战避坑指南

最近后台收到不少读者留言,问得最多的问题是:“我想学AI开发,但不知道从哪开始,网上课程太多反而挑花了眼。”说实话,我太理解这种感觉了。两年前我转行做AI应用开发时,也踩过无数坑——花了三个月死磕线性...

手把手教你从零搭建一个RAG知识库问答系统

为什么你需要一个RAG系统?先问一个问题:你调用大模型API时,有没有遇到过这些尴尬时刻?问它你公司内部的操作手册,它一本正经地胡说八道让它分析你刚收到的客户邮件,它说“我的知识截止到2024年”想让...

从“调包侠”到“模型匠人”:一个项目贯穿的AI开发进阶实战

项目锚点:我们要做什么?最终目标:做一个“手写公式识别器”——你画一个数学公式(如 y = 2x + 1 或 E=mc²),模型识别出符号并输出LaTeX代码。这个项目覆盖了:图像分类 → 目标检测...

第一圈代码数字识别:用SVM + HOG快速建立基线

完整代码(Google Colab / Jupyter Notebook 均可)python numpy  np matplotlibpyplot &...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。