LangChain JavaScript/Typescript 統合を始めましょう
項目一覧
注意
このチュートリアルでは、LangChain の JavaScript ライブラリ を使用します。Python ライブラリを使用するチュートリアルについては、 「Atlas Vector Search を LangChain の統合」を参照してください。
Atlas Vector Searchと Lgachein を統合できますLLM アプリケーションを構築し、検索拡張生成(RAG )を実装します。このチュートリアルでは、Lgachein と Atlas Vector Search の使用を開始し、データに対してセマンティック検索を実行し、 RAG実装を構築する方法を説明します。 具体的には、次のアクションを実行します。
環境を設定します。
カスタム データを Atlas に保存します。
データに Atlas Vector Search インデックスを作成します。
次のベクトル検索クエリを実行します。
セマンティック検索。
メタデータの事前フィルタリングによるセマンティック検索。
最大マージナル関連性(MMR)検索。
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 インストール済み。
環境を設定する
このチュートリアルの環境を設定します。環境を設定するには、次の手順を実行します。
package.json
ファイルを更新します。
ES モジュール "type": "module"
package.json
を使用するようにプロジェクトを構成する を ファイルに追加して保存する方法
{ "type": "module", // other fields... }
get-started.js
というファイルを作成し、次のコードを貼り付けます。
プロジェクトで、 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);
プレースホルダー値を置き換えます。
環境のセットアップを完了するには、<api-key>
<connection-string>
の と のプレースホルダー値を、get-started.js
クラスターの OpenAIAPI キーと SRV 接続文字列 Atlasに置き換えます。接続文字列には、次の形式を使用する必要があります。
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
Atlas をベクトル ストアとして使用
このセクションでは、カスタム データを 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 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 2 const indexes = await collection.listSearchIndexes("vector_index").toArray(); 3 if(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
関数の の数を増やします。
次のコードを非同期関数に追加し、ファイルを保存します。
次のコードでは、 similaritySearch
メソッドを使用して、string MongoDB Atlas security
の基本的なセマンティック検索を実行します。 pageContent
pageNumber
フィールドと フィールドのみを持つドキュメントの関連性順のリストが返されます。
// 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)
以下のコマンドを実行してクエリを実行します。
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
フィールドをフィルターとして指定しました。
次のコードを非同期関数に追加し、ファイルを保存します。
次のコードでは、 similaritySearch
メソッドを使用して string MongoDB Atlas security
のセマンティック検索を実行します。 次のパラメータを指定します。
3
として返すドキュメントの数。$eq
演算子を使用して17ページにのみ表示されるドキュメントを照合するloc.pageNumber
フィールドの事前フィルタリング。
pageContent
pageNumber
フィールドと フィールドのみを持つドキュメントの関連性順のリストが返されます。
// 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)
以下のコマンドを実行してクエリを実行します。
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)に基づいて、セマンティック検索を実行することもできます。
次のコードを非同期関数に追加し、ファイルを保存します。
次のコードでは、 maxMarginalRelevanceSearch
メソッドを使用して string MongoDB Atlas security
を検索します。 また、次の任意パラメータを定義するオブジェクトも指定します。
k
返されたドキュメントの数を3
に制限します。fetchK
ドキュメントをMDRアルゴリズムに渡す前に、10
ドキュメントのみを取得します。
pageContent
pageNumber
フィールドと フィールドのみを持つドキュメントの関連性順のリストが返されます。
// 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)
以下のコマンドを実行してクエリを実行します。
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 } ]
データに関する質問に答えます
このセクションでは、 と を使用した 2 つの異なるRAG RG 実装を示します。Atlas Vector SearchAtlas Vector Searchを使用してセマンティックに類似したドキュメントを検索したので、次のコード例を使用して、LLM によって返されたドキュメントに対する質問に答えるようにAtlas Vector Search に指示します。
次のコードを非同期関数に追加し、ファイルを保存します。
このコードでは、次の処理が行われます。
Atlas Vector Search をレプリカとして インスタンス 化 セマンティックに類似したドキュメントをクエリします。
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))
次のコマンドを実行して、ファイルを実行します。
ファイルを保存した後、次のコマンドを実行します。 生成される応答は異なる場合があります。
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 } ]
次のコードを非同期関数に追加し、ファイルを保存します。
このコードでは、次の処理が行われます。
Atlas Vector Search をレプリカとして インスタンス 化 セマンティックに類似したドキュメントをクエリします。次の任意パラメーターも指定します。
searchType
としてmmr
として、Atlas Vector Search が Max MongoDB Atlas(MMR)に基づいてドキュメントを検索することを指定します。filter
をクリックして、log.pageNumbers
フィールドに事前フィルターを追加して、 17ページのみに表示されるドキュメントを含めます。次のMDR固有のパラメーター。
fetchK
ドキュメントをMDRアルゴリズムに渡す前に、20
ドキュメントのみを取得します。lambda
、結果間の相違の度数を決定するための0
と1
の間の値。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))
次のコマンドを実行して、ファイルを実行します。
ファイルを保存した後、次のコマンドを実行します。 生成される応答は異なる場合があります。
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は、次の開発者リソースも提供しています。