写点什么

Quarkus 开发基于 LangChain4j 的扩展,方便将 LLM 集成到 Quarkus 应用程序中

作者:Olimpiu Pop

  • 2024-01-15
    北京
  • 本文字数:2656 字

    阅读完需:约 9 分钟

Quarkus 开发基于 LangChain4j 的扩展,方便将 LLM 集成到 Quarkus 应用程序中

LangChain for Java(LangChain4J)战略顾问和布道师 Lize Raes 在 2023 年比利时 Devoxx 大会上做了“Java Meets AI”的演讲,受此启发,Quarkus 团队开始开发基于 LangChain4J 库的扩展,这是 LangChain 库的 Java 重新实现版本(最初用 Python 或 JavaScript 实现)。这将允许开发人员将大语言模型(LLM)集成到他们的 Quarkus 应用程序中。Quarkus LangChain4J 第一个公开版本,即 0.1 版本,在 2023 年 11 月中旬发布。这个扩展几乎每周都会发布一次,最新版本是 0.5.1。


InfoQ 采访了 Quarkus 项目联合负责人 Max Rydahl Andersen,分享了他对该扩展未来发展以及是否适合投产的看法。他说:


在真实项目中使用它?可以尝试,但 langchain4j 的 API 仍在变化,所以我们还处于实验阶段。

我们将继续跟进 langchain4j 并不断扩展它。我们十分关注扩展对“开放”模型的支持,特别是那些可以在云端或本地基础架构上运行的模型。


Andersen 认为 LLM 可以被用在现有和未来的许多企业项目中,他认为新兴的编程模型与 Quarkus 现有的功能集相契合。该扩展允许声明性地定义 LLM 集成点,类似于 Quarkus REST Client:用 @RegisterAiService 注解接口,然后通过在应用程序的任意位置注入服务来使用 LLM。这种方法具有以下优点:


  • 可测试性,可以通过伪接口实现来模拟服务 ;

  • 可观测性,开发人员可以用指标注释来监控方法 ;

  • 弹性,开发人员可以通过容错注释来处理故障、超时和其他临时问题。


@RegisterAiServicepublic interface TriageService {  // methods.}
复制代码


在使用像 ChatGPT 这样的 LLM 时,大多数交互是通过自然语言提示进行的,而在传统应用程序中,交互是通过编程语言进行的。与传统代码不同,quarkus-langchain扩展保留了与 LLM 交互的方式,允许开发人员通过自然语言定义范围和任务。LLM 的范围可以通过 @SystemMessage(String) 注解来定义,任务可以通过 @UserMessage(String) 注解来定义。


@RegisterAiServicepublic interface TriageService {    @SystemMessage("""        You are working for a bank, processing reviews about        financial products. Triage reviews into positive and        negative ones, responding with a JSON document.        """    )    @UserMessage("""        Your task is to process the review delimited by ---.        Apply sentiment analysis to the review to determine        if it is positive or negative, considering various languages.
For example: - `I love your bank, you are the best!` is a 'POSITIVE' review - `J'adore votre banque` is a 'POSITIVE' review - `I hate your bank, you are the worst!` is a 'NEGATIVE' review
Respond with a JSON document containing: - the 'evaluation' key set to 'POSITIVE' if the review is positive, 'NEGATIVE' otherwise - the 'message' key set to a message thanking or apologizing to the customer. These messages must be polite and match the review's language.
--- {review} --- """) TriagedReview triage(String review);}
复制代码


由于大型语言模型的知识收到训练集数据的限制,Quarkus LangChain4j 扩展提供了两种机制来扩展知识:工具和文档存储。



工具允许 LLM 与父应用程序发生交互,它通过调用 REST 端点或执行数据库查询来实现交互。LLM 决定要使用的参数以及如何处理结果。要声明一个工具,只需在 bean 方法上使用@Tool注解:


@ApplicationScopedpublic class CustomerRepository implements PanacheRepository<Customer> {
@Tool("get the customer name for the given customerId") public String getCustomerName(long id) { return find("id", id).firstResult().name; }}
复制代码


文档存储是 Quarkus 的检索增强生成(RAG)实现,这是一种用与感兴趣主题(用户手册、内部文档等)有关的文档来扩展 LLM 上下文的机制。从文档中获取信息包括两个步骤:


摄入过程——解析文档并计算其向量表示,然后存储在文档存储库中。Quarkus 提供了一个 Ingestor 来简化信息的摄入。


@Inject    EmbeddingModel embeddingModel;
public void ingest(List<Document> documents) { var ingestor = EmbeddingStoreIngestor.builder() .embeddingStore(store) .embeddingModel(embeddingModel) .documentSplitter(recursive(500, 0)) .build(); ingestor.ingest(documents); }}
复制代码


RAG 过程——在调用 LLM 之前,查询文档存储并丰富上下文。Quarkus 在这里使用的是 Retriever。


@ApplicationScopedpublic class RetrieverExample implements Retriever<TextSegment> {
private final EmbeddingStoreRetriever retriever;
RetrieverExample(RedisEmbeddingStore store, EmbeddingModel model) { retriever = EmbeddingStoreRetriever.from(store, model, 20); }
@Override public List<TextSegment> findRelevant(String s) { return retriever.findRelevant(s); }}
复制代码


