課題: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つのステップで動作します:
- 質問を受け取り、Memoryを確認してコンテキストを把握する。
- Knowledge Base(PDF、ドキュメントなど)を検索し、関連データを見つける。
- Tools(外部API)の使用が必要かどうかを確認する。
- LLMがすべてのソースからの情報を統合する。
- ユーザーに最終的な回答を返す。
本番導入における実戦経験
AIを本番環境に導入する際に何度も「失敗」を経験した結果、得られた3つの重要な注意点があります:
- APIキーのセキュリティ: キーを絶対にハードコードしないでください。誤ってGitHubにコードをプッシュしてしまい、予期せぬ費用が発生するのを防ぐために
.envファイルを使用しましょう。 - 無限ループの防止: LLMは時折ロジックエラーを起こし、ツールを連続して呼び出し続けることがあります。
max_calls=5を設定して、1回の会話あたりのツール呼び出し回数を制限してください。 - デバッグの有効化: 開発中は
debug_mode=Trueを使用しましょう。送信されるペイロードの詳細を確認できるため、バグ修正が何倍も速くなります。
Phidataは、AIエージェントの構築を真に「扱いやすく」、より現実的なものにしてくれます。機能性とシンプルさのバランスが取れたフレームワークを探しているなら、今日からPhidataを始めてみてください。

