感觉 Codex 没有 Claude Code 那么耗 token 啊
写了一大份文档,让他写个 app (不算简单,也不算太复杂)。
用的 5.3 ,他自己写了差不多半个小时,也才用了 15% 的 5 hour limit 。
感觉 Claude Code 让它写个简单的东西就得 20% 了。
xiaohack博客专注前沿科技动态与实用技术干货分享,涵盖 AI 代理、大模型应用、编程工具、文档解析、SEO 实战、自动化部署等内容,提供开源项目教程、科技资讯日报、工具使用指南,助力开发者、AI 爱好者获取前沿技术与实战经验。
写了一大份文档,让他写个 app (不算简单,也不算太复杂)。
用的 5.3 ,他自己写了差不多半个小时,也才用了 15% 的 5 hour limit 。
感觉 Claude Code 让它写个简单的东西就得 20% 了。
简单介绍下情况,我从事电商行业十几年,有吃到一些行业红利,现在手上也有几家公司有品牌有 TPDP ,80%销量在抖音,一百多人,近年来由于 AI 的快速发展,公司很多岗位例如客服、美工设计、短视频内容团队(编导拍剪后期等岗位)都开始越来越多的使用相关 AI 工具,但都是团队自身或者个人在研究使用,对公司整体而言是很零散且不够高效的,且员工离职后也留存不下来 sop 。我个人并非 IT 出生,了解并不多,我很希望能够单独做一个 AI 支持部门,能够服务对接相关的业务部门,提升效率节省人力,甚至创作出更好的内容来,以下是具体的问题,还请懂的大佬不令赐教:
1 、具体招聘的岗位名称应该是什么,如何评判应聘人员的具体能力水平
2 、我所设想的 AI 支持部门逻辑是否成立,对相关协同部门以及业务部门有多大的帮助
3 、最小团队人员数量应该在多少,以及应该分别负责什么
4 、针对这个团队应该如何设计考核内容
5 、相关设备的投入最小预算预计在多少
问题很多也很具体,恳请有了解的大佬指点一二,对当中的某一个点能有解答,小生也不甚感激
以上
写在前面,本人目前处于求职中,如有合适内推岗位,请加:lpshiyue 感谢。 在掌握了Flink实时计算的心智模型后,我们面临一个更根本的挑战:如何保证数据处理结果的绝对准确性?Exactly-once(精确一次)语义作为流处理领域的"圣杯",其实现背后隐藏着巨大的真实成本。本文将深入剖析端到端一致性的技术本质,揭示两阶段提交协议的复杂性代价,帮助企业在一致性需求与系统成本之间找到最佳平衡点。 精确一次语义在理论上很直观:每条数据只对最终结果产生一次影响。然而工程实践中,这一理想概念需要重新定义为有效一次——数据可能被处理多次,但最终效果只反映一次。 概念澄清至关重要: 分布式系统无法实现真正精确一次的根本原因在于故障不确定性。当节点故障发生时,无法准确区分是永久性故障还是临时不可用,这种不确定性使得绝对的"只处理一次"在理论上不可实现。 实现有效一次语义需要付出多方面成本,主要包括: 性能成本:延迟增加、吞吐量下降 根据实践经验,追求端到端精确一次会使系统复杂度增加2-3倍,吞吐量降低20%-40%,延迟增加30%-50%。 不同一致性等级适用于不同业务场景,理性选择避免过度设计: 最多一次适合可容忍数据丢失的场景: 至少一次适合可接受重复但不可丢失的场景: 精确一次适合业务准确性要求极高的场景: 选择合适的一致性级别需要综合考量四个维度: 业务影响维度:数据不准确带来的经济损失和声誉风险 一致性选择决策流程 两阶段提交协议是实现分布式事务的核心算法,也是精确一次语义的技术基础。 第一阶段:准备阶段 第二阶段:提交阶段 在Flink中,2PC通过 2PC协议面临多种故障场景,需要精细的容错机制: 协调者单点故障:通过备用协调者或选举机制解决 Flink通过Checkpoint机制保存2PC的状态信息,确保故障恢复后能够继续完成或回滚事务。 2PC协议引入的多方面性能开销: 同步阻塞开销:在准备阶段所有参与者处于阻塞状态 实测数据显示,启用2PC后,Kafka生产者的吞吐量下降25%-35%,平均延迟增加40-60ms。 输入端的一致性保证是端到端精确一致的基础: 可重置数据源是前提条件: 偏移量管理策略: 这种原子性保证确保业务处理与位置更新的一致性。 Flink通过Checkpoint机制保证内部状态的一致性: 分布式快照原理: 状态后端选择影响一致性和性能: 输出端是端到端一致性的最终关卡: 幂等写入是轻量级方案: 事务写入是强一致性方案: 启用精确一次语义对系统性能产生全方位影响: 吞吐量下降:主要来自事务管理和同步开销 延迟增加:关键路径上的处理时间延长 资源消耗上升:额外的基础设施开销 精确一次语义带来的运维挑战不容忽视: 监控复杂度:需要跟踪分布式事务状态 故障调试难度:问题定位和修复更加困难 团队技能要求:需要深入理解分布式系统原理 金融交易系统是典型场景: 关键业务系统需要保证数据准确: 在这些场景中,数据不准确带来的损失远超过实现精确一次的技术成本。 分析型业务场景通常可接受延迟一致: 操作型业务场景可通过其他手段保证正确性: 分层一致性策略:不同业务采用不同一致性级别 技术方案优化:在保证一致性的前提下提升性能 架构设计优化:从系统层面降低一致性成本 阶段一:需求分析与技术选型 阶段二:原型验证与性能测试 阶段三:渐进式实施与监控 某大型电商平台在订单处理系统中实施精确一次的经验: 业务挑战: 技术方案: 实施效果: 精确一次语义的实现确实需要付出显著成本,但这种成本在关键业务场景中是必要的投资。成功的精确一次实践需要在业务需求和技术成本之间找到平衡点,而不是盲目追求技术完美性。 核心决策原则: 未来发展趋势: 精确一次不是流处理的终点,而是构建可靠数据系统的起点。在理解其真实成本的基础上,企业可以做出更明智的技术决策,构建既满足业务需求又保持合理成本的数据处理系统。 📚 下篇预告 点击关注,掌握数据湖技术选型的关键决策因素! 今日行动建议:精确一次语义不是简单的配置开关,而是一致性、性能与复杂度之间的精密权衡艺术
1 精确一次语义的迷思与真相
1.1 从理想概念到工程现实
1.2 精确一致的现实成本维度
资源成本:额外的存储、网络和计算开销
复杂度成本:系统设计、实现和维护的复杂性提升
运维成本:监控、调试和故障恢复的难度增加2 一致性等级的全景分析
2.1 三级一致性语义的适用场景
2.2 一致性选择的决策框架
技术成本维度:实现更高级别一致性的开发和运维成本
性能要求维度:业务对延迟和吞吐量的敏感程度
团队能力维度:团队对复杂技术的掌握和运维能力3 两阶段提交协议的技术本质
3.1 2PC的工作原理与实现机制
TwoPhaseCommitSinkFunction抽象类实现,需要重写四个核心方法:public abstract class TwoPhaseCommitSinkFunction<IN, TXN, CONTEXT>
extends RichSinkFunction<IN> {
// 开启新事务
protected abstract TXN beginTransaction() throws Exception;
// 预提交:将数据写入事务
protected abstract void preCommit(TXN transaction) throws Exception;
// 提交事务
protected abstract void commit(TXN transaction) throws Exception;
// 回滚事务
protected abstract void abort(TXN transaction) throws Exception;
}3.2 2PC的故障场景与容错处理
参与者超时无响应:超时机制自动触发回滚
网络分区导致脑裂:多数派原则或人工干预解决
持久化状态丢失:日志重放和状态恢复机制3.3 2PC的性能瓶颈分析
网络通信开销:两轮网络往返的延迟成本
持久化开销:事务日志的写入性能影响
资源锁定开销:事务期间相关资源的独占使用4 端到端精确一致的实现路径
4.1 输入端的一致性保证
-- 偏移量与业务数据同一事务提交
BEGIN TRANSACTION;
INSERT INTO business_table VALUES (...);
UPDATE offset_table SET offset = NEW_OFFSET;
COMMIT;4.2 处理引擎的一致性保证
4.3 输出端的一致性保证
-- 基于唯一约束的幂等写入
INSERT INTO table (id, data) VALUES (?, ?)
ON DUPLICATE KEY UPDATE data = VALUES(data);5 精确一次的真实成本量化
5.1 性能成本的具体表现
5.2 运维成本的隐性负担
6 精确一次的适用场景与权衡策略
6.1 必须追求精确一次的场景
6.2 可接受最终一致的场景
6.3 成本优化策略与实践
7 实践建议与成功案例
7.1 精确一次实施路线图
7.2 电商平台精确一次实践案例
-- 幂等性方案为主,关键业务辅以事务
INSERT INTO orders (order_id, status, amount)
VALUES (?, 'PENDING', ?)
ON DUPLICATE KEY UPDATE status = 'PENDING';
-- 关键资金操作使用事务
BEGIN TRANSACTION;
UPDATE account SET balance = balance - ? WHERE user_id = ?;
INSERT INTO transaction_log VALUES (...);
COMMIT;总结
《数据湖技术对比——Iceberg、Hudi、Delta的表格格式与维护策略》—— 我们将深入探讨:
RichEditor 是 ArkTS 中支持图文混排和交互式文本编辑的核心组件,适用于: 二、核心API对比与适配策略 代码对比小例子: 鸿蒙6+内存优化举个例子: 组件选型原则: 性能优化黄金法则: 跨版本适配策略: 安全加固方案:一、组件架构和核心小知识
1.1 一起来看看这个组件是个啥
1.2 内容管理模型对比一下下
特性 基于属性字符串构建 基于Span构建 数据结构 StyledString对象序列化独立Span对象集合 样式更新效率 批量更新(O(1)) 增量更新(O(n)) 复杂操作支持 有限(依赖属性字符串解析) 完整(支持动态增删改) 跨平台兼容性 需手动处理序列化/反序列化 原生支持 // 基于属性字符串构建(鸿蒙5+)
const styledString = new MutableStyledString("带样式的文本", [
{ start: 0, length: 2, styledKey: FONT, styledValue: { fontSize: 20 } }
]);
new RichEditor({ controller: new RichEditorStyledStringController() })
.setStyledString(styledString);
// 基于Span构建(鸿蒙6+推荐)
new RichEditor({ controller: new RichEditorController() })
.addTextSpan("动态内容", { fontSize: 18, fontColor: Color.Red });二、核心API和一些常用功能的实现
2.1 内容操作接口矩阵
操作类型 基于属性字符串方法 基于Span方法 文本插入 setStyledString()addTextSpan()图片插入 不支持 addImageSpan()自定义内容 需通过属性字符串编码 addBuilderSpan()样式更新 批量更新属性字符串 单个Span样式修改 范围查询 通过字符串索引定位 getSpans()精确查询2.2 举个例子
2.2.1 自定义表情键盘集成
// 鸿蒙6+实现方案
RichEditor()
.customKeyboard(
EmojiKeyboard(), // 自定义组件
{ supportAvoidance: true }
)
.onIMEInputComplete((span) => {
if(span.type === SpanType.IMAGE) {
this.updateEmojiCount();
}
});2.2.2 @好友功能的实现
// 带数据携带的@好友实现(鸿蒙6)
addAtFriend(friendId: string) {
const friendSpan = new TextSpan(
`@${friend.name} `,
{
data: { id: friendId },
style: { textDecoration: Underline }
}
);
this.controller.addTextSpan(friendSpan);
// 光标定位处理
this.controller.setCaretOffset(
friendSpan.spanRange[1] + 1
);
}三、多版本适配
3.1 API差异对比一下下
API 鸿蒙5实现 鸿蒙6+优化 图片插入 需使用 addImageSpan+手动布局支持自动尺寸适配 样式继承 需手动设置父子级样式 新增 inheritStyle属性撤销/重做 需自行实现历史栈 内置 undoManager性能监控 无原生支持 提供 getMemoryUsage()方法3.2 版本兼容
// 鸿蒙5/6兼容处理
const isHarmonyOS6 = version >= 6;
// 内容初始化
const initContent = () => {
if(isHarmonyOS6) {
return new RichEditorController().addTextSpan("默认内容");
} else {
const styledString = new MutableStyledString("默认内容");
return new RichEditorStyledStringController().setStyledString(styledString);
}
}
// 样式应用
const applyStyle = (span: TextSpan) => {
if(isHarmonyOS6) {
span.style.inheritStyle = true;
} else {
span.style.fontFamily = "SystemDefault";
}
}四、优化一下下
4.1 内存管理策略
// 批量操作优化
const batchUpdate = () => {
this.controller.startBatchUpdate();
try {
this.controller.addTextSpan("批量内容1");
this.controller.addTextSpan("批量内容2");
} finally {
this.controller.endBatchUpdate();
}
}
// Span复用策略
const spanPool = new Map<string, TextSpan>();
const getTextSpan = (text: string) => {
if(!spanPool.has(text)) {
spanPool.set(text, new TextSpan(text, { fontSize: 14 }));
}
return spanPool.get(text)!;
}4.2 渲染性能对比一波
场景 鸿蒙5(FPS) 鸿蒙6+(FPS) 优化措施 1000字符纯文本 58 62 文本分块渲染 50张图片混排 42 55 图片懒加载+内存缓存 频繁样式切换 35 48 样式对象池+脏标记机制 五、复杂场景解决方案
5.1 自定义键盘
5.2 撤销/重做实现方案
class EditorHistory {
private stack: { type: 'add' | 'delete', data: any }[] = [];
private currentIndex = -1;
addOperation(type: 'add' | 'delete', data: any) {
this.stack = this.stack.slice(0, this.currentIndex + 1);
this.stack.push({ type, data });
this.currentIndex++;
}
undo() {
if(this.currentIndex >= 0) {
const op = this.stack[this.currentIndex--];
op.type === 'add' ? this.controller.deleteSpans(op.data) : this.controller.addSpan(op.data);
}
}
redo() {
if(this.currentIndex < this.stack.length - 1) {
this.currentIndex++;
const op = this.stack[this.currentIndex];
op.type === 'add' ? this.controller.addSpan(op.data) : this.controller.deleteSpans(op.data);
}
}
}六、调试与监控方案
6.1 开发调试工具链
// 内存监控配置
const memoryMonitor = setInterval(() => {
console.log(`JS Heap: ${this.controller.getMemoryUsage().jsHeapSize} KB`);
}, 5000);
// 性能分析面板
const perfObserver = new PerformanceObserver((list) => {
const entries = list.getEntries();
console.log('渲染耗时:', entries[0].duration);
});
perfObserver.observe({ entryTypes: ['render'] });6.2 常见问题排查矩阵
现象 可能原因 解决方案 光标跳动异常 Span跨度计算错误 使用 getSpanRange()验证范围图片显示错位 未设置 imageStyle.size显式指定图片尺寸 样式继承失效 未启用 inheritStyle属性在父级Span设置继承属性 撤销历史丢失 未使用批量操作API 包裹操作于 startBatchUpdate()七、结论一下下哈
TextInputRichEditorRichTextstartBatchUpdate)Image.preload())// 特性检测实现
const supportsDataDetector = () => {
return 'enableDataDetector' in RichEditorController.prototype;
}
// 条件渲染
if(supportsDataDetector()) {
this.controller.enableDataDetector(true);
}
很简单的那种,类似 windows 的画图一样的,简单操作一下即可的那种。
每秒 2 万 tokens ,太牛逼了,在线体验 https://chatjimmy.ai
https://x.com/awesomekling/status/2025898614631915708
无论喜不喜欢这个未来,大概最后都得接受吧。
LLaMA、Mistral、Qwen这些大语言模型动辄数十亿参数,在自定义数据上全量微调代价极高:65B 模型光是 float16 就要消耗掉约 130GB 显存,顶配硬件跑个几天几周很正常而多数下游任务根本用不到那么多参数。 于是研究者们开始思考:能不能只调一小部分参数,效果还不差?答案是可以。这类方法统称为参数高效微调(PEFT)。LoRA、QLoRA、DoRA 各自从不同角度切入这个问题。 论文:LoRA: Low-Rank Adaptation of Large Language Models, Hu et al. (ICLR 2022) LoRA 的做法很简单,冻结原始权重矩阵 W在旁边挂两个小的可训练矩阵 A 和 B。前向传播时的计算表达式为: 训练过程中只更新 A 和 B,W 保持不动。这里的秩 r 是分解的瓶颈维度常见取值 4、8 或 16。alpha 是缩放因子控制 LoRA 更新的强度。 参数量的减少非常明显以一个 (4096, 4096) 的权重矩阵为例,原始参数量是 1670 万换成 rank=8 的 LoRA 之后,A 的维度 (8, 4096) 有 32,768 个参数,B 的维度 (4096, 8) 同样 32,768 个,加起来总共 65,536——比原来少了 99.6%。 LoRA 论文中一个关键发现是,微调过程中大部分有意义的权重更新本来就集中在低维子空间里,所以把更新约束在低秩矩阵上并不会造成多大损失。 微软官方仓库中 Linear 层的实现: 实际用于替换注意力投影的写法: 论文在 GPT-2(自然语言生成)和 RoBERTa/DeBERTa(GLUE 基准)上做了评测。下面是 GPT-2 在 E2E NLG Challenge 上的成绩,LoRA 与全量微调及其他 PEFT 方法的对比: LoRA 不只是持平全量微调而是在训练不到 1% 参数的情况下反超了。论文把原因归结于正则化效应:低秩约束本身起到了防止过拟合的作用。 秩 r 定义瓶颈维度,4 到 16 的范围能覆盖绝大多数场景,r 越大容量越高、参数也越多。Alpha(lora_alpha)是缩放因子,LoRA 更新的有效学习率等于 alpha/r一般设 alpha=2r 是不错的起点。Target Modules 决定 LoRA 挂载到哪些层,注意力中的 和 是最常见的选择。 论文:QLoRA: Efficient Finetuning of Quantized LLMs, Dettmers et al. (NeurIPS 2023) LoRA 虽然减少了可训练参数,但基础模型还是得完整加载。65B 模型 float16 要 130GB 显存通常得上多块 A100,大部分研究者手里没这个条件。 QLoRA 先把基础模型量化成 4 位再在上面以 16 位跑 LoRA 适配器。 QLoRA 论文同时引入了三项相互配合的技术。 第一项是 NF4(4-bit NormalFloat)一种专门针对正态分布权重设计的 4 位数据类型。神经网络权重天然服从正态分布NF4 从信息论角度是最优的编码方式,存储效率上比 INT4 和 FP4 都要高出一截。 第二项是双重量化,量化常数(把 4 位值转换回浮点时用的常数)本身也占内存,QLoRA 干脆把量化常数也给量化了,65B 模型上约省 3GB 内存。 第三项针对梯度检查点带来的内存峰值,QLoRA 利用 NVIDIA 统一内存机制,当某条序列在 GPU 上触发 OOM 风险时,自动把优化器状态卸载到 CPU RAM等需要时再换回来。 整个过程中基础模型权重始终保持 NF4(4 位、冻结状态)只有 LoRA 适配器权重以 bf16 精度参与训练。 QLoRA 训练出了 Guanaco 系列模型。在 GPT-4 评估的 Vicuna 基准测试中,Guanaco 65B 用单块 48GB GPU 训练了 24 小时,就达到了 ChatGPT 性能的 99.3%。 更关键的一点是4 位量化相比 16 位 LoRA 几乎没有性能损失: 7B Guanaco 模型只占 5GB 显存在 Vicuna 基准上却以超过 20 个百分点的差距碾压了 Alpaca 65B。这才是 QLoRA 真正革命性的地方:拿一块普通 GPU 就能微调大规模语言模型门槛一下子降到了底。 论文:DoRA: Weight-Decomposed Low-Rank Adaptation, Liu et al. (ICML 2024, Oral) LoRA 表现不错但和全量微调之间始终有一道精度差距,当秩取值较低时这个差距尤为明显——LoRA 没法完整复现全参数更新时的梯度学习行为。 问题出在哪?DoRA 论文提出了一种权重分解分析来回答这个问题。 任何权重矩阵 W 都可以拆成两个分量: 其中 m 是幅度分量,这个标量向量反映每个输出神经元权重的"大小";V / ||V||_c 是方向分量,即权重的单位方向向量。 DoRA 论文发现,全量微调时幅度和方向是以灵活、耦合的方式同步更新的。但 LoRA 的更新方式把两者绑在一起,主要只改变了方向上的朝向反而限制了模型的学习能力。 DoRA 的做法是把两者拆开:冻结分解结构后,只让 LoRA 作用于方向分量,同时把幅度 m 当作独立的可学习标量自由更新。 这样一来 LoRA 的学习模式就更接近全量微调了。并且由于幅度和方向在部署前可以合并回单个权重矩阵,推理阶段零额外开销。 DoRA 的前向传播逻辑,简化后展示核心分解机制: 通过 HuggingFace PEFT 启用 DoRA(peft>=0.9.0 已支持 ): 就一个标志位这是和 LoRA 配置的唯一区别。 DoRA 论文在 8 个常识推理数据集(BoolQ、PIQA、HellaSwag、WinoGrande、ARC-e、ARC-c、OBQA 及综合平均)上做了评测,在 LLaMA-7B 和 LLaMA2-7B 两个模型上与 LoRA 对比,秩相同、可训练参数量相同,确保公平: 8 个数据集上 DoRA 全面胜出。差距在复杂推理任务上尤其明显比如 ARC-c 从 LoRA 的 59.8 跳到 65.8,幅度相当大。论文还跑了 LLaVA-1.5-7B 的视觉指令调优和 VL-BART 的图像/视频-文本理解实验,DoRA 同样全面压过 LoRA。 DoRA 因为多了一个幅度向量(每个目标层的每个输出神经元一个标量),会有少量额外开销但实际可以忽略。 该用 LoRA 的场景 显存 16GB 以上,模型不超过 13B 左右想要一个稳定可靠、经过实战验证的方案。所有后续方法都建立在 LoRA 之上,HuggingFace 的 PEFT 生态围绕它搭建,工具链最成熟。没做过 PEFT 的人从这里入手最省心。 该用 QLoRA 的场景 显存小但又想跑 30B 以上的大模型。QLoRA 让单块 48GB GPU 微调 LLaMA-65B 成为现实,24GB 显存就能跑 LLaMA-33B。用免费 Colab T4(15GB 显存)想动 20B+ 模型的话,QLoRA 基本是唯一可行方案。 该用 DoRA 的场景 在跟 LoRA 一样的参数预算下追求最高精度,DoRA 是 LoRA 的即插即用替代品配置里加个 就行推理零成本,并且在复杂推理任务上提升尤为突出。 该用 QLoRA + DoRA(QDoRA)的场景 既要省显存又要高精度这种组合已获官方支持,实验数据证明效果优于单纯的 QLoRA。部分早期实验甚至表明 QDoRA 能持平乃至超过全量微调。 2025 年的微调生态分三层:LoRA 是底座,简单、快、生态好,多数场景够用;QLoRA 打开了消费级显卡微调大模型的大门精度还没怎么掉;DoRA 则是免费升级——跟 LoRA 成本一样但结果更好, 一行代码就能搞定。 三种方法各有分工,互为补充,你唯一需要考虑的是哪种 PEFT 方案最贴合自己的硬件条件和精度要求。 https://avoid.overfit.cn/post/154732e0b0474f2ea8e2a4dac0d16819 by Harish K
LoRA——低秩自适应
核心思想
output = W·x + (B·A)·x × (alpha/r) # Source: github.com/microsoft/LoRA — loralib/layers.py
class Linear(nn.Linear, LoRALayer):
def __init__(
self,
in_features: int,
out_features: int,
r: int = 0,
lora_alpha: int = 1,
lora_dropout: float = 0.,
merge_weights: bool = True,
**kwargs
):
nn.Linear.__init__(self, in_features, out_features, **kwargs)
LoRALayer.__init__(self, r=r, lora_alpha=lora_alpha,
lora_dropout=lora_dropout,
merge_weights=merge_weights)
if r > 0:
self.lora_A = nn.Parameter(
self.weight.new_zeros((r, in_features))
)
self.lora_B = nn.Parameter(
self.weight.new_zeros((out_features, r))
)
self.scaling = self.lora_alpha / self.r
# Freeze the pretrained weights
self.weight.requires_grad = False
def forward(self, x: torch.Tensor):
if self.r > 0 and not self.merged:
# Original frozen weights + low-rank update
result = F.linear(x, self.weight, bias=self.bias)
result += (
self.lora_dropout(x)
@ self.lora_A.transpose(0, 1)
@ self.lora_B.transpose(0, 1)
) * self.scaling
return result
else:
return F.linear(x, self.weight, bias=self.bias) # Source: github.com/microsoft/LoRA — README [1]
import loralib as lora
# Before: standard attention projection
# qkv_proj = nn.Linear(d_model, 3*d_model)
# After: apply LoRA to Q and V, freeze K
qkv_proj = lora.MergedLinear(
d_model, 3*d_model,
r=8,
enable_lora=[True, False, True] # Q=LoRA, K=frozen, V=LoRA
)
# Mark only LoRA parameters as trainable
lora.mark_only_lora_as_trainable(model)基准测试结果(来自 LoRA 论文 )
| Method | Trainable Params | BLEU | NIST | MET | ROUGE-L | CIDEr |
|-------------------|-----------------|------|------|------|----------|-------|
| Full Fine-Tuning | 117M | 68.2 | 8.62 | 46.2 | 71.0 | 2.47 |
| Adapter (Houlsby) | 1.0M | 66.3 | 8.41 | 45.0 | 69.8 | 2.40 |
| Prefix Tuning | 0.35M | 68.1 | 8.59 | 46.3 | 70.8 | 2.47 |
| LoRA (r=4) | 0.77M | 70.4 | 8.85 | 46.8 | 71.8 | 2.53 |关键超参数
q_projv_projQLoRA——量化 LoRA
LoRA 没彻底解决的问题
三大技术创新(来自 QLoRA 论文 )
代码(来自 artidoro/qlora)
# Source: github.com/artidoro/qlora — qlora.py [2]
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
import torch
# Step 1: Define 4-bit quantization config (NF4)
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4", # NormalFloat4
bnb_4bit_compute_dtype=torch.bfloat16, # Compute in bf16
bnb_4bit_use_double_quant=True, # Double quantization
)
# Step 2: Load base model in 4-bit
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-2-7b-hf",
quantization_config=bnb_config,
device_map="auto",
)
# Step 3: Prepare for k-bit training (handles frozen layer casting)
model = prepare_model_for_kbit_training(model)
# Step 4: Apply LoRA adapters in 16-bit on top
lora_config = LoraConfig(
r=64,
lora_alpha=16,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM",
)
model = get_peft_model(model, lora_config)基准测试结果(来自 QLoRA 论文 )
| Method | Model | Memory Usage | Vicuna Score vs ChatGPT |
|----------------------|-------|--------------|--------------------------|
| Full Fine-Tuning (fp16) | 65B | >780 GB | — |
| LoRA (fp16) | 65B | ~130 GB | — |
| QLoRA (NF4) | 65B | ~48 GB | 99.3% |
| QLoRA (NF4) | 33B | ~24 GB | 97.8% |
| QLoRA (NF4) | 7B | ~5 GB | ~87% |DoRA——权重分解低秩自适应
核心洞察
W = m × (V / ||V||_c) W' = (m + Δm) × ((V + ΔV_LoRA) / ||V + ΔV_LoRA||_c)代码(来自 NVlabs/DoRA )
# Source: github.com/NVlabs/DoRA — adapted from DoRA paper implementation [3]
import torch
import torch.nn as nn
import torch.nn.functional as F
class DoRALayer(nn.Module):
def __init__(self, d_in, d_out, rank, lora_alpha):
super().__init__()
# Frozen pretrained weight
self.weight = nn.Parameter(
torch.randn(d_out, d_in), requires_grad=False
)
# Learnable magnitude (one scalar per output neuron)
self.m = nn.Parameter(
self.weight.norm(p=2, dim=1, keepdim=True)
)
# LoRA matrices for directional updates (trainable)
std = 1 / torch.sqrt(torch.tensor(rank).float())
self.lora_A = nn.Parameter(torch.randn(d_in, rank) * std)
self.lora_B = nn.Parameter(torch.zeros(rank, d_out))
self.rank = rank
self.scaling = lora_alpha / rank
def forward(self, x):
# Compute the directional update from LoRA
lora_update = (self.lora_A @ self.lora_B).T * self.scaling
# Adapted weight = base weight + LoRA update
adapted = self.weight + lora_update
# Column-wise normalization → unit direction vectors
column_norms = adapted.norm(p=2, dim=1, keepdim=True)
V_normalized = adapted / column_norms
# Scale by learned magnitude
effective_weight = self.m * V_normalized
return F.linear(x, effective_weight)# Source: HuggingFace PEFT documentation — DoRA is supported from peft>=0.9.0 [3]
from peft import LoraConfig, get_peft_model
lora_config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM",
use_dora=True, # ← This single flag enables DoRA
)
model = get_peft_model(model, lora_config)基准测试结果(来自 DoRA 论文 [3])
| Method | BoolQ | PIQA | HellaSwag | WinoGrande | ARC-e | ARC-c | OBQA | Avg |
|--------------|-------|------|-----------|------------|-------|-------|------|-------|
| Full FT | 69.4 | 82.3 | 89.7 | 82.4 | 79.8 | 60.7 | 81.6 | 77.99 |
| LoRA (r=32) | 68.9 | 80.9 | 90.0 | 82.1 | 78.2 | 59.8 | 80.0 | 77.13 |
| DoRA (r=32) | 70.0 | 83.6 | 91.0 | 83.0 | 81.4 | 65.8 | 83.4 | 79.75 |对比
内存需求
| Method | LLaMA 7B | LLaMA 13B | LLaMA 33B | LLaMA 65B |
|-------------------------|----------|-----------|-----------|-----------|
| Full Fine-Tuning (fp16) | ~28 GB | ~52 GB | ~130 GB | ~260 GB |
| LoRA (fp16) | ~14 GB | ~26 GB | ~65 GB | ~130 GB |
| QLoRA (NF4) | ~5 GB | ~8 GB | ~20 GB | ~48 GB |
| DoRA (fp16) | ~14 GB | ~26 GB | ~65 GB | ~130 GB |与全量微调的性能对比
| Method | Commonsense Reasoning | Instruction Tuning | Memory |
|-------------------|-----------------------|------------------------|------------|
| Full Fine-Tuning | Baseline | Baseline | Very High |
| LoRA | -0.86 avg | Comparable | Medium |
| QLoRA | ~Same as LoRA | 99.3% of ChatGPT | Low |
| DoRA | +2.62 avg over LoRA | Better than LoRA | Medium |训练速度(相对值)
| Method | Speed |
|--------|------------------------------------------|
| LoRA | Fast |
| DoRA | Fast (near identical to LoRA) |
| QLoRA | Moderate (quantize/dequantize overhead) |各场景下的最佳选择
use_dora=True总结
use_dora=True
在日常的软件开发与技术深耕中,大语言模型(LLM)已经从单纯的“智能问答”演变成了不可或缺的生产力引擎。2026 年的今天,超过半数的代码由 AI 辅助生成已成为常态。然而,面对同样的工具,不同开发者的产出效率却有着天壤之别。 如何真正将 AI 深度融入工程工作流,而不是停留在简单的“尝鲜”阶段?以下总结了 8 个极具实操价值的 AI 使用技巧,覆盖了从底层认知、代码工程到架构自动化的全链路,旨在帮助开发者打破效率瓶颈。 免费与付费模型之间,存在着维度的代差。在处理复杂的逻辑推理、长上下文理解或底层架构设计时,前沿的高阶模型(如具备深度思考和长文本处理能力的模型)往往能一次给出结构清晰、Bug 极少的答案。相反,能力较弱的模型产生的“看似正确实则漏洞百出”的代码,会大幅增加 Debug 的时间。将订阅优质工具视为对“研发效率”的投资,其节省的时间和排错精力,回报率通常远超预期。 许多人在尝试将完整需求交给 AI 时,一旦发现输出结果无法运行,就会得出“AI 不好用,还不如自己写”的结论,从而将其束之高阁。事实上,大模型是严格遵循“输入决定输出(Garbage in, garbage out)”法则的概率机器。结果不理想,往往是因为隐性上下文(如框架版本、本地表结构)没有交代清楚。遇到报错时不要急于放弃,补充约束条件、重新调整提示词,是与 AI “对齐”的必经之路。 AI 领域的迭代速度极快。新的长上下文技术、更强大的代码专属模型或是新的 Agent(智能体)交互范式随时都在涌现。保持开放的心态,当有显著提升的新模型或新工具发布时,第一时间将其纳入本地的开发测试流。在技术大爆炸的时代,固守旧版本的工具往往意味着被生产力曲线抛弃。 AI 极大地降低了代码生成的成本。几秒钟内生成几百行代码已成为常态,但这并不意味着软件工程的门槛降低了。相反,它要求开发者将核心精力从“敲击键盘编写代码”转移到系统设计、代码审查(Code Review)和质量验收上。验证 AI 代码的健壮性、安全性和极端边界处理能力,正成为现代开发者最重要的核心竞争力。 在修改 AI 生成的错误代码时,一个常见的陷阱是:在同一个对话框里不断让 AI “修复这个 bug”、“再改一下那里”。这会导致对话历史中堆积大量废弃的代码和无效补丁,造成严重的“上下文污染”,让模型越改越错。 提示词(Prompt)就是人类与 AI 沟通的“编程语言”。学会使用结构化的模板,明确设定角色(Role)、背景(Context)、任务(Task)、约束条件(Constraints)和输出格式(Format)。建立属于自己的“代码切片与风格提示词库”(Few-Shot Prompting),在遇到同类问题时直接带入团队现有的代码规范让 AI 参考,能极大提升输出的可用性。 不要总是指望 AI 通过一个干瘪的指令就直接给出完美的最终方案。更高阶的做法是“反客为主”——在提示词中告诉 AI:“在给出方案之前,请先向我连续提出 5 个问题,以收集我具体的业务背景、系统环境和性能约束”。通过这种分阶段的问答交互建立高精度的上下文框架,随后生成的定制化代码质量将产生质的飞跃。 如果每天的输入逻辑和输出目标是高度结构化、标准化的(例如:写博客时需要固定把 Markdown 正文丢给 AI,让它生成图片风格提示词以及每个插图内容提示词,然后再根据风格提示词和插图内容生成图片,最后copy图片),利用现有的工作流编排工具或智能体平台,将固定的提示词和调用逻辑封装成专属的 Tool 或 Pipeline。直接输入原始内容(博客内容),一键输出最终结果(所有插图),完成从“手工对话”到“自动化计算引擎”的思维跃迁。 结语 本文由mdnice多平台发布一、 认知与工具篇

