Skip to content

Jimmy1106/Autonomous-procurement-agent

Repository files navigation

🤖 自主採購代理人 (Autonomous Procurement Agent)

一個基於 LLM 的自主採購代理人,能接收自然語言採購需求,自動解析意圖、查詢商品價格、進行合規審核,並在預算範圍內完成下單,無需人工介入。支援 Agentic RAG,Agent 可自主判斷是否需要檢索採購規範與商品目錄,將檢索結果納入決策依據。


📖 目錄


🖥️ 系統展示

💬 主頁

系統 Demo

輸入「我要買五個滑鼠」,系統自動完成查價 → 審核攔截 → 修正數量 → 下單的完整流程,每個步驟即時顯示。

更多 Agentic RAG 功能展示(點擊展開)

查詢採購規範 RAG 規範查詢 RAG 規範查詢

詢問採購流程,Agent 自主判斷需要檢索知識庫,回傳對應的規範說明。

查詢商品目錄 RAG 商品查詢 RAG 商品查詢

詢問可採購的商品選項,Agent 從商品目錄中檢索並列出相關品項與價格。

查詢系統使用說明 RAG 使用說明 RAG 使用說明

詢問系統操作方式,Agent 從使用說明文件中檢索並回答。

📊 LLM 監控儀表板

監控總覽

追蹤每個時間區間的 token 用量、API 費用、執行延遲與 Agent 修正次數,並與上週同期自動比較,以 🔴🟢 標示各指標趨勢。

更多監控頁面功能展示(點擊展開)

修正次數分布 & 任務結果分布 監控圖表

以長條圖呈現 Agent 自動修正次數的分布,以及各任務結果(成功 / 攔截後修正 / 錯誤)的佔比。

任務紀錄列表(含採購金額明細) 任務紀錄

列出每筆採購任務的完整紀錄,包含商品單價、原始下單方案與最終成交方案,清楚呈現 compliance 攔截前後的差異。

單次任務明細 & 節點執行路徑 任務明細

展開單次任務可看到每次 LLM 呼叫的原因、token 用量與延遲,以及該次任務的節點執行路徑視覺化。


📌 專案特色

  • 自然語言驅動:以自由對話描述需求,Agent 自動解析意圖,無需填寫固定格式
  • 自主決策:Agent 能獨立完成「查價 → 審核 → 下單」的完整流程
  • 合規審核機制:在工具執行前攔截超預算的下單請求,而非事後處理
  • 自動修正:被攔截後,Agent 能自主重新計算預算內最大可購買數量並重新下單
  • Agentic RAG:以 ChromaDB 建立採購知識庫,Agent 自主判斷是否需要檢索採購規範、商品目錄與系統使用說明,無需每次都強制檢索
  • 自動 Ingest:服務啟動時自動偵測知識庫文件異動(hash 比對),有異動才重新向量化,無需手動執行
  • 完整 Agentic Loop:基於 LangGraph 實作,支援多節點、條件路由與狀態管理
  • Web 服務化:FastAPI 提供 REST API,Streamlit 提供聊天介面,支援 SSE 串流即時顯示執行過程
  • 容器化部署:Docker Compose 一行指令啟動完整服務
  • LLM 監控:自製 Callback Handler 追蹤 token 用量、API 成本、執行延遲與採購金額明細,支援時間篩選與上週同期比較分析

🏗️ 系統架構

整個系統分為三層:

[Streamlit 聊天介面 + 監控儀表板]  ←── SSE 串流 ──→  [FastAPI Server]  ←──→  [LangGraph Agent]
              ↑                                              ↑                        ↑
              └───────────────── Docker Compose ─────────────┘                        │
                                        ↓                                             ↓
                              [SQLite 監控資料庫]                           [ChromaDB 向量資料庫]
                                                                      (採購規範 / 商品目錄 / 使用說明)

Agent 核心(LangGraph)

由三個節點組成,透過條件路由串聯:

  • agent:核心推理節點,驅動 GPT-4o 分析當前狀況並決定下一步行動(查價、下單或檢索知識庫)
  • compliance:審核節點,在工具實際執行「之前」攔截所有下單請求,驗證總金額是否超出預算。若超標,將拒絕訊息回傳給 Agent 觸發重新計算;若合規則放行
  • tools:工具執行節點,負責實際呼叫 check_item_price(查詢單價)、place_order(執行下單)與 search_knowledge_base(檢索知識庫)

LangGraph 架構圖

虛線代表條件路由,實線代表固定流程。Agent 與 Compliance 之間的雙向虛線體現了「審核未通過 → 退回重算 → 再次審核」的自我修正迴圈。

Agentic RAG

RAG 被封裝為 LangChain @tool,而非固定流程節點。Agent 在對話過程中自主判斷是否需要查詢知識庫,屬於 Agentic RAG 的核心概念:

使用者提問
    ↓
