Java 開(kāi)發(fā)者必看!用 Quarkus + LangChain4j 實(shí)現(xiàn)本地 Ollama 的 AI 深度集成
在探索AI與現(xiàn)代技術(shù)棧融合的道路上,搭建一個(gè)能在本地高效運(yùn)行的智能交互應(yīng)用是個(gè)不錯(cuò)的實(shí)踐方向。
本文介紹如何構(gòu)建 Quarkus 應(yīng)用程序。該程序會(huì)設(shè)置 REST 端點(diǎn),借助 LangChain4j 調(diào)用本地 Ollama 模型,用戶調(diào)用端點(diǎn)發(fā)問(wèn)題,即可獲取模型響應(yīng)。
整個(gè)部署過(guò)程均在本地計(jì)算機(jī)上完成,無(wú)需API密鑰或訂閱服務(wù),是純粹的AI集成技術(shù)實(shí)踐。僅需幾個(gè)簡(jiǎn)單步驟,就能讓這套系統(tǒng)順利運(yùn)行起來(lái),一起開(kāi)始吧!
1.安裝Ollama
訪問(wèn)Ollama官網(wǎng):https://ollama.com/download 。
根據(jù)你的操作系統(tǒng)下載相應(yīng)文件,并像安裝其他應(yīng)用程序一樣進(jìn)行安裝。安裝完成后會(huì)得到ollama命令行工具,之后就能用簡(jiǎn)單命令在本地運(yùn)行Ollama模型,比如:
ollama run llama3.2:1b這條命令會(huì)運(yùn)行目前Ollama中最小的模型(約1.3GB)。雖然這個(gè)模型表現(xiàn)不算出色,但它體積小,在本地運(yùn)行速度很快,非常適合我們的使用場(chǎng)景。之后你可以嘗試Ollama提供的所有免費(fèi)模型,具體可查看https://ollama.com/library。
在終端運(yùn)行上述命令后,你會(huì)看到類似這樣的內(nèi)容:模型開(kāi)始下載、運(yùn)行,并打開(kāi)一個(gè)提示框,在其中可以與大語(yǔ)言模型進(jìn)行聊天。
圖片
同時(shí),這會(huì)在本地主機(jī)上暴露一個(gè)HTTP API,我們接下來(lái)借助Quarkus和langchain4j擴(kuò)展與之交互。
2.創(chuàng)建簡(jiǎn)單的Quarkus項(xiàng)目
訪問(wèn)code.quarkus.dev,配置以下應(yīng)用程序:
圖片
你可以按自己的喜好命名項(xiàng)目,添加上述兩個(gè)擴(kuò)展,然后下載項(xiàng)目。接著,在你喜歡的集成開(kāi)發(fā)環(huán)境(文章所有示例中都使用IntelliJ)中打開(kāi)該項(xiàng)目。
現(xiàn)在,在src/main/java目錄下創(chuàng)建一個(gè)名為OllamaService的新Java類,并添加以下內(nèi)容:
package com.tsvetkov;
import dev.langchain4j.service.UserMessage;
import io.quarkiverse.langchain4j.RegisterAiService;
import jakarta.enterprise.context.ApplicationScoped;
@RegisterAiService
@ApplicationScoped
public interface OllamaService {
public String answer(@UserMessage String question);
}還需要在application.properties文件中明確設(shè)置上一步下載的模型:
quarkus.langchain4j.ollama.chat-model.model-id=llama3.2:1b3.創(chuàng)建REST端點(diǎn)
現(xiàn)在,讓我們創(chuàng)建一個(gè)REST端點(diǎn),用問(wèn)題調(diào)用服務(wù)并獲取結(jié)果。在src/main/java目錄下創(chuàng)建一個(gè)新文件:
package com.tsvetkov;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
@Path("/ollama")
publicclass OllamaController {
@Inject
OllamaService ollamaService;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String question() {
return ollamaService.answer("How are you?");
}
}現(xiàn)在,你可以打開(kāi)終端啟動(dòng)應(yīng)用程序:
./gradlew quarkusDev應(yīng)該會(huì)看到如下輸出:
Quarkus啟動(dòng)日志
4.從應(yīng)用程序中調(diào)用Ollama模型并返回結(jié)果
現(xiàn)在,我們可以調(diào)用/ollama端點(diǎn)并獲取結(jié)果。這里使用Postman進(jìn)行測(cè)試:
Postman對(duì)http://localhost:8080/ollama的GET請(qǐng)求
就這樣,我們從模型得到了答案!
我們甚至還能更進(jìn)一步,使用提示模板(Prompt Templates)。這些模板可用于引導(dǎo)模型的響應(yīng),你可以盡情發(fā)揮創(chuàng)意!例如,我們可以讓模型表現(xiàn)得像個(gè)海盜。
將OllamaService修改如下:
package com.tsvetkov;
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
import io.quarkiverse.langchain4j.RegisterAiService;
import jakarta.enterprise.context.ApplicationScoped;
@RegisterAiService
@ApplicationScoped
publicinterface OllamaService {
@SystemMessage("""
Act like a pirate. Speak with pirate lingo, be bold, and add a sense of adventure in your responses.
"""
)
String answer(@UserMessage String question);
}現(xiàn)在,當(dāng)我們?cè)L問(wèn)/ollama端點(diǎn)時(shí),得到的答案如下:
模型模仿海盜給出的答案
5.總結(jié)與展望
在 Quarkus 框架中,利用 LangChain4j 實(shí)現(xiàn) Ollama 模型的集成,這一過(guò)程簡(jiǎn)潔高效。將 Ollama 模型部署在本地,能夠確保數(shù)據(jù)的自主性與安全性,讓開(kāi)發(fā)者對(duì)數(shù)據(jù)擁有完全的掌控權(quán)。
Java 技術(shù)近年來(lái)發(fā)展迅猛,不僅版本迭代帶來(lái)諸多新特性,像 Quarkus 這樣的優(yōu)秀框架更是極大地優(yōu)化了技術(shù)棧的使用體驗(yàn)。借助 Java 生態(tài),開(kāi)發(fā)者可以輕松進(jìn)行快速原型開(kāi)發(fā),探索人工智能和機(jī)器學(xué)習(xí)技術(shù),獲得良好的開(kāi)發(fā)體驗(yàn)。
這對(duì)于新開(kāi)發(fā)者而言,無(wú)疑是一個(gè)低門檻接觸前沿技術(shù)的契機(jī),能夠幫助他們快速上手實(shí)踐。同時(shí),也為這些技術(shù)在實(shí)際企業(yè)應(yīng)用中的落地提供了可行范例,有力推動(dòng)了人工智能和機(jī)器學(xué)習(xí)技術(shù)在企業(yè)級(jí)項(xiàng)目中的廣泛應(yīng)用與創(chuàng)新發(fā)展。

































