ChatGPT + PDDL = 自律汎用AI

# 概要

AutoGPTなどが注目されてきていますが、もっと簡単にかつ従来のフレームワークを用いて、自律的にタスクの実行することができます。従来の記号化されたプランを実行するフレームワーク***PDDLとChatGPTを組み合わせる事例***です。
 ***PDDL（Planning Domain Definition Language）*** は、AIプランニングのタスクを記述するための標準的な形式です。PDDLを使って、問題領域（ドメイン）と特定の問題（インスタンス）を定義することができます。Fast Downwardは、PDDL形式のプランニング問題を解くためのオープンソースのプランニングシステムで、様々なヒューリスティックと探索アルゴリズムを組み合わせて高速で効率的なプランニングを提供します。

## 概要

CharGPTを使ってPDDL形式のプランニング問題を生成します。これには、適切なドメイン定義、問題定義、および目標を含める必要があります。
生成されたPDDLファイルをFast Downwardプランナーに入力として提供します。
Fast Downwardは、最適な解決策（アクションのシーケンス）を見つけるために、ヒューリスティックと探索アルゴリズムを使用してプランニング問題を解決します。

## 利点

自動化: ChatGPTを使ってプランニング問題を生成することで、手動でPDDLファイルを作成する時間と労力を節約できます。
統合: ChatGPTとFast Downwardを組み合わせることで、プランニング問題の生成と解決をシームレスに連携させることができます。
効率: Fast Downwardは高速で効率的なプランニングシステムであり、様々なヒューリスティックと探索アルゴリズムを使用して最適な解決策を見つけることができます。
柔軟性: ChatGPTは、さまざまなプランニング問題を生成する能力を持っており、Fast Downwardは多くのPDDL形式の問題を解決することができます。この組み合わせは、幅広い問題領域とアプリケーションに対応する柔軟性を提供します。

# 「料理を作ってみる」

ChatGPTを使ってPDDLを生成し、Fast Downwardで実行する手順を説明します。

- 手順1: ChatGPTを使ってPDDL形式のプランニング問題を生成する

まず、ChatGPTを使って、適切なドメイン定義、問題定義、および目標を含むPDDLファイルを生成します。

- 手順2: 生成されたPDDLファイルを保存する

ChatGPTによって生成されたPDDLファイルを、ローカルマシンまたは適切なサーバーに保存します。ファイルは、ドメインファイル（例: domain.pddl）と問題ファイル（例: problem.pddl）の2つに分割されることが一般的です。

- 手順3: Fast Downwardをインストールする

Fast Downwardプランナーを、ローカルマシンまたは適切なサーバーにインストールします。公式ウェブサイト（http://www.fast-downward.org/）からソースコードをダウンロードし、ドキュメントに従ってインストールを行ってください。

- 手順4: Fast DownwardでPDDLファイルを実行する

ターミナル（またはコマンドプロンプト）を開き、Fast Downwardがインストールされたディレクトリに移動します。
次のコマンドを実行して、生成されたドメインファイルと問題ファイルをFast Downwardで実行します（<domain_file>と<problem_file>を適切なファイル名に置き換えてください）:


    ./fast-downward.py <domain_file> <problem_file> --search "astar(lmcut())"


- 手順5: 解決策を確認する

Fast Downwardがプランニング問題を解決した後、解決策（アクションのシーケンス）が表示されます。この解決策を確認し、適切なアプリケーションや状況に応じて使用してください。


## プロンプトを作る

以下のプロンプトを用意しました。


    「料理を作る」に関してシナリオグラフを作成しPDDLでドメインを定義し、各タスク(達成状態、実行内容、前程状態、予想コスト)を示せ


## PDDLを得る

この結果以下の様なChatGPTの解答が得られます

以下に、料理を作るというドメインに対してのPDDLドメイン定義の例を示します。この例では、基本的なタスクとして「材料を用意する」、「調理器具を用意する」、「調理をする」という3つのタスクがあります。


    (define (domain cooking)
      (:requirements :strips :typing)
      (:types ingredient tool dish - object
              step - action
              knife pan oven - tool)
      (:predicates 
        (ingredient-available ?ing - ingredient)
        (tool-available ?tool - tool)
        (dish-prepared ?dish - dish)
        (dish-cooked ?dish - dish)
        (dish-cut ?dish - dish)
        (tool-clean ?tool - tool)
        (tool-dirty ?tool - tool)
      )
      (:action prepare-ingredient
        :parameters (?ing - ingredient)
        :precondition (and (ingredient-available ?ing))
        :effect (and (not (ingredient-available ?ing))))
      (:action prepare-dish
        :parameters (?dish - dish)
        :precondition (and (dish-prepared ?dish)
                           (forall (?ing - ingredient)
                             (when (ingredient-used ?ing ?dish)
                               (not (ingredient-available ?ing))))))
        :effect (and (not (dish-prepared ?dish))
                     (dish-cut ?dish)))
      (:action cook-dish
        :parameters (?dish - dish ?tool - tool)
        :precondition (and (dish-cut ?dish)
                           (tool-available ?tool)
                           (tool-clean ?tool))
        :effect (and (not (dish-cut ?dish))
                     (not (tool-clean ?tool))
                     (dish-cooked ?dish)
                     (tool-dirty ?tool))))

このドメイン定義では、材料や調理器具、および料理という3つのオブジェクトタイプを定義し、各オブジェクトに対して状態を表す述語を定義しています。具体的には、「ingredient-available」や「tool-available」は、ある材料や調理器具が利用可能かどうかを表す述語です。また、「dish-prepared」や「dish-cooked」は、ある料理が準備されたか、調理されたかどうかを表す述語です。

各タスクの達成状態、実行内容、前程状態、予想コストは以下のようになります。

    「材料を用意する」

    達成状態：材料が用意された状態
    実行内容：ある材料が利用可能であることを確認し、その材料の「ingredient-available」述語を削除することで材料を用意する
    前程状態：材料が利用可能でない状態
    予想コスト：材料の種類や量によって異なるが、一般的には比較的低いコストで

    「調理器具を用意する」

    達成状態：調理器具が用意された状態
    実行内容：ある調理器具が利用可能であることを確認し、その調理器具の「tool-available」述語を削除することで調理器具を用意する
    前程状態：調理器具が利用可能でない状態
    予想コスト：調理器具の種類や数によって異なるが、一般的には材料の用意と同程度か、それ以下のコストである

    「調理をする」

    達成状態：ある料理が調理された状態
    実行内容：調理するために必要な材料と調理器具を準備し、料理を調理する。具体的には、以下の手順を踏むことになる。
        材料を用意する
        料理に必要な調理器具を用意する
        調理器具を使用する前に洗浄する
        料理を調理する
    前程状態：材料と調理器具が用意されていない状態
    予想コスト：料理の種類や調理器具の種類によって異なるが、一般的には比較的高いコストである。特に、調理に時間がかかる料理や、特殊な調理器具が必要な料理では、コストが高くなることがある。


上記のように、各タスクにはそれぞれの達成状態、実行内容、前程状態、予想コストがあります。これらの情報をもとに、実際に料理を作るシナリオを作成することができます。
PDDLに必要な変数を入力することで、PDDLのタスクシーケンス生成を推論を実行することができます。