Agent 判斷是否需要檢索知識庫
    ├── 需要 → search_knowledge_base → ChromaDB 檢索相關段落 → 回傳給 Agent
    └── 不需要 → 直接使用既有工具(查價 / 下單)

知識庫包含三份文件:

  • 採購規範procurement_policy.md):金額限制、審批流程、類別規則
  • 商品目錄product_catalog.md):品項、單價、規格
  • 系統使用說明user_guide.md):操作流程、預算設定

📁 專案結構

procurement-agent/
│
├── core/                          # 純業務邏輯層,不依賴任何 web framework
│   ├── graph.py                   # LangGraph workflow 建構與路由邏輯
│   ├── state.py                   # AgentState 資料結構定義
│   ├── nodes/
│   │   ├── reasoning.py           # 推理節點:呼叫 LLM 決定下一步
│   │   └── compliance.py          # 審核節點:攔截超預算下單
│   ├── tools/
│   │   └── procurement_tools.py   # LangChain @tool 定義(含 search_knowledge_base)
│   └── memory/                    # 預留:Memory / 向量資料庫
│
├── api/                           # FastAPI web 層
│   ├── routes/
│   │   └── procure.py             # POST /api/procure、GET /api/health
│   ├── services/
│   │   └── agent_runner.py        # Agent 執行邏輯,注入 CostTracker callback
│   └── main.py                    # FastAPI app 進入點(含啟動時自動 ingest)
│
├── monitoring/                    # LLM 監控層
│   ├── schema.sql                 # SQLite 資料表定義(runs、llm_calls)
│   ├── storage.py                 # 資料庫讀寫邏輯
│   └── callback.py                # CostTracker:LangChain Callback Handler
│
├── frontend/
│   ├── streamlit_app.py           # Streamlit 聊天介面
│   └── pages/
│       └── monitor.py             # LLM 監控儀表板(Streamlit 多頁面)
│
├── rag/                           # Agentic RAG 模組
│   ├── documents/
│   │   ├── procurement_policy.md  # 採購規範(金額限制、審批流程、類別規則)
│   │   ├── product_catalog.md     # 商品目錄(品項、單價、規格)
│   │   └── user_guide.md          # 系統使用說明(操作流程、預算設定)
│   ├── ingest.py                  # 文件切段、向量化、存入 ChromaDB(含 hash 異動偵測)
│   └── retriever.py               # 封裝查詢邏輯,回傳 top-k 相關段落與來源
│
├── scripts/
│   └── seed_data.py               # 插入模擬資料供監控頁面展示用
│
├── main.py                        # 本機互動式入口(供除錯用)
├── Dockerfile.api                 # FastAPI container 定義(含 rag/ 複製)
├── Dockerfile.frontend            # Streamlit container 定義
├── docker-compose.yml             # 串起兩個服務,含 db_data volume
├── .dockerignore
├── .env.example                   # 環境變數範本
├── requirements.txt               # 含 chromadb、langchain-chroma
└── docs/                          # 文件與截圖
    ├── procurement_demo.png
    └── procurement_architecture_fixed.png

⚙️ 如何執行

方式一:Docker(推薦)

# 1. 複製環境變數範本並填入 API Key
cp .env.example .env

# 2. 一行啟動(第一次需要 build)
docker compose up --build

# 3. 之後直接啟動(使用快取,秒啟動)
docker compose up

💡 首次啟動時會自動執行 RAG ingest(文件向量化),之後只有文件異動才會重新執行。

服務 網址
Streamlit 聊天介面 http://localhost:8501
LLM 監控儀表板 http://localhost:8501(側邊欄選 monitor)
FastAPI Swagger 文件 http://localhost:8000/docs
# 停止服務
Ctrl + C

方式二:本機執行

1. 安裝依賴套件

pip install -r requirements.txt

2. 設定環境變數

cp .env.example .env
# 編輯 .env,填入 OPENAI_API_KEY

3. 建立知識庫向量索引

python rag/ingest.py

此步驟只需執行一次,之後若文件有異動再重新執行即可。Docker 模式下會自動處理,無需手動執行。

4a. 啟動 Web 服務(需開兩個 Terminal)

# Terminal 1:FastAPI
uvicorn api.main:app --reload --port 8000

# Terminal 2:Streamlit
streamlit run frontend/streamlit_app.py

4b. 本機互動式 Terminal(測試用)

python main.py

執行後可選擇:

  • 1:產出系統架構流程圖
  • 2:超標測試(購買 5 個 Mouse,預算 $500,會被攔截並自動修正)
  • 3:合規測試(購買 4 個 Mouse,應直接通過)

插入監控模擬資料(選用)

讓監控頁面的「與上週同期比較」有資料可以呈現:

# Docker 環境(推薦)
docker compose exec api python scripts/seed_data.py

🧪 執行範例

採購流程(合規審核 + 自動修正)

情境:購買 5 個 Pro Mouse,預算 $500,單價 $120

