首頁 >後端開發 >Python教學 >使用 ClientAI 和 Ollama 建構本地 AI 任務規劃器

使用 ClientAI 和 Ollama 建構本地 AI 任務規劃器

Barbara Streisand
Barbara Streisand原創
2024-12-18 01:33:10269瀏覽

Building a Local AI Task Planner with ClientAI and Ollama

在本教學中,我們將使用 ClientAI 和 Ollama 來建構一個人工智慧驅動的任務規劃器。我們的計劃者會將目標分解為可操作的任務,創建現實的時間表並管理資源 - 所有這些都在您自己的機器上運行。

我們的任務規劃器將能夠:

  • 將目標分解為具體的、可操作的任務
  • 透過錯誤處理創造現實的時間表
  • 有效管理與分配資源
  • 提供結構化、格式化的方案

有關 ClientAI 的文檔,請參閱此處;有關 Github Repo,請參閱此處。

設定我們的環境

首先,為您的專案建立一個新目錄:

mkdir local_task_planner
cd local_task_planner

在 Ollama 支援下安裝 ClientAI:

pip install clientai[ollama]

確保您的系統上安裝了 Ollama。您可以從 Ollama 的網站取得。

建立我們的主要 Python 檔案:

touch task_planner.py

讓我們從核心導入開始:

from datetime import datetime, timedelta
from typing import Dict, List
import logging

from clientai import ClientAI
from clientai.agent import create_agent, tool
from clientai.ollama import OllamaManager

logger = logging.getLogger(__name__)

每個組件都扮演著至關重要的角色:

  • 日期時間:幫助我們管理任務時間表和日程安排
  • ClientAI:提供我們的人工智慧框架
  • OllamaManager: 管理我們本地的 AI 模型
  • 用於類型提示和日誌記錄的各種實用模組

建構任務計畫核心

首先,讓我們建立用於管理 AI 互動的 TaskPlanner 類別:

class TaskPlanner:
    """A local task planning system using Ollama."""

    def __init__(self):
        """Initialize the task planner with Ollama."""
        self.manager = OllamaManager()
        self.client = None
        self.planner = None

    def start(self):
        """Start the Ollama server and initialize the client."""
        self.manager.start()
        self.client = ClientAI("ollama", host="http://localhost:11434")

        self.planner = create_agent(
            client=self.client,
            role="task planner",
            system_prompt="""You are a practical task planner. Break down goals into
            specific, actionable tasks with realistic time estimates and resource needs.
            Use the tools provided to validate timelines and format plans properly.""",
            model="llama3",
            step="think",
            tools=[validate_timeline, format_plan],
            tool_confidence=0.8,
            stream=True,
        )

這個課程是我們的基礎。它管理 Ollama 伺服器生命週期,建立和配置我們的 AI 用戶端,並設定具有特定功能的規劃代理程式。

創建我們的規劃工具

現在讓我們建構人工智慧將使用的工具。首先,時間軸驗證器:

@tool(name="validate_timeline")
def validate_timeline(tasks: Dict[str, int]) -> Dict[str, dict]:
    """
    Validate time estimates and create a realistic timeline.

    Args:
        tasks: Dictionary of task names and estimated hours

    Returns:
        Dictionary with start dates and deadlines
    """
    try:
        current_date = datetime.now()
        timeline = {}
        accumulated_hours = 0

        for task, hours in tasks.items():
            try:
                hours_int = int(float(str(hours)))

                if hours_int <= 0:
                    logger.warning(f"Skipping task {task}: Invalid hours value {hours}")
                    continue

                days_needed = hours_int / 6
                start_date = current_date + timedelta(hours=accumulated_hours)
                end_date = start_date + timedelta(days=days_needed)

                timeline[task] = {
                    "start": start_date.strftime("%Y-%m-%d"),
                    "end": end_date.strftime("%Y-%m-%d"),
                    "hours": hours_int,
                }

                accumulated_hours += hours_int

            except (ValueError, TypeError) as e:
                logger.warning(f"Skipping task {task}: Invalid hours value {hours} - {e}")
                continue

        return timeline
    except Exception as e:
        logger.error(f"Error validating timeline: {str(e)}")
        return {}

