LgChuin4j 統合を使い始める
項目一覧
Atlas ベクトル検索 をLgChuin4 j4 と統合して、LM アプリケーションを構築できます。このチュートリアルでは、LlangCharin j と Atlas ベクトル検索の使用を開始し、データに対してセマンティック検索を実行し、単純な RAG実装を構築する方法を説明します。具体的には、次のアクションを実行します。
環境を設定します。
埋め込みモデルをインスタンス化します。
埋め込みストアとして Atlas を使用します。
カスタム データを Atlas に保存します。
次のベクトル検索クエリを実行します。
セマンティック検索。
メタデータの事前フィルタリングによるセマンティック検索。
Atlas Vector Search を使用してデータの質問に答え、 RAGを実装します。
バックグラウンド
LgChuin4j は、 Javaでの LM アプリケーションの作成を簡素化するフレームワークです。 LgChuin4j は、Lgachein、Haystack、LlamaIndex などのソースの概念と機能を組み合わせたものです。このフレームワークは、セマンティック検索や RAG などのさまざまなユースケースで使用できます。
Atlas ベクトル検索 をLgachein4 j と統合することで、Atlas をベクトルデータベースとして使用し、セマンティクスで類似したドキュメントを使用してクエリに答えることで、Atlas ベクトル検索を使用して RAG を実装できます。 RG の詳細については、「 Atlas ベクトル検索を使用した検索拡張生成(RAG) 」を参照してください。
前提条件
Atlas の サンプル データ セット からの映画データを含むコレクションを使用します。
クラスターが MongoDB バージョン 6.0.11, 7.0.2 以降(RC を含む)を実行している Atlas アカウント.IP アドレス が Atlas プロジェクトの アクセスリスト に含まれていることを確認します。詳細については、「クラスターの作成」を参照してください。
投票AI APIキー。 APIリクエストにはトークンが使用可能なアカウントが必要です。 Vyage AIアカウントの登録の詳細については、Vyage AI のウェブサイト を参照してください。
OpenAI API キー。API リクエストに使用できるクレジットを持つ OpenAI アカウントが必要です。OpenAI アカウントの登録について詳しく知りたい場合は、 OpenAI API ウェブサイトをご覧ください。
Java 開発キット(JDK) バージョン8 以降。
Javaアプリケーション を設定して実行する環境。 Maven または Gradle を構成してプロジェクトを構築および実行するようにするには、IntelliJ IDEA や Eclipse IDE などの統合開発環境(IDE)を使用することをお勧めします。
環境を設定する
最初に、必要な依存関係の追加や環境変数の設定など、このチュートリアルの環境を設定する必要があります。
依存関係を追加します。
プロジェクトの
pom.xml
ファイル内のdependencies
配列に次の依存関係を追加します。これらの依存関係により、Lgachein4j、Lgachein4j 用の Vyage AI API 、およびMongoDB Java Sync ドライバー ライブラリがアプリケーションに追加されます。pom.xml<dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-mongodb-atlas</artifactId> <version>1.0.0-beta1</version> </dependency> <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-voyage-ai</artifactId> <version>1.0.0-beta1</version> </dependency> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-sync</artifactId> <version>5.4.0</version> </dependency> 次に、LgChuin4j のアイテム請求書(BOM)の依存関係リストの下に
dependencyManagement
エントリを追加します。pom.xml<dependencyManagement> <dependencies> <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-bom</artifactId> <version>1.0.0-beta1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> pom.xml
ファイルの編集が終了したら、プロジェクトを再読み込みして、依存関係がインストールされていることを確認します。
クラスとメソッドをインポートします。
プロジェクトでメインのアプリケーションファイルMain.java
を見つけます。既存のインポートを次のインポートのリストに置き換えます。
import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import dev.langchain4j.data.document.Metadata; import dev.langchain4j.data.embedding.Embedding; import dev.langchain4j.data.segment.TextSegment; import dev.langchain4j.model.embedding.EmbeddingModel; import dev.langchain4j.model.voyageai.VoyageAiEmbeddingModel; import dev.langchain4j.store.embedding.EmbeddingMatch; import dev.langchain4j.store.embedding.EmbeddingSearchRequest; import dev.langchain4j.store.embedding.EmbeddingSearchResult; import dev.langchain4j.store.embedding.filter.comparison.*; import dev.langchain4j.store.embedding.mongodb.IndexMapping; import dev.langchain4j.store.embedding.mongodb.MongoDbEmbeddingStore; import org.bson.Document; import java.io.*; import java.util.*;
このチュートリアルの後半では、これらのクラスとメソッドを使用してベクトル埋め込みとクエリ データを作成します。
環境変数を設定します。
IDE によっては、アプリケーションが取得できる環境変数を設定する方法が複数ある場合があります。 IntelliJ で環境変数を設定するには、アプリケーションの実行構成を作成する必要があります。詳細については、IntelliJ ドキュメントの「 実行/デバッグ構成: アプリケーション 」ページの「 オペレーティング システム 」セクションを参照してください。
次の環境変数を設定します。
MONGODB_URI
: Atlas接続文字列に設定します。VOYAGE_AI_KEY
: 投票AI APIキーに設定します。
注意
接続stringには、次の形式を使用する必要があります。
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net/?<settings>
接続文字列の取得の詳細については、「 Atlasを使い始める」チュートリアルを参照してください。
埋め込みモデルのインスタンス化
この手順では、Voyage AIを使用してサンプルデータ内のテキストをベクトル埋め込みに変換する埋め込みモデルをインスタンス化します。
次のコードを Main.java
ファイルに追加して、Voyage AI APIキーを使用し、モデルとして voyage-3
を選択して、埋め込みモデルをインスタンス化します。
EmbeddingModel embeddingModel = VoyageAiEmbeddingModel.builder() .apiKey(embeddingApiKey) .modelName("voyage-3") .build();
voyage-3
$33
埋め込みストアとして Atlas を使用
このセクションでは、Atlas をベクトルデータベースとしてインスタンス化します。これはベクトルまたは埋め込みストアとも呼ばれます。埋め込みストアをインスタンス化すると、Lgachein4j はデータ上に Atlas ベクトル検索インデックスを自動的に作成します。
このコードは、次のアクションを実行します。
Atlas 配置に接続される
MongoClient
インスタンスを作成します。ベクトル検索インデックス定義の次元数をAIモデルの埋め込み次元に設定します。結果として得られるベクトル検索インデックスには、次の定義があります。
{ "fields": [ { "type": "vector", "path": "embedding", "numDimensions": 1024, "similarity": "cosine" } ] } 次のパラメータを指定して、Atlas コレクションを構成します。
ドキュメントを保存するには、Atlas コレクションとして
langchain4j_test.vector_store
を使用します。埋め込みストアをクエリするために使用するインデックスとして
vector_index
。
createIndex
ブール値は true
に設定されているため、埋め込みストアをインスタンス化するとベクトル検索インデックスが自動的に作成されます。コードにはインデックス作成を成功させるための 遅延 が含まれています。
次のコードを Main.java
ファイルに追加します。
MongoClient mongoClient = MongoClients.create(uri); System.out.println("Instantiating the embedding store..."); // Set to false if the vector index already exists Boolean createIndex = true; IndexMapping indexMapping = IndexMapping.builder() .dimension(embeddingModel.dimension()) .metadataFieldNames(new HashSet<>()) .build(); MongoDbEmbeddingStore embeddingStore = MongoDbEmbeddingStore.builder() .databaseName("search") .collectionName("langchaintest") .createIndex(createIndex) .indexName("vector_index") .indexMapping(indexMapping) .fromClient(mongoClient) .build(); if (createIndex) { // Creating a vector search index can take up to a minute, // so this delay allows the index to become queryable try { Thread.sleep(15000); } catch (InterruptedException e) { throw new RuntimeException(e); } }
上記のコードで使用されているクラスとメソッドの詳細については、 db.lang4 engine j.store. embedded.mongodbパッケージAPIドキュメント を参照してください。
カスタム データの保存
このセクションでは、サンプルドキュメントを作成し、埋め込みモデルを使用してテキストを埋め込みに変換し、データを Atlas に永続化します。
このコードは、次のアクションを実行します。
text
フィールドとmetadata
フィールドを含むサンプルドキュメントのリストを作成します。text
フィールドの内容を埋め込みに変換し、データを Atlas に永続化します。コードにはベクトル変換に必要な時間に対応するための遅延が含まれています。
次のコードを Main.java
ファイルに追加します。
ArrayList<Document> docs = new ArrayList<>(); docs.add(new Document() .append("text", "In Zadie Smith's new novel, the true story of a heated nineteenth-century criminal trial connects to the unrest of current times.") .append("metadata", new Metadata(Map.of("author", "A")))); docs.add(new Document() .append("text", "Emperor penguins are the tallest and heaviest of all penguin species, standing up to 4 feet.") .append("metadata", new Metadata(Map.of("author", "D")))); docs.add(new Document() .append("text", "Penguins are flightless seabirds that live almost exclusively below the equator. Some island-dwellers can be found in warmer climates.") .append("metadata", new Metadata(Map.of("author", "C")))); docs.add(new Document() .append("text", "Patagonia is home to five penguin species - Magellanic, Humboldt, Gentoo, Southern Rockhopper and King.") .append("metadata", new Metadata(Map.of("author", "B")))); System.out.println("Persisting document embeddings..."); for (Document doc : docs) { TextSegment segment = TextSegment.from( doc.getString("text"), doc.get("metadata", Metadata.class) ); Embedding embedding = embeddingModel.embed(segment).content(); embeddingStore.add(embedding, segment); } // Delay for persisting data try { Thread.sleep(5000); } catch (InterruptedException e) { throw new RuntimeException(e); }
ベクトル検索クエリの実行
このセクションでは、ベクトル化されたデータに対してクエリを実行する方法を説明します。
セマンティック検索を実行します。
このコードでは、"Where do penguins live?"
というフレーズのセマンティック検索クエリーが実行され、最も関連性の高い結果が 3 つ返されます。また、各結果がクエリにどの程度一致するかを取得するスコアも出力します。
次のコードを Main.java
ファイルに追加します。
String query = "Where do penguins live?"; Embedding queryEmbedding = embeddingModel.embed(query).content(); EmbeddingSearchRequest searchRequest = EmbeddingSearchRequest.builder() .queryEmbedding(queryEmbedding) .maxResults(3) .build(); System.out.println("Performing the query..."); EmbeddingSearchResult<TextSegment> searchResult = embeddingStore.search(searchRequest); List<EmbeddingMatch<TextSegment>> matches = searchResult.matches(); for (EmbeddingMatch<TextSegment> embeddingMatch : matches) { System.out.println("Response: " + embeddingMatch.embedded().text()); System.out.println("Author: " + embeddingMatch.embedded().metadata().getString("author")); System.out.println("Score: " + embeddingMatch.score()); }
Response: Penguins are flightless seabirds that live almost exclusively below the equator. Some island-dwellers can be found in warmer climates. Author: C Score: 0.829620897769928 Response: Patagonia is home to five penguin species - Magellanic, Humboldt, Gentoo, Southern Rockhopper and King. Author: B Score: 0.7459062337875366 Response: Emperor penguins are the tallest and heaviest of all penguin species, standing up to 4 feet. Author: D Score: 0.6908764839172363
(任意)メタデータ フィルタリングを使用してセマンティック検索を実行します。
メタデータフィルタリングを使用して検索を実行するには、dev.langchain4j.store.embedding.filter.comparison
パッケージのクラスを使用できます。これらの クラスを使用すると、メタデータ値を指定された値と比較するフィルターを作成して、検索によって返される結果を絞り込むことができます。
この例では、author
フィールドの値が "B"
または "C"
のいずれであるドキュメントをフィルタリングします。次に、"Where do penguins live?"
というフレーズのセマンティック検索クエリーを実行します。
前の手順の EmbeddingSearchRequest
インスタンスをインスタンス化するコードを次のコードで置き換えます。
EmbeddingSearchRequest searchRequest = EmbeddingSearchRequest.builder() .queryEmbedding(queryEmbedding) .filter(new IsIn("author", List.of("B", "C"))) .maxResults(3) .build();
Response: Penguins are flightless seabirds that live almost exclusively below the equator. Some island-dwellers can be found in warmer climates. Author: C Score: 0.8520907163619995 Response: Patagonia is home to five penguin species - Magellanic, Humboldt, Gentoo, Southern Rockhopper and King. Author: B Score: 0.7666836977005005
メタデータの事前フィルタリングの詳細については、「 Atlas Vector Search の事前フィルター 」を参照してください。
以下も参照してください。
詳しくは、 API リファレンス を参照してください。
データを使用して質問に答えます
このセクションでは、 LgChuin4 jフレームワークと Atlas ベクトル検索 の実装を使用する RG を示します。 Atlas ベクトル検索を使用してセマンティックに類似したドキュメントを検索したので、次のコード例を使用して、Atlas に保存されているドキュメントの情報を使用して LM に質問に回答するように要求します。
RaG のプロジェクトを設定する。
dependencies
プロジェクトのpom.xml
ファイル内の 配列に次の依存関係を追加しますが、すでに追加した依存関係は削除しません。これらの依存関係により、LlangCharin4 j AIサービスと Lgachein4 j ライブラリ用の OpenAI APIがアプリケーションに追加されます。pom.xml<dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-open-ai</artifactId> <version>1.0.0-beta1</version> </dependency> <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j</artifactId> <version>1.0.0-beta1</version> </dependency> pom.xml
ファイルの編集が終了したら、プロジェクトを再読み込みして、依存関係がインストールされていることを確認します。次のインポートを
Main.java
ファイルのインポート リストに追加します。import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import dev.langchain4j.service.AiServices; import dev.langchain4j.model.chat.ChatLanguageModel; import dev.langchain4j.model.openai.OpenAiChatModel; import dev.langchain4j.rag.content.retriever.ContentRetriever; import dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever; OPENAI_KEY
環境変数を OpenAI APIキー に設定します。このキーを使用して、クエリに対する応答を生成するチャットモデルを作成します。
サンプル データをロードします。
この手順では、外部ソースから Atlas にデータを取り込みます。 MongoDB リポジトリから Rails.jsonサンプルデータファイルをダウンロードします。このファイルのドキュメントには、夏時間の植物、移動、気象に関する情報が含まれています。docs-code-examples
このファイルをプロジェクト内の resources
ディレクトリにアップロードします。このディレクトリは、アプリケーションファイルを含む java
ディレクトリと同じレベルにあります。
から埋め込みを作成し、Atlas に永続化できる形式にデータを処理する必要があります。このコードでは、次のアクションを実行する loadJsonDocuments()
メソッドを定義します。
ClassLoader
クラスを使用して、resources
ディレクトリからサンプルデータを取得しますObjectMapper
クラスを使用して、 JSONドキュメントをMongoDBDocument
インスタンスのList
に解析します
次のコードを メイン メソッドの外部 の
Main.java
ファイルに追加します。
private static List<Document> loadJsonDocuments(String resourcePath) throws IOException { // Loads file from resources directory using the ClassLoader InputStream inputStream = Main.class.getClassLoader().getResourceAsStream(resourcePath); if (inputStream == null) { throw new FileNotFoundException("Resource not found: " + resourcePath); } // Parses JSON file to List of MongoDB Documents ObjectMapper objectMapper = new ObjectMapper(); List<Document> documents = objectMapper.readValue(inputStream, new TypeReference<>() {}); return documents; }
次に、メイン メソッド本体に次のコードを追加して、loadJsonDocuments()
メソッドを呼び出してドキュメントをロードします。
System.out.println("Loading documents from file..."); String resourcePath = "rainforest-docs.json"; List<Document> documents = loadJsonDocuments(resourcePath);
Atlas にベクトル埋め込みを保存します。
この手順では、サンプルドキュメントからベクトル埋め込みを作成し、それを Atlas に永続化します。
このコードは、サンプルドキュメント内の text
フィールドの内容を埋め込みに変換し、データを Atlas に永続化します。コードにはベクトル変換に必要な時間に対応するための遅延が含まれています。
次のコードを Main.java
ファイルに追加します。
System.out.println("Persisting document embeddings..."); for (Document doc : documents) { TextSegment segment = TextSegment.from( doc.getString("text"), new Metadata(doc.get("metadata", Map.class))); Embedding embedding = embeddingModel.embed(segment).content(); embeddingStore.add(embedding, segment); } try { Thread.sleep(5000); } catch (InterruptedException e) { throw new RuntimeException(e); }
チャット モデルをインスタンス化し、コンテンツ検索を指定します。
この手順では、OpenAI からチャット モデルをインスタンス化して、データに基づいて質問に回答できるようにします。また、関連ドキュメントを表示して、チャット モデルによって作成された応答に通知するコンテンツ検索も指定します。
このコードは、次のアクションを実行します。
OpenAI APIキーを使用して、チャットモデルをインスタンス化します
次の仕様でコンテンツリゾルバを作成します。
最大で
3
の関連ドキュメントを検索関連性スコアが
0.75
以上のドキュメントを取得します
次のコードを メソッド本体の Main.java
ファイルに追加します。
String chatApiKey = System.getenv("OPENAI_KEY"); ChatLanguageModel chatModel = OpenAiChatModel.builder() .apiKey(chatApiKey) .modelName("gpt-4") .build(); ContentRetriever contentRetriever = EmbeddingStoreContentRetriever.builder() .embeddingStore(embeddingStore) .embeddingModel(embeddingModel) .maxResults(3) .minScore(0.75) .build();
Tip
メタデータのフィルタリング
ビルダーContentRetriever
filter()
Filter
メソッドを使用し、 のインスタンスを渡すことで、 にメタデータフィルタリングを実装できます。Filter
を構築する方法については、前の手順のメタデータフィルタリングの例を参照してください。
チャット 支援を作成します。
アプリケーションにAIサービスAPIを実装する単純な Assistant
インターフェースを作成します。 Main.java
ファイルと同じレベルに Assistant.java
というインターフェースファイルを作成します。
Assistant
インターフェースを定義します。
package org.example; public interface Assistant { String answer(String question); }
Main.java
ファイルで、Assistant
をインスタンス化します。
Assistant assistant = AiServices.builder(Assistant.class) .chatLanguageModel(chatModel) .contentRetriever(contentRetriever) .build();
データに対してクエリを実行します。
最後に、サンプルデータに対してクエリを実行します。クエリを実行して出力を印刷するには、Main.java
ファイルに次のコードを追加します。
String ragQuery = "What types of insects live in the rainforest?"; String output = assistant.answer(ragQuery); System.out.println("Response:\n" + output);
Response: In the rainforest, there are numerous species of insects such as beetles, butterflies, moths, wasps, bees, flies, and ants. Of the many insects that live in the rainforest, ants are particularly important as they play a crucial role in nutrient recycling and aeration of the soil. Moreover, many of these insects are involved in the processes of pollination and decomposition. The adaptations these insects have developed enable their survival in the rainforest's specific conditions, characterized by heavy rainfall.
次のステップ
MongoDBは、次の開発者リソースも提供しています。
「Rarg4 アプリケーションを作成する方法」(Dev Community のウェブサイトにあります)。
以下も参照してください。