MistralAI
项目 设置
要将 langchain4j 安装到您的项目中,请添加以下依赖项:
对于 Maven 项目 pom.xml
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
<version>1.0.0-beta3</version>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-mistral-ai</artifactId>
<version>1.0.0-beta3</version>
</dependency>
对于 Gradle 项目 build.gradle
implementation 'dev.langchain4j:langchain4j:1.0.0-beta3'
implementation 'dev.langchain4j:langchain4j-mistral-ai:1.0.0-beta3'
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 #对于基于 Unix 的操作系统
SET MISTRAL_AI_API_KEY=your-api-key #对于 Windows 操作系统
有关如何获取 MistralAI API 密钥的更多详情,请参阅此处
模型选择
您可以使用 MistralAiChatModelName.class 枚举类来找到适合您用例的 合适模型名称。
MistralAI 根据性能和成本权衡更新了模型的新选择和分类。
| 模型名称 | 部署或可用于 | 描述 |
|---|---|---|
| open-mistral-7b | - Mistral AI La Plateforme. - 云平台 (Azure, AWS, GCP). - Hugging Face. - 自托管 (本地部署, IaaS, docker, 本地). | 开源 Mistral AI 发布的第一个密集模型, 非常适合实验, 自定义和快速迭代。 最大令牌数 32K Java 枚举 MistralAiChatModelName.OPEN_MISTRAL_7B |
| open-mixtral-8x7b | - Mistral AI La Plateforme. - 云平台 (Azure, AWS, GCP). - Hugging Face. - 自托管 (本地部署, IaaS, docker, 本地). | 开源 理想用于处理多语言操作, 代码生成和微调。 出色的成本/性能权衡。 最大令牌数 32K Java 枚举 MistralAiChatModelName.OPEN_MIXTRAL_8x7B |
| open-mixtral-8x22b | - Mistral AI La Plateforme. - 云平台 (Azure, AWS, GCP). - Hugging Face. - 自托管 (本地部署, IaaS, docker, 本地). | 开源 它具有 Mixtral-8x7B 的所有功能, 加上强大的数学能力, 原生支持函数调用的编码能力。 最大令牌数 64K. Java 枚举 MistralAiChatModelName.OPEN_MIXTRAL_8X22B |
| mistral-small-latest | - Mistral AI La Plateforme. - 云平台 (Azure, AWS, GCP). | 商业版 适用于可以批量处理的简单任务 (分类、客户支持或文本生成)。 最大令牌数 32K Java 枚举 MistralAiChatModelName.MISTRAL_SMALL_LATEST |
| mistral-medium-latest | - Mistral AI La Plateforme. - 云平台 (Azure, AWS, GCP). | 商业版 适用于需要中等推理能力的中级任务 (数据提取、摘要、 写邮件、写描述)。 最大令牌数 32K Java 枚举 MistralAiChatModelName.MISTRAL_MEDIUM_LATEST |
| mistral-large-latest | - Mistral AI La Plateforme. - 云平台 (Azure, AWS, GCP). | 商业版 适用于需要大量推理能力 或高度专业化的复杂任务 (文本生成、代码生成、RAG 或代理)。 最大令牌数 32K Java 枚举 MistralAiChatModelName.MISTRAL_LARGE_LATEST |
| mistral-embed | - Mistral AI La Plateforme. - 云平台 (Azure, AWS, GCP). | 商业版 将文本转换为 1024 维的 数值向量嵌入。 嵌入模型支持检索和 RAG 应用。 最大令牌数 8K Java 枚举 MistralAiEmbeddingModelName.MISTRAL_EMBED |
@Deprecated 模型:
- mistral-tiny (
@Deprecated) - mistral-small (
@Deprecated) - mistral-medium (
@Deprecated)
您可以在这里找到更多关于各种用例及其对应 Mistral 模型的详细信息
聊天完成
聊天模型允许您使用经过对话数据微调的模型生成类人回复。
同步
创建一个类并添加以下代码。
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.mistralai.MistralAiChatModel;
public class HelloWorld {
public static void main(String[] args) {
ChatLanguageModel model = MistralAiChatModel.builder()
.apiKey(ApiKeys.MISTRALAI_API_KEY)
.modelName(MistralAiChatModelName.MISTRAL_SMALL_LATEST)
.build();
String response = model.chat("说 '你好世界'");
System.out.println(response);
}
}
运行程序将生成类似以下输出的变体
你好世界!今天我能帮您什么忙?
流式处理
创建一个类并添加以下代码。
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("讲个关于 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);
}
});
try {
ChatResponse response = futureResponse.get();
System.out.println("\n完整响应: " + response.content().text());
} catch (Exception e) {
e.printStackTrace();
}
}
}
工具调用
工具调用允许模型调用您定义的函数。
import dev.langchain4j.agent.tool.Tool;
import dev.langchain4j.data.message.AiMessage;
import dev.langchain4j.data.message.ChatMessage;
import dev.langchain4j.data.message.UserMessage;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.mistralai.MistralAiChatModel;
import dev.langchain4j.model.output.Response;
import dev.langchain4j.model.output.ToolExecutionRequest;
import java.util.List;
public class ToolCalling {
public static void main(String[] args) {
ChatLanguageModel model = MistralAiChatModel.builder()
.apiKey(ApiKeys.MISTRALAI_API_KEY)
.modelName(MistralAiChatModelName.MISTRAL_LARGE_LATEST)
.temperature(0.0)
.build();
Calculator calculator = new Calculator();
String userMessage = "计算 (27 * 3) + 15";
Response<AiMessage> response = model.generate(List.of(UserMessage.from(userMessage)), List.of(calculator));
AiMessage aiMessage = response.content();
System.out.println(aiMessage.text());
List<ToolExecutionRequest> toolExecutionRequests = aiMessage.toolExecutionRequests();
for (ToolExecutionRequest toolExecutionRequest : toolExecutionRequests) {
System.out.println("工具名称: " + toolExecutionRequest.name());
System.out.println("工具参数: " + toolExecutionRequest.arguments());
}
}
static class Calculator {
@Tool("计算两个数字的和")
public double add(double a, double b) {
return a + b;
}
@Tool("计算两个数字的差")
public double subtract(double a, double b) {
return a - b;
}
@Tool("计算两个数字的积")
public double multiply(double a, double b) {
return a * b;
}
@Tool("计算两个数字的商")
public double divide(double a, double b) {
return a / b;
}
}
}
JSON 模式
JSON 模式允许您指定模型响应的结构。
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.mistralai.MistralAiChatModel;
import dev.langchain4j.model.mistralai.MistralAiChatModelName;
import dev.langchain4j.model.output.Response;
import dev.langchain4j.model.output.ResponseFormat;
import dev.langchain4j.model.output.ResponseFormatType;
import dev.langchain4j.model.output.structured.JsonSchema;
import dev.langchain4j.model.output.structured.JsonArraySchema;
import dev.langchain4j.model.output.structured.JsonObjectSchema;
import dev.langchain4j.model.output.structured.JsonStringSchema;
public class JsonSchema {
public static void main(String[] args) {
ChatLanguageModel model = MistralAiChatModel.builder()
.apiKey(ApiKeys.MISTRALAI_API_KEY)
.modelName(MistralAiChatModelName.MISTRAL_LARGE_LATEST)
.responseFormat(ResponseFormat.builder()
.type(ResponseFormatType.JSON)
.jsonSchema(JsonSchema.builder().rootElement(JsonObjectSchema.builder()
.addProperty("name", JsonStringSchema.builder().build())
.addProperty("capital", JsonStringSchema.builder().build())
.addProperty(
"languages",
JsonArraySchema.builder()
.items(JsonStringSchema.builder().build())
.build())
.required("name", "capital", "languages")
.build())
.build())
.build())
.build();
String userMessage = "返回一个包含两个字段的 JSON:transactionId 和 status,值分别为 T123 和 paid。";
String json = model.chat(userMessage);
System.out.println(json); // {"transactionId":"T123","status":"paid"}
}
}
流式 JSON 模式
您也可以使用流式处理获取 JSON 响应。
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.mistralai.MistralAiChatModel;
import dev.langchain4j.model.mistralai.MistralAiChatModelName;
import dev.langchain4j.model.mistralai.MistralAiStreamingChatModel;
import dev.langchain4j.model.output.Response;
import dev.langchain4j.model.output.ResponseFormat;
import dev.langchain4j.model.output.ResponseFormatType;
import dev.langchain4j.model.output.structured.JsonSchema;
import dev.langchain4j.model.output.structured.JsonArraySchema;
import dev.langchain4j.model.output.structured.JsonObjectSchema;
import dev.langchain4j.model.output.structured.JsonStringSchema;
import java.util.concurrent.CompletableFuture;
public class StreamingJsonSchema {
public static void main(String[] args) throws Exception {
MistralAiStreamingChatModel streamingModel = MistralAiStreamingChatModel.builder()
.apiKey(ApiKeys.MISTRALAI_API_KEY)
.modelName(MistralAiChatModelName.MISTRAL_LARGE_LATEST)
.responseFormat(ResponseFormat.builder()
.type(ResponseFormatType.JSON)
.build())
.build();
String userMessage = "返回包含两个字段的 JSON:transactionId 和 status,值分别为 T123 和 paid。";
CompletableFuture<ChatResponse> futureResponse = new CompletableFuture<>();
streamingModel.chat(userMessage, 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);
}
});
String json = futureResponse.get().content().text();
System.out.println(json); // {"transactionId":"T123","status":"paid"}
}
}
结构化输出
结构化输出确保模型的响应遵循 JSON 模式。
备注
LangChain4j 中使用结构化输出的文档可在此处获取,在下面的部分中,您将找到 MistralAI 特定的信息。
如果需要,可以为模型配置默认的 JSON 模式,在请求中未 提供模式时将使用该模式作为后备。
ChatLanguageModel model = MistralAiChatModel.builder()
.apiKey(System.getenv("MISTRAL_AI_API_KEY"))
.modelName(MISTRAL_SMALL_LATEST)
.supportedCapabilities(Set.of(Capability.RESPONSE_FORMAT_JSON_SCHEMA)) // 启用结构化输出
.responseFormat(ResponseFormat.builder() // 设置后备 JSON 模式(可选)
.type(ResponseFormatType.JSON)
.jsonSchema(JsonSchema.builder().rootElement(JsonObjectSchema.builder()
.addProperty("name", JsonStringSchema.builder().build())
.addProperty("capital", JsonStringSchema.builder().build())
.addProperty(
"languages",
JsonArraySchema.builder()
.items(JsonStringSchema.builder().build())
.build())
.required("name", "capital", "languages")
.build())
.build())
.build())
.build();
护栏
护栏是一种限制模型行为的方式,防止它生成有害或不需要的内容。您可以在 MistralAiChatModel 构建器或 MistralAiStreamingChatModel 构建器中可选地设置 safePrompt 参数。
同步示例:
ChatLanguageModel model = MistralAiChatModel.builder()
.apiKey(System.getenv("MISTRAL_AI_API_KEY"))
.safePrompt(true)
.build();
String userMessage = "什么是最好的法国奶酪?";
String response = model.chat(userMessage);
流式示例:
StreamingChatLanguageModel streamingModel = MistralAiStreamingChatModel.builder()
.apiKey(System.getenv("MISTRAL_AI_API_KEY"))
.safePrompt(true)
.build();
String userMessage = "什么是最好的法国奶酪?";
CompletableFuture<ChatResponse> futureResponse = new CompletableFuture<>();
streamingModel.chat(userMessage, 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();
切换安全提示将在您的消息前添加以下 @SystemMessage:
始终以关怀、尊重和真实的态度提供帮助。以最大的实用性但安全地回应。避免有害、不道德、偏见或负面的内容。确保回复促进公平和积极性。
创建 MistralAiModerationModel
纯 Java
ModerationModel model = new MistralAiModerationModel.Builder()
.apiKey(System.getenv("MISTRAL_AI_API_KEY"))
.modelName("mistral-moderation-latest")
.logRequests(true)
.logResponses(false)
.build();
Moderation moderation = model.moderate("我想杀了他们。").content();