目前,该扩展支持 Redis Store、Chroma Store、Pinecone Store、PgVector(PostgreSQL)Store、进程内 Embedding 或加载 CSV 文件以及与商业(例如 OpenAI)和开源模型(例如 Hugging Face 或 Ollama)进行交互的能力。


Quarkus 紧跟 Spring Framework 的脚步,加入了嵌入 AI 能力的行列。该实现基于 LangChain4j,并得到了 LangChain4j 作者 Dmytro Liubarskyi 及其团队的支持。因为发展迅速,团队正在寻求反馈和想法来改进这些集成。Andersen 表示,LLM 扩展是对其他现有集成非常好的补充:可以集成各种数据摄入系统(例如,通过 Apache Camel 集成),而 Quarkus 的云原生 DNA 可以实现轻松高效的部署。


查看英文原文


https://www.infoq.com/news/2023/12/quarkus-langchain-llm-integratio/


声明:本文为 InfoQ 翻译,未经许可禁止转载。


今日好文推荐


雷军为澎湃 OS 团队颁发百万美金技术大奖;阿里 Lazada 在东南亚六国大裁员;华为员工 2023 年出差134万次|Q资讯


颠覆软件工程、“杀死”开发者?回溯大模型落地应用这一年 | 盘点


今年向量数据库“杀疯了”,但纯向量数据库“凉”了?| 盘点


金融业采用大模型,是“用大炮轰蚊子”吗?| 盘点



2024-01-15 08:005332

评论

发布
暂无评论
发现更多内容

前端安全问题及防护思路

FinFish

网络安全 安全 安全架构 移动安全 前端安全

零基础转行Web前端培训机构怎么选

小谷哥

Java Web(九)会话跟踪技术

浅辄

javaWeb session Cookie 11月月更

分布式事务详解、理论分析、及强一致性(2PC、3PC)剖析

C++后台开发

数据库 分布式 后端开发 Linux服务器开发 C++开发

泛型由入门到精通(3)

好程序员IT教育

Java 泛型

如何把 ThinkPHP 5 的项目迁移到阿里云函数计算来应对流量洪峰?

阿里巴巴云原生

阿里云 Serverless 云原生 函数计算

手把手在桌面应用中运行小程序

Onegun

小程序 windows Mac 软件

【Go电商实战03】如何使用ORM链式操作?如何优雅的实现软删除?

王中阳Go

Go golang 高效工作 学习方法 11月月更

数字化转型有可能让所有人满意吗?

优秀

数字化转型

【电商实战02】如何借助工具快速生成代码?初学者容易踩的坑有哪些?

王中阳Go

golang 高效工作 学习方法 程序员 11月月更

沉浸式视听体验:全景声技术是如何实现的?

阿里云CloudImagine

阿里云 音视频 音频

先楫半导体HPM6700系列正式合入OpenHarmony社区主干

极客天地

关于DAO社区代币挖矿治理dapp系统开发

开发微hkkf5566

Java培训机构应该怎么去学习开发技术

小谷哥

低代码技术在研发团队的应用模式探讨

阿里巴巴终端技术

前端 终端 低代码 客户端

【Go电商实战04】为什么GoFrame不支持migrate功能?我还特意去问了框架作者

王中阳Go

golang 高效工作 学习方法 程序员 11月月更

桌面端运行小程序的简易实操

FinFish

跨端开发 跨端运行 桌面应用 桌面应用开发

前端培训学习需要哪些知识?

小谷哥

从HelloWorld看Java与Kotlin

子不语Any

kotlin Andriod 11月月更

泛型由入门到精通(2)

好程序员IT教育

Java 泛型

浅析云原生

鲸品堂

AI音乐创作,让每一个人都成为音乐家

HarmonyOS SDK

音频 HMS Core

秒云加入OpenCloudOS操作系统开源社区,携手打造更智能、更可控、更可信的云原生环境

MIAOYUN

开源社区 opencloudOS

甩掉容量规划炸弹:用 AHPA 实现 Kubernetes 智能弹性伸缩

阿里巴巴云原生

阿里云 Kubernetes 云原生 AHPA

使用 C++ 部署深度学习模型快速上手方案

MegEngineBot

c++ 深度学习 开源 MegEngine 模型部署

合阔智云核心生产系统切换到服务网格 ASM 的落地实践

阿里巴巴云原生

阿里云 云原生 服务网格

设备接入物联网平台必知必会——设备接入类

阿里云AIoT

阿里云 数据 物联网 设备接入 协议解析

4K60帧!RayLink远程控制软件如何帮助设计师远程办公?

RayLink远程工具

远程控制软件 远程办公软件 远控软件 远程桌面连接 RayLink

Kotlin变量声明和类型推断

子不语Any

kotlin Andriod 11月月更

软件测试面试真题 | 测试一个你完全不熟悉的系统,你会怎么办?

测试人

软件测试 面试题 自动化测试 测试开发

大专参加大数据培训学习要具备哪几方面的知识

小谷哥

Quarkus 开发基于 LangChain4j 的扩展,方便将 LLM 集成到 Quarkus 应用程序中_编程语言_InfoQ精选文章