AIAgent

“AI Agent”(人工智能代理)这个词近年来特别火,尤其是在大语言模型(LLM)流行之后。简单来说:


🤖 什么是 AI Agent?

AI Agent(智能代理)指的是一种具备目标导向行为、能自主感知环境、做出决策并采取行动的人工智能系统。它不只是被动地回答问题,而是可以主动执行任务、调用工具、规划步骤、甚至与外部世界交互


🧩 组成要素(通俗理解)

模块 作用 类比
感知(Perception) 接收信息(用户输入、网页数据、传感器等) 人的感官
记忆(Memory) 记录对话历史、知识或上下文 大脑记忆
推理/规划(Reasoning / Planning) 决定“做什么”、“怎么做” 思考和计划
执行(Action / Tools) 使用工具或API执行任务 手脚
反馈与学习(可选) 根据结果调整行为(进化型 Agent) 学习和改进能力

🔁 和传统 LLM 有什么区别?

项目 LLM AI Agent
功能 单轮/多轮对话,生成文字 能执行任务(比如自动订机票、写代码、抓取网页)
主动性 被动响应 可主动规划和采取行动
工具调用 通常没有 能集成插件、API、脚本等工具
状态记忆 有上下文,但短时 可具备“长期记忆”

🛠️ 示例场景

  1. 🧾 自动整理邮箱 + 回复邮件
  2. 🔍 根据提示自动搜网文 + 总结 + 生成报告
  3. 🧑‍🍳 根据你家冰箱里的食材,规划做一周的饭菜 + 生成购物清单
  4. 🧑‍💻 接收任务 → 拆解 → 编写代码 → 调试 → 给你结果
  5. 📱 AI 个人助理 App(如 AutoGPT、AgentGPT、OpenDevin、ChatDev 等)

🌟 相关代表项目

名称 特点
Auto-GPT 开源项目,能自主规划执行任务
LangChain Agent 支持多种工具链和记忆模块
OpenAI GPTs ChatGPT 可定制代理,可调用工具(浏览器、代码解释器等)
AutoGen / CrewAI 支持多个 Agent 分角色协作完成复杂任务
BabyAGI 简化版自动任务执行器,结合任务队列和 LLM

🧠 总结一句话:

AI Agent = 会“自己思考 + 自己动手”的 LLM 比传统聊天机器人更智能,更接近未来的“AI助手”或“数字员工”。


如果你想自己构建一个 AI Agent,比如用 Python + OpenAI API + LangChain,我也可以给你完整的项目结构和示例代码 💻✨

当然可以,下面我给你举一个AI Agent 实际工作的完整例子,以“自动写日报”为例:


🧾 场景:AI Agent 自动生成工作日报

你每天都要写日报,但你很烦。现在你构建了一个 AI Agent,它能自动完成这个任务,只需要你提供一点点信息。


🎯 目标:

生成格式规范、内容丰富的日报,并发送到邮箱或微信。


🧠 Agent 能力模块

模块 说明
感知(Input) 从你的 Notion、微信、代码提交记录、GitHub PR 里读取当天工作内容
记忆 保存你过往的日报风格、项目关键词、老板的偏好(比如喜欢量化描述)
规划 判断今天做了什么、哪些内容值得写入日报,如何排版组织
工具调用 使用邮件 API / 微信机器人发送结果
行动 自动生成日报内容并提交

💬 示例流程

你对 Agent 说:

今天上午修复了登录 bug,下午和前端讨论了下支付流程,晚上把用户画像分析脚本跑了一遍。

Agent 处理过程:

  1. 🔍 识别任务关键词(修复 bug、支付流程、用户画像)
  2. 🧠 查阅你之前日报的写作风格(喜欢条目 + 技术细节)
  3. ✍️ 自动生成如下日报内容:
【今日工作内容】
1. 修复用户登录过程中部分设备无法跳转问题(bug#2341),已上线验证。
2. 与前端 @小李 讨论并整理支付流程交互逻辑,已输出更新文档。
3. 跑通用户画像分析脚本,初步得出 3 类人群标签,将用于下周的 AB 测试。

【明日计划】
- 持续优化画像脚本的性能(目前跑一次约需 17 分钟)
- 制作本周周报汇总图表

【备注】
今天学习了 Python 中 pandas 的 groupby 性能优化技巧。
  1. 📤 自动通过邮箱或微信机器人发送给你的主管

✅ 效果


🛠 技术实现建议(感兴趣可以继续聊)

可以使用:


是否还想看一个“自动帮你定旅行计划”、“自动填报报销单”的例子?😄

通俗点来讲

比如我们为系统写好了System Prompt, User Prompt, 我们说的自然语言传给大模型,然后大模型根据我们的Prompt返回一定格式的内容, 比如json, 返回的json我们完全可以提交个我们写好的某个进程,然后进程执行我们想要做的任务。

而且进程的运行结果完全可以作为下一次大模型的输入。

这样一来,我们有了与人类直接交互的媒介,没错使用自然语言,可以是文字、图片、语音,甚至相机画面里人的手势等等。

这样一来我们好像有了一个聪明的家伙,在替我们人类在做某些事。

例如大模型可以帮我们自动在Office中做PPT,PPT应用提供好相应的函数调用接口,大模型根据Prompt决定调用哪些函数, 生成想要的东西,当然大模型不能直接调用,而是通过一个中间的程序通常是我们调用大语言模型本身的那个代码程序等等。

如果大模型返回的不是AI Agent想要的格式,一般AIAgent会进行重试,大模型是一个概率模型,真的有概率乱说话。

为了优雅的处理这种重试,OpenAI、微软等等推出了 Function Calling的概念。

简单的demo

Python使用pydantic

https://ai.pydantic.dev/models/

#### main.py
from pydantic_ai.models.gemini import GeminiModel
from pydantic_ai import Agent

from dotenv import load_dotenv
import tools

load_dotenv()
model = GeminiModel("gemini-2.5-flash-preview-04-17")

agent = Agent(model,
              system_prompt="You are an experienced programmer",
              tools=[tools.read_file, tools.list_files, tools.rename_file])

def main():
    history = [] # 为了记住历史对话
    while True:
        user_input = input("Input: ")
        resp = agent.run_sync(user_input,
                              message_history=history)
        history = list(resp.all_messages())
        print(resp.output)


if __name__ == "__main__":
    main()


#### tools.py
from pathlib import Path
import os

base_dir = Path("./test")


def read_file(name: str) -> str:
    """Return file content. If not exist, return error message.
    """
    print(f"(read_file {name})")
    try:
        with open(base_dir / name, "r") as f:
            content = f.read()
        return content
    except Exception as e:
        return f"An error occurred: {e}"

def list_files() -> list[str]:
    print("(list_file)")
    file_list = []
    for item in base_dir.rglob("*"):
        if item.is_file():
            file_list.append(str(item.relative_to(base_dir)))
    return file_list

def rename_file(name: str, new_name: str) -> str:
    print(f"(rename_file {name} -> {new_name})")
    try:
        new_path = base_dir / new_name
        if not str(new_path).startswith(str(base_dir)):
            return "Error: new_name is outside base_dir."

        os.makedirs(new_path.parent, exist_ok=True)
        os.rename(base_dir / name, new_path)
        return f"File '{name}' successfully renamed to '{new_name}'."
    except Exception as e:
        return f"An error occurred: {e}"