拒绝“只会聊天”的AI!揭秘Agent开发第一步:给大模型装上“大脑”与“手脚”

59 阅读6分钟

本文价值提示:

💡 你将获得什么?

  1. 底层祛魅:跳过 LangChain 等框架的黑盒,从原生 API 层面理解 Agent 是如何“动”起来的。
  2. 思维升级:从大数据工程师熟悉的 ETL 线性思维,转型为 AI 架构师必备的“循环(Loop)思维”。
  3. 实战代码:掌握 Function Calling 和 ReAct 模式的核心实现逻辑。

阅读时间:约 8 分钟 | 难度:进阶


👋 大家好,我是你们的老朋友。

在上一期的《RAG架构与数据工程》中,我们成功地给大模型装上了“海马体”,利用向量数据库让它拥有了长期记忆。现在,它已经是一个博学多才的“图书馆管理员”了。

但是,你有没有发现,它依然只能坐着说话

它不能帮你查实时的天气,不能帮你去数据库跑 SQL,更不能帮你发邮件。它就像一个被困在瓶子里的天才大脑,有智商,没行动力

今天,我们正式开启第四个专题:AI Agent 的开发与编排。作为本专题的第一篇,我们将深入 Agent 的微观世界,不依赖任何复杂的框架,亲手给这个“大脑”装上“手脚”(Tools)和“逻辑回路”(Reasoning)。


01 思维大爆炸:从 ETL 到 Agent Loop 🤯

作为大数据工程师,你一定对 DAG(有向无环图) 烂熟于心。在 Airflow 或 Spark 中,任务流是线性的、确定的: 提取(E) -> 转换(T) -> 加载(L)

如果中间报错了,任务就挂了,或者重试。

但在 Agent 的世界里,逻辑是非确定性的,而且是一个循环(Cyclic)

🔄 Agent 的核心循环

Agent 不是一条直线,而是一个 While True 的循环:

  1. 感知 (Observation):看看现在发生了什么?
  2. 思考 (Thought):我该做什么?需要用工具吗?
  3. 行动 (Action):调用工具(API/函数)。
  4. 观察 (Observation):工具返回了什么结果?
  5. 回到第 2 步... 直到任务完成。
  6. image.png

架构师视点

以前我们写代码是编写“规则”,现在我们写 Agent 是编写“目标”和“边界”。你无法预知 LLM 会先迈左脚还是右脚,但你要确保它别掉进坑里。


02 给大脑装上“手脚”:Function Calling (Tool Use) 🛠️

LLM 本质上是一个概率模型,它只会吐出文本(Text)。那它怎么调用 Python 函数或者 API 呢?

这就需要用到 OpenAI 等模型提供的核心能力:Function Calling(函数调用),现在更通用的叫法是 Tool Use

这里的“魔法”是什么?

其实没有魔法,只有 Schema(结构定义)

想象你在餐厅点菜。

  • 普通对话:“我要吃那个红色的、辣的、有豆腐的菜。”(厨师可能听不懂)
  • Function Calling:你递给厨师一张标准点菜卡(JSON Schema):
    {
      "dish_name": "Mapo Tofu",
      "spiciness_level": "high",
      "ingredients": ["tofu", "minced meat"]
    }
    

实战:原生 SDK 实现天气查询

别急着引入 LangChain,我们先看原生 OpenAI SDK 怎么做。这能让你理解底层原理。

第一步:定义工具(告诉 LLM 你有哪些手脚) 我们需要用 JSON Schema 描述函数。

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_current_weather",
            "description": "获取指定城市的当前天气",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "城市名称,如 Beijing, San Francisco"
                    },
                    "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
                },
                "required": ["location"]
            }
        }
    }
]

第二步:对话与解析 当用户问:“今天北京天气怎么样?” LLM 不会直接回答“晴天”,而是会返回一个特殊的结构,告诉我们要调用函数。

# 伪代码演示
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "北京今天天气如何?"}],
    tools=tools, # 关键点:把工具箱传给它
    tool_choice="auto" 
)

tool_call = response.choices[0].message.tool_calls[0]
print(tool_call.function.name) 
# 输出: get_current_weather
print(tool_call.function.arguments) 
# 输出: {"location": "Beijing"}

