AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

LangChain JavaScript/Typescript 統合を始めましょう

注意

このチュートリアルでは、Lgachein のJavaScriptライブラリ を使用します。Pythonライブラリを使用するチュートリアルについては、LangChain Pythonを参照してください。

MongoDB ベクトル検索 をLgChuin と統合して、LM アプリケーションを構築し、検索拡張生成 (RAG)(RAG)を実装できます。このチュートリアルでは、Lgachein とMongoDB ベクトル検索 の使用を開始し、データのセマンティック検索を実行し、RG実装を構築する方法を説明します。具体的には、次のアクションを実行します。

  1. 環境を設定します。

  2. カスタム データをMongoDBに保存します。

  3. データにMongoDB ベクトル検索インデックスを作成します。

  4. 次のベクトル検索クエリを実行します。

    • セマンティック検索。

    • メタデータの事前フィルタリングによるセマンティック検索。

    • 最大マージナル関連性(MMR)検索。

  5. MongoDB ベクトル検索を使用してデータの質問に答え、RAG を実装します。

LgChuin は、「チェーン」の使用を通じて LVM アプリケーションの作成を簡素化するオープンソースのフレームワークです。 チェーンは 、RAG を含むさまざまなAIユースケースで組み合わせることができる Lgachein 固有のコンポーネントです。

MongoDB ベクトル検索を LangChain と統合することで、MongoDB をベクトルデータベースとして利用し、MongoDB ベクトル検索を使用して、データから意味的に類似したドキュメントを検索し、RAG を実装することができます。RAG の詳細については、「MongoDB による検索拡張生成(RAG)」を参照してください。

Atlas の サンプル データ セット からの映画データを含むコレクションを使用します。

  • 次のいずれかの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 クラスター。

  • Voyage AI API キー。API キーを作成するには、Voyage AI モデル API キーの管理を参照してください。

    注意

    Atlas(Atlas UIで作成されたAPIキーの場合)またはVoyage AI(Voyage AIから直接作成されたAPIキーの場合)で支払い方法が設定されていない場合、APIリクエストが失敗する場合があります。

  • OpenAI APIキー。APIリクエストに使用できるクレジットを持つ OpenAI アカウントが必要です。OpenAI アカウントの登録の詳細については、OpenAI APIウェブサイト を参照してください。

  • Node.js プロジェクトを実行するためのターミナルとコード エディター。

  • npmとNode.jsがインストールされました。

このチュートリアルの環境を設定します。 環境を設定するには、次の手順を実行します。

1

ターミナルで次のコマンドを実行して、 langchain-mongodbという名前の新しいディレクトリを作成し、プロジェクトを初期化します。

mkdir langchain-mongodbcd langchain-mongodbnpm init -y
2

次のコマンドを実行します:

npm install langchain@latest @langchain/community@latest @langchain/core@latest @langchain/mongodb@latest @langchain/openai@latest @langchain/textsplitters@latest pdf-parse@1 --legacy-peer-deps
3

ES モジュール を使用するようにプロジェクトを構成するには、"type": "module" を package.jsonファイルに追加して保存します。

