Agent学习day01

复制代码
https://github.com/datawhalechina/hello-agents

目录


(1)什么是Agent?

Agent = 一个能够自主完成任务 的大模型系统。

Agent:不仅回答问题,而是为了完成任务。

Agent的五个组成

第一:Brain(大脑)

第二:Memory(记忆)

第三:Tool(工具)

第四:Planning(规划)

第五:Action(行动)

Agent与Workflow的区别

Workflow Agent
固定流程 动态决策
每次执行一样 每次可能不同
规则明确 需要推理
自动化流程 智能体

(2)Agent为什么会思考?

为什么 ReAct 这么重要?

LLM 不需要一次就想明白所有事情。

ReAct:通过"思考 → 行动 → 观察"循环推进任务。

Agent 的每一次循环叫什么?

一个 Step(一步)

那这些 Thought 是不是一定会显示给用户?

不一定。实际上,大多数商业 Agent(包括 ChatGPT)不会把完整内部推理展示给用户。模型会进行内部推理,但最终只输出结果或必要的执行过程。这既是为了安全,也是为了避免暴露冗长的内部思考。因此,我们学习 ReAct 时,更重要的是理解这种工作机制,而不是认为所有 Agent 都会把每一步 Thought 原样打印出来。

一个完整的 Agent 流程

复制代码
用户提出任务
        │
        ▼
    LLM 理解任务
        │
        ▼
判断是否需要工具
        │
   ┌────┴────┐
   │         │
 不需要     需要
   │         │
直接回答   调用工具
             │
             ▼
       获取工具结果
             │
             ▼
      判断任务是否完成
             │
   ┌────┴────┐
   │         │
   否        是
   │         │
继续思考   输出答案

(3)手写人生第一个 Agent

其实最简单的Agent只有四步。

复制代码
用户输入
    ↓
LLM思考
    ↓
调用工具(如果需要)
    ↓
返回答案

Tool 长什么样?

Agent Tool 本质就是 Python 函数。

Tool:本质上就是可被调用的能力(很多时候就是 Python 函数)。

Agent真正的作用

LLM 负责决策,Tool 负责执行。

(4)Function Calling(函数调用)

把 Tool 的信息告诉 LLM,让 LLM 自己决定调用哪个 Tool。(LLM 输出"我要调用哪个函数"。)

现代 Agent 就是:LLM 不断调用 Tool。

Function Calling:LLM 根据工具描述决定调用哪个工具,并给出参数;真正执行工具的是程序,而不是 LLM 本身。

(5)手写一个 Mini Agent

复制代码
用户输入
      │
      ▼
   Agent
      │
      ▼
判断调用哪个 Tool
      │
      ▼
执行 Tool
      │
      ▼
返回结果

第一步:建立项目

新建一个文件夹:

复制代码
hello_agent/
│
├── main.py(程序入口负责启动)
├── tools.py(所有工具放到这里)
└── agent.py(agent自己来判断调用哪个tool)

第二步:先写 Tool

Tool = Python Function

py 复制代码
def calculator(a, b):
    """加法计算器"""
    return a + b


def get_time():
    """获取当前时间"""
    from datetime import datetime
    return datetime.now().strftime("%Y-%m-%d %H:%M:%S")

第三步:写 Agent

py 复制代码
from tools import calculator, get_time


class Agent:

    def run(self, question):

        if "几点" in question:
            return get_time()

        elif "+" in question:

            nums = question.split("+")

            a = int(nums[0])

            b = int(nums[1])

            return calculator(a, b)

        else:

            return "我不会。"

第四步:启动程序

py 复制代码
from agent import Agent

agent = Agent()

while True:

    question = input("请输入:")

    answer = agent.run(question)

    print(answer)

我们把 Tool 注册起来

Tool Registry(工具注册表)

py 复制代码
TOOLS = {
    "calculator": calculator,
    "time": get_time
}

为什么要注册?

以后增加:

py 复制代码
weather()

你不用改 Agent。只需要:

py 复制代码
TOOLS["weather"] = weather

Agent 自动就有了。

这就是:开放封闭原则(Open/Closed Principle)。

总结

复制代码
                 main.py
                     │
                     ▼
                Agent.run()
                     │
                     ▼
          判断需要哪个 Tool
                     │
        ┌────────────┴────────────┐
        ▼                         ▼
 Calculator Tool           Time Tool
        ▼                         ▼
        └────────────┬────────────┘
                     ▼
                 返回结果