惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

阮一峰的网络日志
阮一峰的网络日志
Scott Helme
Scott Helme
P
Proofpoint News Feed
T
Threat Research - Cisco Blogs
C
CERT Recently Published Vulnerability Notes
P
Privacy & Cybersecurity Law Blog
云风的 BLOG
云风的 BLOG
V
Visual Studio Blog
Martin Fowler
Martin Fowler
Cisco Talos Blog
Cisco Talos Blog
罗磊的独立博客
MyScale Blog
MyScale Blog
博客园 - 【当耐特】
L
LangChain Blog
AWS News Blog
AWS News Blog
Security Latest
Security Latest
C
CXSECURITY Database RSS Feed - CXSecurity.com
P
Proofpoint News Feed
T
True Tiger Recordings
aimingoo的专栏
aimingoo的专栏
宝玉的分享
宝玉的分享
月光博客
月光博客
The Hacker News
The Hacker News
L
Lohrmann on Cybersecurity
The GitHub Blog
The GitHub Blog
Stack Overflow Blog
Stack Overflow Blog
S
SegmentFault 最新的问题
Recorded Future
Recorded Future
S
Security Archives - TechRepublic
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
WordPress大学
WordPress大学
Y
Y Combinator Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
大猫的无限游戏
大猫的无限游戏
Apple Machine Learning Research
Apple Machine Learning Research
小众软件
小众软件
博客园 - 聂微东
GbyAI
GbyAI
N
News and Events Feed by Topic
The Cloudflare Blog
Engineering at Meta
Engineering at Meta
Last Week in AI
Last Week in AI
博客园 - 三生石上(FineUI控件)
G
Google Developers Blog
A
About on SuperTechFans
K
Kaspersky official blog
NISL@THU
NISL@THU
S
Securelist
Microsoft Azure Blog
Microsoft Azure Blog
V
V2EX - 技术

V2EX

