MongoDB を Agno と統合することで、AI エージェントの検索可能な知識ベースと永続的な会話履歴を構成できます。このチュートリアルでは、Agno エージェントを設定して MongoDB を使用して知識の取得とセッションのストレージを行い、その設定を使用して料理アシスタントをビルドする方法を説明します。具体的には、次のタスクを実行します。
環境を設定します。
MongoDBをAgnoの知識ベースとして構成します。
ドキュメントから質問に答え、会話の前のやり取りを記憶するアシスタントをビルドする。
ファイルを実行し、出力を検討してください。
バックグラウンド
Agnore は、マルチモーダルAIエージェントを構築するためのオープンソースのPythonフレームワークです。 Agnoエージェントは、オプションの 知識ベース やオプションのデータベースなどのモジュール型のコンポーネントで構成されており、これらは個別に構成され、同じAgent オブジェクトに渡されます。
MongoDBはこれらのコンポーネントのうち2つを提供しており、以下のクラスをインポートすることで使用できます。
MongoVectorDbクラス: MongoDB ベクトル検索を使用してAgnoのベクトルデータベースインターフェースを実装し、エージェントがMongoDBコレクションから関連するドキュメントを検索できるようにしますMongoDbクラス: Agnoのデータベースインターフェースを実装し、エージェントのセッション、メモリ、メトリクスをMongoDBコレクションのドキュメントとして永続化します
Tip
Agnoは両方のMongoDBクラスをMongoDbと命名しているため、競合を避けるためにベクトルデータベースクラスをMongoVectorDbとしてエクスポートします。詳細については、「Agno フレームワークとMongoDBの統合」を参照してください。
このチュートリアルでは、両方のコンポーネントを使用し、そのデータを同じ MongoDB 配置に保存します。
前提条件
このチュートリアルを完了するには、次のリソースが必要です。
次のいずれかのMongoDBクラスター タイプ
MongoDB バージョン 6.0.11 を実行している Atlas クラスター、7.0.2以降。IP アドレスが Atlas プロジェクトのアクセスリストに含まれていることを確認します。
Python と Docker を使用して作成されたローカル Atlas 配置。
atlas-local-lib-py(pip install atlas-local-lib-py) をインストールして、ローカル配置をプログラムで作成および管理します。詳細については、atlas-local-lib-py リポジトリを参照してください。検索とベクトル検索がインストールされた MongoDB Community クラスター。
OpenAI APIキー。APIリクエストに使用できるクレジットを持つ OpenAI アカウントが必要です。OpenAI アカウントの登録の詳細については、OpenAI APIウェブサイト を参照してください。
Python v3.9 以降。
環境を設定する
環境変数を設定します。
お使いの agno-mongodb-project ディレクトリ内で、.env ファイルを作成し、次のコードを追加します。
OPENAI_API_KEY="<openai-api-key>" MONGODB_URI="<connection-string>"
<connection-string> を Atlas クラスターまたはローカル Atlas 配置の接続文字列に置き換えます。
接続stringには、次の形式を使用する必要があります。
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
重要:接続文字列にデータベースユーザーの認証情報が含まれていることを確認します。接続文字列の検索方法の詳細については、クライアント ライブラリ経由でクラスターに接続する を参照してください。
接続stringには、次の形式を使用する必要があります。
mongodb://localhost:<port-number>/?directConnection=true
詳細については、「接続文字列 」を参照してください。
プロジェクト ファイルを作成する。
あなたの agno-mongodb-project ディレクトリ内で、main.py という名前のファイルを作成してください。環境変数を読み込むには、次のコードをこのファイルに追加します。
import os from dotenv import load_dotenv from agno.agent import Agent from agno.db.mongo import MongoDb from agno.knowledge.knowledge import Knowledge from agno.models.openai import OpenAIChat from agno.vectordb.mongodb import MongoVectorDb load_dotenv()
今後のステップで、このファイルにコードを追加して、知識ベースとアシスタントをビルドするします。
知識ベースをビルドする
このセクションでは、Agno知識ベースのベクトルストアとしてMongoDBを構成し、そこにデータを保存して、セマンティック検索クエリを実行します。
MongoDBをベクトルストアとして構成します。
知識ベースのMongoDBベースのベクトル保存 (する)を構成するには、次のコードを追加します。
vector_db = MongoVectorDb( collection_name="agent_knowledge", db_url=os.environ["MONGODB_URI"], database="agno", ) knowledge = Knowledge(vector_db=vector_db)
上記のコードは、MongoVectorDb インスタンスを作成し、それを Knowledge オブジェクトの vector_db パラメータに渡します。agent_knowledge コレクションを使用するのは今回が初めてであるため、Agno は vector_index_1 という名前の MongoDB ベクトル検索インデックスとともにコレクションを作成します。
インデックスのビルドするには約 1 分かかります。構築中、インデックスは最初の同期状態になります。構築が完了したら、コレクション内のデータのクエリを開始できます。
データを読み込み、保存する。
知識ベースにタイ料理のレシピを含む PDF ファイルを読み込むため、main.py ファイルに次のコードを追加してください。
knowledge.insert( name="Recipes", url="https://agno-public.s3.amazonaws.com/recipes/ThaiRecipes.pdf", )
Agnoはファイルをダウンロードし、チャンクに分裂し、デフォルトのOpenAIエンベダーを使用して各チャンクの埋め込みを生成し、その結果をコレクションに書き込み (write)ます。
Tip
保存されたドキュメントを検査するには、Atlas UIでagno.agent_knowledgeコレクションを参照してください。各ドキュメントには、レシピテキストのチャンクを含むcontentフィールドと、生成されたベクトルを含むembeddingフィールドがあります。詳細については、「コレクションの表示」を参照してください。
セマンティック検索クエリを実行する。
main.py ファイルに次のコードを追加して、知識ベースのベクトルデータベースに直接クエリを実行してから、エージェントに接続します。この例では、グリーンカレーに関する質問に最も関連性の高い3つのチャンクを検索します。
results = vector_db.search(query="How do I make a green curry?", limit=3) for doc in results: print(f"[{doc.name}] {doc.content[:80]}")
結果には、クエリと最も意味的に関連性の高いレシピのチャンクが含まれ、類似度スコア順にランク付けされます。
永続セッションを使用してアシスタントをビルドする
このセクションでは、知識ベースとMongoDBデータベースを組み合わせて、完全なアシスタントをビルドします。エージェントは、知識ベースから関連するドキュメントを検索して質問に答え、会話履歴をMongoDBに保存して、以前のやり取りを参照できるようにします。
アシスタントを定義します。
次のコードをmain.pyファイルに追加して、セッションストレージ用のMongoDbインスタンスを構成し、このセッションストアと前のセクションで構成した知識ベースを使用するエージェントを作成します。
db = MongoDb( db_url=os.environ["MONGODB_URI"], db_name="agno", ) agent = Agent( model=OpenAIChat(id="gpt-4o"), knowledge=knowledge, db=db, search_knowledge=True, add_history_to_context=True, num_history_runs=5, instructions=[ "You are a helpful cooking assistant.", "Answer questions using only the recipes in your knowledge base.", "If the knowledge base does not contain a relevant answer, say so clearly.", ], )
2回の会話ターンでアシスタントを実行します。
次のコードをmain.pyファイルに追加して、エージェントに2つのメッセージを送信します。
SESSION_ID = "cooking-session-001" # First turn agent.print_response( "My favorite Thai dish is massaman curry.", session_id=SESSION_ID, ) # Second turn agent.print_response( "How do I make my favorite dish?", session_id=SESSION_ID, )
エージェントは、各ターンで知識ベースから最も関連性の高いレシピのチャンクを検索します。両方の呼び出しで同じ session_id 値が使用されるため、Agnoは以前の応答からもデータを検索します。Agnoは、agno_sessions コレクションからセッションメタデータを、agno_runs コレクションからメッセージコンテンツを検索します。session_id を省略するか、2回目の呼び出しで別の値を渡すと、Agnoは新しいセッションを開始し、エージェントは最初のターンのレコードを保持しません。
ファイルの実行
main.py ファイルを実行するには、agno-mongodb-project ディレクトリから次のコマンドを実行します。
python main.py
コマンドが正常に実行されると、出力は次のようになります。
INFO Connected to MongoDB successfully. INFO Creating collection 'agent_knowledge'. INFO Creating search index 'vector_index_1'. INFO Search index 'vector_index_1' is ready. INFO Search index 'vector_index_1' created successfully. INFO Adding content from URL https://agno-public.s3.amazonaws.com/recipes/ThaiRecipes.pdf INFO Upserting 14 documents # Output from the vector_db.search() call [Recipes] INGREDIENTS (One serving) 150 grams chicken, cut into bite-size pieces 50 grams [Recipes] Thai SELECT Exotic, Healthy, Delicious Dining-Thai Style Thai food has rapidly g [Recipes] Directions: 1. Roughly pound the garlic with bird's eye chilies in a mortar. Add # Output from the agent.print_response() calls ┏━ Message ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ My favorite Thai dish is massaman curry. ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ Response (gpt-4o) ────────────────────────────────────────────┓ ┃ Great choice — I found a recipe in the knowledge base for ┃ ┃ Massaman Gai (Massaman Curry with Chicken and Potatoes). ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ Message ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ How do I make my favorite dish? ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━ Response (gpt-4o) ────────────────────────────────────────────┓ ┃ Here's how to make Massaman Gai (Massaman Curry with Chicken ┃ ┃ and Potatoes) from the knowledge base: ┃ ┃ **Ingredients** ┃ ┃ - 300 grams chicken rump ┃ ┃ - 80 grams Massaman curry paste ┃ ┃ - 100 grams coconut cream ┃ ┃ - 300 grams coconut milk ┃ ┃ - 250 grams chicken stock ┃ ┃ - 50 grams roasted peanuts ┃ ┃ - 200 grams potatoes, chopped into large chunks ┃ ┃ - 100 grams onion, chopped into large chunks ┃ ┃ ... ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
次のステップ
MongoVectorDbクラスとMongoDbクラスの詳細(完全なパラメータとメソッドのリファレンスを含む)について学ぶには、「AgnoフレームワークとMongoDBの統合」を参照してください。
Agnoがコレクションに作成するMongoDB ベクトル検索インデックスの詳細については、MongoDB ベクトル検索インデックスの作成を参照してください。