从0到1:Windows 本地部署 Qwen3 + Flask 接口(RAG 学习路线第1周踩坑实录)

硬件:i5-9300H / 16GB 内存 / GTX 1650(4GB 显存) 系统:Windows,PowerShell 关键词:Ollama、Qwen3、Flask、虚拟环境、RAG 入门

前言

最近在转型做 AI 应用开发,给自己定了一条 11 周的学习路线:前 6 周手写 RAG 的每一个环节,后 5 周补上 Dify/Coze、LangChain、Agent 等企业岗位常用的技能。这篇文章记录第 1 周的完整过程,从装环境到跑通第一个接口,包括我踩过的所有坑。如果你也是 Windows + 小显存显卡,希望能帮你少走弯路。

一、学习路线与技术栈

技术栈:Qwen3 + Embedding(bge)+ Milvus + bge-reranker + Python + Flask。

阶段 内容
第 1 周 环境搭建,跑通本地模型和最小 Flask 接口
第 2 周 文档切片与向量化(Embedding)
第 3 周 向量数据库 Milvus Lite
第 4 周 Reranker 重排序
第 5 周 组装完整 RAG 流程
第 6 周 Flask 整合成完整应用
第 7-11 周 Dify/Coze、AI 编程工具、LangChain、Agent 与 Function Calling、进阶

第 1 周目标:安装 Ollama,拉取 Qwen3 小模型在命令行跑通;搭好 Python 虚拟环境;写一个 Flask 接口,实现"接收问题 → 调用本地模型 → 返回回答"。

二、安装 Ollama

Ollama 是在本地运行大模型的工具,一条命令就能下载并运行模型。

  1. 浏览器打开官网 ollama.com,点击顶部的 Download,选择 Windows。

  2. 有两种安装方式:

    • PowerShell 一行命令:

    irm https://ollama.com/install.ps1 | iex

  • 或点击 Download manually 下载 OllamaSetup.exe,双击安装(更适合新手)。
  1. 装完后重新打开一个终端,验证:

    ollama --version

显示版本号就成功了。

踩坑 1:我一开始直接复制了带中文标点的网址,结果打开的是 404 页面。网址后面紧跟中文逗号时,有些界面会把逗号也算进链接。遇到 404,直接去官网首页点 Download 即可。

把模型存储位置改到 D 盘(强烈建议)

Ollama 默认把模型存在 C:\Users\用户名\.ollama\models。我的 C 盘只剩 29GB,而后面要下 Qwen3、Embedding、Reranker,加起来十几 GB,所以趁还没下载,先改位置:

  1. 新建文件夹 D:\ollama\models。
  2. 搜索"编辑系统环境变量",打开"环境变量",在用户变量里新建:
    • 变量名:OLLAMA_MODELS
    • 变量值:D:\ollama\models
  3. 完全退出 Ollama(右下角托盘图标右键 Quit),重新启动。

三、安装 Python

建议使用 Python 3.12。后面要用到的 Milvus Lite、sentence-transformers 等库,对 3.13 以上的版本适配可能还不完善。

  1. 到 python.org 的 Downloads 页面,下载 3.12 系列的 Windows installer (64-bit)。

  2. 安装时,第一个界面最下面一定要勾选 "Add python.exe to PATH",再点 Install Now。

  3. 装完后关掉所有终端,重新打开,验证:

    python --version

四、创建项目和虚拟环境

踩坑 4:PowerShell 默认落在 C:\WINDOWS\system32,在这里 mkdir 会提示"拒绝访问"。 原因是 PowerShell 以管理员身份打开了。关掉,用普通权限重新打开,并把项目放到 D 盘。

复制代码
D:
mkdir rag-learning
cd rag-learning
python -m venv venv
venv\Scripts\activate
pip install flask requests -i https://pypi.tuna.tsinghua.edu.cn/simple

逐条解释:

  • D::PowerShell 里切换盘符,直接输盘符即可,不用 cd。
  • python -m venv venv:创建虚拟环境,两个 venv 都不能少 。第一个是 Python 自带的模块名,第二个是文件夹名。我一开始只打了前半截,报错 the following arguments are required: ENV_DIR。
  • venv\Scripts\activate:激活虚拟环境,成功后提示符前会出现 (venv)。
  • pip install ... -i 清华镜像:国内下载依赖更快。

为什么要用虚拟环境? 每个项目一套独立的 Python 依赖,互不冲突,类似前端项目里各自的 node_modules。

如果激活时提示"禁止运行脚本",执行下面这条,提示时输入 Y:

复制代码
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned

安装完成后用 pip list 确认,能看到 Flask 和 requests 就对了。

五、拉取模型并在命令行跑通

4GB 显存跑不动 8B 的模型,所以先用 Qwen3-1.7B(约 1.4GB,能完整放进显存,速度快):

复制代码
ollama pull qwen3:1.7b
ollama run qwen3:1.7b

出现 >>> 后输入"你好",模型就能回答了。输入 /bye 退出。

Qwen3 的"思考模式"

你会发现模型回答前,会先输出一大段 Thinking... ...done thinking.,这是 Qwen3 的思考模式,先推理再给出答案。做问答时太慢、太啰嗦,可以在聊天界面里关掉:

复制代码
/set nothink     # 关闭思考模式
/set think       # 重新打开

注意:>>> 里只能和模型聊天,不能运行 python app.py 这类命令 ,要先 /bye 退出到 PowerShell。我就在这里犯过错。

