一、本周学习收获
1. 类与对象
本周深入理解了面向对象编程的核心思想。类是对象的模板,对象是类的实例。通过new关键字创建对象,对象拥有类的属性和方法。
classStudent:def__init__(self,name,age):self.name=name self.age=agedefstudy(self):print(f"{self.name}正在学习")# 创建对象stu=Student("张三",20)stu.study()2. 面向过程 vs 面向对象
- 面向过程:以函数为中心,按步骤解决问题,关注"怎么做"
- 面向对象:以对象为中心,将数据和操作封装在一起,关注"谁来做"
面向对象更符合人类的思维习惯,便于代码复用和维护。
3. 三大特性
封装
封装将对象的属性和方法隐藏起来,只对外暴露必要的接口。通过private修饰属性,防止外部直接访问和修改。
继承
子类继承父类的属性和方法,实现代码复用。使用extends关键字,子类可以重写父类的方法。
classAnimal:defeat(self):print("动物在吃东西")classDog(Animal):defeat(self):print("狗在啃骨头")多态
同一方法在不同对象上有不同表现。通过父类引用指向子类对象,调用时动态绑定实际类型的方法。
a=Dog()a.eat()# 输出:狗在啃骨头4. 私有化与 set/get 方法
属性私有化后,通过set方法修改值、get方法查询值,保证数据安全。
classPerson:def__init__(self):self._name=Nonedefset_name(self,name):self._name=namedefget_name(self):returnself._name5. 利用 OpenAI SDK 调用大模型
本周学习了如何通过 OpenAI SDK 调用大模型接口,核心流程包括:
- 任务:明确要完成的任务目标
- 对象:确定调用的大模型对象
- 约束内容:设置参数约束(如温度、最大 token 数)
- 表达:构造合适的提示词
- 提供上下文:给模型提供必要的背景信息
fromopenaiimportOpenAI client=OpenAI(api_key="your-api-key")completion=client.chat.completions.create(model="gpt-4",messages=[{"role":"user","content":"请解释什么是多态"}],)print(completion.choices[0].message.content)6. 提示词与提示词注入
- 提示词(Prompt):引导模型输出的输入文本,好的提示词能显著提升回答质量
- 提示词注入(Prompt Injection):恶意构造输入,试图让模型执行非预期指令,需要做好防护
7. 断点的使用
调试时设置断点可以暂停程序执行,观察变量状态:
- 恢复程序(Resume):继续执行到下一个断点
- 步过(Step Over):单步执行,不进入方法内部
8. HTTP 协议与 API 交互
请求结构
- 请求行:方法 + URL + 协议版本
- 请求头:携带认证信息、内容类型等
- 请求体:携带业务数据
响应结构
- 状态行:协议版本 + 状态码 + 状态描述
- 响应头:服务器信息、内容类型等
- 响应体:返回的业务数据
状态码
- 200:成功
- 400:客户端请求错误
- 500:服务端内部错误
9. Swagger 接口文档
Swagger 可以自动生成接口文档,方便前后端联调。一个好的接口必须有参数校验,对参数类型进行校验,避免非法数据进入系统。
10. 请求与响应规范
11. 对话小助手项目实践
本周还利用 AI 工具实现了一个简易版的智能对话界面,将前面学到的大模型调用、HTTP 协议、接口规范等知识串联起来。
项目目标
做一个能跟用户对话的小助手,用户输入问题,AI 返回回答,界面实时展示对话内容。
核心流程
- 前端界面:搭建一个简单的聊天窗口,包含输入框、发送按钮和消息列表
- 后端接口:接收用户消息,调用大模型 SDK 获取回答
- 对话交互:把用户消息和 AI 回答按顺序展示在界面上
importosimportuvicornfromopenaiimportOpenAIfromfastapiimportFastAPI app=FastAPI()# 请将 api_key 和 base_url 替换为你自己的配置client=OpenAI(api_key="your-api-key",base_url="https://your-base-url/v1",)msgs=[{"role":"system","content":"你是一只可爱的小狗,每次回答都需要汪一下"}]@app.get("/chat")defsend_message(msg:str):u_msg={"role":"user","content":msg}msgs.append(u_msg)completion=client.chat.completions.create(model="qwen3.8-max",messages=msgs,)result=completion.choices[0].message.content ai_msg={"role":"assistant","content":result}msgs.append(ai_msg)returnresultif__name__=="__main__":uvicorn.run(app,host="127.0.0.1",port=8000)收获与体会
- 把「请求有规范、响应有规范」真正落地到了项目里,前后端联调顺畅了很多
- 通过实际调用大模型,加深了对提示词工程的理解——同样的接口,提示词写得好,回答质量差别很大
- 调试时用断点观察请求参数和响应结果,比盲目打印高效得多
请求有规范,响应也应有统一规范:
{"msg":"操作成功","data":[],"code":200}统一响应格式便于前端统一处理,降低联调成本。
二、遇到的难题与困惑
1. 多态的理解
刚开始很难理解为什么父类引用调用子类方法,后来通过画内存图、多写多练,逐渐明白了动态绑定的原理。
2. 提示词注入的防护
如何有效防止提示词注入?目前的理解是:对用户输入做过滤、限制系统指令的暴露、使用分隔符区分指令和数据,但实际效果还需要进一步验证。
3. HTTP 状态码的区分
400 和 500 的区别容易混淆。经过学习明确:400 是客户端的问题(参数错误、格式不对),500 是服务端的问题(代码异常、数据库故障)。
4. 参数校验的粒度
不知道参数校验应该做到什么程度,是只校验类型,还是也要校验业务规则(如范围、格式)?目前倾向于:基础类型校验 + 关键业务规则校验。
三、错题反思与总结
1. 封装理解错误
错误:以为private只是语法要求,不理解其意义。
反思:封装的核心是"保护数据 + 隐藏实现",private是手段,安全是目的。
2. 继承与多态混淆
错误:以为继承就是多态。
反思:继承是代码复用机制,多态是运行时行为。继承是多态的前提之一,但多态还依赖方法重写和动态绑定。
3. 响应格式不统一
错误:不同接口返回不同格式,前端处理困难。
反思:统一响应格式({msg, data, code})是接口设计的基本规范,应在项目初期就确定。
4. 调试效率低
错误:遇到问题不会用断点,只会加打印语句。
反思:断点 + 步过 + 观察变量,比打印语句更高效,应养成调试习惯。
5. 总结
本周收获很大,从面向对象基础到 HTTP 协议、大模型调用,知识面拓宽了不少。接下来需要:
- 多写代码巩固面向对象三大特性
- 深入理解 HTTP 协议细节
- 练习提示词工程,提升大模型调用效果
- 规范接口设计,养成良好编码习惯