大模型训练中的关键技术与挑战:数据采集、微调与资源优化

大模型机器学习算法
大模型训练中的关键技术与挑战:数据采集、微调与资源优化
一、 引言

如今全球已全面进入大模型时代。你是否也好奇,为什么不同的大模型表现差异如此之大?其实很多时候,关键并不完全在于算法本身,而更在于它们吃进去的数据——数据的质量 ,直接决定了模型的智能水平。不过很多网站都有反爬机制 ,一不小心IP就被封了,数据采不全、质量没保证,后续模型训练效果自然大打折扣。所以说,数据采集虽是大模型实战的第一步,却是影响最终效果的最关键一步。

那么,如何突破采集瓶颈?这时,一个好用的代理IP就显得尤为重要。它不仅能帮你绕过各种访问限制,更能直接提升所获数据的质量和多样性。本文将通过一个真实案例——爬取MIT Technology Review关于小行星2024 YR4的专题报道,并用 大模型 智能提炼核心信息 ,告诉你:选对代理+用好大模型,真的事半功倍。

picture.image

大模型训练中的关键技术与挑战

二 、大模型微调的核心技术与关键环节

大模型的实际应用不是简单调用API就完事儿了,从数据获取、内容理解到智能输出,每个环节都有讲究。核心目标是让预训练好的大模型,基于高质量输入数据,快速适配具体任务,输出精准、有价值的结果。

picture.image

大模型训练中的关键技术与挑战

2.1 应用数据的获取与预处理原则

应用数据的质量直接决定了最后效果,获取数据得遵循准确、完整、合规 的原则:

数据获取阶段 需要解决三大挑战:

  • 反爬限制 :权威网站(如MIT Technology Review、Nature)通常有严格的访问控制,单IP频繁请求会被封禁
  • 内容定位 :不同网站的HTML结构差异大,需精准定位目标内容(如文章正文、评论区)
  • 编码问题 :多语言网站可能存在乱码,需正确识别字符编码

数据预处理阶段 主要干三件事:

  1. 文本清洗 :去除HTML标签、广告内容、无关链接,保留核心文本
  2. 格式统一 :将不同来源的内容(网页、PDF、JSON)转换为模型可处理的格式
  3. 质量过滤 :剔除过短文本、重复内容,确保输入数据有效性

picture.image

大模型训练中的关键技术与挑战

2.2 主流应用策略对比与选择

现在常用的大模型应用策略有三种,选哪种得看任务类型、数据量和精度要求:

  • 直接提示(Prompt Engineering) :通过精心设计的提示词,引导大模型完成特定任务。优点是无需训练、快速部署、成本低;缺点是受模型通用能力限制,复杂任务效果可能不理想。适合信息提取、文本总结、简单分类等任务。
  • 检索增强生成(RAG) :将外部知识库与大模型结合,先检索相关文档,再让模型基于检索结果生成答案。优点是知识可更新、答案有依据、不易幻觉;缺点是需要构建向量数据库,检索质量影响最终效果。适合问答系统、知识助手、文档分析等任务。
  • 微调(Fine-tuning) :用特定领域数据训练模型,使其适配专业任务。优点是性能最优、高度定制;缺点是需要大量标注数据、计算资源消耗大。适合垂直领域应用,如医疗诊断、法律咨询、金融分析等。

picture.image

大模型训练中的关键技术与挑战

2.3 应用效果的评估指标与优化方向

评估大模型应用效果不能只看一个指标,得结合任务类型选:

信息提取任务

  • 主要指标:准确率(是否提取正确信息)、完整性(是否遗漏关键信息)、结构化程度
  • 优化方向:优化提示词结构、增加示例(Few-shot Learning)、使用思维链(Chain-of-Thought)

文本总结任务

  • 主要指标:ROUGE分数(与参考摘要的重叠度)、事实准确性、逻辑连贯性、信息覆盖率
  • 优化方向:调整总结长度限制、指定总结格式(如分点列举)、添加领域约束

智能问答任务

  • 主要指标:答案准确率、响应相关性、幻觉率(虚构信息比例)、引用准确性
  • 优化方向:引入RAG减少幻觉、设置温度参数控制创造性、添加事实核查机制

要是模型出问题了,也有办法调:如果模型学偏了( 过拟合 ),可以多加点数据、加个 约束(比如 Dropout、L2 正则),或者 早停 训练;如果模型性能不够,试试调 学习率 (比如用 余弦 退火的方式)、多训练几轮,或者换个微调策略,比如从冻结层微调换成 LoRA ;如果模型忘了之前学的知识(灾难性遗忘),可以用 增量训练”或者 知识蒸馏,让它记住老知识的同时学新知识。

