Python 是進(jìn)入人工智能領(lǐng)域(認(rèn)為是機(jī)器學(xué)習(xí)或生成人工智能AIGC)的主要武器,Java 和 Spring 仍引領(lǐng)著大多數(shù)開發(fā)社區(qū), Java 開發(fā)人員如何與 LLM大模型 一起工作?這就是 Spring AI 彌補(bǔ)差距的地方。
Spring AI在 Spring 應(yīng)用程序和可以在本地運(yùn)行的 LLM 之間創(chuàng)建集成,這為所有 Java 開發(fā)人員提供了開發(fā)人工智能應(yīng)用程序的能力。
在本文中,我們將了解如何使用 Ollama 在本地運(yùn)行大模型,我們將考慮四個(gè)方面。
- 本地安裝并運(yùn)行 Ollama 和 LLM
- 創(chuàng)建SpringAI項(xiàng)目并詳細(xì)查看項(xiàng)目配置。
- 訪問本地嵌入。
- 訪問本地聊天模型。
安裝并運(yùn)行 Ollama
導(dǎo)航至https://ollama.com/download下載適用于特定操作系統(tǒng)的 ollama。
下載 ollama 后,打開終端并輸入以下命令以提取 LLM 并在本地運(yùn)行它們。
ollama run llama2 # pulls llama2 LLM model
ollama run mistral # pulls and runs mistral LLM
創(chuàng)建 Spring AI 項(xiàng)目
如果你使用任何集成開發(fā)環(huán)境(我使用的是 IntelliJ)或基于 Web 的 Spring Intializr,那么你可以看到現(xiàn)在可以直接從 Spring Intializr 添加 AI 依賴項(xiàng)。在本例中,我們將添加 Ollama。在執(zhí)行此步驟之前,請按照步驟 1 確保已安裝 Ollama 并在本地運(yùn)行。
讓我們深入研究一下 application.yaml,看看與 ollama 有關(guān)的不同項(xiàng)目配置。
spring:
ai:
ollama:
embedding:
model: "llama2" options:
temperature: 0.5
top-p: 0.2
top-k: 2
num-g-p-u: 1 enable metal gpu on MAC
base-url: "http://localhost:11434"
有關(guān)嵌入和聊天模型的更多配置可分別在這里?here?和這里here?找到。請注意一點(diǎn),Spring 默認(rèn)配置可與 Mistral LLM 配合使用,但我們已明確用 llama2 替代。
實(shí)體記錄
首先,我們將創(chuàng)建兩個(gè)記錄:Payload 和 Response,名稱更加直觀。
package org.vaslabs.springai2.records;
public record Payload(String strings) {
}
package org.vaslabs.springai2.records;
import java.util.List;
public record Response(List
data) {
}
服務(wù)類
現(xiàn)在讓我們創(chuàng)建一個(gè)服務(wù)類,它將幫助我們?yōu)榻o定的輸入字符串生成嵌入結(jié)果。
import org.springframework.ai.embedding.EmbeddingClient;
import org.springframework.ai.embedding.EmbeddingRequest;
import org.springframework.ai.embedding.EmbeddingResponse;
import org.springframework.ai.ollama.api.OllamaOptions;
import org.springframework.stereotype.Service;
import org.vaslabs.springai2.records.Payload;
import java.util.List;
import java.util.Map;
@Service
public class OllamaEmbeddingsGenerator {
private final EmbeddingClient embeddingClient;
? ? public OllamaEmbeddingsGenerator(EmbeddingClient embeddingClient) {
this.embeddingClient = embeddingClient;
}
? ? public EmbeddingResponse getEmbeddingsWithModelOverride(Payload payload) {
return this.embeddingClient.call(new EmbeddingRequest(
List.of(payload.strings()),
OllamaOptions.create().withModel("mistral")));
}
? ? public Map<String, EmbeddingResponse> getEmbeddingsWithDefaultModel(Payload payload) {
EmbeddingResponse embeddingResponse = this.embeddingClient.embedForResponse(
List.of(payload.strings()));
return Map.of("embedding", embeddingResponse);
}
}
上述 OllamaEmbeddingsGenerator 類定義在 Spring 應(yīng)用程序的 org.vaslabs.springai2.service 包中,是生成文本嵌入的服務(wù)組件。它利用 Spring AI 框架的嵌入式客戶端(EmbeddingClient)將文本數(shù)據(jù)轉(zhuǎn)換為嵌入式,即在自然語言處理任務(wù)中非常有用的向量表示。
該服務(wù)配備了兩個(gè)主要方法:getEmbeddingsWithModelOverride 和 getEmbeddingsWithDefaultModel。
-
前一種方法允許指定用于嵌入生成的模型(例如 "mistral"),從而可以根據(jù)請求自定義行為。
-
后一種方法則使用客戶端的默認(rèn)模型設(shè)置生成嵌入。這兩種方法的操作方式都是獲取一個(gè) Payload 對象(該對象封裝了要嵌入的字符串),并以不同的格式返回嵌入結(jié)果--在 getEmbeddingsWithModelOverride 的情況下直接返回 EmbeddingResponse,而在 getEmbeddingsWithDefaultModel 的情況下返回一個(gè)包含 EmbeddingResponse 的映射。
這種設(shè)計(jì)封裝了與嵌入式生成技術(shù)交互的復(fù)雜性,并為應(yīng)用程序中的各種嵌入式生成需求提供了靈活的應(yīng)用程序接口。
讓我們再了解一項(xiàng)有助于創(chuàng)建聊天一代的服務(wù)。
import org.springframework.ai.ollama.OllamaChatClient;
import org.springframework.stereotype.Service;
import java.util.Map;
@Service
public class OllamaChatGenerator {
? ? private final OllamaChatClient ollamaChatClient;
? ? public OllamaChatGenerator(OllamaChatClient ollamaChatClient) {
this.ollamaChatClient = ollamaChatClient;
}
? ? public Map generate(String message) {
return Map.of("generation", this.ollamaChatClient.call(message));
}
}
-
上述 Java 類 OllamaChatGenerator 定義在 org.vaslabs.springai2.service 包中,設(shè)計(jì)為 Spring 服務(wù),通過利用 Spring AI 框架中的 OllamaChatClient 來促進(jìn)聊天交互。
-
該服務(wù)使用 @Service 注解進(jìn)行 Spring 組件掃描,封裝了一種簡單而有效的方法來生成聊天響應(yīng)。
-
通過構(gòu)造函數(shù)實(shí)例化后,它會接收一個(gè) OllamaChatClient 對象,從而建立起與底層聊天模型或服務(wù)通信的依賴關(guān)系。
-
該服務(wù)的主要功能通過 generate 方法公開,該方法接受字符串消息作為輸入,并返回一個(gè)包含以 "generation "為關(guān)鍵字的聊天生成結(jié)果的映射。
這種設(shè)置抽象化了與人工智能驅(qū)動的聊天功能進(jìn)行交互的復(fù)雜性,為 Spring 應(yīng)用程序的其他組件提供了一種直接的方法,可根據(jù)用戶輸入生成動態(tài)的對話式響應(yīng)。
控制器
現(xiàn)在是為上述兩個(gè)服務(wù)編寫控制器的時(shí)候了,它們可以分別處理終端用戶的請求。這些控制器將幫助我們選擇用戶所需的功能。
import org.springframework.ai.embedding.Embedding;
import org.springframework.ai.embedding.EmbeddingResponse;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.vaslabs.springai2.records.Payload;
import org.vaslabs.springai2.records.Response;
import org.vaslabs.springai2.service.OllamaEmbeddingsGenerator;
import java.util.Map;
@RestController
@RequestMapping("/api/v1")
public class OllamaEmbeddingController {
? ? private final OllamaEmbeddingsGenerator ollamaEmbeddingsGenerator;
? ? public OllamaEmbeddingController(OllamaEmbeddingsGenerator ollamaEmbeddingsGenerator) {
this.ollamaEmbeddingsGenerator = ollamaEmbeddingsGenerator;
}
@PostMapping(value = "/embedding1", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity
fetchEmbeddings1(@RequestBody Payload payload){
Embedding embedding =
this.ollamaEmbeddingsGenerator.getEmbeddingsWithModelOverride(payload).getResult();
return ResponseEntity.ok(
new Response(embedding.getOutput()));
}
? ? @PostMapping(value = "/embedding2", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Map<String, EmbeddingResponse>> fetchEmbeddings2(@RequestBody Payload payload){
Map<String, EmbeddingResponse> embedding = this.ollamaEmbeddingsGenerator.getEmbeddingsWithDefaultModel(payload);
return ResponseEntity.ok(embedding);
}
}
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.vaslabs.springai2.records.Payload;
import org.vaslabs.springai2.service.OllamaChatGenerator;
import java.util.Map;
@RestController
@RequestMapping("/api/v1")
public class OllamaChatController {
? ? private final OllamaChatGenerator ollamaChatGenerator;
? ? public OllamaChatController(OllamaChatGenerator ollamaChatGenerator) {
this.ollamaChatGenerator = ollamaChatGenerator;
}
? ? @PostMapping(value = "/chat", produces = MediaType.APPLICATION_JSON_VALUE)
public Map chat(@RequestBody Payload payload){
return this.ollamaChatGenerator.generate(payload.strings());
}
}
如果上述代碼和配置都沒有問題,那么我們就可以運(yùn)行該項(xiàng)目了(需要注意的是,請確保在本地運(yùn)行 ollama)。
查看 OllamaEmbeddingController 的路由 /embedding1 和 /embedding2 非常有趣,第一個(gè)路由通過在服務(wù)中以編程方式覆蓋模型的配置來使用 Mistral 模型,而后一個(gè)路由則使用 application.yaml 中的默認(rèn)配置。
結(jié)論
總之,將 Ollama 與 Spring AI 結(jié)合使用,是將先進(jìn)的大型語言模型 (LLM) 直接集成到應(yīng)用程序中的令人信服的解決方案,可提供嵌入和文本生成功能。借助 Ollama 在本地運(yùn)行 LLM 的能力,開發(fā)人員可以對人工智能驅(qū)動的功能獲得前所未有的控制力和靈活性,確保數(shù)據(jù)隱私并減少延遲。
Spring AI 通過 OllamaEmbeddingClient 和 OllamaChatClient 對 Ollama 的支持簡化了集成過程,在 Spring 生態(tài)系統(tǒng)中實(shí)現(xiàn)了無縫嵌入生成和對話式人工智能功能。這種組合不僅使最先進(jìn)的人工智能技術(shù)的使用更加平民化,而且還增強(qiáng)了應(yīng)用程序的可擴(kuò)展性和響應(yīng)能力,使其成為希望集成智能、上下文感知交互和數(shù)據(jù)處理功能的開發(fā)人員的理想選擇。文章來源:http://www.zghlxwxcb.cn/news/detail-857509.html
https://www.jdon.com/72804.html文章來源地址http://www.zghlxwxcb.cn/news/detail-857509.html
到了這里,關(guān)于Spring AI與大模型Ollama如何集成整合?的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!