利用ollama.com本地部署大模型及Java验证全攻略
一、引言
在人工智能浪潮中,大语言模型(LLMs)已然成为自然语言处理领域的中流砥柱。从日常的文本生成、智能客服,到专业领域的机器翻译、医疗诊断辅助,其应用之广泛令人瞩目。然而,随着模型规模膨胀,计算与数据需求飙升,本地部署LLMs成为一项极具挑战但意义重大的任务。ollama.com平台为我们提供了一个便捷实现本地大模型部署的途径,本文将详细介绍如何利用该平台进行部署,并通过Java代码对部署后的模型进行验证。
二、ollama平台简介
ollama致力于简化大语言模型的本地部署流程,它拥有丰富的模型资源库,囊括了各种类型与规模的大语言模型,能充分满足不同用户对模型功能与性能的多样化需求。同时,ollama具备高效的模型管理系统,无论是模型的下载、安装,还是后续的版本更新,都能轻松完成。其简洁易用的操作界面,让技术小白也能顺利上手大模型的本地部署工作。
三、本地部署准备工作
(一)硬件准备
- GPU或TPU:大语言模型运算量巨大,GPU(图形处理单元)凭借强大的并行处理能力,成为本地部署的得力助手。在挑选GPU时,CUDA核心数、GPU频率、显存大小及带宽等都是关键指标。例如,NVIDIA GeForce RTX 3090 GPU拥有24GB显存,能够流畅运行如LLaMA 30B这样的大型模型。若追求性价比,消费级的RTX 2080 Ti是不错之选;对于高性能需求场景,专业的NVIDIA A100或A800更为合适。若条件允许,TPU(张量处理单元)这种专为加速机器学习工作负载设计的定制处理器,在执行机器学习算法时能展现出更高效率与更低功耗。
- 内存:内存(RAM)需足够充裕以支撑模型运行,通常建议内存大小至少为GPU显存的两倍,以便在显存不足时作为补充。
- 存储:高速的SSD或NVMe固态硬盘不可或缺,它们能提供充足的读写速度与大容量存储空间。对于7B - 70B的大模型,推荐硬盘配置为4TB到12TB SSD。此外,还可采用数据分类和分层、存储虚拟化、数据压缩和去重等策略来优化存储,提升存储效率和性能。
- 网络带宽:在涉及大量数据传输和实时推理的场景中,网络带宽至关重要。它决定了数据传输速率,直接影响模型训练和推理效率。本地部署时,务必确保网络带宽能满足模型的数据需求。若模型需从远程数据库加载大量数据,高带宽网络连接必不可少。若部署环境涉及分布式计算,网络带宽和延迟将成为关键考量因素。实际应用中,可通过升级网络连接、使用负载均衡、数据压缩或内容分发网络(CDN)等方式提升带宽和网络性能。
(二)软件准备
- 操作系统选择
- Ubuntu Server:开源且拥有强大的社区支持,更新频繁,安全性高。适合需要频繁更新和最新技术支持的环境,在云计算和数据中心应用广泛。其丰富的软件库便于软件安装和管理,LTS(长期支持)版本可提供长达5年的安全更新和维护。
- CentOS:具备企业级稳定性,与RHEL(Red Hat Enterprise Linux)兼容,也有社区支持。适合对稳定性和长期支持有高要求的企业级应用,能以较低成本提供与RHEL相同的稳定性和性能,适合预算有限的项目。
- Windows Server:图形用户界面友好,与Microsoft产品生态集成度高,有商业支持。适用于需紧密集成Microsoft产品和服务的环境,如Office 365、Azure等,在Windows环境中部署和管理应用程序具有强大的集成和兼容性优势。
- FreeBSD:以高性能网络堆栈、稳定性和安全性著称。适合对吞吐量和可靠性要求高的网络应用,如Web服务器、邮件服务器等。
选择操作系统时,还需综合考虑技术支持、性能需求、安全性、成本以及与现有硬件和软件环境的兼容性等因素。
2. 深度学习框架准备(以Java为例)
Java本身并非传统意义上用于深度学习模型训练和部署的主流语言,但在模型服务调用和部分数据处理场景中能发挥重要作用。我们需要确保Java开发环境已搭建好,安装Java Development Kit(JDK),推荐使用较新的版本,如JDK 11或更高版本。可从Oracle官方网站或OpenJDK项目官网下载安装程序进行安装。安装完成后,通过命令java -version
检查是否安装成功。
3. 其他依赖库与工具配置
- Maven:作为Java项目的依赖管理工具,Maven通过pom.xml文件管理项目依赖,支持传递性依赖管理和依赖范围(如compile、test、provided等),能有效解决版本冲突问题。可从Maven官方网站下载安装包,解压后配置环境变量MAVEN_HOME
,并将%MAVEN_HOME%\bin
(Windows系统)或$MAVEN_HOME/bin
(Linux系统)添加到系统的PATH
变量中。通过命令mvn -version
验证安装是否成功。
- HTTP客户端库:为了在Java中与ollama部署的模型服务进行通信,我们需要引入一个HTTP客户端库,如Apache HttpClient。在pom.xml文件中添加如下依赖:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
- **JSON处理库**:由于模型服务的请求和响应数据通常以JSON格式传输,我们需要一个JSON处理库,如Jackson。在pom.xml文件中添加如下依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson -databind</artifactId>
<version>2.13.4</version>
</dependency>
四、使用ollama进行本地部署步骤
(一)ollama安装
- 打开终端,依据操作系统类型,在ollama官网查找对应的安装命令。若使用的是Ubuntu系统,安装命令可能如下:
curl -s https://ollama.com/install.sh | bash
- 执行安装命令后,系统将自动下载并安装ollama相关程序。安装过程中,可能需要输入系统密码以获取安装权限,按提示操作即可。
(二)模型选择与下载
- 安装完成后,在官网查看ollama提供的可用模型列表:
- 根据自身需求,选择合适的模型进行下载。例如,若要下载某一特定的大语言模型(假设模型名为“my - favorite - model”),使用以下命令:
ollama run my-favorite-model
下载过程中,进度条将显示下载的实时状态,网络状况良好的情况下,等待片刻即可完成模型下载。
(三)模型部署与配置
- 模型下载完成后,使用以下命令启动模型服务:
ollama run my-favorite-model
此命令将在本地启动所选模型的服务,默认情况下,模型服务将监听本地的某个端口(具体端口可在启动信息中查看,假设为11434)。
2. 若需要对模型进行一些个性化配置,如设置模型的最大输入长度、调整生成文本的参数等,可以编辑ollama的配置文件。配置文件的位置通常在用户主目录下的.ollama文件夹中(具体路径可能因操作系统而略有不同)。使用文本编辑器打开配置文件,根据ollama的配置文档说明,对相关参数进行修改。例如,若要设置模型生成文本的最大长度为512,可以找到对应的配置项并修改为:
{
"max_length": 512
}
修改完成后保存配置文件,重新启动模型服务使配置生效。
五、使用Java验证模型部署
(一)构建Java请求代码
在Java项目中创建一个类,用于向ollama部署的模型服务发送请求并处理响应。以下是一个示例代码:
package com.example.demo;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.io.IOException;
public class OllamaModelTester {
private static final String URL = "http://localhost:11434/api/generate";
private static final String MODEL_NAME = "deepseek-r1:7b";
private static final String PROMPT = "请描述一下美丽的春天";
public static void main(String[] args) {
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpPost httpPost = new HttpPost(URL);
httpPost.setHeader("Content-Type", "application/json");
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode requestBody = objectMapper.createObjectNode();
requestBody.put("model", MODEL_NAME);
requestBody.put("prompt", PROMPT);
requestBody.put("stream", false);
// 打印请求体
System.out.println("Request Body: " + requestBody);
StringEntity entity = new StringEntity(requestBody.toString(), "UTF-8");
httpPost.setEntity(entity);
HttpResponse response = httpClient.execute(httpPost);
int statusCode = response.getStatusLine().getStatusCode();
String responseBody = EntityUtils.toString(response.getEntity());
// 打印原始响应
System.out.println("Raw Response: " + responseBody);
if (statusCode != 200) {
System.err.println("请求失败,状态码: " + statusCode);
return;
}
// 解析响应
JsonNode jsonResponse = objectMapper.readTree(responseBody);
if (statusCode == 200) {
if (jsonResponse.has("response")) {
String rawResponse = jsonResponse.get("response").asText();
// 清理 <think> 标签
String cleanedText = rawResponse
.replaceAll("<think>.*?</think>", "") // 删除思考部分
.replaceAll("\n+", "\n") // 合并多余换行
.trim();
System.out.println("模型生成的文本: " + cleanedText);
} else if (jsonResponse.has("error")) {
System.err.println("API 错误: " + jsonResponse.get("error").asText());
} else {
System.err.println("未知响应格式");
}
} else {
System.err.println("请求失败,状态码: " + statusCode);
}
EntityUtils.consume(response.getEntity());
} catch (IOException e) {
e.printStackTrace();
}
}
}
预计输出
C:\Users\L\.jdks\corretto-17.0.15\bin\java.exe -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:55183,suspend=y,server=n --enable-preview -agentpath:C:\Users\L\AppData\Local\Temp\idea_libasyncProfiler_dll_temp_folder\libasyncProfiler.dll=version,jfr,event=wall,interval=10ms,cstack=no,file=C:\Users\L\IdeaSnapshots\OllamaModelTester_2025_05_08_142208.jfr,dbghelppath=C:\Users\L\AppData\Local\Temp\idea_dbghelp_dll_temp_folder\dbghelp.dll,log=C:\Users\L\AppData\Local\Temp\OllamaModelTester_2025_05_08_142208.jfr.log.txt,logLevel=DEBUG -javaagent:C:\Users\L\AppData\Local\JetBrains\IntelliJIdea2024.3\captureAgent\debugger-agent.jar -Dkotlinx.coroutines.debug.enable.creation.stack.trace=false -Ddebugger.agent.enable.coroutines=true -Dkotlinx.coroutines.debug.enable.flows.stack.trace=true -Dkotlinx.coroutines.debug.enable.mutable.state.flows.stack.trace=true -Dfile.encoding=UTF-8 -classpath "E:\Code\demo\target\classes;C:\Users\L\.m2\repository\org\springframework\boot\spring-boot-starter-webflux\3.4.5\spring-boot-starter-webflux-3.4.5.jar;C:\Users\L\.m2\repository\org\springframework\boot\spring-boot-starter\3.4.5\spring-boot-starter-3.4.5.jar;C:\Users\L\.m2\repository\org\springframework\boot\spring-boot\3.4.5\spring-boot-3.4.5.jar;C:\Users\L\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\3.4.5\spring-boot-autoconfigure-3.4.5.jar;C:\Users\L\.m2\repository\org\springframework\boot\spring-boot-starter-logging\3.4.5\spring-boot-starter-logging-3.4.5.jar;C:\Users\L\.m2\repository\ch\qos\logback\logback-classic\1.5.18\logback-classic-1.5.18.jar;C:\Users\L\.m2\repository\ch\qos\logback\logback-core\1.5.18\logback-core-1.5.18.jar;C:\Users\L\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.24.3\log4j-to-slf4j-2.24.3.jar;C:\Users\L\.m2\repository\org\apache\logging\log4j\log4j-api\2.24.3\log4j-api-2.24.3.jar;C:\Users\L\.m2\repository\org\slf4j\jul-to-slf4j\2.0.17\jul-to-slf4j-2.0.17.jar;C:\Users\L\.m2\repository\jakarta\annotation\jakarta.annotation-api\2.1.1\jakarta.annotation-api-2.1.1.jar;C:\Users\L\.m2\repository\org\yaml\snakeyaml\2.3\snakeyaml-2.3.jar;C:\Users\L\.m2\repository\org\springframework\boot\spring-boot-starter-json\3.4.5\spring-boot-starter-json-3.4.5.jar;C:\Users\L\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.18.3\jackson-datatype-jdk8-2.18.3.jar;C:\Users\L\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.18.3\jackson-module-parameter-names-2.18.3.jar;C:\Users\L\.m2\repository\org\springframework\boot\spring-boot-starter-reactor-netty\3.4.5\spring-boot-starter-reactor-netty-3.4.5.jar;C:\Users\L\.m2\repository\io\projectreactor\netty\reactor-netty-http\1.2.5\reactor-netty-http-1.2.5.jar;C:\Users\L\.m2\repository\io\netty\netty-codec-http\4.1.119.Final\netty-codec-http-4.1.119.Final.jar;C:\Users\L\.m2\repository\io\netty\netty-common\4.1.119.Final\netty-common-4.1.119.Final.jar;C:\Users\L\.m2\repository\io\netty\netty-buffer\4.1.119.Final\netty-buffer-4.1.119.Final.jar;C:\Users\L\.m2\repository\io\netty\netty-transport\4.1.119.Final\netty-transport-4.1.119.Final.jar;C:\Users\L\.m2\repository\io\netty\netty-codec\4.1.119.Final\netty-codec-4.1.119.Final.jar;C:\Users\L\.m2\repository\io\netty\netty-handler\4.1.119.Final\netty-handler-4.1.119.Final.jar;C:\Users\L\.m2\repository\io\netty\netty-codec-http2\4.1.119.Final\netty-codec-http2-4.1.119.Final.jar;C:\Users\L\.m2\repository\io\netty\netty-resolver-dns\4.1.119.Final\netty-resolver-dns-4.1.119.Final.jar;C:\Users\L\.m2\repository\io\netty\netty-resolver\4.1.119.Final\netty-resolver-4.1.119.Final.jar;C:\Users\L\.m2\repository\io\netty\netty-codec-dns\4.1.119.Final\netty-codec-dns-4.1.119.Final.jar;C:\Users\L\.m2\repository\io\netty\netty-resolver-dns-native-macos\4.1.119.Final\netty-resolver-dns-native-macos-4.1.119.Final-osx-x86_64.jar;C:\Users\L\.m2\repository\io\netty\netty-resolver-dns-classes-macos\4.1.119.Final\netty-resolver-dns-classes-macos-4.1.119.Final.jar;C:\Users\L\.m2\repository\io\netty\netty-transport-native-epoll\4.1.119.Final\netty-transport-native-epoll-4.1.119.Final-linux-x86_64.jar;C:\Users\L\.m2\repository\io\netty\netty-transport-native-unix-common\4.1.119.Final\netty-transport-native-unix-common-4.1.119.Final.jar;C:\Users\L\.m2\repository\io\netty\netty-transport-classes-epoll\4.1.119.Final\netty-transport-classes-epoll-4.1.119.Final.jar;C:\Users\L\.m2\repository\io\projectreactor\netty\reactor-netty-core\1.2.5\reactor-netty-core-1.2.5.jar;C:\Users\L\.m2\repository\io\netty\netty-handler-proxy\4.1.119.Final\netty-handler-proxy-4.1.119.Final.jar;C:\Users\L\.m2\repository\io\netty\netty-codec-socks\4.1.119.Final\netty-codec-socks-4.1.119.Final.jar;C:\Users\L\.m2\repository\org\springframework\spring-web\6.2.6\spring-web-6.2.6.jar;C:\Users\L\.m2\repository\org\springframework\spring-beans\6.2.6\spring-beans-6.2.6.jar;C:\Users\L\.m2\repository\io\micrometer\micrometer-observation\1.14.6\micrometer-observation-1.14.6.jar;C:\Users\L\.m2\repository\org\springframework\spring-webflux\6.2.6\spring-webflux-6.2.6.jar;C:\Users\L\.m2\repository\org\springframework\ai\spring-ai-starter-model-openai\1.0.0-M8\spring-ai-starter-model-openai-1.0.0-M8.jar;C:\Users\L\.m2\repository\org\springframework\ai\spring-ai-autoconfigure-model-openai\1.0.0-M8\spring-ai-autoconfigure-model-openai-1.0.0-M8.jar;C:\Users\L\.m2\repository\org\springframework\ai\spring-ai-autoconfigure-model-tool\1.0.0-M8\spring-ai-autoconfigure-model-tool-1.0.0-M8.jar;C:\Users\L\.m2\repository\org\springframework\ai\spring-ai-autoconfigure-retry\1.0.0-M8\spring-ai-autoconfigure-retry-1.0.0-M8.jar;C:\Users\L\.m2\repository\org\springframework\ai\spring-ai-autoconfigure-model-chat-observation\1.0.0-M8\spring-ai-autoconfigure-model-chat-observation-1.0.0-M8.jar;C:\Users\L\.m2\repository\org\springframework\ai\spring-ai-autoconfigure-model-embedding-observation\1.0.0-M8\spring-ai-autoconfigure-model-embedding-observation-1.0.0-M8.jar;C:\Users\L\.m2\repository\org\springframework\ai\spring-ai-autoconfigure-model-image-observation\1.0.0-M8\spring-ai-autoconfigure-model-image-observation-1.0.0-M8.jar;C:\Users\L\.m2\repository\org\springframework\ai\spring-ai-openai\1.0.0-M8\spring-ai-openai-1.0.0-M8.jar;C:\Users\L\.m2\repository\org\springframework\ai\spring-ai-client-chat\1.0.0-M8\spring-ai-client-chat-1.0.0-M8.jar;C:\Users\L\.m2\repository\org\springframework\ai\spring-ai-retry\1.0.0-M8\spring-ai-retry-1.0.0-M8.jar;C:\Users\L\.m2\repository\org\springframework\retry\spring-retry\2.0.11\spring-retry-2.0.11.jar;C:\Users\L\.m2\repository\io\rest-assured\json-path\5.5.1\json-path-5.5.1.jar;C:\Users\L\.m2\repository\org\apache\groovy\groovy-json\4.0.26\groovy-json-4.0.26.jar;C:\Users\L\.m2\repository\org\apache\groovy\groovy\4.0.26\groovy-4.0.26.jar;C:\Users\L\.m2\repository\io\rest-assured\rest-assured-common\5.5.1\rest-assured-common-5.5.1.jar;C:\Users\L\.m2\repository\org\apache\commons\commons-lang3\3.17.0\commons-lang3-3.17.0.jar;C:\Users\L\.m2\repository\org\springframework\spring-context-support\6.2.6\spring-context-support-6.2.6.jar;C:\Users\L\.m2\repository\org\slf4j\slf4j-api\2.0.17\slf4j-api-2.0.17.jar;C:\Users\L\.m2\repository\org\springframework\ai\spring-ai-autoconfigure-model-chat-client\1.0.0-M8\spring-ai-autoconfigure-model-chat-client-1.0.0-M8.jar;C:\Users\L\.m2\repository\org\springframework\ai\spring-ai-autoconfigure-model-chat-memory\1.0.0-M8\spring-ai-autoconfigure-model-chat-memory-1.0.0-M8.jar;C:\Users\L\.m2\repository\org\springframework\ai\spring-ai-model\1.0.0-M8\spring-ai-model-1.0.0-M8.jar;C:\Users\L\.m2\repository\org\springframework\ai\spring-ai-commons\1.0.0-M8\spring-ai-commons-1.0.0-M8.jar;C:\Users\L\.m2\repository\org\springframework\ai\spring-ai-template-st\1.0.0-M8\spring-ai-template-st-1.0.0-M8.jar;C:\Users\L\.m2\repository\com\alibaba\cloud\ai\spring-ai-alibaba-starter\1.0.0-M5.1\spring-ai-alibaba-starter-1.0.0-M5.1.jar;C:\Users\L\.m2\repository\com\alibaba\cloud\ai\spring-ai-alibaba-autoconfigure\1.0.0-M5.1\spring-ai-alibaba-autoconfigure-1.0.0-M5.1.jar;C:\Users\L\.m2\repository\com\alibaba\cloud\ai\spring-ai-alibaba-core\1.0.0-M5.1\spring-ai-alibaba-core-1.0.0-M5.1.jar;C:\Users\L\.m2\repository\com\alibaba\dashscope-sdk-java\2.15.1\dashscope-sdk-java-2.15.1.jar;C:\Users\L\.m2\repository\io\reactivex\rxjava2\rxjava\2.2.21\rxjava-2.2.21.jar;C:\Users\L\.m2\repository\com\google\code\gson\gson\2.11.0\gson-2.11.0.jar;C:\Users\L\.m2\repository\com\google\errorprone\error_prone_annotations\2.27.0\error_prone_annotations-2.27.0.jar;C:\Users\L\.m2\repository\org\jetbrains\kotlin\kotlin-stdlib-jdk8\1.9.25\kotlin-stdlib-jdk8-1.9.25.jar;C:\Users\L\.m2\repository\org\jetbrains\kotlin\kotlin-stdlib\1.9.25\kotlin-stdlib-1.9.25.jar;C:\Users\L\.m2\repository\org\jetbrains\annotations\13.0\annotations-13.0.jar;C:\Users\L\.m2\repository\org\jetbrains\kotlin\kotlin-stdlib-jdk7\1.9.25\kotlin-stdlib-jdk7-1.9.25.jar;C:\Users\L\.m2\repository\com\squareup\okio\okio\3.6.0\okio-3.6.0.jar;C:\Users\L\.m2\repository\com\squareup\okio\okio-jvm\3.6.0\okio-jvm-3.6.0.jar;C:\Users\L\.m2\repository\org\jetbrains\kotlin\kotlin-stdlib-common\1.9.25\kotlin-stdlib-common-1.9.25.jar;C:\Users\L\.m2\repository\com\squareup\okhttp3\logging-interceptor\4.12.0\logging-interceptor-4.12.0.jar;C:\Users\L\.m2\repository\com\squareup\okhttp3\okhttp-sse\4.12.0\okhttp-sse-4.12.0.jar;C:\Users\L\.m2\repository\org\springframework\ai\spring-ai-spring-boot-autoconfigure\1.0.0-M5\spring-ai-spring-boot-autoconfigure-1.0.0-M5.jar;C:\Users\L\.m2\repository\com\alibaba\nacos\nacos-client-mse-extension\1.0.4\nacos-client-mse-extension-1.0.4.jar;C:\Users\L\.m2\repository\com\aliyun\aliyun-java-sdk-core\4.5.17\aliyun-java-sdk-core-4.5.17.jar;C:\Users\L\.m2\repository\javax\xml\bind\jaxb-api\2.3.1\jaxb-api-2.3.1.jar;C:\Users\L\.m2\repository\javax\activation\javax.activation-api\1.2.0\javax.activation-api-1.2.0.jar;C:\Users\L\.m2\repository\org\jacoco\org.jacoco.agent\0.8.6\org.jacoco.agent-0.8.6-runtime.jar;C:\Users\L\.m2\repository\org\ini4j\ini4j\0.5.4\ini4j-0.5.4.jar;C:\Users\L\.m2\repository\io\opentracing\opentracing-api\0.33.0\opentracing-api-0.33.0.jar;C:\Users\L\.m2\repository\io\opentracing\opentracing-util\0.33.0\opentracing-util-0.33.0.jar;C:\Users\L\.m2\repository\io\opentracing\opentracing-noop\0.33.0\opentracing-noop-0.33.0.jar;C:\Users\L\.m2\repository\com\aliyun\aliyun-java-sdk-kms\2.16.3\aliyun-java-sdk-kms-2.16.3.jar;C:\Users\L\.m2\repository\com\aliyun\kms\kms-transfer-client\0.1.0\kms-transfer-client-0.1.0.jar;C:\Users\L\.m2\repository\com\aliyun\alibabacloud-dkms-gcs-sdk\0.2.8\alibabacloud-dkms-gcs-sdk-0.2.8.jar;C:\Users\L\.m2\repository\com\aliyun\alibabacloud-dkms-gcs-openapi-util\0.2.8\alibabacloud-dkms-gcs-openapi-util-0.2.8.jar;C:\Users\L\.m2\repository\com\aliyun\alibabacloud-dkms-gcs-openapi-credential\0.2.8\alibabacloud-dkms-gcs-openapi-credential-0.2.8.jar;C:\Users\L\.m2\repository\com\aliyun\alibabacloud-dkms-gcs-openapi\0.2.8\alibabacloud-dkms-gcs-openapi-0.2.8.jar;C:\Users\L\.m2\repository\com\google\protobuf\protobuf-java\4.0.0-rc-2\protobuf-java-4.0.0-rc-2.jar;C:\Users\L\.m2\repository\com\google\protobuf\protobuf-java-util\4.0.0-rc-2\protobuf-java-util-4.0.0-rc-2.jar;C:\Users\L\.m2\repository\com\google\guava\guava\29.0-android\guava-29.0-android.jar;C:\Users\L\.m2\repository\com\google\guava\failureaccess\1.0.1\failureaccess-1.0.1.jar;C:\Users\L\.m2\repository\com\google\guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar;C:\Users\L\.m2\repository\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2.jar;C:\Users\L\.m2\repository\org\checkerframework\checker-compat-qual\2.5.5\checker-compat-qual-2.5.5.jar;C:\Users\L\.m2\repository\com\google\j2objc\j2objc-annotations\1.3\j2objc-annotations-1.3.jar;C:\Users\L\.m2\repository\com\alibaba\cloud\spring-alibaba-nacos-config\2023.0.1.3\spring-alibaba-nacos-config-2023.0.1.3.jar;C:\Users\L\.m2\repository\com\alibaba\nacos\nacos-client\2.4.2\nacos-client-2.4.2.jar;C:\Users\L\.m2\repository\com\alibaba\nacos\nacos-auth-plugin\2.4.2\nacos-auth-plugin-2.4.2.jar;C:\Users\L\.m2\repository\com\alibaba\nacos\nacos-encryption-plugin\2.4.2\nacos-encryption-plugin-2.4.2.jar;C:\Users\L\.m2\repository\com\alibaba\nacos\nacos-logback-adapter-12\2.4.2\nacos-logback-adapter-12-2.4.2.jar;C:\Users\L\.m2\repository\com\alibaba\nacos\logback-adapter\1.1.3\logback-adapter-1.1.3.jar;C:\Users\L\.m2\repository\com\alibaba\nacos\nacos-log4j2-adapter\2.4.2\nacos-log4j2-adapter-2.4.2.jar;C:\Users\L\.m2\repository\org\apache\httpcomponents\httpasyncclient\4.1.5\httpasyncclient-4.1.5.jar;C:\Users\L\.m2\repository\org\apache\httpcomponents\httpcore-nio\4.4.16\httpcore-nio-4.4.16.jar;C:\Users\L\.m2\repository\io\prometheus\simpleclient\0.16.0\simpleclient-0.16.0.jar;C:\Users\L\.m2\repository\io\prometheus\simpleclient_tracer_otel\0.16.0\simpleclient_tracer_otel-0.16.0.jar;C:\Users\L\.m2\repository\io\prometheus\simpleclient_tracer_common\0.16.0\simpleclient_tracer_common-0.16.0.jar;C:\Users\L\.m2\repository\io\prometheus\simpleclient_tracer_otel_agent\0.16.0\simpleclient_tracer_otel_agent-0.16.0.jar;C:\Users\L\.m2\repository\com\squareup\okhttp3\okhttp\4.12.0\okhttp-4.12.0.jar;C:\Users\L\.m2\repository\com\aliyun\gpdb20160503\3.0.0\gpdb20160503-3.0.0.jar;C:\Users\L\.m2\repository\com\aliyun\tea-util\0.2.23\tea-util-0.2.23.jar;C:\Users\L\.m2\repository\com\aliyun\tea-openapi\0.3.6\tea-openapi-0.3.6.jar;C:\Users\L\.m2\repository\com\aliyun\credentials-java\0.3.10\credentials-java-0.3.10.jar;C:\Users\L\.m2\repository\com\sun\xml\bind\jaxb-core\4.0.5\jaxb-core-4.0.5.jar;C:\Users\L\.m2\repository\org\eclipse\angus\angus-activation\2.0.2\angus-activation-2.0.2.jar;C:\Users\L\.m2\repository\com\sun\xml\bind\jaxb-impl\4.0.5\jaxb-impl-4.0.5.jar;C:\Users\L\.m2\repository\com\aliyun\alibabacloud-gateway-spi\0.0.2\alibabacloud-gateway-spi-0.0.2.jar;C:\Users\L\.m2\repository\com\aliyun\tea-xml\0.1.6\tea-xml-0.1.6.jar;C:\Users\L\.m2\repository\com\aliyun\endpoint-util\0.0.7\endpoint-util-0.0.7.jar;C:\Users\L\.m2\repository\com\aliyun\tea\1.2.9\tea-1.2.9.jar;C:\Users\L\.m2\repository\com\aliyun\openapiutil\0.2.1\openapiutil-0.2.1.jar;C:\Users\L\.m2\repository\org\bouncycastle\bcpkix-jdk15on\1.70\bcpkix-jdk15on-1.70.jar;C:\Users\L\.m2\repository\org\bouncycastle\bcutil-jdk15on\1.70\bcutil-jdk15on-1.70.jar;C:\Users\L\.m2\repository\com\aliyun\oss-client\3.0.3\oss-client-3.0.3.jar;C:\Users\L\.m2\repository\com\aliyun\tea-rpc-util\0.1.3\tea-rpc-util-0.1.3.jar;C:\Users\L\.m2\repository\com\aliyun\openplatform20191219\5.0.1\openplatform20191219-5.0.1.jar;C:\Users\L\.m2\repository\com\aliyun\tea-rpc\0.1.2\tea-rpc-0.1.2.jar;C:\Users\L\.m2\repository\com\aliyun\oss-util\1.0.2\oss-util-1.0.2.jar;C:\Users\L\.m2\repository\org\dom4j\dom4j\2.1.3\dom4j-2.1.3.jar;C:\Users\L\.m2\repository\com\aliyun\tea-fileform\0.0.3\tea-fileform-0.0.3.jar;C:\Users\L\.m2\repository\com\aliyun\aliyun-sdk-ha3engine-vector\1.1.8\aliyun-sdk-ha3engine-vector-1.1.8.jar;C:\Users\L\.m2\repository\com\aliyun\darabonba-string\0.0.5\darabonba-string-0.0.5.jar;C:\Users\L\.m2\repository\com\aliyun\darabonba-encode-util\0.0.2\darabonba-encode-util-0.0.2.jar;C:\Users\L\.m2\repository\org\bouncycastle\bcprov-jdk15on\1.68\bcprov-jdk15on-1.68.jar;C:\Users\L\.m2\repository\com\aliyun\darabonba-map\0.0.1\darabonba-map-0.0.1.jar;C:\Users\L\.m2\repository\com\alibaba\fastjson\1.2.75\fastjson-1.2.75.jar;C:\Users\L\.m2\repository\org\apache\opennlp\opennlp-tools\2.3.3\opennlp-tools-2.3.3.jar;C:\Users\L\.m2\repository\org\springframework\boot\spring-boot-starter-websocket\3.4.5\spring-boot-starter-websocket-3.4.5.jar;C:\Users\L\.m2\repository\org\springframework\boot\spring-boot-starter-web\3.4.5\spring-boot-starter-web-3.4.5.jar;C:\Users\L\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\3.4.5\spring-boot-starter-tomcat-3.4.5.jar;C:\Users\L\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\10.1.40\tomcat-embed-core-10.1.40.jar;C:\Users\L\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\10.1.40\tomcat-embed-el-10.1.40.jar;C:\Users\L\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\10.1.40\tomcat-embed-websocket-10.1.40.jar;C:\Users\L\.m2\repository\org\springframework\spring-webmvc\6.2.6\spring-webmvc-6.2.6.jar;C:\Users\L\.m2\repository\org\springframework\spring-messaging\6.2.6\spring-messaging-6.2.6.jar;C:\Users\L\.m2\repository\org\springframework\spring-websocket\6.2.6\spring-websocket-6.2.6.jar;C:\Users\L\.m2\repository\org\springframework\ai\spring-ai-core\1.0.0-M6\spring-ai-core-1.0.0-M6.jar;C:\Users\L\.m2\repository\com\fasterxml\jackson\module\jackson-module-jsonSchema\2.18.3\jackson-module-jsonSchema-2.18.3.jar;C:\Users\L\.m2\repository\javax\validation\validation-api\1.1.0.Final\validation-api-1.1.0.Final.jar;C:\Users\L\.m2\repository\io\swagger\core\v3\swagger-annotations\2.2.25\swagger-annotations-2.2.25.jar;C:\Users\L\.m2\repository\com\github\victools\jsonschema-module-swagger-2\4.37.0\jsonschema-module-swagger-2-4.37.0.jar;C:\Users\L\.m2\repository\org\antlr\ST4\4.3.4\ST4-4.3.4.jar;C:\Users\L\.m2\repository\org\antlr\antlr-runtime\3.5.3\antlr-runtime-3.5.3.jar;C:\Users\L\.m2\repository\org\antlr\antlr4-runtime\4.13.1\antlr4-runtime-4.13.1.jar;C:\Users\L\.m2\repository\org\springframework\spring-context\6.2.6\spring-context-6.2.6.jar;C:\Users\L\.m2\repository\org\springframework\spring-aop\6.2.6\spring-aop-6.2.6.jar;C:\Users\L\.m2\repository\org\springframework\spring-expression\6.2.6\spring-expression-6.2.6.jar;C:\Users\L\.m2\repository\io\micrometer\micrometer-core\1.14.6\micrometer-core-1.14.6.jar;C:\Users\L\.m2\repository\io\micrometer\micrometer-commons\1.14.6\micrometer-commons-1.14.6.jar;C:\Users\L\.m2\repository\org\hdrhistogram\HdrHistogram\2.2.2\HdrHistogram-2.2.2.jar;C:\Users\L\.m2\repository\org\latencyutils\LatencyUtils\2.0.3\LatencyUtils-2.0.3.jar;C:\Users\L\.m2\repository\io\micrometer\context-propagation\1.1.3\context-propagation-1.1.3.jar;C:\Users\L\.m2\repository\com\knuddels\jtokkit\1.1.0\jtokkit-1.1.0.jar;C:\Users\L\.m2\repository\com\github\victools\jsonschema-generator\4.37.0\jsonschema-generator-4.37.0.jar;C:\Users\L\.m2\repository\com\fasterxml\classmate\1.7.0\classmate-1.7.0.jar;C:\Users\L\.m2\repository\com\github\victools\jsonschema-module-jackson\4.37.0\jsonschema-module-jackson-4.37.0.jar;C:\Users\L\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.18.3\jackson-datatype-jsr310-2.18.3.jar;C:\Users\L\.m2\repository\io\projectreactor\reactor-core\3.7.5\reactor-core-3.7.5.jar;C:\Users\L\.m2\repository\org\reactivestreams\reactive-streams\1.0.4\reactive-streams-1.0.4.jar;C:\Users\L\.m2\repository\com\mysql\mysql-connector-j\9.1.0\mysql-connector-j-9.1.0.jar;C:\Users\L\.m2\repository\org\projectlombok\lombok\1.18.38\lombok-1.18.38.jar;C:\Users\L\.m2\repository\jakarta\xml\bind\jakarta.xml.bind-api\4.0.2\jakarta.xml.bind-api-4.0.2.jar;C:\Users\L\.m2\repository\jakarta\activation\jakarta.activation-api\2.1.3\jakarta.activation-api-2.1.3.jar;C:\Users\L\.m2\repository\org\springframework\spring-core\6.2.6\spring-core-6.2.6.jar;C:\Users\L\.m2\repository\org\springframework\spring-jcl\6.2.6\spring-jcl-6.2.6.jar;C:\Users\L\.m2\repository\org\apache\httpcomponents\httpclient\4.5.13\httpclient-4.5.13.jar;C:\Users\L\.m2\repository\org\apache\httpcomponents\httpcore\4.4.16\httpcore-4.4.16.jar;C:\Users\L\.m2\repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;C:\Users\L\.m2\repository\commons-codec\commons-codec\1.17.2\commons-codec-1.17.2.jar;C:\Users\L\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.15.3\jackson-databind-2.15.3.jar;C:\Users\L\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.18.3\jackson-annotations-2.18.3.jar;C:\Users\L\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.18.3\jackson-core-2.18.3.jar;D:\Environment\JetBrains\IntelliJ IDEA 2024.3.5\lib\idea_rt.jar" com.example.demo.OllamaModelTester
Connected to the target VM, address: '127.0.0.1:55183', transport: 'socket'
Request Body: {"model":"deepseek-r1:7b","prompt":"请描述一下美丽的春天","stream":false}
Raw Response: {"model":"deepseek-r1:7b","created_at":"2025-05-08T06:22:48.0080688Z","response":"\u003cthink\u003e\n嗯,用户让我描述美丽的春天。首先,我得想想春天有哪些典型的特征。天气变暖和了,花开了,鸟儿叫醒了,这些都是关键点。\n\n然后,颜色方面,绿色很鲜明,比如新芽、树叶,还有各种花朵的颜色,从粉红到紫红不等。阳光透过云层洒下来,给人一种温暖的感觉。\n\n接下来是四季变换带来的生机,比如草长得更绿了,花丛中能看到露珠,空气中充满了花香,这些细节能让描述更生动。\n\n还有动物方面,春天是鸟儿的天堂,麻雀、燕子都在飞来飞去,蜜蜂忙着采蜜,这些元素能增加画面感。\n\n最后,整体氛围应该是生机勃勃、充满活力和美丽。把这些点整合起来,就能形成一个完整的美丽的春天的形象。\n\u003c/think\u003e\n\n春天来了!这是一个令人心旷神怡的季节。微凉的春风拂过面颊,带着泥土的芬芳;天蓝得仿佛被洗过,云朵飘浮在空中,像一块块柔软的白云;阳光穿过薄云层,洒下斑驳的光影,在地上投下无数个小光点。\n\n空气中弥漫着花香,各种植物都伸展着枝条,迎接着温暖的到来。小草从土里探出头来,嫩绿的叶子在微风中轻轻摇曳;各色花朵竞相开放,红的、粉的、黄的、紫的,仿佛大自然调色盘上最美丽的画笔;蜜蜂在花间穿梭,蝴蝶翩翩起舞, everything seems to be alive and full of vitality.\n\n春天不仅带来了视觉上的美好,更充满了生命力。无论是鸟儿的歌唱,还是动物的活跃,都在诉说着生命的顽强与美丽。这是一个让人忘却烦恼、沉醉其中的季节,每一丝风都是温柔的,每一片叶子都是欢迎的。\n\n春天是大自然的馈赠者,她用最温柔的方式,让世界重新苏醒,展现出新的生机与活力。","done":true,"done_reason":"stop","context":[151644,14880,53481,100158,105664,105303,151645,151648,198,106287,3837,20002,104029,53481,105664,105303,1773,101140,3837,35946,49828,105839,105303,104719,107784,104363,1773,104307,74040,99856,33108,34187,3837,99232,101467,3837,100462,99261,99882,115836,3837,108544,99936,27442,3407,101889,3837,102284,99522,3837,100706,99165,106259,3837,101912,16628,106219,5373,114171,3837,100626,100646,112684,108901,3837,45181,99742,99425,26939,101168,99425,16530,49567,1773,104166,108152,99718,99371,102737,100194,3837,117242,104607,104336,3407,104326,20412,109080,114714,102220,108582,3837,101912,99808,108504,33126,99679,34187,3837,99232,101721,15946,109523,99760,100088,3837,113798,106890,99232,99662,3837,100001,99338,101487,99258,53481,33126,106267,3407,100626,101239,99522,3837,105303,20412,100462,99261,9370,106997,3837,99965,103064,5373,104260,44729,102070,99723,36407,99723,85336,3837,116626,113133,99433,100576,3837,100001,102268,26232,100649,102650,98650,3407,100161,3837,101932,104556,104583,108582,118288,5373,102216,104523,33108,101280,1773,113841,27442,102102,99793,3837,104077,101894,46944,105896,105664,105303,108565,8997,151649,271,105303,101161,6313,105464,99738,102677,111520,99315,106433,9370,105419,1773,48934,102058,9370,110067,112419,38182,27091,103848,3837,104038,114411,9370,102727,102261,24968,35727,100400,49828,104700,99250,99634,38182,3837,99718,100978,104712,100825,18493,105438,3837,65101,104474,99922,109278,9370,107965,24968,104166,109239,101264,99718,99371,3837,102737,16872,100876,103501,9370,118383,96050,102605,79072,16872,102446,110026,99225,27442,3407,113798,113083,99164,99232,99662,3837,100646,104155,71268,100867,76313,99164,101324,38989,3837,99641,102524,104607,108985,1773,30709,99808,45181,72990,69249,99633,20221,64355,36407,3837,105347,99679,9370,110365,18493,48934,99208,15946,102770,100307,119607,24968,99200,38035,112684,99640,48921,100713,3837,99425,9370,5373,99742,9370,5373,99789,9370,5373,101168,9370,3837,104700,108479,47872,38035,99665,17447,31235,105664,54623,100041,24968,116626,18493,99232,17881,112153,3837,109189,119496,119496,71618,100066,3837,4297,4977,311,387,13675,323,2480,315,74616,382,105303,99902,104923,104916,101913,101483,3837,33126,106890,112157,1773,102215,100462,99261,9370,113375,3837,99998,101239,9370,105266,3837,102070,99482,107279,107739,110981,57218,101280,1773,105464,103973,99980,99786,106227,5373,99947,102587,90919,9370,105419,3837,104588,99691,99208,100132,106665,9370,3837,73157,104195,110365,100132,100437,9370,3407,105303,20412,108479,9370,100883,101568,28946,3837,99517,11622,31235,106665,101990,3837,99258,99489,70361,99908,99951,3837,112227,100676,108582,57218,104523,1773],"total_duration":38351505400,"load_duration":26984300,"prompt_eval_count":8,"prompt_eval_duration":249000000,"eval_count":421,"eval_duration":38074000000}
模型生成的文本: <think>
嗯,用户让我描述美丽的春天。首先,我得想想春天有哪些典型的特征。天气变暖和了,花开了,鸟儿叫醒了,这些都是关键点。
然后,颜色方面,绿色很鲜明,比如新芽、树叶,还有各种花朵的颜色,从粉红到紫红不等。阳光透过云层洒下来,给人一种温暖的感觉。
接下来是四季变换带来的生机,比如草长得更绿了,花丛中能看到露珠,空气中充满了花香,这些细节能让描述更生动。
还有动物方面,春天是鸟儿的天堂,麻雀、燕子都在飞来飞去,蜜蜂忙着采蜜,这些元素能增加画面感。
最后,整体氛围应该是生机勃勃、充满活力和美丽。把这些点整合起来,就能形成一个完整的美丽的春天的形象。
</think>
春天来了!这是一个令人心旷神怡的季节。微凉的春风拂过面颊,带着泥土的芬芳;天蓝得仿佛被洗过,云朵飘浮在空中,像一块块柔软的白云;阳光穿过薄云层,洒下斑驳的光影,在地上投下无数个小光点。
空气中弥漫着花香,各种植物都伸展着枝条,迎接着温暖的到来。小草从土里探出头来,嫩绿的叶子在微风中轻轻摇曳;各色花朵竞相开放,红的、粉的、黄的、紫的,仿佛大自然调色盘上最美丽的画笔;蜜蜂在花间穿梭,蝴蝶翩翩起舞, everything seems to be alive and full of vitality.
春天不仅带来了视觉上的美好,更充满了生命力。无论是鸟儿的歌唱,还是动物的活跃,都在诉说着生命的顽强与美丽。这是一个让人忘却烦恼、沉醉其中的季节,每一丝风都是温柔的,每一片叶子都是欢迎的。
春天是大自然的馈赠者,她用最温柔的方式,让世界重新苏醒,展现出新的生机与活力。
Disconnected from the target VM, address: '127.0.0.1:55183', transport: 'socket'
Process finished with exit code 0
(二)运行Java代码进行验证
在命令行中进入Java项目所在目录,使用Maven命令进行编译和运行:
mvn clean compile
mvn exec:java -Dexec.mainClass="OllamaModelTester"
运行代码后,控制台将输出模型根据输入提示词“请描述一下美丽的春天”生成的文本内容。通过这样的验证,可确认模型是否正常工作以及生成的文本是否符合预期。
六、总结
通过ollama.com平台,我们能够相对轻松地完成大语言模型的本地部署工作。在部署过程中,充分做好硬件和软件的准备工作是关键,合理选择硬件设备和配置软件环境能为模型的高效运行提供保障。而利用Java进行模型验证,为我们提供了一种在Java生态系统中与本地部署模型交互的方式,无论是将模型集成到现有Java应用中,还是进行简单的测试验证,都具有重要意义。随着技术的不断发展,相信本地部署大语言模型将在更多领域发挥重要作用,为我们的工作和生活带来更多便利和创新。