硬件: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 是在本地运行大模型的工具,一条命令就能下载并运行模型。
-
浏览器打开官网
ollama.com,点击顶部的 Download,选择 Windows。 -
有两种安装方式:
- PowerShell 一行命令:
irm https://ollama.com/install.ps1 | iex
- 或点击 Download manually 下载
OllamaSetup.exe,双击安装(更适合新手)。
-
装完后重新打开一个终端,验证:
ollama --version
显示版本号就成功了。
踩坑 1:我一开始直接复制了带中文标点的网址,结果打开的是 404 页面。网址后面紧跟中文逗号时,有些界面会把逗号也算进链接。遇到 404,直接去官网首页点 Download 即可。
把模型存储位置改到 D 盘(强烈建议)
Ollama 默认把模型存在 C:\Users\用户名\.ollama\models。我的 C 盘只剩 29GB,而后面要下 Qwen3、Embedding、Reranker,加起来十几 GB,所以趁还没下载,先改位置:
- 新建文件夹
D:\ollama\models。 - 搜索"编辑系统环境变量",打开"环境变量",在用户变量里新建:
- 变量名:
OLLAMA_MODELS - 变量值:
D:\ollama\models
- 变量名:
- 完全退出 Ollama(右下角托盘图标右键 Quit),重新启动。
三、安装 Python
建议使用 Python 3.12。后面要用到的 Milvus Lite、sentence-transformers 等库,对 3.13 以上的版本适配可能还不完善。
-
到 python.org 的 Downloads 页面,下载 3.12 系列的 Windows installer (64-bit)。
-
安装时,第一个界面最下面一定要勾选 "Add python.exe to PATH",再点 Install Now。
-
装完后关掉所有终端,重新打开,验证:
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,再调用模型。
接下来还有两件事:
- 用不同的
temperature和top_p(比如 0.1、0.7、1.5)对同一个问题各问几次,观察回答的稳定性差异;再用 system prompt 设定角色,看回答风格的变化。 - 进入第 2 周:文档切片与向量化,用 bge 模型把文本变成向量。
如果这篇文章对你有帮助,欢迎点赞收藏。后续每周的实践记录我会继续更新。