news 2026/10/2 13:50:23

短视频链接解析实战:从MD5签名到Python爬虫实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
短视频链接解析实战:从MD5签名到Python爬虫实现

做短视频链接解析接口,听起来像是个挺小众的需求,但真正写起来,你会发现它几乎涵盖了爬虫入门到进阶的所有经典要素:链接处理、正则提取、参数拼接、MD5签名、请求伪造、异常兜底。我最早接触这个案例的时候,纯粹是因为朋友给我丢了一个短视频分享口令,说“你帮我看看这个视频原地址是啥”,我一琢磨,用Python写个脚本来做这件事,比手动在浏览器里扒网络请求靠谱得多,于是就有了今天这篇内容的雏形。

这篇博文就围绕“短视频链接解析接口”这个爬虫案例展开,重点拆解MD5算法在接口签名里的实际用法,顺带把Python脚本传参、正则表达式提取、打包exe这些周边问题一并聊透。适合正在学爬虫但卡在“会写请求、不会过签名”阶段的读者,也适合想系统理解接口签名机制、想给自己脚本加一个完整可用的链接解析功能的开发者。我会从思路到实现再到排错,完整过一遍。

1. 解析接口的底层逻辑:为什么短视频链接需要“解析”

1.1 分享链接里藏了什么

你在短视频App里点“分享”,复制出来的通常是一段短链接,比如v.douyin.com/xxxxx/这种,或者是一段带口令的文本。这段链接本身不是视频地址,它只是一个“跳板”,服务端通过这个短码找到对应的视频ID,再重定向到真正的播放页。爬虫要做的事情,就是把这段短链接最终映射到视频的真实播放地址(尤其是无水印版本)。

但问题没那么简单。短视频平台的播放地址一般是有时效性的,而且经过了签名保护。直接请求播放接口,服务端会校验请求里携带的参数是否合法,其中最重要的就是签名参数。这个签名的计算方式五花八门,但MD5是最常见的一种,也是最适合拿来做教学案例的,因为它逻辑直观、代码量少、出错容易排查。

从技术链条上看,完整的解析流程是:分享链接 -> 重定向拿到视频ID -> 拼接API请求参数 -> 计算MD5签名 -> 请求解析接口 -> 提取无水印播放地址。这里面每一步都有坑,但核心难点就在MD5签名这一环。

1.2 解析接口与签名校验的关系

平台为什么要加签名?说白了,是为了让服务端能识别“这个请求是不是来自正规客户端”。短视频App的请求通常会带上客户端版本号、设备信息、时间戳等参数,服务端把这些参数按固定规则拼接成字符串,再算一个MD5值作为签名。如果你直接拿Python的requests去请求API,不带签名或者签名错误,服务端直接拒绝,返回的JSON里要么是“签名错误”,要么干脆返回一个假数据。

我见过很多初学者卡在这一步:正则写好了,ID提取出来了,接口地址也拼对了,但请求死活不通。原因就是少算了这个签名。所以这个案例的意义不止在于“拿到视频地址”,更在于让你真正理解:接口签名的本质就是服务端和客户端之间约定好的一套参数校验游戏,而MD5算法是这套游戏里最常用的加密工具。

这里顺便说一句,很多人一听到“MD5算法”就联想到“加密”,其实不严谨。MD5是一种哈希算法,不是加密算法。它的特点是:任意长度的输入,经过计算后输出固定长度(32位十六进制)的摘要。同一个输入永远得到同一个输出,但输入稍微变一点点,输出就会完全不一样。接口签名利用的正是这个“不可逆、抗篡改”的特性——服务端不知道你的完整参数,但它可以自己用同样的规则重算一遍签名,对比你传过来的签名是否一致,一致就放行,不一致就拒绝。

2. 环境准备:从零搭一个能跑的爬虫脚本

2.1 Python环境与依赖安装(顺手解决“py不是内部或外部命令”)

写爬虫第一步是跑通Python环境。这里我多说一句,很多新手在Windows上装完Python,打开命令行敲python没反应,反而提示“'python' 不是内部或外部命令,也不是可运行的程序或批处理文件”,这通常是安装时没勾选“Add Python to PATH”。解决方法是重新运行安装包,选择Modify,勾上PATH选项;或者手动把Python安装目录和Scripts目录加到系统环境变量里。

