Phidataをマスターする:「記憶」と「タスク実行能力」を備えたAIアシスタントの構築

Artificial Intelligence tutorial - IT technology blog
Artificial Intelligence tutorial - IT technology blog

課題:AIが「三歩歩けば忘れる」状態のとき

先週、本番環境で発生した難解なトラブルの対応で徹夜しました。カスタマーサポート用のチャットボットが、わずか3往復のやり取りでユーザーの最初の要望を忘れてしまうのです。さらに悪いことに、テキストで回答する以外に何もアクションが起こせません。もしLangChainが大量のボイラープレートコードで複雑すぎると感じているなら、Phidataこそが求めていた軽量な「救世主」です。

Phidataは、LLM(OpenAI、Claude、Llamaなど)にMemory(記憶)とTools(アクション能力)をパッケージ化して一つの実体(エージェント)にします。手動でmessages配列を管理する代わりに、ビジネスロジックに集中できるようになります。

実践:2分で最初のAIアシスタントを動かす

理屈はさておき、実際のコードがいかに速く動くか見てみましょう。ライブラリをインストールし、OpenAIのAPIキーを用意するだけで始められます。

pip install -U phidata openai duckduckgo-search

assistant.pyというファイルを作成し、以下の内容を記述します。このボットはWeb検索を行い、リアルタイムのデータを即座に取得する能力を持っています:

from phi.assistant import Assistant
from phi.tools.duckduckgo import DuckDuckGo
import os

os.environ["OPENAI_API_KEY"] = "sk-xxxx..."

assistant = Assistant(
    tools=[DuckDuckGo()],
    show_tool_calls=True
)

# 日本語での問い合わせ
assistant.print_response("今日のビットコインの価格はいくらですか?", markdown=True)

ここがポイント: 検索ロジックをコーディングする必要はありません。ビットコインの価格について尋ねると、AIは情報が不足していることを自ら理解し、自動的にDuckDuckGoツールを起動します。これがFunction Callingの威力です。

なぜ他のフレームワークよりもPhidataを使うべきなのか?

多くのフレームワークは、抽象化レイヤーが多すぎて問題を複雑にしています。Phidataはより実用的なアプローチを採用しており、構造化コードの記述時間を約50%短縮できます:

  • 自動Function Calling: Python関数をtoolsに渡すだけで、PhidataがLLM用のJSONスキーマを自動的に生成・管理します。
  • 洗練されたセッション管理: ボットの記憶はRAMへの一時保存ではなく、データベースに直接保存されます。
  • 洗練された出力: 追加設定なしでストリーミング出力や美しいMarkdown形式をサポートします。

「長期記憶」(Memory)の実装方法

通常、スクリプトを終了するとAIはすべてを忘れてしまいます。リピーターを認識させるには、Storageを使用する必要があります。ローカル環境で素早く開始するにはSQLiteが最適です。

from phi.assistant import Assistant
from phi.storage.assistant.sqlite import SqlAssistantStorage

assistant = Assistant(
    storage=SqlAssistantStorage(
        table_name="ai_memory",
        db_file="agents.db",
    ),
    read_chat_history=True,
    add_chat_history_to_messages=True,
    session_id="user_unique_001" 
)

assistant.print_response("こんにちは、私はハノイでエンジニアをしているナムです。")
assistant.print_response("私がどこに住んでいるか覚えていますか?")

Phidataは履歴を保存するためにagents.dbファイルを作成します。アプリを再起動しても、正しいsession_idさえあれば、ボットはあなたが誰であるかを覚えています。これは、高度にパーソナライズされたアプリケーションを構築するための基盤となります。

Function CallingでAIを本物の「従業員」に変える

これは私が最も気に入っている機能です。単にチャットするだけでなく、AIは注文情報を照会したり、顧客にメールを送信したりできます。純粋なPython関数を書くだけで実装可能です。

import json

def check_shipping_status(order_id: str):
    """注文の配送状況を確認するためにこの関数を使用します。"""
    # データベースクエリのシミュレーション
    db = {"DH123": "配送中", "DH456": "配達済み"}
    return json.dumps("ステータス": db.get(order_id, "見つかりません")})

assistant = Assistant(tools=[check_shipping_status], show_tool_calls=True)
assistant.print_response("注文DH123は今どこにありますか?")

ヒント: docstring(関数の説明)は非常に重要です。AIはこれに基づいて、いつ関数を呼び出すべきかを判断します。ボットが間違ったツールを呼び出さないよう、説明は明確に記述しましょう。

高度な処理プロセス:RAGとMemoryের組み合わせ

私がこれまでに構築した実際のシステムでは、アシスタントは通常以下の5つのステップで動作します:

  1. 質問を受け取り、Memoryを確認してコンテキストを把握する。
  2. Knowledge Base(PDF、ドキュメントなど)を検索し、関連データを見つける。
  3. Tools(外部API)の使用が必要かどうかを確認する。
  4. LLMがすべてのソースからの情報を統合する。
  5. ユーザーに最終的な回答を返す。

本番導入における実戦経験

AIを本番環境に導入する際に何度も「失敗」を経験した結果、得られた3つの重要な注意点があります:

  • APIキーのセキュリティ: キーを絶対にハードコードしないでください。誤ってGitHubにコードをプッシュしてしまい、予期せぬ費用が発生するのを防ぐために.envファイルを使用しましょう。
  • 無限ループの防止: LLMは時折ロジックエラーを起こし、ツールを連続して呼び出し続けることがあります。max_calls=5を設定して、1回の会話あたりのツール呼び出し回数を制限してください。
  • デバッグの有効化: 開発中はdebug_mode=Trueを使用しましょう。送信されるペイロードの詳細を確認できるため、バグ修正が何倍も速くなります。

Phidataは、AIエージェントの構築を真に「扱いやすく」、より現実的なものにしてくれます。機能性とシンプルさのバランスが取れたフレームワークを探しているなら、今日からPhidataを始めてみてください。

Share: