java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java实现AI代理

一文详解如何使用Java打造更优雅的AI代理

作者:步子哥

在人工智能(AI)代理开发的浪潮中,Python似乎一直是默认的编程语言选择,本文将深入探索Java如何以更少的代码和更高的可扩展性创造出更高效,更优雅的AI代理,希望对大家有所帮助

在人工智能(AI)代理开发的浪潮中,Python似乎一直是默认的编程语言选择。然而,Java虚拟机(JVM)平台正在以其强大的类型安全、优雅的体系结构和企业级生态系统,挑战这一现状。Rod Johnson在2025年8月发表的文章《You Can Build Better AI Agents in Java Than Python》以及Embabel代理框架的GitHub文档,为我们展示了Java在AI代理开发中的独特优势。通过一个具体的书籍写作案例,我们将深入探索Java如何以更少的代码、更高的可扩展性和更强的类型安全性,超越Python的CrewAI框架,创造出更高效、更优雅的AI代理。

从愿景到现实:书籍写作的AI代理场景

想象一下,你是一位作者,梦想创作一本关于“2025年7月人工智能现状”的书籍。你需要一个AI系统,能够自动研究主题、生成大纲、撰写章节,并最终整合成一本完整的Markdown格式书籍。这样的任务看似复杂,但通过AI代理的协作,可以分解为清晰的步骤,高效完成。Rod Johnson选择了CrewAI框架中的“Write a Book Flow”示例作为基准,将其用Java的Embabel框架重写,展示Java在AI代理开发中的优势。

什么是“Write a Book Flow”?

这个流程通过多个AI代理协作完成书籍创作:首先,OutlineCrew研究主题并生成书籍大纲;然后,WriteBookChapterCrew为每个章节撰写内容;最后,将所有章节整合为一个Markdown文件。这是一个典型的多代理协作场景,适合展示框架的能力。

CrewAI的Python实现:直观但繁琐

CrewAI的核心概念

CrewAI是一个流行的Python代理框架,通过“crew”(代理团队)组织任务。每个crew包含多个代理(agent),每个代理有特定的角色(role)、目标(goal)和背景故事(backstory)。任务通过YML文件定义,Python代码负责将代理和任务连接起来。Pydantic模型用于约束大语言模型(LLM)的输出,确保结构化数据。

在书籍写作示例中,CrewAI的实现分为两个crew:

1.OutlineCrew:包含两个代理:

2.WriteBookChapterCrew:为每个章节分配一个代理,撰写内容并进行进一步研究。

Python代码通过@CrewBase装饰器定义crew,通过@agent@task装饰器配置代理和任务,最终在main.py中通过BookFlow类协调整个流程。异步编程(asyncio)用于并行撰写章节,Pydantic模型(如ChapterOutlineBookOutline)提供数据结构支持。

CrewAI的优点

CrewAI的实现直观且模块化:

比喻:像一个交响乐团

CrewAI就像一个交响乐团,每个代理是乐手,演奏特定乐器(任务)。指挥(Python代码)协调乐手,确保音乐(书籍)和谐完成。然而,乐谱(YML配置)繁琐,乐手间的协作(数据流)不够明确。

CrewAI的不足

尽管CrewAI功能强大,但也存在显著的短板:

比喻:拼装玩具的挑战

CrewAI就像一套复杂的拼装玩具,说明书(YML)冗长,零件(代理和任务)需要手动拼接,且容易因为零件标记不清(魔法字符串)而出错。

Embabel的Java实现:优雅与力量的结合

Embabel是一个专为JVM设计的代理框架,基于Spring框架,利用Java或Kotlin的强类型特性和企业级生态,提供了更简洁、更安全的AI代理开发方式。Rod Johnson通过重写CrewAI的书籍写作示例,展示了Embabel的优越性。

Embabel的核心概念

Embabel通过以下概念组织代理流程:

什么是GOAP?

GOAP(Goal-Oriented Action Planning)是一种在游戏AI中常用的规划算法,允许系统根据当前状态和目标动态选择动作序列。Embabel利用GOAP实现智能路径规划,无需开发者手动定义流程顺序。

Embabel的关键优势包括:

Embabel的代码实现

在Embabel中,书籍写作流程被简化为一个Java类(BookWriter)和一个YML配置文件(application.yml)。以下是核心实现:

YML配置

注解:YML的优雅

与CrewAI的多个YML文件相比,Embabel的单一application.yml集中配置了LLM模型、超参数、并发限制和代理角色,简洁且易于维护。Spring的@ConfigurationProperties注解自动将YML映射为Java对象。

领域模型

record ChapterOutline(String title, String content) {}
record BookOutline(String title, List<ChapterOutline> chapterOutlines) implements PromptContributor {
    @NotNull
    @Override
    public String contribution() {
        return "Book Outline:\nTitle: " + title + "\n" + chapterOutlines.stream()
                .map(chapter -> chapter.title() + "\n" + chapter.content())
                .collect(Collectors.joining("\n\n"));
    }
}
record Chapter(String title, String content) {}
record Book(BookRequest request, String title, List<Chapter> chapters) {
    public String text() {
        return "# " + title() + "\n" + request.goal() + "\n\n" +
                chapters().stream()
                        .map(chapter -> "## " + chapter.title() + "\n" + chapter.content())
                        .collect(Collectors.joining("\n\n"));
    }
}

注解:行为丰富的领域模型