我个人习惯用py命令而不是python命令,因为Windows上多版本共存时,py是官方提供的启动器,能自动选择合适版本。如果你装了Python 3.8和3.11两个版本,用py -3.11就能精确指定解释器。这个细节在后续写脚本、跑脚本时会省很多事。

依赖方面,这个案例只需要两个库:

  • requests:发HTTP请求,处理重定向
  • re:Python内置的正则库,不需要额外安装

装requests就一条命令:

pip install requests

如果你用的是py命令,可以写成:

py -m pip install requests

py -m pip这种写法能避免“pip指向了错误Python版本”的尴尬。我踩过一次坑:电脑上同时有Anaconda和官方Python,直接敲pip install装到了Anaconda的环境里,结果用官方Python跑脚本时提示ModuleNotFoundError。从此以后,我装包一律用py -m pip,多花两秒钟打字,换来的是环境确定性。

IDE方面,VSCode是性价比很高的选择。装好Python扩展后,按Ctrl+Shift+P打开命令面板,输入 “Python: Select Interpreter”,选对解释器,然后就可以F5断点调试了。这里提一下“VSCode安装py环境”这个热搜词,核心就两步:装Python扩展 + 选解释器,没有其他玄学操作。

2.2 用正则表达式把视频ID从链接里抠出来

视频分享链接经过重定向后,URL里通常会带着视频ID。不同平台的ID格式不一样,有的是纯数字,有的是数字加字母混合。常见的URL形态大致是这样:

https://www.xxxx.com/video/7321234567890123456

对应到代码里,用正则提取ID就是一个很自然的需求。正则表达式在这个场景下的写法不复杂,核心就是匹配“/video/”后面的一串字符,遇到非字母数字就停:

import re def extract_video_id(url): # 匹配 /video/ 后面的 ID,ID 由字母数字组成 pattern = r'/video/([A-Za-z0-9]+)' match = re.search(pattern, url) if match: return match.group(1) return None

为什么推荐用正则而不是用字符串切割?因为分享链接经过重定向之后,URL里可能还带着其他参数,比如?utm_source=xxx&share_token=yyy,单纯用split('/')很容易取错位置。正则可以精确描述“我要的是/video/和/或?之间的这一段”,容错性更好。

正则这块我要多说一句:新手容易陷入“背正则符号”的误区,其实不用刻意背,记住几个高频模式就够了,\d匹配数字、\w匹配字母数字下划线、+表示一个或多个、*表示零个或多个、?表示可选。遇到不会的,现查现用,写多了自然熟练。这个案例里用到的[A-Za-z0-9]+属于字符组加量词,是最常用的组合之一。

2.3 MD5算法原理:为什么接口喜欢用它做签名

MD5算法本身是通用的,和编程语言无关。我看到热搜词里有“md5算法c语言”,其实MD5在C语言、Python、Java里的底层实现完全一样,都是那套位运算、填充、循环压缩的逻辑。只是高层语言把它封装成了现成的方法,你用的时候不用关心内部位移和常量表。Python里计算一个字符串的MD5,代码出乎意料地短:

import hashlib def md5_sign(text): md5 = hashlib.md5() md5.update(text.encode('utf-8')) return md5.hexdigest()

但话说回来,想要理解接口签名的设计思路,还是得大致知道MD5的几个特性:

特性一:固定长度输出。不管输入是一行文字还是整个文件,输出永远是32位十六进制字符串。这使得签名在参数传递时长度固定,服务端解析方便。

特性二:雪崩效应。输入字符串哪怕只改一个字符,输出的MD5值也会面目全非。接口靠这个特性防篡改——如果参数被改动,重算出来的签名就对不上。

特性三:不可逆。从MD5值反推原始输入极其困难。因此即使签名被别人抓包拿到,也无法轻易还原出完整的参数拼接规则。

那服务端是怎么校验的呢?举个例子,假设接口要求参数包含video_id、timestamp、client_type,服务端和客户端约定拼接规则是:

video_id=xxx&timestamp=xxx&client_type=xxx&salt=固定盐值

客户端把这个字符串丢进MD5算法,得到32位签名,随请求一起发给服务端。服务端收到请求后,用同样的参数和同样的规则重新计算一次签名,两个签名一致就放行。

这里有个关键点:签名的安全性不在于MD5算法本身,而在于拼接规则(尤其是盐值)的保密性。规则一旦泄露,任何人都可以伪造合法请求。这也是为什么很多平台的签名规则会频繁变动——开发者发现了旧的接口签名算法被爬虫破解,就会换一套拼接方式。

