一、开篇回顾 + 今日目标
开篇回顾
Day6 我们掌握了函数进阶(函数嵌套、lambda 匿名函数、可变参数)以及 Python 模块导入的核心用法,实现了大模型预处理工具的封装,完成了从简单函数到模块化代码的升级。而在实际大模型开发中,对话历史持久化存储、模型配置文件读写、本地知识库导入都离不开文件操作,同时程序运行中难免出现文件缺失、参数错误、网络波动等问题,异常处理能让脚本避免崩溃、提升容错性,这两项技能是大模型脚本从 "测试运行" 走向 "实战可用" 的核心必备能力。
今日目标
- 掌握 Python 文件操作核心:精通
open()函数、with open()语法,实现 txt、json 文件的读、写、追加操作,适配大模型日志保存、配置读取、知识库导入场景; - 熟练异常处理体系:掌握
try-except基础捕获、else/finally进阶用法、raise主动抛异常,覆盖大模型开发常见异常场景; - 结合大模型实战:封装配置读取、对话保存、历史查询一体化工具,实现文件操作与异常处理的综合应用;
- 梳理高频易错点,完成针对性练习,彻底规避中文乱码、文件覆盖、异常漏捕等问题。
二、核心知识点(大模型开发专属)
(一)文件操作基础
1. 核心概念与 open () 函数
文件操作是实现数据持久化的核心,Python 中通过内置open()函数操作文件,无需额外安装模块,是大模型开发存储对话、配置、知识库的基础手段。基础语法:
open(file, mode='r', encoding='utf-8')
关键参数说明:
-
file:文件路径,支持相对路径(同文件夹)和绝对路径,大模型开发常用相对路径;
-
mode:文件打开模式,大模型场景高频 4 种模式: 表格
模式 功能 适用场景 r只读模式(默认) 读取模型配置、知识库、历史对话 w只写模式(覆盖原有内容) 重新写入配置、清空日志 a追加模式(末尾添加) 持续保存对话历史,不覆盖旧数据 r+读写模式 同时读取和修改文件内容 -
encoding:编码格式,必须指定 utf-8,避免中文乱码,大模型场景必用。
最佳实践 :使用with open()语句,无需手动关闭文件,系统自动释放资源,杜绝文件占用问题。
2. 常用文件操作(大模型实战示例)
(1)读取文件(配置 / 知识库读取)
# 读取大模型JSON配置文件
import json
def read_model_config(config_path="model_config.json"):
"""读取大模型配置文件,返回配置字典"""
try:
with open(config_path, 'r', encoding='utf-8') as f:
config = json.load(f)
return config
except FileNotFoundError:
# 文件不存在时返回默认配置
default_config = {"model": "qwen-7b", "temperature": 0.7, "max_tokens": 1024}
return default_config
# 读取TXT格式知识库
def read_knowledge_base(kb_path="knowledge_base.txt"):
"""读取本地知识库,返回有效内容列表"""
with open(kb_path, 'r', encoding='utf-8') as f:
# 读取所有行,去除空行和换行符
content = [line.strip() for line in f if line.strip()]
return content
(2)写入 / 追加文件(对话日志保存)
from datetime import datetime
# 写入JSON格式对话历史
def save_chat_history(chat_data, history_path="chat_history.json"):
"""保存单轮对话历史,追加模式不覆盖"""
# 先读取原有历史
try:
with open(history_path, 'r', encoding='utf-8') as f:
all_history = json.load(f)
except (FileNotFoundError, json.JSONDecodeError):
all_history = []
# 添加时间戳
chat_data["save_time"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
all_history.append(chat_data)
# 写入文件
with open(history_path, 'w', encoding='utf-8') as f:
json.dump(all_history, f, ensure_ascii=False, indent=4)
# 追加TXT格式对话日志
def append_chat_log(user_input, ai_response, log_path="chat_log.txt"):
"""追加对话日志到txt文件,实时记录"""
time_str = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
log_content = f"【{time_str}】用户:{user_input}\n【{time_str}】助手:{ai_response}\n\n"
with open(log_path, 'a', encoding='utf-8') as f:
f.write(log_content)
(二)异常处理
1. 核心概念
程序运行中出现的错误即为异常,如文件不存在、参数格式错误、网络超时等,若不处理会直接导致程序崩溃。Python 通过try-except语句捕获并处理异常,让大模型脚本更健壮,即使出错也能给出友好提示而非直接终止。
2. 异常处理完整语法
try:
# 可能出现异常的代码
待执行的风险代码
except 具体异常类型1:
# 对应异常的处理逻辑
容错处理
except 具体异常类型2:
# 多异常分别处理
容错处理
else:
# 无异常时执行的代码
正常执行逻辑
finally:
# 无论是否异常,必执行的代码
资源释放、收尾操作
主动抛异常 :使用raise 异常类型("提示信息"),主动触发异常,用于参数校验、非法操作拦截。
3. 大模型高频异常处理示例
# 模型参数校验+异常捕获
def check_model_params(temperature, max_tokens):
"""校验大模型参数,异常处理"""
try:
if not isinstance(temperature, (int, float)):
raise TypeError("温度参数必须是数字")
if not<= 1.0:
raise ValueError("温度需在0-1.0之间")
if max_tokens< 256:
raise ValueError("最大tokens不能小于256")
return True, "参数校验通过"
except TypeError as e:
return False, f"参数类型错误:{str(e)}"
except ValueError as e:
return False, f"参数值错误:{str(e)}"
except Exception as e:
return False, f"未知异常:{str(e)}"
# 文件操作异常捕获
def safe_read_file(file_path):
"""安全读取文件,覆盖常见文件异常"""
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
return True, content
except FileNotFoundError:
return False, "文件不存在,请检查路径"
except UnicodeDecodeError:
return False, "文件编码错误,请使用UTF-8编码"
except Exception as e:
return False, f"文件读取失败:{str(e)}"
(三)文件操作 + 异常处理综合实战
将文件操作与异常处理结合,封装大模型开发常用的配置管理 + 对话存储工具,实现全流程容错,直接可用于实战开发。
import json
from datetime import datetime
# 大模型文件操作工具类
class ModelFileTool:
def __init__(self, config_path="model_config.json", history_path="chat_history.json"):
self.config_path = config_path
self.history_path = history_path
# 加载模型配置
def load_config(self):
try:
with open(self.config_path, 'r', encoding='utf-8') as f:
return json.load(f)
except Exception:
# 异常时初始化默认配置并保存
default_config = {"model": "qwen-7b", "temperature": 0.7, "max_tokens": 1024}
with open(self.config_path, 'w', encoding='utf-8') as f:
json.dump(default_config, f, ensure_ascii=False, indent=4)
return default_config
# 保存对话历史
def save_chat(self, user_msg, ai_msg):
chat_data = {
"user": user_msg,
"ai": ai_msg,
"time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
try:
with open(self.history_path, 'r', encoding='utf-8') as f:
history = json.load(f)
except:
history = []
history.append(chat_data)
with open(self.history_path, 'w', encoding='utf-8') as f:
json.dump(history, f, ensure_ascii=False, indent=4)
return "对话保存成功"
三、今日实操(代码可直接复制运行)
实操 1:模型配置文件读写 + 异常处理
# 实操1:创建、读取、修改模型配置
import json
def operate_model_config():
# 1. 初始化配置
config = {"model": "chatglm3-6b", "temperature": 0.8, "max_tokens": 512}
# 2. 写入配置文件
with open("model_config.json", "w", encoding="utf-8") as f:
json.dump(config, f, ensure_ascii=False, indent=4)
print("配置文件创建成功")
# 3. 读取并修改配置
try:
with open("model_config.json", "r", encoding="utf-8") as f:
new_config = json.load(f)
new_config["temperature"] = 0.6
with open("model_config.json", "w", encoding="utf-8") as f:
json.dump(new_config, f, ensure_ascii=False, indent=4)
print("配置修改成功,新配置:", new_config)
except Exception as e:
print("配置操作失败:", e)
operate_model_config()
实操 2:对话历史保存 + 异常捕获
# 实操2:模拟大模型对话,保存历史并处理异常
def chat_and_save():
# 初始化工具
tool = ModelFileTool()
# 加载配置
config = tool.load_config()
print("当前使用模型:", config["model"])
# 模拟对话
user_input = input("请输入问题:")
# 参数校验
is_valid, msg = check_model_params(config["temperature"], config["max_tokens"])
if not is_valid:
print(msg)
return
# 模拟响应
ai_response = f"基于{config['model']}的回答:您的问题是{user_input}"
print("助手:", ai_response)
# 保存对话
save_result = tool.save_chat(user_input, ai_response)
print(save_result)
chat_and_save()
实操 3:知识库文件读取 + 容错处理
# 实操3:读取本地知识库,过滤无效内容
def read_knowledge_safe():
file_path = "knowledge_base.txt"
# 先创建测试文件
with open(file_path, "w", encoding="utf-8") as f:
f.write("什么是大模型\n")
f.write("大模型参数调优方法\n")
f.write("RAG技术实战应用\n")
# 安全读取
success, content = safe_read_file(file_path)
if success:
print("知识库内容:")
for idx, line in enumerate(content.split("\n"), 1):
if line:
print(f"{idx}. {line}")
else:
print(content)
read_knowledge_safe()
四、易错点汇总(新手必避坑)
- 中文乱码问题 :文件操作未指定
encoding='utf-8',导致中文显示乱码,大模型场景所有文件读写必须加该参数; - 文件覆盖丢失 :误用
w模式追加数据,覆盖原有历史日志,持续保存数据必须用a模式; - 异常捕获滥用 :仅用
except:捕获所有异常,隐藏未知错误,无法定位问题,建议捕获具体异常类型; - 文件未关闭 :不用
with open()且忘记调用close(),导致文件被占用,无法二次操作; - JSON 格式错误 :写入 JSON 文件时数据格式不规范,读取时触发
JSONDecodeError,需保证写入数据为字典 / 列表格式; - 路径错误 :文件路径写错,触发
FileNotFoundError,同文件夹文件直接写文件名,无需加多余路径; - 参数异常漏判:模型参数未校验,传入非数字、超出范围,导致后续程序报错。
五、今日练习(10 分钟快速巩固)
- 编写函数,创建一个大模型配置文件
ai_config.json,包含模型名称、温度、max_tokens 参数,读取并打印配置; - 编写函数,实现对话日志追加功能,输入用户问题和模型响应,自动追加到
chat_log.txt,添加时间戳; - 给上述两个函数添加异常处理,捕获文件不存在、编码错误、参数类型错误等异常;
- 综合练习:封装一个完整脚本,实现 "加载配置→模拟对话→保存历史→读取历史" 全流程,全程异常处理。
六、次日预告
Day8 将学习 Python列表 / 字典高级用法 和数据过滤、排序、遍历优化 ,针对大模型开发中的对话历史管理、批量 prompt 处理、知识库数据筛选进行专项实战,让大模型数据处理更高效,为后续批量调用大模型 API 打下坚实基础!