Docs Menu
Docs Home
/
MongoDB Atlas
/ /

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

項目一覧

  • バックグラウンド
  • 前提条件
  • 環境を設定する
  • Atlas をベクトル ストアとして使用
  • Atlas Vector Search インデックスの作成
  • ベクトル検索クエリの実行
  • データに関する質問に答えます
  • 次のステップ

注意

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

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

  1. 環境を設定します。

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

  3. データに Atlas Vector Search インデックスを作成します。

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

    • セマンティック検索。

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

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

  5. Atlas Vector Search を使用してデータの質問に答え、 RAGを実装します。

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

RAGと統合することで、Atlas Vector Search Atlasをベクトルデータベースとして使用し、 を使用してセマンティックで類似したドキュメントを検索して RG を実装することができます。Atlas Vector SearchRAGRGRAG Atlas Vector Searchの詳細については、「 による検索拡張生成( ) 」を してください。

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

  • MongoDB バージョン 6.0.11 を実行している Atlas クラスター、 7.0.2、またはそれ以降( RCを含む)。

  • OpenAI API キー。 API リクエストに使用できるクレジットを持つ有料の OpenAI アカウントが必要です。

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

  • npm と Node.js インストール済み。

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

1

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

mkdir langchain-mongodb
cd langchain-mongodb
npm init -y
2

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

npm install langchain @langchain/community @langchain/mongodb @langchain/openai pdf-parse fs
3

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

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

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

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

import { formatDocumentsAsString } from "langchain/util/document";
import { MongoClient } from "mongodb";
import { MongoDBAtlasVectorSearch } from "@langchain/mongodb";
import { OpenAIEmbeddings, ChatOpenAI } from "@langchain/openai";
import { PDFLoader } from "@langchain/community/document_loaders/fs/pdf";
import { PromptTemplate } from "@langchain/core/prompts";
import { RecursiveCharacterTextSplitter } from "langchain/text_splitter";
import { RunnableSequence, RunnablePassthrough } from "@langchain/core/runnables";
import { StringOutputParser } from "@langchain/core/output_parsers";
import * as fs from 'fs';
process.env.OPENAI_API_KEY = "<api-key>";
process.env.ATLAS_CONNECTION_STRING = "<connection-string>";
const client = new MongoClient(process.env.ATLAS_CONNECTION_STRING);
5

環境のセットアップを完了するには、<api-key> <connection-string>の と のプレースホルダー値を、get-started.js クラスターの OpenAIAPI キーと SRV 接続文字列 Atlasに置き換えます。接続文字列には、次の形式を使用する必要があります。

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

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

注意

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

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

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

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

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

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

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

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

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

    • テキストスプリット を使用する データを小さなドキュメントに分割します。

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

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

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

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

    • Atlas の構成。

