news 2026/7/6 3:10:03

大模型微调实战:从LoRA原理到Qwen2-7B金融问答模型部署

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
大模型微调实战:从LoRA原理到Qwen2-7B金融问答模型部署

🚀 30+款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度

1. 背景与核心概念:为什么需要微调?

在AI大模型应用开发中,我们常常遇到一个核心矛盾:通用大模型(如Qwen、GPT、DeepSeek)虽然知识渊博、能力强大,但在面对特定业务场景时,其回答往往显得“泛泛而谈”,缺乏专业深度,甚至会产生“幻觉”,给出不符合业务逻辑的答案。例如,一个金融领域的问答机器人,如果直接询问通用模型“如何评估一家初创公司的信贷风险?”,得到的回答可能是一套教科书式的理论,而无法结合具体的行业数据、内部风控指标和最新的监管政策。

大模型微调(Fine-tuning)正是为了解决这一矛盾而生的核心技术。简单来说,微调就是在已经完成预训练的“通才”模型基础上,使用我们自己的、特定领域的数据集,对模型的部分或全部参数进行一轮“小规模、有针对性”的再训练。这个过程就像是让一个已经大学毕业的“通才”学生,再去攻读某个特定领域的“硕士”或“博士”,从而成为该领域的专家。

与另一种流行的技术——提示工程(Prompt Engineering)相比,微调是更深层次的“改造”。提示工程通过精心设计输入文本来引导模型输出,不改变模型本身;而微调则是直接调整模型的“大脑”(参数),使其内部知识结构和推理模式都更贴近目标领域。因此,微调后的模型在特定任务上的性能上限更高、响应更稳定,且能“记住”领域知识,无需在每次提问时都通过长提示词来灌输上下文。

对于开发者而言,掌握微调意味着能够:

  1. 打造专属模型:将通用模型转化为贴合企业业务、具有核心竞争力的私有化AI资产。
  2. 提升任务精度:在情感分析、代码生成、客服问答、报告撰写等垂直任务上,获得远超通用模型的效果。
  3. 控制输出风格与格式:让模型学会按照公司规定的模板、术语和格式生成内容。
  4. 降低使用成本与延迟:一个针对性强的微调小模型,其推理速度可能比通过长上下文提示调用超大模型更快,且API调用成本更低。

2. 环境准备与版本说明

微调是一个涉及数据处理、模型训练和评估的完整机器学习流程,因此需要一个稳定且功能齐全的开发环境。以下是一个基于Python的推荐环境配置,适用于大多数开源大模型(如Qwen、LLaMA系列)的微调实验。

核心环境清单:

  • 操作系统:Linux (Ubuntu 20.04/22.04 LTS 推荐) 或 macOS。Windows用户建议使用WSL2。
  • Python: 3.8, 3.9 或 3.10。避免使用最新的3.11+,某些深度学习库可能兼容性不佳。
  • CUDA(GPU训练必需): 11.7 或 11.8。版本需与PyTorch和显卡驱动匹配。
  • 深度学习框架
    • PyTorch: 2.0+
    • Transformers (Hugging Face库): 4.30+
  • 微调工具/库
    • PEFT(Parameter-Efficient Fine-Tuning): 0.5+,用于LoRA等高效微调方法。
    • TRL(Transformer Reinforcement Learning): 0.7+,用于SFT、PPO等训练。
    • Datasets: 2.10+,用于便捷的数据集加载与处理。
    • Accelerate: 0.21+,简化分布式训练。
  • 辅助工具
    • Jupyter Notebook / Lab: 用于实验和可视化。
    • TensorBoard / WandB: 用于训练过程监控和可视化。

版本兼容性提示: 深度学习库的版本依赖非常严格。一个稳妥的安装方式是先确定PyTorch和CUDA版本,再安装其他库。可以使用以下命令创建环境并安装核心依赖:

# 创建并激活虚拟环境(以conda为例) conda create -n model_finetune python=3.9 conda activate model_finetune # 安装与CUDA 11.8兼容的PyTorch (请根据你的CUDA版本调整) pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 安装Hugging Face核心库及微调工具 pip install transformers datasets accelerate peft trl pip install jupyter tensorboard wandb # 安装bitsandbytes(用于4/8-bit量化训练,可选但推荐) # Linux系统 pip install bitsandbytes # Windows系统可能需从源码编译或寻找预编译轮子,较为复杂,初期可跳过。