| 任务类型 | 主要评估指标 | 解释 | 优化方向(模型问题及对应策略) | | --- | --- | --- | --- | | 分类任务 | 准确率、精确率、召回率、F1 分数 | 准确率:预测正确的样本数占总样本数比例;精确率:预测为正样本且实际为正样本的样本数占预测为正样本的样本数比例;召回率:实际为正样本且被正确预测的样本数占实际正样本数比例;F1 分数:精确率和召回率的调和平均数; | 过拟合(加数据、加约束如 Dropout 或 L2 正则、早停训练);性能不够(调学习率如用余弦退火方式、多训练几轮、换微调策略如从冻结层微调换 LoRA) | | 生成任务 | 困惑度、BLEU、ROUGE、人工评估 | 困惑度:模型对文本的理解程度,越低越好;BLEU:衡量生成文本与参考文本的相似度;ROUGE:基于重叠单元的召回率指标,评估生成文本与参考文本的重叠程度;人工评估:从内容流畅性、逻辑性、任务符合度等方面评估 | 过拟合(同分类任务策略);性能不够(同分类任务策略);灾难性遗忘(增量训练、知识蒸馏) | | 匹配任务 | 余弦相似度、皮尔逊相关系数 | 余弦相似度:通过计算两个向量夹角余弦值衡量相似度;皮尔逊相关系数:衡量两个变量的线性相关性 | 过拟合(同分类任务策略);性能不够(同分类任务策略) |

三、大模型应用的底层逻辑与数据需求

大模型应用的核心逻辑是:高质量输入 + 精准 指令 = 可靠输出 。数据就像原料,指令就像配方,模型就像厨师——原料不新鲜、配方不合理,再好的厨师也做不出好菜。

3.1 大模型训练的核心流程

大模型训练一般分四步:准备数据、初始化模型、反复训练、保存验证,一步错可能整个训练就白费了,一步步说:

picture.image

大模型训练中的关键技术与挑战

  • 数据准备阶段 :要做四件事:采集数据、清洗数据、划分数据、加载数据。采集数据得覆盖多个领域,比如新闻、书籍、论文、网页,保证数据多样;(1)清洗数据就是把没用的内容(比如垃圾文本、重复的东西)、敏感信息(比如个人隐私、违法内容)去掉,再做分词、转 token 这些处理;(2)划分数据要分成训练集(一般占 80%-90%)、验证集(5%-10%)、测试集(5%-10%),训练集用来教模型,验证集用来调参数,测试集最后看效果;(3)加载数据得用工具(比如 PyTorch 的 DataLoader)批量读数据、异步加载,这样训练能快不少。
  • 模型初始化阶段 :得选合适的预训练模型架构,比如 GPT、BERT、LLaMA 这些常用的,再根据训练目标调模型大小,比如层数多不多、隐藏层维度大不大。如果从零开始训,就给参数赋初始值(一般用正态分布或均匀分布);如果在预训练模型基础上接着训(增量训练),就把预训练模型的参数加载进来,只给新增的层赋初始值,能省不少事。
  • 训练迭代阶段 :这是模型 学习的关键步骤,反复做 前向传播 - 算损失 - 反向传播 - 更参数这四件事。前向传播”就是把数据喂给模型,让模型出结果;“算损失就是看模型结果和真实答案差多少(用损失函数,比如交叉熵损失);反向传播就是算清楚每个参数该怎么调才能减少误差;更参数就是用优化器(比如 Adam、SGD)按算好的方向调参数。训练时得盯着训练损失和验证损失,要是验证损失连续好几轮上升,就得早点停,别让模型学偏了。
  • 模型保存与验证阶段 :训练完了,要保存验证损失最低的模型(这才是最好的模型),别存那种损失过高学偏了的模型;然后用测试集全面评估性能,要是没达到预期,就得回头看数据准备或模型初始化哪里有问题,调整完再重新训。

3.2大模型应用的资源需求与优化策略

大模型训练特别费资源,计算、存储、网络都得够,这也是很多人搞不了大模型的原因,但也有办法优化,咱们分别说:

  • 计算资源 :主要靠 GPU 或 TPU 这些加速芯片,模型越大(比如千亿、万亿参数),需要的芯片越多、算力越强。比如训一个千亿参数的 GPT 模型,得几十上百台装着 A100 或 H100 GPU 的服务器。优化的话,可以用混合精度训练(比如 FP16、BF16),既能保证精度又能少占显存;也可以把模型和数据分到不同设备上(模型并行、数据并行),提高计算效率;还能用梯度累积,显存不够就多攒几批数据再调参数,达到大批次训练的效果。

picture.image

大模型训练中的关键技术与挑战

  • 存储资源 :训练要存海量数据、模型参数和日志,比如千亿参数的模型文件就有几十上百 GB,训练数据可能有 TB 甚至 PB 级。优化的话,可以压缩数据(比如用 GZIP、BZIP2),少占空间;用分布式存储系统(比如 HDFS、Ceph)存数据,读起来也快;还能定期删没用的日志和中间模型文件,腾空间。
  • 网络资源 :分布式训练时,不同设备要经常传数据和梯度,对带宽和延迟要求高。优化的话,可以用高速网络(比如 InfiniBand、100G Ethernet),传得快;也能压缩梯度(比如 Top-K 梯度压缩、量化压缩),少传点数据;还可以把计算和存储设备放在一个机房,减少延迟。
四、 大模型实战案例——爬取小行星危机报道并智能总结

目标网页 :MIT Technology Review关于小行星2024 YR4的深度报道 《The hunt for asteroid 2024 YR4 showed how planet protection really works》

picture.image

大模型训练中的关键技术与挑战

目标任务

  1. 突破MIT Technology Review的访问限制,完整获取专题文章
  2. 使用大模型提炼核心信息,生成结构化总结
  3. 提取5个关键维度:发现过程、风险变化、科学协作、关键结论、后续线索

