Python + Ollama 本地跑大模型:零成本打造私有 AI 助手
编程语言 · 技术分享
零 API 费用、零数据泄露风险、完全离线可用。
""" MAX_HISTORY = 20 # 最多保留的对话轮数 5.3 主程序 assistant.py # assistant.py import json import ollama from datetime import datetime from config import MODEL_NAME, SYSTEM_PROMPT, MAX_HISTORY def load_history(filepath="chat_history.json"): """加载对话历史""" try: with open(filepath, "r", encoding="utf-8") as f: return json.load(f) except FileNotFoundError: return [] def save_history(messages, filepath="chat_history.json"): """保存对话历史""" with open(filepath, "w", encoding="utf-8") as f: json.dump(messages, f, ensure_ascii=False, indent=2) def chat_stream(user_input: str, messages: list) -> str: """流式对话""" messages.append({"role": "user", "content": user_input}) print(f"\n\033[92m🤖 AI:\033[0m ", end="", flush=True) full_response = "" stream = ollama.chat(model=MODEL_NAME, messages=messages, stream=True) for chunk in stream: content = chunk["message"]["content"] print(content, end="", flush=True) full_response += content print("\n") messages.append({"role": "assistant", "content": full_response}) # 限制历史长度 if len(messages) > MAX_HISTORY * 2 + 1: messages = [messages[0]] + messages[-(MAX_HISTORY * 2):] return full_response def main(): print("=" * 50) print(f" 本地 AI 助手 | 模型: {MODEL_NAME}") print(" 输入 /clear 清空历史 | /quit 退出") print("=" * 50) # 初始化对话 messages = load_history() if not messages: messages = [{"role": "system", "content": SYSTEM_PROMPT}] while True: user_input = input("\n\033[94m👤 你:\033[0m ").strip() if not user_input: continue if user_input == "/quit": save_history(messages) print("👋 再见!对话已保存。
3.2 安装 Ollama # macOS / Linux(一行搞定) curl -fsSL https://ollama.com/install.sh | sh # Windows:前往 https://ollama.com/download 下载安装包 验证安装: ollama --version # 输出:ollama version is 0.6.x 3.3 拉取模型 # 推荐:Qwen3 8B(中文能力最强的小模型之一) ollama pull qwen3:8b # 备选:Llama 4 Scout 17B(Meta 最新开源模型) ollama pull llama4:scout17b # 轻量选择:Qwen3 4B(4GB 内存就能跑) ollama pull qwen3:4b # 查看已下载的模型 ollama list 3.4 安装 Python 依赖 pip install ollama 四、快速上手:5 行代码跑起来 4.1 最简对话 import ollama # 发送一条消息,获取回复 response = ollama.chat( model="qwen3:8b", messages=[ {"role": "user", "content": "用 Python 写一个快速排序算法"} ] ) print(response["message"]["content"]) 4.2 流式输出(打字机效果) import ollama # stream=True 开启流式输出,体验更丝滑 stream = ollama.chat( model="qwen3:8b", messages=[ {"role": "user", "content": "解释一下 Python 的装饰器"} ], stream=True ) for chunk in stream: print(chunk["message"]["content"], end="", flush=True) 4.3 多轮对话(保持上下文) import ollama # 维护对话历史 messages = [] def chat(user_input: str) -> str: messages.append({"role": "user", "content": user_input}) response = ollama.chat(model="qwen3:8b", messages=messages) assistant_msg = response["message"]["content"] messages.append({"role": "assistant", "content": assistant_msg}) return assistant_msg # 多轮对话 print(chat("你好,我正在学 Python")) print("---") print(chat("刚才我说我在学什么来着?")) # 它能记住上下文 五、实战项目:打造命令行 AI 助手 下面是一个功能完整的本地 AI 助手,支持多轮对话、Markdown 渲染、历史记录。
Q:商用免费吗? A:大部分模型(Qwen、Llama、Gemma)允许商用,但建议查看各模型的具体 License。
Q:中文效果好还是英文效果好? A:推荐 Qwen3 系列,它的中文能力是目前开源模型里最强的,远超同级别的 Llama。
回答要简洁实用,代码要可以直接运行。
") break if user_input == "/clear": messages = [{"role": "system", "content": SYSTEM_PROMPT}] save_history(messages) print("🗑️ 对话历史已清空。
你擅长 Python、数据分析、自动化办公。
Q:和 ChatGPT 比差多少? A:8B 级别的模型大约相当于 GPT-3.5 的水平,日常问答够用,复杂推理和长文本还有差距。
本文带你从安装到实战,30 分钟跑起一个本地 AI 助手。
如果硬件允许,跑 32B 或 70B 的模型会更接近 GPT-4 级别。
5.1 项目结构 local-ai-assistant/ ├── assistant.py # 主程序 ├── config.py # 配置文件 └── chat_history.json # 对话历史(自动生成) 5.2 配置文件 config.py # config.py MODEL_NAME = "qwen3:8b" # 使用的模型 SYSTEM_PROMPT = """你是一个专业的 AI 编程助手。
") continue chat_stream(user_input, messages) save_history(messages) if __name__ == "__main__": main() 5.4 运行效果 python assistant.py ================================================== 本地 AI 助手 | 模型: qwen3:8b 输入 /clear 清空历史 | /quit 退出 ================================================== 👤 你: 帮我写一个 Python 脚本,监控某个文件夹的变化 🤖 AI: 好的,使用 `watchdog` 库可以轻松实现文件夹监控... (此处输出完整代码) 六、进阶玩法 6.1 让 AI 调用本地函数(Function Calling) import ollama import json # 定义工具函数 def get_weather(city: str) -> str: """模拟获取天气(可替换为真实 API)""" weather_data = {"北京": "晴天 22°C", "上海": "多云 18°C", "深圳": "大雨 28°C"} return weather_data.get(city, "未查询到该城市天气") def calculate(expression: str) -> str: """安全计算数学表达式""" try: allowed = set("0123456789+-*/.() ") if all(c in allowed for c in expression): return str(eval(expression)) return "不安全的表达式" except Exception as e: return f"计算错误: {e}" # 注册工具 tools = [ { "type": "function", "function": { "name": "get_weather", "description": "获取指定城市的天气信息", "parameters": { "type": "object", "properties": { "city": {"type": "string", "description": "城市名称"} }, "required": ["city"] } } }, { "type": "function", "function": { "name": "calculate", "description": "计算数学表达式", "parameters": { "type": "object", "properties": { "expression": {"type": "string", "description": "数学表达式"} }, "required": ["expression"] } } } ] # 工具映射 tool_map = { "get_weather": get_weather, "calculate": calculate } # 对话 messages = [{"role": "user", "content": "北京天气怎么样?顺便帮我算一下 25*36+128"}] response = ollama.chat(model="qwen3:8b", messages=messages, tools=tools) # 处理工具调用 if response["message"].get("tool_calls"): for tool_call in response["message"]["tool_calls"]: func_name = tool_call["function"]["name"] func_args = tool_call["function"]["arguments"] print(f"🔧 调用工具: {func_name}({func_args})") result = tool_map[func_name](**func_args) print(f" 结果: {result}") 6.2 兼容 OpenAI SDK # 如果你已有使用 OpenAI SDK 的代码,只需改一行 from openai import OpenAI client = OpenAI( base_url="http://localhost:11434/v1", # 指向 Ollama api_key="ollama" # 随意填,不影响 ) response = client.chat.completions.create( model="qwen3:8b", messages=[ {"role": "user", "content": "Hello, who are you?"} ] ) print(response.choices[0].message.content) 这意味着:所有基于 OpenAI API 的应用(LangChain、Dify、Cursor 等)都可以无缝切换到本地模型! 七、模型选择指南 32%25%20%13%10%2026年 Ollama 最受欢迎模型占比Qwen3 8B(中文最强)Llama 4 Scout(综合最佳)DeepSeek R2(推理之王)Gemma 4 27B(性价比高)Mistral Small(轻量首选) 模型推荐表 使用场景推荐模型大小命令中文对话 / 写作Qwen3 8B~5 GBollama pull qwen3:8b英文编程Llama 4 Scout~10 GBollama pull llama4:scout17b逻辑推理 / 数学DeepSeek R2 8B~5 GBollama pull deepseek-r2:8b低配机器Qwen3 1.7B~1 GBollama pull qwen3:1.7b代码专用Qwen3-Coder 7B~4 GBollama pull qwen3-coder:7b 八、常见问题 Q:没有显卡能跑吗? A:能。
一、为什么要在本地跑大模型? 对比维度云端 API(ChatGPT / Claude)本地模型(Ollama)费用按量付费,$20/月起完全免费数据隐私数据上传到云端数据留在本地网络依赖必须联网离线可用模型选择固定自由切换开源模型硬件要求无需要一定配置38%27%18%12%5%选择本地大模型的理由(2026年开发者调查)数据隐私与安全零成本长期使用离线可用可自由定制微调其他 二、Ollama 是什么? Ollama 是一个开源的本地大模型运行框架,核心特点: 一键拉取模型:类似 docker pull 的体验自动适配硬件:根据你的显存/内存自动量化兼容 OpenAI API 格式:现有代码几乎不用改跨平台:Windows / macOS / Linux 都支持 用户提问Python 代码Ollama 本地服务Qwen3 / Llama4 / DeepSeek 三、环境准备 3.1 硬件要求 模型规模最低内存/显存推荐配置1.5B~3B(轻量)4 GB8 GB 内存即可7B~8B(主流)8 GB16 GB 内存或 8 GB 显存14B~32B(进阶)16 GB32 GB 内存或 16 GB 显存70B+(旗舰)48 GB专业显卡 / 服务器 没有独立显卡也能跑!Ollama 支持 纯 CPU 推理,只是速度慢一些。
Ollama 支持 CPU 推理,8B 模型在 16GB 内存的机器上完全可以跑,速度约 5-10 token/s。
总结 Ollama 本地 AI 的核心优势: ├── 零成本 —— 不花一分钱 API 费用 ├── 零风险 —— 数据永远不会离开你的电脑 ├── 零门槛 —— pip install + ollama pull,5 分钟上手 └── 零妥协 —— 兼容 OpenAI API,现有生态无缝切换 现在就打开终端,花 5 分钟跑起你的第一个本地 AI 助手吧。
内容整理自CSDN博客,仅供技术交流参考。
注册
登录控制台