1. 拥抱优质模型:在能力范围内为效率投资
2. 重塑交互耐心:把“不符合预期”视为优化的契机
3. 保持技术敏锐度:紧跟新模型与新范式
二、 编码与工程篇

4. 转移核心精力:从“编写者”转型为“审查与验收者”
5. 避免上下文污染:生成优于修改,果断 Reset
核心实操:AI 生成代码的能力远大于在烂代码上修补的能力。如果生成的代码需要大量修改,最好的策略是果断 Reset(清空当前对话),带上优化后的提示词和干净的上下文重新生成。三、 进阶提示词与自动化篇

6. 精炼输入质量:系统学习并制作高级提示词
7. 翻转沟通角色:采用“教练模式”与分阶段交互
8. 工作流自动化:将高频的标准作业沉淀为 Tool
工具的上限,取决于使用者的思维边界。把 AI 当作一个拥有无限算力但缺乏特定业务背景的“超级实习生”,给足上下文、拆解好任务、把控好验收环节。习惯并精通这些技巧,AI 必将成为职业生涯中最强大的杠杆。
大家好,近期开源了一个专为 Cloudflare 生态设计的个人博客系统:Flare Stack Blog 。
这个项目最大的特点是完全抛弃了传统 VPS 。你不需要购买和维护任何服务器,只要在 Cloudflare 上托管一个域名,利用其免费额度即可实现完整的边缘节点全栈部署,零运行成本(仅需支付域名费)。
这套系统深度集成了 CF Serverless 服务,非常适合想极低成本建站,或者想完整实践 Cloudflare 全家桶开发工作流的开发者。
界面预览
首页效果:

