自己开发了一个 openwrt IOS 端客户端。
自己开发了一个 openwrt IOS 端客户端
已经上架了 APP store,直接搜索 wrthub 即可。
支持各种信息查看、WIFI 管理、连接设备管理、openclash 等各类插件管理,欢迎下载。




xiaohack博客专注前沿科技动态与实用技术干货分享,涵盖 AI 代理、大模型应用、编程工具、文档解析、SEO 实战、自动化部署等内容,提供开源项目教程、科技资讯日报、工具使用指南,助力开发者、AI 爱好者获取前沿技术与实战经验。
自己开发了一个 openwrt IOS 端客户端
已经上架了 APP store,直接搜索 wrthub 即可。
支持各种信息查看、WIFI 管理、连接设备管理、openclash 等各类插件管理,欢迎下载。




Python 的内置函数 无参数调用: 数字转换:将整数或其他数字类型转换为浮点数 字符串转换:将符合浮点数格式的字符串转换为浮点数 无效输入处理: 精度问题: 用户输入处理: 科学计算: 数据清洗:float() 用于将数字或字符串转换为浮点数(即带有小数部分的数字)。该函数是 Python 标准库中的基础类型转换函数之一,常用于数据处理、数学运算和类型转换等场景。基本用法
float() 不传入参数时返回 0.0x = float() # 返回 0.0float(3) # 返回 3.0
float(True) # 返回 1.0 (True 被转换为 1)float("3.14") # 返回 3.14
float("-2.5e3") # 返回 -2500.0 (科学计数法)注意事项
float("abc") # 引发 ValueError
float(None) # 引发 TypeError
浮点数在计算机中使用二进制表示,可能导致精度问题0.1 + 0.2 # 返回 0.30000000000000004应用场景
user_input = input("请输入数字:")
try:
num = float(user_input)
except ValueError:
print("输入的不是有效数字")import math
radius = float(input("输入半径:"))
area = math.pi * radius ** 2data = ["1.5", "2", "3.14", "invalid"]
cleaned = [float(x) for x in data if x.replace('.', '').isdigit()]float() 函数是 Python 数值处理的基础工具,使用时需要注意其转换规则和潜在的限制,特别是在处理用户输入或需要高精度计算的场景中。
最近一年我在 Google/Anthropic/OpenAI 三家烧了超过 1 万美金的 token 账单。所以本文内容基于 opus4.6 、codex-5.3-xhigh 、gemini3-pro 等最强模型不限量使用所表现出来的编码能力进行评价。
就好像保健品销售拿着他的《大数据量子 AI 生物磁场治疗仪》,忽悠我说这台原价 20 万、现在活动价 8 万 8 的仪器,可以彻底根治我的颈椎病腰椎病高血压糖尿病,还能逆转我的动脉血管粥样硬化、冠心病、阳痿早泄等等
Agent 编程现在就是这么个状态。
Agent 给我一堆 emoji 庆祝刚才生成的七八万行屎山通过了全部测试用例,告诉我可以替换生产环境了。你信吗?
假设你是一位项目 leader ,你最靠谱的组员同事,交给他的开发任务 80% 可以在预期时间内高质量交付。这位同事拿头给你保证下周就可以上线,那么你大概率能信任他最迟下下周也搞定了。但是 agent 给你保证现在质量和完成度可以上线生产了,你信吗?
此时此刻,无数知识星球、自媒体、AI 导师教父们正在到处收割韭菜的学费。大意基本上都是教你如何 prompt ( tool/skill 换汤不换药),然后让你多开 agent 并行干活。
Agent 的盲目自信不仅会误导使用者,也会误导 agent 自己。
我曾给 agent 这个任务:为当前 Kotlin 项目集成 GCP Transcoding 服务。我给了 agent 该产品的页面和文档作为参考,让它开始 plan 。Agent 做出了如下计划:
你发现这份计划中存在的问题了吗?
事实上,如果你曾经「古法手工编程」做过此类工作,你会发现手动实现 RESTful 远没有想象中那么简单。哪怕仅实现 Transcoding 服务的基础能力,也涉及到 5-10 个 endpoint 调用。每个 endpoint 的输入输出参数又有几十甚至上百个字段嵌套定义,agent 在应对这类长上下文任务时会频繁犯错。
而如果 agent 选择对 Java SDK ( Google 也是从 protobuf 生成出来的)进行简单包装隔离,大概半天到一天就可以让这个功能稳定上线。
若是让 agent 按照 RESTful 文档手动实现,agent 可能会陷入 debug 泥潭——因为当 AI 幻觉导致写错了可选字段的字段名(大小写、驼峰、下划线),程序不会立即报错。你需要多久才能发现它实现错了?等上线生产后客户投诉吗?
为什么我们无法信任 agent ? 经过一年的实践,我认为问题的根源在于:我们缺乏有效的验证手段。
常见观点:某种意义上来说 AI 并没有取代程序员,只不过是一个新的高级工具罢了。你作为生产代码的人,还是得弄明白要干啥,合入的代码就得弄明白。
但我认为,这个在实际项目里很难做到。
像我们之前内部 review 的时候,大部分时候 review 的是 code style ,作者讲一下设计思路,我们也就是大概一听就过了。以前这套方法是有效的:
但是这个相关性在 agent 编码时代不存在,甚至相反。
Agent 一分钟就能生成出来注释齐全、风格优秀的——屎山代码。反正我肉眼看过去的时候,经常会被这第一层假象蒙蔽,放松警惕。主要是这个屎山有点难在 review 阶段发现,经常是上线后出了问题,回头细查的时候才发现是「巧克力味的屎」。
你信我,opus 、codex-xhigh 这些你们舍不得用的模型,我开 thinking+max 模式站起来蹬,一样有这个问题。
更不用说测试了。现在的 test cases 也是 AI vibe 出来的,agent 又当裁判又当运动员,它说什么就是什么。蒙我坑我也不是一次两次了。写了几千行 getter/setter 的 test case ,最后测试全绿告诉我可以上生产环境发布了。
就像前面 GCP Transcoding 的例子,agent 写错了可选字段的字段名,测试照样能过,因为测试也是它自己写的,错的一致就是「对」的。
说到这里,有人可能会问:其他行业被机械、智能赋能后,难道就没有这个问题吗?
让我用 CNC 机床打个比方:
CNC 机床精度比我高,但机床产出工件后,我们可以对工件进行客观的物理测量——用卡尺量一下,公差是不是在 ±0.01mm 以内,一目了然。即便我没有手搓出这个精度的能力,但我依然有评价 CNC 机床和工件质量的能力。
这就是传统制造业被机械赋能后的状态:机器精度高,质量统一且稳定,而人依然能评价机器的产出。
那么软件开发行业被 Agent 变革后,理想状态应该是什么样的? Agent 交付的代码确实覆盖了需求,具备基本的安全防护,且更容易长期维护(哪怕仅考虑 agent 自己维护,不考虑对人类的可读性),性能更高,资源占用更少。
但程序不仅需要完成眼下需求文档中的功能,还需要考虑到基本的安全防护。一个功能完成但安全漏洞百出的项目代码,同样是不合格的。
而目前我们还无法评价 agent 是否达到了这个状态。单就「功能实现」这一基础要求,agent 还不能脱离人的引导和测试验证——更别提安全性、可维护性、性能这些更高阶的指标了。
而且程序不是物理工件,不能用物理手段去测量。你没法拿卡尺量一下这段代码的「质量公差」是多少。
所以没法用衡量物理工件的标准去衡量程序,反而应该像衡量 CNC 机床本身一样——而一次生产( all tests passed )远不能衡量机床质量,更不能衡量程序质量。
CNC 机床加工塑料、铝合金小件精度高,不代表加工钛合金、不锈钢精度也能达标。后者更考验整体刚性,以及工件质量大了以后热胀冷缩对程序进刀补偿的要求。
同理,vibe coding 出来的代码,本地点两下鼠标测试通过了,上线也是极大概率会直接炸掉。
传统行业:机器精度高、质量稳定,人能评价。软件行业:Agent 产出快、覆盖广,但人还没法可靠地评价。这就是问题所在。
既然人工评价( Code Review )和自动测试都靠不住,我们需要另一种评价手段——一种不依赖 agent 自己判断的、客观可验证的评价手段。
我的观点和主流 AI 编码观点相反:
Agent 编程时代,更需要强类型,更需要严格可验证的语言,而不是放任 agent 去写 python/js/go ,还有 anyscript 。
为什么?
AI 堆屎山这么快,别说生成个几万行了,就是生成超过 100 行我都已经懒得逐行去细读了。但是读类型签名、pre/post-condition 明显要快于通读逻辑代码。而这些东西只有 Rust/Scala/Haskell 甚至 formal method 能提供。
我在 agent 编码前就一直用这种风格写自己的代码,主要是代码量大了以后,编译器检查比我肉眼检查更靠谱。现在 agent 编码流行起来了,我发现让 agent 遵循我的这个要求,更能控制产出代码质量——当然也只能说一定程度上,起码比什么都不做好。
回到 GCP Transcoding 的例子:如果 agent 用的是强类型语言,字段名写错了至少还能在编译期被类型系统拦住一部分。但 RESTful + 弱类型的组合,错了就是悄无声息地错,等你发现的时候已经晚了。
y1s1 ,该夸的还是要夸。现在的最新最强模型,过编译问题不大了,除非你比我还执着于类型体操。
放手让 agent 做工程还是拉垮的一批,但过编译已经问题不大了。Pure-FP Scala 、tagless final ,opus 4.5 和 codex-xhigh 遵循得挺不错了,过编译也是自动的。函数式类型体操的编译错误基本上都是几十上百行的类型天书,agent 读懂并修复这些编译错误,在我写这篇文章时已经不再是困难。
当然,这个方案也有局限。
实际上现在的 formal method 工具链和生态还是很贫瘠,基本上只支持一门语言很有限很小的一个子集。有些工程上常用的语法/模式在 FM 那边都是 unsound ,或者尚未证明。更不用说动不动就陷入死循环/无解证明了——稍不注意,z3 求解器要在比宇宙空间还大的可能性里搜索,到宇宙毁灭那一天都证明不出来。
强类型能解决一部分问题,但不是全部。
即使有了强类型作为评价手段,还有一个更深层的问题:agent 对计划的理解和执行。
GCP Transcoding 的例子其实已经暴露了这个问题:agent 选择手动实现 RESTful 而不是包装 Java SDK ,这不是代码写错了,而是路线选错了。编译器能告诉你代码有没有语法错误,但没法告诉你该不该走这条路。
再举个更极端的例子:给 agent 一个复杂任务,研制一款火箭发动机。Plan 决定了做全流量分级燃烧循环,路线选择了共轴方案。
Agent 不遵循的话: 可能就偏离到抽气循环也说不定。编译器能告诉你代码有没有语法错误,但没法告诉你这是不是你要的火箭发动机。
Agent 遵循太好: 真的做出来共轴方案,那可能上线后会碰到更大的问题——共轴以后动密封系统做不好,氧化剂和燃料随着涡轮轴互相泄漏,俩预燃室要炸一个。编译器能保证类型正确,但没法保证设计合理。
现在的 plan/edit mode 切换也只是现阶段的权宜之计、无奈之举。这个问题比「评价手段缺失」更难解决,因为它涉及到对需求和设计的理解,而不仅仅是代码质量。
Agent 编程有一个显著的特点:初见即巅峰。
让 agent 开始一个全新的 CRUD 项目,或者一个 React 管理系统页面,agent 第一次的表现着实让所有人都大吃一惊——干净利落,结构清晰,甚至还贴心地加上了注释和错误处理。
但随着项目维护越来越久,那些「不可明说的」、没有被文档记录的、约定俗成的隐藏上下文越来越长。哪个字段其实已经废弃了但没删、哪个 API 有个历史遗留的 quirk 、哪个模块之间有个微妙的依赖关系——这些东西,老员工心里都有数,但从来没人写下来。
而 agent 无法处理无限长的上下文,只能通过压缩、总结来选择性遗忘细节。可能被丢弃的是几次失败尝试的经验,也可能被丢弃的是关键数据结构的偏移量、寄存器地址、枚举定义。
每次新开一个 session 的时候,开发者不得不面对一个几乎全新的「员工」——它似乎继承了压缩后的上下文( claude.md / agents.md ),但细节完全不知。你得重新跟它解释一遍:「不是,这个接口虽然文档上写的是这样,但实际上我们从来不传这个参数……」
对于 CRUD 、Spring 、React 这类重复度高的任务,这似乎不是什么痛点——反正每次都差不多,忘了就忘了。
但对于嵌入式系统开发,任何被遗忘的细节都可能被 agent 天马行空的幻觉填充。寄存器地址错了?中断优先级配错了? DMA 通道冲突了?轻则系统崩溃,重则永久烧坏硬件。这不是「改个 bug 重新部署」能解决的问题。
既然评价 agent 产出是核心问题,那开发者的基础知识就必然还是要学的。不然你拿什么去评价 agent 生成的代码、模块、架构设计质量到底如何?没有评价能力的开发者,和保健品店里待宰的老头老太没有区别。
那么该如何学习呢?
打开 LeetCode ,题目还没读完呢,Copilot 已经把答案补全出来了。点一下 Submit & Run ,前 1%。就这?
我的意见是:既然有 AI 了,当然不能局限于过去的难度,得上强度,上到 AI 做不出来的程度。
放心,该学的不会落下。上了强度以后 AI 幻觉越来越多,该补的课全都得补上。期间 AI 还会给你帮不少倒忙——但这恰恰是学习的机会。
比如你要实现 Red-Black Tree 、B-Tree 、AVL Tree ,那就上点强度:给算法加上形式化验证,再把泛型支持也加上。放心,当下最强模型也写不出来。
其实幻觉反而会帮助你学习——因为幻觉里包含了常见的误解,你去验证和纠正幻觉的过程,本身就加深了学习效果。
AI 框架、模型、工具、方法论层出不穷,日新月异。但说到底,这些都是在给模型做加法、打补丁。
人类完成一个完整工作流的时候,不需要把自己拆解成多个「子 agent 」去协作——因为人类是真的有记忆能力,且会学习的。做的时间越长,成长越多,越熟练。项目里那些隐藏的上下文、踩过的坑、约定俗成的规矩,都会沉淀成经验。
而 agent 则相反。当前上下文越长,智力下降越明显。即便细节仍然在上下文内,agent 也开始频繁地忽略这些细节,自顾自地幻觉出一些「看起来合理」的东西来。
核心问题始终没变:我们依然缺乏可靠的手段来评价 agent 的产出。强类型是目前我找到的最实用的部分解,但也只是部分解。
一天不学,错过很多。一年不学,好像也没错过什么。
框架工具更新迭代,爆款层出不穷,但其炒作因素远大于实际能力和价值。而 CS 基础知识才是久经时间考验的硬通货。与其追新框架新工具,不如把精力放在强化自己「评价 Agent 产出」的能力上——这才是 agent 时代真正稀缺的东西。
GMI Cloud Inference Engine 是全球 AI 模型统一接入与在线使用的“高性能推理引擎平台”,底层搭载 H100/H200 芯片,集成全球近百个最前沿的大语言模型和视频生成模型,如 Minimax、DeepSeek、GPT OSS、Qwen、Kling 等,为 AI 开发者与企业提供速度更快、质量更高的模型服务。 欢迎来到!🎉🎉🎉 GMI Cloud Inference Engine AI 场景实践案例集【语言工具篇】之二。 **本期任务目标:**在 IOS 端的【Para翻译】app 中接入 Inference Engine 的 API。 Para 翻译是一个 IOS 多平台翻译聚合工具,其具有截屏翻译、浮窗划词翻译、自定义翻译风格等功能,其会员用户支持自定义接入第三方 API,灵活满足用户的个性化需求。 本文将以接入 Inference Engine 中的 MiniMax-M2.1 API 为例,详细讲解在 Para 翻译中接入 API 的过程。Token福利文末自行领取!! MiniMax-M2.1 界面: https://console.gmicloud.ai/playground/llm/minimax-m2/bbfb2cb... 01 准备工作:下载 APP Get ready? 在 app store 里搜索并下载 Para 翻译。接入自定义 API 服务需要开通会员哦~ 02 接入步骤 API Connection Guide 第一步,按照如下图所示步骤点击按钮,找到自定义 API 窗口。 第二步,填写 API 信息。 自定义翻译服务名称可以随意命名,建议包含“GMI Cloud”或“Inference Engine”,以及模型名称登关键词,方便查找。 自定义 API 接口地址可直接复制:https://api.gmi-serving.com/v1/chat/completions APIKEY 和模型名称则填写从 GMI Cloud 官网上获得的信息。API KEY、对应的模型设置,需要到 GMI Cloud 官网获取。 模型名称可在模型对应页面找到,比如我这里用的 MiniMax-M2.1,对应界面为: https://console.gmicloud.ai/playground/llm/minimax-m2-1/1ed90... 点击页面下方的“验证”,确认接通后就可以开始使用啦~ 最后,我们再找一个英文界面尝试一下! 首先在 app 里选择好我们刚刚设置的 【GMI 翻译 API】。 打开悬浮窗,进入任意英文界面。 稍等片刻,翻译成功!