第三步:执行与回传 作为开发者,你需要捕获这个 tool_call,在本地执行 Python 代码,然后把结果伪装成一条消息,塞回给 LLM。

⚠️ 注意:LLM 并没有真正执行代码,它只是生成了“要执行代码的指令”。执行代码的是你的 Python 脚本!


03 升级大脑的操作系统:Prompt 策略与 ReAct 🧠

有了手脚,如果大脑不够聪明,Agent 就会变成“无头苍蝇”。我们需要通过 Prompt Engineering 来升级它的思维模式。

1. CoT (Chain of Thought):让它慢点想

在大数据处理中,复杂的 SQL 我们会拆成多个 CTE (Common Table Expression)。同理,对 LLM,我们要强迫它 Let's think step by step

System Prompt 示例:

你是一个数据分析助手。在回答用户问题前,请先列出你的思考步骤,明确你需要什么数据,然后再行动。

2. ReAct 模式:Agent 的黄金法则

ReAct 是 Reasoning + Acting 的缩写。这是目前最经典的 Agent 运作模式。

它的核心咒语是:

  • Thought (想法):用户想查天气,我需要调用天气工具。
  • Action (行动)get_weather("Beijing")
  • Observation (观察):API 返回了 "25度,晴"。
  • Thought (想法):我已经有了天气信息,可以回答用户了。
  • Final Answer (最终回答):北京今天天气不错,25度,晴天。

为什么这很重要? 如果没有 ReAct,模型可能会产生幻觉。比如它直接编造一个天气,而不是去调用工具。ReAct 强制模型“知行合一”。


04 架构师的“防呆”设计:Pydantic 与结构化输出 🛡️

作为工程化转型的你,肯定受不了 JSON 解析报错。 LLM 输出的 JSON 经常少个括号,或者字段名写错。怎么办?

Pydantic 登场! Pydantic 是 Python 中最强的数据验证库。我们可以用它来强制 LLM 输出符合 Python 类定义的数据。

from pydantic import BaseModel, Field

class UserIntent(BaseModel):
    intent: str = Field(description="用户的意图,如 query, command, chat")
    confidence: float = Field(description="置信度 0-1")
    keywords: list[str] = Field(description="提取的关键实体")

# 在 OpenAI 新版 SDK 中,可以直接结合 Pydantic
completion = client.beta.chat.completions.parse(
    model="gpt-4o-2024-08-06",
    messages=[...],
    response_format=UserIntent, # 强类型约束!
)

intent_obj = completion.choices[0].message.parsed
print(intent_obj.confidence) # 直接获取 float 类型,无需 json.loads

架构师思考: 这不仅仅是语法糖,这是系统稳定性的保障。在 Agent 编排中,节点之间的通信必须是结构化的(Schema),而不是随意的自然语言。


05 总结与预告 📝

今天我们剥开了 Agent 的外衣,看到了它最原始的“血肉”:

  1. 理念:从线性 Pipeline 转向 循环 Loop。
  2. 手脚:利用 Function Calling 定义工具 Schema。
  3. 大脑:利用 ReAct 模式进行“思考-行动-观察”的循环。
  4. 骨架:利用 Pydantic 保证数据流转的鲁棒性。

🗺️ 本文核心知识图谱

image.png

🎣 互动话题

你在尝试让 LLM 调用工具时,遇到过最离谱的“幻觉”是什么?(比如:明明没查数据库,却一本正经地编造了查询结果?) 欢迎在评论区分享你的“翻车”现场!

🚀 下期预告

学会了单点技能,如何构建复杂的、生产级的 Agent 流程? 下一期,我们将进入第二篇:单体 Agent 架构。我们将深度实战 LangGraph,学习如何用“图”的思维来编排一个真正的数据分析师 Agent。

关注我,带你从大数据工程师硬核转型 AI 架构师!


这是“AI Agent开发与编排”专题的第 1 篇,前序专题《Python高级工程化》、《大模型基础理论》、《RAG架构与数据工程》已完结,欢迎翻阅历史文章补课。