项目结构建议: 一个清晰的目录结构有助于管理代码、数据和实验。

finetune_project/ ├── configs/ # 存放训练配置文件 (yaml/json) ├── data/ # 原始数据和预处理后的数据 │ ├── raw/ │ └── processed/ ├── scripts/ # 训练、评估、推理脚本 ├── src/ # 核心源代码 │ ├── data_processor.py # 数据预处理模块 │ ├── trainer.py # 训练循环封装 │ └── utils.py # 工具函数 ├── outputs/ # 模型检查点、日志、评估结果 │ ├── checkpoint-1000/ │ ├── logs/ │ └── eval_results.json ├── notebooks/ # Jupyter notebooks 用于探索性分析 └── requirements.txt # 项目依赖

3. 微调核心技术原理拆解

微调不是简单的“训练”,而是一系列旨在平衡效果、效率和资源消耗的技术组合。理解其核心原理是成功应用的关键。

3.1 全参数微调 vs. 高效微调

  • 全参数微调 (Full Fine-Tuning):更新预训练模型的所有参数。这种方法效果通常最好,因为模型有最大的自由度来适应新数据。但缺点极其明显:需要巨大的计算资源(多张高端GPU)、海量的存储空间(保存整个大模型的副本)和更长的训练时间,并且容易导致灾难性遗忘——模型在新任务上表现好了,却忘记了原有的通用知识。

  • 高效微调 (Parameter-Efficient Fine-Tuning, PEFT):只更新模型中极小一部分参数,而冻结绝大部分原始参数。这就像只给模型换上一个轻量级的“适配器”。它极大地降低了计算和存储需求,使得在消费级GPU上微调百亿参数模型成为可能,同时能有效缓解灾难性遗忘。LoRA是当前最流行、最有效的PEFT方法之一。

3.2 LoRA (Low-Rank Adaptation) 详解

LoRA的核心思想非常巧妙:它认为模型在适应新任务时,其权重矩阵的更新具有“低秩”特性。换言之,一个巨大的权重矩阵变化,可以用两个小得多的矩阵相乘来近似表示。

具体实现: 对于预训练模型中的一个权重矩阵W(维度为d x k),LoRA不直接更新W,而是保持W冻结,并旁路添加一个低秩分解的增量:ΔW = B * A。其中Ad x r的矩阵,Br x k的矩阵,r远小于dkr就是LoRA的秩,通常为4, 8, 16)。在训练时,只更新AB这两个小矩阵的参数。

前向传播公式变为h = Wx + ΔWx = Wx + BAx