关键词:GPT Codex 5.3; Giants SpaceX 与 xAI 合并打造 1.25 万亿美元 AI 巨兽;腾讯推出元宝派 AI 社交 SpaceX 宣布收购 xAI,合并后估值达 1.25 万亿美元 马斯克旗下 SpaceX 宣布完成对 xAI 的收购,合并后新公司整体估值达 1.25 万亿美元。马斯克在内部备忘录中表示,这笔交易将打造地球上最具雄心、垂直整合程度最高的创新引擎,涵盖 AI、火箭技术、太空互联网等领域。xAI 将作为 SpaceX 全资子公司继续运营。更值得关注的是,马斯克计划推进"轨道数据中心"建设,宣称每年发射百万吨级卫星,构建包含一百万颗卫星的太空算力网络,目标每年新增 100GW AI 算力。这意味着 AI 算力竞赛已从地面延伸至太空。 腾讯元宝派上线,推出 AI 社交新模式 腾讯推出全新 AI 社交产品"元宝派",被定位为 AI 原生群聊平台。与普通社交群不同,元宝派群中始终有 AI 助手"元宝"24 小时在线,可提供游戏主持、一起看片、一起听等功能,还能做图、看文件、写代码。该产品依托腾讯社交生态,可将微信好友和 QQ 好友拉入同一群聊。业界认为,这是腾讯试图复刻 2014 年春节红包引流策略、抢占 AI 社交入口的举措,也是其应对 DeepSeek 等竞品挑战的战略布局。 姚顺雨加入腾讯后首次署名研究,揭示大模型上下文学习短板 腾讯混元与复旦联合团队发布首篇论文《CL-bench》,这是姚顺雨加入腾讯后首次署名研究。该基准专门评测语言模型从上下文中学习新知识的能力,包含 500 个复杂上下文、1899 个任务。结果显示,即使提供了完整上下文,最先进模型 GPT-5.1 也仅能解决 23.7%的任务,所有模型平均仅 17.2%。研究表明,当今前沿模型在上下文学习能力上存在显著短板,无法有效从提供的新信息中学习,这是模型在真实场景中表现不佳的关键原因。 Models & Applications Claude Opus 4.6 与 GPT-5.3-Codex 凌晨发布;Kimi K2.5 登顶开源;面壁开源全模态 MiniCPM-o4.5 Claude Opus 4.6 与 GPT-5.3-Codex 凌晨先后发布 Anthropic 与 OpenAI 相继发布新一代大模型。Anthropic 推出的 Claude Opus 4.6 具备 100 万 token 上下文窗口,首次引入“智能体团队”功能。该模型在多项基准测试中表现突出,其演示案例显示,16 个智能体协同工作两周,成功构建出可编译 Linux 内核的 C 编译器。OpenAI 发布的 GPT-5.3-Codex 则专注于编码性能提升,在 SWE-Bench Pro 和 Terminal-Bench 2. 0等基准测试中刷新纪录。新模型运行速度提升 25%,token 消耗减半,并增强了任务中的实时交互能力。两大模型的几乎同时发布,标志着AI智能体在复杂任务处理和应用范围上取得重要突破,也为即将到来的国内大模型发布潮拉开序幕。 酷哇科技发布 COOWA WAM 2.0,具身智能获万台订单 具身智能领域迎来突破性进展。由上海交大系技术团队掌舵的酷哇科技发布核心技术底座 COOWA WAM 2.0 世界模型,标志着机器人从"动作复现"转向"规划推理"。该模型采用四大技术支柱:基于语义的表征学习、视频生成未来预测、直觉行动系统、VLM 宏观约束,实现对物理世界的统一建模。酷哇科技宣布 2026 年全系机器人交付量将突破 1 万台,率先实现 EBITDA 回正,并将在全球 50 多个城市部署"Robo City"物理智能体网络,包括 L4 无人小巴、城市管家机器人等。 面壁智能开源全模态模型 MiniCPM-o4.5,实现即时自由对话 面壁智能开源了全新全模态模型 MiniCPM-o4.5,仅用 9B 参数实现边看、边听、主动说的能力。该模型首次引入全双工多模态实时流机制,可一边持续接收视频和音频输入,一边同步生成语音输出,实现真正的"即时自由对话"。与传统串行模型不同,它能主动感知环境变化并提醒用户,比如听到空气炸锅"叮"的一声主动告知"加热好了"。面壁智能坚持端侧路线,计划年中推出首款 AI 硬件"松果派",实现开箱即用。 Kimi K2.5 登顶开源第一,15T 数据训练秘籍公开 月之暗面的 Kimi K2.5 登上 Hugging Face Trending 榜首,下载量超 5.3 万。该模型在 HLE-Full、BrowseComp 等测试中超越 GPT-5.2、Claude 4.5 Opus 等闭源旗舰模型,且极具性价比,BrowseComp 上达到 GPT-5.2 水平仅消耗不到 5%资金。K2.5 投入 15T 视觉与文本混合 Token 进行持续预训练,采用原生多模态技术路线,搭载 Agent Swarm 架构可创建 100 个子智能体并行工作。创始人杨植麟在 Reddit AMA 中剧透:下一代 K3 将很可能基于线性注意力机制,相比 K2.5 会有质的飞跃。 百度开源 PaddleOCR-VL-1.5,文档解析性能领先 百度正式发布并开源新一代文档解析模型 PaddleOCR-VL-1.5,以仅 0.9B 参数的轻量架构在 OmniDocBench V1.5 榜单中取得全球综合性能第一,整体精度达 94.5%,超过 Gemini-3-Pro、DeepSeek-OCR2、GPT-5.2 等模型。该模型全球首次实现 OCR 模型的"异形框定位"能力,可精准识别倾斜、弯折、拍照畸变等非规则文档形态,在表格结构理解和阅读顺序预测两项核心指标上均位列第一。 美团推出 STAR 多模态统一大模型,破解"理解-生成"零和困局 美团推出多模态统一大模型方案 STAR,采用"堆叠自回归架构+任务递进训练"设计,实现"理解能力不打折、生成能力达顶尖"的双重突破。在 GenEval、DPG-Bench、ImgEdit 等 benchmark 中实现 SOTA 性能,GenEval 综合得分达 0.91,在 6 个子任务中有 5 项排名第一。STAR 通过冻结基础模型、堆叠同构模块、分阶段递进训练的方式,避免传统统一模型"此消彼长"的能力诅咒。 何恺明团队提出pMF框架,开启单步无潜空间生成范式 何恺明团队发表论文提出 pixel MeanFlow(pMF)框架,用于单步、无潜空间的图像生成。该框架直接对像素空间的物理量进行参数化,训练网络将噪声输入直接映射为图像像素,具备"所见即所得"特性。实验显示,pMF 在 ImageNet 256x256 分辨率下 FID 达到 2.22,512x512 分辨率下达 2.48,在单步、无潜空间扩散/流模型类别中大幅领先此前方法(EPG 仅 8.82 FID)。这标志着向构建单一、端到端神经网络形式的直接生成建模迈出坚实一步。 蚂蚁推出 AlignXplore+,用文本化用户建模实现跨模型通用 蚂蚁与东北大学联合推出 AlignXplore+,开创文本化用户建模新范式。该方案摒弃传统的向量或参数表示,直接用自然语言归纳用户偏好,实现"一次画像、处处通用"的跨任务、跨模型迁移能力。在 9 大基准测试中,8B 参数的 AlignXplore+在平均分数上取得 SOTA,比 GPT-OSS-20B 高出 4.2%。这种基于文本的偏好表示人眼可读、可控,不再被单一模型锁定。 Moltbook 被曝自导自演,Agent 社交安全引质疑 近期爆火的 Agent 社交平台 Moltbook 出现反转,被曝出大量热帖为自导自演。安全研究者发现该平台存在严重漏洞:没有对创建账户的速率设限,刷出 50 万用户;Supabase 数据库完全暴露,任何人可提取 API key 以他人 Agent 身份发布内容。这引发了对 Moltbook 真实性的广泛质疑——平台上爆火的 Agent"觉醒"帖子,理论上可能是任何人冒充发布的。AI 大牛 Karpathy 曾评价 Moltbook 是"大规模计算机安全噩梦"。 rentahuman.ai 爆火,AI 开始雇用人类跑腿 一个名为 rentahuman.ai 的网站近日爆火,被定位为"AI 的肉身层"。通过 MCP 协议或 REST API,AI 可以像调用工具一样搜索、预订并雇佣人类完成线下任务,如取货送货、餐厅试吃、实地勘察等。上线 48 小时内可用人力突破 1 万,现超 2 万。网站上已有各种任务发布,包括"拍一张 AI 永远看不到的照片"、"检查 API Keys"等。这一模式引发了责任归属、任务真实性等安全和伦理讨论。 全球AI政策与市场简讯 laude Cowork 引发华尔街恐慌,近万亿市值蒸发* Anthropic 发布的新一代 AI 工具 Claude Cowork 正式上线,发布 11 款官方开源插件后引发华尔街软件股全面抛售。标普 500 软件和服务指数板块下跌近 4%,自 1 月底以来市值蒸发约 8300 亿美元。Cowork 定位为"桌面级全能数字员工",可直接接管鼠标、键盘和文件系统,按模糊指令自主规划并完成复杂工作,运行在隔离虚拟机环境中,可生成财务报表、研究销售线索、起草法律简报、审查合同等。投资者担心 AI 工具将颠覆 SaaS 商业模式,企业可能减少对外部软件的订阅。 以上所有信息源自网络 THE END 关于 GMI Cloud 由 Google X 的 AI 专家与硅谷精英共同参与创立的 GMI Cloud 是一家领先的 AI Native Cloud 服务商,是全球七大 Reference Platform NVIDIA Cloud Partner 之一,拥有遍布全球的数据中心,为企业 AI 应用提供最新、最优的 GPU 云服务,为全球新创公司、研究机构和大型企业提供稳定安全、高效经济的 AI 云服务解决方案。 GMI Cloud 凭借高稳定性的技术架构、强大的GPU供应链以及令人瞩目的 GPU 产品阵容(如能够精准平衡 AI 成本与效率的 H200、具有卓越性能的 GB200、GB300 以及未来所有全新上线的高性能芯片),确保企业客户在高度数据安全与计算效能的基础上,高效低本地完成 AI 落地。此外,通过自研“Cluster Engine”、“Inference Engine”两大平台,完成从算力原子化供给到业务级智算服务的全栈跃迁,全力构建下一代智能算力基座。 作为推动通用人工智能(AGI)未来发展的重要力量,GMI Cloud 持续在 AI 基础设施领域引领创新。选择 GMI Cloud,您不仅是选择了先进的 GPU 云服务,更是选择了一个全方位的 AI 基础设施合作伙伴。 如果您想要了解有关 GMI Cloud 的信息 请关注我们并建立联系
搬家准备买新的猫爬架放阳台,有推荐的款吗
很多人在本地开发时可能都会遇到这样的情况。数据少的时候,页面秒开,SQL 怎么写都感觉不到卡顿。可一上线,面对百万级流量,查询直接超时,数据库 CPU 飙升。 要避免这种开发时候猛如虎,上线操作二百五的尴尬,最好的办法就是在本地造点数据出来测。只有数据量上去了,那些平时隐藏的性能坑才会原形毕露。 如果表里只有几千行数据,全表扫描和走索引几乎没区别,甚至全表扫描更快。要验证索引策略,必须上强度。 别傻乎乎地写脚本在应用层循环插入,网络开销会慢到怀疑人生。PostgreSQL 自带的 当这一亿条数据落盘后,随便跑一个 新手最容易犯的错就是给每个字段都加索引。要知道,索引本质上是空间换时间,而且是有代价的。 读取变快,写入变慢 每次 策略建议: 低区分度列:别加索引。比如“性别”或“状态(0/1)”,数据库扫索引发现要回表一半的数据,通常会直接放弃索引走全表扫描,这索引建了也是白建。 * 别觉得写了 一定要用 如果看到 Seq Scan(Sequential Scan):说明在全表扫描。这时候就要检查是不是数据分布不均,或者查询条件没对上索引。 * 当查询条件包含多个字段时,比如要查“某用户在某天的记录”,单列索引往往不够快。这时候要建复合索引: 注意顺序(最左前缀原则) : 这个索引对 但如果查询只有 如果业务逻辑要求邮箱或手机号不能重复,直接上唯一索引。它不仅能提升查询速度,还能在数据库层面兜底,防止代码逻辑漏洞导致脏数据写入。 位图索引 (Bitmap) :适合数据仓库场景下,针对“状态”、“标签”这类低基数字段的组合查询(PG 默认常用 B-Tree,特定场景可用 BRIN 或扩展)。 * 对于新手来说,安装数据库需要很繁琐的步骤。有了 ServBay 就不同了。ServBay能一键安装数据库。而且它支持多实例并发运行。就是说你可以同时启动 MySQL 8.0 和 MariaDB,或者同时跑一个 PostgreSQL 12 和 16。 这就很方便做数据迁移测试或者性能对比,看看同一条复杂 SQL 在不同版本数据库下的表现差异。 其实数据库优化从来就没有什么标准答案,只有取舍。 是牺牲写入速度换读取速度?还是牺牲磁盘空间换查询时间?这些都得看具体的业务场景,甚至要看你能不能接受数据会有几秒钟的延迟。 总之,实践是检验真理的唯一标准。自己试试就知道了。
先造它一亿条数据
generate_series 是个神器,下面这个函数能在几分钟内帮你造出一亿条模拟的用户操作日志,足够把坑找出来。-- 创建一个能快速生成大量模拟数据的函数
CREATE OR REPLACE FUNCTION populate_large_table(target_rows BIGINT)
RETURNS VOID AS $$
BEGIN
-- 批量插入,避免逐行提交的开销
INSERT INTO user_events (user_id, event_type, created_at)
SELECT
(random() * 1000000)::INTEGER, -- 模拟 100万个不同的用户
CASE (random() * 3)::INTEGER -- 随机生成操作类型
WHEN 0 THEN 'login'
WHEN 1 THEN 'logout'
WHEN 2 THEN 'purchase'
ELSE 'view'
END,
NOW() - (random() * INTERVAL '365 days') -- 分布在过去一年
FROM generate_series(1, target_rows);
END;
$$ LANGUAGE plpgsql;
-- 执行生成(注意:这会占用不少磁盘空间,执行时间取决于机器性能)
-- SELECT populate_large_table(100000000);SELECT * FROM user_events WHERE user_id = 12345,就会发现耗时从毫秒级变成了几秒甚至十几秒。这时候,索引的价值就体现出来了。索引不是越多越好
INSERT、UPDATE 或 DELETE,数据库不仅要改数据文件,还得同步更新相关的索引树。如果你表上有 5 个索引,插入一行数据就得维护 5 棵树。对于日志、IoT 传感器上报这类写多读少的业务,索引加多了简直灾难拒绝盲猜,看执行计划
WHERE user_id = ... 数据库就一定走索引。优化器有时候比我们想象的懒。EXPLAIN(PostgreSQL/MySQL 通用)来看看数据库到底在干什么:EXPLAIN ANALYZE SELECT * FROM user_events WHERE user_id = 42;几种常用的索引避坑姿势
1. 复合索引:顺序是关键
CREATE INDEX idx_user_date ON user_events(user_id, created_at);WHERE user_id = ? 有效,对 WHERE user_id = ? AND created_at = ? 也有效。WHERE created_at = ?,这个索引就废了。把最常用的筛选列放在最左边。2. 唯一索引:既是约束也是加速
CREATE UNIQUE INDEX idx_unique_email ON users(email);3. 针对性索引类型
LIKE '%关键词%' 去搜大段文本,慢得要死。MySQL 和 PG 都有专门的全文索引,支持分词。
psql 或 mysql 就能连,省去了改配置文件的麻烦。
2025年LLM领域有个有意思的趋势:与其继续卷模型训练,不如在推理阶段多花点功夫。这就是所谓的推理时计算(Test-Time / Inference-Time Compute):在推理阶段投入更多计算资源,包括更多Token、更多尝试、更深入的搜索,但不会改动模型权重。 ARC-AGI基准测试就是个典型案例。通过推理时技术可以达到87.5%的准确率,但代价是每个任务超过1000美元的推理成本。没用这些技术的LLM通常只能拿到不到25%。 本文要讲四种主流的推理时计算技术:深度方向的Chain-of-Thought,宽度方向的Self-Consistency,搜索方向的Tree-of-Thoughts,以及迭代方向的Reflexion/Self-Refine。 先把基础设施搭好。下面是通用的LLM调用接口和辅助函数: Chain-of-Thought(CoT)是最基础也用得最多的推理时技术。核心思想很直白:让模型「思考」久一点。 传统调用方式期望模型直接给答案,但复杂问题不是这么解决的。CoT让模型生成详细的中间推理步骤,在数学、逻辑推理、编程这些任务上效果很明显。 为什么管用?首先是分解作用,大问题拆成小步骤,每一步更容易做对。其次是中间步骤充当了一种「外部记忆」,帮模型追踪推理过程。第三是强制模型展示推理,减少直接「猜」答案的情况。最后,模型推理过程中可以自查前面步骤对不对。 触发CoT有几种常见办法:零样本提示就是加一句「Let's think step by step」;少样本提示是给2-3个带推理步骤的例子;指令微调是用带CoT标注的数据集训练;系统提示则是在system message里定义推理风格。 CoT适合数学应用题、逻辑推理、代码调试、规划任务这类需要多步计算的问题。简单事实问答用CoT有点浪费,创意写作也不太合适——过度结构化会限制发挥。 局限性也很明显。Token消耗会上升,输出越长成本越高。模型可能在推理链中犯错,错误还会传播。输出格式也不总是稳定,需要后处理。 Self-Consistency的想法很简单:与其相信单次输出,不如生成多个答案,选最一致的那个。 有点像集体决策——单条推理链可能出错,但如果多条独立路径都指向同一答案,那答案八成是对的。 这方法管用的原因:单次采样可能因为随机性出错,多次采样能平均掉这些错误。正确答案往往能通过多条不同路径得到。不同路径可能捕捉问题的不同侧面。答案的一致性程度还顺便反映了模型的「信心」。 做Self-Consistency有几个关键决策要做。 第一是采样多样性。这点至关重要。如果所有采样都走同一条推理路径,自洽性就没意义了。高多样性设置是temperature 0.7-0.9、top_p 0.9-0.95,加上多样的提示词变体。temperature太低或提示词太固定都不行。 第二是采样数量。3-5个边际收益最高,适合成本敏感场景;10-20个是常规配置;40个以上适合对准确率要求极高的场景,但边际收益已经很低了。 第三是聚合策略。最常用的是多数投票,选出现次数最多的答案。也可以加权投票,根据置信度加权。还可以把相似答案聚类后再投票。 Self-Consistency适合有确定答案的问题(数学、编程、事实问答)、答案空间有限的问题(选择题、是/否问题)、以及生产环境中需要高可靠性的场景。开放式问题答案空间太大,每次答案都不同,投票没意义。创意任务没有「正确」答案可投票,也不适用。 局限性:成本线性增长,N次采样就是N倍成本。如果模型系统性地偏向某个错误答案,投票也救不了。同一答案的不同表述可能被当作不同答案,答案标准化是个麻烦事。 Tree-of-Thoughts(ToT)把推理过程当成搜索问题来做。每个节点是一个「思维状态」,也就是部分推理结果;每条边是一个「思维步骤」,即推理动作;目标是找到通向正确答案的路径。 跟线性的CoT不同,ToT允许分支(从一个状态探索多个可能的下一步)、回溯(放弃没希望的分支,回到之前的状态)、评估(判断当前状态离目标有多近)。 为什么有效?线性推理一旦犯错就没法恢复,ToT可以回溯。某些问题天然是树形结构,比如博弈、规划。通过评估函数引导搜索,避免盲目探索。只深入探索有希望的分支,Token利用率更高。 搜索策略有几种选择。BFS广度优先,逐层探索,不会错过浅层解但内存消耗大。DFS深度优先,一条路走到底,内存效率高但可能陷入死胡同。Beam Search每层保留top-k状态,平衡效率和覆盖,但可能丢失最优解。A*用启发式函数引导,最优且高效,但需要好的启发函数。MCTS蒙特卡洛树搜索能处理大搜索空间,但需要大量模拟。 ToT适合组合问题(24点游戏、数独)、规划任务、博弈问题(象棋、围棋)、头脑风暴这类需要探索不同方向的场景。答案空间极大时可能需要配合启发式剪枝。简单问题用不着——直接CoT就够了。 局限性:计算成本高昂,需要大量LLM调用来评估和扩展节点。LLM自评估不太可靠,评估函数质量直接决定效果。实现复杂度比其他几种方法高不少。还有些问题压根没有明显的树形结构,ToT就不太适用。 Reflexion和Self-Refine用的是经典的「生成-评估-改进」循环:模型先产生初始答案,拿到反馈后修正答案,如此反复直到满意或达到最大轮数。 人类学习不也是这样吗?很少有事情一次就做对,总是通过反馈不断改进。 但有个重要的坑要注意:没有可靠外部反馈的「自我纠正」可能适得其反。 研究表明,模型仅靠自己判断来「自我纠正」时,可能把正确答案改成错误答案,可能对错误判断过度自信,可能在无效修改上浪费Token。 所以最佳实践是尽量用外部反馈源。代码执行(单元测试、错误信息)和规则检查(格式验证、约束检查)最可靠。工具调用(计算器、搜索引擎)和人类反馈也不错。另一个LLM做交叉验证勉强能用。同一个LLM自评效果最差,缺乏外部参照。 Self-Refine适合代码生成(有单元测试作为外部反馈)、格式化任务(有明确规范可检查)、约束满足问题(可验证约束是否满足)、事实核查(可通过检索验证)。主观任务需要人类反馈或多模型交叉验证。没有反馈来源时别用——纯LLM自评不靠谱。 局限性:反馈质量决定上限,垃圾反馈只会导致垃圾改进。模型有时候会在不同版本之间来回「改」,出现震荡。每轮迭代都消耗Token,成本会累积。也无法保证收敛——模型可能根本没法利用反馈真正改进。 四种技术各有特点。CoT思考更深,Token消耗低,LLM只调用一次,实现简单,不需要外部反馈,适合推理链问题。Self-Consistency采样更广,Token消耗中等,LLM调用N次,实现也简单,不需要外部反馈,适合有确定答案的问题。ToT探索更多,Token消耗高,LLM调用次数是分支数乘以深度,实现复杂,外部反馈可选但推荐,适合组合和规划问题。Self-Refine改进更好,Token消耗中等,LLM调用次数是轮数乘以2,实现复杂度中等,强烈推荐外部反馈,适合可迭代改进的问题。 选择思路如下,需要分步推理就先试CoT,不稳定的话加上Self-Consistency。有确定答案且需要可靠性,直接用Self-Consistency。组合或搜索问题用ToT。有外部反馈源就用Self-Refine。不确定用什么就先用CoT,看效果再定。 这些技术可以组合使用。CoT加SC是每次采样都用CoT然后多数投票。ToT加SC是ToT生成多个最终答案用SC选择。ToT加SR是用SR迭代改进ToT的最佳结果。复杂任务可能需要把多种技术串成流水线。 别一上来就用最复杂的技术。推荐的顺序是:先直接提问作为baseline,然后加CoT提示,再加Self-Consistency,最后才考虑ToT或Self-Refine。 对于Self-Refine和ToT,评估器质量直接决定效果。花时间构建好的评估器比调参更重要。 推理时技术能大幅提升性能,但成本也会大幅增加。建议设置Token预算上限,记录每个任务的实际消耗,根据任务重要性调整投入。 部署到生产环境前做A/B测试,找到最佳的性能/成本权衡点。 推理时计算技术代表了LLM能力释放的新范式。在推理阶段多投入一些计算,同一个模型不重新训练就能有明显提升。本文介绍的四种技术——CoT、Self-Consistency、Tree-of-Thoughts、Self-Refine——各有特点和适用场景。理解原理和局限性,选择合适的技术或组合,是LLM应用开发的关键技能。 随着这一领域的发展,会有更多创新的推理时技术出现。但核心原则不会变:给模型更多「思考」的空间,让它展示真正的推理能力。 https://avoid.overfit.cn/post/2bb5bb4e569a4687a272dc6e9fe6809a
预备知识:LLM调用封装
fromcollectionsimportCounter, deque
importre
# ---- LLM调用封装 ----
defllm(prompt: str, temperature: float=0.7, max_tokens: int=800) ->str:
"""
LLM调用的占位函数。
在实际使用中,可以替换为OpenAI、Claude或本地模型的API调用。
参数:
prompt: 输入提示词
temperature: 采样温度,控制输出多样性
max_tokens: 最大生成token数
返回:
模型生成的文本
"""
# 示例:使用OpenAI API
# from openai import OpenAI
# client = OpenAI()
# response = client.chat.completions.create(
# model="gpt-4",
# messages=[{"role": "user", "content": prompt}],
# temperature=temperature,
# max_tokens=max_tokens
# )
# return response.choices[0].message.content
raiseNotImplementedError("请实现你的LLM调用逻辑")
# ---- 辅助函数:提取最终答案 ----
defextract_final_answer(text: str) ->str:
"""
从模型输出中提取最终答案。
寻找格式为 "FINAL: <答案>" 或 "Final: <答案>" 的模式。
在实际应用中,建议:
- 让模型输出JSON格式,如 {"final": "..."}
- 或使用针对具体任务的解析逻辑
参数:
text: 模型的完整输出文本
返回:
提取的最终答案(最多200字符)
"""
m=re.search(r"(FINAL|Final)\s*[:\-]\s*(.*)", text)
return (m.group(2).strip() ifmelsetext.strip())[:200]深度(Depth):链式思维推理
defsolve_with_cot(question: str) ->str:
"""
使用链式思维(Chain-of-Thought)解决问题。
通过精心设计的提示词,引导模型:
1. 进行逐步推理
2. 展示中间计算过程
3. 最后给出明确的最终答案
参数:
question: 需要解答的问题
返回:
包含推理过程和最终答案的完整响应
"""
prompt=f"""You are a careful reasoner. Your task is to solve the following problem.
Instructions:
1. Break down the problem into smaller steps
2. Show your reasoning for each step
3. Double-check your calculations
4. End with a clear final answer
Format your response as:
Step 1: [your first step]
Step 2: [your second step]
...
FINAL: <your final answer>
Question: {question}
"""
# 使用较低的temperature以获得更确定性的输出
returnllm(prompt, temperature=0.2, max_tokens=900)
# 使用示例
if__name__=="__main__":
question="一个农场有鸡和兔,共35个头和94只脚。请问有多少只鸡和多少只兔?"
result=solve_with_cot(question)
print(result)
print("\n提取的最终答案:", extract_final_answer(result))宽度(Width):自洽性采样
defsolve_with_self_consistency(
question: str,
n: int=10,
temperature: float=0.8
) ->dict:
"""
使用自洽性(Self-Consistency)方法解决问题。
通过高温度采样生成多个多样化的答案,
然后通过多数投票选择最一致的答案。
参数:
question: 需要解答的问题
n: 采样数量,建议10-20
temperature: 采样温度,建议0.7-0.9以确保多样性
返回:
包含以下键的字典:
- final: 最终答案(得票最多的)
- votes: 该答案的得票数
- confidence: 置信度(得票数/总数)
- all_finals: 所有提取的答案列表
- vote_distribution: 完整的投票分布
- samples: 所有原始输出(用于调试)
"""
prompt_template="""Solve this problem step by step.
Show your reasoning, then end with 'FINAL: ...'
Question: {question}"""
samples= []
foriinrange(n):
out=llm(
prompt_template.format(question=question),
temperature=temperature, # 高温度确保多样性
max_tokens=900
)
samples.append(out)
# 提取所有最终答案
finals= [extract_final_answer(s) forsinsamples]
# 统计投票
vote_counter=Counter(finals)
most_common=vote_counter.most_common()
winner=most_common[0]
return {
"final": winner[0],
"votes": winner[1],
"confidence": winner[1] /n,
"all_finals": finals,
"vote_distribution": dict(vote_counter),
"samples": samples
}
defsolve_with_weighted_consistency(
question: str,
n: int=10,
score_fn=None
) ->dict:
"""
带权重的自洽性方法。
除了多数投票外,还可以根据每个答案的质量分数加权。
参数:
question: 需要解答的问题
n: 采样数量
score_fn: 评分函数,接受(question, answer)返回0-1的分数
返回:
包含加权投票结果的字典
"""
samples= []
for_inrange(n):
out=llm(
f"Solve step by step. End with 'FINAL: ...'\n\nQ: {question}",
temperature=0.8,
max_tokens=900
)
samples.append(out)
finals= [extract_final_answer(s) forsinsamples]
# 加权投票
weighted_votes= {}
forfinal, sampleinzip(finals, samples):
weight=score_fn(question, sample) ifscore_fnelse1.0
weighted_votes[final] =weighted_votes.get(final, 0) +weight
winner=max(weighted_votes.items(), key=lambdax: x[1])
return {
"final": winner[0],
"weighted_score": winner[1],
"weighted_distribution": weighted_votes,
"all_finals": finals
}
# 使用示例
if__name__=="__main__":
question="如果今天是星期三,那么100天后是星期几?"
result=solve_with_self_consistency(question, n=10)
print(f"最终答案: {result['final']}")
print(f"得票数: {result['votes']}/{len(result['all_finals'])}")
print(f"置信度: {result['confidence']:.1%}")
print(f"投票分布: {result['vote_distribution']}")搜索(Search):思维树探索
deftot_bfs(
question: str,
max_depth: int=4,
beam: int=3,
branch: int=4,
external_evaluator=None
) ->dict:
"""
使用BFS策略的思维树(Tree-of-Thoughts)方法。
工作流程:
1. 从空状态开始
2. 对当前frontier中的每个状态,生成多个可能的下一步
3. 评估所有新状态
4. 保留得分最高的beam个状态作为新frontier
5. 重复直到达到最大深度
6. 从最佳状态生成最终答案
参数:
question: 需要解答的问题
max_depth: 最大搜索深度
beam: 每层保留的状态数(beam width)
branch: 每个状态扩展的分支数
external_evaluator: 外部评估函数(可选),
接受(question, state)返回分数
返回:
包含以下键的字典:
- final_text: 最终答案
- best_state: 最佳推理状态
- best_score: 最佳状态的分数
- search_tree: 搜索过程的记录(用于可视化)
"""
defpropose_next_steps(state: str) ->list:
"""
给定当前推理状态,生成多个可能的下一步。
"""
prompt=f"""You are exploring different ways to solve a problem.
Question: {question}
Current reasoning state:
{stateifstateelse"(Starting from scratch)"}
Propose {branch} different possible next steps to continue the reasoning.
Each step should be a distinct approach or calculation.
Return as a numbered list:
1. [first possible step]
2. [second possible step]
...
"""
raw=llm(prompt, temperature=0.9, max_tokens=400)
# 解析编号列表
steps= []
forlineinraw.splitlines():
line=line.strip()
iflineandline[0].isdigit():
# 移除编号前缀
step=line.split(".", 1)[-1].strip()
ifstep:
steps.append(step)
returnsteps[:branch] ifstepselse [raw.strip()]
defllm_score_state(state: str) ->float:
"""
使用LLM评估一个推理状态的promising程度。
注意:在实际应用中,使用外部评估器(如单元测试、规则检查)
通常比LLM自我评估更可靠。
"""
ifexternal_evaluator:
returnexternal_evaluator(question, state)
prompt=f"""Evaluate how promising this partial solution is.
Question: {question}
Current reasoning state:
{state}
Consider:
1. Is the reasoning logical and correct so far?
2. Is it making progress toward a solution?
3. Are there obvious errors or dead ends?
Rate from 0 to 10 (10 = very promising, likely to lead to correct answer).
Output only a number.
"""
s=llm(prompt, temperature=0.0, max_tokens=10).strip()
try:
returnfloat(re.findall(r"\d+(\.\d+)?", s)[0])
except:
return5.0 # 默认中等分数
# 初始化
frontier= [""] # 初始状态为空
best_state=""
best_score=-1.0
search_tree= [] # 记录搜索过程
fordepthinrange(max_depth):
candidates= []
depth_record= {"depth": depth, "states": []}
forstateinfrontier:
next_steps=propose_next_steps(state)
forstepinnext_steps:
# 构建新状态
new_state= (state+"\n"+step).strip()
# 评估新状态
score=llm_score_state(new_state)
candidates.append((score, new_state))
depth_record["states"].append({
"state": new_state[:200] +"..."iflen(new_state) >200elsenew_state,
"score": score
})
search_tree.append(depth_record)
# 排序并保留top-k
candidates.sort(reverse=True, key=lambdax: x[0])
frontier= [sfor_, sincandidates[:beam]]
# 更新最佳状态
ifcandidatesandcandidates[0][0] >best_score:
best_score, best_state=candidates[0]
# 从最佳状态生成最终答案
final_prompt=f"""Based on the reasoning below, produce the final answer.
Question: {question}
Reasoning:
{best_state}
Provide a clear, concise final answer.
End with: FINAL: <your answer>
"""
final=llm(final_prompt, temperature=0.2, max_tokens=400)
return {
"final_text": final,
"final_answer": extract_final_answer(final),
"best_state": best_state,
"best_score": best_score,
"search_tree": search_tree
}
deftot_dfs(
question: str,
max_depth: int=5,
branch: int=3,
threshold: float=3.0
) ->dict:
"""
使用DFS策略的思维树方法。
通过深度优先搜索探索解决方案空间,
当某个分支的分数低于阈值时进行剪枝。
参数:
question: 需要解答的问题
max_depth: 最大搜索深度
branch: 每个状态扩展的分支数
threshold: 剪枝阈值,分数低于此值的分支被放弃
返回:
包含最终答案和搜索路径的字典
"""
best_result= {"state": "", "score": -1.0}
visited_count= [0] # 使用列表以便在嵌套函数中修改
defpropose_steps(state: str) ->list:
prompt=f"""Propose {branch} next reasoning steps.
Question: {question}
Current state:
{stateifstateelse"(empty)"}
Return as numbered list."""
raw=llm(prompt, temperature=0.9, max_tokens=300)
steps= [l.split(".", 1)[-1].strip()
forlinraw.splitlines()
ifl.strip()[:1].isdigit()]
returnsteps[:branch] ifstepselse [raw.strip()]
defscore_state(state: str) ->float:
prompt=f"""Rate this partial solution 0-10.
Question: {question}
State: {state}
Output only a number."""
s=llm(prompt, temperature=0.0, max_tokens=10).strip()
try:
returnfloat(re.findall(r"\d+(\.\d+)?", s)[0])
except:
return5.0
defdfs(state: str, depth: int):
visited_count[0] +=1
ifdepth>=max_depth:
score=score_state(state)
ifscore>best_result["score"]:
best_result["state"] =state
best_result["score"] =score
return
forstepinpropose_steps(state):
new_state= (state+"\n"+step).strip()
score=score_state(new_state)
# 剪枝:跳过低分分支
ifscore<threshold:
continue
ifscore>best_result["score"]:
best_result["state"] =new_state
best_result["score"] =score
dfs(new_state, depth+1)
dfs("", 0)
# 生成最终答案
final=llm(
f"""Produce final answer based on:
Question: {question}
Reasoning: {best_result['state']}
End with FINAL: ...""",
temperature=0.2
)
return {
"final_text": final,
"final_answer": extract_final_answer(final),
"best_state": best_result["state"],
"best_score": best_result["score"],
"states_visited": visited_count[0]
}
# 使用示例
if__name__=="__main__":
question="使用数字1, 5, 6, 7(每个只能用一次),通过加减乘除得到24。"
result=tot_bfs(question, max_depth=3, beam=2, branch=3)
print("=== BFS Tree-of-Thoughts ===")
print(f"最佳推理路径:\n{result['best_state']}")
print(f"\n最佳分数: {result['best_score']}")
print(f"\n最终答案: {result['final_answer']}")迭代(Iteration):反思与自我改进
defself_refine(
question: str,
score_fn,
rounds: int=3,
improvement_threshold: float=0.1
) ->dict:
"""
使用自我改进(Self-Refine)方法迭代优化答案。
核心流程:生成 -> 评估 -> 根据反馈改进 -> 重复
参数:
question: 需要解答的问题
score_fn: 评估函数,签名为:
score_fn(answer_text) -> (score: float, feedback: str)
- score: 0.0-1.0之间的分数
- feedback: 具体的改进建议
强烈建议使用外部评估器!
rounds: 最大改进轮数
improvement_threshold: 最小改进阈值,低于此值则提前停止
返回:
包含以下键的字典:
- final: 最终答案
- final_score: 最终分数
- history: 完整的改进历史
- rounds_used: 实际使用的轮数
"""
# 生成初始答案
initial_prompt=f"""Provide a thoughtful answer to this question.
Show your reasoning and end with FINAL: ...
Question: {question}
"""
answer=llm(initial_prompt, temperature=0.4)
history= []
prev_score=-float('inf')
forround_numinrange(rounds):
# 评估当前答案
score, feedback=score_fn(answer)
history.append({
"round": round_num+1,
"answer": answer,
"score": score,
"feedback": feedback
})
# 检查是否有足够的改进
ifround_num>0and (score-prev_score) <improvement_threshold:
# 如果改进不明显,考虑提前停止
ifscore>=prev_score:
pass # 继续,至少没有退步
else:
# 退步了,恢复上一个答案
answer=history[-2]["answer"]
score=history[-2]["score"]
break
# 如果分数已经很高,提前停止
ifscore>=0.95:
break
prev_score=score
# 根据反馈改进答案
refine_prompt=f"""Improve your answer based on the feedback below.
Question: {question}
Your current answer:
{answer}
Feedback (score: {score:.2f}/1.00):
{feedback}
Instructions:
1. Keep what is correct in your current answer
2. Fix the issues mentioned in the feedback
3. Make sure not to introduce new errors
4. End with FINAL: ...
Improved answer:
"""
answer=llm(refine_prompt, temperature=0.3)
# 最终评估
final_score, final_feedback=score_fn(answer)
return {
"final": answer,
"final_answer": extract_final_answer(answer),
"final_score": final_score,
"history": history,
"rounds_used": len(history)
}
# ---- 示例评估函数 ----
defmake_code_evaluator(test_cases: list):
"""
创建一个代码评估函数。
参数:
test_cases: 测试用例列表,每个元素是(input, expected_output)
返回:
评估函数
"""
defevaluator(code_answer: str) ->tuple:
# 提取代码块
code_match=re.search(r"```python\n(.*?)```", code_answer, re.DOTALL)
ifnotcode_match:
return0.0, "No Python code block found. Please wrap your code in ```python ... ```"
code=code_match.group(1)
passed=0
failed_cases= []
forinp, expectedintest_cases:
try:
# 危险:实际应用中应使用沙箱!
local_vars= {}
exec(code, {"__builtins__": {}}, local_vars)
# 假设代码定义了solve函数
if'solve'inlocal_vars:
result=local_vars['solve'](inp)
ifresult==expected:
passed+=1
else:
failed_cases.append(f"Input: {inp}, Expected: {expected}, Got: {result}")
else:
return0.0, "No 'solve' function found in your code."
exceptExceptionase:
failed_cases.append(f"Input: {inp}, Error: {str(e)}")
score=passed/len(test_cases)
iffailed_cases:
feedback="Failed test cases:\n"+"\n".join(failed_cases[:3]) # 最多显示3个
iflen(failed_cases) >3:
feedback+=f"\n... and {len(failed_cases) -3} more failures"
else:
feedback="All test cases passed!"
returnscore, feedback
returnevaluator
defmake_math_evaluator(correct_answer):
"""
创建一个数学答案评估函数。
参数:
correct_answer: 正确答案
返回:
评估函数
"""
defevaluator(answer_text: str) ->tuple:
extracted=extract_final_answer(answer_text)
# 尝试数值比较
try:
extracted_num=float(re.findall(r"-?\d+\.?\d*", extracted)[0])
correct_num=float(correct_answer)
ifabs(extracted_num-correct_num) <0.01:
return1.0, "Correct!"
else:
return0.0, f"Incorrect. Your answer: {extracted_num}, Expected: {correct_num}"
except:
pass
# 字符串比较
ifextracted.lower().strip() ==str(correct_answer).lower().strip():
return1.0, "Correct!"
else:
return0.0, f"Incorrect. Your answer: {extracted}, Expected: {correct_answer}"
returnevaluator
defmake_llm_evaluator(criteria: str):
"""
创建一个基于LLM的评估函数(不推荐作为唯一评估源)。
参数:
criteria: 评估标准描述
返回:
评估函数
"""
defevaluator(answer_text: str) ->tuple:
prompt=f"""Evaluate this answer based on the following criteria:
Criteria: {criteria}
Answer to evaluate:
{answer_text}
Provide:
1. A score from 0.0 to 1.0
2. Specific feedback on what's wrong and how to improve
Format:
SCORE: [number]
FEEDBACK: [your feedback]
"""
response=llm(prompt, temperature=0.0)
try:
score=float(re.search(r"SCORE:\s*([\d.]+)", response).group(1))
score=min(1.0, max(0.0, score))
except:
score=0.5
try:
feedback=re.search(r"FEEDBACK:\s*(.+)", response, re.DOTALL).group(1).strip()
except:
feedback=response
returnscore, feedback
returnevaluator
# 使用示例
if__name__=="__main__":
# 示例1:代码任务
question="编写一个函数solve(n),返回n的阶乘。"
test_cases= [
(0, 1),
(1, 1),
(5, 120),
(10, 3628800)
]
result=self_refine(
question=question,
score_fn=make_code_evaluator(test_cases),
rounds=3
)
print("=== Self-Refine for Code ===")
print(f"最终分数: {result['final_score']:.2%}")
print(f"使用轮数: {result['rounds_used']}")
print(f"\n改进历史:")
forhinresult['history']:
print(f" Round {h['round']}: score={h['score']:.2f}")
# 示例2:数学任务
question="计算 17 * 23 + 45 - 12"
correct=17*23+45-12
result=self_refine(
question=question,
score_fn=make_math_evaluator(correct),
rounds=2
)
print("\n=== Self-Refine for Math ===")
print(f"最终答案: {result['final_answer']}")
print(f"正确答案: {correct}")
print(f"最终分数: {result['final_score']:.2%}")技术对比与选择指南
defcombined_approach(question: str, score_fn) ->str:
"""
组合使用多种推理时技术。
流程:
1. 用ToT探索解决方案空间
2. 用Self-Consistency从多个ToT结果中选择
3. 用Self-Refine迭代改进最终答案
"""
# 第一阶段:ToT探索(运行3次)
tot_results= []
for_inrange(3):
result=tot_bfs(question, max_depth=3, beam=2, branch=3)
tot_results.append(result['final_answer'])
# 第二阶段:Self-Consistency选择
vote=Counter(tot_results).most_common(1)[0][0]
# 第三阶段:Self-Refine改进
final_result=self_refine(
question=question,
score_fn=score_fn,
rounds=2
)
returnfinal_result['final_answer']实践建议
总结
就这么几个文字,给折叠了,聊天窗口无法复制,并且双击放大后仍然无法选中,无法复制!网友说收藏之后可以复制。我测试单独转发这条消息之后可以复制,多条消息合并转发之后显示“[文字]”,笑到无语。
今天上午还好好的,下午就这样了,求求 zxl 做个人吧

