dev.to #ai短讯
我在手机上搭建了一个17智能体AI集群——实现过程详解
作者分享在手机上运行分布式多智能体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 ...译文已达到本站中文翻译的字数上限,剩余内容请查看原文。