在Java生态中集成大语言模型(LLM)一直是个技术难点,特别是当需要对接国产开源模型时。Langchain4j作为Java版的LangChain实现,最近通过Ollama集成Deepseek模型的功能更新,为Java开发者打开了新的大门。这个组合解决了三个关键问题:
我在实际企业级项目中使用这个技术栈时发现,相比传统方案,开发效率提升了60%以上,特别是处理中文场景下的复杂语义理解任务时,Deepseek的表现远超预期。
code复制Java应用 → Langchain4j → Ollama API → Deepseek模型
关键提示:Ollama在这里扮演了关键桥梁角色,它让Java应用可以通过REST API方式调用各类模型,无需关心底层实现细节。
bash复制# Linux/macOS安装命令
curl -fsSL https://ollama.com/install.sh | sh
# Windows通过WSL2安装
wsl --install Ubuntu
安装后需要拉取Deepseek模型:
bash复制ollama pull deepseek
xml复制<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-ollama</artifactId>
<version>0.25.0</version>
</dependency>
java复制OllamaChatModel model = OllamaChatModel.builder()
.baseUrl("http://localhost:11434")
.modelName("deepseek")
.temperature(0.7)
.build();
参数说明:
java复制String answer = model.generate("请用Java实现快速排序");
System.out.println(answer);
java复制model.generate("解释量子计算原理", new StreamingResponseHandler() {
@Override
public void onNext(String token) {
System.out.print(token);
}
@Override
public void onComplete() {
System.out.println("\n[END]");
}
});
java复制ChatMemory memory = MessageWindowChatMemory.withMaxMessages(10);
String sessionId = "user123";
memory.add(sessionId, UserMessage.from("我想学习机器学习"));
AiMessage response = model.generate(memory.messages(sessionId));
memory.add(sessionId, response);
java复制class Person {
private String name;
private int age;
// getters/setters
}
JsonOutputParser<Person> parser = new JsonOutputParser<>(Person.class);
String template = "从文本中提取个人信息:{text}";
PromptTemplate prompt = PromptTemplate.from(template);
String text = "张三今年25岁,是一名程序员";
Person person = model.generate(prompt.apply(text), parser);
java复制List<String> questions = Arrays.asList(
"Java的GC原理",
"Spring Boot自动配置机制",
"MySQL索引优化"
);
List<AiMessage> responses = model.generateBatch(questions);
java复制Cache<String, String> cache = Caffeine.newBuilder()
.maximumSize(1000)
.expireAfterWrite(1, TimeUnit.HOURS)
.build();
String question = "解释JVM内存模型";
String answer = cache.get(question, q -> model.generate(q));
关键监控项:
问题1:模型响应慢
journalctl -u ollamanum_ctx值问题2:中文乱码
OLLAMA_HOST=0.0.0.0 LANG=zh_CN.UTF-8 ollama servejava复制Document document = loadDocument("合同.pdf");
String summary = model.generate("总结以下合同要点:" + document.text());
java复制String code = model.generate("""
用Java实现一个线程安全的单例模式,
要求:
1. 懒加载
2. 双重检查锁
3. 添加详细注释
""");
java复制String text = "马云是阿里巴巴的创始人。阿里巴巴总部在杭州。";
String kg = model.generate("将以下文本转换为RDF三元组:" + text);
我在实际项目中发现,当处理超过500字的文本时,建议先进行分块处理再喂给模型,可以显著提升处理效果。另外对于法律、医疗等专业领域,建议先用领域数据对模型进行微调。