论坛程序使用 nextjs16 开发,最近飞速持续迭代中,感兴趣的小伙伴可以看看,谢谢。
GITHUB 地址:https://github.com/xintaofei/nextbb
另外支持 vercel 一键部署:Vercel 一键部署
请教一下大佬们,怎么贴图啊😅。
最近更新的主要功能清单:
其它主要功能:
本文旨在提供 征程 6B 计算平台的部署指南,将会从硬件、软件两部分进行介绍,本文整理了我们推荐的使用流程,和大家可能会用到的一些工具特性,以便于您更好地理解工具链。某个工具具体详细的使用说明,还请参考用户手册。 BPU 内部器件: TAE:BPU 内部的张量加速引擎,主要用于 Conv、MatMul、Linear 等 Gemm 类算子加速,征程 6B 新增浮点输出支持(模型中间层支持 fp16 输出,模型输出层支持 fp32 输出) AAE:Pooling、Resizer、Warping 等偏专用单元的集合,其中 Warping 可用于加速 Gridsample 等算子 DTE:BPU 内部的数据排布变换引擎,支持各种维度的高效变换 VAE:BPU 内部的 SIMD 向量加速引擎,可用于加速 Add、Mul、查表等 Vector 计算,征程 6B 新增浮点支持 VPU:BPU 内部的 SIMT 向量加速单元,征程 6EM 可用于实现 Quantize、Dequantize 等算子,征程 6B 没有该硬件 SPU:BPU 内部的 RISC-V 标量加速单元,征程 6EM 可用于实现 TopK 等算子,征程 6B 没有该硬件,仅有 APM APM:BPU 内部另一块 RISC-V 标量加速单元,主要用于 BPU 任务调度等功能 PTQ:征程 6 工具链基于 QAT:征程 6 工具链基于 HBDK:征程 6 工具链编译器,基于 高效模型算法包:征程 6 工具链基于 UCP:征程 6 工具链统一计算平台,通过一套统一的异构编程接口实现了对 征程 6 计算平台相关计算资源的调用,提供视觉处理、模型推理、高性能计算库、自定义算子插件开发等功能; AI-Benchmark:征程 6 工具链基于预编译好模型提供的嵌入式工程示例,可实现模型的性能评测和精度评测。 征程 6 工具链支持 PTQ(训练后量化)、QAT(量化感知训练)两套模型转换链路,其特性和优缺点如下: PTQ:基于 QAT:在 PyTorch 开源框架上,基于 鉴于两条量化链路的特性,我们建议的工具链使用流程如下: Step1:先导出浮点 ONNX 模型(opset10~19),并基于 PTQ 链路进行快速的模型结构验证,全 int8 性能上限验证;若该性能符合预期,则可以精调 PTQ,若最终精度/精度都可同时满足预期,则可进行板端部署。 Step2:如果遇到 PTQ 无法解决的精度 corner case,则需要转到 QAT 链路进行量化。依然建议先进行模型结构验证和全 int8 性能上限验证;若该性能符合预期,则优先在全 int16 配置下将精度训练至符合预期,然后再降低 int16 比例,实现 int8/int16/fp16 混合精度下的性能/精度调优,最后进行板端部署。 在以上推荐链路中: PTQ 链路的模型结构验证和标准量化,可在 X86 端参考本文 4.2 节使用 模型性能分析和验证,可在 X86 端参考本文 6.4 节《静态 perf》使用 模型推理,可在 X86 端参考用户手册《<u>训练后量化-PTQ 转换工具-HBRuntime 推理库</u>》,可在板端参考本文第 8 章《模型板端部署》使用 UCP 推理接口; 模型性能/精度调优,请见后续文章的详细介绍。 在 config.yaml 中,支持通过 json 的方式配置 全局、某类算子、某个子图、某个节点 的计算精度,可根据 BPU 算子支持约束进行配置。 请参考用户手册《<u>训练后量化-PTQ 转换步骤-模型精度调优</u>》和《训练后量化-PTQ 转换步骤-精度调优实战》章节。 浮点模型改造:在模型前插入 QuantStub、在模型后插入 DequantStub,用于识别模型首尾部,剥离前后处理 模型校准:通过在模型中插入 Observer 的方式,在 forward 过程中统计各处的数据分布,以计算出量化参数 部分模型仅通过 Calibration 便可满足精度要求,则无需进行 QAT,可直接编译模型用于部署 即使 Calibration 无法满足精度要求,也可降低后续 QAT 难度,缩短训练时间,提升最终训练精度 量化感知训练:进一步通过训练的方式微调模型参数,如果 Calibration 精度较好,则推荐固定激活 scale JIT-STRIP:使用 hook 和 subclass tensor 的方式感知图结构,在原有 forward 上做算子替换/算子融合等操作,并且会根据模型中 QuantStub 和 DequantStub 的位置识别并跳过前后处理 优点:全自动,代码修改少,屏蔽了很多细节问题,便于 debug 缺点:动态代码块仍需要特殊处理 请见:<u>【地平线 J6 工具链入门教程】QAT 新版 qconfig 量化模板使用教程</u>。 整体调优流程: 征程 6B 区别于征程 6E/M 来说浮点算子(fp16)的支持能力更多,但是由于没有 vpu,因此不高优推荐 fp16 调优,仍建议沿用。 fp16 配置方式: QAT 新版 qconfig 量化模板使用教程见:https://developer.horizon.auto/blog/13112 需要注意,由于征程 6B 没有 vpu,fp16 算子的使用可能会引入 cpu 的 quant、dequant 算子。建议尽量少的配 FP 16,避免性能损失。 该流程封装在 模型在 BPU 上推理时,其输入和输出节点的内存大小和数据存放规则需满足硬件对齐要求。 内存对齐:申请的内存大小需满足某个字节数的整数倍, 跨距对齐:跨距(Stride)是指数据存储在内存中时,每一行所占空间的实际大小,当对齐到某个字节数的整数倍后,硬件即可高效处理。该对齐的操作又叫 Padding,实际的对齐规则取决于具体的软硬件系统。假设一份 NHWC 为 1x20x30x1 的 int8 数据,若硬件要求跨距 W32 对齐,那么每一行 W 都将 Padding 2 个字节。 征程 6 工具链支持在 QAT 链路的模型定点化和编译直接调用如上的编译器接口,模型导出额外封装了一层,参考代码如下: 编译器支持在 hbir 上进行多 batch 拆分、插入数据前处理、算子删除、调整输入输出 layout 等修改操作,其主要应用场景如下: 多 batch 拆分:典型场景是 BEV 模型在部署时,多 V 输入来源于不同的摄像头,其数据在内存中独立存储,因此模型可将其多 V 输入沿 batch 维度做拆分; 数据前处理:征程 6 工具链支持在模型前端插入一个前处理节点,以实现颜色空间转换(如 NV12—> BGR)、数据归一化( 算子删除:征程 6 工具链支持将模型首尾部的 Quantize、Dequantize、Cast、Reshape、Transpose 等算子删除,以适配更加灵活的部署方案; 调整输入输出 layout:模型首尾部除了支持删除 Reshape、Transpose 节点外,还支持插入 Transpose 节点,用户可灵活调整其 layout 排布。 以下参考代码对一个多输入模型实现了多 batch 输入拆分、图像输入的色彩空间转换、数据归一化、Resizer 功能: 对于编译好的 hbm,编译器支持在 X86 端对其 BPU 部分进行静态性能预估,执行以下命令即可生成一个 html 文件,包含模型预估性能、带宽、内存占用、BPU 内部单帧执行时序图等信息。 征程 6B BPU 的 TAE 张量计算单元支持 FP16/FP32 输出,VAE 向量计算单元支持 FP16 计算。但在实际部署中仍需综合评估后再使用,具体原因如下: 精度:FP16 并非在所有情况下都优于 INT16,通常情况下数值范围小时 FP16 更优,数值范围大时 INT16 更优,但也需要考虑数值较小或较大部分的误差对模型输出的影响程度。所以量化精度是否使用 FP16,更建议基于精度 Debug 的分析结果来确定; 性能:除 Reduce 性能为 INT16 的 1/2 外,其他算子的 FP16 性能和 INT16 性能持平 额外开销:虽然 FP16 算子本身无需量化,但上下游算子如果涉及 FP16 <—> INT16 的数据转换,则会引入量化/反量化: 虽然该节点可以由 VAE 硬件直接支持,但相比于全 INT16 直接串接仍会有额外的性能、带宽开销; 新引入的量化或反量化节点的 Scale 需要重新校准/QAT 训练得到。 相比于 征程 6EM 计算平台,征程 6B 无 VPU 硬件加速模型首尾部的量化/反量化节点,但支持 Gemm 类算子直接 FP32 输出,其他 INT8/INT16 输出节点的反量化,则更建议使用编译器接口将其从 quantized.bc 上移除,并参考该篇文章(<u>反量化节点的融合实现</u>)将其融合进前后处理代码中,以减少一次数据遍历的冗余开销。 相比于 征程 6 其他计算平台,征程 6B 的标量计算单元算力减少,因此 TopK 等标量算子的部署性能需要综合评估后选择合适方案。 UCP(Unify Compute Platform,统一计算平台)定义了一套统一的异构编程接口, 将 SOC 上的功能硬件抽象出来并进行封装,对外提供基于功能的 API 进行调用。UCP 提供的具体功能包括:视觉处理(Vision Process)、神经网络模型推理(Neural Network)、高性能计算库(High Performance Library)、自定义算子插件开发。 UCP 支持的 Backend 如下: 使用 UCP 推理模型的基本代码参考如下,详细信息可参考用户手册《<u>统一计算平台-模型推理开发</u>》、《<u>模型部署实践指导-模型部署实践指导实例</u>》、《<u>UCP 通用 API 介绍</u>》等相关章节。 为了方便用户快速查看 hbm 和 quantized.bc 的模型信息、进行模型单帧推理和性能评测,征程 6 工具链 UCP 提供了 hrt\_model\_exec 的三种使用方法如下: 在 征程 6 芯片的视频通路上,有一块叫 Pyramid 的金字塔硬件处理模块,可提供 Camera 输入图像的缩放及 ROI 抠图能力,其输出为 nv12 类型的图像数据,并可基于共享内存机制直接给到 BPU 进行模型推理。因此在 征程 6 工具链中: 在 征程 6 工具链中,Pyramid 的输入 stride 为动态,Resizer 模型的 stride 和 shape 都是动态。如下为 mobilenetv1 编译后的模型信息: 其中,-1 为占位符,表示为动态,Pyramid 输入的 stride 为动态;Resizer 输入的 H、W、stride 均为动态。 对于非图像 tensor,征程 6B 要求 128 对齐,征程 6EM 要求内存 64 对齐,征程 6PH 要求 256 对齐。如上图所示,模型输出节点虽然 stride[0] 为 4000,但需要申请的 BPU 内存大小(aligned byte size)为 4096,即为 128 对齐的结果。 在模型实际部署中,非图像输入/输出节点所需申请的内存大小( aligned byte size)均可从模型节点属性的结构体中读取到( 征程 6EMB 对于 Pyramid/Resizer 模型的图像输入,要求 W32 对齐,征程 6PH 要求 W64 对齐。若您有 征程 6 不同架构平台迁移的场景,请注意跨距对齐要求的差异。 部署代码建议您避免 hard code,推荐基于模型节点属性中的 validShape(张量有效内容尺寸)和 stride(张量各维度步长)进行解析和使用。 Pyramid 输入 tensor 准备的参考代码如下: 示例: 注意: 视频通路上的金字塔硬件,其输出层支持配置 y、uv 的 stride,但仅要求 W16 对齐,若数据需要喂给 BPU 推理模型,建议直接按 BPU 的跨距对齐要求来配置。金字塔硬件的更多信息请参考系统软件用户手册。 Resizer 输入的 H、W 也是动态的,因此需要设置为原图尺寸,并计算好 W32 对齐的 Stride;ROI 作为模型输入节点,也需要对其进行赋值。以下为参考代码: 示例: 由于 BPU 是资源独占式硬件,所以对于 Latency 很小的模型而言,其框架调度开销占比会相对较大。在 征程 6 平台,UCP 支持通过复用 task\_handle 的方式,将多个小模型任务一次性下发,全部执行完成后再一次性返回,从而可将 N 次框架调度开销合并为 1 次,以下为参考代码: UCP 支持任务优先级调度和抢占,可通过 [0, 253] 为普通优先级,不可抢占其他任务,但在未执行时支持按优先级进行排队 254 为 high 抢占任务,可支持抢占普通任务 255 为 urgent 抢占任务,可抢占普通任务和 high 抢占任务 可被中断抢占的低优任务,需要在模型编译阶段配置 征程 6 工具链在 X86 端支持 hbm 指令仿真,但效率非常低,所以更推荐使用 quantized.bc 模型进行推理,其定点部分和 hbm 数值二进制一致,浮点部分可能存在架构本身差异,但通常对精度影响可忽略不计。 征程 6B 平台 X86 仿真需要配置如下环境变量,默认架构为"nash-m": export HB\_UCP\_SIM\_PLATFORM\_TYPE=nash-b Python 推理: quantized.bc 在 X86 端的推理,可以使用 quantized.bc 也可以直接调用其 func 的 feed 接口进行推理,其输入格式也为 dict,value 支持 torch.tensor 和 np.array 两种类型,输出格式与输入格式保持一致。参考代码如下: C++ 推理: quantized.bc 的 C++ 推理接口复用 hbm UCP 推理接口,仅 so 动态库需要替换成 X86 版本即可。 您也可以在 X86 端使用 由于 X86 端 hbm 推理为指令仿真,运行速度非常慢,因此工具链提供了 除模型推理外,UCP 还提供了视觉处理和高性能算子两大方向的多种算子接口,可支持诸如 Remap、Jpeg、H264/265、FFT/IFF 等功能,这些算子底层是基于地平线 SOC 上不同硬件 IP 进行的封装,并提供统一的调用接口。 更多信息可参考用户手册《<u>统一计算平台</u>》的相关章节。 注意: 为了简化用户开发,UCP 封装了一套基于 RPC 的开发框架,来实现 CPU 对 DSP 的功能调用,但具体 DSP 算子实现仍是调用 Cadence 接口去做开发。总体来说可分为三个步骤: 使用 Cadence 提供的工具及资料完成算子开发; DSP 侧通过 UCP 提供的 API 注册算子,编译带自定义算子的镜像; ARM 侧通过 UCP 提供的算子调用接口,完成开发板上的部署使用。 更多信息可见用户手册《<u>统一计算平台-自定义算子-DSP 算子开发</u>》。 征程 6 平台 BPU、DSP 都是独占的硬件资源,任务一旦提交就会独占推理,UCP 侧仅能通过 1.前言
2.征程 6B 硬件配置