3. 核心实现:手写短视频链接解析接口

3.1 接口参数拼接规则与签名计算

现在进入正题。我以“某短视频平台”为案例来演示(具体平台名称不重要,思路通用)。假设经过分析,解析接口需要以下几个参数:

参数名含义示例值
video_id视频ID7321234567890123456
timestamp当前时间戳(秒级)1735689600
client_type客户端类型weapp
version客户端版本号19.7.0
signMD5签名32位十六进制字符串

签名的拼接规则假设为:把video_id、timestamp、client_type、version按ASCII码升序排序,然后用&连接,末尾加上固定盐值abc123,最后整体计算MD5。

为什么强调按ASCII码升序排序?这是接口签名里非常常见的约定,目的是为了保证参数顺序的唯一性。如果不排序,video_id=xxx&timestamp=yyy和timestamp=yyy&video_id=xxx会算出两个完全不同的签名,服务端就无法统一校验了。有些平台的规则更复杂,会在排序后再加上一层URL编码,那就是后话了。

对应到代码,签名计算的实现大概是这样的:

import hashlib import time SALT = "abc123" # 仅为演示,实际盐值需要从客户端里分析 def generate_sign(params: dict) -> str: # 1. 过滤空值 filtered = {k: v for k, v in params.items() if v not in (None, "")} # 2. 按 key 的 ASCII 升序排序 sorted_keys = sorted(filtered.keys()) # 3. 拼接成 query string raw_string = "&".join(f"{k}={filtered[k]}" for k in sorted_keys) # 4. 末尾追加盐值 raw_string = raw_string + "&" + SALT # 5. 计算 MD5 md5 = hashlib.md5() md5.update(raw_string.encode("utf-8")) return md5.hexdigest()

这段代码有三个细节值得说:

第一,encode("utf-8")这一步不能省略。hashlib.md5()接受的是字节串,不是字符串。不转编码直接传字符串会直接报TypeError。这个报错信息很明确,但新手经常犯。

第二,排序用的是Python内置的sorted()函数,它对字符串按ASCII码排序。大写字母ASCII码小于小写字母,如果参数里同时有大写和小写,顺序可能和你想的不一样。不过实际场景里,接口参数命名基本都是小写加下划线,不用担心这点。

第三,盐值SALT在真实场景里不会这么简单。有些平台的盐值是一大串随机字符,有些平台还会对时间戳做偏移处理。我在代码里写成固定值,是为了让你先跑通整个流程,理解了机制之后再去分析真实的拼接规则。

把这几个部分组合起来,一个完整的签名生成函数就出来了。关键是理解这个函数的输入输出:输入是参数字典,输出是32位签名。至于中间是排序还是拼接,完全可以按照你分析的平台规则来调整。

3.2 请求发送与结果提取

签名算出来了,接下来就是发请求。这里我要特别提醒一个爬虫新手很容易忽略的细节:先模拟请求头,再谈并发和分布式。很多平台的接口校验不止看签名,还会看User-Agent、Referer、Cookie等请求头。如果你的脚本连UA都不设置,用默认的python-requests/x.x.x去请求,大概率直接触发风控。

一个基础但可用的请求头配置长这样:

import requests headers = { "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1", "Referer": "https://www.xxxx.com/", "Accept": "application/json, text/plain, */*", "Content-Type": "application/json" }

这里用iPhone的UA不是为了装样子,而是因为很多短视频平台的移动端API对iOS的UA比较宽松。如果你用PC的Chrome UA去请求移动端的接口,服务端可能会返回“请使用客户端打开”之类的提示。这种细节,就是所谓“q反手机py”热搜词背后的隐含意思——很多接口校验逻辑在手机端和PC端是不一样的,做爬虫得学会区分。

请求发送的代码很简单:

def resolve_video(url): # 1. 提取视频ID video_id = extract_video_id(url) if not video_id: return {"error": "video_id 提取失败"} # 2. 构造参数 params = { "video_id": video_id, "timestamp": int(time.time()), "client_type": "weapp", "version": "19.7.0" } # 3. 计算签名 sign = generate_sign(params) params["sign"] = sign # 4. 发起请求 api_url = "https://www.xxxx.com/api/video/resolve" resp = requests.get(api_url, params=params, headers=headers, timeout=10) data = resp.json() return data

