MongoDB をFireworks AIと統合すると、オープンソース モデルで検索拡張生成 (RAG)(RAG )アプリケーションを構築できます。このチュートリアルでは、Vorage AIを使用してサンプルデータを埋め込み、再ランク付けし、WiredTiger チャット モデルを使用して基づいた推奨事項を生成します。
このチュートリアルでは、次のタスクを実行します。
環境を設定します。
MongoDB AI埋め込みモデルを使用して映画データを埋め込み、その埋め込みをMongoDBに保存します。
MongoDB ベクトル検索と Vloyage AIリランク モデルを使用して、映画ドキュメントを検索し、再ランク付けします。
Fireworks チャットモデルに対して、再ランク付けされた結果に基づいて映画の推奨事項を生成するように指示します。
バックグラウンド
Fireworks AI は、オープンソースAIモデルを訓練および実行中ためのプラットフォームを提供します。 MongoDB を使用して運用データとメモリ データを保存し、特定のユースケースに合わせてモデルを再構築できます。
RAGアプリケーションは関連データを取得し、それをコンテキストとしてチャットモデルに渡すため、モデルは訓練中に学習した内容のみに依存するのではなく、データから応答します。このチュートリアルでは、 MongoDB はデータを保存と取得します。投票AI は、データを埋め込む埋め込みモデルと、検索された結果を再ランク付けするリランクカー モデルを提供し、ファイアワークAI は最終応答を生成するチャットモデルを提供します。
前提条件
このチュートリアルを完了するには、次のリソースが必要です。
次のいずれかの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 クラスター。
クラスターにロードされたサンプルデータセット 。このチュートリアルでは、
sample_mflix.moviesコレクションを使用します。投票AI APIキー。作成するには、「 投票AIモデルAPIキーの管理 」を参照してください。
Python v3.11 以降。
環境を設定する
このセクションでは、仮想環境の作成、必要な依存関係のインストール、環境変数の設定、プロジェクトファイルの作成して環境を準備します。
環境変数を設定します。
お使いの fireworks-mongodb-project ディレクトリ内で、.env ファイルを作成し、次のコードを追加します。
FIREWORKS_API_KEY="<fireworks-api-key>"VOYAGE_API_KEY="<voyage-api-key>"MONGODB_URI="<connection-string>"<fireworks-api-key>を Fireworks APIキーに置き換え、 <voyage-api-key>を Vyage AI APIキーに置き換えます。
<connection-string> を Atlas クラスターまたはローカル Atlas 配置の接続文字列に置き換えます。
接続stringには、次の形式を使用する必要があります。
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net重要:接続文字列にデータベースユーザーの認証情報が含まれていることを確認します。接続文字列の検索方法の詳細については、クライアント ライブラリ経由でクラスターに接続する を参照してください。
接続stringには、次の形式を使用する必要があります。
mongodb://localhost:<port-number>/?directConnection=true詳細については、「接続文字列 」を参照してください。
プロジェクト ファイルを作成する。
fireworks-mongodb-projectディレクトリに、main.py という名前のファイルを作成します。このファイルに次のコードを追加して、環境変数をロードし、検索クエリーと結果の数を指定する 2 つのコマンドライン引数を定義します。
import argparseimport osimport time
import voyageaifrom dotenv import load_dotenvfrom openai import OpenAIfrom pymongo import MongoClientfrom pymongo.operations import SearchIndexModel
load_dotenv()
parser = argparse.ArgumentParser()parser.add_argument("--query", default="something interesting")parser.add_argument("--count", type=int, default=10)args = parser.parse_args()後の手順では、このファイルにコードを追加して、映画データから応答を埋め込み、検索、生成します。
映画データの埋め込みと保存
このセクションでは、クライアントを設定し、50映画ドキュメントの plotフィールドを埋め込み、各ベクトルを新しい embeddingフィールドに保存します。次に、そのフィールドにMongoDB ベクトル検索インデックスを作成します。
必要なクライアントを作成します。
次のコードを main.pyファイルに追加して、 Fireworksクライアント、 Vyage AIクライアント、 MongoDBクライアントを作成し、モデルを選択します。
fireworks = OpenAI( base_url="https://api.fireworks.ai/inference/v1", api_key=os.environ["FIREWORKS_API_KEY"],)voyage = voyageai.Client()
mongo_client = MongoClient(os.environ["MONGODB_URI"])collection = mongo_client["sample_mflix"]["movies"]
EMBEDDING_MODEL = "voyage-4"RERANK_MODEL = "rerank-3"CHAT_MODEL = "accounts/fireworks/models/gpt-oss-120b"DIMENSIONS = 1024この例では、次のモデルを選択しています。
voyage-4:映画プロットの埋め込みと検索クエリに使用される、Valage AI埋め込みモデル。rerank-3: MongoDB ベクトル検索 の候補を関連性を再スコア付けするために使用される、Valage AIリランク モデル。accounts/fireworks/models/gpt-oss-120b: MongoDBデータに基づいて映画の推奨事項を生成するために使用される、ファイアワーク チャット モデル。
注意
このチュートリアルでは、ストレージを削減するために、Voyage AI埋め込みモデルから 1024 次元ベクトルをリクエストします。 DIMENSIONS の値がモデルが返すベクトルのサイズと一致する限り、任意の Vyage AI埋め込みモデルを使用できます。
埋め込みを生成して保存します。
次のコードを main.pyファイルに追加して、各映画のプロットを embeddingフィールドに埋め込みます。
def get_embeddings(texts, input_type="document"): response = voyage.embed( texts, model=EMBEDDING_MODEL, input_type=input_type, output_dimension=DIMENSIONS ) return response.embeddings
docs = list( collection.find( {"plot": {"$exists": True, "$ne": ""}}, {"_id": 1, "title": 1, "plot": 1} ).limit(50))
vectors = get_embeddings([doc["plot"] for doc in docs])
for doc, vector in zip(docs, vectors): collection.update_one({"_id": doc["_id"]}, {"$set": {"embedding": vector}})
print(f"Embedded {len(docs)} movies.")MongoDB ベクトル検索インデックスを作成します。
次のコードを追加して、embeddingフィールドにMongoDB ベクトル検索インデックスを作成し、インデックスの作成が完了するまで待ちます。
index = SearchIndexModel( definition={ "fields": [ { "type": "vector", "path": "embedding", "numDimensions": DIMENSIONS, "similarity": "cosine", } ] }, name="movie_vector_index", type="vectorSearch",)collection.create_search_index(model=index)
print("Waiting for the index to build...")while not any( idx.get("queryable") for idx in collection.list_search_indexes("movie_vector_index")): time.sleep(5)
print("Index is ready.")ベクトル検索結果からの応答の生成
このセクションでは、ドキュメントの plotフィールドに対してMongoDB ベクトル検索クエリを実行し、結果を再ランク付けします。次に、ランク付けされた映画をコンテキストとして Fireworks チャットモデルに渡し、推奨事項を生成します。
MongoDB ベクトル検索クエリを実行します。
次のコードを main.pyファイルに追加して、plotフィールドクエリを埋め込み、クエリにプロットが似ている映画を検索します。
def vector_search(query, limit=5): query_vector = get_embeddings([query], input_type="query")[0] pipeline = [ { "$vectorSearch": { "index": "movie_vector_index", "path": "embedding", "queryVector": query_vector, "numCandidates": limit * 20, "limit": limit, } }, { "$project": { "_id": 0, "title": 1, "plot": 1, "score": {"$meta": "vectorSearchScore"}, } }, ] return list(collection.aggregate(pipeline))
print("\nVector search results:")for movie in vector_search(args.query, limit=args.count): print(f'{movie["score"]:.3f} {movie["title"]}')結果を再ランク付けします。
MongoDB ベクトル検索 の精度を向上させるには、結果をチャット モデルに渡す前に、より大きな候補セットを取得し、Voyage AIリランク モデルを使用してそれを再ランク付けします。次のコードを main.pyファイルに追加します。
def rerank(query, movies, top_n=5): candidate_texts = [f'{m["title"]}: {m["plot"]}' for m in movies] reranking = voyage.rerank(query, candidate_texts, model=RERANK_MODEL, top_k=top_n) return [movies[result.index] for result in reranking.results]
def retrieve(query, top_n=5): return rerank(query, vector_search(query, limit=top_n * 4), top_n=top_n)
print("\nReranked, precise results:")for movie in retrieve(args.query, top_n=args.count): print(movie["title"])応答を生成します。
次のコードを main.pyファイルに追加して、ランク付けされた映画をコンテキストとして Fireworks チャットモデルに渡し、そのコンテキストからのみ応答するようにモデルに指示します。
def answer(question): context = "\n\n".join(f'{m["title"]}: {m["plot"]}' for m in retrieve(question)) response = fireworks.chat.completions.create( model=CHAT_MODEL, messages=[ { "role": "system", "content": "Answer using only the movies in the context. " "If the context doesn't contain the answer, say so.", }, { "role": "user", "content": f"Context:\n{context}\n\nQuestion: {question}", }, ], ) return response.choices[0].message.content
print("\nRecommendation:")print(answer(f"Recommend a movie about {args.query}, and explain why."))ファイルの実行
main.pyファイルを実行するには、fireworks-mongodb-projectディレクトリから次のコマンドを実行します。検索クエリーとファイルが返す結果の数を指定するには、 --query と --count フラグを使用します。
uv run main.py --query "a heist that goes wrong" --count 5コマンドが正常に実行されると、出力は次のようになります。
Embedded 50 movies.Waiting for the index to build...Index is ready.
Vector search results:0.724 I Became a Criminal0.664 Hallelujah0.662 Zoo in Budapest0.658 Rear Window0.654 The Long Voyage Home
Reranked, precise results:I Became a CriminalHallelujahFoolish WivesZoo in BudapestA Corner in Wheat
Recommendation:**I Became a Criminal** -- This gritty film-noir follows cynicalex-RAF flyer Morgan, who joins a break-in gang led by Narcy. Theirfirst job quickly turns disastrous when the getaway car crashesafter the crew accidentally kills a policeman. The movie centers ona heist that goes badly wrong, showcasing the chaos, moral fallout,and gritty consequences of a botched robbery.次のステップ
Fireworks および Boyage AI の構成オプションとこのチュートリアルで使用されているメソッドの詳細については、 「 MongoDBと Fireworks AIの統合 」を参照してください。
MongoDBでの通信履歴を記憶するツール呼び出しエージェントを構築するには、「 エージェント ツールの指定 」と「 永続的なエージェント メモリ 」を参照してください。
Fireworks AIの詳細については、 Fireworks AIドキュメント を参照してください。
投票AIの詳細については、「 テキスト埋め込みとリランクサー 」を参照してください。