async function run() {
try {
// Configure your Atlas collection
const database = client.db("langchain_db");
const collection = database.collection("test");
const dbConfig = {
collection: collection,
indexName: "vector_index", // The name of the Atlas 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://query.prod.cms.rt.microsoft.com/cms/api/am/binary/RE4HkJP");
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 Atlas as a vector store
const vectorStore = await MongoDBAtlasVectorSearch.fromDocuments(docs, new OpenAIEmbeddings(), dbConfig);
} finally {
// Ensure that the client will close when you finish/error
await client.close();
}
}
run().catch(console.dir);

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

node get-started.js

Tip

get-started.jsを実行した後、クラスター内のlangchain_db.testコレクションに移動すると、Atlas UI でベクトル埋め込みを表示できます。

注意

Atlas Vector Search インデックスを作成するには、Atlas プロジェクトに対するProject Data Access Admin以上のアクセス権が必要です。

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

get-started.jsファイルで定義した非同期関数に次のコードを追加します。 このコードでは、次のフィールドのインデックス作成を指定するvectorSearchタイプのインデックスが作成されます。

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

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

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

1// Ensure index does not already exist, then create your Atlas Vector Search index
2const indexes = await collection.listSearchIndexes("vector_index").toArray();
3if(indexes.length === 0){
4
5 // Define your Atlas Vector Search Index
6 const index = {
7 name: "vector_index",
8 type: "vectorSearch",
9 definition: {
10 "fields": [
11 {
12 "type": "vector",
13 "numDimensions": 1536,
14 "path": "embedding",
15 "similarity": "cosine"
16 },
17 {
18 "type": "filter",
19 "path": "loc.pageNumber"
20 }
21 ]
22 }
23 }
24
25 // Run the helper method
26 const result = await collection.createSearchIndex(index);
27 console.log(result);
28
29 // Wait for Atlas to sync index
30 console.log("Waiting for initial sync...");
31 await new Promise(resolve => setTimeout(() => {
32 resolve();
33 }, 10000));
34}

ファイルを保存し、次のコマンドを実行して Atlas Vector Search インデックスを作成します。

node get-started.js

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

注意

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

1

次のコードでは、 similaritySearchメソッドを使用して、string MongoDB Atlas securityの基本的なセマンティック検索を実行します。 pageContentpageNumberフィールドと フィールドのみを持つドキュメントの関連性順のリストが返されます。

// Basic semantic search
const basicOutput = await vectorStore.similaritySearch("MongoDB Atlas security");
const basicResults = basicOutput.map((results => ({
pageContent: results.pageContent,
pageNumber: results.metadata.loc.pageNumber,
})))
console.log("Semantic Search Results:")
console.log(basicResults)
2
node get-started.js
...
Semantic Search Results:
[
{
pageContent: 'MongoDB Atlas features extensive capabilities to defend,\n' +
'detect, and control access to MongoDB, offering among\n' +
'the most complete security controls of any modern\n' +
'database:',
pageNumber: 18
},
{
pageContent: 'Atlas provides encryption of data at rest with encrypted\n' +
'storage volumes.\n' +
'Optionally, Atlas users can configure an additional layer of\n' +
'encryption on their data at rest using the MongoDB',
pageNumber: 19
},
{
pageContent: 'automatically enabled.\n' +
'Review thesecurity section of the MongoDB Atlas\n' +
'documentationto learn more about each of the security\n' +
'features discussed below.\n' +
'IP Whitelisting',
pageNumber: 18
},
{
pageContent: '16Security\n' +
'17Business Intelligence with MongoDB Atlas\n' +
'18Considerations for Proofs of Concept\n' +
'18MongoDB Stitch: Serverless Platform from MongoDB\n' +
'19We Can Help\n' +
'19Resources',
pageNumber: 2
}
]

MQLブール値、数値、または の値とインデックス付きフィールドを比較するstring マッチ式を使用して、データを事前にフィルタリングできます。フィルタリングするメタデータ フィールドはすべてfilterタイプとしてインデックス化する必要があります。 詳細については、「ベクトル検索のフィールドにインデックスを作成する方法 」を参照してください。

注意

このチュートリアルのインデックスを作成したときに、 loc.pageNumberフィールドをフィルターとして指定しました。

1

次のコードでは、 similaritySearchメソッドを使用して string MongoDB Atlas securityのセマンティック検索を実行します。 次のパラメータを指定します。

  • 3として返すドキュメントの数。

  • $eq演算子を使用して17ページにのみ表示されるドキュメントを照合するloc.pageNumberフィールドの事前フィルタリング。

pageContentpageNumberフィールドと フィールドのみを持つドキュメントの関連性順のリストが返されます。

// Semantic search with metadata filter
const filteredOutput = await vectorStore.similaritySearch("MongoDB Atlas security", 3, {
preFilter: {
"loc.pageNumber": {"$eq": 17 },
}
});
const filteredResults = filteredOutput.map((results => ({
pageContent: results.pageContent,
pageNumber: results.metadata.loc.pageNumber,
})))
console.log("Semantic Search with Filtering Results:")
console.log(filteredResults)
2
node get-started.js
...
Semantic Search with Filter Results:
[
{
pageContent: 'BSON database dumps produced bymongodump.\n' +
'In the vast majority of cases, MongoDB Atlas backups\n' +
'delivers the simplest, safest, and most efficient backup',
pageNumber: 17
},
{
pageContent: 'Monitoring Solutions\n' +
'The MongoDB Atlas API provides integration with external\n' +
'management frameworks through programmatic access to\n' +
'automation features and alerts.\n' +
'APM Integration',
pageNumber: 17
},
{
pageContent: 'MongoDB Atlas backups are maintained continuously, just\n' +
'a few seconds behind the operational system. If the\n' +
'MongoDB cluster experiences a failure, the most recent',
pageNumber: 17
}
]

ダイバーティッドに最適化されたセマンティック関連性の測定値であるMMR(Max MongoDB Atlas)に基づいて、セマンティック検索を実行することもできます。

1

次のコードでは、 maxMarginalRelevanceSearchメソッドを使用して string MongoDB Atlas securityを検索します。 また、次の任意パラメータを定義するオブジェクトも指定します。

  • k 返されたドキュメントの数を3に制限します。

  • fetchK ドキュメントをMDRアルゴリズムに渡す前に、 10ドキュメントのみを取得します。

pageContentpageNumberフィールドと フィールドのみを持つドキュメントの関連性順のリストが返されます。

// Max Marginal Relevance search
const mmrOutput = await vectorStore.maxMarginalRelevanceSearch("MongoDB Atlas security", {
k: 3,
fetchK: 10,
});
const mmrResults = mmrOutput.map((results => ({
pageContent: results.pageContent,
pageNumber: results.metadata.loc.pageNumber,
})))
console.log("Max Marginal Relevance Search Results:")
console.log(mmrResults)
2
node get-started.js
...
Max Marginal Relevance Search Results:
[
{
pageContent: 'MongoDB Atlas features extensive capabilities to defend,\n' +
'detect, and control access to MongoDB, offering among\n' +
'the most complete security controls of any modern\n' +
'database:',
pageNumber: 18
},
{
pageContent: 'automatically enabled.\n' +
'Review thesecurity section of the MongoDB Atlas\n' +
'documentationto learn more about each of the security\n' +
'features discussed below.\n' +
'IP Whitelisting',
pageNumber: 18
},
{
pageContent: '16Security\n' +
'17Business Intelligence with MongoDB Atlas\n' +
'18Considerations for Proofs of Concept\n' +
'18MongoDB Stitch: Serverless Platform from MongoDB\n' +
'19We Can Help\n' +
'19Resources',
pageNumber: 2
}
]

Tip

以下も参照してください。

このセクションでは、 と を使用した 2 つの異なるRAG RG 実装を示します。Atlas Vector SearchAtlas Vector Searchを使用してセマンティックに類似したドキュメントを検索したので、次のコード例を使用して、LLM によって返されたドキュメントに対する質問に答えるようにAtlas Vector Search に指示します。

1

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

  • LgChuin プロンプトのテンプレート を定義するLLM は、これらのドキュメントをクエリのコンテキストとして使用するように指示します。LgChart はこれらのドキュメントを{context}入力変数に渡し、クエリを{question}変数に渡します。

  • 連鎖 を構築します は、OpenAI のチャット モデルを使用して、プロンプトに基づいてコンテキストを認識する応答を生成します。

  • Atlas のセキュリティ推奨事項に関するサンプル クエリでチェーンをプロンプトします。

  • LLMの応答とコンテキストとして使用されたドキュメントを返します。

// 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({});
const chain = RunnableSequence.from([
{
context: retriever.pipe(formatDocumentsAsString),
question: new RunnablePassthrough(),
},
prompt,
model,
new StringOutputParser(),
]);
// Prompt the LLM
const 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 documents
const retrievedResults = await retriever.getRelevantDocuments(question)
const documents = retrievedResults.map((documents => ({
pageContent: documents.pageContent,
pageNumber: documents.metadata.loc.pageNumber,
})))
console.log("\nSource documents:\n" + JSON.stringify(documents, 1, 2))
2

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

node get-started.js
...
Question: How can I secure my MongoDB Atlas cluster?
Answer: You can secure your MongoDB Atlas cluster by taking
advantage of extensive capabilities to defend, detect, and control
access to MongoDB. You can also enable encryption of data at rest
with encrypted storage volumes and configure an additional layer of
encryption on your data. Additionally, you can set up global clusters
on Amazon Web Services, Microsoft Azure, and Google Cloud Platform
with just a few clicks in the MongoDB Atlas UI.
Source documents:
[
{
"pageContent": "MongoDB Atlas features extensive capabilities to defend,\ndetect, and control access to MongoDB, offering among\nthe most complete security controls of any modern\ndatabase:",
"pageNumber": 18
},
{
"pageContent": "throughput is required, it is recommended to either\nupgrade the Atlas cluster or take advantage of MongoDB's\nauto-shardingto distribute read operations across multiple\nprimary members.",
"pageNumber": 14
},
{
"pageContent": "Atlas provides encryption of data at rest with encrypted\nstorage volumes.\nOptionally, Atlas users can configure an additional layer of\nencryption on their data at rest using the MongoDB",
"pageNumber": 19
},
{
"pageContent": "You can set up global clusters — available on Amazon Web\nServices, Microsoft Azure, and Google Cloud Platform —\nwith just a few clicks in the MongoDB Atlas UI. MongoDB",
"pageNumber": 13
}
]
1

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

  • Atlas Vector Search をレプリカとして インスタンス 化 セマンティックに類似したドキュメントをクエリします。次の任意パラメーターも指定します。

    • searchType としてmmrとして、Atlas Vector Search が Max MongoDB Atlas(MMR)に基づいてドキュメントを検索することを指定します。

    • filter をクリックして、 log.pageNumbersフィールドに事前フィルターを追加して、 17ページのみに表示されるドキュメントを含めます。

    • 次のMDR固有のパラメーター。

      • fetchK ドキュメントをMDRアルゴリズムに渡す前に、 20ドキュメントのみを取得します。

      • lambda、結果間の相違の度数を決定するための01の間の値。 0は最大の相違を表し、 1は最小の相違を表します。

  • LgChuin プロンプトのテンプレート を定義するLLM は、これらのドキュメントをクエリのコンテキストとして使用するように指示します。LgChart はこれらのドキュメントを{context}入力変数に渡し、クエリを{question}変数に渡します。

  • 連鎖 を構築します は、OpenAI のチャット モデルを使用して、プロンプトに基づいてコンテキストを認識する応答を生成します。

  • Atlas のセキュリティ推奨事項に関するサンプル クエリでチェーンをプロンプトします。

  • LLMの応答とコンテキストとして使用されたドキュメントを返します。

// Implement RAG to answer questions on your data
const retriever = await vectorStore.asRetriever({
searchType: "mmr", // Defaults to "similarity
filter: { preFilter: { "loc.pageNumber": { "$eq": 17 } } },
searchKwargs: {
fetchK: 20,
lambda: 0.1,
},
});
const prompt =
PromptTemplate.fromTemplate(`Answer the question based on the following context:
{context}
Question: {question}`);
const model = new ChatOpenAI({});
const chain = RunnableSequence.from([
{
context: retriever.pipe(formatDocumentsAsString),
question: new RunnablePassthrough(),
},
prompt,
model,
new StringOutputParser(),
]);
// Prompt the LLM
const 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 documents
const retrievedResults = await retriever.getRelevantDocuments(question)
const documents = retrievedResults.map((documents => ({
pageContent: documents.pageContent,
pageNumber: documents.metadata.loc.pageNumber,
})))
console.log("\nSource documents:\n" + JSON.stringify(documents, 1, 2))
2

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

node get-started.js
...
Question: How can I secure my MongoDB Atlas cluster?
Answer: To secure your MongoDB Atlas cluster, you can take the following measures:
1. Enable authentication and use strong, unique passwords for all users.
2. Utilize encryption in transit and at rest to protect data both while in motion and at rest.
3. Configure network security by whitelisting IP addresses that can access your cluster.
4. Enable role-based access control to limit what actions users can perform within the cluster.
5. Monitor and audit your cluster for suspicious activity using logging and alerting features.
6. Keep your cluster up to date with the latest patches and updates to prevent vulnerabilities.
7. Implement backups and disaster recovery plans to ensure you can recover your data in case of data loss.
Source documents:
[
{
"pageContent": "BSON database dumps produced bymongodump.\nIn the vast majority of cases, MongoDB Atlas backups\ndelivers the simplest, safest, and most efficient backup",
"pageNumber": 17
},
{
"pageContent": "APM Integration\nMany operations teams use Application Performance\nMonitoring (APM) platforms to gain global oversight of\n15",
"pageNumber": 17
},
{
"pageContent": "performance SLA.\nIf in the course of a deployment it is determined that a new\nshard key should be used, it will be necessary to reload the\ndata with a new shard key because designation and values",
"pageNumber": 17
},
{
"pageContent": "to the database.\nReplication Lag\nReplication lag is the amount of time it takes a write\noperation on the primary replica set member to replicate to",
"pageNumber": 17
}
]

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

戻る

ハイブリッド検索