想确认显卡有没有用上,在对话时另开终端运行:

复制代码
ollama ps

看 PROCESSOR 一栏是否显示 100% GPU。

六、写第一个 Flask 接口

在 D:\rag-learning 下新建 app.py:

复制代码
from flask import Flask, request, jsonify
import requests

app = Flask(__name__)
OLLAMA_URL = "http://localhost:11434/api/chat"

@app.post("/ask")
def ask():
    q = request.json.get("question", "")
    resp = requests.post(OLLAMA_URL, json={
        "model": "qwen3:1.7b",
        "messages": [{"role": "user", "content": q}],
        "stream": False,
        "think": False,
        "options": {"temperature": 0.7, "top_p": 0.9}
    })
    return jsonify({"answer": resp.json()["message"]["content"]})

if __name__ == "__main__":
    app.run(port=5000, debug=True)

代码逻辑很简单:Flask 起一个 /ask 接口,收到问题后转发给本地 Ollama 的 /api/chat,再把模型的回答返回。几个参数的含义:

  • stream: False:一次性返回完整回答(流式输出留到后面再做)。
  • think: False:关闭 Qwen3 的思考输出,只返回最终回答。
  • temperature:控制随机性,越低越稳定,越高越发散。
  • top_p:核采样,限制候选词的累计概率范围。

踩坑 5:can't open file 'app.py'。 报错的意思是文件不存在,要么没创建,要么当前目录不对。用 dir 确认一下 app.py 在不在当前目录。

七、运行并测试

窗口 1 (保持 (venv) 状态)启动服务:

复制代码
python app.py

看到 Running on http://127.0.0.1:5000 就启动成功了。这个窗口会一直占用,不要关,也不要在里面输别的命令。

窗口 2,另开一个 PowerShell(不需要进 venv),作为"客户端"发请求:

复制代码
Invoke-RestMethod -Uri http://localhost:5000/ask -Method Post -ContentType "application/json" -Body '{"question":"用一句话解释RAG"}'

(此处贴测试结果截图)

看到 answer 里有回答,就说明整条链路通了:请求 → Flask → Ollama → Qwen3 → 返回。

踩坑 6:PowerShell 里的 curl 不是真正的 curl。 它是 Invoke-WebRequest 的别名,语法和网上教程里的 Linux curl 不一样,所以这里用 Invoke-RestMethod。

八、踩坑汇总

现象 原因与处理
官网打开 404 链接带了中文标点,从官网首页点 Download
python 没反应 应用执行别名占位程序拦截,或漏勾 PATH
搜到的 python 在企业微信目录里 软件自带的内置 Python,不要用,自己装
mkdir 拒绝访问 在 system32 里,改用普通权限,并切到 D 盘
venv 命令报 ENV_DIR 缺失 少打了最后的文件夹名,应为 python -m venv venv
activate 禁止运行脚本 Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
>>> 里运行 python 无效 要先 /bye 退出聊天界面
can't open file 'app.py' 文件没创建或目录不对,用 dir 检查
模型回答前一大段思考 Qwen3 思考模式,接口里用 think: False 关闭

九、每次开始学习的固定三步

复制代码
D:
cd rag-learning
venv\Scripts\activate

十、小结与下周计划

第 1 周的核心收获是搞清楚"模型是怎么被调用的 ":本地模型通过 Ollama 暴露一个 HTTP 接口,我们的 Flask 程序只是一个转发层。后面做 RAG,本质上就是在这个转发层里,先检索资料、拼进 prompt,再调用模型。

接下来还有两件事:

  1. 用不同的 temperature 和 top_p(比如 0.1、0.7、1.5)对同一个问题各问几次,观察回答的稳定性差异;再用 system prompt 设定角色,看回答风格的变化。
  2. 进入第 2 周:文档切片与向量化,用 bge 模型把文本变成向量。

如果这篇文章对你有帮助,欢迎点赞收藏。后续每周的实践记录我会继续更新。


相关推荐
镜子AI1 小时前
镜子AI工程实践:用熵权法 + TOPSIS 做多方案选型排序(零依赖 Python)
开发语言·人工智能·python
估值探索者1 小时前
【Python量化组合管理实战 02】钱该怎么分?等权、波动率倒数与动态评分三种配权实测
java·开发语言·python·接口·股票数据api接口
西索斯coding1 小时前
Kimi K2.6 与 Qwen3.7 Max:跨文件修复评测与成本核算方法(2026)
开发语言·python·ai
梯度下降者1 小时前
桌面应用自动化python——uiautomation API 如何找元素
python·自动化·窗口操作·uiautomation·控件识别
wuyk5551 小时前
PyQt6-第10讲-PDF工具箱
python·microsoft·pdf·pyqt
知识分享小能手2 小时前
机器学习教程,从入门到精通,机器学习概述 + Python 语言基础 · 知识点详解(1)
人工智能·python·机器学习
郝学胜-神的一滴2 小时前
AI 编程智能体 16:从零基础搭建到精细化优化
人工智能·python·算法·语言模型·langchain·pip
又蓝2 小时前
【元宝搜索开发者征文大赛】用 FastAPI + Vue3 做了个 AI 炒股工具,接了六个分析师和腾讯元宝搜索
人工智能·python·ai·fastapi
2601_966949652 小时前
为什么不应该把 QuantDash API Key 直接写进公开代码仓库?从 Git 提交历史理解凭证泄露风险
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash