Windows 安装 Ollama :
步骤 1:下载并安装 Ollama
官网:奥拉马 点击下载 选择windows版本。
双击安装包
点击【Install】(注意:安装包是直接安装在C盘的,并不支持更改路径,因此C盘的空间必须要至少大于5GB的空余空间)
等待安装完成
步骤2:部署模型
版本:1.5b,适用于一般文字编辑使用(C盘至少需要1.1GB空余空间)
ollama run deepseek-r1:1.5b
版本:7b,DeepSeek的第一代推理模型,性能与OpenAl-01相当,包括从基于Llama和Qwen的DeepSeek-R1中提取的六个密集模型(C盘至少需要4.7GB空余空间)
ollama run deepseek-r1:7b
版本:8b,(C盘至少需要4.9GB空余空间)
ollama run deepseek-r1:8b
版本:14b,(C盘至少需要9GB空余空间)
ollama run deepseek-r1:14b
版本:32b,(C盘至少需要20GB空余空间)
ollama run deepseek-r1:32b
版本:70b,(C盘至少需要43GB空余空间)
ollama run deepseek-r1:70b
版本:671b,(C盘至少需要404GB空余空间)
ollama run deepseek-r1:671b
按win +R 键 打开对话框 输入cmd 打开终端,根据自己的电脑配置,选择对应的deepseek-r模型。
部署完成
如何重新进入对话框,按win +R 键 打开对话框 输入cmd 打开终端,
输入:ollama list 查看安装的模型 然后 ollama run 模型
open webui 图形化部署
步骤1:环境配置
下载open webui 官网:🏡 首页 |打开 WebUI
python 下载官网:适用于 Windows 的 Python 版本 |Python.org
Node.js下载官网:下载 | Node.js 中文网
可以百度搜索python pip Node.js的下载教程,这里就不详细解释了。
步骤2:安装部署open-webui 安装 (推荐)uv
#下载安装脚本install.ps1
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
#运行 Open WebUI
$env:DATA_DIR="C:\open-webui\data"; uvx --python 3.11 open-webui@latest serve
#安装 Open WebUI
pip install open-webui
#启动 Open WebUI
open-webui serve
#更新 Open WebUI
pip install --upgrade open-webui
列出 ollama 模型
ollama list
查看 Python 版本。
python --version
查看 pip 版本
pip --version
查看 open-webui 包的详细信息。
pip show open-webui
补充:如果上述方法不行 有报错可以尝试下面的方法。
首先保证安装了python pip Node.js 。
步骤1 创建 uv-installer.ps1 脚本内容如下:
# Licensed under the MIT license
# <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
# option. This file may not be copied, modified, or distributed
# except according to those terms.<#
.SYNOPSISThe installer for uv 0.5.29.DESCRIPTIONThis script detects what platform you're on and fetches an appropriate archive from
https://github.com/astral-sh/uv/releases/download/0.5.29
then unpacks the binaries and installs them to the first of the following locations$env:XDG_BIN_HOME$env:XDG_DATA_HOME/../bin$HOME/.local/binIt will then add that dir to PATH by editing your Environment.Path registry key.PARAMETER ArtifactDownloadUrl
The URL of the directory where artifacts can be fetched from.PARAMETER NoModifyPath
Don't add the install directory to PATH.PARAMETER Help
Print help#>param ([Parameter(HelpMessage = "The URL of the directory where artifacts can be fetched from")][string]$ArtifactDownloadUrl = 'https://github.com/astral-sh/uv/releases/download/0.5.29',[Parameter(HelpMessage = "Don't add the install directory to PATH")][switch]$NoModifyPath,[Parameter(HelpMessage = "Print Help")][switch]$Help
)$app_name = 'uv'
$app_version = '0.5.29'
if ($env:UV_INSTALLER_GHE_BASE_URL) {$installer_base_url = $env:UV_INSTALLER_GHE_BASE_URL
} elseif ($env:UV_INSTALLER_GITHUB_BASE_URL) {$installer_base_url = $env:UV_INSTALLER_GITHUB_BASE_URL
} else {$installer_base_url = "https://github.com"
}
if ($env:INSTALLER_DOWNLOAD_URL) {$ArtifactDownloadUrl = $env:INSTALLER_DOWNLOAD_URL
} else {$ArtifactDownloadUrl = "$installer_base_url/astral-sh/uv/releases/download/0.5.29"
}$receipt = @"
{"binaries":["CARGO_DIST_BINS"],"binary_aliases":{},"cdylibs":["CARGO_DIST_DYLIBS"],"cstaticlibs":["CARGO_DIST_STATICLIBS"],"install_layout":"unspecified","install_prefix":"AXO_INSTALL_PREFIX","modify_path":true,"provider":{"source":"cargo-dist","version":"0.28.0"},"source":{"app_name":"uv","name":"uv","owner":"astral-sh","release_type":"github"},"version":"0.5.29"}
"@
if ($env:XDG_CONFIG_HOME) {$receipt_home = "${env:XDG_CONFIG_HOME}\uv"
} else {$receipt_home = "${env:LOCALAPPDATA}\uv"
}if ($env:UV_DISABLE_UPDATE) {$install_updater = $false
} else {$install_updater = $true
}if ($NoModifyPath) {Write-Information "-NoModifyPath has been deprecated; please set UV_NO_MODIFY_PATH=1 in the environment"
}if ($env:UV_NO_MODIFY_PATH) {$NoModifyPath = $true
}$unmanaged_install = $env:UV_UNMANAGED_INSTALLif ($unmanaged_install) {$NoModifyPath = $true$install_updater = $false
}function Install-Binary($install_args) {if ($Help) {Get-Help $PSCommandPath -DetailedExit}Initialize-Environment# Platform info injected by dist$platforms = @{"aarch64-pc-windows-gnu" = @{"artifact_name" = "uv-aarch64-pc-windows-msvc.zip""bins" = @("uv.exe", "uvx.exe")"libs" = @()"staticlibs" = @()"zip_ext" = ".zip""aliases" = @{}"aliases_json" = '{}'}"aarch64-pc-windows-msvc" = @{"artifact_name" = "uv-aarch64-pc-windows-msvc.zip""bins" = @("uv.exe", "uvx.exe")"libs" = @()"staticlibs" = @()"zip_ext" = ".zip""aliases" = @{}"aliases_json" = '{}'}"i686-pc-windows-gnu" = @{"artifact_name" = "uv-i686-pc-windows-msvc.zip""bins" = @("uv.exe", "uvx.exe")"libs" = @()"staticlibs" = @()"zip_ext" = ".zip""aliases" = @{}"aliases_json" = '{}'}"i686-pc-windows-msvc" = @{"artifact_name" = "uv-i686-pc-windows-msvc.zip""bins" = @("uv.exe", "uvx.exe")"libs" = @()"staticlibs" = @()"zip_ext" = ".zip""aliases" = @{}"aliases_json" = '{}'}"x86_64-pc-windows-gnu" = @{"artifact_name" = "uv-x86_64-pc-windows-msvc.zip""bins" = @("uv.exe", "uvx.exe")"libs" = @()"staticlibs" = @()"zip_ext" = ".zip""aliases" = @{}"aliases_json" = '{}'}"x86_64-pc-windows-msvc" = @{"artifact_name" = "uv-x86_64-pc-windows-msvc.zip""bins" = @("uv.exe", "uvx.exe")"libs" = @()"staticlibs" = @()"zip_ext" = ".zip""aliases" = @{}"aliases_json" = '{}'}}$fetched = Download "$ArtifactDownloadUrl" $platforms# FIXME: add a flag that lets the user not do this steptry {Invoke-Installer -artifacts $fetched -platforms $platforms "$install_args"} catch {throw @"
We encountered an error trying to perform the installation;
please review the error messages below.$_
"@}
}function Get-TargetTriple($platforms) {$double = Get-Archif ($platforms.Contains("$double-msvc")) {return "$double-msvc"} else {return "$double-gnu"}
}function Get-Arch() {try {# NOTE: this might return X64 on ARM64 Windows, which is OK since emulation is available.# It works correctly starting in PowerShell Core 7.3 and Windows PowerShell in Win 11 22H2.# Ideally this would just be# [System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture# but that gets a type from the wrong assembly on Windows PowerShell (i.e. not Core)$a = [System.Reflection.Assembly]::LoadWithPartialName("System.Runtime.InteropServices.RuntimeInformation")$t = $a.GetType("System.Runtime.InteropServices.RuntimeInformation")$p = $t.GetProperty("OSArchitecture")# Possible OSArchitecture Values: https://learn.microsoft.com/dotnet/api/system.runtime.interopservices.architecture# Rust supported platforms: https://doc.rust-lang.org/stable/rustc/platform-support.htmlswitch ($p.GetValue($null).ToString()){"X86" { return "i686-pc-windows" }"X64" { return "x86_64-pc-windows" }"Arm" { return "thumbv7a-pc-windows" }"Arm64" { return "aarch64-pc-windows" }}} catch {# The above was added in .NET 4.7.1, so Windows PowerShell in versions of Windows# prior to Windows 10 v1709 may not have this API.Write-Verbose "Get-TargetTriple: Exception when trying to determine OS architecture."Write-Verbose $_}# This is available in .NET 4.0. We already checked for PS 5, which requires .NET 4.5.Write-Verbose("Get-TargetTriple: falling back to Is64BitOperatingSystem.")if ([System.Environment]::Is64BitOperatingSystem) {return "x86_64-pc-windows"} else {return "i686-pc-windows"}
}function Download($download_url, $platforms) {$arch = Get-TargetTriple $platformsif (-not $platforms.ContainsKey($arch)) {$platforms_json = ConvertTo-Json $platformsthrow "ERROR: could not find binaries for this platform. Last platform tried: $arch platform info: $platforms_json"}# Lookup what we expect this platform to look like$info = $platforms[$arch]$zip_ext = $info["zip_ext"]$bin_names = $info["bins"]$lib_names = $info["libs"]$staticlib_names = $info["staticlibs"]$artifact_name = $info["artifact_name"]# Make a new temp dir to unpack things to$tmp = New-Temp-Dir$dir_path = "$tmp\$app_name$zip_ext"# Download and unpack!$url = "$download_url/$artifact_name"Write-Information "Downloading $app_name $app_version ($arch)"Write-Verbose " from $url"Write-Verbose " to $dir_path"$wc = New-Object Net.Webclient$wc.downloadFile($url, $dir_path)Write-Verbose "Unpacking to $tmp"# Select the tool to unpack the files with.## As of windows 10(?), powershell comes with tar preinstalled, but in practice# it only seems to support .tar.gz, and not xz/zstd. Still, we should try to# forward all tars to it in case the user has a machine that can handle it!switch -Wildcard ($zip_ext) {".zip" {Expand-Archive -Path $dir_path -DestinationPath "$tmp";Break}".tar.*" {tar xf $dir_path --strip-components 1 -C "$tmp";Break}Default {throw "ERROR: unknown archive format $zip_ext"}}# Let the next step know what to copy$bin_paths = @()foreach ($bin_name in $bin_names) {Write-Verbose " Unpacked $bin_name"$bin_paths += "$tmp\$bin_name"}$lib_paths = @()foreach ($lib_name in $lib_names) {Write-Verbose " Unpacked $lib_name"$lib_paths += "$tmp\$lib_name"}$staticlib_paths = @()foreach ($lib_name in $staticlib_names) {Write-Verbose " Unpacked $lib_name"$staticlib_paths += "$tmp\$lib_name"}if (($null -ne $info["updater"]) -and $install_updater) {$updater_id = $info["updater"]["artifact_name"]$updater_url = "$download_url/$updater_id"$out_name = "$tmp\uv-update.exe"$wc.downloadFile($updater_url, $out_name)$bin_paths += $out_name}return @{"bin_paths" = $bin_paths"lib_paths" = $lib_paths"staticlib_paths" = $staticlib_paths}
}function Invoke-Installer($artifacts, $platforms) {# Replaces the placeholder binary entry with the actual list of binaries$arch = Get-TargetTriple $platformsif (-not $platforms.ContainsKey($arch)) {$platforms_json = ConvertTo-Json $platformsthrow "ERROR: could not find binaries for this platform. Last platform tried: $arch platform info: $platforms_json"}$info = $platforms[$arch]# Forces the install to occur at this path, not the default$force_install_dir = $null$install_layout = "unspecified"# Check the newer app-specific variable before falling back# to the older generic oneif (($env:UV_INSTALL_DIR)) {$force_install_dir = $env:UV_INSTALL_DIR$install_layout = "flat"} elseif (($env:CARGO_DIST_FORCE_INSTALL_DIR)) {$force_install_dir = $env:CARGO_DIST_FORCE_INSTALL_DIR$install_layout = "flat"} elseif ($unmanaged_install) {$force_install_dir = $unmanaged_install$install_layout = "flat"}# Check if the install layout should be changed from `flat` to `cargo-home`# for backwards compatible updates of applications that switched layouts.if (($force_install_dir) -and ($install_layout -eq "flat")) {# If the install directory is targeting the Cargo home directory, then# we assume this application was previously installed that layout# Note the installer passes the path with `\\` separators, but here they are# `\` so we normalize for comparison. We don't use `Resolve-Path` because they# may not exist.$cargo_home = if ($env:CARGO_HOME) { $env:CARGO_HOME } else {Join-Path $(if ($HOME) { $HOME } else { "." }) ".cargo"}if ($force_install_dir.Replace('\\', '\') -eq $cargo_home) {$install_layout = "cargo-home"}}# The actual path we're going to install to$dest_dir = $null$dest_dir_lib = $null# The install prefix we write to the receipt.# For organized install methods like CargoHome, which have# subdirectories, this is the root without `/bin`. For other# methods, this is the same as `_install_dir`.$receipt_dest_dir = $null# Before actually consulting the configured install strategy, see# if we're overriding it.if (($force_install_dir)) {switch ($install_layout) {"hierarchical" {$dest_dir = Join-Path $force_install_dir "bin"$dest_dir_lib = Join-Path $force_install_dir "lib"}"cargo-home" {$dest_dir = Join-Path $force_install_dir "bin"$dest_dir_lib = $dest_dir}"flat" {$dest_dir = $force_install_dir$dest_dir_lib = $dest_dir}Default {throw "Error: unrecognized installation layout: $install_layout"}}$receipt_dest_dir = $force_install_dir}if (-Not $dest_dir) {# Install to $env:XDG_BIN_HOME$dest_dir = if (($base_dir = $env:XDG_BIN_HOME)) {Join-Path $base_dir ""}$dest_dir_lib = $dest_dir$receipt_dest_dir = $dest_dir$install_layout = "flat"}if (-Not $dest_dir) {# Install to $env:XDG_DATA_HOME/../bin$dest_dir = if (($base_dir = $env:XDG_DATA_HOME)) {Join-Path $base_dir "../bin"}$dest_dir_lib = $dest_dir$receipt_dest_dir = $dest_dir$install_layout = "flat"}if (-Not $dest_dir) {# Install to $HOME/.local/bin$dest_dir = if (($base_dir = $HOME)) {Join-Path $base_dir ".local/bin"}$dest_dir_lib = $dest_dir$receipt_dest_dir = $dest_dir$install_layout = "flat"}# Looks like all of the above assignments failedif (-Not $dest_dir) {throw "ERROR: could not find a valid path to install to; please check the installation instructions"}# The replace call here ensures proper escaping is inlined into the receipt$receipt = $receipt.Replace('AXO_INSTALL_PREFIX', $receipt_dest_dir.replace("\", "\\"))$receipt = $receipt.Replace('"install_layout":"unspecified"', -join('"install_layout":"', $install_layout, '"'))$dest_dir = New-Item -Force -ItemType Directory -Path $dest_dir$dest_dir_lib = New-Item -Force -ItemType Directory -Path $dest_dir_libWrite-Information "Installing to $dest_dir"# Just copy the binaries from the temp location to the install dirforeach ($bin_path in $artifacts["bin_paths"]) {$installed_file = Split-Path -Path "$bin_path" -LeafCopy-Item "$bin_path" -Destination "$dest_dir" -ErrorAction StopRemove-Item "$bin_path" -Recurse -Force -ErrorAction StopWrite-Information " $installed_file"if (($dests = $info["aliases"][$installed_file])) {$source = Join-Path "$dest_dir" "$installed_file"foreach ($dest_name in $dests) {$dest = Join-Path $dest_dir $dest_name$null = New-Item -ItemType HardLink -Target "$source" -Path "$dest" -Force -ErrorAction Stop}}}foreach ($lib_path in $artifacts["lib_paths"]) {$installed_file = Split-Path -Path "$lib_path" -LeafCopy-Item "$lib_path" -Destination "$dest_dir_lib" -ErrorAction StopRemove-Item "$lib_path" -Recurse -Force -ErrorAction StopWrite-Information " $installed_file"}foreach ($lib_path in $artifacts["staticlib_paths"]) {$installed_file = Split-Path -Path "$lib_path" -LeafCopy-Item "$lib_path" -Destination "$dest_dir_lib" -ErrorAction StopRemove-Item "$lib_path" -Recurse -Force -ErrorAction StopWrite-Information " $installed_file"}$formatted_bins = ($info["bins"] | ForEach-Object { '"' + $_ + '"' }) -join ","$receipt = $receipt.Replace('"CARGO_DIST_BINS"', $formatted_bins)$formatted_libs = ($info["libs"] | ForEach-Object { '"' + $_ + '"' }) -join ","$receipt = $receipt.Replace('"CARGO_DIST_DYLIBS"', $formatted_libs)$formatted_staticlibs = ($info["staticlibs"] | ForEach-Object { '"' + $_ + '"' }) -join ","$receipt = $receipt.Replace('"CARGO_DIST_STATICLIBS"', $formatted_staticlibs)# Also replace the aliases with the arch-specific one$receipt = $receipt.Replace('"binary_aliases":{}', -join('"binary_aliases":', $info['aliases_json']))if ($NoModifyPath) {$receipt = $receipt.Replace('"modify_path":true', '"modify_path":false')}# Write the install receiptif ($install_updater) {$null = New-Item -Path $receipt_home -ItemType "directory" -ErrorAction SilentlyContinue# Trying to get Powershell 5.1 (not 6+, which is fake and lies) to write utf8 is a crime# because "Out-File -Encoding utf8" actually still means utf8BOM, so we need to pull out# .NET's APIs which actually do what you tell them (also apparently utf8NoBOM is the# default in newer .NETs but I'd rather not rely on that at this point).$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False[IO.File]::WriteAllLines("$receipt_home/uv-receipt.json", "$receipt", $Utf8NoBomEncoding)}# Respect the environment, but CLI takes precedenceif ($null -eq $NoModifyPath) {$NoModifyPath = $env:INSTALLER_NO_MODIFY_PATH}Write-Information "everything's installed!"if (-not $NoModifyPath) {Add-Ci-Path $dest_dirif (Add-Path $dest_dir) {Write-Information ""Write-Information "To add $dest_dir to your PATH, either restart your shell or run:"Write-Information ""Write-Information " set Path=$dest_dir;%Path% (cmd)"Write-Information " `$env:Path = `"$dest_dir;`$env:Path`" (powershell)"}}
}# Attempt to do CI-specific rituals to get the install-dir on PATH faster
function Add-Ci-Path($OrigPathToAdd) {# If GITHUB_PATH is present, then write install_dir to the file it refs.# After each GitHub Action, the contents will be added to PATH.# So if you put a curl | sh for this script in its own "run" step,# the next step will have this dir on PATH.## Note that GITHUB_PATH will not resolve any variables, so we in fact# want to write the install dir and not an expression that evals to itif (($gh_path = $env:GITHUB_PATH)) {Write-Output "$OrigPathToAdd" | Out-File -FilePath "$gh_path" -Encoding utf8 -Append}
}# Try to permanently add the given path to the user-level
# PATH via the registry
#
# Returns true if the registry was modified, otherwise returns false
# (indicating it was already on PATH)
#
# This is a lightly modified version of this solution:
# https://stackoverflow.com/questions/69236623/adding-path-permanently-to-windows-using-powershell-doesnt-appear-to-work/69239861#69239861
function Add-Path($LiteralPath) {Write-Verbose "Adding $LiteralPath to your user-level PATH"$RegistryPath = 'registry::HKEY_CURRENT_USER\Environment'# Note the use of the .GetValue() method to ensure that the *unexpanded* value is returned.# If 'Path' is not an existing item in the registry, '' is returned.$CurrentDirectories = (Get-Item -LiteralPath $RegistryPath).GetValue('Path', '', 'DoNotExpandEnvironmentNames') -split ';' -ne ''if ($LiteralPath -in $CurrentDirectories) {Write-Verbose "Install directory $LiteralPath already on PATH, all done!"return $false}Write-Verbose "Actually mutating 'Path' Property"# Add the new path to the front of the PATH.# The ',' turns $LiteralPath into an array, which the array of# $CurrentDirectories is then added to.$NewPath = (,$LiteralPath + $CurrentDirectories) -join ';'# Update the registry. Will create the property if it did not already exist.# Note the use of ExpandString to create a registry property with a REG_EXPAND_SZ data type.Set-ItemProperty -Type ExpandString -LiteralPath $RegistryPath Path $NewPath# Broadcast WM_SETTINGCHANGE to get the Windows shell to reload the# updated environment, via a dummy [Environment]::SetEnvironmentVariable() operation.$DummyName = 'cargo-dist-' + [guid]::NewGuid().ToString()[Environment]::SetEnvironmentVariable($DummyName, 'cargo-dist-dummy', 'User')[Environment]::SetEnvironmentVariable($DummyName, [NullString]::value, 'User')Write-Verbose "Successfully added $LiteralPath to your user-level PATH"return $true
}function Initialize-Environment() {If (($PSVersionTable.PSVersion.Major) -lt 5) {throw @"
Error: PowerShell 5 or later is required to install $app_name.
Upgrade PowerShell:https://docs.microsoft.com/en-us/powershell/scripting/setup/installing-windows-powershell"@}# show notification to change execution policy:$allowedExecutionPolicy = @('Unrestricted', 'RemoteSigned', 'Bypass')If ((Get-ExecutionPolicy).ToString() -notin $allowedExecutionPolicy) {throw @"
Error: PowerShell requires an execution policy in [$($allowedExecutionPolicy -join ", ")] to run $app_name. For example, to set the execution policy to 'RemoteSigned' please run:Set-ExecutionPolicy RemoteSigned -scope CurrentUser"@}# GitHub requires TLS 1.2If ([System.Enum]::GetNames([System.Net.SecurityProtocolType]) -notcontains 'Tls12') {throw @"
Error: Installing $app_name requires at least .NET Framework 4.5
Please download and install it first:https://www.microsoft.com/net/download"@}
}function New-Temp-Dir() {[CmdletBinding(SupportsShouldProcess)]param()$parent = [System.IO.Path]::GetTempPath()[string] $name = [System.Guid]::NewGuid()New-Item -ItemType Directory -Path (Join-Path $parent $name)
}# PSScriptAnalyzer doesn't like how we use our params as globals, this calms it
$Null = $ArtifactDownloadUrl, $NoModifyPath, $Help
# Make Write-Information statements be visible
$InformationPreference = "Continue"# The default interactive handler
try {Install-Binary "$Args"
} catch {Write-Information $_exit 1
}
步骤2:执行上面的脚本的命令:
powershell -ExecutionPolicy ByPass -File D:\桌面\uv-installer.ps1
注意: D:\桌面\uv-installer.ps1 是脚本文件路径
步骤3:把uv 加入系统环境变量中
#把uv添加到系统环境变量中
set Path=C:\Users\Administrator\.local\bin;%Path%
#查看安装版本
uv --version
步骤4:安装 Open WebUI
#安装open-webui
pip install open-webui
#查看 open-webui 包的详细信息。
pip show open-webui
步骤5:启动Open WebUI
open-webui serve --port 3000
步骤6:登录浏览器 访问http://localhost:3000
注册账户 邮箱和密码。
开始使用
安装完成