【Win11本地部署】如何自行搭建Ollama AI大模型服务?完整指南

简介

Ollama是一个开源的大型语言模型服务工具,它帮助用户快速在本地运行大模型。通过简单的安装指令,用户可以执行一条命令就在本地运行开源大型语言模型, Ollama极大地简化了在Docker容器内部署和管理LLM的过程,使得用户能够快速地在本地运行大型语言模型。

1. 下载安装Ollama

Ollama主页:https://ollama.com/ ,支持macOS, Linux 和 Windows 系统,点击下载按钮,获取OllamaSetup.exe安装程序。

双击安装文件,点击「Install」开始安装。目前的Ollama会默认安装到C盘,路径如下:C:\Users\%username%\AppData\Local\Programs\Ollama,并不会让用户自定义选择安装路径。

安装完成后,会在电脑右下角出现Ollama图标,可以不用先启动Ollama,先退出做一些必要路径的配置!

右键图标,会出现退出的按钮「Quit Ollama」,注意:一定要退出Ollama,否则下边的环境配置无法生效!

2. 环境配置

- 关闭开机自启动(可选):

Ollama 默认会随 Windows 自动启动,可以在「文件资源管理器」的地址栏中访问以下路径,删除其中的Ollama.lnk快捷方式文件,阻止它自动启动。

%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup

- 配置环境变量(必须):

Ollama 的默认模型存储路径如下:C:\Users\%username%\.ollama\models,无论 C 盘空间大小,需要安装多少模型,都建议换一个存放路径到其它盘,否则会影响电脑运行速度。

打开「系统环境变量」,新建一个系统变量OLLAMA_MODELS ,然后设置ollama模型的存储路径。

  • 变量名:OLLAMA_MODELS

  • 变量值(路径):D:\Work\ollama\models

- 配置端口(可选):

Ollama API 的默认访问地址和侦听端口是http://localhost:11434,只能在装有 Ollama 的系统中直接调用。如果要在网络中提供服务,请修改 API 的侦听地址和端口(在系统环境变量里设置):

  • 变量名:OLLAMA_HOST

  • 变量值(端口)::8000

只填写端口号可以同时侦听(所有) IPv4 和 IPv6 的:8000 端口。(变量值的端口前号前有个冒号:)

注:要使用 IPv6,需要 Ollama 0.0.20 或更高版本。另外,可能需要在 Windows 防火墙中开放相应端口的远程访问。

- 允许浏览器跨域请求(可选):

Ollama 默认只允许来自127.0.0.1和0.0.0.0的跨域请求,如果你计划在其它前端面板中调用 Ollama API,比如Open WebUI,建议放开跨域限制:

  • 变量名:OLLAMA_ORIGINS

  • 变量值:*

3. 运行Ollama

将上述更改的环境变量保存后,在「开始」菜单中找到并重新启动 Ollama。找到ollama.exe的所在位置,在该位置打开cmd

浏览器验证

执行指令ollama run <模型名称>,首次执行会从模型库中下载模型,所需时间取决于你的网速和模型大小。模型库地址:https://ollama.org.cn/library等待下载模型完成后,就可以使用了:

安装完成后,在终端中运行以下命令以启动Ollama服务:

ollama serve

浏览器验证

二、下载和运行模型

1. 下载模型

在Ollama服务启动后,你可以下载所需的AI模型。例如,下载名为llama3.1的模型:ollama pull llama3.1

ollama pull llama3.1

2. 运行模型

下载模型后,运行以下命令以启动模型:ollama run llama3.1

ollama run llama3.1

三、编写Python代码与服务端连接

1. 安装依赖

确保你已经安装了requests库,用于与Ollama API进行通信。如果没有安装,可以通过以下命令安装:pip install requests

pip install requests

2. 编写Python代码

以下是一个简单的Python示例代码,用于与Ollama服务端进行交互:

import requests``   ``# 定义API的URL``url = "http://localhost:11434/api/v1/generate"``   ``# 定义请求的数据``data = {`    `"model": "llama3.1",`    `"prompt": "告诉java的基本原理。"``}``   ``# 发送POST请求``response = requests.post(url, json=data)``   ``# 处理响应``if response.status_code == 200:`    `print(response.json()["text"])``else:`    `print(f"Error: {response.status_code}")``   

