摘要:本文将手把手教你如何在Windows本地部署Ollama框架,下载并运行通义千问Qwen3:4b模型,最后通过Python代码实现与AI模型的交互式对话。无需GPU、无需联网、完全免费,让你的电脑拥有专属AI助手! PS:建议笔记本具备一定显卡算力的在跟着一起搭建。
为什么选择本地部署AI模型?
在开始之前,让我们了解一下本地部署AI模型的优势:
✅ 数据隐私安全:所有数据都在本地处理,不会上传到云端
✅ 无需网络:离线也能使用,不受网络波动影响
✅ 零成本:完全免费,无API调用费用
✅ 响应快速:本地调用延迟更低
✅ 高度定制:可以根据需求调整参数和模型
而Ollama正是目前最流行的本地大语言模型运行框架之一,它简化了模型的下载、管理和调用过程,让开发者能够轻松地在本地运行各种开源AI模型。
环境准备
系统要求
操作系统:Windows 10/11(本文以Windows为例)
内存:建议8GB以上(运行4B模型)
硬盘空间:至少10GB可用空间
Python版本:Python 3.7+
需要安装的软件
Ollama
Python 3.x
requests库
Ollama安装与配置
第一步:下载Ollama
访问Ollama官网:https://ollama.com/
点击"Download"按钮,选择Windows版本下载安装包。
第二步:安装Ollama
双击下载的安装程序
按照提示完成安装
安装完成后,Ollama会自动在后台运行
第三步:验证安装
打开PowerShell或命令提示符,输入:
bash
ollama --version

如果显示版本号,说明安装成功!
第四步:检查Ollama服务状态
Ollama默认会在后台启动一个本地服务,监听11434端口。你可以通过浏览器访问:
bash
http://localhost:11434

如果看到"Ollama is running"的提示,说明服务正常运行。
下载并运行Qwen3模型
什么是Qwen3?
Qwen3是阿里巴巴通义实验室开发的第三代大语言模型,具有强大的语言理解和生成能力。我们使用的是4B参数版本,这个版本在性能和资源占用之间取得了很好的平衡,适合在普通电脑上运行。
下载模型
在PowerShell中执行以下命令:
bash
ollama pull qwen3:4b
或者


这个命令会从Ollama官方模型库下载Qwen3:4b模型。下载时间取决于你的网络速度,模型大小约为2-3GB。
💡 提示:你也可以尝试其他模型,如:
ollama pull llama3.2 - Meta的Llama 3.2模型
ollama pull gemma2 - Google的Gemma 2模型
ollama pull mistral - Mistral AI的模型
测试模型
下载完成后,可以直接在命令行中与模型对话:
bash
ollama run qwen3:4b

然后输入任何问题,模型都会实时回复。输入/bye退出对话。
Python连接Ollama API
安装依赖库
我们需要使用requests库来调用Ollama的HTTP API:
bash
pip install requests
Ollama API简介
Ollama提供了简洁的RESTful API,主要接口包括:
生成接口:POST http://localhost:11434/api/generate
对话接口:POST http://localhost:11434/api/chat
列出模型:GET http://localhost:11434/api/tags
基础调用示例
下面是一个简单的Python函数,用于调用Ollama API:
python
import requests
import json
def call_ollama(prompt, model="qwen3:4b"):
"""
调用本地 Ollama 服务
Args:
prompt: 用户输入的提示词
model: 使用的模型名称,默认为 qwen3:4b
Returns:
模型生成的响应文本
"""
url = "http://localhost:11434/api/generate"
data = {
"model": model,
"prompt": prompt,
"stream": False # 设置为False一次性返回结果
}
try:
response = requests.post(url, json=data, timeout=120)
response.raise_for_status()
result = response.json()
return result.get("response", "")
except requests.exceptions.ConnectionError:
print("错误:无法连接到 Ollama 服务,请确保 Ollama 正在运行")
return ""
except requests.exceptions.Timeout:
print("错误:请求超时")
return ""
except Exception as e:
print(f"发生错误:{e}")
return ""
# 测试调用
if __name__ == '__main__':
result = call_ollama("你好,请介绍一下自己")
print(result)
代码解析
URL设置:指向本地Ollama服务的生成接口
请求数据:
model:指定使用的模型名称
prompt:用户输入的提示词
stream:是否流式输出,False表示等待完整结果后返回
异常处理:
连接错误:Ollama服务未启动
超时错误:请求超过120秒
其他错误:捕获所有异常情况
实战项目:智能聊天助手
现在让我们创建一个完整的交互式聊天助手:
python
import requests
import json
def call_ollama(prompt, model="qwen3:4b"):
"""
调用本地 Ollama 服务
Args:
prompt: 用户输入的提示词
model: 使用的模型名称,默认为 qwen3:4b
Returns:
模型生成的响应文本
"""
url = "http://localhost:11434/api/generate"
data = {
"model": model,
"prompt": prompt,
"stream": False
}
try:
response = requests.post(url, json=data, timeout=120)
response.raise_for_status()
result = response.json()
return result.get("response", "")
except requests.exceptions.ConnectionError:
print("错误:无法连接到 Ollama 服务,请确保 Ollama 正在运行")
return ""
except requests.exceptions.Timeout:
print("错误:请求超时")
return ""
except Exception as e:
print(f"发生错误:{e}")
return ""
def chat_with_qwen():
"""
与 Qwen 模型进行交互式对话
"""
print("=" * 50)
print("欢迎使用 Qwen3:4b 智能助手!")
print("输入 'quit' 或 'exit' 退出对话")
print("=" * 50)
while True:
user_input = input("\n你:").strip()
if user_input.lower() in ['quit', 'exit', '退出']:
print("再见!")
break
if not user_input:
continue
print("\n思考中...")
response = call_ollama(user_input)
if response:
print(f"\nQwen: {response}")
else:
print("未能获取响应,请检查 Ollama 服务是否正常")
if __name__ == '__main__':
chat_with_qwen()
PS: 这一步,这个模型的聪明程度取决于官方的训练程度,还有你显卡的算力,有时候会出现乱回答的情况,请注意及时处理对话框内容。
进阶应用:虚拟宠物聊天机器人
为了让应用更有趣,我们可以创建一个带有角色扮演的虚拟宠物聊天机器人。这个宠物有自己的性格、心情、亲密度等属性,会根据状态做出不同的反应。
python
import requests
import json
from datetime import datetime
import random
class VirtualPet:
"""虚拟宠物类"""
def __init__(self, name="小 Q", personality="活泼"):
self.name = name
self.personality = personality
self.mood = 50 # 心情值 0-100
self.intimacy = 30 # 亲密度 0-100
self.hunger = 50 # 饥饿度 0-100 (越高越饿)
self.energy = 80 # 精力值 0-100
self.owner_name = ""
self.memory = [] # 记忆列表
self.created_time = datetime.now()
def get_status(self):
"""获取宠物状态"""
status_map = {
'mood': {
'range': [(80, '非常开心'), (60, '开心'), (40, '一般'), (20, '有点难过'), (0, '很难过')],
'value': self.mood
},
'intimacy': {
'range': [(80, '非常亲密'), (60, '很亲密'), (40, '普通'), (20, '有点生疏'), (0, '陌生')],
'value': self.intimacy
},
'hunger': {
'range': [(80, '非常饿'), (60, '很饿'), (40, '有点饿'), (20, '不饿'), (0, '饱腹')],
'value': self.hunger
},
'energy': {
'range': [(80, '精力充沛'), (60, '有精神'), (40, '一般'), (20, '有点累'), (0, '很累')],
'value': self.energy
}
}
result = {}
for key, data in status_map.items():
value = data['value']
for threshold, desc in data['range']:
if value >= threshold:
result[key] = desc
break
return result
def add_memory(self, interaction):
"""添加记忆"""
self.memory.append({
'time': datetime.now(),
'content': interaction
})
# 只保留最近 10 条记忆
if len(self.memory) > 10:
self.memory.pop(0)
def update_status(self, mood_change=0, intimacy_change=0, hunger_change=0, energy_change=0):
"""更新状态"""
self.mood = max(0, min(100, self.mood + mood_change))
self.intimacy = max(0, min(100, self.intimacy + intimacy_change))
self.hunger = max(0, min(100, self.hunger + hunger_change))
self.energy = max(0, min(100, self.energy + energy_change))
def get_personality_prompt(self):
"""根据性格生成提示词"""
personality_prompts = {
'活泼': f"你是一只活泼可爱的宠物叫{self.name},喜欢用欢快的语气说话,经常使用表情符号如^_^,♡",
'安静': f"你是一只安静温柔的宠物叫{self.name},说话轻声细语,比较内敛",
'傲娇': f"你是一只傲娇的宠物叫{self.name},明明很喜欢主人但嘴上不承认,说话带点小脾气",
'粘人': f"你是一只特别粘人的宠物叫{self.name},非常喜欢主人,总是想和主人在一起",
'高冷': f"你是一只高冷的宠物叫{self.name},话比较少,但对主人还是很关心的"
}
return personality_prompts.get(self.personality, f"你是一只宠物叫{self.name}")
def call_ollama(prompt, model="gemma3:1b"):
"""
调用本地 Ollama 服务
Args:
prompt: 用户输入的提示词
model: 使用的模型名称,默认为 qwen3:4b
Returns:
模型生成的响应文本
"""
url = "http://localhost:11434/api/generate"
data = {
"model": model,
"prompt": prompt,
"stream": False
}
try:
response = requests.post(url, json=data, timeout=120)
response.raise_for_status()
result = response.json()
return result.get("response", "")
except requests.exceptions.ConnectionError:
print("错误:无法连接到 Ollama 服务,请确保 Ollama 正在运行")
return ""
except requests.exceptions.Timeout:
print("错误:请求超时")
return ""
except Exception as e:
print(f"发生错误:{e}")
return ""
def pet_chat(pet, user_input):
"""与宠物进行 AI 对话"""
status = pet.get_status()
# 构建系统提示词
system_prompt = f"""{pet.get_personality_prompt()}
当前状态:
- 心情:{status['mood']}
- 亲密度:{status['intimacy']}
- 饥饿度:{status['hunger']}
- 精力:{status['energy']}
主人的名字是:{pet.owner_name if pet.owner_name else '还未告诉主人'}
请根据以上设定和状态,以宠物的身份回复主人的话。保持简短有趣(50 字以内)。"""
full_prompt = f"{system_prompt}\n\n主人说:{user_input}\n{pet.name}回答:"
response = call_ollama(full_prompt)
return response.strip() if response else ""
def feed_pet(pet):
"""喂食宠物"""
if pet.hunger <= 20:
print(f"\n{pet.name}:「我已经不饿啦,谢谢主人~」")
return
pet.update_status(mood_change=5, hunger_change=-30, energy_change=5)
pet.add_memory(f"主人喂了我,现在不饿了")
responses = [
f"\n{pet.name}开心地吃了起来:「真好吃!谢谢主人!」",
f"\n{pet.name}:「哇,是我最喜欢的食物!」",
f"\n{pet.name}满足地舔了舔嘴巴:「好幸福呀~」"
]
print(random.choice(responses))
def play_with_pet(pet):
"""和宠物玩耍"""
if pet.energy <= 20:
print(f"\n{pet.name}:「我好累,玩不动了...」")
return
pet.update_status(mood_change=10, intimacy_change=5, energy_change=-20, hunger_change=10)
pet.add_memory(f"和主人一起玩耍,很开心")
games = ["球", "捉迷藏", "追逐游戏", "玩具老鼠"]
game = random.choice(games)
print(f"\n你和{pet.name}一起玩{game}...")
print(f"{pet.name}玩得特别开心!你们度过了愉快的时光~")
def show_status(pet):
"""显示宠物状态"""
status = pet.get_status()
print("\n" + "=" * 40)
print(f"【{pet.name}】的状态")
print("=" * 40)
print(f"性格:{pet.personality}")
print(f"心情:{status['mood']} {'♥' * int(pet.mood/20)}")
print(f"亲密度:{status['intimacy']} {'★' * int(pet.intimacy/20)}")
print(f"饥饿度:{status['hunger']} {'🍖' * int(pet.hunger/20)}")
print(f"精力:{status['energy']} {'⚡' * int(pet.energy/20)}")
print("=" * 40)
def create_pet():
"""创建宠物"""
print("\n欢迎来到宠物世界!")
print("请输入你想要的宠物名字:")
name = input("名字:").strip() or "小 Q"
print("\n请选择宠物的性格:")
print("1. 活泼")
print("2. 安静")
print("3. 傲娇")
print("4. 粘人")
print("5. 高冷")
choice = input("请输入选项 (1-5): ").strip()
personalities = {
'1': '活泼',
'2': '安静',
'3': '傲娇',
'4': '粘人',
'5': '高冷'
}
personality = personalities.get(choice, '活泼')
pet = VirtualPet(name=name, personality=personality)
print(f"\n太棒了!你拥有了一只{personality}的宠物,名字叫{name}!")
print(f"{name}:「你好呀,新主人!以后请多多关照哦~」")
return pet
def chat_with_pet():
"""与宠物进行交互式对话"""
pet = create_pet()
print("\n" + "=" * 50)
print(f"欢迎和{pet.name}一起玩耍!")
print("可用命令:")
print(" feed - 喂食")
print(" play - 玩耍")
print(" status - 查看状态")
print(" name [名字] - 告诉宠物你的名字")
print(" quit - 退出对话")
print(" 其他输入都会直接和宠物聊天哦~")
print("=" * 50)
while True:
user_input = input(f"\n你:").strip()
if not user_input:
continue
# 检查是否是命令
command = user_input.lower()
if command in ['quit', 'exit']:
print(f"\n{pet.name}:「主人再见,要早点回来陪我玩哦!」")
break
elif command == 'status':
show_status(pet)
continue
elif command == 'feed':
feed_pet(pet)
continue
elif command == 'play':
play_with_pet(pet)
continue
elif command.startswith('name '):
pet.owner_name = command[5:].strip()
print(f"\n{pet.name}:「我记住啦,我的主人叫{pet.owner_name}!」")
pet.add_memory(f"主人告诉我他/她的名字叫{pet.owner_name}")
continue
# 其他所有输入都作为聊天内容
print(f"\n{pet.name}正在听你说...")
response = pet_chat(pet, user_input)
if response:
print(f"\n{pet.name}:{response}")
else:
print(f"{pet.name}歪着头看着你,似乎在思考...")
# 按装订区域中的绿色按钮以运行脚本。
if __name__ == '__main__':
# 示例 1: 直接调用 Ollama
# result = call_ollama("你好,请介绍一下自己")
# print(result)
# 示例 2: 与虚拟宠物互动
chat_with_pet()

注意,这个宠物回答不一定是你想要的答案,因为本地模型,聪明与否是你的算力决定的,但是你可以登录调用官方的更加聪明的模型,这样的效果才会更好。