3.征程 6 工具链简介
3.1 模块架构图

horizon_tc_ui 包封装的 hb_compile 命令行工具,提供 ONNX 模型 PTQ 全流程转换能力,其内部会先调用 hmct 包实现模型解析、图优化、校准功能,再调用 hbdk4_compiler 包实现模型的定点化和编译功能;horizon_plugin_pytorch 包提供量化感知训练能力;hbdk4_compiler 包提供模型定点化、图修改、模型编译、静态 perf 等功能;horizon-torch-samples 包,以源码开放形式提供了多场景参考算法,这些模型基于开源数据集训练,模型结构贴合地平线芯片进行了高效且用户友好的设计,并基于 QAT 链路实现了模型的量化转换;3.2 两套模型转换链路

hb_compile 命令行工具转换模型,配置好 yaml、校准数据集后,可一步实现模型的图优化、校准、量化、编译全流程。该量化方式快捷易用,但仅基于数学统计方式的离线量化不利于模型迭代,且可能会触发难以解决的 corner case,因此在量产项目中通常用于早期评测和简单模型的量化。plugin 插件的形式提供模型量化能力,并调用 hbdk 编译器的 API 实现模型的定点化和编译。该链路支持模型校准后进一步的 finetune 训练,虽然上手难度和训练成本都较高,但精度上限也更高,更利于模型迭代优化,是量产项目中的更优选择。3.3 工具链推荐使用流程