此驗證器將時間估計轉換為工作日,優雅地處理無效輸入,建立現實的順序調度並提供詳細的偵錯日誌記錄。

接下來,讓我們建立計劃格式化程式:

@tool(name="format_plan")
def format_plan(
    tasks: List[str],
    timeline: Dict[str, dict],
    resources: List[str]
) -> str:
    """
    Format the plan in a clear, structured way.

    Args:
        tasks: List of tasks
        timeline: Timeline from validate_timeline
        resources: List of required resources

    Returns:
        Formatted plan as a string
    """
    try:
        plan = "== Project Plan ==\n\n"

        plan += "Tasks and Timeline:\n"
        for i, task in enumerate(tasks, 1):
            if task in timeline:
                t = timeline[task]
                plan += f"\n{i}. {task}\n"
                plan += f"   Start: {t['start']}\n"
                plan += f"   End: {t['end']}\n"
                plan += f"   Estimated Hours: {t['hours']}\n"

        plan += "\nRequired Resources:\n"
        for resource in resources:
            plan += f"- {resource}\n"

        return plan
    except Exception as e:
        logger.error(f"Error formatting plan: {str(e)}")
        return "Error: Unable to format plan"

在這裡,我們希望透過正確的任務編號和有組織的時間軸來創建一致、可讀的輸出。

建構介面

讓我們為我們的計劃者創建一個用戶友好的介面:

def get_plan(self, goal: str) -> str:
    """
    Generate a plan for the given goal.

    Args:
        goal: The goal to plan for

    Returns:
        A formatted plan string
    """
    if not self.planner:
        raise RuntimeError("Planner not initialized. Call start() first.")

    return self.planner.run(goal)

def main():
    planner = TaskPlanner()

    try:
        print("Task Planner (Local AI)")
        print("Enter your goal, and I'll create a practical, timeline-based plan.")
        print("Type 'quit' to exit.")

        planner.start()

        while True:
            print("\n" + "=" * 50 + "\n")
            goal = input("Enter your goal: ")

            if goal.lower() == "quit":
                break

            try:
                plan = planner.get_plan(goal)
                print("\nYour Plan:\n")
                for chunk in plan:
                    print(chunk, end="", flush=True)
            except Exception as e:
                print(f"Error: {str(e)}")

    finally:
        planner.stop()

if __name__ == "__main__":
    main()

我們的介面提供:

  • 清晰的使用說明
  • 透過串流媒體即時產生計畫
  • 正確的錯誤處理
  • 乾淨的關閉管理

用法範例

以下是執行計劃程式時您將看到的內容:

Task Planner (Local AI)
Enter your goal, and I'll create a practical, timeline-based plan.
Type 'quit' to exit.

==================================================

Enter your goal: Create a personal portfolio website

Your Plan:

== Project Plan ==

Tasks and Timeline:
1. Requirements Analysis and Planning
   Start: 2024-12-08
   End: 2024-12-09
   Estimated Hours: 6

2. Design and Wireframing
   Start: 2024-12-09
   End: 2024-12-11
   Estimated Hours: 12

3. Content Creation
   Start: 2024-12-11
   End: 2024-12-12
   Estimated Hours: 8

4. Development
   Start: 2024-12-12
   End: 2024-12-15
   Estimated Hours: 20

Required Resources:
- Design software (e.g., Figma)
- Text editor or IDE
- Web hosting service
- Version control system

未來的改進

為您自己的任務規劃器考慮這些增強功能:

  • 新增任務之間的依賴關係追蹤
  • 包含資源成本計算
  • 將計畫儲存到文件或專案管理工具
  • 依原計畫追蹤進度
  • 新增資源可用性驗證
  • 實現平行任務調度
  • 新增對重複任務的支援
  • 包含任務的優先順序

要了解有關 ClientAI 的更多信息,請訪問文件。

與我聯繫

如果您對本教學有任何疑問或想分享您對任務規劃程式的改進,請隨時聯絡:

  • GitHub:igorbenav
  • X/Twitter:@igorbenav
  • 領英:伊戈爾

以上是使用 ClientAI 和 Ollama 建構本地 AI 任務規劃器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn