news 2026/10/4 7:33:44

B站视频链接获取的三层逻辑与反爬工程实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
B站视频链接获取的三层逻辑与反爬工程实践

1. 这不是“爬虫教程”,而是一次对B站链接获取逻辑的逆向工程复盘

你点开一个B站视频,右键复制链接——得到的是类似https://www.bilibili.com/video/BV1xx411c7mD的地址。但如果你真拿这个链接去写脚本批量处理,十有八九会在第3次请求后收到429 Too Many Requests,紧接着是exceeded retry limit, last status: 429这类报错。热搜词里反复出现的“requests库”“csv导入失败”“电脑打开csv不正常”,背后根本不是代码写错了,而是绝大多数人把“获取链接”这件事想得太简单:它根本不是HTTP GET一个URL就能解决的文本提取问题,而是一整套嵌套在B站前端渲染、反爬策略、用户态校验和CDN分发逻辑之下的链路工程。

我去年帮三个做学术视频分析的课题组做过B站链接批量采集,从最初用requests.get(url)直接抓首页HTML,到后来被封IP、被限速、被返回空JSON、被跳转到验证码页,踩过的坑全记录在本地Markdown里——光是“为什么同一个BV号在不同时间点返回的<meta property="og:url">内容会变”这个问题,就花了我两天时间比对网页源码、Network面板和真实设备抓包。核心矛盾在于:B站网页版的视频链接,从来就不是静态存在的“资源地址”,而是由客户端JavaScript动态拼接、服务端根据UserAgent/Referer/cookies实时校验、并受登录态与地域策略共同影响的运行时产物。所谓“快速获取”,本质是绕过渲染层、直击数据源、规避速率限制、适配多端差异的一整套协同方案。本文不讲“如何用requests发请求”,而是带你拆解B站网页版的真实链接生成逻辑,告诉你为什么csv手机打开正常但电脑打不开——那根本不是编码问题,而是Excel默认用ANSI打开UTF-8 CSV时丢失了B站标题里的emoji;为什么pycharm中生成的csv文件不是表格——因为没写BOM头,而Pandas读取时默认encoding='utf-8'却忽略了Windows记事本的隐式BOM识别逻辑。这些细节,才是决定你脚本能跑通还是持续报错的关键。

2. B站网页版链接的三重生成机制:从静态URL到动态跳转链

B站视频链接绝非一个固定字符串,它在用户可见层面存在三种形态,每种形态对应完全不同的生成逻辑和获取路径。忽略这种分层,直接用正则匹配https://www.bilibili.com/video/.*?,等于在迷宫入口就选错了方向。

2.1 第一层:用户可见的“分享链接”(BV/AV号格式)

这是最表层的链接,形如https://www.bilibili.com/video/BV1xx411c7mD或旧版https://www.bilibili.com/video/av12345678。它看似稳定,实则暗藏玄机:

  • BV号是Base58编码的64位整数,并非数据库主键,而是经过哈希+混淆后的映射值。B站官方从未公开其解码算法,所有第三方“BV转AV”工具均基于逆向统计规律实现,存在失效风险。
  • 该链接本身不携带播放参数。当你在浏览器中访问它时,页面会先加载骨架HTML,再通过window.__INITIAL_STATE__注入初始数据,其中包含真正的aid(AV号)、bvid(BV号)、cid(视频分P编号)等关键ID。
  • 关键陷阱:同一BV号在未登录状态下返回的__INITIAL_STATE__中,videoData字段可能为空或被截断;而登录后,该字段会完整返回,且包含stat(播放量)、owner(UP主信息)等额外数据。这意味着——未携带有效cookies的requests请求,大概率拿到的是残缺的初始状态。

2.2 第二层:播放器实际加载的“真实播放地址”(playurl接口)

用户看到的视频画面,真正由https://api.bilibili.com/x/player/playurl接口提供。该接口需要以下参数:

  • bvid或avid:视频标识
  • cid:分P编号(单P视频为1,多P视频需遍历)
  • qn:清晰度(如80代表1080P,64代表720P)
  • fnver/fnval:播放器版本与功能标识(固定值0和4048)
  • fourk:是否允许4K(1)
  • platform:平台标识(web表示网页端)
  • access_key:登录态凭证(未登录时可为空,但部分高清晰度受限)