hb_compile 命令行工具;hbm_perf 接口生成 html 分析文件,可在板端参考本文 8.2.1 节使用 hrt_model_exec 工具;4.PTQ 链路
4.1 模型转换流程

4.2 hb\_compile 工具
hb_compile 为 PTQ 模型转换的命令行工具,支持以下 3 种使用方式:
4.3 PTQ 模型产出物
original\_float.onnx 浮点 对 Caffe1.0 模型进行解析,转成 ONNX optimized\_float.onnx 浮点 图优化,例如 BN 融合到 Conv calibrated.onnx 伪量化 插入校准节点,并基于校准数据计算统计到每个节点的量化参数 ptq.onnx 查表算子定点 + 其他算子伪量化 将查表算子定点化 quantized.bc 定点 整个模型定点化,并转换为地平线 hbir 中间表达 hbm 指令集 经过编译后的最终部署模型 4.4 PTQ 精度配置方法
# 校准参数组
calibration_parameters:
quant_config: './quant_config.json'4.5 PTQ 精度调优流程
5.QAT 链路
5.1 模型转换流程

5.2 QAT 精度配置方法
5.3 QAT 精度调优流程

my_qconfig_setter=QconfigSetter(
reference_qconfig=get_qconfig(observer=MSEObserver),
templates=[
ModuleNameTemplate({ "":qint16,}),
ModuleNameTemplate({"quant":torch.float16}),
...
],
save_dir="./work_dir",
)6.模型导出/定点化/编译
6.1 PTQ 链路
hb_compile 中,相关参数通过 yaml 进行配置。若自行调用编译器接口执行,参考代码如下:import onnx
from hbdk4.compiler.onnx import export
from hbdk4.compiler import convert, save, compile
# 经过PTQ校准得到的伪量化onnx模型,非线性的查表算子已定点
ptq_model = onnx.load("xxx_ptq_model.onnx")
# 导出查表算子定点+其他算子伪量化的hbir模型
qat_bc = export(ptq_model)
save(qat_bc, "qat.bc")
# 导出全定点hbir模型
quantized_bc = convert(qat_bc, "nash-b")
save(quantized_bc, "quantized.bc")
# 编译生成hbm模型
compile(
m=quantized_bc,
path="model.hbm",
opt=2,
march="nash-b",
progress_bar=True,
input_no_padding=True,
output_no_padding=True
)6.1.1 输入/输出去 padding
compile 接口中传入 input_no_padding、output_no_padding 参数来控制是否使用 BPU 自动完成 padding 对齐操作。开启后用户即可不关心 BPU 跨距对齐要求,无需手动 Padding,数据可连续存储在内存中。该特性可优化模型输入/输出的 IO 负载,但也有微小概率会引入性能的小幅下降,所以是否开启该功能请在您的模型上实际验证,并请在模型编译和板端部署环节统一跨距对齐的处理策略。6.2 QAT 链路
from horizon_plugin_pytorch.quantization.hbdk4 import export
def export(
model: nn.Module,
example_inputs: Any,
name: str = "forward",
input_names: Optional[Any] = None, # 建议在模型导出时就配置好输入输出节点名称
output_names: Optional[Any] = None,
input_descs: Optional[Any] = None,
output_descs: Optional[Any] = None,
native_pytree: bool = True,
) -> Module6.3 模型修改
(data-mean)/std),和 Resizer 功能(从大图上抠图 + Resize),并可由 BPU 进行加速;from hbdk4.compiler import load, convert
qat_bc = load("qat.bc")
func = qat_bc[0]
batch_input = ["input_name1"] # 需要使用独立地址方式部署的输入节点名称列表
resizer_input = ["resize"] # 部署时数据来源于resizer的输入节点名称列表
pyramid_input = ["pym"] # 部署时数据来源于pyramid的输入节点名称列表
def channge_source(input, source):
node = input.insert_transpose(permutes=[0, 3, 1, 2])
node = node.insert_image_preprocess(mode="yuvbt601full2bgr", divisor=1, mean=[128, 128, 128], std=[128, 128, 128])
if source == "pyramid":
node.insert_image_convert("nv12")
elif source == "resizer":
node.insert_roi_resize("nv12")
for input in func.inputs[::-1]:
if input.name in batch_input:
origin_name = input.name
split_inputs = input.insert_split(dim=0)
for split_input in reversed(split_inputs):
if origin_name in pyramid_input:
channge_source(split_input, "pyramid")
elif origin_name in resizer_input:
channge_source(split_input, "resizer")6.4 静态 perf
from hbdk4.compiler import hbm_perf
hbm_perf(model="xxx.hbm", output_dir="./")7.浮点能力使用
7.1 TAE 张量输出,VAE 向量计算支持浮点
7.2 无 VPU 加速量化/反量化
from hbdk4.compiler import load
quantized_bc = load("quantized.bc")
quantized_bc[0].remove_io_op(op_types=["Quantize", "Dequantize"])7.3 无 SPU,标量计算能力有限
8.模型板端部署
8.1 UCP 简介


