MistralAI
プロジェクトのセットアップ
プロジェクトにlangchain4jをインストールするには、次の依存関係を追加します:
Mavenプロジェクトのpom.xmlの場合
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
<version>1.18.1</version>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-mistral-ai</artifactId>
<version>1.18.1</version>
</dependency>
Gradleプロジェクトのbuild.gradleの場合
implementation 'dev.langchain4j:langchain4j:1.18.1'
implementation 'dev.langchain4j:langchain4j-mistral-ai:1.18.1'
APIキーの設定
プロジェクトにMistralAI APIキーを追加します。次のコードでApiKeys.javaクラスを作成できます
public class ApiKeys {
public static final String MISTRALAI_API_KEY = System.getenv("MISTRAL_AI_API_KEY");
}
APIキーを環境変数として設定することを忘れないでください。
export MISTRAL_AI_API_KEY=your-api-key #For Unix OS based
SET MISTRAL_AI_API_KEY=your-api-key #For Windows OS
MistralAI APIキーの取得方法の詳細はこちらをご覧ください
モデルの選択
MistralAiChatModelNameおよびMistralAiFimModelNameのJava列挙型を使用して、ユースケースに適したモデル名を見つけられます。
MistralAIは、パフォーマンスとコストのトレードオフに応じてモデルの選択と分類を更新しました。
| モデル名 | デプロイまたは利用可能な場所 | 説明 |
|---|---|---|
| open-mistral-7b | - Mistral AI La Plateforme. - Cloud platforms (Azure, AWS, GCP). - Hugging Face. - Self-hosted (On-premise, IaaS, docker, local). | OpenSource Mistral AIがリリースした最初の密なモデルで、 実験、 カスタマイズ、迅速な反復に最適です。 最大トークン32K Java Enum MistralAiChatModelName.OPEN_MISTRAL_7B |
| open-mixtral-8x7b | - Mistral AI La Plateforme. - Cloud platforms (Azure, AWS, GCP). - Hugging Face. - Self-hosted (On-premise, IaaS, docker, local). | OpenSource 多言語操作、 コード生成とファインチューニングに最適。 優れたコスト/性能のトレードオフ。 最大トークン32K Java Enum MistralAiChatModelName.OPEN_MIXTRAL_8x7B |
| open-mixtral-8x22b | - Mistral AI La Plateforme. - Cloud platforms (Azure, AWS, GCP). - Hugging Face. - Self-hosted (On-premise, IaaS, docker, local). | OpenSource Mixtral-8x7Bの全機能に加え、強力な数学 とコーディング、ネイティブな関数呼び出し対応 最大トークン64K。 Java Enum MistralAiChatModelName.OPEN_MIXTRAL_8X22B |
| open-mistral-nemo | - Mistral AI La Plateforme. - Cloud platforms (Azure, AWS, GCP). - Hugging Face. - Self-hosted (On-premise, IaaS, docker, local). | OpenSource NVIDIAと共同で構築された12Bモデル。 推論、世界知識、コーディング精度は同サイズカテゴリで最先端です。 最大トークン128K。 Java Enum MistralAiChatModelName.OPEN_MISTRAL_NEMO |
| open-codestral-mamba | - Mistral AI La Plateforme. - Cloud platforms (Azure, AWS, GCP). - Hugging Face. - Self-hosted (On-premise, IaaS, docker, local). | OpenSource コード生成に特化したMamba2言語モデル。 高度なコードと推論能力で訓練され、transformerベースのSOTAモデルと同等の性能を発揮します。 最大トークン256K。 Java Enum MistralAiFimModelName.OPEN_CODESTRAL_MAMBA |
| mistral-small-latest | - Mistral AI La Plateforme. - Cloud platforms (Azure, AWS, GCP). | Commercial 一括で行える単純なタスクに適しています (分類、カスタマーサポート、またはテキスト生成)。 最大トークン32K Java Enum MistralAiChatModelName.MISTRAL_SMALL_LATEST |
| mistral-medium-latest | - Mistral AI La Plateforme. - Cloud platforms (Azure, AWS, GCP). | Commercial 中程度の推論を必要とする中間タスクに最適 (データ抽出、要約、 メール作成、説明文作成)。 最大トークン32K Java Enum MistralAiChatModelName.MISTRAL_MEDIUM_LATEST |
| mistral-large-latest | - Mistral AI La Plateforme. - Cloud platforms (Azure, AWS, GCP). | Commercial 大きな推論能力を必要とする、または高度に専門化された複雑なタスクに最適 (テキスト生成、コード生成、RAG、またはAgents)。 最大トークン128K Java Enum MistralAiChatModelName.MISTRAL_LARGE_LATEST |
| mistral-embed | - Mistral AI La Plateforme. - Cloud platforms (Azure, AWS, GCP). | Commercial テキストを1024次元の 埋め込み数値ベクトルに変換します。 埋め込みモデルは検索とRAGアプリケーションを可能にします。 最大トークン8K Java Enum MistralAiEmbeddingModelName.MISTRAL_EMBED |
| codestral-latest | - Mistral AI La Plateforme. - Cloud platforms (Azure, AWS, GCP). - Hugging Face. - Self-hosted (On-premise, IaaS, docker, local). | OpenSource(非本番ライセンス)およびCommercial fill-in-the-middleやコード補完を含むコード生成タスク向けに特別に設計・最適化された最先端の生成モデル。 最大トークン32K Java Enum MistralAiFimModelName.CODESTRAL_LATEST |
@Deprecatedモデル:
- mistral-tiny (
@Deprecated) - mistral-small (
@Deprecated) - mistral-medium (
@Deprecated)
各Mistralモデルの詳細とユースケースの種類はこちらをご覧ください
チャット補完
チャットモデルを使用すると、会話データでファインチューニングされたモデルで人間らしい応答を生成できます。
同期処理
クラスを作成し、次のコードを追加します。
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.mistralai.MistralAiChatModel;
public class HelloWorld {
public static void main(String[] args) {
ChatModel model = MistralAiChatModel.builder()
.apiKey(ApiKeys.MISTRALAI_API_KEY)
.modelName(MistralAiChatModelName.MISTRAL_SMALL_LATEST)
.build();
String response = model.chat("Say 'Hello World'");
System.out.println(response);
}
}
プログラムを実行すると、次のような出力のバリエーションが生成されます
Hello World! How can I assist you today?
ストリーミング
クラスを作成し、次のコードを追加します。
import dev.langchain4j.data.message.AiMessage;
import dev.langchain4j.model.chat.response.StreamingChatResponseHandler;
import dev.langchain4j.model.mistralai.MistralAiStreamingChatModel;
import dev.langchain4j.model.output.Response;
import java.util.concurrent.CompletableFuture;
public class HelloWorld {
public static void main(String[] args) {
MistralAiStreamingChatModel model = MistralAiStreamingChatModel.builder()
.apiKey(ApiKeys.MISTRALAI_API_KEY)
.modelName(MistralAiChatModelName.MISTRAL_SMALL_LATEST)
.build();
CompletableFuture<ChatResponse> futureResponse = new CompletableFuture<>();
model.chat("Tell me a joke about Java", new StreamingChatResponseHandler() {
@Override
public void onPartialResponse(String partialResponse) {
System.out.print(partialResponse);
}
@Override
public void onCompleteResponse(ChatResponse completeResponse) {
futureResponse.complete(completeResponse);
}
@Override
public void onError(Throwable error) {
futureResponse.completeExceptionally(error);
}
});
futureResponse.join();
}
}
LLMが生成するテキストチャンク(トークン)は、onPartialResponseメソッドで受け取れます。
以下の出力がリアルタイムでストリームされることがわかります。
"Why do Java developers wear glasses? Because they can't C#"
もちろん、MistralAIのチャット補完をモデルパラメータの設定やチャットメモリなどの他の機能と組み合わせて、より正確な応答を得ることもできます。
チャットメモリでは、チャット履歴を渡してLLMが以前の会話を把握する方法を学べます。この単純な例のようにチャット履歴を渡さない場合、LLMは以前の内容を知らないため、2つ目の質問('What did I just ask?')に正しく答えられません。
タイムアウト、モデルタイプ、モデルパラメータなど、多くのパラメータは裏側で設定されています。 モデルパラメータの設定では、これらのパラメータを明示的に設定する方法を学べます。
関数呼び出し
関数呼び出しにより、Mistralチャットモデル(同期およびストリーミング)を外部ツールに接続できます。例えば、Mistral AIの関数呼び出しチュートリアルに示されているように、Toolを呼び出して支払いトランザクションのステータスを取得できます。
サポートされているmistralモデルは?
現在、関数呼び出しは次のモデルで利用できます:
- Mistral Small
MistralAiChatModelName.MISTRAL_SMALL_LATEST - Mistral Large
MistralAiChatModelName.MISTRAL_LARGE_LATEST - Mixtral 8x22B
MistralAiChatModelName.OPEN_MIXTRAL_8X22B - Mistral Nemo
MistralAiChatModelName.OPEN_MISTRAL_NEMO
1. Toolクラスと支払いデータの取得方法を定義する
次のような支 払いトランザクションのデータセットがあると仮定します。実際のアプリケーションでは、データベースソースやREST APIクライアントを注入してデータを取得する必要があります。
import java.util.*;
public class PaymentTransactionTool {
private final Map<String, List<String>> paymentData = Map.of(
"transaction_id", List.of("T1001", "T1002", "T1003", "T1004", "T1005"),
"customer_id", List.of("C001", "C002", "C003", "C002", "C001"),
"payment_amount", List.of("125.50", "89.99", "120.00", "54.30", "210.20"),
"payment_date", List.of("2021.18.15", "2021.18.16", "2021.18.17", "2021.18.15", "2021.18.18"),
"payment_status", List.of("Paid", "Unpaid", "Paid", "Paid", "Pending"));
...
}
次に、Toolクラスから支払いステータスと支払い日を取得する2つのメソッドretrievePaymentStatusとretrievePaymentDateを定義します。
// Tool to be executed to get payment status
@Tool("Get payment status of a transaction") // function description
String retrievePaymentStatus(@P("Transaction id to search payment data") String transactionId) {
return getPaymentData(transactionId, "payment_status");
}
// Tool to be executed to get payment date
@Tool("Get payment date of a transaction") // function description
String retrievePaymentDate(@P("Transaction id to search payment data") String transactionId) {
return getPaymentData(transactionId, "payment_date");
}
private String getPaymentData(String transactionId, String data) {
List<String> transactionIds = paymentData.get("transaction_id");
List<String> paymentData = paymentData.get(data);
int index = transactionIds.indexOf(transactionId);
if (index != -1) {
return paymentData.get(index);
} else {
return "Transaction ID not found";
}
}
dev.langchain4j.agent.tool.*パッケージの@Toolアノテーションで関数の説明を、@Pアノテーションでパラメータの説明を定義します。詳細はこちら