这个函数把整个流程串起来了:提取ID -> 构造参数 -> 生成签名 -> 请求接口。返回的JSON里面,通常包含视频标题、封面图、无水印播放地址等字段。无水印地址一般在data.url或者data.play_addr.url_list这种字段里。

我个人习惯在返回结果里加一层统一封装,而不是让原始JSON直接抛给调用方。原因很简单:真实场景里,接口可能返回错误码、签名过期提示、风控提示等,如果不统一处理,调用方代码会膨胀得很快。封装一层之后,错误信息集中处理,调用方只关心成功和失败两种状态。

3.3 给脚本加个命令行传参入口

脚本写好了,怎么方便地使用?我一开始的做法是直接在代码里改URL,每次解析新视频都要打开编辑器修改,跑完再改回去。后来我学聪明了,给脚本加了命令行参数入口。

这个需求对应的就是热搜词“python给另一个py脚本传递参数”。有两种常见的实现方式:

方式一:在命令行运行时传参

import sys if __name__ == "__main__": if len(sys.argv) < 2: print("用法: python resolve.py <分享链接>") sys.exit(1) share_url = sys.argv[1] result = resolve_video(share_url) print(result)

用的时候,终端里执行:

python resolve.py "v.douyin.com/xxxxx/"

方式二:另一个Python脚本通过subprocess调起

假设你现在有一个主程序main.py,想调用resolve.py里解析视频的功能,两种思路。一种是把resolve.py当模块导入(如果提供了resolve_video这样的函数),另一种是直接用subprocess传参:

import subprocess def call_resolve(share_url): result = subprocess.run( ["py", "resolve.py", share_url], capture_output=True, text=True, encoding="utf-8" ) return result.stdout

这种方式的优点是两个脚本完全解耦,主程序不关心resolve.py内部怎么实现;缺点是每次调用都要启动一个新的Python进程,如果调用频率高,性能开销会比较明显。

如果调用频率高,我更推荐把解析逻辑封装成一个可导入的模块,主程序直接from resolve import resolve_video,然后调用函数。这里就顺带涉及一个Python对象概念——装饰器,我把它用在请求重试和限速上。

4. 反爬对抗中的几个实战细节

4.1 用装饰器统一处理重试、限速与日志

我在实际使用中发现,解析接口偶尔会抽风——网络抖动、服务端限流、偶发超时。如果每次失败都人工干预,太不现实了。于是我给请求函数加了一个重试逻辑,用装饰器来实现,既不影响原始函数的逻辑,又能统一管理。

装饰器是Python里一个“看似难懂、实际很接地气”的概念。它的本质是:把一个函数作为参数传进去,包装一层新逻辑,再返回一个新的函数。举个例子:

import time from functools import wraps def retry(max_retries=3, delay=2): def decorator(func): @wraps(func) def wrapper(*args, **kwargs): for attempt in range(max_retries): try: return func(*args, **kwargs) except Exception as e: if attempt == max_retries - 1: raise print(f"第 {attempt + 1} 次请求失败: {e}, {delay} 秒后重试...") time.sleep(delay) return wrapper return decorator @retry(max_retries=3, delay=2) def resolve_video(url): ...

这段代码的作用是:resolve_video如果抛出异常,最多会重试3次,每次间隔2秒。看似简单,但在实际跑解析任务时,这个装饰器救了我很多次——尤其在网络不稳定的环境下,一次成功的请求背后可能已经失败了两次。

顺带提一下,装饰器还能用来做限速。比如解析接口对同一IP有每分钟调用次数限制,你可以写一个rate_limit装饰器,做到“每两次请求之间至少间隔N秒”,避免短时间内高频请求触发风控。

4.2 签名参数排序的玄机与手机端反爬差异

前面提到签名参数需要按ASCII排序,这里再扩展一个实战细节:有些平台的签名计算规则里,时间戳不是我们以为的“当前时间”,而是“客户端启动时记录的时间偏移值”。如果你直接用int(time.time())去算签名,服务端校验时会发现时间戳和签名不匹配。

针对这个问题,一个可行的排查思路是:用抓包工具看看真实客户端请求里携带的时间戳到底是几位的,以及它和当前时间差了多少。然后根据差值调整脚本里的时间戳生成逻辑。

另外,不同端的签名规则可能不同。热搜词里的“q反手机py”某种程度上就反映了这种差异:手机端App和PC网页版用的接口可能是两套,签名算法也可能两套。遇到解析目标时,先判断自己模拟的是“哪个端”的请求,再去分析对应的签名规则。不要拿着PC网页版的参数去请求App接口,那样签名死活过不了。

我自己的实操习惯是:先抓一个真实请求,把参数和签名都保存下来,然后本地复算,对比自己算出的签名和原生签名是否一致。整个过程可以拆成四步:

  1. 记录原始请求的所有参数和最终签名
  2. 把自己拼接的字符串打印出来
  3. 把打印出来的字符串手动算一次MD5
  4. 和原始签名对比,找到差异在哪

签名对不上时,通常就两个原因:一是拼接规则不对(比如漏了某个参数、排序方式错了、盐值不对),二是字符串编码不对(比如拼接时中英文标点混用、空格没处理干净)。排查顺序先看规则,再看编码,不要一上来就怀疑是MD5算法的问题。

4.3 关于风控识别:频率、Cookie与行为特征

很多人在写爬虫时,一门心思研究签名算法,却忽略了风控。其实对平台来说,单个请求的签名是否合法只是第一道门槛,更复杂的是通过请求频率、用户行为、设备指纹等方式判断“你到底是真人还是爬虫”。短视频解析接口的调用频率一旦上去,哪怕签名正确,也会触发验证或封禁。

经验之谈,初次调试时始终默认“你的请求一定会被风控”,然后在代码里留好退路。我自己常用的做法有三个:请求间隔随机化(比如1.5秒到3秒之间随机),避免固定频率被算法识别;失败后指数退避重试(第一次等2秒,第二次4秒,第三次8秒);给脚本加一个总请求数上限,达到上限就停下来人工确认。

这里顺便说一个安全意识的问题:写爬虫做技术研究没问题,但一定要控制频率、遵守平台规则,不要把接口打到不可用的程度。解析短视频链接用于个人学习和技术探索是完全合理的场景,但如果规模化使用,那就是另外一回事了。博主写这类文章,能带给大家的最大价值是理解签名算法的通用机制,而不是鼓励批量抓取。

5. 常见问题排查速查表

5.1 环境与打包问题:py不是内部或外部命令、VSCode环境、打包exe

日常跑脚本时,环境问题往往比代码问题更折腾。我把高频问题整理成一张速查表:

现象可能原因解决方法
提示'py' 不是内部或外部命令Python未安装或未加入PATH重装Python并勾选Add Python to PATH;或手动添加环境变量
提示'python' 不是内部或外部命令python命令未关联解释器使用py命令替代;或配置PATH中的python.exe路径
VSCode里运行脚本报ModuleNotFoundError选错了Python解释器按Ctrl+Shift+P选择正确的解释器,确认是装了requests的那个环境
pip安装成功但脚本仍找不到库pip装到了另一个Python环境统一使用py -m pip install xxx
中文打印乱码终端编码不是UTF-8脚本文件保存为UTF-8;Windows终端可执行chcp 65001切换代码页

还有一个高频需求是“py打包成exe”。如果你想把解析脚本发给不懂Python的人用,可以打包成单文件exe。核心工具是PyInstaller:

py -m pip install pyinstaller py -m PyInstaller -F resolve.py

-F参数表示生成单文件。打包完成后,exe文件在dist目录下。这里有两个实在的建议:一是给exe加上图标和版本号可以用--icon和--name参数;二是打包前先在命令行跑一遍脚本确认无异常,否则打包成功后排查问题会非常痛苦,因为exe里跑Python的错误信息不如直接脚本直观。

不过也要提醒一句:打包exe会让程序体积变大(一个简单的爬虫脚本打包后通常在10MB以上),而且杀毒软件有时候会误报PyInstaller生成的exe,这不是你代码的问题,是打包特征的误判。如果只是自己用,优先跑脚本而非打包。

5.2 签名错误与解析失败的排查思路

签名相关的报错,常见表现是接口返回“sign error”或“invalid request”。我把排错步骤整理成这样:

第一步:确认拼接字符串是你认为的那个样子。在计算MD5之前,把raw_string打印出来,和抓包数据里的参数对比。这里最容易错的是漏参数——服务端要求参与签名的参数可能是5个,你只拼了3个。用抓包对比一眼就能看出来。

第二步:确认排序规则。是否真的按ASCII码排序了?有些平台的规则是按参数名的字符串长度排序,两者结果完全不同。

第三步:确认盐值。盐值是否存在?位置是在拼接字符串末尾还是开头?是否还有二次MD5?有过平台在第一次MD5之后,把结果转成大写再算第二次。

第四步:确认字符编码。如果参数值里有中文,拼接后用UTF-8编码,而不是GBK。Python里.encode("utf-8")不会出错,但有位同事遇到过一次参数值被URL编码后再参与签名的情况,那种时候要先quote再拼接。

签名之外的问题相对好排查。比如解析结果里拿不到播放地址,大概率是提取字段名变了——平台的JSON结构会调整,字段从一个层级挪到另一个层级。我一般会在代码里加一个data.keys()的调试输出,先搞清楚返回结构再改提取逻辑。又比如请求返回的JSON是加密的,也就是所谓的“返回参数加密”,那又是另一个层级的问题,需要分析解密逻辑,这个案例暂不展开。

5.3 从解析到沉淀:把案例扩展成自己的工具箱

这一个案例跑通之后,我强烈建议你做一次“抽象沉淀”,而不是让它沦为一次性脚本。我自己的做法是这样:把解析逻辑从“单平台单接口”拆成三个层——参数构造层、签名计算层、请求发送层。参数构造层负责把“分享链接”转成“有效参数”,签名计算层只负责“给参数字典加签名”,请求发送层只负责“带上请求头发请求”。三层之间互不纠缠,后续遇到新的平台,只需要新增一个参数构造函数。签名算法换了,改签名层即可。

光看代码很难体会拆分层的好处,等你真的遇到“解析平台突然改签名算法”的时候,就会明白:如果签名计算逻辑散落在各个请求函数里,改一处就要全局搜索替换;而拆出来之后,只需要改generate_sign一个函数。这个朴素的经验,适用于所有爬虫项目,不只是短视频解析。

我个人在实际使用中还发现,这整个案例特别适合用来练手正则和调试技巧。短视频链接每次都不一样,ID位置偶尔也会微调,用正则提取的时候多写几个测试用例,比写一万行教程都管用。你可以试着把下面几种链接放到同一个extract_video_id函数里跑一遍,看看哪个会挂:

https://www.xxxx.com/video/7321234567890123456 https://www.xxxx.com/video/abc123DEF/?utm_source=123 https://www.xxxx.com/share/video?video_id=732xxx&from=copy

这就是这个案例最有意思的地方了——真实世界的数据总是比你预想的“脏”一点。把这几种情况都处理掉之后,你对正则表达式的理解会直接上一个台阶。我自己的体会是,爬虫最锻炼人的反而不是那些高大上的并发、分布式,而是耐心处理这种“脏数据”的过程。

最后再分享一个小技巧:写完这个脚本之后,你可以顺手给每次解析请求加一行日志,记录请求时间、视频ID、签名是否成功。积累一段时间之后回看这些日志,你能很清楚地看出哪个平台改规则了、哪个时段请求容易失败、平台的风控大概在什么频率触发。做爬虫,多记录,多归纳,永远比埋头改代码有收获。

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

Redis 接入 AI:从缓存到记忆层,向量搜索与语义缓存实战

1. 为什么是 Redis&#xff1a;AI 应用对数据层的三个新要求1.1 AI 应用到底缺什么&#xff1a;从"缓存"到"记忆层"先把手头的事放一放&#xff0c;我要认真聊聊 Redis 正式接入 AI 这件事。过去一两年&#xff0c;AI 大模型把所有人的注意力都拉到了"…

作者头像 李华
网站建设 2026/10/2 13:48:23

从零手搓AI工程:推理、RAG与Agent全链路实战

1. 从零手搓AI工程&#xff1a;为什么我不建议你直接调包很多人一上来就想搞个大模型应用&#xff0c;第一反应是找个API接上&#xff0c;或者拉个开源框架跑个demo。结果呢&#xff1f;demo跑通了&#xff0c;一上生产就崩。延迟高得离谱&#xff0c;成本失控&#xff0c;稍微…

作者头像 李华
网站建设 2026/10/2 13:46:55

把Claude Code变成任务调度器:多任务自动执行与状态恢复实战

前两周我做了一次挺上头的实验&#xff1a;把一个多模块 Node 项目里积压的 20 个测试补齐任务&#xff0c;从 Claude Code 的对话窗口里拿出来&#xff0c;改成了一堆独立的 Markdown 任务文件&#xff0c;再交给它在非交互模式下自动跑。跑完那天下班前&#xff0c;我盯着调度…

作者头像 李华