ai全栈软件开发day21(第四阶段喽) Python 速通、AI 环境搭建与大模型 API 初探2026-07-30 周四 AI 大模型开发基础 阅读约 18 分钟本文目录今日学习内容Python 语法速通AI 开发环境搭建大模型 API 调用实战提示工程入门踩坑记录收获总结明日计划今日学习内容今天是 Day 21也是一个全新的开始 ——第四阶段「AI 大模型开发基础」正式启程经过前面 20 天的高强度学习我们已经打下了坚实的 Java 全栈基础从 Vue 3 前端到 Spring Boot 后端从 MySQL 到 Redis从单体应用到 Spring Cloud 微服务。现在我们终于要踏入 AI 的世界了。说实话从 Java 转向 Python 和大模型开发内心既兴奋又忐忑。兴奋的是终于要接触最前沿的 AI 技术了忐忑的是 Python 生态和 Java 差异很大需要快速适应。不过有前面的编程基础打底相信过渡会相对平滑。今天的学习目标非常明确Python 语法速通用 Java 程序员的视角快速掌握 Python 核心语法数据类型、流程控制、函数、面向对象、容器AI 开发环境搭建Python 3.11、Anaconda、VS Code、Jupyter Notebook、虚拟环境管理大模型 API 调用OpenAI API 格式、国内大模型平台DeepSeek/智谱/通义接入、HTTP 请求封装提示工程入门Zero-shot / Few-shot、角色设定、结构化提示、链式思考阶段目标第四阶段共 5 天目标是掌握 Python 编程基础、提示工程、LangChain 框架、FastAPI 和向量数据库最终能独立开发一个基于大模型的智能问答系统后端。Python 语法速通如果你已经熟练掌握 Java学习 Python 就像是从手动挡切换到自动挡 —— 语法更简洁但需要适应新的编程范式。我的策略是「对比学习」用 Java 的概念映射到 Python快速建立认知。变量与数据类型Python 是动态类型语言不需要显式声明变量类型。这既是便利也是陷阱 —— 类型错误往往在运行时才暴露。python_crash_course.pyPython# Python 没有 int/double/String 关键字直接赋值即可 name AI 全栈工程师 # str age 21 # int pi 3.14159 # float is_student True # bool skills [Java, Vue, Python] # list相当于 Java ArrayList profile {name: name, age: age} # dict相当于 Java HashMap # type() 查看类型isinstance() 做类型检查推荐 print(type(name)) # class str print(isinstance(age, int)) # True # f-string 格式化Python 3.6比 Java 的 String.format 优雅太多 print(f我是{name}学习第{age}天掌握{len(skills)}项技能) # 输出我是AI 全栈工程师学习第21天掌握3项技能流程控制与推导式Python 的缩进语法需要特别注意 —— 它用缩进来表示代码块而不是大括号。这迫使代码必须保持良好的格式但也容易因为混用空格和 Tab 导致报错。control_flow.pyPython# if-elif-else注意冒号和缩进 score 85 if score 90: grade A elif score 80: grade B else: grade C # for 循环遍历没有传统 for-i 循环用 range() for i in range(5): # 0,1,2,3,4 print(i) # 列表推导式 —— Python 的灵魂特性之一 numbers [1, 2, 3, 4, 5] squares [x**2 for x in numbers if x % 2 0] print(squares) # [4, 16] # 等价 Javanumbers.stream().filter(x - x % 2 0).map(x - x * x).toList() # 字典推导式 word_lengths {word: len(word) for word in [AI, Python, LangChain]} print(word_lengths) # {AI: 2, Python: 6, LangChain: 9}函数与面向对象Python 的函数支持默认参数、可变参数、关键字参数非常灵活。面向对象方面Python 的类机制相对简单没有访问修饰符public/private通过命名约定单下划线/双下划线来表示私有性。oop_demo.pyPythonclass AIModel: # 类属性相当于 Java static provider OpenAI # __init__ 是构造方法注意双下划线 def __init__(self, model_name: str, api_key: str): self.model_name model_name # 实例属性 self._api_key api_key # 约定单下划线 受保护 self.__call_count 0 # 双下划线 名称修饰伪私有 # 实例方法第一个参数必须是 self def chat(self, prompt: str) - str: self.__call_count 1 return f[{self.model_name}] 回复{prompt[:20]}... # property 装饰器 —— 把方法变成属性访问 property def call_count(self) - int: return self.__call_count # 类方法 classmethod def create_default(cls): return cls(gpt-4o-mini, sk-xxx) # 使用 model AIModel(gpt-4o, sk-test123) print(model.chat(你好请介绍一下自己)) print(model.call_count) # 1像属性一样访问不需要括号Python 容器速查containers.pyPython# list —— 有序可变相当于 Java ArrayList arr [1, 2, 3] arr.append(4) arr[0] 10 # 索引访问 last arr[-1] # 负数索引 倒数第一个Python 特色 sub arr[1:3] # 切片 [2, 3] # tuple —— 有序不可变相当于 只读列表 t (1, 2, 3) # t[0] 10 # TypeError! # dict —— 键值对相当于 Java HashMap d {name: Alice, age: 25} d[city] Beijing print(d.get(salary, 0)) # 安全取值默认 0 # set —— 无序不重复相当于 Java HashSet s {1, 2, 3, 3, 3} print(s) # {1, 2, 3} # 解包unpacking—— Python 的神级语法 a, b, *rest [1, 2, 3, 4, 5] print(rest) # [3, 4, 5]AI 开发环境搭建工欲善其事必先利其器。AI 开发对 Python 版本和依赖管理要求很高因为很多深度学习库对版本兼容性极其敏感。今天搭建了一套「可复现」的开发环境。环境清单Python 3.11.9当前 AI 生态的主流版本比 3.12 兼容性更好Miniconda轻量级环境管理器比 Anaconda 更省空间VS Code配合 Python 插件 Jupyter 插件开发体验极佳Poetry现代化 Python 依赖管理工具替代 pip requirements.txt终端命令Bash# 1. 安装 MinicondaWindows PowerShell # 下载地址https://docs.conda.io/en/latest/miniconda.html # 2. 创建独立环境隔离是王道 conda create -n ai-dev python3.11 -y conda activate ai-dev # 3. 安装核心依赖 pip install openai requests python-dotenv jupyterlab # 4. 验证环境 python -c import openai; print(openai.__version__) # 输出1.35.12或更高项目结构规划项目目录结构Treeai-learning/ ├── .env # API 密钥等敏感配置加入 .gitignore ├── .gitignore ├── requirements.txt # 依赖清单 ├── notebooks/ # Jupyter 实验笔记 │ ├── 01_python_basics.ipynb │ └── 02_prompt_engineering.ipynb ├── src/ │ ├── __init__.py │ ├── llm_client.py # 大模型 API 封装 │ └── prompt_templates.py # 提示词模板库 └── tests/ └── test_llm_client.py安全提醒永远不要将 API Key 硬编码在代码中使用.env文件存储密钥并通过python-dotenv加载。.env文件必须加入.gitignore否则密钥泄露可能导致账号被盗刷。大模型 API 调用实战学会调用大模型 API 是 AI 应用开发的第一步。目前主流的大模型 API 基本遵循 OpenAI 的格式标准这意味着学会一套接口就能快速迁移到国内各大平台。封装通用 LLM 客户端为了让代码可复用、可切换不同模型我封装了一个通用的 LLMClient 类支持 OpenAI、DeepSeek、智谱 GLM、阿里通义等多个平台。src/llm_client.pyPythonimport os from typing import Iterator, Optional from dataclasses import dataclass from dotenv import load_dotenv from openai import OpenAI load_dotenv() dataclass class LLMConfig: 大模型配置 base_url: str api_key: str model: str temperature: float 0.7 max_tokens: int 2048 class LLMClient: 通用大模型客户端兼容 OpenAI 格式 # 预置常用平台配置 PRESETS { deepseek: LLMConfig( base_urlhttps://api.deepseek.com/v1, api_keyos.getenv(DEEPSEEK_API_KEY, ), modeldeepseek-chat ), zhipu: LLMConfig( base_urlhttps://open.bigmodel.cn/api/paas/v4, api_keyos.getenv(ZHIPU_API_KEY, ), modelglm-4-flash ), openai: LLMConfig( base_urlhttps://api.openai.com/v1, api_keyos.getenv(OPENAI_API_KEY, ), modelgpt-4o-mini ), } def __init__(self, config: LLMConfig): self.config config self.client OpenAI( base_urlconfig.base_url, api_keyconfig.api_key ) classmethod def from_preset(cls, name: str) - LLMClient: if name not in cls.PRESETS: raise ValueError(fUnknown preset: {name}. Available: {list(cls.PRESETS.keys())}) return cls(cls.PRESETS[name]) def chat( self, messages: list[dict], stream: bool False, temperature: Optional[float] None ) - str | Iterator[str]: 发送对话请求 :param messages: 消息列表格式 [{role: user, content: ...}, ...] :param stream: 是否流式输出 :param temperature: 创造性参数0~2越大越随机 response self.client.chat.completions.create( modelself.config.model, messagesmessages, streamstream, temperaturetemperature or self.config.temperature, max_tokensself.config.max_tokens ) if stream: return (chunk.choices[0].delta.content or for chunk in response if chunk.choices[0].delta.content) return response.choices[0].message.content def simple_chat(self, prompt: str, system: str ) - str: 简化版单轮对话 messages [] if system: messages.append({role: system, content: system}) messages.append({role: user, content: prompt}) return self.chat(messages)调用示例非流式 vs 流式test_llm.pyPythonfrom src.llm_client import LLMClient # 1. 从预置配置创建客户端自动读取 .env 中的 API Key client LLMClient.from_preset(deepseek) # 2. 非流式调用等待完整响应 response client.simple_chat( prompt用一句话解释什么是 RAG, system你是一位耐心的 AI 讲师用中文回答 ) print(response) # 输出RAG检索增强生成是一种让大模型在回答问题时先检索外部知识库再将检索到的信息与生... # 3. 流式调用逐字输出适合打字机效果 print(\n 流式输出 ) stream client.chat( messages[{role: user, content: Python 的列表推导式有什么优势}], streamTrue ) for chunk in stream: print(chunk, end, flushTrue) # 4. 多轮对话保留上下文 messages [ {role: system, content: 你是 Java 专家帮助用户学习 Python}, {role: user, content: Python 的 self 和 Java 的 this 有什么区别}, {role: assistant, content: 主要区别有三点1. Python 的 self 必须显式声明...}, {role: user, content: 那 classmethod 对应 Java 的什么}, ] response client.chat(messages) print(response)选择模型的建议学习阶段推荐 DeepSeek 或智谱 GLM-4-Flash它们对中文支持好且成本极低甚至免费额度够用。OpenAI 的 gpt-4o-mini 也很便宜但需要解决网络问题。生产环境根据业务需求选择模型能力 vs 成本的平衡点。提示工程入门提示工程Prompt Engineering被很多人戏称为「咒语学」但它实际上是一门关于「如何与模型高效沟通」的技术。一个好的提示词能让模型输出质量提升数倍。核心技巧一角色设定Role Prompting给模型设定一个明确的角色能显著改变回答的风格和深度。这是因为大模型在预训练时学习了大量不同角色的文本角色提示相当于激活了对应的「专家模式」。prompt_templates.pyPython# 策略对比无角色 vs 有角色 # ❌ 差提示 BAD_PROMPT 解释一下 RESTful API # ✅ 好提示角色 目标受众 输出格式 GOOD_PROMPT 你是一位拥有 10 年经验的 Java 后端架构师 正在给一位从 Java 转 Python 的 AI 全栈工程师讲解概念。 请用类比的方式解释 RESTful API并给出 PythonFastAPI和 JavaSpring Boot的代码对比。 要求 1. 先用一个生活化的类比引入 2. 分点说明核心原则 3. 代码片段带注释 4. 总字数控制在 300 字以内 # 调用 client LLMClient.from_preset(zhipu) result client.simple_chat(GOOD_PROMPT) print(result)核心技巧二Few-shot 示例学习Zero-shot 是直接给任务Few-shot 是先给几个示例让模型「照葫芦画瓢」。对于格式敏感的任务如 JSON 提取、情感分类Few-shot 的效果通常明显更好。few_shot_demo.pyPython# Few-shot 示例从用户评论中提取情感标签和关键词 few_shot_prompt 请分析用户评论的情感倾向并提取关键词。 输出格式必须是 JSON{sentiment: 正面/负面/中性, keywords: [关键词1, ...], score: 0~1} 示例1 评论这个手机电池太耐用了一天不用充电 输出{sentiment: 正面, keywords: [电池, 耐用], score: 0.95} 示例2 评论物流慢得像蜗牛等了一周才到。 输出{sentiment: 负面, keywords: [物流慢, 等待时间长], score: 0.15} 示例3 评论功能挺全的不过价格有点贵。 输出{sentiment: 中性, keywords: [功能全, 价格贵], score: 0.5} 现在请分析 评论Python 的语法真的很优雅写起来比 Java 爽多了就是运行速度有点慢。 输出 client LLMClient.from_preset(deepseek) result client.simple_chat(few_shot_prompt) print(result) # 输出{sentiment: 正面, keywords: [语法优雅, 开发效率高], score: 0.75}核心技巧三链式思考Chain-of-Thought对于复杂推理任务数学计算、逻辑判断、代码调试直接问答案模型容易出错。通过在提示词中加入「请一步步思考」或「Lets think step by step」能引导模型展示推理过程显著提高准确率。cot_demo.pyPython# 链式思考让模型展示推理过程 math_prompt 你是一位严格的数学老师。请解答下面的题目 必须展示完整的推理步骤最后给出答案。 题目一个水池有甲、乙两个进水管。单开甲管 6 小时注满单开乙管 4 小时注满。 如果两管同时开几小时可以注满 请按以下格式回答 步骤1... 步骤2... ... 答案X 小时 client LLMClient.from_preset(zhipu) result client.simple_chat(math_prompt) print(result) # 模型会输出详细的步骤推导而不是直接猜一个数字提示词工程黄金法则1) 明确角色和任务边界2) 提供输入/输出的具体格式示例3) 复杂任务拆分为子步骤4) 用分隔符如 ###区分不同部分5) 给模型「思考时间」Chain-of-Thought6) 迭代优化根据输出结果反向调整提示词。踩坑记录坑 1Conda 环境激活后 pip 安装的包不在环境里现象激活了 ai-dev 环境用pip install openai安装成功但运行代码时提示ModuleNotFoundError: No module named openai。原因Windows 上如果同时安装了系统 Python 和 AnacondaPowerShell 的 pip 可能指向系统 Python 的 pip而不是当前 conda 环境的 pip。解决在 conda 环境中使用python -m pip install openai确保使用的是当前环境的 Python 解释器。或者先执行conda install pip再使用 pip。坑 2OpenAI 客户端连接超时 / SSL 错误现象调用国内大模型 API如 DeepSeek时偶尔出现APIConnectionError或 SSL 证书验证失败。原因部分国内 API 节点的 SSL 证书链不完整或者网络存在中间人代理干扰。解决在创建 OpenAI 客户端时添加超时和重试配置开发环境可临时关闭 SSL 验证生产环境不推荐。另外建议使用 requests 库的 Session 复用连接。坑 3Python 的 mutable 默认参数陷阱现象写了一个函数def foo(items[])多次调用后发现列表里的数据在累积。原因Python 的默认参数在函数定义时只计算一次而不是每次调用时。如果默认参数是可变对象list/dict所有调用会共享同一个对象解决使用None作为默认值在函数体内初始化。代码修正# ❌ 错误 def append_item(item, items[]): items.append(item) return items # ✅ 正确 def append_item(item, itemsNone): if items is None: items [] items.append(item) return items坑 4API Key 泄露到 GitHub现象不小心把包含 API Key 的代码 push 到了公开仓库几分钟后收到邮件提醒「您的 API Key 已被禁用」。原因各大平台OpenAI/DeepSeek 等都有爬虫监控公开仓库的密钥一旦泄露会立即自动禁用。解决1) 立即在平台后台撤销该 Key 并重新生成2) 使用.env.gitignore管理密钥3) 使用git filter-repo或 BFG 从历史提交中彻底删除敏感信息。收获总结今日学习收获今天完成了从 Java 到 Python 的「语境切换」并成功调通了第一个大模型 API。总结一下关键收获Python 核心语法动态类型、缩进语法、列表/字典推导式、装饰器、解包 —— 这些特性让代码表达力极强但也需要适应「Pythonic」的思维方式环境管理conda 虚拟环境是 Python 开发的必备技能隔离环境能避免 90% 的依赖冲突问题LLM API 封装通过 LLMClient 统一封装实现了「一份代码多平台切换」为后续 LangChain 集成打下了基础提示工程三板斧角色设定让回答更专业、Few-shot 让格式更稳定、Chain-of-Thought 让推理更准确心态调整从强类型语言切换到动态类型语言最大的挑战不是语法而是思维方式的转变 —— Python 更强调「简洁表达」Java 更强调「类型安全」。两者没有优劣只有场景之分。在 AI 和数据领域Python 的生态优势是压倒性的。明日计划Day 22 · 提示工程进阶 LangChain 框架入门提示工程进阶ReAct 框架、Self-Consistency、Prompt ChainingLangChain 核心概念Chains、Agents、Memory、ToolsLangChain 实战构建一个多轮对话的「Python 学习助手」文档加载与分割TextLoader、RecursiveCharacterTextSplitter