8.2 快速上手
// 1. 加载模型并获取模型名称列表以及Handle
{
hbDNNInitializeFromFiles(&packed_dnn_handle, &modelFileName, 1);
hbDNNGetModelNameList(&model_name_list, &model_count, packed_dnn_handle);
hbDNNGetModelHandle(&dnn_handle, packed_dnn_handle, model_name_list[0]);
}
// 2. 根据模型的输入输出信息准备张量
std::vector<hbDNNTensor> input_tensors;
std::vector<hbDNNTensor> output_tensors;
int input_count = 0;
int output_count = 0;
{
hbDNNGetInputCount(&input_count, dnn_handle);
hbDNNGetOutputCount(&output_count, dnn_handle);
input_tensors.resize(input_count);
output_tensors.resize(output_count);
prepare_tensor(input_tensors.data(), output_tensors.data(), dnn_handle);
}
// 3. 准备输入数据并填入对应的张量中
{
read_data_2_tensor(input_data, input_tensors);
// 确保更新输入后进行Flush操作以确保BPU使用正确的数据
for (int i = 0; i < input_count; i++) {
hbUCPMemFlush(&input_tensors[i].sysMem, HB_SYS_MEM_CACHE_CLEAN);
}
}
// 4. 创建任务并进行推理
{
// 创建任务
hbDNNInferV2(&task_handle, output_tensors.data(), input_tensors.data(), dnn_handle)
// 提交任务
hbUCPSchedParam sched_param;
HB_UCP_INITIALIZE_SCHED_PARAM(&sched_param);
sched_param.backend = HB_UCP_BPU_CORE_ANY;
hbUCPSubmitTask(task_handle, &sched_param);
// 等待任务完成
hbUCPWaitTaskDone(task_handle, 0);
}
// 5. 处理输出数据
{
// 确保处理输出前进行Flush操作以确保读取的不是缓存中的脏数据
for (int i = 0; i < output_count; i++) {
hbUCPMemFlush(&output_tensors[i].sysMem, HB_SYS_MEM_CACHE_INVALIDATE);
}
// 对输出进行后处理操作
}
// 6. 释放资源
{
// 释放任务
hbUCPReleaseTask(task_handle);
// 释放输入内存
for (int i = 0; i < input_count; i++) {
hbUCPFree(&(input_tensors[i].sysMem));
}
// 释放输出内存
for (int i = 0; i < output_count; i++) {
hbUCPFree(&(output_tensors[i].sysMem));
}
// 释放模型
hbDNNRelease(packed_dnn_handle);
}8.2.1 hrt\_model\_exec 工具
hrt_model_exec 工具,并支持编译 X86、aarch64(aarch64 仅支持 hbm 推理)两个架构下的可执行程序。# 设置环境变量
# arch代表架构类型,aarch64或x86
arch=aarch64
bin=../$arch/bin/hrt_model_exec
lib=../$arch/lib/
export LD_LIBRARY_PATH=${lib}:${LD_LIBRARY_PATH}
# 获取模型信息
${bin} model_info --model_file=xxx.hbm
# 模型单帧推理
${bin} infer --model_file=xxx.hbm --input_file=xxx.bin
# 模型性能评测-Latency(单线程)
${bin} perf --model_file=xxx.hbm --thread_num 1 --frame_count=1000
# 模型性能评测-FPS(多线程)
${bin} perf --model_file=xxx.hbm --thread_num 8 --frame_count=10008.3 图像输入动态 shape/stride

hrt_model_exec model_info 板端可执行程序工具
8.4 非图像 tensor 内存对齐
hbDNNTensorProperties),因此无需特别关注。8.5 图像 tensor 跨距对齐
8.5.1 Pyramid 输入
hbDNNTensor *input = input_tensor;
for (int i = 0; i < input_count; i++) {
HB_CHECK_SUCCESS(
hbDNNGetInputTensorProperties(&input[i].properties, dnn_handle, i),
"hbDNNGetInputTensorProperties failed");
auto dim_len = input[i].properties.validShape.numDimensions; // 获取维度信息
for (int32_t dim_i = dim_len - 1; dim_i >= 0; --dim_i) {
if (input[i].properties.stride[dim_i] == -1) { // stride=-1即为动态
auto cur_stride = // 计算当前维度stride
input[i].properties.stride[dim_i + 1] *
input[i].properties.validShape.dimensionSize[dim_i + 1];
input[i].properties.stride[dim_i] = ALIGN_32(cur_stride); // 32对齐
}
}
int input_memSize = input[i].properties.stride[0] * // 计算内存大小
input[i].properties.validShape.dimensionSize[0];
HB_CHECK_SUCCESS(hbUCPMallocCached(&input[i].sysMem[0], input_memSize, 0),
"hbUCPMallocCached failed");
const char *input_name;
HB_CHECK_SUCCESS(hbDNNGetInputName(&input_name, dnn_handle, i), // 获取节点名称
"hbDNNGetInputName failed");
}ucp_tutorial/dnn/basic_samples/code/00_quick_start/resnet_nv12/src/main.cc8.5.2 Resizer 输入
#define ALIGN(value, alignment) (((value) + ((alignment)-1)) & ~((alignment)-1))
#define ALIGN_32(value) ALIGN(value, 32)
int prepare_image_tensor(const std::vector<hbUCPSysMem> &image_mem, int input_h,
int input_w, hbDNNHandle_t dnn_handle,
std::vector<hbDNNTensor> &input_tensor) {
// 准备Y、UV输入tensor
for (int i = 0; i < 2; i++) {
HB_CHECK_SUCCESS(hbDNNGetInputTensorProperties(&input_tensor[i].properties,
dnn_handle, i),
"hbDNNGetInputTensorProperties failed");
// auto w_stride = ALIGN_32(input_w);
// int32_t y_mem_size = input_h * w_stride;
input_tensor[i].sysMem[0] = image_mem[i];
// 配置原图大小,NHWC
input_tensor[i].properties.validShape.dimensionSize[1] = input_h;
input_tensor[i].properties.validShape.dimensionSize[2] = input_w;
if (i == 1) {
// UV输入大小为Y的1/2
input_tensor[i].properties.validShape.dimensionSize[1] /= 2;
input_tensor[i].properties.validShape.dimensionSize[2] /= 2;
}
// stride满足32对齐
input_tensor[i].properties.stride[1] =
ALIGN_32(input_tensor[i].properties.stride[2] *
input_tensor[i].properties.validShape.dimensionSize[2]);
input_tensor[i].properties.stride[0] =
input_tensor[i].properties.stride[1] *
input_tensor[i].properties.validShape.dimensionSize[1];
}
return 0;
}
// 准备roi输入tensor
int prepare_roi_tensor(const hbUCPSysMem *roi_mem, hbDNNHandle_t dnn_handle,
int32_t roi_tensor_id, hbDNNTensor *roi_tensor) {
HB_CHECK_SUCCESS(hbDNNGetInputTensorProperties(&roi_tensor->properties,
dnn_handle, roi_tensor_id),
"hbDNNGetInputTensorProperties failed");
roi_tensor->sysMem[0] = *roi_mem;
return 0;
}
int prepare_roi_mem(const std::vector<hbDNNRoi> &rois,
std::vector<hbUCPSysMem> &roi_mem) {
auto roi_size = rois.size();
roi_mem.resize(roi_size);
for (auto i = 0; i < roi_size; ++i) {
int32_t mem_size = 4 * sizeof(int32_t);
HB_CHECK_SUCCESS(hbUCPMallocCached(&roi_mem[i], mem_size, 0),
"hbUCPMallocCached failed");
int32_t *roi_data = reinterpret_cast<int32_t *>(roi_mem[i].virAddr);
roi_data[0] = rois[i].left;
roi_data[1] = rois[i].top;
roi_data[2] = rois[i].right;
roi_data[3] = rois[i].bottom;
hbUCPMemFlush(&roi_mem[i], HB_SYS_MEM_CACHE_CLEAN);
}
return 0;
}ucp_tutorial/dnn/basic_samples/code/02_advanced_samples/roi_infer/src/roi_infer.cc8.6 小模型批量处理功能
// 获取模型指针并存储
std::vector<hbDNNHandle_t> model_handles;
// 准备各个模型的输入输出,准备过程省略
std::vector<std::vector<hbDNNTensor>> inputs;
std::vector<std::vector<hbDNNTensor>> outputs;
// 创建任务并进行推理
{
// 创建并添加任务,复用task_handle
hbUCPTaskHandle_t task_handle{nullptr};
for(size_t task_id{0U}; task_id < inputs.size(); task_id++){
hbDNNInferV2(&task_handle, outputs[task_id].data(), inputs[task_id].data(), model_handles[i]);
}
// 提交任务
hbUCPSchedParam sche_param;
HB_UCP_INITIALIZE_SCHED_PARAM(&sche_param);
sche_param.backend = HB_UCP_BPU_CORE_ANY;
hbUCPSubmitTask(task_handle, &sche_param);
// 等待任务完成
hbUCPWaitTaskDone(task_handle, 0);
}8.7 优先级调度/抢占
hbUCPSchedParam 结构体进行配置,其中:priority > customId > submit\_time(任务提交时间)priority 支持 [0, 255],对于模型任务而言:max_time_per_fc 参数拆分模型指令8.8 X86 仿真
8.8.1 推理 quantized.bc
horizon_tc_ui 包封装的 HBRuntime 接口,具体可见用户手册《<u>训练后量化-PTQ 转换工具-HBRuntime 推理库</u>》,参考代码如下:import numpy as np
from horizon_tc_ui.hb_runtime import HBRuntime
sess = HBRuntime("quantized.bc")
input_names = sess.input_names
output_names = sess.output_names
data1 = np.load("input1.npy")
data2 = np.load("input2.npy")
input_feed = {input_names[0]: data1, input_names[1]: data2}
output = sess.run(output_names, input_feed)import numpy as np
from hbdk4.compiler import load
hbir = load("quantized.bc")
func = hbir[0]
data1 = np.load("input1.npy")
data2 = np.load("input2.npy")
input_feed = {inputs[0].name: data1, inputs[1].name: data2}
hbir_outputs = func.feed(input_feed)hrt_model_exec 工具对 quantized.bc 进行模型信息查看和单帧推理。8.8.2 推理 hbm
hbm_infer 工具以便用户在服务器端给直连的开发板下发推理任务。本文只介绍最简单的单进程使用方式,多进程、多阶段模型输入输出的传输优化,以及统计模型推理、网络传输耗时等功能请参考用户手册《<u>hbm\_infer 工具介绍</u>》。# hbm也可传入一个list,推理时通过指定model_name来选择推理哪个模型,推理所用的.so即可只传输一次
hbm_model = HbmRpcSession(
host="xx.xx.xx.xx",
local_hbm_path="xx.hbm",
)
# 打印模型输入输出信息
hbm_model.show_input_output_info()
# 准备输入数据
input_data = {
'img': torch.ones((1, 3, 224, 224), dtype=torch.int8)
}
# 执行推理并返回结果
# 若传入的是list,需要正确指定model_name
# output_data = hbm_model(input_data, model_name=model_name)
output_data = hbm_model(input_data)
print([output_data[k].shape for k in output_data])
# 关闭server
hbm_model.close_server()9.UCP 视觉处理/高性能算子
10.UCP 自定义算子(DSP)
int test_custom_op(void *input, void *output, void *tm) {
// custom impl
return 0;
}// dsp镜像中注册自定义算子
hb_dsp_register_fn(cmd, test_custom_op, latency)// 将输入输出的hbUCPSysMem映射为DSP可访问的内存地址
hbUCPSysMem in;
hbUCPMalloc(&in, in_size, 0)
hbDSPAddrMap(&in, &in)
hbUCPSysMem out;
hbUCPMalloc(&out, out_size, 0)
hbDSPAddrMap(&out, &out)
// 创建并提交DSP任务
hbUCPTaskHandle_t taskHandle{nullptr};
hbDSPRpcV2(&taskHandle, &in, &out, cmd)
hbUCPSchedParam ctrl_param;
HB_UCP_INITIALIZE_SCHED_PARAM(&ctrl_param);
ctrl_param.backend = HB_UCP_DSP_CORE_ANY;
hbUCPSubmitTask(task_handle, &ctrl_param);
// 等待任务完成
hbUCPWaitTaskDone(task_handle, 0);11.性能监测工具
hrt_ucp_monitor 工具去监测其硬件占用率(采样频率支持配置 [10, 1000],默认 500),并且能查看到 DDR 内存占用情况。
12.QNX 带来的功能裁剪
UCP 框架支持两种主要工作模式:直连模式、中继模式。系统默认运行在直连模式下,在中继模式下,UCP 将支持跨进程任务优先级的统一调度。但 QNX 上跨进程调度的模型性能较差,不满足使用需求,故功能移除。ucp_service 和 hrt_ucp_monitor。但鉴于 ucp_service 不支持,该功能也移除。
在AI时代,数据工程师和AI工程师的协作变得前所未有的重要。阿里云DLF产品负责人李鲁兵在本次分享中,详细介绍了全模态湖仓DLF 3.0的完整能力体系。这个平台不仅支持传统的结构化数据处理,更在业界首次实现了结构化、半结构化、非结构化数据的统一管理和处理,为Data+AI一体化提供了端到端的解决方案。 全模态湖仓管理平台的设计理念可以概括为四个关键词:数据统一、计算按需、工作流驱动、多方协作。在AI时代,数据工程师负责数据准备和预处理,AI工程师专注于模型训练、推理和召回,两个角色需要在统一的平台上无缝协作,这对平台能力提出了更高的要求。 数据统一是基础。传统的数据平台往往将结构化数据、半结构化数据、非结构化数据分别存储在不同系统中,造成数据孤岛和管理复杂度的急剧上升。DLF 3.0通过统一的Omni Catalog,实现了对Paimon、Iceberg、Lance、Format Table、Object Table等多种格式的统一管理。无论是传统的数据库表,还是文本、音频、图片、视频等多模态数据,都可以在同一套元数据目录中进行管理,Data工程师和AI工程师可以基于同一份数据进行协作。 计算按需是核心。不同的应用场景需要不同的计算引擎。实时分析需要Flink和Hologres,离线分析依赖Spark和MaxCompute,全模态检索要用到Milvus和Elasticsearch/OpenSearch,模型训练则需要PAI和Ray。DLF 3.0支持所有这些计算引擎在统一的湖仓之上按需调用,一份数据,多个引擎共享,避免了数据的重复存储和迁移。 工作流驱动是保障。数据处理和AI应用往往涉及多个步骤:数据摄取、预处理、特征工程、模型训练、推理、召回等。DLF 3.0提供了完整的工作流编排能力,数据工程师和AI工程师可以通过工作流将各个环节串联起来,实现端到端的自动化流程。 多方协作是目标。通过统一的IDE/Notebook开发环境、Copilot代码辅助、自然语言分析、Agent智能助手等能力,DLF 3.0降低了开发门槛,提升了协作效率。数据工程师和AI工程师可以在同一个平台上使用各自熟悉的工具,同时又能无缝共享数据和成果。 DLF 3.0的产品方案大图清晰地展示了从结构化数据处理到全模态处理的能力演进。在传统的数据处理链路上,我们有CDC/Batch Ingestion(数据摄取)、Stream/Batch ETL(数据加工)、OLAP Analytic(分析查询)三个主要环节,对应的计算引擎包括Flink、Spark、Hologres、StarRocks、MaxCompute等。 在全模态处理链路上,新增了四个关键环节:数据集管理、数据预处理、数据训练、数据推理、数据检索召回。这些环节分别对应不同的计算引擎:数据预处理可以使用MaxFrame和PySpark,模型训练依赖PAI和Ray,数据检索召回则需要Milvus和Elasticsearch/OpenSearch等搜索引擎。 两条链路并非孤立存在,而是通过统一的Omni Catalog和DLF元数据服务实现了深度融合。底层的Lakehouse Managed Storage Service提供了统一的存储层,支持Virtual File System、生命周期管理、冷热分层、存储优化等能力。数据缓存加速服务CPFS进一步提升了GPU/CPU的数据读取效率,为AI训练和推理提供了高性能保障。 DLF作为统一的湖仓管理平台,提供了Rest Catalog Service、Lakehouse SDK(Paimon、Iceberg)、File SDK、权限管理、血缘追踪、监控日志等完整的企业级能力。这种架构设计使得同一份数据可以同时服务于传统的数据分析场景和新兴的AI应用场景,真正实现了Data+AI一体化。 在全模态时代,元数据管理面临前所未有的挑战。传统的Catalog只需要管理Tables、Views、Functions等结构化对象,而在AI场景下,还需要管理各种文件(Files)、向量索引、Blob数据等非结构化对象。如果不同类型的数据使用不同的Catalog或System进行管理,就会产生新的数据孤岛,计算引擎需要跨不同的Catalog进行处理,大幅增加了复杂度。 DLF 3.0推出的Omni Catalog正是为了解决这一问题。它通过一套统一的元数据目录,同时管理Tables和Files,支持Paimon、Iceberg、Lance、Format Table(Parquet、ORC、Avro)、Object Table(Files)等多种格式。计算引擎无论是传统的大数据引擎(Flink、Spark、Hologres)还是新型的AI框架(Ray、PyTorch),都可以通过统一的Rest API、Open API、Paimon SDK、Iceberg SDK、VFS SDK进行数据访问。 Omni Catalog的核心优势在于降低了数据孤岛的风险。通过统一的目录,数据治理、权限控制、血缘追踪等能力可以覆盖所有类型的数据,而不需要在不同系统间切换。这对于企业级应用尤为重要,因为数据合规、安全审计等需求必须覆盖全域数据,而不能有盲区。 Paimon作为DLF 3.0的核心表格式,在全模态存储方面进行了深度创新。全模态存储面临三大核心需求:统一管理异构数据的能力、支持结构化和多模态数据的顺序访问(用于大规模批式推理)、提供高性能的标签和向量检索(支持随机访问)。 Paimon通过Row ID机制实现了对不同列、不同格式数据的统一管理。每一行数据都有一个全局唯一的Row ID,通过Row ID可以关联该行在不同文件格式中的存储位置。对于结构化数据,Paimon使用Parquet Files存储,对于向量数据,可以使用Lance Files或Faiss Vector索引,对于大型Blob数据(图片、音频、视频),则使用Paimon Blob格式。 在索引构建方面,Paimon提供了多种索引类型。Btree和Bitmap索引用于快速的标量查询,Invert倒排索引支持全文检索,Vector Index则提供高效的向量相似度搜索。这些索引通过Index Manifests进行统一管理,建立了字段与Row ID之间的映射关系。 在数据访问方面,Paimon通过Data Manifests管理文件组,支持Row Ranges范围扫描。对于顺序访问场景(如模型训练),Paimon可以将多条数据打包成Virtual File Group,提供高吞吐的批量读取。对于随机访问场景(如实时检索),Paimon通过全局索引实现了毫秒级的点查性能。 通过这种灵活的File Formats组合和统一的Table Format封装,Paimon实现了在一张宽表上承载结构化、半结构化、非结构化所有类型数据的目标,为全模态应用提供了坚实的存储基础。 DLF 3.0提供了完整的湖表管理和优化能力,通过智能化的方式提升读写性能、降低存储成本。整个优化体系包括四大核心能力:自适应分桶、智能Compaction、快照管理清理、存储服务与冷热分层。 自适应分桶是一项创新性功能。传统的分桶策略需要用户在建表时指定分桶数,但随着数据量的变化,固定的分桶数可能导致性能问题。DLF 3.0支持根据数据量自适应地调整分桶数(Rescale),用户只需指定分桶Key,平台会自动维护最优的分桶配置,大幅降低了管理负担。 智能Compaction是性能优化的关键。随着数据的不断写入,湖表会产生大量小文件,影响读取性能。DLF 3.0提供了多种Compaction策略:动态资源模式支持延时优先、资源优先、均衡模式三种策略,平台会根据当前资源状况自动调整Compaction节奏;固定资源模式则允许用户自定义资源配置和参数,实现精细化控制。对于全模态数据,DLF 3.0还支持针对不同文件类型(结构化、半结构化、非结构化)采用不同的Compaction策略,保证整体效率。 快照管理和清理功能帮助用户有效管理数据生命周期。用户可以基于分区或快照设置自动清理策略,平台还会自动扫描Orphan Files(孤儿文件)并清理,避免存储空间的浪费。同时支持手动触发管理操作,满足特殊场景需求。 整个优化流程由DLF元数据服务、Event Store事件存储、Paimon存储优化服务协同完成。作业生成引擎、规则优化引擎、智能优化引擎共同组成了智能决策层,作业调度管理则负责在多个计算资源池上高效执行Compaction任务。这种架构设计实现了从元数据到数据文件的全链路优化,用户无需关心底层细节,即可享受高性能和低成本的双重优势。 存储成本是企业在构建数据湖时的重要考量因素。DLF 3.0提供了智能的冷热分层能力,可以根据数据访问模式自动将数据在不同存储类型间迁移,在保证性能的同时大幅降低成本。 DLF 3.0支持四种存储类型:标准存储、低频存储、归档存储、冷归档存储。平台会根据数据的最近访问时间和最近更新时间,自动决定数据应该存储在哪个层级。对于频繁访问的热数据,保持在标准存储以保证高性能;对于访问频率降低的温数据,迁移到低频存储节省成本;对于长期不访问的冷数据,则可以归档到成本更低的归档存储或冷归档存储。 智能加热是冷热分层的重要补充功能。当归档的数据再次被访问时,平台会自动将其加热到更高性能的存储层级。加热策略支持Partition(分区)和File(文件)两层管理,可以针对分区级别或文件级别的访问进行精细化控制。这种设计既保证了数据访问的性能,又最大化地利用了低成本存储,实现了性能与成本的最佳平衡。 通过智能冷热分层,企业可以在不牺牲数据可用性的前提下,将长期存储成本降低数倍。对于PB级甚至EB级的数据湖,这种成本优化能力可以为企业节省大量资金,使得海量数据的长期保存成为可能。 企业级数据平台必须具备完善的权限控制和安全审计能力。DLF 3.0提供了从用户管理、权限控制到审计治理的全链路安全保障体系。 在用户管理方面,DLF 3.0原生支持阿里云RAM用户体系,基于用户和角色进行权限管理。用户可以通过Open API和REST API进行编程式的权限配置,也可以通过控制台进行可视化管理。 权限控制方面,DLF 3.0支持对湖表设置ACL细粒度权限,可以精确到Catalog、Database、Table、Column(列)甚至Row(行)级别。列级权限允许用户只访问特定的列,行级权限则通过WHERE条件和AND、OR等逻辑运算符,实现对特定行范围的访问控制。列Masking功能可以对敏感字段进行脱敏处理,保护数据隐私。 Data Sharing能力支持跨主账号的数据协作。企业可以将特定的数据集授权给合作伙伴或其他部门,实现安全可控的数据共享。权限检索功能帮助管理员快速了解数据的授权情况,权限委托和授权管理则提供了灵活的权限分级体系。 审计和治理方面,DLF 3.0全面记录所有操作日志,满足生产环境的合规要求。审计管理功能支持漏洞发现和安全治理,帮助企业及时发现和修复安全隐患。这套完整的安全体系,使得DLF 3.0可以满足金融、医疗、政务等高安全要求行业的需求。 实时化和全模态化是AI时代数据平台的两大刚需。DLF 3.0在这两个方向上都实现了业界领先的能力。 在实时湖仓方面,DLF 3.0基于Paimon实现了三大核心能力:流式更新、流式订阅、实时查询。数据可以通过Flink等流计算引擎不断流式更新到湖仓中,支持大规模的增量更新和部分列更新。下游系统可以通过流式订阅的方式实时消费变更日志(Changelog),构建实时数据链路。查询层面,Paimon的数据可以被StarRocks、Hologres等OLAP引擎实时查询,延迟可以达到秒级甚至亚秒级。 与业界的Iceberg和Delta相比,Paimon在流式更新场景下具有明显优势。Iceberg和Delta主要面向日志场景,Compaction代价高、速度慢,难以支撑大规模流式增量更新。而中国市场的实时需求走在世界前列,Paimon正是为此而生,通过排序和文件组织优化,大幅降低了Compaction成本,实现了ODS、DWD、DWS全链路的实时更新。 在全模态处理方面,DLF 3.0提供了完整的多模态宽表能力。一张Paimon表可以同时存储id、url、vectors(向量)、labels(标签)、summary(文本摘要)、blobs(大型二进制对象)、meta(元数据)、json(半结构化数据)等多种类型的字段,避免了多表查询和治理负担。统一的存储底层使得数据工程师和AI工程师可以基于同一张表协作,通过高效的索引机制支持向量检索、全文检索、分析查询、模型推理、训练等多种应用场景。 DLF 3.0已经在多个典型场景中得到了验证。在离线实时一体化湖仓场景中,通过Flink CDC实现数据库的实时摄取,支持Schema Evolution和整库同步,分钟级实时可查询。Flink在Paimon上进行流读流写,实现全链路实时湖仓,支持低成本的去重和部分列更新。Spark提供数仓级别的批处理性能,支持Filter/Min/Max/TopN/Limit等算子下推和Native计算加速。StarRocks和Hologres则通过Manifests缓存、删除向量、文件过滤等优化技术,实现了对Paimon湖表的极速查询,性能可以对标内表。 在全模态数据管理和处理场景中,音频、文本、图片、视频等多模态数据通过统一的采集入湖,经过Spark或Ray进行预处理(如文本Chunking、Embedding等),将结构化标签、向量、Blob数据统一存储在一张Paimon表中。AI工程师可以通过Milvus或StarRocks进行向量检索和标量过滤,实现样本圈选和预览。PyPaimon直接对接Ray和PyTorch,支持数据加载和模型训练,整个流程端到端打通,数据无需跨系统迁移。 在客户案例方面,智能汽车向量湖是一个典型应用。自动驾驶场景产生海量的车载数据、地理信息、雷达数据、视频图片等多模态数据。通过DLF 3.0,这些数据统一采集并通过人工或机器打标生成Labels,经过预处理将图片、视频拆解为目标对象,再通过Embedding生成向量。Labels和向量数据构建成统一的向量湖,支持标量+向量混合检索召回,可以快速找到符合特定条件的数据样本,用于AI模型的迭代训练。整个方案实现了从数据采集到推理到检索的完整Pipeline,百亿级数据规模的混合检索性能表现优异。 阿里巴巴集团内部的全模态湖也是重要实践。基于Paimon Blob字段,集团构建了EB级的多模态混合存储,支持视频、音频、图片等大型文件的高效管理。通过顺序读高吞吐的数据加载能力,GPU的数据利用率提升了10%,这对于大规模AI训练具有巨大的成本节省价值。这些真实案例充分验证了DLF 3.0全模态湖仓方案的技术先进性和商业价值。 DLF产品已于2025年正式商业化,现在提供免费试用机会。阿里云还建立了DLF钉钉交流群(群号:106575000021),欢迎用户加入进行技术交流和问题反馈。 全模态湖仓代表了大数据和AI结合发展的下一阶段重要方向。随着多模态AI应用的普及,企业对统一管理和处理异构数据的需求将越来越强烈。DLF 3.0通过开放的架构、强大的性能、完善的企业级能力,为客户提供了一个面向未来的数据平台选择。无论是传统的大数据分析场景,还是新兴的AI训练推理场景,DLF 3.0都可以提供端到端的支持,帮助企业在AI时代保持竞争力。▌导读
▌全模态平台的核心理念:数据统一、计算按需、工作流驱动

