Agent 零基础入门:从核心概念到实战开发

1次阅读
没有评论

共计 2568 个字符,预计需要花费 7 分钟才能阅读完成。

image.webp

什么是 Agent?

Agent(智能体)可以理解为一个能自主行动的软件实体。它有点像我们日常生活中的快递员——不用你一步步指挥,自己就知道取件、规划路线、送货。在编程领域,Agent 最接近 Actor 模型(Actor Model),但比简单的对象(Object)更独立。

Agent 零基础入门:从核心概念到实战开发

  • 自治性(Autonomy):Agent 自己管理内部状态,比如快递员记得包裹要送哪里
  • 反应性(Reactivity):能对外部刺激做出响应,像快递员听到门铃会开门
  • 主动性(Pro-activeness):可以自主发起动作,比如快递员发现收件人不在会自动发起第二次派送

Agent vs 传统对象:架构差异

用寄快递的例子对比两种编程范式:

  1. 传统 OOP 写法

    # 需要外部控制每一步
    package = Package(address="北京")
    courier = Courier()
    courier.pick_up(package)  # 手动调用取件
    courier.navigate()        # 手动触发导航
    courier.deliver()         # 手动执行送货 

  2. Agent 写法

    # 只需发送消息,Agent 自主处理
    courier = CourierAgent()
    courier.send({"type": "deliver", "address": "北京"})  # 发送任务消息后就不用管了 

关键差异点:

  • 状态管理 :Agent 自己维护送货状态,外部无法直接修改
  • 通信方式 :通过消息(message)而非方法调用(method call)交互
  • 执行控制 :Agent 内部有事件循环处理消息队列

动手实现基础 Agent

下面用 Python 实现一个能接收订单的咖啡师 Agent:

import asyncio
from typing import Dict, Any

class BaristaAgent:
    def __init__(self):
        self._queue = asyncio.Queue()
        self._is_running = False
        self._current_order = None  # 内部状态

    async def start(self):
        """启动 Agent 的事件循环"""
        self._is_running = True
        while self._is_running:
            try:
                message = await self._queue.get()
                await self._process_message(message)
            except Exception as e:
                print(f"处理消息失败: {e}")

    async def stop(self):
        """安全停止 Agent"""
        self._is_running = False
        await self._queue.put(None)  # 发送停止信号

    async def send(self, message: Dict[str, Any]):
        """外部接口:发送消息到 Agent"""
        await self._queue.put(message)

    async def _process_message(self, message):
        """处理消息的核心逻辑"""
        if message is None:  # 停止信号
            return

        if message["type"] == "order":
            self._current_order = message["items"]
            print(f"开始制作: {self._current_order}")
            await asyncio.sleep(2)  # 模拟制作耗时
            print(f"已完成: {self._current_order}")
            self._current_order = None

使用示例:

async def main():
    barista = BaristaAgent()
    # 启动 Agent 后台任务
    task = asyncio.create_task(barista.start())

    # 发送订单
    await barista.send({"type": "order", "items": "拿铁"})

    # 5 秒后停止
    await asyncio.sleep(5)
    await barista.stop()
    await task

asyncio.run(main())

生产环境实用技巧

线程安全方案

推荐使用 asyncio 的异步队列,避免多线程竞争。如果需要跨线程通信:

# 在另一个线程发送消息
def thread_send(agent, message):
    asyncio.run_coroutine_threadsafe(agent.send(message),
        loop=agent.event_loop  # 需要传入 Agent 的事件循环
    )

状态持久化

用 Redis 保存 Agent 状态(需安装 redis 包):

import redis

class PersistentAgent:
    def __init__(self, redis_url):
        self._redis = redis.Redis.from_url(redis_url)

    async def save_state(self):
        """定时保存状态到 Redis"""
        while True:
            await asyncio.sleep(10)  # 每 10 秒保存
            self._redis.set(
                "agent_state", 
                json.dumps(self._internal_state)
            )

新手常见问题

  1. 阻塞事件循环
  2. ❌ 错误做法:在消息处理中调用 time.sleep()
  3. ✅ 正确方案:始终使用 await asyncio.sleep()

  4. 消息丢失

  5. ❌ 直接丢弃处理失败的消息
  6. ✅ 添加重试机制或死信队列

    async def _process_message(self, msg):
        try:
            # 业务逻辑
        except Exception:
            await self._queue.put(msg)  # 重新入队 

  7. 状态不一致

  8. ❌ 允许外部直接修改 self._current_order
  9. ✅ 所有状态变更通过消息触发

总结建议

初次开发 Agent 系统时,建议先用 asyncio 实现单进程版本,熟悉消息驱动模式。之后逐步扩展:

  1. 添加监控接口检查消息积压情况
  2. 实现 __eq__ 方法方便测试时比对 Agent 状态
  3. pytest-asyncio 编写异步测试用例

Agent 架构特别适合需要处理异步事件、维护复杂状态的场景,比如物联网设备控制、游戏 NPC 行为等。关键是保持每个 Agent 的职责单一,通过消息组合复杂行为。

正文完
 0
评论(没有评论)