【LangChain4j】1-认识ChatModel
摘要: LangChain4j 1.4.0是一个支持Java 17的LLM框架,提供本地部署(如Ollama)和API调用两种大模型集成方式。通过Ollama可快速部署量化模型(如deepseek-r1),并通过低级API实现基础对话功能。框架支持ChatModel(批量响应)和StreamingChatModel(流式响应),允许消息历史管理、随机性调节(temperature参数)及JSON格
LangChain4j是一个LLM(Large Language Model)框架,java版的langChain。目前已经正式发布了1.4.0版本,最低支持java17环境。
- 准备工作
首先得有一个大模型,两种方式:1-调用api,2-本地部署。
1)去deepseek官网申请apiKey,有免费的额度使用。
2)去ollama官网下载工具,部署量化模型。 - 安装ollama
1)官网点击download,选择合适环境下载,等待下载安装包。2)下载完,点击安装包,一直确定。
3)在cmd界面输入ollama -v,出现版本信息,即安装成功。
4)回到ollama官网,点击搜索栏,搜索deepseek-r1。
5)根据自己的配置选择不同的模型,在cmd中执行ollama run deepseek-r1:xxxb - quick start
在langchain4j中LLM相关API以两种形式:低级和高级,低级api是调用各个类,用以实现功能;高级则是以AIServices类实现。今天主要以低级API做一个快速开始。
首先引入
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-ollama</artifactId>
<version>1.4.0</version>
</dependency>
class OllamaChatQuickStartTest {
public static void main(String[] args) {
String modelName = "deepseek-r1:7b"; // 填入你刚刚下载的模型
String baseUrl = "http://localhost:11434"; // ollama启动后的ip:port
ChatModel model = OllamaChatModel.builder()
.baseUrl(baseUrl)
.modelName(modelName)
.build();
String answer = model.chat("hello world");
System.out.println("ai答:" + answer);
// 恭喜你成功完成了一次大模型的调用
}
}
- 进阶使用
- ChatModel
现我们来看看ChatModel里面有什么吧,不仅提供以字符串形式问答,还提供以ChatMessage对象集合问,ChatResponse对象答。
public interface ChatModel {
String chat(String userMessage);
...
ChatResponse chat(ChatMessage... messages);
ChatResponse chat(List<ChatMessage> messages);
}
ChatMessage是接口类,它的实现类分别是:
1)UserMessage:来自用户的信息。
2)AiMessage:存放Ai生成的信息,以及像deepseek的思考信息,即think标签内的信息
3)ToolExecutionResultMessage:存放tools的返回结果信息(后续会详细介绍tools)
4)SystemMessage:放在于ai对话的第一句,常常存放prompt提示词(后续会详细介绍prompt)
5)CustomMessage:可以包含任意属性的自定义消息。目前仅支持ollama,不常用。
chat接口提供集合传参,则意味着我们可以多次和Ai聊天,并保存上一次的聊天信息.
public class OllamaChatMultipleChatTest {
public static void main(String[] args) {
String modelName = "deepseek-r1:7b"; // 填入你刚刚下载的模型
String baseUrl = "http://localhost:11434"; // ollama启动后的ip:port
ChatModel model = OllamaChatModel.builder()
.baseUrl(baseUrl)
.modelName(modelName)
.build();
UserMessage helloUserMsg = UserMessage.from("你好,你现在是我的朋友koi");
ChatResponse res1 = model.chat(helloUserMsg);
AiMessage helloAiMsg = res1.aiMessage();
System.out.println("ai答1:" + helloAiMsg);
UserMessage nameMsg = UserMessage.from("你是谁?");
ChatResponse res2 = model.chat(helloUserMsg, helloAiMsg, nameMsg);
AiMessage nameAiMsg = res2.aiMessage();
System.out.println("ai答2:" + nameAiMsg);
}
}
- StreamingChatModel
ChatModel实现的是等待Ai将结果完全回复完再响应,一般情况下用户并不希望等待这么久,突然展示回复结果。因此一般使用StreamingChatModel类,该类采用流式回复,模型像打字一般,持续的输出结果。
public class OllamaChatStreamChatTest {
public static void main(String[] args) {
String modelName = "deepseek-r1:7b"; // 填入你刚刚下载的模型
String baseUrl = "http://localhost:11434"; // ollama启动后的ip:port
StreamingChatModel model = OllamaStreamingChatModel.builder()
.baseUrl(baseUrl)
.modelName(modelName)
.build();
CompletableFuture<ChatResponse> futureResponse = new CompletableFuture<>();
UserMessage helloUserMsg = UserMessage.from("你好,你现在是我的朋友koi");
List<ChatMessage> messages = new ArrayList<>();
messages.add(helloUserMsg);
model.chat(messages, new StreamingChatResponseHandler() {
@Override
public void onPartialResponse(String partialResponse) {
// 这里将持续接收ai回复的部分内容
System.out.print(partialResponse);
}
@Override
public void onCompleteResponse(ChatResponse completeResponse) {
// 当ai回复完会调用该方法
futureResponse.complete(completeResponse);
}
@Override
public void onError(Throwable error) {
// 当发生异常调用该方法
futureResponse.completeExceptionally(error);
}
});
futureResponse.join();
}
}
- ChatModel和StreamingChatModel的常用相关配置
class OllamaChatBuilderParamterTest {
public static void main(String[] args) {
String modelName = "deepseek-r1:7b"; // 填入你刚刚下载的模型
String baseUrl = "http://localhost:11434"; // ollama启动后的ip:port
StreamingChatModel model = OllamaStreamingChatModel.builder()
.baseUrl(baseUrl)
.modelName(modelName)
.temperature(1.0) // 控制ai回复的随机性,较高的值会导致多样化的输出,较低的值则产生更确定的输出
.responseFormat(ResponseFormat.JSON) // 输出形式,
.think(true) // 是否深度思考
.returnThinking(true) // 是否返回思考过程
.timeout(Duration.ofMinutes(10)) // 超时时间
.build();
OllamaChatModel.builder()
.maxRetries(3) // 非流式模型,才有的最大api返回失败的重试次数
.build();
// 更多parameter配置见:https://docs.langchain4j.dev/integrations/language-models/ollama#parameters
}
}
以上完整代码在我的仓库,地址:https://gitee.com/liutao-lx/langchain4j-agent-dev/tree/master/agent-example/src/main/java/com/koicarp/agent/example/chatmodel
更多推荐
所有评论(0)