与CrewAI的Pydantic模型(仅作为数据结构)不同,Embabel的领域对象(如BookOutlineBook)实现了PromptContributor接口,允许它们参与提示构建,并提供格式化输出方法(如Book.text()),增强了代码的内聚性。

代理实现

@Agent(description = "Write a book, first creating an outline, then writing the chapters and combining them")
public record BookWriter(BookWriterConfig config) {
    @Action
    ResearchReport researchTopic(BookRequest bookRequest, OperationContext context) {
        return context.ai()
                .withLlm(config.researcherLlm())
                .withPromptElements(config.researcher(), bookRequest)
                .withToolGroup(CoreToolGroups.WEB)
                .createObject(
                        """
                        Research the topic to gather the most important information that will
                        be useful in creating a book outline. Ensure you focus on high-quality, reliable sources.
                        """,
                        ResearchReport.class);
    }

    @Action
    BookOutline createOutline(BookRequest bookRequest, ResearchReport researchReport, OperationContext context) {
        return context.ai()
                .withLlm(config.writerLlm())
                .withPromptElements(config.outliner(), bookRequest, researchReport)
                .withToolGroup(CoreToolGroups.WEB)
                .createObject(
                        """
                        Create a book outline as requested with chapters in sequential order based on the given research findings.
                        Ensure that each chapter has a title and a brief description that highlights the topics and subtopics to be covered.
                        """,
                        BookOutline.class);
    }

    @Action
    Book writeBook(BookRequest bookRequest, BookOutline bookOutline, ResearchReport researchReport, OperationContext context) {
        var chapters = context.parallelMap(
                bookOutline.chapterOutlines(),
                config.maxConcurrency(),
                chapterOutline -> writeChapter(bookRequest, bookOutline, chapterOutline, context)
        );
        return new Book(bookRequest, bookOutline.title(), chapters);
    }

    @AchievesGoal(description = "Book has been written and published about the requested topic")
    @Action
    Book publishBook(Book book) {
        var path = config.saveContent(book);
        logger.info("Book {} written and saved to {}", book.title(), path);
        return book;
    }
}

注解:类型安全与动态规划

每个@Action方法使用强类型的领域对象(如BookRequestResearchReport)作为参数,避免魔法字符串。OperationContext提供对AI服务的统一访问,parallelMap方法通过maxConcurrency控制并发,防止速率限制问题。GOAP算法自动推导动作顺序,简化流程设计。

Embabel的优势

与CrewAI相比,Embabel的实现展现了以下优势:

比喻:像一架精密的飞船

Embabel就像一架精密的飞船,Spring框架是其引擎,GOAP算法是导航系统,领域对象是模块化的组件。开发者只需设定目标(目标和动作),飞船便能自动规划路线,高效到达目的地。

深入比较:Java vs. Python

代码量与简洁性

令人惊讶的是,Embabel的Java实现比CrewAI的Python实现代码量更少。CrewAI需要多个YML文件、Python类和装饰器,而Embabel通过Spring的依赖注入和单一Java类简化了配置和实现。YML配置也更为集中,减少了维护成本。

类型安全性

CrewAI的提示依赖字符串模板(如{topic}),容易出错,且@listen装饰器的参数无类型约束。Embabel通过强类型的领域对象和PromptContributor接口,确保提示构建和数据流的安全性。这种类型安全性不仅降低了错误风险,还提升了IDE支持(如代码补全和重构)。

可扩展性与复用性

Embabel的GOAP规划算法允许动态生成动作序列,开发者只需添加新的动作和目标即可扩展功能,无需修改现有代码。CrewAI的流程依赖手动定义的@listen装饰器,扩展需要修改多个文件,复用性较差。

生产环境适配性

Embabel利用Spring的生态系统,提供了日志、测试和配置管理的原生支持。CrewAI依赖print语句和asyncio,缺乏生产级的日志和并发控制,难以满足企业需求。

比喻:从手工坊到智能工厂

CrewAI像一个手工坊,工匠(开发者)需要手动拼接零件(YML和Python代码),流程繁琐且易出错。Embabel则像一座智能工厂,自动化流水线(GOAP和Spring)高效生产,开发者只需提供蓝图(领域模型和动作)。

更广阔的视野:Embabel的生态与未来

Spring与JVM的生态优势

Embabel基于Spring框架,充分利用了JVM的成熟生态:

比喻:JVM的宝库

JVM就像一座宝库,Spring是钥匙,Embabel是探险者,带领开发者挖掘企业级功能(如数据库、事务和微服务)的无限可能。

Embabel的创新特性

Embabel不仅仅是一个代理框架,它引入了多项创新:

未来路线图

Embabel的GitHub文档勾勒了宏大的愿景:

结语:JVM的AI新篇章

通过重写CrewAI的书籍写作示例,Embabel展示了Java在AI代理开发中的优雅与力量。它的类型安全、动态规划和Spring生态集成,使其在代码简洁性、可扩展性和生产就绪性上超越了Python的CrewAI框架。无论是初学者还是企业开发者,Embabel都提供了一个强大而灵活的平台,让AI代理开发变得如探险般引人入胜。

想象一下

你站在一座未来城市的控制中心,JVM是坚实的地基,Spring是智能的管道系统,Embabel是指挥AI代理的超级计算机。只需几行代码,你就能指挥代理完成从研究到创作的壮举。Embabel不仅是一个框架,它是通向AI驱动未来的桥梁。

以上就是一文详解如何使用Java打造更优雅的AI代理的详细内容,更多关于Java实现AI代理的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文