提示:playurl接口返回的是durl数组,每个durl包含url(真实MP4地址)、length(时长毫秒)、size(文件大小)。这才是视频文件的物理位置。但请注意:该URL带有时效性签名(sign参数),通常15分钟内有效,超时即403。

2.3 第三层:分享卡片与SEO优化的“跳转中间页”(share接口)

当你点击视频右下角“分享”按钮,生成的链接常带有?share_source=copy_link参数。这类链接实际指向https://www.bilibili.com/share/xxx,服务器会302重定向至真实视频页。其作用是:

  • 统计分享来源(share_source值)
  • 携带UTM参数用于流量归因
  • 触发B站内部的“分享激励”逻辑(如增加UP主曝光权重)

注意:直接请求/share/路径会返回302跳转,但若用requests未设置allow_redirects=True,你拿到的只是跳转响应头,而非最终URL。更隐蔽的问题是:B站对/share/接口做了频率限制,高频请求会直接返回429,且不返回Retry-After头,导致requests.adapters.Retry策略失效——这正是热搜词中反复出现exceeded retry limit, last status: 429的根本原因。

这三层结构意味着:所谓“获取视频链接”,必须明确目标层级。学术分析需要BV号做索引(第一层);批量下载需要playurl接口返回的真实URL(第二层);而生成分享报告则需构造带UTM参数的/share/链接(第三层)。混用逻辑必然失败。

3. requests库的致命误区:为什么90%的脚本死在UserAgent和Session管理上

用requests获取B站链接,最大的认知偏差是把它当成“无状态HTTP客户端”。B站的反爬体系恰恰建立在对客户端状态的强依赖上。我统计了过去半年帮人调试的37个失败案例,其中29个(78%)的根源不在代码语法,而在UserAgent和Session配置的三个致命错误。

3.1 UserAgent不是“填个字符串”,而是“模拟真实浏览器指纹”

B站服务端会校验UserAgent中的多个维度:

  • 内核标识:Chrome/120.0.0.0必须匹配真实的Chrome版本,若使用过期UA(如Chrome/90),会被标记为“老旧客户端”,触发更严格校验。
  • 平台标识:Windows NT 10.0; Win64; x64与Mac OS X 10_15_7的处理策略不同。B站对Windows客户端的速率限制更宽松,但对移动端UA(Mobile Safari/604.1)会强制要求X-Requested-With头。
  • 渲染引擎细节:Safari/604.1必须搭配WebKit/604.1,若缺失或版本不匹配,返回的HTML中__INITIAL_STATE__会被清空。

实测对比:用requests.get(url, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'})访问BV页,成功率达92%;而用'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',成功率骤降至31%,且返回HTML中<script>标签内的__INITIAL_STATE__被替换为window.__INITIAL_STATE__ = {};。

正确做法是:固定使用Windows平台Chrome最新版UA,并在每次请求中加入Sec-Ch-Ua、Sec-Ch-Ua-Mobile、Sec-Ch-Ua-Platform这三个Chromium标准头。例如:

headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'Sec-Ch-Ua': '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"', 'Sec-Ch-Ua-Mobile': '?0', 'Sec-Ch-Ua-Platform': '"Windows"' }

这三个头共同构成B站判定“现代桌面浏览器”的最小特征集。缺失任一,都可能被降级为“低信任度客户端”。

3.2 Session不是“自动管理cookie”,而是“维持登录态上下文”

requests.Session()对象的核心价值,在于它能自动处理Set-Cookie响应头并回传。但B站的cookie体系远比表面复杂:

  • 基础会话cookie:SESSDATA(登录凭证)、bili_jct(CSRF token)、DedeUserID(用户ID)——三者必须同时存在且有效。
  • 动态刷新cookie:buvid3(设备唯一标识)每24小时自动更新,若长期未请求,旧buvid3会导致403 Forbidden。
  • 地域绑定cookie:CURRENT_REGION(当前地区)影响CDN节点选择,若从北京IP请求却携带CURRENT_REGION=HK,返回的playurl可能无法播放。

踩坑实录:某高校课题组用Session登录后,连续72小时未发起新请求。第73小时批量获取100个BV号时,前20个成功,后80个全部返回{"code":-412,"message":"请求被拦截"}。排查发现buvid3已过期,但Session仍将其作为有效cookie发送。解决方案是:在Session初始化后,立即请求一次https://api.bilibili.com/x/frontend/finger/spi接口(无需参数),强制刷新buvid3。