{ "type": "module", // other fields...}
4

プロジェクトで、 get-started.jsという名前のファイルを作成し、次のコードをコピーしてファイルに貼り付けます。 チュートリアル全体でこのファイルにコードを追加します。

この最初のコード スニペットは、このチュートリアルに必要なパッケージをインポートし、環境変数を定義して、 MongoDBクラスターへの接続を確立します。

import { MongoClient } from "mongodb";import { MongoDBAtlasVectorSearch } from "@langchain/mongodb";import { ChatOpenAI } from "@langchain/openai";import { VoyageEmbeddings } from "@langchain/community/embeddings/voyage";import { PDFLoader } from "@langchain/community/document_loaders/fs/pdf";import { PromptTemplate } from "@langchain/core/prompts";import { RecursiveCharacterTextSplitter } from "@langchain/textsplitters";import { RunnableSequence, RunnablePassthrough } from "@langchain/core/runnables";import { StringOutputParser } from "@langchain/core/output_parsers";import * as fs from 'fs'; process.env.VOYAGEAI_API_KEY = "<api-key>"process.env.OPENAI_API_KEY = "<api-key>";process.env.MONGODB_URI = "<connection-string>";const client = new MongoClient(process.env.MONGODB_URI);const formatDocumentsAsString = (docs) => docs.map(d => d.pageContent).join("\n\n");
5

環境の設定を完了するには、get-started.js の <api-key> と <connection-string> のプレースホルダー値をそれぞれ、Vyage AI APIキー、OpenAI APIキー、MongoDBクラスターの SRV 接続文字列 に置き換えます。接続文字列には、次の形式を使用する必要があります。

mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

このセクションでは、カスタム データをMongoDBにロードし、 MongoDBクラスターをベクトルデータベースとしてインスタンス化するための非同期関数を定義します。これはベクトルストアとも呼ばれます。次のコードを get-started.jsファイルに追加します。

注意

このチュートリアルでは、ベクトルストアのデータソースとして、MongoDB Atlasベストプラクティスというタイトルの一般にアクセス可能な PDFドキュメントを使用します。このドキュメントでは、 MongoDB配置を管理するためのさまざまな推奨事項と主要概念について説明します。

このコードは、次のアクションを実行します。

  • 次のパラメータを指定してMongoDBコレクションを構成します。

    • langchain_db.test ドキュメントを保存するMongoDBコレクションとして 。

    • vector_index ベクトル ストアをクエリするために使用するインデックスとして 。

    • text 未加工のテキスト コンテンツを含むフィールドの名前:

    • embedding ベクトル埋め込みを含むフィールドの名前として。

  • カスタム データを準備するには、次の手順を実行します。

    • 指定された URL から未加工データを検索し、 PDF として保存します。

    • テキストスプリット を使用して、データを小さなドキュメントに分裂。

    • 各ドキュメントの文字数と連続する 2 つのドキュメント間で重複する文字数を決定する チャンク パラメータを指定します。

  • MongoDBAtlasVectorSearch.fromDocumentsメソッドを呼び出して、サンプル ドキュメントからベクトル ストアを作成します。 このメソッドでは、次のパラメーターを指定します。

    • ベクトルデータベースに保存する サンプル ドキュメント 。

    • embeddingフィールドのベクトル埋め込みにテキストを変換するために使用されるモデルとして、AI の埋め込みモデルを使用します。

    • MongoDBクラスターの構成。

async function run() { try { // Configure your MongoDB collection const database = client.db("langchain_db"); const collection = database.collection("test"); const dbConfig = { collection: collection, indexName: "vector_index", // The name of the MongoDB Search index to use. textKey: "text", // Field name for the raw text content. Defaults to "text". embeddingKey: "embedding", // Field name for the vector embeddings. Defaults to "embedding". }; // Ensure that the collection is empty const count = await collection.countDocuments(); if (count > 0) { await collection.deleteMany({}); } // Save online PDF as a file const rawData = await fetch("https://webassets.mongodb.com/MongoDB_Best_Practices_Guide.pdf"); const pdfBuffer = await rawData.arrayBuffer(); const pdfData = Buffer.from(pdfBuffer); fs.writeFileSync("atlas_best_practices.pdf", pdfData); // Load and split the sample data const loader = new PDFLoader(`atlas_best_practices.pdf`); const data = await loader.load(); const textSplitter = new RecursiveCharacterTextSplitter({ chunkSize: 200, chunkOverlap: 20, }); const docs = await textSplitter.splitDocuments(data); // Instantiate MongoDB as a vector store const embeddingModel = new VoyageEmbeddings({ modelName: "voyage-4" }); embeddingModel.apiUrl = 'https://ai.mongodb.com/v1/embeddings'; const vectorStore = await MongoDBAtlasVectorSearch.fromDocuments(docs, embeddingModel, dbConfig); } finally { // Ensure that the client will close when you finish/error await client.close(); }}run().catch(console.dir);

ファイルを保存し、次のコマンドを実行してデータをMongoDBにロードします。

node get-started.js

ベクトルストアでベクトル検索クエリを有効にするには、langchain_db.testコレクションにMongoDB ベクトル検索インデックスを作成します。

1
  1. get-started.jsファイルで定義した非同期関数の try ステートメントの末尾に次のコードを追加します。このコードでは、次のフィールドにインデックスためのvectorSearch タイプのインデックスを作成します。

    • embedding ベクトル型としてのフィールド。embeddingフィールドには、Voyage AI の voyage-4 埋め込みモデルを使用して作成された埋め込みが含まれます。インデックス定義では、1024ベクトル次元を指定し、cosine を使用して類似性を測定します。

    • loc.pageNumber PDF 内のページ番号でデータを事前にフィルタリングするためのフィルター タイプとしてのフィールド。

    このコードではまた、 await 関数を使用して、検索インデックスが使用される前にデータに同期されていることを確認します。

    // Ensure index does not already exist, then create your MongoDB Vector Search indexconst indexes = await collection.listSearchIndexes("vector_index").toArray();if(indexes.length === 0){ // Define your MongoDB Vector Search Index const index = { name: "vector_index", type: "vectorSearch", definition: { "fields": [ { "type": "vector", "numDimensions": 1024, "path": "embedding", "similarity": "cosine" }, { "type": "filter", "path": "loc.pageNumber" } ] } } // Run the helper method const result = await collection.createSearchIndex(index); console.log(result);} // Wait for index to build and become queryableconsole.log("Waiting for initial sync...");await new Promise(resolve => setTimeout(() => { resolve();}, 3000));
  2. ファイルを保存します。

2
node get-started.js

このセクションでは、ベクトル化されたデータに対して実行できるさまざまなクエリを示します。 インデックスが作成できたら、非同期関数に次のコードを追加して、データに対してベクトル検索クエリを実行します。

注意

データをクエリするときに不正確な結果が発生した場合、インデックスの同期に予想以上に時間がかかることがあります。 最初の同期の時間を長くするには、 setTimeout関数の の数を増やします。

Tip

詳しくは、API参照を参照してください。

このセクションでは、 MongoDB ベクトル検索と Lgachein を使用した 2 つの異なる RG 実装を示します。MongoDB ベクトル検索を使用してセマンティックに類似したドキュメントを検索したので、次のコード例を使用して、 MongoDB ベクトル検索によって返されたドキュメントに対して LM に質問に回答するように要求します。

1

このコードでは、次の処理が行われます。

  • MongoDB ベクトル検索 を、セマンティクスで類似したドキュメントを検索するための検索バーとしてインスタンス化します。
// Implement RAG to answer questions on your data const retriever = vectorStore.asRetriever();const prompt = PromptTemplate.fromTemplate(`Answer the question based on the following context: {context} Question: {question}`);const model = new ChatOpenAI({ modelName: "gpt-5-mini" }) // Pick your preferred model. Ensure to enable it in your OpenAI settings dashboard.const chain = RunnableSequence.from([ { context: retriever.pipe(formatDocumentsAsString), question: new RunnablePassthrough(), }, prompt, model, new StringOutputParser(),]); // Prompt the LLMconst question = "How can I secure my MongoDB Atlas cluster?"; const answer = await chain.invoke(question);console.log("Question: " + question);console.log("Answer: " + answer); // Return source documentsconst retrievedResults = await retriever.invoke(question)const documents = retrievedResults.map((documents => ({ pageContent: documents.pageContent, pageNumber: documents.metadata.loc.pageNumber,})))console.log("\nSource documents:\n" + JSON.stringify(documents, null, 2))
2

ファイルを保存した後、次のコマンドを実行します。 生成される応答は異なる場合があります。

node get-started.js
Question: How can I secure my MongoDB Atlas cluster?Answer: You can secure your MongoDB Atlas cluster by achieving workload isolation with dedicated analytics nodes, configuring visualization tools like Atlas Charts to read from analytics nodes only, and using built-in slow query profiling if deploying with Atlas. Additionally, you can distribute replica set members across multiple data centers for added security during election and failover. Source documents:[ { "pageContent": "read isolation. \nWith MongoDB Atlas, you can achieve workload isolation with dedicated analytics nodes. Visualization \ntools like Atlas Charts can be configured to read from analytics nodes only.", "pageNumber": 21 }, { "pageContent": "If you are running MongoDB on your own infrastructure, you can configure replica set tags to achieve \nread isolation.", "pageNumber": 21 }, { "pageContent": "well-tuned queries.\nBuilt-in slow query profiling is also available if you’re deploying MongoDB with Atlas.", "pageNumber": 16 }, { "pageContent": "achieved during election and failover. \nIf possible, distribute replica set members across multiple data centers. If you’re using MongoDB Atlas,", "pageNumber": 24 }]

MongoDB ベクトル検索 をLgGraph と統合する方法については、 MongoDB をLgGraph.js と統合する を参照してください。

MongoDBは、次の開発者リソースも提供しています。