1. 从零起步为什么第一天不急着写代码很多人对AI应用开发这四个字有误解觉得第一天就该把模型跑起来、把对话界面搭出来。我带过不少零基础的朋友十个里有八个第一天就卡在环境上然后开始怀疑自己是不是不适合干这行。其实问题不在人在于顺序搞反了。AI应用开发的本质是把大模型的能力包装成一个普通人能用的工具。你不需要训练模型不需要懂反向传播甚至不需要看懂Transformer的论文。你需要的是三件事能写基本的Python代码、能调用别人提供的接口、能把结果展示出来。这三件事里第一件是地基第二件是核心第三件是门面。第一天要做的就是把地基和门面之间的那条路先打通。那为什么是Python而不是别的语言因为目前几乎所有大模型的官方示例、SDK、社区方案都是Python优先。你去看DeepSeek、通义、智谱这些平台的文档第一段代码永远是Python。用Java当然也能调但你会发现自己在一堆示例里找不到能直接抄的代码学习成本凭空翻倍。对于零基础的人来说少一个障碍就是多一分坚持下去的可能。这一天的目标很明确装好Python、装好编辑器、跑通一个最小的接口调用、做出一个能在命令行里聊天的机器人。听起来简单但每一步都有坑。下面我按实际操作的顺序把每个环节拆开讲包括我踩过的和看别人踩过的坑。提示第一天不要追求优雅。代码能跑、结果正确就是胜利。重构和优化是后面几天的事。2. Python环境搭建那些教程不会告诉你的细节2.1 版本选择不是越新越好打开Python官网首页默认给你推最新版。但我要说一句反直觉的话不要装最新版。目前AI应用开发相关的库对Python版本的支持有一个甜区大致在3.10到3.12之间。3.13刚出来那阵子不少库还没跟上你装完会发现pip install直接报编译错误然后花两小时去查怎么装Visual C构建工具。我的建议是直接上3.11或者3.12。这两个版本足够新能用到近几年的语法特性同时生态兼容性最好。下载的时候注意选对系统位数Windows用户选Windows installer (64-bit)别选成32位的不然后面装某些库会莫名其妙失败。安装界面上有一个复选框写着Add Python to PATH。这个框必须勾上。我见过太多人装完Python在命令行敲python提示不是内部或外部命令然后一脸茫然。勾上这个框安装程序会自动把Python加到系统环境变量里省去手动配置的麻烦。如果你已经装完了才发现没勾也不用重装手动加一下环境变量就行但那个过程对新手来说挺劝退的。2.2 验证安装三个命令确认一切正常装完之后别急着往下走先开一个命令行窗口验证。Windows按WinR输入cmdMac打开终端。依次敲这三个命令python --version pip --version python -c print(hello ai)第一条应该输出你装的版本号比如Python 3.11.9。第二条输出pip的版本和它对应的Python版本。第三条如果打印出hello ai说明Python解释器工作正常。这里有个Mac用户常遇到的坑系统自带的Python可能是2.7或者某个老版本你敲python出来的不是刚装的那个。解决办法是敲python3和pip3。为了省事可以在shell配置文件里加个别名但第一天不建议折腾这个记住用python3就行。还有一个Windows特有的坑如果你之前装过Python又从微软商店装了一个可能会出现两个Python打架的情况。判断方法是敲where pythonWindows或which python3Mac/Linux看看输出的路径是不是你刚装的那个。如果路径指向WindowsApps目录那说明你用的是商店版建议卸载重装官网版。2.3 pip换源让下载速度从龟速变正常pip默认从国外的服务器拉包国内下载速度可能只有几十KB每秒装个大一点的库能等到你怀疑人生。换国内镜像源是标准操作一行命令搞定pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple这条命令会把配置写进pip的配置文件以后所有pip install都走清华源。如果你只想临时用一次可以在install命令后面加-i参数指定源。我一般建议直接永久配置省得每次都要加。换完源之后装库的速度会有质的提升。你可以拿一个稍微大点的库测试一下比如pip install requests正常情况下几秒钟就完成了。2.4 虚拟环境现在嫌麻烦以后会感谢自己虚拟环境这个概念对零基础的人来说有点抽象。打个比方你的电脑是一个大厨房每个项目是一道菜。如果不做隔离做川菜的调料会跑到做甜品的台面上最后两道菜都毁了。虚拟环境就是给每个项目单独划一个操作台互不干扰。创建虚拟环境的命令很简单python -m venv myenv这会在当前目录下创建一个叫myenv的文件夹里面是一套独立的Python环境。激活它Windowsmyenv\Scripts\activateMac/Linuxsource myenv/bin/activate激活之后命令行的前面会出现(myenv)的标记说明你现在在这个环境里操作。这时候pip install装的库只对这个环境生效不会污染全局。第一天你可能觉得这一步多余但等你装了十几个项目、每个项目依赖的库版本还不一样的时候虚拟环境就是救命稻草。养成习惯每个新项目先建虚拟环境。3. 编辑器选型PyCharm还是VS Code3.1 两个工具的真实差异这个问题在社区里能吵起来但我的看法很实际零基础用PyCharm社区版有编程经验用VS Code。PyCharm社区版免费开箱即用新建项目自动帮你建虚拟环境代码补全和错误提示都很强。缺点是启动慢、吃内存老电脑上跑起来有点吃力。VS Code轻量、启动快、插件生态丰富但需要自己配置Python插件、选择解释器、配置调试环境对新手来说每一步都可能卡住。我第一天带人的时候一般推荐PyCharm因为它的傻瓜程度更高。你新建一个项目它自动把解释器、虚拟环境都配好了直接就能写代码。VS Code虽然更灵活但那个灵活是建立在你会配的前提上的。3.2 PyCharm新建项目的关键设置打开PyCharm点New Project会看到一个界面。这里有几个地方要注意Location填你的项目路径建议路径里不要有中文和空格。我见过有人把项目放在我的文档/新建文件夹下面然后各种奇怪的报错。Python对中文路径的支持时好时坏尤其是涉及到一些底层库的时候避开这个坑最省事。Python Interpreter那一栏选New environment using Virtualenv然后它会自动填好位置。Base interpreter选你刚装的那个Python 3.11或3.12。这样PyCharm会帮你创建一个干净的虚拟环境后面装库都装在这里面。创建完之后PyCharm底部会有一个Terminal标签点开就是一个命令行而且已经自动激活了虚拟环境。你在这个Terminal里敲pip install装的就是当前项目的库。这个设计比手动激活虚拟环境方便多了。3.3 VS Code用户的配置清单如果你坚持用VS Code那至少要装这几个插件Python微软官方那个、Pylance代码补全、Chinese Language Pack中文界面可选。装完Python插件后按CtrlShiftP打开命令面板输入Python: Select Interpreter选中你创建的虚拟环境里的python.exe。VS Code的Terminal默认不会自动激活虚拟环境需要手动敲激活命令。或者你可以在设置里搜python.terminal.activateEnvironment确保它是勾选状态这样打开Terminal时会自动激活。4. 调用DeepSeek API从申请到跑通第一条请求4.1 申请API Key的完整流程DeepSeek的API申请流程相对简单。注册账号之后进入控制台找到API Keys管理页面创建一个新的Key。创建的时候会让你起个名字随便起就行比如day1-test。创建完会显示一串以sk-开头的字符串这串东西只显示一次关掉页面就再也看不到了所以一定要先复制下来存好。存哪里不要直接写在代码里。我见过太多人把Key硬编码在代码里然后不小心把代码传到公开仓库Key被人盗用跑了一堆请求账单出来才傻眼。正确的做法是放在环境变量里或者放在一个单独的配置文件里并且把这个配置文件加到.gitignore里。对于第一天来说最简单的做法是在项目根目录建一个.env文件里面写DEEPSEEK_API_KEYsk-你的key然后在代码里用python-dotenv这个库来读取。这样代码里不会出现明文Key相对安全一些。4.2 理解API调用的基本结构调用大模型API本质上就是发一个HTTP POST请求把你想问的问题发过去服务器返回模型的回答。这个请求的格式是固定的核心参数就那么几个参数作用常用值model指定用哪个模型deepseek-chatmessages对话历史一个列表包含role和contenttemperature控制随机性0到2之间越高越随机max_tokens限制回答长度根据需要设置messages这个参数是重点。它是一个列表里面每个元素是一个字典包含role和content两个字段。role有三种system用来设定模型的角色和行为user是用户说的话assistant是模型之前的回答。多轮对话就是把历史消息都放进这个列表里模型会根据上下文来回答。temperature这个参数值得说一下。它控制输出的随机程度。设成0模型每次回答几乎一样适合需要稳定输出的场景设成1以上回答会更有创意但也更容易跑偏。第一天做聊天机器人设成0.7左右比较合适既有变化又不至于太离谱。4.3 用requests库发第一个请求虽然DeepSeek官方提供了OpenAI兼容的SDK但第一天我建议先用requests库手写一遍请求。这样你能看清楚底层到底发生了什么后面用SDK的时候心里有底。先装requestspip install requests python-dotenv然后写代码import os import requests from dotenv import load_dotenv load_dotenv() api_key os.getenv(DEEPSEEK_API_KEY) url https://api.deepseek.com/chat/completions headers { Authorization: fBearer {api_key}, Content-Type: application/json } data { model: deepseek-chat, messages: [ {role: user, content: 你好请用一句话介绍你自己} ], temperature: 0.7 } response requests.post(url, headersheaders, jsondata) result response.json() print(result[choices][0][message][content])这段代码跑通你就完成了AI应用开发最核心的一步让程序替你向大模型提问并拿到回答。后面所有的应用本质上都是在这个基础上做包装。4.4 429错误新手最容易撞上的墙如果你跑上面的代码很可能遇到这样的报错exceeded retry limit, last status: 429 too many requests这个429是HTTP状态码意思是请求太频繁。但新手往往会困惑我明明只发了一次请求怎么就频繁了原因通常有两个。一是你的账号没有余额或者免费额度用完了服务器用429来拒绝你。二是你在短时间内发了太多请求触发了速率限制。对于第一天的情况大概率是第一个原因。去控制台看一下余额如果是零充一点或者领一下免费额度。还有一种情况是代码写错了导致死循环比如在while循环里不断发请求。这种就要检查代码逻辑加个sleep或者退出条件。处理429的正确姿势是加一个重试机制但不能无脑重试。我一般会这样写import time def call_api(url, headers, data, max_retries3): for i in range(max_retries): response requests.post(url, headersheaders, jsondata) if response.status_code 200: return response.json() elif response.status_code 429: wait 2 ** i print(f请求被限流等待{wait}秒后重试) time.sleep(wait) else: print(f请求失败状态码{response.status_code}) print(response.text) return None return None这里用的是指数退避策略第一次等1秒第二次等2秒第三次等4秒。这样既给了服务器缓冲时间又不会无限等待。5. 命令行聊天机器人把碎片拼成完整应用5.1 从单次请求到多轮对话单次请求跑通之后下一步是让它能记住上下文。大模型本身是无状态的它不记得你上一句说了什么。所谓多轮对话其实是每次请求都把之前的对话历史一起发过去。实现方式很简单维护一个messages列表每次用户输入后把用户的消息append进去发请求拿到回答后再把回答append进去。这样下一次请求就带着完整的历史了。messages [ {role: system, content: 你是一个友好的助手回答尽量简洁} ] while True: user_input input(你) if user_input.lower() in [exit, quit]: break messages.append({role: user, content: user_input}) data { model: deepseek-chat, messages: messages, temperature: 0.7 } result call_api(url, headers, data) if result: reply result[choices][0][message][content] messages.append({role: assistant, content: reply}) print(fAI{reply})这个循环就是聊天机器人的核心。system消息设定了AI的角色你可以改成任何你想要的比如你是一个Python导师或者你是一个冷笑话大王。5.2 上下文长度一个容易被忽略的限制messages列表不能无限增长。每个模型都有一个上下文窗口限制比如DeepSeek-chat支持64K的上下文。超过这个长度请求会失败或者被截断。对于第一天的练习你聊个几十轮没问题。但如果要做长期运行的应用就需要做上下文管理。常见的策略是只保留最近N轮对话或者当消息总长度超过阈值时把早期的消息总结成一段话再放进去。我一般会加一个简单的长度检查def trim_messages(messages, max_count20): if len(messages) max_count: system_msg messages[0] recent messages[-(max_count-1):] return [system_msg] recent return messages这样保留system消息和最近的消息丢弃中间的老消息。简单粗暴但有效。5.3 异常处理让机器人不会一崩就退出第一天的代码最容易犯的错就是没有异常处理。网络断了、API返回错误、用户输入了奇怪的东西程序直接崩溃退出。加一层try-except能让体验好很多while True: try: user_input input(你) if not user_input.strip(): continue if user_input.lower() in [exit, quit]: print(再见) break # ... 处理逻辑 except KeyboardInterrupt: print(\n已退出) break except Exception as e: print(f出错了{e}) continueKeyboardInterrupt是用户按CtrlC的时候触发的捕获它可以让退出更优雅。其他异常统一打印错误信息然后继续循环不至于因为一次错误就整个程序挂掉。5.4 流式输出让等待不再焦虑默认情况下API会等模型生成完整回答后才一次性返回。如果回答很长用户会盯着屏幕等好几秒体验很差。流式输出可以让回答像打字一样一个字一个字蹦出来。实现流式输出需要在请求里加stream: True然后逐行读取响应data[stream] True response requests.post(url, headersheaders, jsondata, streamTrue) for line in response.iter_lines(): if line: line line.decode(utf-8) if line.startswith(data: ): content line[6:] if content ! [DONE]: import json chunk json.loads(content) delta chunk[choices][0][delta] if content in delta: print(delta[content], end, flushTrue)流式输出的代码比普通请求复杂一些但体验提升很明显。第一天可以先不做等基础版本跑通了再升级。6. 第一天最容易卡住的五个地方6.1 网络请求超时调用API的时候如果网络不稳定requests可能会一直卡在那里。默认情况下requests没有超时限制这意味着程序可能永远挂起。解决办法是加timeout参数response requests.post(url, headersheaders, jsondata, timeout30)30秒对于大模型请求来说足够了。如果超时会抛出Timeout异常你可以捕获它然后重试。6.2 JSON解析失败有时候API返回的不是JSON而是一段HTML错误页面。这时候response.json()会抛异常。稳妥的做法是先检查状态码再尝试解析if response.status_code 200: try: result response.json() except ValueError: print(返回的不是合法JSON, response.text) else: print(f请求失败{response.status_code}) print(response.text)6.3 环境变量读取不到用dotenv读取环境变量时如果.env文件和代码不在同一个目录或者文件名写错了比如写成了env而不是.env会读到None。检查方法是打印一下os.getenv(DEEPSEEK_API_KEY)看是不是None。如果是检查文件路径和文件名。6.4 虚拟环境没激活在PyCharm的Terminal里装完库换到系统命令行跑代码提示ModuleNotFoundError。这是因为系统命令行用的是全局Python不是虚拟环境里的。解决办法是要么在PyCharm的Terminal里跑要么手动激活虚拟环境。6.5 编码问题Windows的cmd默认编码可能是GBK打印中文或者特殊字符时可能报UnicodeEncodeError。解决办法是在代码开头加import sys import io sys.stdout io.TextIOWrapper(sys.stdout.buffer, encodingutf-8)或者把cmd的编码改成UTF-8命令是chcp 65001。7. 第一天的收获与后续方向把上面这些跑通你手里就有了一个能用的命令行聊天机器人。它虽然简陋但已经包含了AI应用开发的完整链路环境搭建、依赖管理、API调用、多轮对话、异常处理。后面要做的事情都是在这个骨架上加东西。比如加一个Web界面可以用Gradio或者Streamlit几行代码就能把命令行程序变成网页应用。比如加一个知识库可以用向量数据库做检索增强。比如加一个工具调用能力让模型能查天气、算数学。这些都是在第一天的基础上往外扩展。我个人在带新手的时候发现第一天最大的价值不是学会了多少技术而是建立了一个我能让它跑起来的信心。很多人卡在环境配置就放弃了其实只要跨过这道坎后面的路会越来越顺。最后分享一个小习惯每天结束的时候把当天写的代码整理一下加几行注释存到一个固定的地方。一周之后回头看你会清楚地看到自己的进步轨迹。这比任何教程都管用。