拆解fenic内部架构:从逻辑计划、查询优化到Rust加速执行的源码级导读 【免费下载链接】fenicSemantic DataFrames for humans and agents项目地址https://gitcode.com/gh_mirrors/fe/fenic点击查看免费下载fenic 是一个面向人类和 AI Agent 的语义 DataFrame 查询引擎把extract、classify、semantic join等 LLM 算子直接构建进查询模型。本文带你深入其源码逐一拆解逻辑计划、查询优化、物理执行与 Rust 加速执行四大核心环节看清一行 DataFrame 流水线是如何被规划、优化并最终跑起来的。如果你写过 PySpark 或 Polarsfenic 的架构会让你感到亲切API 层 → 逻辑计划 → 优化器 → 物理计划 → 执行引擎这是经典查询引擎的分层套路不同之处在于fenic 把 LLM 调用也当成了一等公民围绕它设计了专门的优化规则与推理基础设施。fenic 整体架构四层管线一张图从 README.md 的定义出发fenic 的核心链路可以浓缩为四条管线层级目录职责API 层src/fenic/api/DataFrame / Session 接口select、filter、explain等入口逻辑层src/fenic/core/_logical_plan/构建可检查的计划树 类型校验 逻辑优化物理层src/fenic/_backends/local/转译为 Polars 算子树并执行管理缓存与指标加速层rust/Rust 编写的 Polars 插件文本切块、字幕解析、Markdown 转换等一个有意思的设计同一套逻辑计划还能序列化成 Protobuf 字节流见 src/fenic/core/_serde/README.md这意味着流水线本身是可传输、可复用的工件而不只是内存里的临时对象。逻辑计划把查询构建成一棵可检查的计划树fenic 里的每一个select、filter都不会立即执行而是往一棵树上加节点。树的节点基类在 plans/base.py有三个关键机制值得新手注意构建即校验LogicalPlan初始化时就调用_build_schema()推导输出 schema并拒绝重名列。也就是说类型错误在计划构建期就报错而不是执行时才崩缓存标记每个节点携带cache_infoexplain输出里会显示(cachedtrue)惰性表示节点通过children()/with_children()递归组织__str__递归缩进打印——这正是df.explain()能画出整棵计划树的原因见 dataframe.py。计划节点按职责分为五类定义在 plans/ 目录节点类型代表类说明数据源InMemorySource、FileSource、TableSource数据从哪来转换Projection、Filter、Sort、Limit单输入的行/列变换连接Join、SemanticJoin含基于语义的语义连接聚合Aggregategroup_byagg输出FileSink、TableSink结果写回哪里而语义能力则藏在表达式里expressions/semantic.py 中的SemanticMapExpr、SemanticExtractExpr等继承自SemanticExpr在 signatures/ 的签名校验器约束下保证对非字符串列做semantic.map这类错误在构建期就被拦截。tickets df.select(id, fc.semantic.extract(text, Ticket).alias(t)).unnest(t) tickets.explain() # 打印优化后的逻辑计划树查询优化三条为你省 LLM 调用费的优化规则fenic 的逻辑优化器位于 optimizer/框架极简optimizer/base.py 定义抽象规则LogicalPlanOptimizerRuleLogicalPlanOptimizer按顺序依次套用所有规则。真正有含金量的有三条规则一MergeFiltersRule —— 合并相邻过滤连续两个filter会被合并成一个AND谓词merge_filters_rule.py为下一条规则创造改写空间。规则二SemanticFilterRewriteRule —— 便宜的判断先跑这是 fenic 最有特色的规则。semantic_filter_rewrite_rule.py 的文档注释写得很直白把AND条件拆解重排让不涉及 LLM 的普通谓词先执行LLM 谓词按调用数量从少到多排序靠后执行。LLM 是最贵的操作能先用便宜的过滤条件把行数砍下来就省下真金白银的 token。规则三NotFilterPushdownRule —— 过滤下推把NOT条件向数据源方向下推减少无效行向上传播——经典查询优化器思路在语义场景的复用。从逻辑计划到物理执行转译器与算子树逻辑计划不会直接执行。transpiler/plan_converter.py 中的PlanConverter负责把每个逻辑节点转译成对应的物理算子如Filter→FilterExec、SemanticJoin→SemanticJoinExec同时把LogicalExpr转成 Polars 表达式。物理算子基类在 physical_plan/base.pyexecute()方法做了四件大事查缓存有cache_info且已缓存则直接读结果递归执行子节点并汇总每层指标记录算子级指标输出行数、耗时、LM/RM 用量写缓存中间结果落盘供后续查询复用。物理计划也有自己的优化器merge_duckdb_nodes.py 会把相邻的 DuckDB 算子融合成MergedDuckDBExec让 DuckDB 自己的 planner 接管子树内部的融合优化——外层引擎只看到边界内层交给更专业的引擎这是混合引擎架构的精髓。执行入口 execution.py 中的LocalExecution负责collect/show/count还能从物理计划构建行级血缘图build_lineage支撑lineage()API 的逐行追踪。Rust 加速执行把计算密集型环节交给原生代码fenic 的纯计算环节文本切块、字幕解析、格式转换写在 rust/ 里以Polars 插件形式暴露。Rust 侧模块一览lib.rsRust 模块能力chunking/递归文本切块 count_tokenstoken 计数transcript/SRT / WebVTT / 通用字幕解析为统一结构化 Schemamarkdown_json/Markdown 与 JSON 互转基于 JSON Schemajson/jq 查询验证与执行jinja/Jinja 模板渲染dtypes/ / regex/类型转换、正则验证以字幕解析为例rust/src/transcript/mod.rs 用#[polars_expr]宏把 Rust 函数注册为 Polars 表达式任何格式的字幕都会被解析成含speaker、start_time、end_time、content的统一结构列。Python 侧则通过 polars_plugins/transcripts.py 的register_plugin_function完成桥接用户只需写pl.col(raw).transcript.parse(formatsrt)。上图是仓库测试资产中的标准图片正是 tests/conftest.py 生成 PDF 测试文档时嵌入的素材——PDF 解析算子semantic.parse_pdf的测试链路就围绕这类图片资产展开。Protobuf 序列化让流水线成为可移植工件逻辑计划不仅是内存对象还能序列化为跨语言字节流。protos/logical_plan/v1/ 定义了plans.proto、expressions.proto、datatypes.proto等协议生成的 Python 代码位于 src/fenic/_gen/protos/。序列化系统src/fenic/core/_serde/采用singledispatch按类型自动路由ProtoSerde.serialize(plan)一行即可把整棵计划树压成字节反序列化时精确还原。详细的扩展指南如何新增一个可序列化的表达式写在 core/_serde/README.md是贡献者必读文档。推理层src/fenic/_inference/则负责 OpenAI / Anthropic / Google / Cohere 等供应商的统一接入内置批量请求、限流策略rate_limit_strategy.py、token 计量与响应缓存——物理算子里那些 LM 指标的源头。源码导读路线建议的 5 步阅读顺序从 README.md 的 60 秒示例建立整体印象读 plans/base.py 和 expressions/base.py理解计划 带 schema 的树读 optimizer/ 三条规则重点体会SemanticFilterRewriteRule如何为 LLM 成本服务读 physical_plan/base.py 的execute()掌握缓存 指标 递归执行三件套挑一个 rust/ 模块推荐chunking通读理解 Polars 插件桥接机制。配套测试同样值得翻tests/_logical_plan/ 覆盖计划等值与 serde 往返tests/_backends/local/ 覆盖执行细节。小结fenic 的架构可以一句话概括用经典查询引擎的分层骨架逻辑计划 → 优化 → 物理执行承载 LLM 这一新的高成本算子并用专门的优化规则、缓存、指标与 Rust 加速让它变得可检查、可复用、可负担。理解这套源码后你再去看任何AI DataFrame类项目都会多一双识图的眼睛。赞分享【免费下载链接】fenicSemantic DataFrames for humans and agents项目地址https://gitcode.com/gh_mirrors/fe/fenic点击查看免费下载相关推荐Databend查询优化器从逻辑计划到物理执行的全流程解析Databend查询优化器从逻辑计划到物理执行的全流程解析 在数据仓库系统中查询优化器Optimizer扮演着智能大脑的角色负责将用户输入的SQL数据库数据分析向量数据库全文检索云原生AI 应用OctoSQL查询优化器原理从逻辑计划到物理执行的转换过程OctoSQL查询优化器原理从逻辑计划到物理执行的转换过程 OctoSQL是一个强大的SQL查询引擎它允许您对存储在多个SQL数据库、NoSQL数据库和各种数据分析数据集成CLI流处理数据工程如何永久免费使用IDM下载器激活脚本完整指南如何永久免费使用IDM下载器激活脚本完整指南 你是否正在寻找一种安全、可靠的方法来永久免费使用Internet Download ManagerIDMICLI开发工具上一篇BentoPDF 自托管基于 Apache HTTP Server 的完整部署与多语言路由配置指南下一篇Selective Brain Damage 复现指南用 pruning_identified_exemplars 量化模型剪枝对类别与样本的差异化影响创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考