本地部署AI大模型:Ollama + Qwen3 完整指南,用Python打造智能聊天助手

摘要:本文将手把手教你如何在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()

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

相关推荐
洋不写bug2 小时前
Java线程(三):线程执行顺序问题、可重入锁、加锁操作解析,死锁解决
java·开发语言
漫游的渔夫2 小时前
从 Demo 到生产:为什么你的 AI 功能一上线就成了不可控的“黑盒”?
前端·人工智能
诸葛务农2 小时前
光电对抗:多模复合制导烟雾干扰外场试验及仿真(4)
人工智能·算法·光电对抗
2402_854808372 小时前
CSS如何实现根据滚动进度触发的过渡效果_配合JS修改类名触发transition
jvm·数据库·python
2501_914245932 小时前
如何配置MySQL用户的密码复杂度要求_结合phpMyAdmin与密码校验插件
jvm·数据库·python
m0_640309302 小时前
c++如何创建一个指定大小的稀疏文件_Windows下FSCTL_SET_SPARSE【实战】
jvm·数据库·python
m0_746752302 小时前
C#怎么使用required必需成员 C#required关键字怎么用如何强制构造对象时必须赋值属性【语法】
jvm·数据库·python
KC2702 小时前
零信任安全架构的需求:当 AI 智能体开始渗透企业内网
人工智能·安全
lsx2024062 小时前
Vue3 安装指南
开发语言