这个代码示例发送一个POST请求给Ollama服务端,并输出模型的响应。

四、客户端与服务端的连接

1. 确保服务端运行

在使用客户端之前,确保Ollama服务端正在运行。你可以在终端中运行ollama serve命令以启动服务。

2. 设置客户端

在客户端中设置API的URL和端口,以确保可以正确连接到服务端。

3. 建立对话

通过发送请求和处理响应,可以建立与模型的对话。每次发送新的提示并获取响应,形成一个完整的对话流 Python脚本对话页面代码

效果展示

源码

import wx``import json``import requests``import threading``   ``class OllamaFrame(wx.Frame):`    `def __init__(self):`        `super().__init__(parent=None, title='黄琛AI对战少平大模型Ollama Chat', size=(800, 600))``   `        `# 创建主面板`        `panel = wx.Panel(self)``   `        `# 创建垂直布局`        `vbox = wx.BoxSizer(wx.VERTICAL)``   `        `# 创建输入框和发送按钮的水平布局`        `hbox = wx.BoxSizer(wx.HORIZONTAL)``   `        `# 创建多行文本框用于显示对话历史`        `self.chat_history = wx.TextCtrl(`            `panel,`            `style=wx.TE_MULTILINE | wx.TE_READONLY | wx.HSCROLL,`            `size=(-1, 400)`        `)``   `        `# 创建输入框`        `self.input_text = wx.TextCtrl(`            `panel,`            `style=wx.TE_MULTILINE,`            `size=(-1, 100)`        `)``   `        `# 创建发送按钮`        `self.send_button = wx.Button(panel, label='发送')`        `self.send_button.Bind(wx.EVT_BUTTON, self.on_send)``   `        `# 将输入框和按钮添加到水平布局`        `hbox.Add(self.input_text, proportion=1, flag=wx.EXPAND | wx.RIGHT, border=5)`        `hbox.Add(self.send_button, flag=wx.EXPAND)``   `        `# 将聊天历史和输入区域添加到垂直布局`        `vbox.Add(self.chat_history, proportion=1, flag=wx.EXPAND | wx.ALL, border=5)`        `vbox.Add(hbox, flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, border=5)``   `        `# 设置面板的布局`        `panel.SetSizer(vbox)``   `        `# 初始化Ollama API的URL`        `self.api_url = 'http://localhost:11434/api/generate'``   `        `# 设置默认模型`        `self.model = 'llama3.1'  # 可以根据需要修改默认模型``   `    `def on_send(self, event):`        `# 获取输入文本`        `prompt = self.input_text.GetValue()`        `print('用户提问:', prompt)`        `if not prompt.strip():`            `return``   `        `# 清空输入框`        `self.input_text.SetValue('')``   `        `# 在聊天历史中添加用户输入`        `self.append_chat_history(f'你的提问: {prompt}\n', bold=True, color=wx.Colour(255, 0, 0))``   `        `# 异步处理API请求`        `threading.Thread(target=self.send_request, args=(prompt,)).start()``   `    `def send_request(self, prompt):`        `try:`            `# 准备请求数据`            `data = {`                `'model': self.model,`                `'prompt': prompt,`                `'stream': False  # 设置为False以获取完整响应`            `}``   `            `# 发送POST请求到Ollama服务器`            `response = requests.post(self.api_url, json=data)``   `            `if response.status_code == 200:`                `# 解析响应`                `result = response.json()`                `answer = result.get('response', 'No response received')`                `print('AI的回复:', answer)`                `# 在聊天历史中添加AI的回复`                `wx.CallAfter(self.append_chat_history, f'AI回复: {answer}\n\n', bold=False, color=wx.Colour(0, 0, 255))`            `else:`                `wx.CallAfter(self.append_chat_history, f'Error: Failed to get response (Status code: {response.status_code})\n\n', bold=False, color=wx.Colour(255, 0, 0))``   `        `except Exception as e:`            `wx.CallAfter(self.append_chat_history, f'Error: {str(e)}\n\n', bold=False, color=wx.Colour(255, 0, 0))``   `    `def append_chat_history(self, text, bold=False, color=wx.BLACK):`        `# 设置文本属性`        `attr = wx.TextAttr()`        `attr.SetTextColour(color)`        `if bold:`            `attr.SetFontWeight(wx.FONTWEIGHT_BOLD)`        `else:`            `attr.SetFontWeight(wx.FONTWEIGHT_NORMAL)``   `        `# 应用文本属性`        `self.chat_history.SetDefaultStyle(attr)`        `self.chat_history.AppendText(text)``   `        `# 滚动到最底部`        `self.chat_history.ShowPosition(self.chat_history.GetLastPosition())``   ``def main():`    `app = wx.App()`    `frame = OllamaFrame()`    `frame.Show()`    `app.MainLoop()``   ``if __name__ == '__main__':`    `main()``   

