開源 AI 食譜文件
基於 MongoDB 的多智慧體訂單管理系統
並獲得增強的文件體驗
開始使用
基於 MongoDB 的多智慧體訂單管理系統
本筆記實現了使用以下工具管理產品訂單、庫存和交付的多智慧體系統:
- smolagents 用於智慧體管理
- MongoDB 用於資料持久化
- DeepSeek Chat 作為 LLM 模型
設定 MongoDB Atlas
- 在 https://www.mongodb.com/cloud/atlas/register 建立一個免費的 MongoDB Atlas 賬戶
- 建立一個新叢集(免費套餐即可)
- 透過新增您的 IP 地址配置網路訪問
- 建立一個具有讀/寫許可權的資料庫使用者
- 從 Atlas UI 獲取您的連線字串(點選“連線”>“連線您的應用程式”)
- 將連線字串中的
<password>
替換為您的資料庫使用者密碼 - 在網路訪問設定中啟用來自您的 IP 地址的網路訪問
安全注意事項
使用 MongoDB Atlas 時
- 切勿將包含憑據的連線字串提交到版本控制
- 使用環境變數或安全的金鑰管理
- 將資料庫使用者許可權限制為僅所需的許可權
- 在 Atlas 網路訪問設定中啟用 IP 允許列表
設定
首先,讓我們安裝所需的依賴項
!pip install smolagents pymongo litellm
匯入依賴項
在您的金鑰中設定 MONGODB_URI
和 DEEPSEEK_API_KEY
(來自 https://www.deepseek.com/ 或任何其他 LLM 提供商)
匯入所有必需的庫並設定 LLM 模型
from smolagents.agents import ToolCallingAgent
from smolagents import tool, LiteLLMModel, ManagedAgent, CodeAgent
from pymongo import MongoClient
from datetime import datetime
from google.colab import userdata
from typing import List, Dict, Optional
# Initialize LLM model
MODEL_ID = "deepseek/deepseek-chat"
MONGODB_URI = userdata.get("MONGO_URI")
DEEPSEEK_API_KEY = userdata.get("DEEPSEEK_API_KEY")
資料庫連線類
建立一個 MongoDB 連線管理器
mongoclient = MongoClient(MONGODB_URI, appname="devrel.showcase.multi-smolagents")
db = mongoclient.warehouse
智慧體工具定義
我們的系統為倉庫管理實現了三種核心工具
工作流程
Inventory Management Tools:
+-------------------+-------------------+
| Tool | Description |
+-------------------+-------------------+
| check_stock | Queries stock |
| | levels |
+-------------------+-------------------+
| update_stock | Adjusts inventory |
| | quantities |
+-------------------+-------------------+
Order Management Tools:
+-------------------+-------------------+
| Tool | Description |
+-------------------+-------------------+
| create_order | Creates new order |
| | document |
+-------------------+-------------------+
Delivery Management Tools:
+-------------------+-------------------+
| Tool | Description |
+-------------------+-------------------+
| update_delivery | Updates delivery |
| _status | status |
+-------------------+-------------------+
Decision Flow:
+-------------------+-------------------+
| Step | Action |
+-------------------+-------------------+
| 1. Create Order | Uses `create_order`|
| | tool to create |
| | order document |
+-------------------+-------------------+
| 2. Update Stock | Uses `update_stock`|
| | tool to adjust |
| | inventory |
+-------------------+-------------------+
| 3. Update Delivery| Uses `update_delivery`|
| Status | _status tool to |
| | set delivery |
| | status to |
| | `in_transit` |
+-------------------+-------------------+
為每種智慧體型別定義工具
@tool
def check_stock(product_id: str) -> Dict:
"""Query product stock level.
Args:
product_id: Product identifier
Returns:
Dict containing product details and quantity
"""
return db.products.find_one({"_id": product_id})
@tool
def update_stock(product_id: str, quantity: int) -> bool:
"""Update product stock quantity.
Args:
product_id: Product identifier
quantity: Amount to decrease from stock
Returns:
bool: Success status
"""
result = db.products.update_one({"_id": product_id}, {"$inc": {"quantity": -quantity}})
return result.modified_count > 0
@tool
def create_order(products: any, address: str) -> str:
"""Create new order for all provided products.
Args:
products: List of products with quantities
address: Delivery address
Returns:
str: Order ID message
"""
order = {"products": products, "status": "pending", "delivery_address": address, "created_at": datetime.now()}
result = db.orders.insert_one(order)
return f"Successfully ordered : {str(result.inserted_id)}"
from bson.objectid import ObjectId
@tool
def update_delivery_status(order_id: str, status: str) -> bool:
"""Update order delivery status to in_transit once a pending order is provided
Args:
order_id: Order identifier
status: New delivery status is being set to in_transit or delivered
Returns:
bool: Success status
"""
if status not in ["pending", "in_transit", "delivered", "cancelled"]:
raise ValueError("Invalid delivery status")
result = db.orders.update_one({"_id": ObjectId(order_id), "status": "pending"}, {"$set": {"status": status}})
return result.modified_count > 0
主訂單管理系統
此類別實現了一個多智慧體架構,用於訂單處理,包含以下元件:
- 庫存智慧體:處理庫存檢查和更新
- 訂單智慧體:管理訂單建立和文件
- 交付智慧體:控制訂單交付狀態更改
- 經理智慧體:協調其他智慧體之間的工作流
系統遵循以下流程:
- 為客戶請求建立訂單文件
- 驗證並更新產品庫存水平
- 初始化交付跟蹤狀態
- 透過經理協調智慧體互動
主要功能
- 非同步多智慧體協調
- 自動化庫存管理
- 訂單狀態跟蹤
- 交付管道整合
定義協調所有智慧體的主系統類
class OrderManagementSystem:
"""Multi-agent order management system"""
def __init__(self, model_id: str = MODEL_ID):
self.model = LiteLLMModel(model_id=model_id, api_key=DEEPSEEK_API_KEY)
# Create agents
self.inventory_agent = ToolCallingAgent(tools=[check_stock, update_stock], model=self.model, max_iterations=10)
self.order_agent = ToolCallingAgent(tools=[create_order], model=self.model, max_iterations=10)
self.delivery_agent = ToolCallingAgent(tools=[update_delivery_status], model=self.model, max_iterations=10)
# Create managed agents
self.managed_agents = [
ManagedAgent(self.inventory_agent, "inventory", "Manages product inventory"),
ManagedAgent(self.order_agent, "orders", "Handles order creation"),
ManagedAgent(self.delivery_agent, "delivery", "Manages delivery status"),
]
# Create manager agent
self.manager = CodeAgent(
tools=[],
system_prompt="""For each order:
1. Create the order document
2. Update the inventory
3. Set deliviery status to in_transit
Use relevant agents: {{managed_agents_descriptions}} and you can use {{authorized_imports}}
""",
model=self.model,
managed_agents=self.managed_agents,
additional_authorized_imports=["time", "json"],
)
def process_order(self, orders: List[Dict]) -> str:
"""Process a set of orders.
Args:
orders: List of orders each has address and products
Returns:
str: Processing result
"""
return self.manager.run(
f"Process the following {orders} as well as substract the ordered items from inventory."
f"to be delivered to relevant addresses"
)
新增示例資料
為了測試我們的訂單管理系統,我們需要向 MongoDB 資料庫填充示例產品資料。以下部分展示瞭如何新增帶有價格和數量的測試產品。您可以修改產品詳細資訊或按照相同結構新增更多專案。每個產品都有唯一的 ID、名稱、價格和初始庫存數量。
示例資料提供了具有不同價格點和庫存水平的代表性電子產品組合,以演示庫存跟蹤。
為了測試系統,您可能需要向 MongoDB 新增一些示例產品
>>> def add_sample_products():
... db.products.delete_many({})
... sample_products = [
... {"_id": "prod1", "name": "Laptop", "price": 999.99, "quantity": 10},
... {"_id": "prod2", "name": "Smartphone", "price": 599.99, "quantity": 15},
... {"_id": "prod3", "name": "Headphones", "price": 99.99, "quantity": 30},
... ]
... db.products.insert_many(sample_products)
... print("Sample products added successfully!")
>>> # Uncomment to add sample products
>>> add_sample_products()
Sample products added successfully!
測試系統
以下是測試資料方法的 markdown 描述
測試策略概述
- 我們使用兩種不同的訂單場景進行測試
- 多產品訂單(筆記型電腦 + 智慧手機)
- 單產品訂單(耳機)
測試資料設計
- 產品代表不同價位的常見電子產品
- 訂單數量特意保持較小,以避免庫存耗盡
- 多個送貨地址模擬真實世界場景
替代測試示例
- 批次訂單:同類產品多個單位
- 混合類別訂單:高價值/低價值商品組合
- 邊緣情況:接近庫存限制的訂單
- 無效場景:庫存不足的產品
測試演示了
- 多產品訂單處理
- 庫存水平管理
- 交付狀態更新
- 不同地點的地址處理
讓我們用一個示例訂單來測試我們的系統
>>> # Initialize system
>>> system = OrderManagementSystem()
>>> # Create test orders
>>> test_orders = [
... {
... "products": [{"product_id": "prod1", "quantity": 2}, {"product_id": "prod2", "quantity": 1}],
... "address": "123 Main St",
... },
... {"products": [{"product_id": "prod3", "quantity": 3}], "address": "456 Elm St"},
... ]
>>> # Process order
>>> result = system.process_order(orders=test_orders)
>>> print("Orders processing result:", result)
Orders processing result: Here’s the response to your request: --- ### **Processed Orders and Inventory Update** 1. **Orders Created**: - **Order 1**: - **Products**: - `prod1`: 2 units - `prod2`: 1 unit - **Delivery Address**: `123 Main St` - **Order ID**: `677b8a9ff033af3a53c9a75a` - **Order 2**: - **Products**: - `prod3`: 3 units - **Delivery Address**: `456 Elm St` - **Order ID**: `677b8aa3f033af3a53c9a75c` 2. **Inventory Updated**: - **`prod1` (Laptop)**: - Initial stock: 6 units - Subtracted: 2 units - New stock: 4 units - **`prod2` (Smartphone)**: - Initial stock: 13 units - Subtracted: 1 unit - New stock: 12 units - **`prod3` (Headphones)**: - Initial stock: 24 units - Subtracted: 3 units - New stock: 21 units 3. **Delivery Status**: - Both orders have been marked as **"in_transit"** and are ready for delivery. --- ### **Summary**: - The orders have been successfully processed. - The inventory has been updated to reflect the subtracted quantities. - The delivery status for both orders is now **"in_transit"**. Let me know if you need further assistance! 😊
系統輸出分析
系統成功完成以下關鍵操作
訂單建立
- 多個訂單並行處理
- 訂單 ID 生成並存儲在 MongoDB 中
- 產品和送貨地址正確連結
庫存管理
- 訂單處理前檢查庫存水平
- 訂單確認後數量減少
- 庫存更新反映在 MongoDB 中
交付狀態
- 初始狀態設定為“待處理”
- 處理後更新為“運輸中”
- 狀態更改在訂單文件中跟蹤
資料一致性
- 所有 MongoDB 操作原子完成
- 訂單詳細資訊準確保留
- 庫存水平正確維護
執行系統時,您可能會注意到智慧體嘗試將文字輸出解釋為 Python 程式碼。這是 CodeAgent 的預期行為,因為它試圖理解和處理響應。經過幾次嘗試(max_iterations=10)後,如果失敗,它將停止。
智慧體行為示例
- 接收來自訂單建立的文字輸出
- 嘗試將其解析為程式碼
- 嘗試使用不同的解釋重試
- 最終完成工作流
多智慧體系統透過其錯誤處理和自我糾正機制展示了彈性操作。儘管初始嘗試可能會產生錯誤日誌,但智慧體透過迭代成功地進行了調整。最重要的是,最終狀態顯示訂單處理成功和庫存水平更新準確,儘管存在中間錯誤,但仍保持資料一致性。
此行為是設計使然,不影響系統的核心功能。實際的訂單處理、庫存更新和交付狀態更改透過 MongoDB 操作成功完成。
結論
在本筆記中,我們成功地使用 smolagents 和 MongoDB 實現了一個多智慧體訂單管理系統。我們定義了各種工具來管理庫存、建立訂單和更新交付狀態。我們還建立了一個主系統類來協調這些智慧體,並使用示例資料和訂單測試了系統。
這種方法展示了將基於智慧體的系統與 MongoDB 等強大的資料持久化解決方案相結合,以建立可伸縮和高效的訂單管理系統的強大功能。
< > 在 GitHub 上更新