OpenAgents x Milvus:如何建立共享記憶體的更智慧型多代理系統
大多數開發人員一開始使用單一代理程式來開發他們的代理系統,後來才發現他們基本上是建立了一個非常昂貴的聊天機器人。對於簡單的任務,ReAct 式的代理系統運作良好,但很快就會遇到極限:它無法並行執行步驟,無法追蹤長的推理鏈,而且一旦加入太多工具,系統就會崩潰。多代理體設定保證可以解決這個問題,但它們也帶來了自己的問題:協調開支、脆弱的交接,以及悄悄侵蝕模型品質的膨脹共享上下文。
OpenAgents是一個開放原始碼架構,用來建立多代理系統,讓 AI 代理在其中合作、分享資源,並在持續的社群中處理長期專案。OpenAgents 不需要單一的中央協調器,而是讓代理以更分散的方式合作:代理可以彼此發現、溝通,並圍繞共同目標進行協調。
搭配Milvus向量資料庫,此管道可獲得可擴充、高效能的長期記憶體層級。Milvus 透過快速的語意搜尋、靈活的索引選擇 (例如 HNSW 和 IVF) 以及透過分割的乾淨隔離,為代理程式記憶體提供強大的能力,因此代理程式可以儲存、擷取和重複使用知識,而不會淹沒在上下文中或踩到彼此的資料。
在這篇文章中,我們將介紹 OpenAgents 如何實現分散式多代理體協作、為何 Milvus 是可擴充代理體記憶體的重要基礎,以及如何逐步組裝這樣的系統。
建立真實世界代理系統的挑戰
當今許多主流的代理程式框架-LangChain、AutoGen、CrewAI 等,都是圍繞著以任務為中心的模型所建立的。您啟動一組代理程式,給他們一個工作,或許定義一個工作流程,然後讓他們執行。這對於狹窄或短暫的用例非常有效,但在真正的生產環境中,卻暴露出三種結構上的限制:
知識仍然是孤立的。代理程式的經驗只限於其本身的部署。工程部門的程式碼檢閱代理程式不會與評估可行性的產品團隊代理程式分享它所學到的知識。每個團隊最終都要從頭開始重建知識,既低效又脆弱。
合作是僵化的。即使在多代理體架構中,合作也通常取決於事先定義的工作流程。當合作需要轉變時,這些靜態規則無法適應,使得整個系統的彈性降低。
缺乏持續狀態。大多數的代理程式都遵循一個簡單的生命週期:啟動 → 執行 → 關閉。它們會在運行之間忘記一切--上下文、關係、所做的決定和互動歷史。如果沒有持久狀態,代理程式就無法建立長期記憶或演進其行為。
這些結構性問題來自於將代理視為孤立的任務執行者,而非更廣泛的協作網路中的參與者。
OpenAgents 團隊相信,未來的代理系統需要的不只是更強大的推理能力,他們需要一個機制,讓代理能夠彼此發現、建立關係、分享知識,並且動態地一起工作。最重要的是,這不應該依賴於單一的中央控制器。網際網路之所以能運作,就是因為它是分散式的,沒有單一的節點能主宰一切,而且隨著系統的成長,它也會變得更強大、更可擴充。多代理系統也受惠於相同的設計原則。這就是為什麼 OpenAgents 捨棄了全能的統籌者的概念,取而代之的是分散式、網路驅動的合作。
OpenAgents 是什麼?
OpenAgents 是建立 AI 代理網路的開放原始碼架構,可實現開放式合作,讓 AI 代理共同合作、分享資源,並處理長期專案。OpenAgents 為代理人網路提供基礎架構,讓代理人在持續成長的社群中,與數百萬個其他代理人開放合作。在技術層級上,系統是圍繞三個核心元件所構成:Agent Network、Network Mods 和 Transports。
1.代理網路:合作的共享環境
代理程式網路是一個共享環境,多個代理程式可以在這個環境中連線、溝通並共同解決複雜的任務。其核心特徵包括
持久運作:一旦建立,網路就會獨立於任何單一任務或工作流程而保持在線。
動態代理:代理可隨時使用網路 ID 加入;無需事先註冊。
多協定支援:統一的抽象層支援透過 WebSocket、gRPC、HTTP 及 libp2p 進行通訊。
自主配置:每個 Network 維護自己的權限、管理和資源。
只需一行程式碼,您就可以建立一個 Network,任何代理程式都可以透過標準介面立即加入。
2.網路模組:可插拔的協作擴充
Mods 提供與核心系統脫離的模組化協作功能層。您可以根據您的特定需求來混合和搭配 Mods,實現針對每個使用個案量身打造的協作模式。
| 模組 | 用途 | 使用個案 |
|---|---|---|
| 工作區訊息傳送 | 即時訊息通訊 | 串流回應、即時回饋 |
| 論壇 | 非同步討論 | 提案審查、多輪商議 |
| 維基 | 共享知識庫 | 知識整合、文件協作 |
| 社群 | 關係圖 | 專家路由、信任網路 |
所有 Mods 都在統一的事件系統上運作,方便隨時擴充框架或引進自訂行為。
3.Transports:與通訊協定無關的通道
Transports 是允許異質代理在 OpenAgents 網路中連結及交換訊息的通訊協定。OpenAgents 支援多種傳輸通訊協定,可在同一個網路中同時執行,包括
適用於廣泛、跨語言整合的HTTP/REST
用於低延遲、雙向通訊的WebSocket
用於適合大型集群的高效能RPC 的 gRPC
用於分散式點對點網路的libp2p
A2A 是專為代理對代理通訊所設計的新興通訊協定。
所有的傳輸都是透過統一的事件式訊息格式來操作,因此可以在通訊協定之間進行無縫轉換。您不需要擔心對等代理使用的通訊協定,框架會自動處理。以任何語言或框架建立的代理程式都可以加入 OpenAgents 網路,而無需重新編寫現有的程式碼。
整合 OpenAgents 與 Milvus 以提供長期的代理程式記憶體
OpenAgents 解決了 Agents 如何溝通、相互發現與協同合作的挑戰,但僅有協同合作是不夠的。代理程式會產生洞察力、決策、會談歷史、工具結果,以及特定領域的知識。如果沒有持久性記憶體層級,所有這些都會在代理程式關閉時消失。
這就是Milvus的重要性所在。Milvus 提供高效能向量儲存與語意檢索,可將代理程式互動轉換為持久、可重複使用的記憶體。當整合至 OpenAgents 網路時,它提供了三大優勢:
1.語意搜尋
Milvus 使用 HNSW 和 IVF_FLAT 等索引演算法提供快速的語意搜尋。代理可以根據意義而不是關鍵字來擷取最相關的歷史記錄,使他們能夠
回憶先前的決策或計劃、
避免重複工作、
維持跨會話的長遠情境。
這是代理記憶體的支柱:快速、相關、上下文檢索。
2.十億級的水平擴充能力
真實的代理程式網路會產生大量資料。Milvus 可在此規模下舒適地運作,提供
數十億向量的儲存與搜尋、
< 即使在高吞吐量的 Top-K 檢索下,延遲時間仍小於 30 毫秒、
完全分散式架構,可隨著需求成長而線性擴充。
無論您有一打代理或成千上萬的代理並行工作,Milvus 都能保持快速一致的擷取。
3.多租客隔離
Milvus 透過Partition Key(一種輕量分區機制,可在單一集合內分割記憶體)提供細粒度的多租戶隔離。這允許
不同的團隊、專案或代理社群可維護獨立的記憶體空間、
與維護多個集合相比,可大幅降低開銷、
需要共用知識時,可選擇跨分區檢索。
這種隔離性對於大型多重代理體部署非常重要,在這種部署中,資料邊界必須受到尊重,同時又不影響檢索速度。
OpenAgents 透過直接呼叫 Milvus API 的自訂 Mods連接到 Milvus。代理程式訊息、工具輸出與互動記錄會自動嵌入向量並儲存在 Milvus 中。開發人員可以自訂
嵌入模型、
儲存模式與元資料、
以及檢索策略 (例如混合搜尋、分割搜尋)。
這讓每個代理社群都有一個可擴充、持久、且針對語義推理最佳化的記憶層。
如何使用 OpenAgent 和 Milvus 建立多代理聊天機器人
為了讓事情具體化,讓我們來進行一個示範:建立一個開發人員支援社群,讓多個專業代理 - Python 專家、資料庫專家、DevOps 工程師等等 - 合作回答技術問題。每個專家都會提供特定領域的推理,系統會自動將查詢路由至最適合的代理,而非依賴單一工作過度的通用代理。
本範例展示如何將Milvus整合到 OpenAgents 部署中,以提供技術問答的長期記憶。代理對話、過去的解決方案、疑難排解記錄和使用者查詢都會轉換成向量嵌入並儲存於 Milvus 中,讓網路有能力
記住先前的答案、
重複使用先前的技術說明、
跨會話維持一致性,並
隨著更多互動的累積而不斷改進。
先決條件
python3.11 以上
conda
Openai-key
1.定義相依存關係
定義專案所需的 Python 套件:
# Core framework
openagents>=0.6.11
# Vector database
pymilvus>=2.5.1
# Embedding model
sentence-transformers>=2.2.0
# LLM integration
openai>=1.0.0
# Environment config
python-dotenv>=1.0.0
2.環境變數
這裡是您的環境設定範本:
# LLM configuration (required)
OPENAI_API_KEY=your_openai_api_key_here
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_MODEL=gpt-4o
# Milvus configuration
MILVUS_URI=./multi_agent_memory.db
# Embedding model configuration
EMBEDDING_MODEL=text-embedding-3-large
EMBEDDING_DIMENSION=3072
# Network configuration
NETWORK_HOST=localhost
NETWORK_PORT=8700
STUDIO_PORT=8050
3.設定 OpenAgents 網路
定義您的代理程式網路結構及其通訊設定:
# Network transport protocol (HTTP on port 8700)
# Multi-channel messaging system (general, coordination, expert channels)
# Agent role definitions (coordinator, python_expert, etc.)
# Milvus integration settings
network:
name: "Multi-Agent Collaboration Demo"
transports:
- type: "http"
config:
port: 8700
host: "localhost"
mods:
- name: "openagents.mods.workspace.messaging"
config:
channels:
- name: "general" # User question channel
- name: "coordination" # Coordinator channel
- name: "python_channel" # Python expert channel
- name: "milvus_channel" # Milvus expert channel
- name: "devops_channel" # DevOps expert channel
agents:
coordinator:
type: "coordinator"
description: "Coordinator Agent, responsible for analyzing queries and dispatching tasks to expert agents"
channels: ["general", "coordination"]
python_expert:
type: "expert"
domain: "python"
4.實施多代理協作
以下為核心程式碼片段 (非完整實作)。
# SharedMemory: Milvus’s SharedMemory system
# CoordinatorAgent: Coordinator Agent, responsible for analyzing queries and dispatching tasks to expert agents
# PythonExpertAgent: Python Expert
# MilvusExpertAgent: Milvus Expert
# DevOpsExpertAgent: DevOps Expert
import os
import asyncio
import json
from typing import List, Dict
from dotenv import load_dotenv
from openagents.agents.worker_agent import WorkerAgent
from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType
import openai
load_dotenv()
class SharedMemory:
"""SharedMemory in Milvus for all Agents"""
def __init__(self):
connections.connect(uri="./multi_agent_memory.db")
self.setup_collections()
self.openai_client = openai.OpenAI(
api_key=os.getenv("OPENAI_API_KEY"),
base_url=os.getenv("OPENAI_BASE_URL")
)
def setup_collections(self):
"""Create memory collections: expert knowledge, collaboration history, problem solutions"""
collections = {
"expert_knowledge": "expert knowledge",
"collaboration_history": "collaboration history",
"problem_solutions": "problem solutions"
}
# Code to create vector collections...
async def search_knowledge(self, query: str, collection_name: str):
"""Search for relevant knowledge"""
# Vector search implementation...
async def store_knowledge(self, agent_id: str, content: str, metadata: dict, collection_name: str):
"""Store knowledge"""
# Store into the vector database...
class CoordinatorAgent(WorkerAgent):
"""Coordinator Agent - analyzes questions and coordinates other Agent"""
def __init__(self):
super().__init__(agent_id="coordinator")
self.expert_agents = {
"python": "python_expert",
"milvus": "milvus_expert",
"devops": "devops_expert"
}
async def analyze_question(self, question: str) -> List[str]:
"""Determine which experts are needed for the question"""
keywords = {
"python": ["python", "django", "flask", "async"],
"milvus": ["milvus", "vector", "index", "performance"],
"devops": ["deployment", "docker", "kubernetes", "operations"]
}
# Keyword matching logic...
return needed_experts
async def coordinate_experts(self, question: str, needed_experts: List[str]):
"""Coordinate collaboration among expert Agent"""
# 1. Notify experts to begin collaborating
# 2. Dispatch tasks to each expert
# 3. Collect expert responses
# 4. Return expert opinions
async def on_channel_post(self, context):
"""Main logic for handling user questions"""
content = context.incoming_event.payload.get('content', {}).get('text', '')
if content and not content.startswith('🎯'):
# 1. Analyze question → 2. Coordinate experts → 3. Merge answers → 4. Reply to user
class PythonExpertAgent(WorkerAgent):
"""Python Expert Agent"""
async def analyze_python_question(self, question: str) -> str:
"""Analyze Python-related questions and provide expert advice"""
# 1. Search for relevant experience
# 2. Use LLM to generate expert response
# 3. Store result in collaboration history
return answer
# Start all Agens
async def run_multi_agent_demo():
coordinator = CoordinatorAgent()
python_expert = PythonExpertAgent()
milvus_expert = MilvusExpertAgent()
devops_expert = DevOpsExpertAgent()
# Connect to the OpenAgents network
await coordinator.async_start(network_host="localhost", network_port=8700)
# ... Start other Agent
while True:
await asyncio.sleep(1)
if __name__ == "__main__":
asyncio.run(run_multi_agent_demo())
5.建立並啟動虛擬環境
conda create -n openagents
conda activate openagents
安裝相依性
pip install -r requirements.txt
設定 API 金鑰
cp .env.example .env
啟動 OpenAgents 網路
openagents network start .
啟動多重代理服務
python multi_agent_demo.py
啟動 OpenAgents Studio
openagents studio -s
存取工作室
http://localhost:8050
檢查代理和網路的狀態:
結論
OpenAgents 提供了協調層,讓代理相互發現、溝通和協作,而 Milvus 則解決了知識如何儲存、分享和重複使用這個同樣重要的問題。透過提供高效能向量記憶層,Milvus 可讓代理建立持續的上下文、回想過去的互動,並隨時間累積專業知識。兩者的結合,讓 AI 系統超越了孤立模型的限制,邁向真正多機體網路的更深層次協作潛力。
當然,任何多代理體架構都必須有所取捨。並行運行代理程式可能會增加代幣消耗,錯誤可能會在代理程式之間連鎖發生,同時進行決策可能會導致偶爾的衝突。這些都是積極研究和持續改善的領域,但它們不會降低建立能夠協調、記憶和進化的系統的價值。
🚀準備好給您的代理體長期記憶了嗎?
探索Milvus並嘗試將其與您自己的工作流程整合。
對任何功能有問題或想要深入瞭解?加入我們的 Discord 頻道或在 GitHub 上提出問題。您也可以透過 Milvus Office Hours 預約 20 分鐘的一對一會議,以獲得洞察力、指導和問題解答。
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word



