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 Key 设置
将您的 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 发布的首个稠密模型, 非常适合实验、 定制和快速迭代。 最大 token 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 适合处理多语言操作、 代码生成与微调。 出 色的成本/性能权衡。 最大 token 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 的全部能力,并在数学 与编码方面更强,原生支持函数调用 最大 token 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 模型。 其推理、世界知识与编码准确度在同尺寸类别中处于前沿水平。 最大 token 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 模型媲美。 最大 token 256K。 Java Enum MistralAiFimModelName.OPEN_CODESTRAL_MAMBA |
| mistral-small-latest | - Mistral AI La Plateforme. - Cloud platforms (Azure, AWS, GCP). | Commercial 适合可批量完成的简单任务 (分类、客户支持或文本生成)。 最大 token 32K Java Enum MistralAiChatModelName.MISTRAL_SMALL_LATEST |
| mistral-medium-latest | - Mistral AI La Plateforme. - Cloud platforms (Azure, AWS, GCP). | Commercial 适合需要中等推 理能力的中间任务 (数据提取、摘要、 撰写邮件、撰写描述)。 最大 token 32K Java Enum MistralAiChatModelName.MISTRAL_MEDIUM_LATEST |
| mistral-large-latest | - Mistral AI La Plateforme. - Cloud platforms (Azure, AWS, GCP). | Commercial 适合需要强大推理能力或高度专业化的复杂任务 (文本生成、代码生成、RAG 或 Agents)。 最大 token 128K Java Enum MistralAiChatModelName.MISTRAL_LARGE_LATEST |
| mistral-embed | - Mistral AI La Plateforme. - Cloud platforms (Azure, AWS, GCP). | Commercial 将文本转换为 1024 维的 数值向量嵌入。 嵌入模型支持检索与 RAG 应用。 最大 token 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 与代码补全)设计并优化的前沿生成式模型。 最大 token 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();
}
}
您将在 onPartialResponse 方法中接收 LLM 生成的每一个文本块(token)。
您可以看到下方输出是 实时流式返回的。
"Why do Java developers wear glasses? Because they can't C#"
当然,您可以将 MistralAI 聊天补全与 设置模型参数 和 聊天记忆 等其他功能结合,以获得更准确的响应。
在 聊天记忆 中,您将学习如何传递聊天历史,以便 LLM 知道之前说过什么。如果像本简单示例这样不传递聊天历史,LLM 将不知道之前说过什么,因此无法正确回答第二个问题('What did I just ask?')。
许多参数在幕后已设置,例如超时、模型类型和模型参数。 在 设置模型参数 中,您将学习如何显式设置这些参数。
函数调用
函数调用允许 Mistral 聊天模型(同步 和 流式)连接到外部工具。例如,您可以调用 Tool 获取支付交易状态,如 Mistral AI 函数调用 教程 所示。
支持哪些 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"));
...
}
接下来,让我们定义两个方法 retrievePaymentStatus 和 retrievePaymentDate,从 Tool 类获取支付状态和支付日期。
// 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";
}
}
它使用 @Tool 注解定义函数描述,使用 @P 注解定义 dev.langchain4j.agent.tool.* 包中的参数描述。更多信息见 此处