廣義超級智慧研究、基礎設施和自主應用程式
關注SuperAGI
與創作者聯繫
分享此儲存庫
AutoNode 是一個自操作系統電腦系統,旨在自動化網路互動和資料提取過程。它利用 OCR(光學字元辨識)、YOLO(只看一次)模型等先進技術進行物件偵測,以及自訂網站圖以程式設計方式導航網頁並與之互動。
要開始使用 AutoNode,您需要在系統上安裝 Python。請依照以下步驟安裝 AutoNode:
git clone https://github.com/TransformerOptimus/AutoNode.git
cd AutoNode
建立 .env.example 的副本,並將其命名為 .env。對所有三個模組重複此步驟 - autonode、yolo、ocr
確保您的系統上安裝了 Docker。您可以從這裡下載並安裝它。
一旦 Docker Desktop 運行,請在 AutoNode 目錄中執行以下命令:
docker compose -f docker-compose.yaml up --build
AutoNode 是基於網站圖進行操作,該網站圖定義了要在網站上執行的導覽和操作。以下是如何使用 AutoNode 的基本概述:
定義您的目標:指定您想要使用 AutoNode 實現的目標,例如資料擷取或特定 Web 互動的自動化。
準備您的 Autonode-Site-Graph:建立一個表示網站圖的 JSON 檔案。此圖概述了 AutoNode 將導航和互動的節點(Web 元素)和邊(操作)。
準備 AutoNode 啟動器規劃器提示:使用 openai_prompts.py 中為規劃器提示提供的模板結構,對於 OpenAI LLM,您可以在提示目錄中建立一個結構為 <llm_prompts.py> 的新提示文件
運行自動節點:
AutoNode 可以透過其 API 進行控制和使用,讓使用者以程式設計方式自動執行 Web 互動和資料擷取任務。本指南將引導您完成使用 AutoNode 的 API 端點向 AutoNode 傳送請求的程序。
在開始之前,請確保 AutoNode 正在您的本機電腦上執行。 AutoNode 啟動並運行後,您可以透過存取以下地址來存取 API 文件:
http://localhost:8001/docs
此 URL 將帶您進入 Swagger UI,您可以在其中找到有關所有可用 API 端點的詳細文檔,包括用於啟動 AutoNode 任務的端點。
若要使用 AutoNode 自動執行任務,您將使用 /api/autonode/initiate 端點。此端點接受一個 JSON 有效負載,該負載指定任務的目標、網站圖 JSON 檔案的路徑、開始遍歷的根節點以及您希望與之互動的網站的 URL。
以下是您需要傳送到/api/autonode/initiate
端點的 JSON 負載的結構:
{
"site_url": "string",
"objective": "string",
"graph_path": "string",
"planer_prompt": "string"
}
請求範例: { "site_url": "https://app.apollo.io/#/login", "objective": "尋找舊金山科技公司 20 位 CEO、CTO 的清單。使用憑證登入 apollo [email protected]及密碼dummypassword@123", "graph_path": "autonode/site_trees/apollo.json" "planner_prompt": "apollo" }
site_url:AutoNode 將存取並與之互動的網站的 URL。
目標:您希望在網站上實現的目標。這可以是從資料提取到自動化一系列網路互動的任何內容。如果您的用例需要登錄,請確保提供登入說明以及憑證
graph_path:包含網站圖的 JSON 檔案的路徑。網站圖定義了 AutoNode 網站的架構和導覽流程。
planner_prompt:計劃提示的鍵。您可以在planning_agent.py中變更或對應AutoNode規劃器提示的新鍵。
curl -X 'POST'
'http://localhost:8001/api/autonode/initiate'
-H 'accept: application/json'
-H 'Content-Type: application/json'
-d '{
"site_url": "https://example.com/products",
"objective": "Extract product details",
"graph_path": "/path/to/your/site-graph.json"
"planner_prompt": "planner_key"
}'
AutoNode 利用 YOLO 模型進行物件偵測,並利用 OCR 進行網頁上的文字辨識。這些模型對於識別可點擊元素、從圖像中讀取文字以及與網頁動態互動至關重要。
我們透過數千個網路螢幕截圖提供了一些在YOLO-V8
上訓練的通用 yolo 模型,導航至 - yolo/web_detection_models/
目錄以找到這些模型
收集資料集:收集要偵測的 Web 元素的影像,並使用邊界框對其進行註釋。
準備資料集:將資料集拆分為訓練集和驗證集。
訓練模型:使用 YOLO 訓練腳本在準備好的資料集上訓練模型。根據您的需求調整訓練參數。
評估模型:在單獨的測試集上測試經過訓練的模型以評估其表現。
與 AutoNode 整合:訓練完成後,透過在配置中指定模型路徑將自訂 YOLO 模型與 AutoNode 整合。
如果本機上沒有足夠的資源,您可以將 OCR 和 YOLO 模組託管在任何雲端伺服器上。可採取以下步驟:
在 ocr/.env 檔案中,新增 USE_REMOTE_OCR=True 並在 OCR_REMOTE_URL 中設定遠端服務的 url
在 yolo/.env 檔案中,新增 USE_REMOTE_YOLO=True 並在 YOLO_REMOTE_URL 中設定遠端服務的 url
更新 yolo/.env 檔案中的 yolo Web 偵測模型路徑,新增 SAHI_MODEL_PATH 和 ULTRALYTICS_MODEL_PATH。範例:SAHI_MODEL_PATH = yolo/web_detection_models/twitter.pt
網站圖是一個 JSON 文件,描述 AutoNode 網站的結構和導覽流程。準備方法如下:
識別網頁元素:瀏覽您的目標網站並識別您想要互動的關鍵元素,例如按鈕、文字方塊和連結。
定義節點:對於每個 Web 元素,在 JSON 檔案中定義一個節點。包括 node_name、actionable_element_type、location 和 is_type 等屬性。
定義邊:使用相鄰屬性和相鄰屬性指定節點之間的關係來表示導航流。
包含操作詳細資訊:對於需要鍵入或單擊的節點,請提供其他詳細信息,例如 type_description 或 click_action。
簡單站點圖的範例:
{
"1": {
"node_type": "clickable_and_typeable",
"node_name": "Login Button",
"actionable_element_type": "button",
"location": [100, 200],
"is_type": false,
"adjacent_to": ["2"]
},
"2": {
"node_type": "clickable_and_typeable",
"node_name": "Username Field",
"actionable_element_type": "textbox",
"location": [150, 250],
"is_type": true,
"type_description": "Enter username here",
"adjacent_to": []
}
}
用於Web元素檢測的每個節點的螢幕截圖儲存在根資料夾的requests目錄中。如果您願意,您可以將它們儲存在 AWS s3 帳戶上,也可以將它們保留在本機,或根據您的選擇兩者都不保留。對於需要下載輸出的用例,可下載內容(如 apollo 中的輸出)需要本地或遠端儲存。
# Uncomment If you have aws account and want to store result in your AWS S3
# self.s3_client = S3Helper(access_key=self.config.AWS_ACCESS_KEY_ID,
# secret_key=self.config.AWS_SECRET_ACCESS_KEY,
# bucket_name=self.config.bucket_name)
並在第 84 行傳遞 s3_client=self.s3_client
s3_client=None
# Uncomment If you have aws account and want to store result in your AWS S3
s3_client.upload_file(file_path=screenshot_filename)
# Uncomment If you have aws account and want to store result in your AWS S3
s3_client.upload_file(file_path=download_file_path)
finally:
# Comment if you don't want to delete screenshots locally
if os.path.exists(screenshots_dir):
logger.info(f"Deleting request directory {screenshots_dir}")
shutil.rmtree(screenshots_dir)
session.close()