任务价值 : 该报道详细记录了2025年初一场真实的"太空危机"——小行星2024 YR4因"3.1%撞击地球概率"登上全球热搜,最终在两个月内被科学家排除威胁。通过代理爬取+大模型分析,可以快速还原这场科学协作的全过程,为天文科普、风险评估、科技报道分析等场景提供参考。

4.1 需求分析

构建"科技报道智能分析系统",自动提取权威媒体的深度报道核心信息,生成可用于二次传播的结构化内容,为科技媒体、研究机构、教育平台提供高效的信息获取工具。

技术挑战

  1. 访问限制 :MIT Technology Review可能限制非美国地区访问,或对单IP频繁请求设限
  2. 内容定位 :需精准识别文章正文位置,过滤广告、推荐文章等干扰内容
  3. 信息提取 :从长文(5000+词)中提取关键信息,避免遗漏或误解

4.2 技术方案设计

整体架构 :采用代理爬取 → 文本处理 → 大模型 分析 → 结果输出 的流程

核心模块设计

  • 代理爬取模块
  • 使用Decodo代理服务(支持全球IP切换、高匿属性)

  • 通过requests库发送带代理的HTTP请求

  • 设置浏览器请求头,避免被识别为爬虫

  • 文本提取模块
  • 使用BeautifulSoup解析HTML

  • 定位MIT Technology Review的正文容器( class="article-body"

  • 提取所有段落文本,过滤空行和无效内容

  • 大模型 分析模块
  • 选择OpenAI GPT-3.5-turbo(平衡成本与效果)

  • 设计结构化提示词,指定输出5个维度

  • 设置temperature=0.2(低创造性,确保基于原文)

  • 结果输出模块
  • 将大模型输出保存为Markdown格式

  • 生成可视化报告,方便二次使用

4.3 数据采集实现

1.环境准备

首先安装必要的依赖库:

bash

  
pip install requests beautifulsoup4 openai python-dotenv  

picture.image

大模型训练中的关键技术与挑战

2.代理配置

Decodo代理配置方式(需替换为你的实际账号信息):

python

  
# 代理配置  
PROXY\_USERNAME = "your\_username"  # Decodo用户名  
PROXY\_PASSWORD = "your\_password"  # Decodo密码  
PROXY\_HOST = "isp.decodo.com"     # Decodo住宅代理地址  
PROXY\_PORT = "10001"              # 端口  
  
# 构造代理URL  
PROXY = f"http://{PROXY\_USERNAME}:{PROXY\_PASSWORD}@{PROXY\_HOST}:{PROXY\_PORT}"  

Decodo代理优势

(1)无需手动搭建代理池:直接接入 Decodo 网页抓取工具接口,利用其自带的全球代理资源(IP 可用性有保障),工具可自动实现 IP 轮换(无需手动设定轮换频率,可根据 YouTube 反爬强度动态调整),且无需额外通过第三方工具验证 IP 匿名性 ——Decodo 代理默认高匿属性,能有效避免因 IP 透明导致的 YouTube 封禁风险。

picture.image

大模型训练中的关键技术与挑战

(2)模板管理:用户可以根据经常需要监控的网站(如电商产品页、新闻详情页等)配置抓取目标、数据字段(如价格、标题、库存等)、抓取频率等参数,并保存为模板。方便后续快速启动类似任务。创建新抓取任务的时候,可以选择已有的目标模板,避免重复劳动,为每个相同或类似的数据源重复配置抓取规则,填入关键信息即可实现新任务,同时由于模板预设的规则,保证了数据采集的准确性和稳定性。

picture.image

大模型训练中的关键技术与挑战

(3)AI解析:通过系统预设的模板,只需输入网页URL,即可将任何网站的HTML自动转换为清晰的结构化数据。系统借助AI智能理解的需求,无需编写代码,即可智能生成符合要求的JSON数据或表格格式,轻松获取规整的结构化数组。

picture.image

大模型训练中的关键技术与挑战

3.爬取实现

核心代码(详细注释版),这里按照每个函数的功能介绍,最后的执行函数的过程在最后的代码中:

  
import requests  
import time  
from bs4 import BeautifulSoup  
  
def crawl\_with\_retry(target\_url, proxy, max\_retries=3):  
    """  
    带重试机制的爬取函数  
    参数:  
        target\_url: 目标网页URL  
        proxy: 代理URL  
        max\_retries: 最大重试次数  
    返回:  
        文章正文(str)或None  
    """  
    headers = {  
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",  
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",  
        "Accept-Language": "en-US,en;q=0.9",  
        "Accept-Encoding": "gzip, deflate, br",  
        "Referer": "https://www.technologyreview.com/",  
        "Connection": "keep-alive"  
    }  
      
    proxies = {  
        "http": proxy,  
        "https": proxy,  
    }  
      
    for attempt in range(max\_retries):  
        try:  
            print(f"�� 第{attempt + 1}次尝试爬取...")  
              
            # 发送请求  
            response = requests.get(  
                url=target\_url,  
                headers=headers,  
                proxies=proxies,  
                timeout=15,  
                verify=True  
            )  
              
            # 检查状态码  
            if response.status\_code == 403:  
                print(f"⚠️ 403 Forbidden - 可能需要更换代理地区")  
                if attempt < max\_retries - 1:  
                    time.sleep(5)  
                    continue  
                      
            response.raise\_for\_status()  
            response.encoding = response.apparent\_encoding  
              
            # 解析HTML  
            soup = BeautifulSoup(response.text, "html.parser")  
              
            # 提取正文(MIT Technology Review的文章结构)  
            article\_body = soup.find("div", class\_="article-body")  
              
            if not article\_body:  
                # 尝试备用选择器  
                article\_body = soup.find("article") or soup.find("div", class\_="content-body")  
                  
            if not article\_body:  
                print("⚠️ 未找到文章正文容器")  
                print("提示:打开目标网页 → F12 → 定位正文 → 查看其class/id")  
                if attempt < max\_retries - 1:  
                    time.sleep(3)  
                    continue  
                return None  
              
            # 提取段落文本  
            paragraphs = article\_body.find\_all("p")  
            article\_text = "\n\n".join([p.get\_text(strip=True) for p in paragraphs if p.get\_text(strip=True)])  
              
            # 验证文本质量  
            if len(article\_text) < 1000:  
                print(f"⚠️ 文本过短({len(article\_text)}字符),可能提取不完整")  
                if attempt < max\_retries - 1:  
                    time.sleep(3)  
                    continue  
                return None  
              
            print(f"✅ 爬取成功!文章长度:{len(article\_text)}字符")  
            return article\_text  
              
        except requests.exceptions.Timeout:  
            print(f"⏱️ 请求超时(第{attempt + 1}次)")  
            if attempt < max\_retries - 1:  
                time.sleep(5)  
                  
        except requests.exceptions.RequestException as e:  
            print(f"❌ 网络错误:{str(e)}")  
            if attempt < max\_retries - 1:  
                time.sleep(5)  
                  
        except Exception as e:  
            print(f"❌ 未知错误:{str(e)}")  
            if attempt < max\_retries - 1:  
                time.sleep(3)  
      
    print("❌ 达到最大重试次数,爬取失败")  
    return None  

成功爬取后,可获得完整文章文本,文章长度一共是8247字符,这里我们只取前300字符作为展示:

picture.image

大模型训练中的关键技术与挑战

4.4 大模型智能分析

1. API 配置

  
from openai import OpenAI  
import os  
  
# 加载API密钥(建议使用.env文件管理)  
OPENAI\_API\_KEY = os.getenv("OPENAI\_API\_KEY")  
client = OpenAI(api\_key=OPENAI\_API\_KEY)  

2.提示词设计

关键是设计结构化指令,明确输出格式,这里我们使用的提示词是:

  
prompt = f"""  
        prompt = f"""  
你是一位专业的科技报道分析专家。请基于以下关于小行星2024 YR4的文章,生成结构化总结。  
  
**输出要求:**  
必须包含以下5个部分,每部分用Markdown二级标题(##)标注:  
  
## 1. 发现过程  
  
- 谁发现的?  
- 什么时间?  
- 使用什么设备?  
- 发现时的初步判断?  
  (3-5句话)  
  
## 2. 风险演变  
  
- 撞击概率如何变化?(按时间线列出关键节点)  
- 何时达到峰值?概率是多少?  
- 何时正式排除威胁?  
  (4-6句话,包含具体数据)  
  
## 3. 科学协作  
  
- 哪些机构/望远镜参与追踪?(至少列举3个)  
- 使用了哪些关键技术手段?  
- 如何实现全球协作?  
  (4-6句话)  
  
## 4. 关键结论  
  
- 小行星的实际大小?  
- 为何最初会误判风险?(技术原因)  
- 观测精度如何提升?  
  (3-5句话)  
  
## 5. 后续发现  
  
- 排除地球威胁后,有什么新线索?  
- 是否存在其他潜在撞击目标?  
- 概率是多少?  
  (3-4句话)  
  
**注意事项:**  
  
1. 严格基于原文信息,不添加外部知识  
2. 包含具体数据(日期、概率、尺寸等)  
3. 语言简洁专业,避免主观评价  
4. 如果某部分信息原文未提及,说明"原文未详细说明"  
  
---  
  
**文章原文:**  
{processed\_text}请基于以下文章,用结构化方式总结小行星2024 YR4事件的核心信息,包含5个部分:  
      
  
       1. 发现过程:谁、何时、用什么设备发现的?  
          2. 风险变化:撞击地球的概率如何变化?峰值是多少?何时排除风险?  
             3. 科学协作:哪些机构/望远镜参与追踪?关键技术手段是什么?  
             4. 关键结论:小行星的实际大小?为何最初风险误判?  
             5. 后续线索:排除地球威胁后,发现了什么新可能?  
  
    要求:  
  
   - 每个部分用小标题+3-5句话说明  
     - 语言简洁,避免冗余  
       - 严格基于原文信息,不添加外部知识  
  
    文章文本:  
    {article\_text[:5000]}  

  
def analyze\_with\_llm(article\_text, api\_key):  
    """  
    调用大模型生成结构化总结  
    参数:  
        article\_text: 文章正文  
        api\_key: OpenAI API密钥  
    返回:  
        结构化总结(str)或None  
    """  
    if not article\_text:  
        return "❌ 无有效文章文本,无法分析"  
      
    # 初始化客户端  
    try:  
        client = OpenAI(api\_key=api\_key)  
    except Exception as e:  
        print(f"❌ API密钥配置错误:{e}")  
        return None  
      
    # 预处理文本  
    processed\_text = preprocess\_text(article\_text, max\_length=5000)  
      
    # 构造提示词  
    prompt = f"""  
你是一位专业的科技报道分析专家。请基于以下关于小行星2024 YR4的文章,生成结构化总结。  
  
**输出要求:**  
必须包含以下5个部分,每部分用Markdown二级标题(##)标注:  
  
## 1. 发现过程  
- 谁发现的?  
- 什么时间?  
- 使用什么设备?  
- 发现时的初步判断?  
(3-5句话)  
  
## 2. 风险演变  
- 撞击概率如何变化?(按时间线列出关键节点)  
- 何时达到峰值?概率是多少?  
- 何时正式排除威胁?  
(4-6句话,包含具体数据)  
  
## 3. 科学协作  
- 哪些机构/望远镜参与追踪?(至少列举3个)  
- 使用了哪些关键技术手段?  
- 如何实现全球协作?  
(4-6句话)  
  
## 4. 关键结论  
- 小行星的实际大小?  
- 为何最初会误判风险?(技术原因)  
- 观测精度如何提升?  
(3-5句话)  
  
## 5. 后续发现  
- 排除地球威胁后,有什么新线索?  
- 是否存在其他潜在撞击目标?  
- 概率是多少?  
(3-4句话)  
  
**注意事项:**  
1. 严格基于原文信息,不添加外部知识  
2. 包含具体数据(日期、概率、尺寸等)  
3. 语言简洁专业,避免主观评价  
4. 如果某部分信息原文未提及,说明"原文未详细说明"  
  
---  
  
**文章原文:**  
{processed\_text}  
"""  
      
    try:  
        print("🤖 正在调用大模型分析...")  
          
        response = client.chat.completions.create(  
            model="gpt-3.5-turbo",  
            messages=[  
                {  
                    "role": "system",   
                    "content": "你是一位专业的科技报道分析专家,擅长提炼天文事件的核心信息,输出结构化、数据驱动的总结。"  
                },  
                {  
                    "role": "user",   
                    "content": prompt  
                }  
            ],  
            temperature=0.2,  # 低创造性,确保基于原文  
            max\_tokens=1000,  # 足够输出完整总结  
            timeout=30  
        )  
          
        summary = response.choices[0].message.content  
          
        # 统计Token使用  
        usage = response.usage  
        print(f"✅ 分析完成!")  
        print(f"📊 Token使用:输入{usage.prompt\_tokens} + 输出{usage.completion\_tokens} = 总计{usage.total\_tokens}")  
        print(f"💰 预估成本:约${usage.total\_tokens * 0.002 / 1000:.4f}")  
          
        return summary  
          
    except Exception as e:  
        print(f"❌ 大模型调用失败:{e}")  
        return None  

提示词优化技巧

  • 明确结构 :用编号列出期望的输出部分
  • 限制长度 :指定每部分3-5句话,避免冗长
  • 约束来源 :强调"基于原文",减少幻觉
  • 截断输入 :限制文本前5000字符,避免超Token限制

运行之后,我们可以看到 Token使用:输入1247 + 输出856 = 总计2103

  • 输入Token:1247。这代表了你的prompt(提示词)加上article\_text(文章正文)经过预处理后,被转换成了 1247 个 Token。这个数字大致与文本长度成正比,它直接关系到 API 调用的成本和速度。
  • 输出Token:856。这代表了大模型生成的总结文本的长度。这个数字反映了总结的** 信息量** 。856 个 Token 生成了一个包含 5 个部分、细节丰富的结构化总结,说明模型很好地完成了任务。
  • 💰 预估成本:约$0.0042 代码根据gpt-3.5-turbo模型的公开定价(约 $0.002/1K Token)自动计算了本次调用的花费。这让你能清晰地了解每次分析的成本,对于批量处理时的预算规划至关重要。picture.image
  • 📝 2024 YR4小行星事件核心总结

我们可以发现大模型生成的结构化总结如下

picture.image

大模型训练中的关键技术与挑战

4.5内容保存

这个阶段的目标是将爬取的原始数据和分析的最终成果以持久化的形式保存下来。程序会自动创建output/目录,包含:

  • article\_raw.txt :爬取的原文
  • summary.md :结构化总结(Markdown格式)
  • result.json :JSON格式结果(方便程序调用)

picture.image

大模型训练中的关键技术与挑战

通过这三个文件,代码实现了 “原始数据 - 人类可读报告 - 机器可读数据” 的全链路保存,为后续的任何应用场景都做好了准备。

4.6完整代码实现

以下提供完整的可运行代码,可直接替换配置后使用:

  
import requests  
from bs4 import BeautifulSoup  
from openai import OpenAI  
from dotenv import load\_dotenv  
import os  
import time  
import json  
  
# ==================== 配置区(替换为你的实际信息) ====================  
load\_dotenv()  # 加载.env文件中的密钥  
  
# OpenAI API配置  
OPENAI\_API\_KEY = os.getenv("OPENAI\_API\_KEY")  # 或直接赋值:"sk-xxx..."  
  
# 目标网页  
TARGET\_URL = "https://www.technologyreview.com/2025/07/08/1119757/asteroid-hunt-2024-yr4-earth-planet-protection/"  
  
# Decodo代理配置(替换为你的账号信息)  
PROXY\_USERNAME = "your\_username"  # Decodo用户名  
PROXY\_PASSWORD = "your\_password"  # Decodo密码  
PROXY\_HOST = "isp.decodo.com"     # 住宅代理地址  
PROXY\_PORT = "10001"              # 端口  
  
# 构造代理URL  
PROXY = f"http://{PROXY\_USERNAME}:{PROXY\_PASSWORD}@{PROXY\_HOST}:{PROXY\_PORT}"  
  
# ==================== 1. 代理爬取模块 ====================  
def crawl\_with\_retry(target\_url, proxy, max\_retries=3):  
    """  
    带重试机制的爬取函数  
    参数:  
        target\_url: 目标网页URL  
        proxy: 代理URL  
        max\_retries: 最大重试次数  
    返回:  
        文章正文(str)或None  
    """  
    headers = {  
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",  
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",  
        "Accept-Language": "en-US,en;q=0.9",  
        "Accept-Encoding": "gzip, deflate, br",  
        "Referer": "https://www.technologyreview.com/",  
        "Connection": "keep-alive"  
    }  
      
    proxies = {  
        "http": proxy,  
        "https": proxy,  
    }  
      
    for attempt in range(max\_retries):  
        try:  
            print(f"📡 第{attempt + 1}次尝试爬取...")  
              
            # 发送请求  
            response = requests.get(  
                url=target\_url,  
                headers=headers,  
                proxies=proxies,  
                timeout=15,  
                verify=True  
            )  
              
            # 检查状态码  
            if response.status\_code == 403:  
                print(f"⚠️ 403 Forbidden - 可能需要更换代理地区")  
                if attempt < max\_retries - 1:  
                    time.sleep(5)  
                    continue  
                      
            response.raise\_for\_status()  
            response.encoding = response.apparent\_encoding  
              
            # 解析HTML  
            soup = BeautifulSoup(response.text, "html.parser")  
              
            # 提取正文(MIT Technology Review的文章结构)  
            article\_body = soup.find("div", class\_="article-body")  
              
            if not article\_body:  
                # 尝试备用选择器  
                article\_body = soup.find("article") or soup.find("div", class\_="content-body")  
                  
            if not article\_body:  
                print("⚠️ 未找到文章正文容器")  
                print("提示:打开目标网页 → F12 → 定位正文 → 查看其class/id")  
                if attempt < max\_retries - 1:  
                    time.sleep(3)  
                    continue  
                return None  
              
            # 提取段落文本  
            paragraphs = article\_body.find\_all("p")  
            article\_text = "\n\n".join([p.get\_text(strip=True) for p in paragraphs if p.get\_text(strip=True)])  
              
            # 验证文本质量  
            if len(article\_text) < 1000:  
                print(f"⚠️ 文本过短({len(article\_text)}字符),可能提取不完整")  
                if attempt < max\_retries - 1:  
                    time.sleep(3)  
                    continue  
                return None  
              
            print(f"✅ 爬取成功!文章长度:{len(article\_text)}字符")  
            return article\_text  
              
        except requests.exceptions.Timeout:  
            print(f"⏱️ 请求超时(第{attempt + 1}次)")  
            if attempt < max\_retries - 1:  
                time.sleep(5)  
                  
        except requests.exceptions.RequestException as e:  
            print(f"❌ 网络错误:{str(e)}")  
            if attempt < max\_retries - 1:  
                time.sleep(5)  
                  
        except Exception as e:  
            print(f"❌ 未知错误:{str(e)}")  
            if attempt < max\_retries - 1:  
                time.sleep(3)  
      
    print("❌ 达到最大重试次数,爬取失败")  
    return None  
  
  
# ==================== 2. 文本预处理模块 ====================  
def preprocess\_text(text, max\_length=5000):  
    """  
    文本预处理:清洗、截断  
    参数:  
        text: 原始文本  
        max\_length: 最大保留长度(避免超Token限制)  
    返回:  
        处理后的文本  
    """  
    if not text:  
        return ""  
      
    # 去除多余空行  
    lines = [line.strip() for line in text.split('\n') if line.strip()]  
    text = '\n\n'.join(lines)  
      
    # 截断到指定长度(保留完整句子)  
    if len(text) > max\_length:  
        text = text[:max\_length]  
        # 找到最后一个句号位置  
        last\_period = text.rfind('.')  
        if last\_period > max\_length * 0.8:  # 至少保留80%内容  
            text = text[:last\_period + 1]  
      
    return text  
  
  
# ==================== 3. 大模型分析模块 ====================  
def analyze\_with\_llm(article\_text, api\_key):  
    """  
    调用大模型生成结构化总结  
    参数:  
        article\_text: 文章正文  
        api\_key: OpenAI API密钥  
    返回:  
        结构化总结(str)或None  
    """  
    if not article\_text:  
        return "❌ 无有效文章文本,无法分析"  
      
    # 初始化客户端  
    try:  
        client = OpenAI(api\_key=api\_key)  
    except Exception as e:  
        print(f"❌ API密钥配置错误:{e}")  
        return None  
      
    # 预处理文本  
    processed\_text = preprocess\_text(article\_text, max\_length=5000)  
      
    # 构造提示词  
    prompt = f"""  
你是一位专业的科技报道分析专家。请基于以下关于小行星2024 YR4的文章,生成结构化总结。  
  
**输出要求:**  
必须包含以下5个部分,每部分用Markdown二级标题(##)标注:  
  
## 1. 发现过程  
- 谁发现的?  
- 什么时间?  
- 使用什么设备?  
- 发现时的初步判断?  
(3-5句话)  
  
## 2. 风险演变  
- 撞击概率如何变化?(按时间线列出关键节点)  
- 何时达到峰值?概率是多少?  
- 何时正式排除威胁?  
(4-6句话,包含具体数据)  
  
## 3. 科学协作  
- 哪些机构/望远镜参与追踪?(至少列举3个)  
- 使用了哪些关键技术手段?  
- 如何实现全球协作?  
(4-6句话)  
  
## 4. 关键结论  
- 小行星的实际大小?  
- 为何最初会误判风险?(技术原因)  
- 观测精度如何提升?  
(3-5句话)  
  
## 5. 后续发现  
- 排除地球威胁后,有什么新线索?  
- 是否存在其他潜在撞击目标?  
- 概率是多少?  
(3-4句话)  
  
**注意事项:**  
1. 严格基于原文信息,不添加外部知识  
2. 包含具体数据(日期、概率、尺寸等)  
3. 语言简洁专业,避免主观评价  
4. 如果某部分信息原文未提及,说明"原文未详细说明"  
  
---  
  
**文章原文:**  
{processed\_text}  
"""  
      
    try:  
        print("🤖 正在调用大模型分析...")  
          
        response = client.chat.completions.create(  
            model="gpt-3.5-turbo",  
            messages=[  
                {  
                    "role": "system",   
                    "content": "你是一位专业的科技报道分析专家,擅长提炼天文事件的核心信息,输出结构化、数据驱动的总结。"  
                },  
                {  
                    "role": "user",   
                    "content": prompt  
                }  
            ],  
            temperature=0.2,  # 低创造性,确保基于原文  
            max\_tokens=1000,  # 足够输出完整总结  
            timeout=30  
        )  
          
        summary = response.choices[0].message.content  
          
        # 统计Token使用  
        usage = response.usage  
        print(f"✅ 分析完成!")  
        print(f"📊 Token使用:输入{usage.prompt\_tokens} + 输出{usage.completion\_tokens} = 总计{usage.total\_tokens}")  
        print(f"💰 预估成本:约${usage.total\_tokens * 0.002 / 1000:.4f}")  
          
        return summary  
          
    except Exception as e:  
        print(f"❌ 大模型调用失败:{e}")  
        return None  
  
  
# ==================== 4. 结果保存模块 ====================  
def save\_results(article\_text, summary, output\_dir="output"):  
    """  
    保存爬取结果和分析结果  
    """  
    os.makedirs(output\_dir, exist\_ok=True)  
      
    # 保存原文  
    with open(f"{output\_dir}/article\_raw.txt", "w", encoding="utf-8") as f:  
        f.write(article\_text)  
    print(f"💾 原文已保存至:{output\_dir}/article\_raw.txt")  
      
    # 保存总结  
    if summary:  
        with open(f"{output\_dir}/summary.md", "w", encoding="utf-8") as f:  
            f.write("# 小行星2024 YR4事件核心总结\n\n")  
            f.write(f"**数据来源**:MIT Technology Review  \n")  
            f.write(f"**分析时间**:{time.strftime('%Y-%m-%d %H:%M:%S')}  \n\n")  
            f.write("---\n\n")  
            f.write(summary)  
        print(f"💾 总结已保存至:{output\_dir}/summary.md")  
          
        # 同时保存为JSON格式(方便程序调用)  
        result\_json = {  
            "source": TARGET\_URL,  
            "crawl\_time": time.strftime('%Y-%m-%d %H:%M:%S'),  
            "article\_length": len(article\_text),  
            "summary": summary  
        }  
        with open(f"{output\_dir}/result.json", "w", encoding="utf-8") as f:  
            json.dump(result\_json, f, ensure\_ascii=False, indent=2)  
        print(f"💾 JSON结果已保存至:{output\_dir}/result.json")  
  
  
# ==================== 5. 主程序 ====================  
def main():  
    """  
    主流程:爬取 → 分析 → 保存  
    """  
    print("="*60)  
    print("🚀 大模型实战:爬取小行星危机报道 + 智能总结")  
    print("="*60)  
      
    # 检查配置  
    if PROXY\_USERNAME == "your\_username":  
        print("⚠️ 请先配置Decodo代理信息(PROXY\_USERNAME、PROXY\_PASSWORD)")  
        return  
          
    if not OPENAI\_API\_KEY or OPENAI\_API\_KEY == "your\_api\_key":  
        print("⚠️ 请先配置OpenAI API密钥(OPENAI\_API\_KEY)")  
        return  
      
    print(f"\n📋 目标网页:{TARGET\_URL}")  
    print(f"🔐 代理节点:{PROXY\_HOST}:{PROXY\_PORT}\n")  
      
    # 步骤1:爬取文章  
    print("【步骤1/3】开始爬取文章...")  
    article\_text = crawl\_with\_retry(TARGET\_URL, PROXY, max\_retries=3)  
      
    if not article\_text:  
        print("\n❌ 爬取失败,程序终止")  
        print("\n排查建议:")  
        print("1. 检查代理配置是否正确(用户名、密码、地址、端口)")  
        print("2. 尝试更换代理地区(如选择美国节点)")  
        print("3. 检查目标网页是否可正常访问")  
        print("4. 查看Decodo账户余额是否充足")  
        return  
      
    print(f"\n📄 文章预览(前300字符):")  
    print("-" * 60)  
    print(article\_text[:300] + "...")  
    print("-" * 60)  
      
    # 步骤2:大模型分析  
    print(f"\n【步骤2/3】开始大模型分析...")  
    summary = analyze\_with\_llm(article\_text, OPENAI\_API\_KEY)  
      
    if not summary:  
        print("\n❌ 分析失败,但原文已成功爬取")  
        save\_results(article\_text, None)  
        return  
      
    # 步骤3:保存结果  
    print(f"\n【步骤3/3】保存结果...")  
    save\_results(article\_text, summary)  
      
    # 输出总结  
    print("\n" + "="*60)  
    print("📝 2024 YR4小行星事件核心总结")  
    print("="*60)  
    print(summary)  
    print("="*60)  
      
    print("\n✅ 全部流程完成!")  
    print(f"💡 提示:可在 output/ 目录查看完整结果")  
  
  
# ==================== 程序入口 ====================  
if \_\_name\_\_ == "\_\_main\_\_":  
    main()  

4.7使用说明

1.环境配置

OpenAI所需要的 API 需要我们去访问官网 ,完成注册之后进入API Keys页面,去创建我们自己的新密钥,然后设置合理的使用限额避免超支,这里我们需要的GPT-3.5-turbo价格约为$0.002/1K tokens。

picture.image

大模型训练中的关键技术与挑战

创建.env文件(与代码同目录),写入:

  
OPENAI\_API\_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxx  

2.修改代理配置

获取这些 Decodo 代理的方式首先需要我们注册Decodo平台的账户,然后其控制台会出现在我们眼前,在控制台左侧导航栏找到 “静态住宅代理”。在页面上方 “选择代理类型” 区域,确认选中 “按 IP 付费”(与少数用户共享的 IP)这一选项。

picture.image

大模型训练中的关键技术与挑战

然后在 “IP 数量” 板块,我们根据需求选择预设的 IP 数量,因为我下面的项目中需要的IP 数量并不是很多,所以这个地方我仅需要选择50个即可,同时我们也可以根据自己需要勾选定制输入自定义数量。同理在 “流量” 板块,我们也直接根据需要选择所需的流量额度即可完成。

右侧 “订单摘要” 会实时显示所选配置的费用明细,确认 IP 数量、流量、单价等信息无误后,点击订阅即可完成,获取对应的代理资源。然后直接会弹出我们刚才购买好的界面,这里会显示出我们需要的用户的代理地址用户名以及密码:

picture.image

大模型训练中的关键技术与挑战

将如上的用户信息输入我们写好的代码中,如下面所示:

  
PROXY\_USERNAME = "your\_username"  # 替换为你的用户名  
PROXY\_PASSWORD = "your\_password"  # 替换为你的密码  

五、结论

在当今的人工智能(AI)大模型时代,模型训练早已不再只是算法的较量,而是 数据质量、优化策略与训练资源的综合博弈 。从微调数据的筛选、训练策略的选择,到资源管理与优化方法,再到实战中的数据采集与处理,每一个环节都直接决定了模型的性能上限。

对于开发者来说,最大的挑战往往来自 数据采集 :如何在反爬限制下获取高质量、多样化、合规的数据。借助 Decodo 高匿代理 IP 与网页抓取 API ,可以高效突破采集瓶颈,确保数据的稳定性与多样性,从而为模型训练提供坚实的数据基础。

👉 如果你正在探索 AI 模型训练、 机器学习 微调或 大模型 应用 ,不妨从数据采集这一环节入手。试试 Decodo 网页抓取工具,为你的 AI 项目加速,轻松构建属于你的下一代智能应用。

❓ FAQ(常见问题解答)

Q1:训练一个 AI 模型通常需要多长时间?

A1:取决于模型规模与硬件资源。中小规模模型几小时到几天即可完成,大规模预训练模型可能需要数周甚至数月。

Q2:训练 AI 模型的最低硬件要求是什么?

A2:一般至少需要一块支持 CUDA 的 NVIDIA GPU(如 RTX 3060/3090),大模型或复杂任务通常需要 A100、H100 级别 GPU 集群。

Q3:在中国训练 AI 模型的成本大概是多少?

A3:成本差异很大,小规模实验可能几千元即可完成,而大规模训练需要租用云 GPU 集群,费用可能达到数十万甚至百万级别。

Q4:获取高质量 训练数据 的最佳方法是什么?

A4:常见方法包括公开数据集、迁移学习、合成数据生成,以及使用 Decodo 的网页抓取 API 实时采集最新行业数据。

Q5:如何在有限资源下平衡模型性能与成本?

A5:可以使用混合精度训练、知识蒸馏、LoRA 等高效方法,同时合理利用云计算资源,避免重复训练与资源浪费。

picture.image

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
veRL for Training Coding Agent
随着DeepSeek R1的火热,强化学习的训练范式成为目前LLM post training的主流。本次分享将介绍如何使用开源框架verl训练一个foundation model来服务coding agent。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论