ai studio 被疯狂封 api 怎么回事 Zerolang 好像还没人讨论? [问与答] token 用量究竟是怎么算的? 香港众安银行开户返 300HKD+50USD 英伟达股票兑换券 活动时间 5.28 日至 7.1 日截止。 vibe coding 了个辅助颈腰椎病康复的体态相机小工具 有在用免费 VPS 的吗?可以当梯子用吗? 这个 sechub 网站搬运了很多 V 站的内容,站方能管到它吗 我的 AI(LLM) 和 vibe coding 使用技巧已经落伍了吗 我做了一个 Agent Team 协作平台——Rudder:让 Agent Team 在实践中成长 react 这个技术栈到底是如何做到每天都有新发现的? 我终于找到了 24 小时进行 coding 的终极方法,你可以在帖子当中看到最佳的 Vibe coding 助手 我不想看你的产出 Anker 已经不是原来的 Anker 了,从苹果生态到饭圈生意,一路从龙头企业做到现在韭菜头子。 [产品发布] [产品自荐] 业余两周做了个 AI Visual Agent,自动选模型、写 prompt、调参数,想请 V 友帮忙看看 [深圳] 居家办公距离南山科兴地铁 50 分钟有推荐的小区吗 [推广] 📊 [抽奖+1] 多券商开户福利(万 0.854/两融低至 3.x),回帖抽 coding plan 欢迎各位分子 AirPods4 降噪版在地铁上的表现实在糟糕,关门声差点我把送走 [酷工作] 远程 AI 前端招聘 30-50K 活过来了,继续推广一下我的 codex 中转站,依旧免费送 30 刀 复杂内网里的 WebRTC + gRPC 音视频通话方案:信令、媒体链路与自恢复 寻找 App 平台规则与技术合规咨询顾问 / 团队 做了个宠物拍立得风格照片生成器,给你的猫狗来张照片吧 [问与答] 国内网盘,大家都试过有哪些好用的原生支持 webdav 的网盘? [酷工作] [Golang] 兼职/全职大量招聘|团队扩招—跨境电商 AI+SaaS 用多模态大模型来做语音输入,效果碾压 typeless [推广] [FK Claude] 满血 Claude 折扣中转站 最近 claude code 频繁卡死有碰到同样问题的吗 [问与答] 香港金管局:就内地投资者开户核查倒查至 2023 年 1 月。啥意思? 各位小微企业创业的大佬,欢迎联系我购买财务软件 麻将洗牌 40 张牌跟踪, YOLO+ByteTrack 累积 1942 ID, SAM 2 / Cutie / CoTracker3 哪个能救? [Claude] 跪求 Claude 使用高手 [分享发现] 小米开发者计划送了 820 亿 token + 240 亿 credits,有人用得完吗? 有需要的可以用我的 前几天看到有坛友有 NAS 托管需求 ,刚好我们这边可以放这个 和大家讨论讨论可行性 [OpenAI] 高考期间国产 AI 工具部分功能或将禁用 哪些兄弟有 token 渠道,采购需求! [酷工作] 阿里国际急招 Agent 开发,流程快,最核心的交易业务,速来 网站公安备案,安全评估大家是怎么处理的 vibe 了一个可视化 sing-box 配置编辑器 寻找视觉处理大佬,多目标 mask 跟踪, SAM2, CoTracker3 / TAPIR (点跟踪)等 香港那边是不是开不了投资账户了 伪装成技术博客的本地 TXT 小说阅读器,让你在办公室光明正大地摸鱼 [问与答] 选择还房贷还是选择理财冲掉房贷利息? 中转站 token 掺水检查 关于懒猫微服,你需要一场面对面的交流,直播预告 [分享发现] 果然便宜没好货,用 Deepseek v4pro 写出来的程序 用 opus 4.7 审计出来了 500 多个 bug,笑死 去那种不大的咖啡店里学习简直是种折磨。 [深圳] 暑假想让老婆孩子来深圳,短租 2 个月,求推荐靠谱的找房方式 codex 中转站 0.05x 倍率 高并发 0.03x [分享发现] 知乎这文章,乱写毒人的吧? 想学习 AI 应用开发练手,用哪家的什么套餐比较好啊 claude code 日更两次,现在启动上下文足够长的窗口也比以前快了 第一版很粗糙,欢迎体验面向全球用户的校友社区 - AlumniCircle(校友圈) 今天 Codex 经常在思考中卡死了 [分享发现] 新开了一个英国银行账户 [程序员] 我又来了,给大家分享一下这几天积累的几个 skills [分享创造] Vibe 了一个机器人工具 33 岁阿里 5 年,平薪去长沙 vs 继续卷杭州,怎么选? [VPS] 收购一台 VPS, colocrossing 家的 [NAS] 利用本地 NAS 解决商业/公益 Emby 服务器无法转码的问题 入手了 一加 15T,说说感受 Apple Store ChatGPT 土耳其区可以年付吗? 『记个到』v1.6 更新:任务分享、统一管理、统计信息和反馈记录 Next2V:原生鸿蒙 V2EX 社区客户端已上架市场 最近接 AI Agent / AI 工作流 / 企业内部自动化相关的远程项目。 国际阿里云/腾讯云|AWS/谷歌云 sm 账号 7 折充值! 看看大家的 AGENTS.md/claude.md 里面都有什么好东西 [深圳] CWILL 招聘内推:产品经理 / Golang / 运维 / AI 解决方案 PM 打 BOSS 技术能聊吗? 之前站内看到的汽水音乐的谷歌搜索结果中有危险网址的问题还在 [AI Agent 智能体] 为什么国内的大模型很少能支持 openAi responses api 的 [推广] [打工人药丸] 瞒着老板,偷偷送 5 个海外住宅 IP 兑换码(全球 195+ 国家选),新用户速来! [分享发现] 今天刷抖音发现有一个在线摸鱼表格莫名其妙的火了 [编程] codex 任何地区都登录不上了 域名注册哪家便宜 [程序员] 聊一聊各位大佬们在 Vibe coding 环境下用的技术栈? 隔壁 L 站小作文好难啊 内核(驱动)内存泄露 [问与答] 你们用 opus 和 gpt 的时候 effort 开的是 medium 还是 extra high [问与答] 可以大陆直连,支持 openai image2 的中转站有吗? [生活] 想买个桨板配套的救生衣,有推荐的吗?帮忙给个链接 [职场话题] 想知道你们曾经离职的主要核心原因都是什么? 讲讲我的中转站建站历程,大家似乎都不太关注中转站实际使用的模型,最近我的 gpt-oss-120b(别名成 GPT-5.5)蜜罐被盗刷炸了 [程序员] codex app 一定要开 tun 模式才能用吗? [问与答] 写了一个免费的 LLM4Rec(大模型推荐系统)的课程,不确定 0 基础能看懂吗? [生活] 中排量摩托车求推荐! 本地大模型最佳 Mac 配置选择 不主动不拒绝不表态的女生,还有必要继续吗? [首发/急招] 搞定万卡调度后,我们决定去 Web3 用 Go + Agent 掀翻天花板! 微软 Azure 的 openai 服务有需要组队的么? 从产品初始化到迭代,总抓不准真实用户需求?我做了一个让用户反馈驱动产品决策的工具 Feedalyze 现在还有哪些值得推荐的机场 每天 6 毛钱的 AI 日报系统 —— AI Daily 又进化了 [程序员] 小米 token plan 明天到期,只用了 1%,搞了什么好呢 怎么优化重构 AI 生成的代码方便后面维护? 求助 GPT 的升级规则 game sinnermaker 最近沉迷低价 plus,推广区的赛博鸡蛋都有点懒得领了,分享一下我的使用方案 [电动汽车] 从没体验过智能电车,要实现这些需求得什么价位? 可靠的小道消息, minimax3 真的要来了(附 minimax 邀请链接) qoder 偷偷在干啥?
最近看 Coze Eino,对比下我们做的 FEL 框架,想听听大家意见
CodeCaster · 2025-09-28 · via V2EX