多主题切换( Fuwari 主题示例):

管理后台:

项目地址
核心功能
技术与功能细节
整个项目跑在 Cloudflare Workers 上,把 CF Serverless 服务基本用了个遍:D1 ( SQLite 主库)、R2 (媒体存储)、KV (缓存层)、Durable Objects (分布式限流 + 密码哈希重度计算)、Queues (邮件发送异步队列)、Workflows (评论审核、定时发布、导入导出等异步任务)、Workers AI ( AI 功能)。
前后端同构,前端 React 19 + TailwindCSS 4 ,路由和数据管理用 TanStack Router/Query ,后端 SSR 和 Server Functions 由 TanStack Start 承接。最外层网关是 Hono ,处理路由拦截、CDN 缓存控制和鉴权( Better Auth 实现 GitHub OAuth )。ORM 选了 Drizzle 配合 drizzle-zod ,端到端类型安全。
功能层面,多层缓存( CDN → KV → D1 )、边缘端 Orama 全文搜索、R2 图片直传都已实现。主题系统基于 TypeScript 接口定义"主题契约",业务层与表现层彻底解耦,换主题不需要动任何接口和数据层代码,支持脚手架快速创建新主题
先说结论:2026 年了,AI 视频生成依然没有"一个模型打天下"的局面,但格局正在剧变. 所以我从捡钱的套壳转变开始做艰难的品牌站:veemo.ai 。以下是整个心路路程的历程的真实分享:
尤其是上个月 ByteDance 发布 Seedance 2.0 之后,整个行业的天花板被狠狠拉高了一截。今天来跟 V 友们聊聊我花了大半年、烧了不少钱实测出来的发现,以及基于这些发现做了什么。
起因
我是一个独立开发者,去年开始重度使用 AI 视频生成工具,熟悉我的朋友应该知道,我也做了好几个套壳站比如 saro2.ai 、seedancev2.ai 、nan0banana.ai 。在这半年做套壳的接客诉发现一个很蛋疼的问题:
同一个 prompt ,不同模型出来的东西差异巨大,而且各有各的强项。
举几个真实场景:
重点聊聊:Seedance 2.0 到底有多炸裂
2 月 12 号 ByteDance 发了 Seedance 2.0 ,72 小时内微博话题阅读量破千万,马斯克都发了三个字:"It's happening fast." 有人拿它跟年初 DeepSeek 的冲击波相提并论,我觉得不夸张。
用了两周,说几个让我真正震撼的点:
四模态输入,真正的"导演级控制"
这是 Seedance 2.0 最核心的突破。它不像其他模型只接受文字 prompt ,它能同时接收文本、图片(最多 9 张)、视频(最多 3 段)、音频(最多 3 段)作为输入。
什么意思?你可以给它一张人脸照片、一段舞蹈视频、一段背景音乐,然后用自然语言告诉它:"用这个人的脸,模仿这段舞蹈的动作,节奏跟着这段音乐走"——它真的能理解并融合成一个连贯的视频。
这种"参考 + 指令"的工作方式,目前没有任何其他模型能做到。Sora 2 有 Cameo 功能可以把你的脸放进视频,但跟 Seedance 2.0 的多模态参考系统比,控制精度完全不在一个量级。
角色一致性终于不是玄学了
做过 AI 视频的都知道,"角色一致性"是行业性难题——同一个角色跨镜头时脸会变、衣服会换、整个人可能直接变成另一个人。
Seedance 2.0 在这块进步巨大。面部特征、服装细节、甚至画面中的文字和 Logo ,跨镜头都能保持高度一致。做多镜头叙事短片终于不用祈祷了。
原生音视频同步
这个是真正的降维打击。Seedance 2.0 不是生成完视频再配音,而是音频和视频在同一个模型架构里同步生成。脚步声、环境音、对话口型,全部在生成阶段就对齐了。还支持多语言口型同步。
大多数模型生成完视频还要你自己去配音配乐,Seedance 2.0 直接帮你出成片。
分辨率直接拉到 2K
原生支持 2K 输出,Sora 2 目前最高 1080p 。对于需要大屏展示或者后期裁剪的场景,这个差距很实际。
其他选手也不能忽视
所以我做了什么
基于这个判断,我做了一个产品:Veemo.ai
思路很直接——既然没有最好的模型,那就让用户一次输入,多模型并行生成,自己挑最好的结果。
具体来说:
一些技术上的取舍(开发者视角)
做这个平台踩了不少坑,简单分享几个:
来求 roast
产品上线不久,功能还在快速迭代。
回帖交流的 V 友,我会认真看每一条回复。
有价值的反馈我会直接加到迭代计划里,也会在帖子里同步后续更新进展。
另外回帖的朋友私信我,送体验额度,感谢各位花时间看完 🙏
首先我虽然学的计算机,但是已经超过 10 年没有接触过任何代码了
自我认知水平应该是文科高中生吧
对于这样的情况,如何利用 AI 开始写出一个自己的程序呢?
比如写一个简单的 web 游戏?
需要安装什么软件?去配置怎样的 AI 接口?
应该不是使用 web 的各种 chat 聊天写代码吧
麦琪的礼物:指欧·亨利的短篇小说《麦琪的礼物》中,夫妻双方互相牺牲珍贵之物为对方买礼物的故事。
个人无法认同这种表达爱的行为,觉得是 BE. 本来就很穷,德拉卖掉长发,买了表链——但吉姆卖掉了怀表;吉姆卖掉怀表,买了发梳——但德拉剪掉了长发。两份礼物都失去了用途。
联想到现实生活,亲密关系之间,为了表达心意,要费心思准备对方可能用不到的节日礼物,给本来就累的生活加 buff ,形成负和游戏