同一个Agent用Python、Clojure、Elixir各写一遍:三种技术栈的落地实战复盘
📅 2026-08-14 · 茗尚说Ai · 应用案例
大多数Agent工具链是Python优先的——LangChain、AutoGen、CrewAI、LangGraph,几乎清一色面向Python。这对已经用Python的团队很友好,但对那些跑在JVM基础设施或Erlang/OTP系统上的组织来说,却是一个绕不开的选择题:是把Agent迁到Python,还是在自己熟悉的运行时里从头搭建?
SD Times 在8月13日发表的一篇实战复盘,把这个问题摊开讲透了。作者 Artem Barmin 和他的团队,用同一个分析型Agent(查询数据库返回统计、按需生成图表),分别在 Python、Clojure、Elixir 三种语言里各实现了一遍,逐项对比它们在生产级Agent系统里的表现。
1. 案例背景:一个会跑工具的Agent
先明确主角——所谓 LLM Agent,就是一个"会调用函数的大模型"。它的核心循环叫 ReAct(推理 + 行动):模型先看对话和可用工具,决定是调用工具还是直接回答;调了工具就把结果喂回对话,循环往复,直到给出最终答案或达到步数上限。
Anthropic 曾把 Agent 细分成两类:workflow(工作流)是 LLM 沿着预设代码路径被编排,agent 则是 LLM 动态决定自己的流程和工具使用。但两者共享同一个底层循环,区别只在于LLM 对流程的控制程度。真正拉开语言差距的,是如何表达"工具、状态、循环"这三件事。
2. Python:框架最省事,但状态有坑
Python 有现成框架可用,一条 initialize_agent 就能把循环跑起来。但团队刻意也写了"不依赖框架"的版本——用字典存工具、用字典存状态,控制流完全可见。
问题出在 Python 的可变数据结构上:一个工具函数可以通过引用修改 state,而这种修改不会出现在 trace 里。作者的评价很克制:"有人认为这是语言缺陷,我们则认为这只是一个需要管理的属性。"言下之意——框架帮你省了事,但也把状态追踪的透明度藏了起来。
3. Clojure:把Agent当成"纯数据变换"
Clojure 的思路截然不同:Agent 就是对不可变 map 的一系列数据变换。工具是 map,参数 schema 用 Malli 定义——schema 本身也是数据,而不是类或装饰器,因此可以编程式生成、序列化、转换,天然适合转成 LLM API 要的 JSON 格式。
更妙的是状态处理。每一轮迭代都"取一个旧状态、返回一个新状态",旧状态保持不变。这意味着你可以对两个状态做 diff,看清某一步到底改了什么;可以把完整状态序列化成 EDN 存下来、之后重放;开发时还能在 REPL 里手动单步执行 run-agent-once。测试时也无需 mock 库——没有框架内部实现可 mock,因为根本没有隐藏的内部状态。
4. Elixir:把Agent当成一个进程
Elixir 走的是第三条路:用 Actor 模型,把每个 Agent 都建模成一个进程。进程轻量到只有几 KB 内存,靠消息传递通信,并由监督树负责故障恢复。用 GenServer 包裹的 Agent,其"消息传递"模型和标准 Agent 工作流模式天然对应——提示链就是进程间传消息,路由就是分类器进程分发,编排器进程负责 spawn 和管理 worker。
最亮眼的是它的故障自愈:
"如果一个 agent 进程因为糟糕的 LLM 输出、API 超时或格式错误的工具结果而崩溃,监督者会重启它,其它 agent 进程不受影响。Erlang/OTP 从 1980 年代起就是这么处理进程失败的,搬到 LLM Agent 上几乎不用改。"
而多个 agent 进程"默认并发运行",因为它本来就是 Elixir 的核心能力。
5. 生产需求下的三方对比
- Python:用
asyncio/线程/多进程,但 GIL 限制了 CPU 密集型并行;I/O 密集的 LLM 调用 asyncio 够用,大规模并发还得上 Ray、Celery 等外部工具。 - Clojure:自带 atoms、refs、agents、core.async 等并发原语,跑在 JVM 上。
- Elixir
💡 复盘结论:没有"最好"的语言,只有"最匹配你现有栈"的语言。如果你已经在 JVM 或 Erlang/OTP 上跑生产系统,硬把 Agent 迁到 Python,可能是在引入一套新的运行时复杂度;反过来,Clojure 的不可变状态和 Elixir 的进程监督,恰恰为"可追踪、可恢复"的 Agent 提供了 Python 框架默认不暴露的能力。
这篇复盘最有价值的地方,不在于推荐你选哪门语言,而在于提醒了一个容易被忽略的事实:Agent 的可靠性,最终由你的运行时决定——状态的可见性、故障的隔离、并发的成本,都是语言生态里早就写好的"默认答案"。下次纠结技术栈时,不妨先问一句:你要的到底是"写起来最快",还是"崩溃了能自己爬起来"。下期见。
参考来源:
SD Times — "Elixir, Clojure, or Python for LLM Agents? Our Experience with All Three"(Artem Barmin,2026-08-13) Hacker News — 该文的社区讨论串
内容来源于网络,如有侵权,请联系我们进行处理。