最近看到 Coze 开源代码里的 Eino 框架挺火的,它基于 Go 语言实现,拥有组件化设计和图编排能力,能有效提高 AI 应用的开发效率。Eino 的核心理念是通过组件抽象和图结构编排,解决大模型应用中的复杂流程控制、流式处理和状态管理问题。

正好我们团队也在开发一个 Java 生态的 FEL 框架,因其主打简洁流畅的任务编排能力,获得了一定关注。FEL 框架不追求炫酷的图结构,而是专注于让开发者用最自然的方式定义 AI 工作流。

我们和 Eino 团队瞄准的都是提升 AI 应用的开发效率与可维护性,但我们的 FEL 框架和 Eino 框架走的是两条截然不同的路。

所以就写了一个对比文章,从代码示例出发,介绍一下 FEL 框架与 Eino 不同的编排设计哲学,同时也很想听听大家的意见和建议。

一、简单场景:入门流程演示

让我们先来看一个最基础的对话流程:

┌─────┐    ┌────────┐    ┌───────┐    ┌─────┐
│start│───→│ prompt │───→│ model │───→│ end │
└─────┘    └────────┘    └───────┘    └─────┘

这几乎是所有 LLM 应用的起点。

✅ Eino 的做法:链式 or 图式

Eino 提供了三种编排方式:ChainGraphWorkflow。对于这个简单场景,推荐使用 Chain

chain, _ := NewChain[map[string]any, *Message]().
           AppendChatTemplate(prompt).
           AppendChatModel(model).
           Compile(ctx)
chain.Invoke(ctx, map[string]any{"query": "what's your name?"})

干净利落,链式调用清晰表达了执行顺序。

如果使用 Graph 方式,可以获得更高自由度,但是代码会变得复杂:

graph := NewGraph[map[string]any, *schema.Message]()

_ = graph.AddChatTemplateNode("node_template", chatTpl)
_ = graph.AddChatModelNode("node_model", chatModel)

_ = graph.AddEdge(START, "node_template")
_ = graph.AddEdge("node_template", "node_model")
_ = graph.AddEdge("node_model", END)

compiledGraph, err := graph.Compile(ctx)
if err != nil {
    return err
}
compiledGraph.Invoke(ctx, map[string]any{"query":"what's your name?"})

多了节点命名、显式连边等操作——冗余感上升的代价,换来了更高的自由度。

✅ FEL 的做法:贴近描述业务的写法

FEL 坚持“大道至简”,只提供一种 Fluent API 风格的流程定义,即使是新手,也能快速搭建基础流程:

AiProcessFlow<Tip, String> flow = AiFlows.<Tip>create()
    .prompt(Prompts.human("question: {query}"))
    .generate(model)
    .reduce(() -> "", (acc, chunk) -> acc += chunk.text())
    .close();

flow.converse().offer(Tip.from("query", "what's your name?"));

流程定义没有图、节点 ID 或 start/end 标记,整个调用链像一条自然的语言流水线,更贴近业务描述。

在复杂场景下,FEL 的这种设计优势更加明显:即便流程包含多步生成、多模型协作和流式处理,代码仍然保持简洁,开发者可以更专注于业务逻辑。

这种设计的背后,是一种以开发者体验为中心的理念:只需要专注开发业务本身,就能写出可靠的 AI 流程。

二、进阶挑战:优雅的条件分支

真实世界的应用从来不是一条直线。加入条件判断后,可以进一步校验编排能力。

我们扩展一下需求:

┌─────┐    ┌────────┐    ┌───────┐    ┌──────────┐
│start│───→│ prompt │───→│ model │───→│need log? │
└─────┘    └────────┘    └───────┘    └─────┬────┘
                                            │
                                   ┌────────┼────────┐
                                   │Yes     │No      │
                                   ▼        ▼        │
                              ┌────────┐   ┌─────┐   │
                              │log     │──→│ end │◄──┘
                              └────────┘   └─────┘

在模型输出后,判断是否需要记录日志。如果需要,则调用日志函数;否则直接返回。

Eino:两种路径选择,同一套实现逻辑

无论是 Chain 还是 Graph ,Eino 都依赖“条件函数返回目标节点名”的机制来实现跳转。

Chain 写法:

branchCond := func(ctx context.Context, input *schema.Message) (string, error) {
    if isNeedLog(input) {
        return "log", nil
    }

    return "else", nil
}

log := compose.InvokableLambda(func(ctx context.Context, input *schema.Message) (*schema.Message, error) {
    log(input)
    return input, nil
})
elseBranch := compose.InvokableLambda(func(ctx context.Context, input *schema.Message) (string, error) {
    return input, nil
})
chain, _ := NewChain[map[string]any, *schema.Message]().
           AppendChatTemplate(prompt).
           AppendChatModel(model).
           AppendBranch(compose.NewChainBranch(branchCond).AddLambda("log", log).AddLambda("else", elseBranch))
           Compile(ctx)
chain.Invoke(ctx, map[string]any{"query": "what's your name?"})

Graph 写法:

branchCond := func(ctx context.Context, input *schema.Message) (string, error) {
    if isNeedLog(input) {
        return "node_log", nil
    }

    return compose.END, nil
}

graph := NewGraph[map[string]any, *schema.Message]()

_ = graph.AddChatTemplateNode("node_template", chatTpl)
_ = graph.AddChatModelNode("node_model", chatModel)
_ = graph.AddLambdaNode("node_log", log)

_ = graph.AddEdge(START, "node_template")
_ = graph.AddEdge("node_template", "node_model")
_ = graph.AddBranch("node_model", branchCond)
_ = graph.AddEdge("node_log", END)

compiledGraph, err := graph.Compile(ctx)
if err != nil {
    return err
}
compiledGraph.Invoke(ctx, map[string]any{"query": "what's your name?"})

可以看到,虽然整体表现方式不同,但是条件分支的核心逻辑一致:通过字符串匹配决定流向。

优点是灵活性高,支持任意拓扑;缺点也很明显——字符串硬编码易出错,调试困难。一旦拼错节点名,运行时才会报错。

FEL:条件即表达式,无需跳转

FEL 的处理方式更像是函数式编程中的 match 或 when 表达式:

AiProcessFlow<Tip, String> flow = AiFlows.<Tip>create()
    .prompt(Prompts.human("question: {query}"))
    .generate(model)
    .reduce(() -> "", (acc, chunk) -> acc += chunk.text())
    .conditions()
    .when(this::isNeedLog, this::log)
    .others(input -> input)
    .close();

flow.converse().offer(Tip.from("query", "what's your name?"));

关键在于 conditions 这个 DSL 关键字,它把分支逻辑封装成声明式语句,完全避免了“跳转”概念。分支动作也是函数式接口,易于测试和复用。整体语法延续了之前的流畅风格,无割裂感。

你可以把它理解为:“在这个环节,根据某些规则做选择,然后继续往下走”,而不是“我要跳到哪个节点去”。

三、设计哲学的碰撞:图 vs 流

看到这里,你会发现 Eino 和 FEL 的差异远不止语法糖那么简单。它们代表了两种截然不同的设计哲学:

维度 Eino ( Coze ) FEL
抽象层级 图结构优先,强调可视化与拓扑控制 流程优先,强调语义表达与可读性
学习成本 需要理解节点、边、分支、循环等图概念 只需掌握链式调用与函数组合
类型检查 提供上下游类型对齐,部分类型在运行期执行 Compile 方法时类型检查 链式调用,天然的上下游类型推导和衔接,能够在编译时期识别类型错误,更安全

四、思考:我们需要什么样的 AI 编排?

对于开发者而言,AI 编排工具的终极理想无疑是:越简单越好用。我们渴望的是能快速落地、易于维护的解决方案,而不是陷入复杂的架构设计中。

但现实往往需要权衡——简洁的 API 背后,是否牺牲了应对复杂场景的能力?强大的图模型,又是否会抬高使用门槛,让日常开发变得笨重?

Eino 框架走了一条更偏“能力先行”的道路。它直接暴露图结构与节点控制,以原生支持循环、分支、动态跳转等复杂拓扑,为构建智能体、自动化流程等高级场景提供了坚实基础。

而我们开发的 FEL 框架选择了“简洁至上”的路径,它能通过流畅的 Fluent API 抽象掉底层细节,让开发者专注业务逻辑本身,显著提升了常规任务的开发效率。

我们认为,真正的成熟框架,不能只停留在“简单”或“强大”的单一体验上。我们还需要它在状态管理、流式处理、循环递归、错误恢复、可观测性等方面都交出令人信服的答卷。

或许,在不同的业务条件之下,Eino 和 FEL 这样不同的写法,可以分别适合不同的场景吧?


我们想多听听大家的意见,希望能够得到更多的反馈,让项目更好的向前演进。

我们的项目地址是: https://github.com/ModelEngine-Group/fit-framework

如果大家能够给我们提提意见,我们是非常开心的,会促使我们有更强的动力向前。

如果过程中有一些问题,欢迎给我们 Github 的项目提 Issue 。

如果有意愿或者喜欢,或者只是给我们鼓励一下,希望能给我们 github 项目点个小星星,真的感谢大家~