4.cmd命令对话

 `帮我写一个中英文的愚公移山的600字的文章,故事中文至少3段落,每一段落都翻译成相关的英文``**愚公移山**``   ``**第一段:**``愚公是古时候的一个老农民,他住在一个小村子里。他非常渴望有一片好田地,可以耕种和养家糊口。然而,他家附近的群山高耸,阻挡了阳光和``水汽,土壤也不适合种植庄稼。愚公决定要把这座山移走,以便他的村子能更好地发展。``   ``**English Translation:**``There was once a man named Foolish Old Man, who lived in a small village. He yearned for a good piece of land to till and``support his family. However, the mountains surrounding his home were steep and obstructed sunlight and water vapor, making the``soil unsuitable for crops. Determined to improve his village's prospects, Foolish Old Man decided to move the mountain.``   ``**第二段:**``愚公带着他的锄头和铁镐开始工作。他每天只用劲力拉动一根筋索,就把山上的巨石拉下来,一块一块地堆积在一起。慢慢地,群山的高度就被削``减了。但是,这个过程非常缓慢,每天只能移动一点点距离。``   ``**English Translation:**``With a shovel and iron pickaxe in hand, Foolish Old Man began his laborious task. He would pull one rope at a time, hauling``away massive boulders from the mountain, piece by piece, piling them up beside him. As the days passed, the height of the``mountains slowly diminished, but progress was agonizingly slow.``   ``**第三段:**``经过许多年,愚公的身体已经老化了,但他还是坚持着他的梦想。他每天都在山前劳动,尽管他的力量越来越弱,但是他的精神却越来越强。最后``,他终于完成了移山的任务,一片绿油油的土地呈现在他的面前。``   ``**English Translation:**``After many years of tireless effort, Foolish Old Man's body had grown frail, but his spirit remained unbroken. He persisted in``his endeavor, day after day, despite the waning strength in his limbs. At last, he completed the monumental task of moving the``mountain, revealing a lush green landscape before him.``   ``**第四段:**``愚公终于实现了他的梦想,他可以在这片新的土地上耕种和养家糊口。他感激地看着自己的手艺,知道他付出了一生之力。然后,他就离开了这个``地方,去了别的地方去寻找新的事业。``   ``**English Translation:**``Foolish Old Man had finally achieved his lifelong dream. He could till the soil and make a living on this new land. With``gratitude in his heart, he looked at his own handiwork, knowing that it was the result of a lifetime's toil. Then, he bid``farewell to this place and set out for other adventures.``   ``**结论:**``愚公移山的故事告诉我们,勤劳和坚持是最强大的力量。无论面对多大的困难,都不能阻挡我们的追求。也许,我们的目标不一定能实现,但是我``们绝不会放弃。``   ``**English Translation:**``The story of Foolish Old Man moving the mountain teaches us that diligence and perseverance are the greatest powers. No matter``how daunting the obstacles, they cannot deter our pursuit. Perhaps our goals may not be achieved, but we will never give up.``   ``---``   ``**Additional English Translations**``   ``* **愚公**: Foolish Old Man (a nickname for an old man who is considered foolish or naive)``* **移山**: to move a mountain``* **筋索**: a rope made of fibers from a plant called "jiu" or "ci"``* **巨石**: massive boulders``* **绿油油的土地**: a lush green landscape``   ``>>> Send a message (/? for help)` 

在这里插入图片描述

如何学习AI大模型?

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

在这里插入图片描述

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值