← 返回信息流

dev.to #ai短讯

我在手机上搭建了一个17智能体AI集群——实现过程详解

dev.to作者:Samuel James Hiotis教程AI评分:50/100

作者分享在手机上运行分布式多智能体AI系统的实践。通过部署17个具有独立任务、相互协作的智能体,成功实现了端侧复杂问题的求解。文章详细记录了这一高难度工程挑战的实现路径与遇到的困难。

我在手机上构建了一个由17个智能体组成的AI集群——以下是具体方法

好了,系好安全带。这有点奇怪。过去几周,我一直痴迷于在手机上完全运行一个分布式多智能体AI系统的想法。不是单个模型,而是由17个不同的智能体组成的集群,每个智能体都有自己的任务,通过通信和协作来解决问题。而我真的做到了。

这并不容易。效率也不高。但回报却极其丰厚。本文将详细介绍我是如何做到的、我面临的挑战,以及随之出现的令人惊讶的强大能力。警告:这部分内容相当技术化,面向熟悉Python和一些移动开发概念的开发者。

目标:口袋里的去中心化智能

核心概念灵感来源于群体智能,比如蚁群或蜂巢。与其使用一个庞大的单体AI,我想要的是一个由较小、专业化智能体组成的网络。每个智能体相对简单,但它们 collectively(集体)能够解决任何单个智能体无法胜任的任务。

我的具体用例?从不断更新的流信息中自动生成数据分析报告(想想加密货币市场数据,但可以适应任何领域)。我设想负责以下任务的智能体:

  • 数据采集(3个智能体):抓取不同来源的数据,处理API连接。
  • 数据预处理(4个智能体):清洗、转换和验证数据。
  • 分析与建模(6个智能体):执行计算、运行简单的回归分析、识别趋势。
  • 报告生成(4个智能体):制作摘要、图表(最初基于文本)和警报。

技术栈:Python、Termux 与一点魔法

最大的限制当然是手机有限的资源。忘掉TensorFlow或PyTorch这样沉重的框架吧。我需要一些轻量级且高效的工具。最终我选择了:

  • Python:用于快速原型设计和数据操作的首选语言。
  • Termux:Android终端模拟器和Linux环境。这是关键。Termux允许你在手机上运行完整的Python环境。(建议从F-Droid安装以获得最佳效果)。
  • SQLite:用于轻量级数据存储。不需要完整的数据库服务器。
  • Requests:用于向API发起HTTP请求和抓取网站。
  • 自定义智能体间通信协议:稍后详述。
  • Threading(线程):对于并发至关重要,允许智能体“同时”运行。

构建智能体:小型、专注且符合Python风格

每个智能体本质上都是一个具有特定功能的Python脚本。让我们看一个简化示例:一个抓取假设价格数据源的数据采集智能体:

# agent_data_acq_01.py
import requests
import time
import sqlite3

def acquire_price():
  try:
    response = requests.get("https://api.example.com/price") # 替换为真实API
    response.raise_for_status() # 对错误响应(4xx或5xx)引发HTTPError
    data = response.json()
    price = data['price']
    return price
  except requests.exceptions.RequestException as e:
    print(f"Error acquiring price: {e}")
    return None

def main():
  conn = sqlite3.connect('data.db')
  cursor = conn.cursor()
  cursor.execute('''CREATE TABLE IF NOT EXISTS prices (timestamp REAL, price REAL)''')

  while True:
    price = acquire_price()
    if price:
      timestamp = time.time()
      cursor.execute("INSERT INTO prices (timestamp, price) VALUES (?, ?)", (timestamp, price))
      conn.commit()
      print(f"Price acquired: {price} at {timestamp}")
    time.sleep(60) # 每60秒检查一次

if __name__ == "__main__":
  main()

这是一个简化的智能体。现实世界中的智能体会拥有更健壮的错误处理、日志记录和配置选项。关键点在于其简洁性和专注性——它把一件事做得很好。

通信层:基于文件的消息队列

让各个智能体相互通信是最大的挑战。我最初尝试使用套接字,但在移动环境中,其开销和复杂性过高。最终,我采用了一种出人意料的简单方案:基于文件的消息队列。

每个智能体都有专用的输入和输出目录。智能体将消息(序列化为 JSON 格式)“发布”到其他智能体的输入目录中。智能体通过定期检查其输入目录中的新消息来“订阅”。

import os
import json
import time

def publish_message(target_agent, message):
  filepath = f"/data/data/com.termux/files/home/swarm/{target_agent}_in/{time.time()}.json"
  with open(filepath, 'w') as f:
    json.dump(message, f)

def subscribe_messages(agent_name):
  while True:
    in_dir = f"/data/data/com.termux/files/home/swarm/{agent_name}_in"
    for filename in os.listdir(in_dir):
      filepath = os.path.join(in_dir, filename)
      try:
        with open(filepath, 'r') as f:
          message = json.load(f)
          # Process message here
          print(f"Agent {agent_name} received: {message}")
        os.remove(filepath) # Delete message after processing
      except json.JSONDecodeError:
        print(f"Error decoding JSON in file: {filename}")

    time.sleep(1)

这是一个基础的系统,但确实有效!它避免了网络编程的复杂性,转而依赖文件系统,而文件系统通常在 Android 上经过良好优化。

编排:一个简单的循环与启动脚本

这里没有复杂的编排框架。主要是一个 Shell 脚本,它在单独的后台进程中启动每个智能体:

bash
#!/bin/bash

# Create directories for each agent
mkdir -p /data/data/com.termux/files/home/swarm/agent_data_acq_01_in
mkdir -p /data/data/com.termux/files/home/swarm/agent_data_acq_01_out

# Launch agents
python /data/data/com.termux/files/home/swarm/agent_data_acq_01.py &
python /data/data/com.termux/files/home/swarm/agent_data_acq_02.py &
# ... launch all 17 agents ...

译文已达到本站中文翻译的字数上限,剩余内容请查看原文。

阅读原文