[Step 1] Agent 決定:呼叫 check_item_price
[Step 2] Tool 執行結果:120
[Step 3] Agent 決定:呼叫 place_order(5 個,$600)

🔍 [審核節點] 檢測到下單意圖:5 個 Pro Mouse,總額 $600
❌ [審核攔截] 總額 $600 超過預算 $500!
🔄 [路由] 審核未通過,退回 Agent 重新思考

[Step 4] Agent 決定:呼叫 place_order(4 個,$480)
✅ [審核通過] 總額 $480 符合預算 $500

🎯 最終結果:SUCCESS: 已下單 4 個 Pro Mouse,總金額 $480
🔄 修正次數:1

Agentic RAG(知識庫檢索)

情境:詢問採購規範

使用者:單筆採購超過多少錢需要主管審批?
Agent:(呼叫 search_knowledge_base)
→ 根據採購規範,單次採購 $500 以下可自行下單;$501–$2,000 需部門主管口頭確認;
  $2,001 以上需填寫採購申請單,經主管書面簽核後才可下單。

情境:查詢商品目錄

使用者:目錄裡有哪些鍵盤可以選?
Agent:(呼叫 search_knowledge_base)
→ 商品目錄中有兩款鍵盤:機械鍵盤 $350、薄膜鍵盤 $150。

情境:系統使用說明

使用者:不小心下單超出預算怎麼辦?
Agent:(呼叫 search_knowledge_base)
→ 系統會自動計算預算內最多可購買的數量,並以修正後的數量重新下單,不需要人工介入。
  也可以在畫面左側 Sidebar 預先設定預算上限,系統不會下單超過此金額的訂單。

🛠️ 技術棧

類別 技術
LLM GPT-4o
Embedding OpenAI text-embedding-3-small
Agent 框架 LangGraph、LangChain
向量資料庫 ChromaDB
API 框架 FastAPI
前端介面 Streamlit
串流通訊 Server-Sent Events(SSE)
監控儲存 SQLite
容器化 Docker、Docker Compose
語言 Python 3.11

📋 版本更動紀錄

v0.4.0 — Agentic RAG

  • 新增 Agentic RAG 模組,以 ChromaDB 建立採購知識庫(採購規範、商品目錄、系統使用說明)
  • RAG 封裝為 LangChain @toolsearch_knowledge_base),Agent 自主判斷是否需要檢索,不改動任何現有節點
  • 文件依 Markdown 標題切段後,以 OpenAI text-embedding-3-small 向量化存入 ChromaDB
  • 服務啟動時自動偵測文件異動(hash 比對),有異動才重新 ingest,無需手動執行
  • 更新 system prompt,加入三個工具的使用時機說明
  • 補齊 check_item_price 商品對照表(鍵盤 $350、Webcam $800)

v0.3.0 — LLM 監控儀表板

  • 自製 LangChain Callback Handler(CostTracker),在不修改任何 agent 邏輯的前提下,攔截每次 LLM 呼叫的 token 用量、費用與延遲
  • 以 SQLite 持久化儲存監控數據,透過 Docker named volume 確保跨 container 存取與重啟後不消失
  • Streamlit 多頁面監控儀表板,包含:
    • 時間篩選器(今日 / 近 7 天 / 近 30 天 / 自訂)
    • 與上週同期比較分析(漲跌幅、🔴🟢 趨勢標示)
    • 採購金額明細(原始方案 vs 最終方案,展示被攔截的原始超預算意圖)
    • LLM 呼叫次數統計與逐次呼叫原因明細
    • 節點執行路徑視覺化

v0.2.0 — Web 服務化與容器化部署

  • 模組化重構:將單檔拆分為 core/(業務邏輯)與 api/(Web 層),建立清晰的分層架構
  • 串接 FastAPI:agent 邏輯包裝為 REST API,以 SSE 串流即時回傳每個執行步驟
  • 串接 Streamlit:提供自然語言聊天介面,任何人都能直接互動,無需看懂程式碼
  • Docker 容器化:docker compose up --build 一行啟動完整服務,解決環境依賴問題

v0.1.0 — Agent 核心建立

  • 以 LangGraph 建構三節點 workflow(agent → compliance → tools)
  • Compliance 節點在工具執行前攔截超預算下單,而非事後處理
  • Agent 被攔截後能自主重新計算並修正下單,無需人工介入
  • 支援 revision_count 追蹤修正次數,具備可觀測性基礎

🔮 未來規劃

  • 進階 RAG 功能(Query Rewriting、多步驟檢索、多來源選擇)
  • Memory 與向量資料庫(跨 session 記憶使用者偏好)
  • 擴充商品資料庫(連接真實 API)
  • 多層級審核機制(主管審批流程)

About

An autonomous procurement agent based on LLM can automatically check product prices, conduct compliance reviews, and complete orders within budget without manual intervention.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages