【论文笔记】SecAlign: Defending Against Prompt Injection with Preference Optimization
论文信息
论文标题:SecAlign: Defending Against Prompt Injection with Preference Optimization - CCS 25
论文作者: Sizhe Chen - UC Berkeley ;Meta, FAIR
论文链接:https://arxiv.org/abs/2410.05451
代码链接:https://github.com/facebookresearch/SecAlign?tab=readme-ov-file
论文关键词:prompt injection defense, LLM security, LLM-integrated applications
另一篇相关论文 : StructQ
研究背景
论文概述
本文提出了一种名为 SecAlign 的新型防御机制,旨在解决大型语言模型(LLMs)所面临的提示注入(Prompt Injection)攻击问题。传统的LLM防御方法通常未能有效应对提示注入,导致攻击成功率居高不下。SecAlign的核心创新在于将提示注入防御问题重新定义为偏好优化(Preference Optimization)问题。通过采用直接偏好优化(Direct Preference Optimization, DPO)算法,SecAlign旨在让LLM同时学习生成良性、期望的输出(对应原始指令),并抑制恶意、不期望的输出(对应注入指令)。论文详述了SecAlign的实现细节,包括偏好数据集的构建方法(其自动化特性是关键优势),并对比了**SecAlign与传统对抗训练(Adversarial Training, AT)**的区别,强调了其在LLM安全对齐方面的实用性和有效性。
问题背景与动机
随着大型语言模型(LLMs)在各个领域的广泛应用,其强大的能力日益显现。然而,这种能力也伴随着严重的安全风险,特别是提示注入攻击(Prompt Injection)。攻击者能够通过在用户输入中巧妙地注入恶意指令,来劫持LLM的正常行为,强制模型执行非预期或有害的操作,例如:
- 指令劫持: 使得LLM忽略其预设的系统指令或安全约束。
- 信息泄露: 诱导LLM泄露敏感的用户数据或其训练过程中的私有信息。
- 有害内容生成: 促使LLM产生偏见、仇恨言论、虚假信息或恶意代码。
文章指出,尽管已有多种尝试来防御提示注入,但这些传统方法(通常基于微调)普遍效果不佳,攻击成功率常常超过50%。论文深入分析了这一不足的根本原因:
- 单一目标优化: 现有防御方法往往只关注目标(i):鼓励模型对预期指令给出正确响应(即生成 y w y_w yw)。它们普遍忽略了目标(ii):阻止模型响应恶意注入,即避免生成 y l y_l yl。
- LLM输出空间巨大: 对于LLM而言,其词汇量 V V V 和输出长度 L L L 导致了 V L V^L VL 种巨大的可能输出空间。在这种指数级增长的空间中,仅仅通过鼓励 y w y_w yw 来进行回归,对抑制大量的其他不期望输出(包括 y l y_l yl)影响有限。即使模型学会了生成 y w y_w yw,它也可能仍然有较高的概率生成受攻击影响的 y l y_l yl,从而导致防御失效。
因此,迫切需要一种能够同时解决这两个目标的防御方法,以真正提升LLM的安全性。
SecAlign
核心思想:偏好优化(Preference Optimization)
SecAlign 的核心创新在于提出了一个突破性的见解:提示注入防御问题可以被视为一个偏好优化问题。 这意味着,“抵御提示注入的安全性”本身可以被视为一种LLM应该学习和强制执行的“偏好”。
为了实现这一目标,SecAlign 认为 LLM 的损失函数应该同时明确指定并优化两个目标:
- 目标(i): 鼓励模型对良性指令(原始用户请求)给出期望的、正确的响应 y w y_w yw。
- 目标(ii): 阻止模型响应恶意注入指令,即避免生成不期望的 y l y_l yl。
选择偏好优化算法:
文章初步探讨了简单的损失函数设计,如将 log p ( y l ∣ x ) \log p(y_l|x) logp(yl∣x) 减去 log p ( y w ∣ x ) \log p(y_w|x) logp(yw∣x)(公式2)。但考虑到简单损失函数可能导致的过拟合和不连贯响应问题,SecAlign 最终选择了更成熟、更稳定的**直接偏好优化(Direct Preference Optimization, DPO)**算法 [37]。
DPO 损失函数(公式3):
L SecAlign = − log σ ( β log π 0 ( y w ∣ x ) π ref ( y w ∣ x ) − β log π 0 ( y l ∣ x ) π ref ( y l ∣ x ) ) \mathcal{L}_{\text{SecAlign}} = -\log \sigma \left( \beta \log \frac{\pi_0 (y_w | x)}{\pi_{\text{ref}} (y_w | x)} - \beta \log \frac{\pi_0 (y_l | x)}{\pi_{\text{ref}} (y_l | x)} \right) LSecAlign=−logσ(βlogπref(yw∣x)π0(yw∣x)−βlogπref(yl∣x)π0(yl∣x))
- π 0 \pi_0 π0: 表示当前待优化的LLM。
- π ref \pi_{\text{ref}} πref: 表示一个 SFT 参考模型,通常是DPO训练开始前的模型或一个固定的基线模型。
- β \beta β: 超参数,用于控制偏好学习的强度。
- 核心功能: 该损失函数旨在最大化期望输出 y w y_w yw 和不期望输出 y l y_l yl 之间对数似然裕度。具体而言,它鼓励当前模型 π 0 \pi_0 π0 相对其参考模型 π ref \pi_{\text{ref}} πref 而言,为 y w y_w yw 分配更高的概率,同时为 y l y_l yl 分配更低的概率。这种相对概率的优化方式使得训练更加稳定和有效。
SecAlign 实现细节:偏好数据集的构建
SecAlign的成功实施依赖于精心构建的偏好数据集。这个数据集的每一个样本都必须包含提示注入的输入 x x x 、期望输出 y w y_w yw 和 不期望输出 y l y_l yl。
数据集构建流程
- 输入与初始化: 算法接收模型定界符( d instruction , d data , d response d_{\text{instruction}}, d_{\text{data}}, d_{\text{response}} dinstruction,ddata,dresponse)和一个公开的指令调优数据集 S S S,并初始化一个空的偏好数据集 P P P。
- 样本遍历与过滤: 算法遍历 S S S 中的每个原始样本 s = ( s instruction , s data , s response ) s = (s_{\text{instruction}}, s_{\text{data}}, s_{\text{response}}) s=(sinstruction,sdata,sresponse)。如果样本 s s s 没有
data
部分,则跳过(因为这种样本难以进行有效的提示注入攻击模拟)。 - 模拟提示注入:
- 为模拟注入,从 S S S 中随机抽取另一个样本 s ′ = ( s instruction ′ , s data ′ , s response ′ ) s' = (s'_{\text{instruction}}, s'_{\text{data}}, s'_{\text{response}}) s′=(sinstruction′,sdata′,sresponse′)。
- 攻击类型选择:
- 朴素攻击 (Naive Attack, 90%概率): 这种攻击最简单直接,将 s ′ s' s′ 的指令和数据部分直接拼接到 s s s 的
data
部分之后。 (s_data += s'_instruction + s'_data
) - 补全攻击 (Completion Attack, 10%概率): 这种攻击模拟更复杂的对话式注入。通过引入攻击定界符 d ′ d' d′(来自 [3]),将 s ′ s' s′ 的相关部分拼接起来,使其看起来像对话的自然延续。 (
s_data += d'_response + s_response + d'_instruction + s'_instruction
; 如果 s ′ s' s′ 有数据部分,则再添加d'_data + s'_data
)
- 朴素攻击 (Naive Attack, 90%概率): 这种攻击最简单直接,将 s ′ s' s′ 的指令和数据部分直接拼接到 s s s 的
- 构建最终输入 x x x: 使用模型的定界符将 s s s 的指令和处理后的数据部分拼接起来,形成 LLM 的最终输入 x x x。(
x = d_instruction + s_instruction + d_data + s_data + d_response
)
- 确定期望与不期望输出:
- 期望输出 y w y_w yw: 定义为原始样本 s s s 的响应 (
s_response
)。 - 不期望输出 y l y_l yl: 定义为用于注入的样本 s ′ s' s′ 的响应 (
s'_response
)。
- 期望输出 y w y_w yw: 定义为原始样本 s s s 的响应 (
- 添加到数据集: 将构建好的三元组 ( x , y w , y l ) (x, y_w, y_l) (x,yw,yl) 添加到偏好数据集 P P P 中。
自动化优势:
- 无需人工标注: SecAlign 的数据集生成过程是完全自动化的,不依赖于耗时耗力的人工判断和标注。
- 高效且可扩展: 这与将LLM对齐到复杂的人类偏好(如伦理、道德)时需要大量人工反馈形成鲜明对比,极大地降低了安全对齐的成本和复杂性,提高了其可扩展性和实际部署的可行性。
- 明确的安全策略: 提示注入的安全策略(即模型不应响应恶意注入)可以被明确地编码到数据生成逻辑中,这比定义模糊的人类偏好更容易操作。
SecAlign 与对抗学习 (SecAlign vs. Adversarial Training)
论文明确了 SecAlign 与传统对抗训练(AT)的区别,尤其是在大型语言模型(LLM)的背景下。
传统 AT 的局限性:
- 传统的对抗训练通常涉及一个昂贵的内部优化循环,通过梯度上升等方法动态生成对抗样本 x ′ x' x′ 来最大化损失函数(公式4):
min θ E ( x , y ) L ( θ , x , y ) = min θ E x max x ′ ∈ C L ( θ , x ′ , y ) \min_{\theta} \mathbb{E}_{(x, y)} \mathcal{L}(\theta, x, y) = \min_{\theta} \mathbb{E}_{x} \max_{x' \in \mathcal{C}} \mathcal{L}(\theta, x', y) θminE(x,y)L(θ,x,y)=θminExx′∈CmaxL(θ,x′,y) - 计算开销巨大: 对于LLMs而言,这种基于优化的对抗样本生成(例如使用像 GCG [21] 这样的方法)需要数百甚至数千个 GPU 小时的计算资源,使其在实际应用中难以承受。
SecAlign 的简化与实用性:
- SecAlign 放弃了这种昂贵的内部优化循环。它不试图在每次训练迭代中通过梯度生成“最优”的对抗样本。
- 相反,SecAlign 采用了预先生成的“免优化”攻击样本。这些样本(通过第 4.1 节描述的朴素攻击和补全攻击生成)是在训练开始前就已经确定的,并且独立于模型的当前权重。
- 这意味着 SecAlign 的优化目标简化为(公式5):
min θ E ( x , y ) L ( θ , x , y ) \min_{\theta} \mathbb{E}_{(x, y)} \mathcal{L}(\theta, x, y) θminE(x,y)L(θ,x,y)
其中 x x x 是预先构建的提示注入样本。 - 核心优势: 这种设计显著降低了训练的计算成本,使得 SecAlign 在 LLM 上具有极高的实用性。尽管简化了对抗训练的复杂性,但论文强调,这种预生成的“免优化”攻击(特别是补全攻击)已被证明在提示注入防御中有效,并且可以作为一种有效的替代方法来最大化训练损失。
实验部分
实验设置:
- 基线模型: 实验在 SFT 微调后的LLM基础上进行。高性能的SFT模型被视为SecAlign性能的基础。
- 数据集: 偏好数据集是根据算法自动构建的,它包含提示注入输入 x x x、期望输出 y w y_w yw 和不期望输出 y l y_l yl。数据来源于公开指令调优数据集,并混合使用了朴素攻击(90%)和补全攻击(10%)来模拟注入。
- 评估指标:
- 攻击成功率 (ASR): 衡量攻击者成功诱导模型生成 y l y_l yl 的比例。目标是显著降低 ASR。
- 期望输出概率(Log Probabilities of y w y_w yw): 确保防御不会损害模型生成正确响应的能力。
- 不期望输出概率(Log Probabilities of y l y_l yl): 衡量模型对恶意输出的抑制程度。
- Log Probabilities Margin: y w y_w yw 和 y l y_l yl 之间对数似然裕度,越大越好。
- 训练细节: 采用DPO算法进行优化,并使用了高性能计算资源进行训练。
实验结果与分析:
- SecAlign vs. 无防御基线: 未防御的LLM在面对提示注入攻击时,攻击成功率通常高于50%。SecAlign模型展示了显著的防御能力,大幅降低了 ASR。
- SecAlign vs. 传统微调防御 (StruQ): 论文通过图2对比了SecAlign和StruQ(仅优化目标i)的效果。
- StruQ 能够将 y l y_l yl 的平均对数概率降低到大约 -140。
- SecAlign 表现出更强的抑制能力,能够将 y l y_l yl 的平均对数概率进一步大幅降低到大约 -300。
- 重要的是,SecAlign 在实现对 y l y_l yl 的强力抑制的同时,不影响对期望输出 y w y_w yw 的生成。这表明 SecAlign 成功地实现了双目标优化,从而提供了更鲁棒的防御。对数似然裕度越大,防御安全性越高。
- 不同攻击类型下的性能: SecAlign 对朴素攻击和补全攻击均展现出强大的鲁棒性。在训练数据中引入少量补全攻击样本,有效提升了模型对这类复杂攻击的泛化防御能力。
- 消融研究(DPO 选择的合理性): 论文(在第4.5节中)通过消融研究证明,DPO 在简洁性、训练稳定性以及最终性能方面优于其他偏好优化算法,这验证了在 SecAlign 框架中选择 DPO 的合理性。
论文创新点
- 创新性问题重构: 首次将LLM的提示注入防御问题概念化为偏好优化问题,为LLM安全提供了一个全新的视角和解决方案框架。
- 提出 SecAlign 框架: 基于 DPO 算法,构建了一个能够同时优化良性输出和抑制恶意注入的防御机制。
- 自动化偏好数据集构建: 设计了一种无需人工标注的自动化数据集生成方法(通过朴素攻击和补全攻击模拟提示注入),极大地提高了安全对齐的可扩展性和实用性,降低了防御成本。
- 实用性与效率: 放弃了传统对抗训练中昂贵的内部优化循环,采用预生成的“免优化”攻击样本,使得SecAlign在LLM上实现高效的训练,解决了传统AT在LLM上应用的可扩展性问题。
- 拓宽偏好优化应用: 证明了偏好优化不仅限于伦理、真实性等人类偏好对齐,还可以有效应用于LLM的安全防御,揭示了该技术更广泛的应用潜力。
- 在实践中有效: 尽管原理上进行了简化,但SecAlign在实际提示注入防御中表现出强大的性能(基于文中提及的初步结果)。
个人总结
这篇论文提出了一个非常有前景且实用的方法来应对LLM的提示注入攻击。其将安全问题重新框架为偏好优化问题是核心亮点,展现了创新的思维。特别值得称赞的是其自动化数据集构建的策略,这极大地解决了LLM安全训练中常见的数据标注难题,使得方法更具可扩展性和现实意义。
论文清晰地解释了SecAlign与传统对抗训练的区别,并强调了其在LLM背景下的效率和实用性。这对于希望在实际应用中部署安全LLM的开发者和研究者来说,具有很高的参考价值。
总的来说,这是一篇关于LLM安全对齐领域的重要论文,它不仅提供了一种有效的防御方案,也为未来LLM安全研究开辟了新的思路。
当然有没有不需要微调的提示词攻击的防御方法?
相关文章:
【论文笔记】SecAlign: Defending Against Prompt Injection with Preference Optimization
论文信息 论文标题:SecAlign: Defending Against Prompt Injection with Preference Optimization - CCS 25 论文作者: Sizhe Chen - UC Berkeley ;Meta, FAIR 论文链接:https://arxiv.org/abs/2410.05451 代码链接:h…...
IP Search Performance Tests dat/db/xdb/mmdb 结构性能差异对比
IP Search Performance Tests qqzeng-ip by 2025-06-01 测试环境: BenchmarkDotNet v0.15.0 macOS Sequoia 15.5 (24F74) [Darwin 24.5.0] Apple M4 Max, 1 CPU, 14 logical and 14 physical cores .NET SDK 10.0.100-preview.4.25258.110 [Host]: .NET…...

OpenRouter使用指南
OpenRouter 是一个专注于大模型(LLM)API 聚合和路由的服务平台,旨在帮助开发者便捷地访问多种主流大语言模型(如 GPT-4、Claude、Llama 等),并提供统一的接口、成本优化和智能路由功能。以下是它的核心功能…...
Linux 中 m、mm、mmm 函数和 make 的区别
在 Linux 内核开发和 Android 开发中,构建系统通常使用 make 命令来编译和构建项目。而在 Android 开发环境中,还有 m、mm 和 mmm 等命令,这些命令是 Android 构建系统的一部分,提供了更高效和便捷的构建方式。以下将详细介绍这些…...
【MAC】YOLOv8/11/12 转换为 CoreML 格式并实现实时目标检测
在本文中,我们将详细介绍如何将 YOLOv8/11/12 模型转换为 CoreML 格式,并使用该模型在摄像头实时检测中进行目标检测。主要适用于M1、M2、M3、M4芯片的产品。 以下教程在YOLOv8/11/12均适用,此处就以 YOLOv11 举例 目录 前提条件YOLOv8/11/12 转换为 CoreML实时目标检测结论…...
NodeJS全栈WEB3面试题——P7工具链 测试
📊 7.1 Truffle vs Hardhat:各自的优势? 项目TruffleHardhat📦 成熟度老牌框架,社区大,文档全面新一代框架,现代化设计🧪 测试支持内置 Mocha 测试框架支持 Mocha Chai,…...
Mybatis框架各配置文件主要内容详解(二)
ResultMap解决了数据库字段与实体类之间不一致导致的问题 <!--resultMap:设置自定义映射属性:id:表示自定义映射的唯一标识type:查询的数据要映射的实体类的类型子标签:id:设置主键的映射关系result&…...

【优选算法 | 队列 BFS】构建搜索流程的核心思维
算法相关知识点可以通过点击以下链接进行学习一起加油!双指针滑动窗口二分查找前缀和位运算模拟链表哈希表字符串模拟栈模拟(非单调栈)优先级队列 很多人学 BFS 的时候都知道“用队列”,但为什么一定是队列?它到底在整个搜索流程中起了什么作…...
virtio介绍 (三)--spdk作为virtio后端处理nvme盘io的流程--上
目录 一 简介 二 vhost-blk层 三 bdev层 四 lvol层 五 bdev_nvme层 六 硬件驱动层 七 完整取io调用栈流程 一 简介 上节介绍了virito的基本原理,后面根据实际代码介绍virtio的流程。virtio后端代码相对于前端代码更简单,我们先以spdk中的virtio后…...
关于BackgroundScheduler的pause
在APScheduler中,pausedTrue参数的作用对象取决于其使用场景: 1. 作用于调度器(Scheduler) 当在start()方法中使用时(如 scheduler.start(pausedTrue)) 表示调度器本身启动后立即进入暂停状态&…...

设计模式(行为型)-中介者模式
目录 定义 类图结构展示 角色职责详解 模式的优缺点分析 优点 缺点 适用场景 应用实例 与其他模式的结合与拓展 总结 定义 中介者模式的核心思想可以概括为:用一个中介对象来封装一系列的对象交互。这个中介者就像一个通信枢纽,使各对象不需要…...

【Java学习笔记】异常
异常(Exception) 一、基本介绍 在 Java 程序中,将运行中发生的不正常情况称为 “异常”,开发过程中的语法错误和运行时发生的异常情况是不一样的。 二、异常的分类 1. Error(错误):Java 虚拟…...

MySQL:视图+用户管理+访问+连接池原理
一、视图 视图是一个虚拟表,其内容由查询定义。同真实的表一样(相当于是把查询的内容当成一个临时表来使用),视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。 1.1 为…...

neo4j 5.19.0安装、apoc csv导入导出 及相关问题处理
前言 突然有需求需要用apoc 导入 低版本的图谱数据,网上资料又比较少,所以就看官网资料并处理了apoc 导入的一些问题。 相关地址 apoc 官方安装网址 apoc 官方导出csv 教程地址 apoc 官方 导入 csv 地址 docker 安装 执行如下命令启动镜像 doc…...
C/C++ OpenCV 矩阵运算
C/C OpenCV 矩阵运算详解 💡 OpenCV 是一个强大的开源计算机视觉和机器学习库,它提供了丰富的矩阵运算功能,这对于图像处理和计算机视觉算法至关重要。本文将详细介绍如何使用 C/C 和 OpenCV 进行常见的矩阵运算。 矩阵的创建与初始化 在进…...

无人机桥梁3D建模的拍摄频率
无人机桥梁3D建模的拍摄频率 无人机桥梁3D建模的拍摄频率(每秒拍摄照片数)需根据建模精度、飞行速度、相机性能等因素综合确定。以下是专业级作业的详细参数分析: 1. 核心计算公式 拍摄频率(fps) \frac{飞行速度&…...

ESP32-idf学习(三)esp32C3连接iot
一、前言 上一篇用蓝牙作为通信方式,虽然勉强完成了控制,但结果显然不是那么符合我们的预期,既然用蓝牙还需要研究一段时间,那我们就先整一些现成的,不需要研究的!iot云平台!这里当然也是通过w…...

详解鸿蒙仓颉开发语言中的计时器
今天又到了大家喜闻乐见的科普环节,也可以说是踩坑环节,哈哈哈。今天聊一聊仓颉开发语言中的计时器,这部分可老有意思了。 为什么这么说呢,因为关于仓颉的计时器你几乎搜不到任何的文档,也没有相关的代码提示…...

【计算机网络】第3章:传输层—拥塞控制原理
目录 一、PPT 二、总结 (一)拥塞的定义 (二)拥塞产生的原因 (三)拥塞控制的目标 (四)拥塞控制方法分类 1. 端到端拥塞控制 2. 网络辅助拥塞控制 (五)…...

Vue3(watch,watchEffect,标签中ref的使用,TS,props,生命周期)
Vue3(watch,watchEffect,标签中ref的使用,TS,props,生命周期) watch监视 情况三:监视reactive定义的对象类型的数据 监视reactive定义的对象类型的数据,默认开启深度监视。地址没变,新值和旧…...

【nssctf第三题】[NSSCTF 2022 Spring Recruit]easy C
这是题目,下载附件打开是个C文件 #include <stdio.h> #include <string.h>int main(){char a[]"wwwwwww";char b[]"dvxbQd";//try to find out the flagprintf("please input flag:");scanf(" %s",&a);if…...
Cocos 打包 APK 兼容环境表(Android API Level 10~15)
使用 Cocos 打包 APK:Android 10 ~ Android 15 兼容版本对照表 ✅ 本表基于 Cocos Creator 3.x 实际测试及官方建议整理 📆 最后更新时间:2025年6月 💡 推荐使用 Android Studio 2022 或命令行构建工具 Android 版本API Level推荐…...
数据结构之堆:解析与应用
一、堆的核心定义与性质 堆是一种特殊的完全二叉树,分为最大堆和最小堆: 最大堆:每个节点的值 ≥ 子节点值,根节点为最大值。最小堆:每个节点的值 ≤ 子节点值,根节点为最小值。 关键性质: …...

DBeaver导入/导出数据库时报错解决方案
导出: 报错:mysqldump: Got error: 2026: SSL connection error: error:0A000102:SSL routines::unsupported protocol when trying to connect 在额外的命令参数中添加"--ssl-modeDISABLED"可以关闭SSL服务,从而成功解决问题。这…...
GPIO模拟串口通信
在资源受限的嵌入式项目中,GPIO模拟串口(UART)仍有实际需求。尽管现代MCU多数具备多个硬件串口,但实际项目中仍可能遇到串口数量不足的情况,尤其在低成本、小封装芯片的应用场景中。 一、GPIO模拟串口的基本原理 GPIO模拟串口,顾名思义,就是通过软件控制普通IO口的高低…...

uniapp与微信小程序开发平台联调无法打开IDE
经测试属于网络问题。本机需要联网。否则会出现Hbuilder运行微信小程序到模拟器时无法打开 微信开发者工具 这个页面出不来会一直显示异常。这期间微信小程序开发工具的端口是通的 需要先联网...

第十二节:第五部分:集合框架:Set集合的特点、底层原理、哈希表、去重复原理
Set系列集合特点 哈希值 HashSet集合的底层原理 HashSet集合去重复 代码 代码一:整体了解一下Set系列集合的特点 package com.itheima.day20_Collection_set;import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Set; import java.util.…...

【C++项目】:仿 muduo 库 One-Thread-One-Loop 式并发服务器
🌈 个人主页:Zfox_ 🔥 系列专栏:C从入门到精通 目录 🔥 前言 一:🔥 项目储备知识 🦋 HTTP 服务器🦋 Reactor 模型🎀 单 Reactor 单线程:单I/O多路…...

基于大数据的个性化购房推荐系统设计与实现(源码+定制+开发)面向房产电商的智能购房推荐与数据可视化系统 基于Spark与Hive的房源数据挖掘与推荐系统设计
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...

FFmpeg学习笔记
1. 播放器的架构 2. 播放器的渲染流程 3. ffmpeg下载与安装 3.0 查看PC是否已经安装了ffmpeg ffmpeg 3.1 下载 wget https://ffmpeg.org/releases/ffmpeg-7.0.tar.gz 3.2 解压 tar zxvf ffmpeg-7.0.tar.gz && cd ./ffmpeg-7.0 3.3 查看配置文件 ./configure …...