为什么有效?

  1. 参数巨减:假设W有100M参数,r=8,则AB总共只有约(d+k)*r个参数,可能只有原参数的0.1%。
  2. 部署便捷:训练完成后,可以将增量合并回原权重 (W' = W + BA),推理时无需任何额外计算,和原模型速度、架构完全一致。
  3. 模块化:可以为不同任务训练不同的LoRA适配器,并在推理时灵活切换,实现一个基础模型服务多个任务。

3.3 监督微调与对齐微调

  • 监督微调 (Supervised Fine-Tuning, SFT):这是最基础的微调范式。使用高质量的“指令-输出”配对数据(例如,{“instruction”: “写一首关于春天的诗”, “output”: “春眠不觉晓...”})来训练模型,使其学会遵循指令并生成符合要求的回答。SFT是让模型获得“任务能力”的关键一步。

  • 基于人类反馈的强化学习 (RLHF) 及其高效替代品

    • 传统RLHF (PPO):在SFT之后,通过人类对模型多个回答的排序来训练一个“奖励模型”,再用强化学习算法(如PPO)优化模型,使其输出能获得更高奖励。效果拔群,但流程复杂、成本高昂、训练不稳定。
    • DPO (Direct Preference Optimization):一种更简单稳定的替代方案。它直接利用偏好数据(好的回答 vs 坏的回答),通过一个闭式解来优化模型,绕过了奖励模型训练和不稳定的PPO步骤,已成为当前对齐微调的主流选择。
    • 其他:如GRPO、KTO等,也是旨在简化对齐流程的新方法。

3.4 其他关键技术

  • 量化 (Quantization):将模型权重从高精度(如FP32)转换为低精度(如INT8, INT4),以大幅减少模型内存占用和加速推理。QLoRA就是将量化与LoRA结合,在微调时使用4-bit量化的基础模型,进一步降低硬件门槛。
  • 知识蒸馏 (Knowledge Distillation):用一个大的、效果好的“教师模型”来指导一个小的“学生模型”的训练,旨在将大模型的能力压缩到小模型中,便于部署。

4. 完整实战案例:微调Qwen2-7B模型进行金融问答

下面我们将以微调Qwen2-7B-Instruct模型,打造一个金融领域问答助手为例,展示一个完整的微调流程。我们将使用LoRA进行高效微调,并使用TRL库的SFTTrainer

4.1 数据准备与预处理

微调的成功,70%取决于数据。我们需要准备一个高质量的指令微调数据集。

数据格式:通常采用JSON格式,每条数据包含指令、输入(可选)和输出。

[ { "instruction": "根据以下财务数据,计算该公司的流动比率。", "input": "流动资产:500万元,流动负债:200万元", "output": "流动比率 = 流动资产 / 流动负债 = 500 / 200 = 2.5。这表明公司每有1元流动负债,就有2.5元流动资产作为偿还保障,短期偿债能力较强。" }, { "instruction": "解释什么是市盈率(PE)。", "input": "", "output": "市盈率是公司股价与每股收益的比率。计算公式为:市盈率 = 股价 / 每股收益。它反映了投资者愿意为每1元公司盈利支付的价格,是评估股票估值水平的重要指标。通常,较低的PE可能表示股票被低估,但需结合行业和成长性综合判断。" } ]

数据预处理脚本 (src/data_processor.py): 我们需要将上述格式的数据,处理成模型训练时能接受的“文本-文本”对话格式。

# src/data_processor.py from datasets import Dataset import json def format_instruction_data(example): """将单条数据格式化为模型输入的文本""" if example.get('input', '').strip(): # 有输入的情况 text = f"<|im_start|>user\n{example['instruction']}\n{example['input']}<|im_end|>\n<|im_start|>assistant\n" else: # 没有输入的情况 text = f"<|im_start|>user\n{example['instruction']}<|im_end|>\n<|im_start|>assistant\n" # 注意:这里只生成输入文本,输出文本(即assistant的回答)会在tokenizer中作为labels处理。 return {"text": text, "output": example['output']} def load_and_process_data(data_path): """加载并处理数据集""" with open(data_path, 'r', encoding='utf-8') as f: raw_data = json.load(f) # 转换为Hugging Face Dataset格式 dataset = Dataset.from_list(raw_data) # 应用格式化函数 formatted_dataset = dataset.map(format_instruction_data, remove_columns=dataset.column_names) # 划分训练集和验证集 (8:2) split_dataset = formatted_dataset.train_test_split(test_size=0.2, seed=42) return split_dataset['train'], split_dataset['test'] if __name__ == "__main__": train_data, eval_data = load_and_process_data("./data/raw/finance_qa.json") print(f"训练集大小: {len(train_data)}, 验证集大小: {len(eval_data)}") print(train_data[0])

4.2 配置模型与LoRA

我们使用PEFT库来配置LoRA。创建一个配置文件configs/lora_config.yaml或直接在代码中定义。

# scripts/train_sft.py from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments from peft import LoraConfig, get_peft_model, TaskType from trl import SFTTrainer import torch from src.data_processor import load_and_process_data # 1. 加载模型和分词器 model_name = "Qwen/Qwen2-7B-Instruct" # 使用正确的模型ID tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True) # 设置padding token(如果模型没有) if tokenizer.pad_token is None: tokenizer.pad_token = tokenizer.eos_token model = AutoModelForCausalLM.from_pretrained( model_name, torch_dtype=torch.bfloat16, # 使用BF16精度节省显存 device_map="auto", # 自动分配到多GPU或CPU trust_remote_code=True ) # 2. 配置LoRA lora_config = LoraConfig( task_type=TaskType.CAUSAL_LM, # 因果语言模型任务 r=8, # LoRA秩 lora_alpha=32, # 缩放参数 lora_dropout=0.1, # Dropout率 target_modules=["q_proj", "k_proj", "v_proj", "o_proj"], # 针对Qwen的注意力模块 bias="none", ) # 应用LoRA到模型 model = get_peft_model(model, lora_config) model.print_trainable_parameters() # 打印可训练参数量,应该只占原模型的很小一部分 # 3. 加载数据 train_dataset, eval_dataset = load_and_process_data("./data/raw/finance_qa.json")

4.3 配置训练参数并启动训练

使用SFTTrainer,它封装了数据整理和SFT训练循环。

# 接上面的 scripts/train_sft.py # 4. 定义数据整理函数 def data_collator(features): """将一批数据整理成模型输入格式""" # 对输入文本进行tokenize input_texts = [f["text"] for f in features] batch = tokenizer(input_texts, padding=True, truncation=True, max_length=512, return_tensors="pt") # 对输出文本进行tokenize,作为labels output_texts = [f["output"] for f in features] labels = tokenizer(output_texts, padding=True, truncation=True, max_length=256, return_tensors="pt")["input_ids"] # 将labels拼接到input_ids后面,并调整attention_mask # 注意:这是一个简化示例,实际SFTTrainer内部会处理更复杂的格式。 # 更常见的做法是直接准备一个“text”字段,里面包含完整的对话(user+assistant),由trainer内部处理。 return batch # 实际上,对于SFTTrainer,更简单的做法是直接提供一个“text”字段,包含完整样本。 # 我们修改一下数据处理器,生成完整的对话文本。 def format_full_conversation(example): if example.get('input', '').strip(): prompt = f"<|im_start|>user\n{example['instruction']}\n{example['input']}<|im_end|>\n<|im_start|>assistant\n" else: prompt = f"<|im_start|>user\n{example['instruction']}<|im_end|>\n<|im_start|>assistant\n" full_text = prompt + example['output'] + tokenizer.eos_token # 加上结束符 return {"text": full_text} # 重新处理数据(假设已修改data_processor.py) train_dataset = train_dataset.map(format_full_conversation) eval_dataset = eval_dataset.map(format_full_conversation) # 5. 设置训练参数 training_args = TrainingArguments( output_dir="./outputs/qwen2-7b-finance-lora", # 输出目录 num_train_epochs=3, # 训练轮数 per_device_train_batch_size=4, # 每个GPU的批次大小 per_device_eval_batch_size=4, gradient_accumulation_steps=4, # 梯度累积步数,模拟更大批次 warmup_steps=100, # 学习率预热步数 logging_steps=50, # 每50步记录一次日志 eval_strategy="steps", # 按步数评估 eval_steps=200, save_strategy="steps", save_steps=200, learning_rate=2e-4, # LoRA常用学习率 fp16=False, # 使用BF16时关闭FP16 bf16=True, # 使用BF16混合精度训练 weight_decay=0.01, save_total_limit=3, # 只保留最后3个检查点 load_best_model_at_end=True, # 训练结束后加载最佳模型 metric_for_best_model="eval_loss", # 根据验证集损失选择最佳模型 greater_is_better=False, report_to="tensorboard", # 还可以用"wandb" ) # 6. 初始化Trainer并开始训练 trainer = SFTTrainer( model=model, args=training_args, train_dataset=train_dataset, eval_dataset=eval_dataset, tokenizer=tokenizer, max_seq_length=768, # 模型接受的最大序列长度 dataset_text_field="text", # 数据集中文本字段的名称 ) trainer.train()

4.4 模型保存与推理测试

训练完成后,保存模型并进行测试。

# scripts/inference.py from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline from peft import PeftModel, PeftConfig import torch # 加载基础模型和适配器 base_model_name = "Qwen/Qwen2-7B-Instruct" peft_model_id = "./outputs/qwen2-7b-finance-lora/checkpoint-600" # 你的LoRA适配器路径 # 加载基础模型 base_model = AutoModelForCausalLM.from_pretrained( base_model_name, torch_dtype=torch.bfloat16, device_map="auto", trust_remote_code=True ) tokenizer = AutoTokenizer.from_pretrained(base_model_name, trust_remote_code=True) # 加载LoRA权重并合并到基础模型 model = PeftModel.from_pretrained(base_model, peft_model_id) model = model.merge_and_unload() # 合并适配器,得到一个完整的、可独立推理的模型 # 创建文本生成管道 pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, device="cuda:0") # 定义对话模板 def build_prompt(instruction, input_text=""): if input_text: return f"<|im_start|>user\n{instruction}\n{input_text}<|im_end|>\n<|im_start|>assistant\n" else: return f"<|im_start|>user\n{instruction}<|im_end|>\n<|im_start|>assistant\n" # 测试 test_instruction = "什么是市净率(PB)?它和市盈率有什么区别?" prompt = build_prompt(test_instruction) result = pipe( prompt, max_new_tokens=256, # 生成的最大token数 do_sample=True, # 使用采样 temperature=0.7, # 采样温度 top_p=0.9, # 核采样参数 repetition_penalty=1.1, # 重复惩罚 eos_token_id=tokenizer.eos_token_id ) print("用户问题:", test_instruction) print("模型回答:", result[0]['generated_text'][len(prompt):]) # 只打印assistant部分

5. 常见问题与排查思路

在微调过程中,你几乎一定会遇到以下问题。下表提供了快速排查指南。

问题现象可能原因排查步骤与解决方案
CUDA Out Of Memory (OOM)1. 批次大小太大。
2. 模型太大,显存不足。
3. 序列长度设置过长。
4. 未使用梯度累积或混合精度。
1. 减小per_device_train_batch_size
2. 使用gradient_accumulation_steps累积梯度。
3. 启用bf16=Truefp16=True
4. 使用QLoRA(4-bit量化) 进一步降低显存。
5. 使用max_seq_length限制序列长度。
Loss 不下降或为 NaN1. 学习率过高。
2. 数据格式错误,标签未对齐。
3. 梯度爆炸。
4. 数据质量差,噪声大。
1. 大幅降低学习率(如从2e-4降到1e-5)。
2. 检查数据整理函数,确保input_idslabels正确对应。
3. 使用gradient_clipping(在TrainingArguments中设置max_grad_norm,如1.0)。
4. 检查并清洗数据,确保指令和输出是高质量的配对。
模型输出乱码或重复1. 训练轮数过多,过拟合。
2. 采样温度过低,确定性太强。
3. 重复惩罚系数不合适。
1. 早停(early_stopping),减少训练轮数,增加验证频率。
2. 推理时提高temperature(如0.8-1.0) 或调整top_p
3. 调整repetition_penalty(如1.1-1.2)。
训练速度极慢1. 未使用GPU。
2. 数据加载是瓶颈。
3. 模型太大,计算密集。
1. 确认torch.cuda.is_available()为 True。
2. 使用datasets库的.map函数预处理并缓存数据。
3. 使用更高效的优化器,如adamw_8bit(需bitsandbytes)。
4. 考虑使用模型并行或更小的基础模型。
微调后模型“变傻”1. 灾难性遗忘。
2. 微调数据量太少或质量太单一。
3. LoRA的秩r太小或目标模块不对。
1. 在微调数据中混合少量通用数据(如Alpaca格式数据)。
2. 增加高质量、多样化的微调数据。
3. 尝试增大LoRA的秩r(如16, 32)或调整target_modules
无法加载微调后的模型1. 保存的只是适配器,未正确加载基础模型。
2. Transformers库版本不兼容。
3. 文件路径错误。
1. 使用PeftModel.from_pretrained加载适配器,或使用merge_and_unload()后保存完整模型。
2. 确保训练和推理环境中的transformerspeft版本一致。
3. 检查模型保存路径,确保包含adapter_config.jsonadapter_model.bin

6. 最佳实践与工程建议

要将微调从实验成功推向生产应用,需要遵循一系列工程最佳实践。

1. 数据是王道:

  • 质量高于数量:1000条精心构造的高质量数据,远胜于10万条爬取的脏数据。确保指令清晰、输出准确、格式规范。
  • 多样性:覆盖目标场景下的各种问题类型和难度。避免数据偏差,导致模型只会回答某一类问题。
  • 迭代构建:不要试图一次性准备完美数据集。先用小数据集(几百条)跑通流程,分析模型失败案例,有针对性地补充和修正数据,循环迭代。

2. 实验管理:

  • 版本化一切:使用Git管理代码,使用DVC或类似工具管理数据和模型检查点。为每次实验记录超参数、数据集版本、环境配置和评估结果。
  • 使用实验跟踪工具Weights & Biases (WandB)MLflow是必备品。它们可以自动记录损失曲线、学习率、评估指标,甚至生成的文本样本,方便你对比不同实验。
  • 超参数扫描:对关键超参数(如学习率、LoRA的ralpha、批次大小)进行系统性的扫描,而不是盲目猜测。可以使用optunaray tune库。

3. 评估与验证:

  • 自动化评估:除了验证集损失,应设计任务相关的评估指标。例如,对于问答任务,可以使用Rouge-LBLEUBERTScore。对于分类任务,使用准确率、F1值。
  • 人工评估:自动化指标只能作为参考。定期进行人工评估,制定清晰的评分标准(如:相关性、准确性、流畅性、安全性),由领域专家对模型输出进行打分。
  • A/B测试:在生产环境中,将微调后的模型与基线模型(如原版通用模型)进行A/B测试,用真实的用户反馈数据来衡量效果提升。

4. 生产部署考量:

  • 模型合并:对于LoRA,训练完成后使用merge_and_unload()将适配器合并到基础模型中,得到一个标准的.bin模型文件,可以像任何普通模型一样用vLLMTGI(Text Generation Inference) 或FastAPI部署,无需在服务端加载PEFT库。
  • 量化部署:使用GPTQAWQllama.cpp对合并后的模型进行4-bit或8-bit量化,进一步降低部署所需的显存和提升推理速度。
  • 构建API服务:使用FastAPIFlask将模型封装成RESTful API,并添加身份认证、限流、日志和监控。
  • 持续学习/增量更新:业务知识会更新。设计一个流程,可以定期用新数据对模型进行增量微调,而无需从头开始。

5. 安全与合规:

  • 数据隐私:确保你的微调数据不包含用户隐私、公司机密或受版权保护的内容。对数据进行脱敏处理。
  • 内容安全:微调后的模型仍可能产生有害、偏见或不实信息。在部署前,必须进行全面的安全测试(“红队测试”),并考虑在API层添加内容过滤模块。
  • 资源监控:在生产环境监控GPU使用率、API响应延迟、错误率等关键指标,设置警报。

掌握大模型微调,是通往构建强大、专用AI应用的核心路径。它不再是大型实验室的专属,借助LoRA、QLoRA等高效技术,每个开发者都能在有限的资源下,释放大模型在垂直领域的巨大潜力。从准备高质量数据开始,选择合适的方法和工具,严谨地实验、评估和迭代,你就能打造出真正理解你业务、为你创造价值的智能模型。

🚀 30+款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/6 3:08:34

直方图靠右曝光

一、直方图靠右曝光说明 1.尽量通过直方图来指导向右曝光 2.并且保证亮部不溢出的前提下进行向右曝光&#xff0c;以获得更高的信噪比图像 3.指导“向右曝光”即在亮部不溢出的前提下让直方图尽量靠右分布&#xff0c;以获得更高信噪比的图像信息 4.相机记录光线时&#xff0c;…

作者头像 李华
网站建设 2026/7/6 3:07:35

AI大模型学习指南:从Transformer到RAG与LoRA的体系化入门

&#x1f680; 30款热门AI模型一站整合&#xff0c;DeepSeek/GLM/Qwen 随心用&#xff0c;限时 5 折。 &#x1f449; 点击领海量免费额度 1. 这个教程到底解决了什么问题&#xff0c;以及它为什么值得看 如果你刚开始接触AI大模型&#xff0c;面对海量的论文、框架和开源项…

作者头像 李华
网站建设 2026/7/6 3:00:58

ASP.NET 首页性能的十大做法

自定义Response.Filter得到输出流stream生成动态页面的静态内容(磁盘缓存)如下的代码我们可以看出&#xff0c;我们以 request.RawUrl 为缓存基础&#xff0c;因为它可以包含任意的QueryString变量&#xff0c;然后我们用MD5加密RawUrl 得到服务器本地文件名的变量&#xff0c;…

作者头像 李华
网站建设 2026/7/6 2:57:22

《智人之上》第四章「错误:绝对正确是一种幻想 」读后总结

Author&#xff1a;skatexgTime&#xff1a;2026/07/04&#x1f3af; 一、核心思想第四章的核心观点是&#xff1a;所有信息网络都会犯错&#xff0c;声称绝对正确是一种危险的幻想。 赫拉利通过历史案例告诉我们&#xff0c;一个健康的信息网络必须具备自我修正机制&#xff0…

作者头像 李华