3.3 重试策略不是“设个次数”,而是“理解B站的限速语义”

requests.adapters.Retry的默认配置(total=10, backoff_factor=1)在B站场景下完全失效,原因有三:

  • 429响应无Retry-After头:B站返回429时,响应体为{"code":-412,"message":"请求被拦截"},不提供等待秒数,backoff_factor无法生效。
  • 限速粒度极细:不仅是IP限速,更是“IP+UserAgent+Referer”三元组限速。同一IP换UA可绕过,但频繁切换UA会被标记为“异常行为”。
  • 二次限速机制:当/x/player/playurl接口被限速后,后续对/x/web-interface/view(获取视频信息)的请求也会被连带限速,形成链式阻塞。

真实经验:我将重试逻辑重构为“指数退避+随机抖动+请求类型隔离”。对/x/web-interface/view(信息获取)和/x/player/playurl(播放地址)使用独立Session和独立重试队列,每次失败后等待2^retry_count + random.uniform(0,1)秒。实测将429错误率从63%降至4.7%。

4. CSV文件的“跨平台灾难”:从编码、BOM到Excel的隐式规则

热搜词中反复出现的csv手机打开正常但电脑打不开、pycharm中生成的csv文件不是表格、csv log unsuccessful,90%以上与CSV文件本身的编码和格式无关,而是Windows生态下Excel对CSV的解析逻辑与开发者预期严重错位所致。

4.1 编码之争的本质:UTF-8 vs UTF-8 with BOM

B站视频标题大量使用emoji(如🔥、💯、🎬)和中文,必须用UTF-8编码保存。但问题在于:

  • Linux/macOS终端、PyCharm、VS Code默认以UTF-8无BOM方式读取CSV,显示完美。
  • Windows记事本默认以ANSI(GBK)打开无BOM的UTF-8文件,显示为乱码。
  • Microsoft Excel的行为更诡异:
    • Excel 2016+:双击CSV文件时,若文件无BOM,Excel会尝试用系统默认编码(通常是GBK)解析,导致emoji和生僻汉字乱码;
    • Excel 2019+:增加了UTF-8检测,但仍需BOM头才能100%识别;
    • Excel for Web:强制UTF-8,无视BOM。

解决方案:在生成CSV时,必须写入UTF-8 BOM头(\ufeff)。Python中正确写法:

import csv with open('videos.csv', 'w', newline='', encoding='utf-8-sig') as f: writer = csv.writer(f) writer.writerow(['BV号', '标题', 'UP主', '播放量']) writer.writerows(data)

encoding='utf-8-sig'会自动在文件开头写入BOM,确保Excel双击即可正确显示。

4.2 分隔符陷阱:逗号、制表符与Excel的“智能分列”

B站标题中常含逗号(如《【AI绘画】Stable Diffusion保姆级教程,零基础也能学会!》),若用逗号分隔CSV,Excel导入时会错误切分字段。更隐蔽的问题是:

  • Excel“数据→从文本/CSV”导入向导默认以逗号分隔,但若标题含逗号,必须勾选“引号为文本标识符”;
  • 双击CSV文件直接打开时,Excel不会触发向导,而是硬切分,导致数据错位。

最佳实践:改用制表符(\t)作为分隔符,并保存为.tsv文件。理由:

  • 制表符在标题中几乎不会出现,彻底规避分隔符冲突;
  • Excel双击TSV文件时,自动以制表符分列,无需手动设置;
  • Pandas读取时只需pd.read_csv('file.tsv', sep='\t'),兼容性极佳。

4.3 字段内容逃逸:引号、换行与Excel的“单元格合并”

B站视频简介(desc字段)常含换行符\n和双引号"。标准CSV规范要求:

  • 字段含逗号、换行、双引号时,必须用双引号包裹;
  • 字段内双引号需转义为两个双引号"";
  • 换行符在引号内允许存在。

但Excel对换行符的处理极不稳定:

  • Windows版Excel:单元格内换行需Alt+Enter,CSV中的\n会被显示为方块符号;
  • Mac版Excel:\n可正常换行,但需在单元格格式中启用“自动换行”。

安全写法:用csv.writer自动处理逃逸,而非手动拼接字符串:

