ホームページ >バックエンド開発 >Python チュートリアル >ClientAI と Ollama を使用してローカル AI タスク プランナーを構築する

ClientAI と Ollama を使用してローカル AI タスク プランナーを構築する

Barbara Streisand
Barbara Streisandオリジナル
2024-12-18 01:33:10270ブラウズ

Building a Local AI Task Planner with ClientAI and Ollama

このチュートリアルでは、ClientAI と Ollama を使用して AI を活用したタスク プランナーを構築します。当社のプランナーは、目標を実行可能なタスクに分割し、現実的なタイムラインを作成し、リソースを管理します。これらはすべてお客様のマシンで実行されます。

私たちのタスク プランナーは次のことが可能です:

  • 目標を具体的で実行可能なタスクに分割する
  • エラー処理を使用した現実的なタイムラインの作成
  • リソースの効果的な管理と割り当て
  • 構造化されフォーマットされた計画を提供する

ClientAI のドキュメントについてはここを参照し、Github リポジトリについてはここを参照してください。

環境のセットアップ

まず、プロジェクト用に新しいディレクトリを作成します。

mkdir local_task_planner
cd local_task_planner

Ollama サポートを使用して ClientAI をインストールします:

pip install clientai[ollama]

システムに Ollama がインストールされていることを確認してください。 Ollama の Web サイトから入手できます。

メインの 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__)

各コンポーネントは重要な役割を果たします:

  • datetime: タスクのタイムラインとスケジュールの管理に役立ちます
  • ClientAI: AI フレームワークを提供します
  • 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 クライアントを作成および構成し、特定の機能を備えた計画エージェントをセットアップします。

計画ツールの作成

次に、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
  • LinkedIn: イゴール

以上がClientAI と Ollama を使用してローカル AI タスク プランナーを構築するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。