首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >LLM 时代:Java 如何设计一个及格的 AIGC 框架

LLM 时代:Java 如何设计一个及格的 AIGC 框架

原创
作者头像
花花Binki
发布2024-12-06 22:55:20
发布2024-12-06 22:55:20
7050
举报
封面
封面

待完善

大语言模型(LLM)的风口持续了两年的现在,想让他可以为之前的企业应用赋能,首选的第一开发语言还是 Python。但实际上,Java 才是在 Web 应用开发领域的老大哥。Java 是如何给于大语言模型应用(LLMs)交出答卷的呢?LangChain4j,Spring AI,以及各家模型厂商的 SDK。

如果有这类框架开发的经验,就会发现根本没有任何新鲜的技术。对于整体结构来讲,只是多了一项新的基础服务调用。本篇笔者就带着大家一起来看看,Java 如何旧壶装新酒!

需求先行

没有技术是独立存在的,所有技术都是为业务服务,而业务来自于哪里?来自需求。

就本篇来说,目标是做一个款 AIGC 框架。大方向是定了,但需要几个突破口,也就是核心功能。

  • 本质:对话

LLMs 的输出来自于我们的提示词 (Prompt)。有了输出,才能为程序所用。问答之间,成为了第一个需求。对接通信的核心框架。

  • 细节:RAG

为企业赋能,就得让大模型内化企业知识库。大型企业,要用其垂直领域的微调模型,需要很大的成本。小微企业,用RAG 技术投资回报率(ROI,Return on Investment )更高。

  • 完善:对比

与已经非常成熟的 Python 做复刻,再加上 Java 语言自身的特色,便有了第一代产品,LangChain4j。

  • 生态

Java 开发者如今也可以称为 Spring 开发者。如其语意一样,给 Java 带来了春天。Spring 向来以生态称帝,AI 来了,也需要紧跟。所以有了新一代产品,Spring AI。

到这里初版算是成型,需求在使用中继续迭代。

依赖抽象

在21世纪,罗伯特·C·马丁(Bob 大叔)发表了面向对象设计的SOLID原则,即单一职责(SRP)、开闭原则(OCP)、里氏替换(LSP)、接口隔离(ISP)、依赖倒置(DIP)。

最后一点:高层模块不应该依赖低层模块,而应该依赖于抽象;抽象不应该依赖于细节。在 Java 语言中,抽象即是接口、抽象类这些定义规范的,是软件设计的第一层映射。这句话看起来还是很抽象,下面举一个简单的例子:

在 Spring 应用中,连接数据库是一个基础操作。不过数据库种类很多,逐个实现有些费事,怎样以不变应万变呢?官方定义了一个抽象层,数据库厂商提供实现。对于开发者来说,只需关心地址、认证(账号、密码),在指定谁家驱动,就完成了连接。

所以针对需求,先写下接口,与其之间的调用关系。

  • 对话

客户端,客户端的消息体,响应的消息体。

  • 提示词

Spring AI 的效果是让提示词和对象一样,可以前后置增强。不仅仅是一个字符串,更有高级定制属性

  • 结构化输出
  • 嵌入模型,Embedding

上传文件,分割内容,存储等一系列操作,正是“知识库”的核心。

领域开发

各家模型提供的Java的SDK需要按部就班的,先创建c对象所需的b,然后在创建b所需的a,输出也是一层套一层。

而是用 Java 目前的两款AIGC框架,几乎是一条链式调用即可完成。前者就是API,到了后者,形成了一种特殊的开发范式:领域专用语言(DSL,Domain Specific Language)。一种组合多个API形成的交互式 API。

丰富生态

多模型 Model,多模态 Modal,方法调用 function,可观测,工作流 flow,智能体 agent 。

为了能够让框架走的更远,生态是不可或缺的因素。以上列举的,两款成型的产品可以实现大部分,剩下的就需要另一些来补充。

比如工作流。Python 生态中有LangGraph,Java 生态也添加了对应产品,LangGraph4j。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 需求先行
  • 依赖抽象
  • 领域开发
  • 丰富生态
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档