writer = csv.writer(f, quoting=csv.QUOTE_MINIMAL) # 仅在必要时加引号 # 或更严格 writer = csv.writer(f, quoting=csv.QUOTE_ALL) # 所有字段加引号

QUOTE_MINIMAL会智能判断何时需要引号,QUOTE_ALL则强制所有字段加引号,避免手动处理的遗漏。

5. 高频报错exceeded retry limit, last status: 429的根因定位与实战修复

exceeded retry limit, last status: 429是B站自动化脚本的“死亡提示”,但它的出现绝非偶然,而是系统性反爬策略触发的明确信号。我将过去一年处理的127例该报错,按根因归类并给出可落地的修复方案。

5.1 根因分类与发生概率(基于真实日志分析)

根因类别占比典型表现核心原理
IP级限速42%同一IP在5分钟内请求超200次/x/web-interface/viewB站对未登录IP的QPS阈值设为40次/分钟,超限即429
UA+Referer组合限速28%更换UA后仍429,但添加Referer: https://www.bilibili.com/后恢复服务端将(IP, UA, Referer)视为独立会话,Referer缺失则信任度归零
Cookie失效链式反应19%SESSDATA过期 → 请求/x/frontend/finger/spi失败 →buvid3未刷新 → 后续所有请求429登录态失效后,B站拒绝提供任何用户相关数据,包括视频基本信息
接口调用顺序违规11%直接请求/x/player/playurl而未先请求/x/web-interface/view获取cidplayurl接口要求cid参数,若传入错误cid,B站会返回429而非400,伪装成限速

5.2 完整排查链路:从日志到修复的七步法

当你的脚本首次出现429,请按此顺序排查,而非盲目增加重试次数:

第一步:确认请求URL与Headers是否完整

  • 检查是否遗漏Referer头。B站要求所有API请求的Referer必须为https://www.bilibili.com/或具体视频页URL。缺失则直接429。
  • 检查User-Agent是否包含Chrome且版本≥115。低于此版本的UA会被标记为“低信任客户端”。

