Spring AI 使用本地 Ollama Embeddings的操作方法
使用 OpenAI 的 Embeddings 接口是有費用的,如果想對大量文檔進行測試,使用本地部署的 Embeddings 就能省去大量的費用,所以我們嘗試使用本地的 Ollama Embeddings。
首先本地安裝 Ollama: https://ollama.com/download
即使你電腦沒有性能很強的顯卡,僅僅依靠 CPU 也能運行一些參數(shù)量較小的模型。ollama 中下載量最多的是 llama2 模型,但是這個模型對中文支持不太好,我們可以試試 Google 開源的 gemma 模型:
https://ollama.com/library/gemma
這個模型包含幾個不同的版本,默認為 7b 的版本,可以先試試 7b,如果速度太慢可以換 2b 試試,執(zhí)行命令 ollama run gemma
時會下載模型并運行,模型默認會下載到用戶目錄中的 .ollama
中,如果用戶目錄(一般在C盤)所在盤空間少,可以提前通過環(huán)境變量方式修改位置,參考下面的配置(改成自己的路徑):
OLLAMA_MODELS=D:\.ollama
如果不會在 Windows 創(chuàng)建 .前綴的目錄,也可以用正常目錄,也可以打開 git bash,使用命令
mkdir .ollama
創(chuàng)建
配置環(huán)境變量后一定打開一個新的 CMD 或者 Terminal,然后執(zhí)行 ollama rum gemma
下載并啟動模型(已經(jīng)下載到用戶目錄的模型可以整體移動到新的目錄)。啟動后可以在控制臺進行對話,如下所示:
>ollama run gemma >>> 你好 你好!我很好,謝謝您的問候。 您想讓我做什么呢?我能夠幫助您嗎?
接下來在 Spring AI 中使用該模型,首先引入Maven依賴:
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-ollama-spring-boot-starter</artifactId> </dependency>
通過下面示例代碼運行:
var ollamaApi = new OllamaApi(); var chatClient = new OllamaChatClient(ollamaApi).withModel("gemma") .withDefaultOptions(OllamaOptions.create() .withModel("gemma") .withTemperature(0.9f)); Scanner scanner = new Scanner(System.in); while (true) { System.out.print(">>> "); String message = scanner.nextLine(); if (message.equals("exit")) { break; } String resp = chatClient.call(message); System.out.println("<<< " + resp); }
接口使用很簡單,下面再看如何使用 Ollama 的 Embeddings。
var ollamaApi = new OllamaApi(); //指定使用的模型 var embeddingClient = new OllamaEmbeddingClient(ollamaApi) .withDefaultOptions(OllamaOptions.create().withModel("gemma")); //測試數(shù)據(jù) VectorStore vectorStore = new SimpleVectorStore(embeddingClient); vectorStore.add(List.of( new Document("白日依山盡,黃河入海流。欲窮千里目,更上一層樓。"), new Document("青山依舊在,幾度夕陽紅。白發(fā)漁樵江渚上,慣看秋月春風。"), new Document("一片孤城萬仞山,羌笛何須怨楊柳。春風不度玉門關。"), new Document("危樓高百尺,手可摘星辰。不敢高聲語,恐驚天上人。") )); Scanner scanner = new Scanner(System.in); while (true) { System.out.print("請輸入關鍵詞: "); String message = scanner.nextLine(); if (message.equals("exit")) { break; } List<Document> documents = vectorStore.similaritySearch(message); System.out.println("查詢結果: "); for (Document doc : documents) { System.out.println(doc.getContent()); } }
在我本地運行時(靠CPU),解析文檔耗時如下:
10:33:10.423 - Calling EmbeddingClient for document id = 44d0114f-62ae-4d05-9e6d-457f157386ce
10:33:16.201 - Calling EmbeddingClient for document id = ac65024a-26a9-4827-af4c-af48a3321a4b
10:33:22.176 - Calling EmbeddingClient for document id = 53747918-8e8e-42e1-b4e6-3792c24b6881
10:33:26.125 - Calling EmbeddingClient for document id = 63123b8d-b475-48b4-b38e-71dbf1b49250
每一條文本耗時在6秒左右。解析完成后輸入提示詞進行驗證:
請輸入關鍵詞: 春風
查詢結果:
青山依舊在,幾度夕陽紅。白發(fā)漁樵江渚上,慣看秋月春風。
一片孤城萬仞山,羌笛何須怨楊柳。春風不度玉門關。
白日依山盡,黃河入海流。欲窮千里目,更上一層樓。
危樓高百尺,手可摘星辰。不敢高聲語,恐驚天上人。請輸入關鍵詞: 黃河
查詢結果:
青山依舊在,幾度夕陽紅。白發(fā)漁樵江渚上,慣看秋月春風。
一片孤城萬仞山,羌笛何須怨楊柳。春風不度玉門關。
白日依山盡,黃河入海流。欲窮千里目,更上一層樓。
危樓高百尺,手可摘星辰。不敢高聲語,恐驚天上人。
春風的結果還可以,但是黃河的結果就不對了。
如何使用其他模型進行 Embedding 呢?
只要啟動了任何一個模型,我們通過修改上面的 withModel("gemma")
中的參數(shù)即可使用其他模型,如果本地下載過 llama2 模型,就可以直接改這里的參數(shù),不需要重新執(zhí)行 ollama run llama2
命令,這個命令影響 chat 功能的使用,不影響 embedding。如果指定的模型不存在,會提示如下信息:
[404] Not Found - {"error":"model 'llama2' not found, try pulling it first"}
可以通過 ollama pull llama2
進行下載。
我們還可以搜專門的 embedding 模型,搜索時注意下圖搜索的位置:
頂部可以搜索全局的模型,不限于官方 library 下面的模型,搜索 embedding 結果如下:
我們可以試試 mofanke/dmeta-embedding-zh 這個模型,還有一個 mofanke/acge_text_embedding 是我聯(lián)系作者后,作者新提供的模型,后面文章也會以這個為例介紹如何將 huggingface 上的模型轉(zhuǎn)換為 ollama 的模型來使用。
使用命令 ollama pull mofanke/dmeta-embedding-zh
下載模型,這個模型不能通過 ollama run xxx
啟動,需要通過其他模型啟動后來引用,還使用前面的 ollama run gemma
,下載完模型后修改 withModel("mofanke/dmeta-embedding-zh")
,然后進行測試即可。
Ollama 的存在使得 Java 調(diào)用各種開源大模型變得更統(tǒng)一更簡單,就好比大部分商業(yè)大模型都參考 OpenAI 的 API,方便我們調(diào)用一樣。通過 Ollama 的擴展方式,還可以方便我們導入官方倉庫不存在的其他模型,后續(xù)文章會以 acge_text_embedding
為例介紹如何自定義基于 PyTorch 的模型。
到此這篇關于Spring AI 使用本地 Ollama Embeddings的文章就介紹到這了,更多相關Spring AI Ollama Embeddings內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章

Java獲取HttpServletRequest的三種方法詳解
HttpServletRequest接口是Servlet規(guī)范的一員,需要的朋友可以參考下

springcloud項目里application.yml不加載的坑及解決