写点什么

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:005376

评论

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

活动预告|ArchSummit全球架构师峰会

第四范式开发者社区

吊打 ThreadLocal,谈谈FastThreadLocal为啥能这么快?

Java 程序员 后端

网络安全漏洞复现与分析

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 漏洞挖掘

同程内网流传的分布式凤凰缓存系统手册,竟遭GitHub强行开源下载

Java 程序员 后端

十面阿里Java岗,看我怎么吊打面试官!

Java 程序员 后端

华为安全技术专家与Linux内核到底发生了什么?这本小册子是怎么回事?

Java 程序员 后端

华山论剑!滴滴CTO五轮面试真是太刺激了,已拿到offer

Java 程序员 后端

双非本科进不了大厂?阿里技术四面+交叉面+HR面,成功拿到offer

Java spring 程序员 mybatis

可以回答一下:Redis和mysql数据是怎么保持数据一致的嘛?(1)

Java 程序员 后端

可以回答一下:Redis和mysql数据是怎么保持数据一致的嘛?

Java 程序员 后端

【Redis源码分析专题】(1)从本质分析你写入Redis中的数据为什么不见了?

码界西柚

redis Redis 核心技术与实战 11月日更 缓存驱逐

厉害!腾讯T3-2都还在学的微服务+MySQL+Kafka+boot2

Java 程序员 后端

工作10年,面试超过500人想进阿里的同学,总结出的108道面试题

Java MySQL redis spring JVM

如何避免企业在碳排放数据上造假?

石云升

学习笔记 碳中和 碳交易

发量能决定一个程序员的水平吗

Java 程序员 后端

十个超酷的java谋生方式,你喜欢吗?

Java 程序员 后端

又一巅峰神作!14年工作经验大佬出品“JVM&G1 GC深入学习手册”

Java 程序员 后端

企业数字化转型的起手式是什么?

百度大脑

人工智能 百度

同一个Spring-AOP的坑,我一天踩了两次,深坑啊

Java 程序员 后端

原来书中说的JVM默认垃圾回收器是错的!

Java 程序员 后端

【高并发】SimpleDateFormat类到底为啥不是线程安全的?(附六种解决方案,建议收藏)

冰河

Java 并发编程 多线程 高并发 异步编程

同一份数据,Redis为什么要存两次

Java 程序员 后端

同事问我如何Java实现,搞定分析栈和队列数据结构的实现过程不就好了

Java 程序员 后端

华为初面+综合面试(Java技术面)附上面试题

Java 程序员 后端

博客之星:我去,你竟然还不会用 synchronized

Java 程序员 后端

怎样选择最合适的Linux发行版?23个版本横向对比,总有适合你的?

奔着腾讯去

Linux

双非本科毕业的我,为何能在金九银十期间斩获京东、字节、快手的offer

Java 程序员 后端

华为java工程师的提升程序员实力的几点建议

Java 程序员 后端

南邮《网络技术与应用》4次作业

Java 程序员 后端

双非本科七面成功入职阿里面经分享!(附面试原题+复盘笔记)

Java 程序员 后端

史上最全Java面试266题:算法+缓存+TCP+JVM

Java 程序员 后端

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