第二步:验证Session中Cookie的有效性

  • 提取Session.cookies中的SESSDATA,用在线工具(如https://api.bilibili.com/x/space/myinfo)验证其有效性。若返回{"code":-101,"message":"账号未登录"},说明已过期。
  • 检查buvid3是否存在且长度为32位(如123e4567-e89b-12d3-a456-426614174000)。若不存在或格式错误,需重新初始化Session。

第三步:隔离测试单一接口

  • 构造最简请求:GET https://api.bilibili.com/x/web-interface/view?bvid=BV1xx411c7mD,仅带必要Headers和Cookies。
  • 若仍429,则问题在IP或UA;若成功,则问题在后续接口调用逻辑。

第四步:检查请求频率与时间戳

  • 在日志中打印每次请求的Unix时间戳,计算相邻请求间隔。B站对/x/web-interface/view的最小间隔要求为1.2秒(实测值),低于此值必429。
  • 使用time.sleep(1.5)硬性间隔,而非依赖Retry的指数退避。

第五步:验证Referer与Origin一致性

  • Referer必须与Origin一致。若Origin: https://www.bilibili.com,则Referer也必须为此值。不一致会被视为CSRF攻击。

第六步:检查DNS解析与CDN节点

  • 用curl -v https://api.bilibili.com/x/web-interface/view?bvid=BV1xx411c7mD查看Server响应头。若为nginx而非bfe(B站自研网关),说明DNS未解析到B站CDN,可能被劫持或走代理,触发风控。

第七步:启用Debug模式捕获完整响应

import logging logging.basicConfig(level=logging.DEBUG) requests_log = logging.getLogger("requests.packages.urllib3") requests_log.setLevel(logging.DEBUG) requests_log.propagate = True

观察DEBUG日志中429响应的完整Headers,特别关注X-Bili-Trace-ID和X-Bili-Request-ID,这两个ID是B站客服定位问题的唯一依据。

5.3 生产环境修复方案:基于令牌桶的请求调度器

单纯增加time.sleep()无法应对高并发需求。我设计了一个轻量级令牌桶调度器,已在三个日均10万请求的项目中稳定运行:

import time import threading from collections import deque class BiliRateLimiter: def __init__(self, capacity=40, refill_rate=0.8): # 40令牌/分钟 ≈ 0.67次/秒 self.capacity = capacity self.refill_rate = refill_rate self.tokens = capacity self.last_refill = time.time() self.lock = threading.Lock() def _refill(self): now = time.time() if now > self.last_refill: delta = now - self.last_refill new_tokens = delta * self.refill_rate self.tokens = min(self.capacity, self.tokens + new_tokens) self.last_refill = now def acquire(self, block=True): with self.lock: while True: self._refill() if self.tokens >= 1: self.tokens -= 1 return True if not block: return False # 计算等待时间 wait_time = (1 - self.tokens) / self.refill_rate time.sleep(max(wait_time, 0.1)) def reset(self): with self.lock: self.tokens = self.capacity self.last_refill = time.time() # 全局限速器 limiter = BiliRateLimiter(capacity=40, refill_rate=0.8) def safe_get_video_info(bvid): limiter.acquire() # 获取令牌 try: response = session.get( f'https://api.bilibili.com/x/web-interface/view?bvid={bvid}', headers=headers, timeout=10 ) response.raise_for_status() return response.json() except Exception as e: # 失败后归还令牌(可选) # limiter.reset() raise e

该方案将请求速率精确控制在B站容忍阈值内,429错误率降至0.3%以下,且无需依赖外部服务。

6. 从“获取链接”到“构建视频分析管道”的工程化延伸

“B站视频链接快速获取”从来不是终点,而是视频数据工程的起点。当你的CSV文件不再只是存储BV号,而是承载着播放量、弹幕数、UP主粉丝量等结构化数据时,整个工作流必须升级为可维护、可扩展、可监控的管道系统。

6.1 数据模型设计:超越简单CSV的Schema演进

初期用CSV存[bvid, title, author]足够,但当需求变为“分析科技区UP主的视频增长趋势”,就需要规范化Schema:

字段名类型说明来源接口
bvidstringBV号,主键URL路径
aidint64AV号,兼容旧系统/x/web-interface/view
cidint64分P编号,单P为1/x/web-interface/view
titlestring视频标题,含emoji/x/web-interface/view
pubdateint64发布时间戳(秒)/x/web-interface/view
viewint64播放量/x/web-interface/view
danmakuint64弹幕数/x/web-interface/view
replyint64评论数/x/web-interface/view
favoriteint64收藏数/x/web-interface/view
coinint64投币数/x/web-interface/view
shareint64分享数/x/web-interface/view
likeint64点赞数/x/web-interface/view
owner_midint64UP主UID/x/web-interface/view
owner_namestringUP主昵称/x/web-interface/view
durationint64视频时长(秒)/x/player/playurl

关键设计原则:

  • 所有数值字段用int64而非string,避免后续分析时类型转换错误;
  • 时间戳统一用秒级Unix时间,而非字符串2023-01-01 12:00:00,减少时区处理成本;
  • UP主信息冗余存储(owner_mid+owner_name),避免为查UP主信息额外调用/x/space/acc/info接口。

6.2 工程化存储:从CSV到SQLite的平滑迁移

CSV适合小规模数据(<1万条),但当数据量达10万+时,查询效率、并发写入、数据完整性成为瓶颈。迁移到SQLite是零成本升级:

import sqlite3 import pandas as pd # 创建表 conn = sqlite3.connect('bilibili_videos.db') cursor = conn.cursor() cursor.execute(''' CREATE TABLE IF NOT EXISTS videos ( bvid TEXT PRIMARY KEY, aid INTEGER, cid INTEGER, title TEXT, pubdate INTEGER, view INTEGER, danmaku INTEGER, reply INTEGER, favorite INTEGER, coin INTEGER, share INTEGER, like INTEGER, owner_mid INTEGER, owner_name TEXT, duration INTEGER, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ''') conn.commit() # 批量插入(比逐条insert快10倍) df.to_sql('videos', conn, if_exists='append', index=False)

优势:

  • ACID事务保障:避免CSV写入中断导致文件损坏;
  • 索引加速查询:CREATE INDEX idx_owner_mid ON videos(owner_mid);可将UP主视频查询提速50倍;
  • SQL灵活分析:SELECT owner_name, COUNT(*) as video_count FROM videos GROUP BY owner_name ORDER BY video_count DESC LIMIT 10;

6.3 监控与告警:让脚本“自己说话”

生产环境必须具备可观测性。我在每个关键环节植入了监控埋点:

from prometheus_client import Counter, Histogram, Gauge # 定义指标 REQUESTS_TOTAL = Counter('bili_requests_total', 'Total requests', ['endpoint', 'status']) REQUEST_DURATION = Histogram('bili_request_duration_seconds', 'Request duration', ['endpoint']) RATE_LIMITED = Gauge('bili_rate_limited', 'Current rate limited tokens') def monitor_request(endpoint, status_code, duration): REQUESTS_TOTAL.labels(endpoint=endpoint, status=status_code).inc() REQUEST_DURATION.labels(endpoint=endpoint).observe(duration) RATE_LIMITED.set(limiter.tokens) # 在请求后调用 start_time = time.time() response = session.get(url) duration = time.time() - start_time monitor_request('x_web_interface_view', response.status_code, duration)

配合Grafana看板,可实时查看:

  • 各接口成功率(status != 200占比);
  • 平均响应延迟(P95 < 1.2秒为健康);
  • 当前令牌桶剩余容量(<5时预警);
  • 每小时请求总量(突增可能预示风控升级)。

这套监控让我在B站2023年11月API策略调整前3天,就通过/x/player/playurl成功率下降12%的异常,提前完成了接口降级预案。

最后再分享一个小技巧:B站网页版有个隐藏能力——在视频页按Ctrl+Shift+I打开开发者工具,切换到Network标签,筛选fetch/XHR,然后刷新页面。所有真实API请求都会列出,点击任一请求的Headers,复制Request Headers,粘贴到Python脚本中作为headers字典。这是获取B站当前最新Header要求的最可靠方法,比任何网络教程都准。毕竟,B站的反爬策略每天都在微调,而你的脚本,必须跟上它的呼吸节奏。

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

两千元预算本地部署Qwen3-27B:V100实战280 tok/s推理

1. 两千块预算的本地AI部署&#xff0c;到底能跑出什么水平先说结论&#xff1a;两千多块钱&#xff0c;在二手市场上凑一套能跑Qwen3-27B级别模型、推理速度稳定超过280 tok/s的平台&#xff0c;这件事在2025年是完全可行的。我自己前前后后折腾了大概三周&#xff0c;从选卡、…

作者头像 李华
网站建设 2026/10/4 7:30:53

抖音充值抓包分析:解密支付请求链路与API设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/4 7:29:59

汽车三安一体Agent实践:用智能体生成功能安全、SOTIF与信息安全初稿

1. 从“人建模型”到“Agent建初稿”到底在说什么汽车功能安全、预期功能安全&#xff08;SOTIF&#xff09;和信息安全&#xff0c;这三块内容在传统整车开发流程里一直是三条相对独立的线。功能安全看的是电子电气系统失效后会不会导致危害&#xff0c;SOTIF盯的是没有系统失…

作者头像 李华
网站建设 2026/10/4 7:29:31

大模型训练显存估算与混合精度实战:从OOM到跑通7B模型

大模型训练绕不开两个硬骨头&#xff1a;显存不够和精度怎么选。我见过太多团队在单卡上跑7B模型&#xff0c;刚把batch size调到8就OOM&#xff0c;然后开始盲目换卡、换框架&#xff0c;最后发现是优化器状态没算对。这篇就把显存估计和混合精度训练这两件事拆开揉碎讲清楚&a…

作者头像 李华
网站建设 2026/10/4 7:29:30

pi coding agent CLI 深度解析:agent loop、TUI 与 LLM API 集成实践

1. 从"pi"这个极简名字说起&#xff1a;它到底是个什么东西第一次看到"pi"这个名字&#xff0c;大部分人的反应都是懵的——两个字母&#xff0c;没有后缀&#xff0c;没有版本号&#xff0c;放在一堆工具里毫不起眼。但如果你最近在折腾 LLM API、agent l…

作者头像 李华
网站建设 2026/10/4 7:26:54

Python深度神经网络实现灰度图像自动着色:从Lab空间到训练调参实战

简介&#xff1a;这份资源面向希望上手图像自动着色、了解深度先验应用的 Python 开发者与计算机视觉学习者&#xff0c;核心是两套预训练着色模型&#xff1a;eccv16 与 siggraph17&#xff0c;可在实时用户引导下为黑白照片上色。包内共 23 个文件&#xff0c;以 py 脚本与 p…

作者头像 李华