▌产品方案大图:从结构化到全模态的能力升级

▌Omni Catalog:全模态管理的统一目录

▌DLF提供商业化Paimon全模态存储:统一管理异构数据

▌DLF湖表管理与优化:智能化提升性能降低成本

▌智能冷热分层:大幅降低存储成本

▌细粒度权限控制:企业级安全保障

▌实时湖仓与全模态处理:AI时代的两大刚需


DLF 3.0还对接了主流的大数据处理和AI预处理框架,包括Spark、Flink、Ray、PyTorch等,提供了PyPaimon等Python原生接口,使得AI工程师可以像操作本地文件一样便捷地访问湖上数据。相比业界的LanceDB等方案,DLF 3.0具有生态丰富、统一性强、工业级验证等优势,已经在阿里巴巴集团和众多外部客户中大规模落地。▌典型场景与客户案例:从理论到实践



▌产品商业化与生态建设
在AI时代,数据工程师和AI工程师的协作变得前所未有的重要。阿里云DLF产品负责人李鲁兵在本次分享中,详细介绍了全模态湖仓DLF 3.0的完整能力体系。这个平台不仅支持传统的结构化数据处理,更在业界首次实现了结构化、半结构化、非结构化数据的统一管理和处理,为Data+AI一体化提供了端到端的解决方案。 全模态湖仓管理平台的设计理念可以概括为四个关键词:数据统一、计算按需、工作流驱动、多方协作。在AI时代,数据工程师负责数据准备和预处理,AI工程师专注于模型训练、推理和召回,两个角色需要在统一的平台上无缝协作,这对平台能力提出了更高的要求。 数据统一是基础。传统的数据平台往往将结构化数据、半结构化数据、非结构化数据分别存储在不同系统中,造成数据孤岛和管理复杂度的急剧上升。DLF 3.0通过统一的Omni Catalog,实现了对Paimon、Iceberg、Lance、Format Table、Object Table等多种格式的统一管理。无论是传统的数据库表,还是文本、音频、图片、视频等多模态数据,都可以在同一套元数据目录中进行管理,Data工程师和AI工程师可以基于同一份数据进行协作。 计算按需是核心。不同的应用场景需要不同的计算引擎。实时分析需要Flink和Hologres,离线分析依赖Spark和MaxCompute,全模态检索要用到Milvus和Elasticsearch/OpenSearch,模型训练则需要PAI和Ray。DLF 3.0支持所有这些计算引擎在统一的湖仓之上按需调用,一份数据,多个引擎共享,避免了数据的重复存储和迁移。 工作流驱动是保障。数据处理和AI应用往往涉及多个步骤:数据摄取、预处理、特征工程、模型训练、推理、召回等。DLF 3.0提供了完整的工作流编排能力,数据工程师和AI工程师可以通过工作流将各个环节串联起来,实现端到端的自动化流程。 多方协作是目标。通过统一的IDE/Notebook开发环境、Copilot代码辅助、自然语言分析、Agent智能助手等能力,DLF 3.0降低了开发门槛,提升了协作效率。数据工程师和AI工程师可以在同一个平台上使用各自熟悉的工具,同时又能无缝共享数据和成果。 DLF 3.0的产品方案大图清晰地展示了从结构化数据处理到全模态处理的能力演进。在传统的数据处理链路上,我们有CDC/Batch Ingestion(数据摄取)、Stream/Batch ETL(数据加工)、OLAP Analytic(分析查询)三个主要环节,对应的计算引擎包括Flink、Spark、Hologres、StarRocks、MaxCompute等。 在全模态处理链路上,新增了四个关键环节:数据集管理、数据预处理、数据训练、数据推理、数据检索召回。这些环节分别对应不同的计算引擎:数据预处理可以使用MaxFrame和PySpark,模型训练依赖PAI和Ray,数据检索召回则需要Milvus和Elasticsearch/OpenSearch等搜索引擎。 两条链路并非孤立存在,而是通过统一的Omni Catalog和DLF元数据服务实现了深度融合。底层的Lakehouse Managed Storage Service提供了统一的存储层,支持Virtual File System、生命周期管理、冷热分层、存储优化等能力。数据缓存加速服务CPFS进一步提升了GPU/CPU的数据读取效率,为AI训练和推理提供了高性能保障。 DLF作为统一的湖仓管理平台,提供了Rest Catalog Service、Lakehouse SDK(Paimon、Iceberg)、File SDK、权限管理、血缘追踪、监控日志等完整的企业级能力。这种架构设计使得同一份数据可以同时服务于传统的数据分析场景和新兴的AI应用场景,真正实现了Data+AI一体化。 在全模态时代,元数据管理面临前所未有的挑战。传统的Catalog只需要管理Tables、Views、Functions等结构化对象,而在AI场景下,还需要管理各种文件(Files)、向量索引、Blob数据等非结构化对象。如果不同类型的数据使用不同的Catalog或System进行管理,就会产生新的数据孤岛,计算引擎需要跨不同的Catalog进行处理,大幅增加了复杂度。 DLF 3.0推出的Omni Catalog正是为了解决这一问题。它通过一套统一的元数据目录,同时管理Tables和Files,支持Paimon、Iceberg、Lance、Format Table(Parquet、ORC、Avro)、Object Table(Files)等多种格式。计算引擎无论是传统的大数据引擎(Flink、Spark、Hologres)还是新型的AI框架(Ray、PyTorch),都可以通过统一的Rest API、Open API、Paimon SDK、Iceberg SDK、VFS SDK进行数据访问。 Omni Catalog的核心优势在于降低了数据孤岛的风险。通过统一的目录,数据治理、权限控制、血缘追踪等能力可以覆盖所有类型的数据,而不需要在不同系统间切换。这对于企业级应用尤为重要,因为数据合规、安全审计等需求必须覆盖全域数据,而不能有盲区。 Paimon作为DLF 3.0的核心表格式,在全模态存储方面进行了深度创新。全模态存储面临三大核心需求:统一管理异构数据的能力、支持结构化和多模态数据的顺序访问(用于大规模批式推理)、提供高性能的标签和向量检索(支持随机访问)。 Paimon通过Row ID机制实现了对不同列、不同格式数据的统一管理。每一行数据都有一个全局唯一的Row ID,通过Row ID可以关联该行在不同文件格式中的存储位置。对于结构化数据,Paimon使用Parquet Files存储,对于向量数据,可以使用Lance Files或Faiss Vector索引,对于大型Blob数据(图片、音频、视频),则使用Paimon Blob格式。 在索引构建方面,Paimon提供了多种索引类型。Btree和Bitmap索引用于快速的标量查询,Invert倒排索引支持全文检索,Vector Index则提供高效的向量相似度搜索。这些索引通过Index Manifests进行统一管理,建立了字段与Row ID之间的映射关系。 在数据访问方面,Paimon通过Data Manifests管理文件组,支持Row Ranges范围扫描。对于顺序访问场景(如模型训练),Paimon可以将多条数据打包成Virtual File Group,提供高吞吐的批量读取。对于随机访问场景(如实时检索),Paimon通过全局索引实现了毫秒级的点查性能。 通过这种灵活的File Formats组合和统一的Table Format封装,Paimon实现了在一张宽表上承载结构化、半结构化、非结构化所有类型数据的目标,为全模态应用提供了坚实的存储基础。 DLF 3.0提供了完整的湖表管理和优化能力,通过智能化的方式提升读写性能、降低存储成本。整个优化体系包括四大核心能力:自适应分桶、智能Compaction、快照管理清理、存储服务与冷热分层。 自适应分桶是一项创新性功能。传统的分桶策略需要用户在建表时指定分桶数,但随着数据量的变化,固定的分桶数可能导致性能问题。DLF 3.0支持根据数据量自适应地调整分桶数(Rescale),用户只需指定分桶Key,平台会自动维护最优的分桶配置,大幅降低了管理负担。 智能Compaction是性能优化的关键。随着数据的不断写入,湖表会产生大量小文件,影响读取性能。DLF 3.0提供了多种Compaction策略:动态资源模式支持延时优先、资源优先、均衡模式三种策略,平台会根据当前资源状况自动调整Compaction节奏;固定资源模式则允许用户自定义资源配置和参数,实现精细化控制。对于全模态数据,DLF 3.0还支持针对不同文件类型(结构化、半结构化、非结构化)采用不同的Compaction策略,保证整体效率。 快照管理和清理功能帮助用户有效管理数据生命周期。用户可以基于分区或快照设置自动清理策略,平台还会自动扫描Orphan Files(孤儿文件)并清理,避免存储空间的浪费。同时支持手动触发管理操作,满足特殊场景需求。 整个优化流程由DLF元数据服务、Event Store事件存储、Paimon存储优化服务协同完成。作业生成引擎、规则优化引擎、智能优化引擎共同组成了智能决策层,作业调度管理则负责在多个计算资源池上高效执行Compaction任务。这种架构设计实现了从元数据到数据文件的全链路优化,用户无需关心底层细节,即可享受高性能和低成本的双重优势。 存储成本是企业在构建数据湖时的重要考量因素。DLF 3.0提供了智能的冷热分层能力,可以根据数据访问模式自动将数据在不同存储类型间迁移,在保证性能的同时大幅降低成本。 DLF 3.0支持四种存储类型:标准存储、低频存储、归档存储、冷归档存储。平台会根据数据的最近访问时间和最近更新时间,自动决定数据应该存储在哪个层级。对于频繁访问的热数据,保持在标准存储以保证高性能;对于访问频率降低的温数据,迁移到低频存储节省成本;对于长期不访问的冷数据,则可以归档到成本更低的归档存储或冷归档存储。 智能加热是冷热分层的重要补充功能。当归档的数据再次被访问时,平台会自动将其加热到更高性能的存储层级。加热策略支持Partition(分区)和File(文件)两层管理,可以针对分区级别或文件级别的访问进行精细化控制。这种设计既保证了数据访问的性能,又最大化地利用了低成本存储,实现了性能与成本的最佳平衡。 通过智能冷热分层,企业可以在不牺牲数据可用性的前提下,将长期存储成本降低数倍。对于PB级甚至EB级的数据湖,这种成本优化能力可以为企业节省大量资金,使得海量数据的长期保存成为可能。 企业级数据平台必须具备完善的权限控制和安全审计能力。DLF 3.0提供了从用户管理、权限控制到审计治理的全链路安全保障体系。 在用户管理方面,DLF 3.0原生支持阿里云RAM用户体系,基于用户和角色进行权限管理。用户可以通过Open API和REST API进行编程式的权限配置,也可以通过控制台进行可视化管理。 权限控制方面,DLF 3.0支持对湖表设置ACL细粒度权限,可以精确到Catalog、Database、Table、Column(列)甚至Row(行)级别。列级权限允许用户只访问特定的列,行级权限则通过WHERE条件和AND、OR等逻辑运算符,实现对特定行范围的访问控制。列Masking功能可以对敏感字段进行脱敏处理,保护数据隐私。 Data Sharing能力支持跨主账号的数据协作。企业可以将特定的数据集授权给合作伙伴或其他部门,实现安全可控的数据共享。权限检索功能帮助管理员快速了解数据的授权情况,权限委托和授权管理则提供了灵活的权限分级体系。 审计和治理方面,DLF 3.0全面记录所有操作日志,满足生产环境的合规要求。审计管理功能支持漏洞发现和安全治理,帮助企业及时发现和修复安全隐患。这套完整的安全体系,使得DLF 3.0可以满足金融、医疗、政务等高安全要求行业的需求。 实时化和全模态化是AI时代数据平台的两大刚需。DLF 3.0在这两个方向上都实现了业界领先的能力。 在实时湖仓方面,DLF 3.0基于Paimon实现了三大核心能力:流式更新、流式订阅、实时查询。数据可以通过Flink等流计算引擎不断流式更新到湖仓中,支持大规模的增量更新和部分列更新。下游系统可以通过流式订阅的方式实时消费变更日志(Changelog),构建实时数据链路。查询层面,Paimon的数据可以被StarRocks、Hologres等OLAP引擎实时查询,延迟可以达到秒级甚至亚秒级。 与业界的Iceberg和Delta相比,Paimon在流式更新场景下具有明显优势。Iceberg和Delta主要面向日志场景,Compaction代价高、速度慢,难以支撑大规模流式增量更新。而中国市场的实时需求走在世界前列,Paimon正是为此而生,通过排序和文件组织优化,大幅降低了Compaction成本,实现了ODS、DWD、DWS全链路的实时更新。 在全模态处理方面,DLF 3.0提供了完整的多模态宽表能力。一张Paimon表可以同时存储id、url、vectors(向量)、labels(标签)、summary(文本摘要)、blobs(大型二进制对象)、meta(元数据)、json(半结构化数据)等多种类型的字段,避免了多表查询和治理负担。统一的存储底层使得数据工程师和AI工程师可以基于同一张表协作,通过高效的索引机制支持向量检索、全文检索、分析查询、模型推理、训练等多种应用场景。 DLF 3.0已经在多个典型场景中得到了验证。在离线实时一体化湖仓场景中,通过Flink CDC实现数据库的实时摄取,支持Schema Evolution和整库同步,分钟级实时可查询。Flink在Paimon上进行流读流写,实现全链路实时湖仓,支持低成本的去重和部分列更新。Spark提供数仓级别的批处理性能,支持Filter/Min/Max/TopN/Limit等算子下推和Native计算加速。StarRocks和Hologres则通过Manifests缓存、删除向量、文件过滤等优化技术,实现了对Paimon湖表的极速查询,性能可以对标内表。 在全模态数据管理和处理场景中,音频、文本、图片、视频等多模态数据通过统一的采集入湖,经过Spark或Ray进行预处理(如文本Chunking、Embedding等),将结构化标签、向量、Blob数据统一存储在一张Paimon表中。AI工程师可以通过Milvus或StarRocks进行向量检索和标量过滤,实现样本圈选和预览。PyPaimon直接对接Ray和PyTorch,支持数据加载和模型训练,整个流程端到端打通,数据无需跨系统迁移。 在客户案例方面,智能汽车向量湖是一个典型应用。自动驾驶场景产生海量的车载数据、地理信息、雷达数据、视频图片等多模态数据。通过DLF 3.0,这些数据统一采集并通过人工或机器打标生成Labels,经过预处理将图片、视频拆解为目标对象,再通过Embedding生成向量。Labels和向量数据构建成统一的向量湖,支持标量+向量混合检索召回,可以快速找到符合特定条件的数据样本,用于AI模型的迭代训练。整个方案实现了从数据采集到推理到检索的完整Pipeline,百亿级数据规模的混合检索性能表现优异。 阿里巴巴集团内部的全模态湖也是重要实践。基于Paimon Blob字段,集团构建了EB级的多模态混合存储,支持视频、音频、图片等大型文件的高效管理。通过顺序读高吞吐的数据加载能力,GPU的数据利用率提升了10%,这对于大规模AI训练具有巨大的成本节省价值。这些真实案例充分验证了DLF 3.0全模态湖仓方案的技术先进性和商业价值。 DLF产品已于2025年正式商业化,现在提供免费试用机会。阿里云还建立了DLF钉钉交流群(群号:106575000021),欢迎用户加入进行技术交流和问题反馈。 全模态湖仓代表了大数据和AI结合发展的下一阶段重要方向。随着多模态AI应用的普及,企业对统一管理和处理异构数据的需求将越来越强烈。DLF 3.0通过开放的架构、强大的性能、完善的企业级能力,为客户提供了一个面向未来的数据平台选择。无论是传统的大数据分析场景,还是新兴的AI训练推理场景,DLF 3.0都可以提供端到端的支持,帮助企业在AI时代保持竞争力。▌导读
▌全模态平台的核心理念:数据统一、计算按需、工作流驱动

