Docs Menu

LgChuin4j 統合を使い始める

Atlas ベクトル検索 をLgChuin4 j4 と統合して、LM アプリケーションを構築できます。このチュートリアルでは、LlangCharin j と Atlas ベクトル検索の使用を開始し、データに対してセマンティック検索を実行し、単純な RAG実装を構築する方法を説明します。具体的には、次のアクションを実行します。

  1. 環境を設定します。

  2. 埋め込みモデルをインスタンス化します。

  3. 埋め込みストアとして Atlas を使用します。

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

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

    • セマンティック検索。

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

  6. 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 ウェブサイトをご覧ください。

最初に、必要な依存関係の追加や環境変数の設定など、このチュートリアルの環境を設定する必要があります。

1
  1. IDE を開き、新しいJavaプロジェクトを作成し、次の構成を設定します。

    • 名前: LgChuin4jSampleApp

    • 言語: Java

    • ビルド システム: Maven

    • JDK: 8 より大きいバージョン

    サンプルコードを含めるオプションが表示される場合があります。このオプションを選択すると、環境が動作することをテストし、次の手順で編集するアプリケーションファイルを見つけることができます。

2
  1. プロジェクトの 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>
  2. 次に、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>

    4Lg以前、4

    pom.xmlファイルの編集が終了したら、プロジェクトを再読み込みして、依存関係がインストールされていることを確認します。

3

プロジェクトでメインのアプリケーションファイル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.*;

このチュートリアルの後半では、これらのクラスとメソッドを使用してベクトル埋め込みとクエリ データを作成します。

4

IDE によっては、アプリケーションが取得できる環境変数を設定する方法が複数ある場合があります。 IntelliJ で環境変数を設定するには、アプリケーションの実行構成を作成する必要があります。詳細については、IntelliJ ドキュメントの「 実行/デバッグ構成: アプリケーション 」ページの「 オペレーティング システム 」セクションを参照してください。

次の環境変数を設定します。

  • MONGODB_URI: Atlas接続文字列に設定します。

  • VOYAGE_AI_KEY: 投票AI APIキーに設定します。

注意

接続stringには、次の形式を使用する必要があります。

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

接続文字列の取得の詳細については、「 Atlasを使い始める」チュートリアルを参照してください。

5

環境変数を取得するには、アプリケーションの Main.javaファイルのメイン メソッド内に次のコードを追加します。

String embeddingApiKey = System.getenv("VOYAGE_AI_KEY");
String uri = System.getenv("MONGODB_URI");

この手順では、Voyage AIを使用してサンプルデータ内のテキストをベクトル埋め込みに変換する埋め込みモデルをインスタンス化します。

次のコードを Main.javaファイルに追加して、Voyage AI APIキーを使用し、モデルとして voyage-3 を選択して、埋め込みモデルをインスタンス化します。

EmbeddingModel embeddingModel = VoyageAiEmbeddingModel.builder()
.apiKey(embeddingApiKey)
.modelName("voyage-3")
.build();

voyage-3$33

このセクションでは、Atlas をベクトルデータベースとしてインスタンス化します。これはベクトルまたは埋め込みストアとも呼ばれます。埋め込みストアをインスタンス化すると、Lgachein4j はデータ上に Atlas ベクトル検索インデックスを自動的に作成します。

注意

必要なアクセス権

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

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

  • 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);
}

このセクションでは、ベクトル化されたデータに対してクエリを実行する方法を説明します。

1

このコードでは、"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
2

メタデータフィルタリングを使用して検索を実行するには、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 の事前フィルター 」を参照してください。

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

このセクションでは、 LgChuin4 jフレームワークと Atlas ベクトル検索 の実装を使用する RG を示します。 Atlas ベクトル検索を使用してセマンティックに類似したドキュメントを検索したので、次のコード例を使用して、Atlas に保存されているドキュメントの情報を使用して LM に質問に回答するように要求します。

1
  1. 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ファイルの編集が終了したら、プロジェクトを再読み込みして、依存関係がインストールされていることを確認します。

  2. 次のインポートを 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;
  3. OPENAI_KEY 環境変数を OpenAI APIキー に設定します。このキーを使用して、クエリに対する応答を生成するチャットモデルを作成します。

2

この手順では、外部ソースから Atlas にデータを取り込みます。 MongoDB リポジトリから Rails.jsonサンプルデータファイルをダウンロードします。このファイルのドキュメントには、夏時間の植物、移動、気象に関する情報が含まれています。docs-code-examples

このファイルをプロジェクト内の resourcesディレクトリにアップロードします。このディレクトリは、アプリケーションファイルを含む javaディレクトリと同じレベルにあります。

から埋め込みを作成し、Atlas に永続化できる形式にデータを処理する必要があります。このコードでは、次のアクションを実行する loadJsonDocuments() メソッドを定義します。

  • ClassLoaderクラスを使用して、resourcesディレクトリからサンプルデータを取得します

  • ObjectMapperクラスを使用して、 JSONドキュメントをMongoDB Document インスタンスの 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);
3

この手順では、サンプルドキュメントからベクトル埋め込みを作成し、それを 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);
}
4

この手順では、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 を構築する方法については、前の手順のメタデータフィルタリングの例を参照してください。

5

アプリケーションに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();
6

最後に、サンプルデータに対してクエリを実行します。クエリを実行して出力を印刷するには、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は、次の開発者リソースも提供しています。

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