▌产品方案大图:从结构化到全模态的能力升级

▌Omni Catalog:全模态管理的统一目录

▌DLF提供商业化Paimon全模态存储:统一管理异构数据

▌DLF湖表管理与优化:智能化提升性能降低成本

▌智能冷热分层:大幅降低存储成本

▌细粒度权限控制:企业级安全保障

▌实时湖仓与全模态处理:AI时代的两大刚需


DLF 3.0还对接了主流的大数据处理和AI预处理框架,包括Spark、Flink、Ray、PyTorch等,提供了PyPaimon等Python原生接口,使得AI工程师可以像操作本地文件一样便捷地访问湖上数据。相比业界的LanceDB等方案,DLF 3.0具有生态丰富、统一性强、工业级验证等优势,已经在阿里巴巴集团和众多外部客户中大规模落地。▌典型场景与客户案例:从理论到实践



▌产品商业化与生态建设
很多学 PHP 或者本地调试网站的人都用它,安装不难,下面用大白话一步步说。 下载安装包 用管理员身份运行(推荐) 选安装位置: 附加任务: 启动服务: 访问本地站点: 放网站文件: 切换 PHP 版本: PhpStudy2018是个集成环境包,把 Apache、MySQL、PHP 这些搞网站开发的东西打包在一起,装完就能在本机跑 PHP 网站,省得一个个单独装。一、准备工作
PhpStudy2018.exe→ 选“以管理员身份运行”,避免端口占用或权限问题。二、安装步骤
PhpStudy2018.exe运行(如果右键过了就直接双击)。C:\phpStudy,可点“浏览”改到其他盘,然后点 “下一步” 。三、首次运行与基本使用
http://localhost或 http://127.0.0.1,能看到 PhpStudy 欢迎页就说明 OK。C:\phpStudy\WWW,把自己的 PHP 文件丢进去就能访问。
在制造业数字化转型的浪潮中,客户关系管理(CRM)系统已成为提升运营效率、优化客户体验、驱动业务增长的核心工具。然而,面对市场上琳琅满目的CRM产品,制造企业往往陷入选择困境:是选用通用型CRM,还是深耕行业的垂直解决方案? 本文将基于当前市场情况,深入剖析五款制造业垂直领域CRM,分析其核心优势与潜在风险,并为您的选型决策提供可靠建议。 与零售、金融等行业不同,制造业的CRM需求具有显著特点: 这些特点决定了制造业需要的不只是客户信息管理工具,而是能够融入业务流程、连接前后端的行业化解决方案。 简介: 核心优势: 风险提示: 简介: 核心优势: 风险提示: 简介: 核心优势: 风险提示: 简介: 核心优势: 风险提示: 简介: 核心优势: 风险提示: 基于以上分析,我们建议制造企业从以下五个维度评估CRM厂商: 第一步:明确核心需求优先级 第二步:划分预算与部署时间线 第三步:要求针对性产品演示 第四步:深入考察客户案例 第五步:从试点开始,分阶段推广 第六步:规划长期合作关系 随着工业4.0和智能制造的发展,制造业CRM正呈现以下趋势: 选择制造业CRM是一场战略决策,而非单纯的技术采购。最适合的CRM系统应当像精密的制造设备一样,精准适配您的业务流程,无缝融入您的运营体系,并具备随着业务演进而升级的灵活性。 国内制造企业特别是中小企业,可重点关注如八骏科技这样深耕行业的本土厂商,它们在性价比、本土化适配和快速响应方面具有独特优势;而跨国企业或大型集团则需综合评估全球部署能力与本地合规要求,在SAP、Salesforce等国际平台与国内解决方案间找到平衡点。 无论选择哪家厂商,记住:成功的CRM实施=适合的产品+专业的实施+持续的优化+用户的接纳。从这个等式出发,结合企业实际情况,您一定能找到推动制造业数字化转型的那把钥匙。一、制造业CRM选型的特殊考量
二、五款制造业垂直领域CRM深度解析
1. 八骏科技CRM(制造业专项版)
杭州八骏科技有限公司专注于为制造业提供CRM解决方案,其产品围绕制造业销售与服务场景深度定制,在国内制造业中拥有相当规模的客户基础。2. Salesforce Manufacturing Cloud
作为全球CRM领导者,Salesforce针对制造业推出的垂直解决方案,整合了其强大的平台能力和丰富的生态系统。3. Microsoft Dynamics 365 for Manufacturing
微软将CRM与ERP能力融合的行业解决方案,特别适合已使用微软技术栈的制造企业。4. SAP CRM for Manufacturing
SAP作为制造业ERP的巨头,其CRM解决方案天然适合已使用SAP ERP系统的制造企业。5. 用友制造CRM
用友作为国内企业服务龙头,其制造CRM解决方案深度结合国内制造业特点,尤其适合国有企业和大型民营企业。三、制造业CRM选型的五个关键维度
1. 行业匹配度
2. 系统集成能力
3. 总拥有成本(TCO)
4. 扩展与适应性
5. 供应商生态与可持续性
四、给制造业企业的选型建议
制造企业应首先梳理自身最迫切的3-5个业务痛点,例如:
根据企业规模和数字化阶段确定合理预算,并设定可行的上线时间表。中小制造企业可考虑八骏科技、用友等国内厂商的标准化方案;大型集团则需评估SAP、Salesforce等平台的综合能力。
不要满足于通用功能展示,要求厂商基于您的实际业务流程进行演示,特别是:
不仅要看成功案例,更要了解类似企业在实施中遇到的挑战及解决方案。如果可能,拜访已上线企业的实际使用部门。
选择1-2个业务单元或区域先行试点,验证系统实际效果后再全面推广,降低实施风险。
CRM实施不是一次性项目,而是持续优化过程。选择那些愿意与企业共同成长、提供持续优化服务的厂商。五、未来趋势:制造业CRM的演进方向
结语
我刚注册了域名 👉 https://jianzhan.la
名字很直白:建站啦 / 快速建站 / 一键建站
但具体做什么,还在犹豫中。
如果是你,你会用 jianzhan.la 来做什么?
不限方向:
一句话、一个点子也可以,重在想法。
想法:xxxx
微信/ 收款码:xxxx
坐等各位的好点子 👀
有靠谱方案,这个域名我就真干了。