引入 LangChain4j 来简化 LLM 与 Java 应用程序的集成

news2024/11/19 18:45:05

作者:来自 Elastic David Pilato

LangChain4j 框架于 2023 年创建,其目标如下:

LangChain4j 的目标是简化将 LLM 集成到 Java 应用程序的过程。

LangChain4j 提供了一种标准方法:

  • 根据给定内容(例如文本)创建嵌入(向量)
  • 将嵌入存储在嵌入存储中
  • 在嵌入存储中搜索类似的向量
  • 与 LLMs 讨论
  • 使用聊天记忆来记住与 LLM 讨论的上下文

此列表并不详尽,LangChain4j 社区一直在实现新功能。

本文将介绍该框架的第一个主要部分。

将 LangChain4j OpenAI 添加到我们的项目中

与所有 Java 项目一样,这只是一个依赖关系问题。在这里我们将使用 Maven,但使用任何其他依赖管理器也可以实现相同的效果。

作为我们想要在此构建的项目的第一步,我们将使用 OpenAI,因此我们只需添加 langchain4j-open-ai artifact:

<properties>
  <langchain4j.version>0.34.0</langchain4j.version>
</properties>

<dependencies>
  <dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-open-ai</artifactId>
    <version>${langchain4j.version}</version>
  </dependency>
</dependencies>

对于其余代码,我们将使用我们自己的 API 密钥(你可以通过注册 OpenAI 帐户获取),或者使用 LangChain4j 项目提供的密钥(仅用于演示目的):

static String getOpenAiApiKey() {
  String apiKey = System.getenv(API_KEY_ENV_NAME);
  if (apiKey == null || apiKey.isEmpty()) {
    Logger.warn("Please provide your own key instead using [{}] env variable", API_KEY_ENV_NAME);
    return "demo";
  }
  return apiKey;
}

我们现在可以创建 ChatLanguageModel 的实例:

ChatLanguageModel model = OpenAiChatModel.withApiKey(getOpenAiApiKey());

最后我们可以提出一个简单的问题并得到答案:

String answer = model.generate("Who is Thomas Pesquet?");
Logger.info("Answer is: {}", answer);

给出的答案可能是这样的:

Thomas Pesquet is a French aerospace engineer, pilot, and European Space Agency astronaut.
He was selected as a member of the European Astronaut Corps in 2009 and has since completed 
two space missions to the International Space Station, including serving as a flight engineer 
for Expedition 50/51 in 2016-2017. Pesquet is known for his contributions to scientific 
research and outreach activities during his time in space.

如果你想运行此代码,请查看 Step1AiChatTest.java 类。

提供更多上下文

让我们添加 langchain4j artifact:

<dependency>
  <groupId>dev.langchain4j</groupId>
  <artifactId>langchain4j</artifactId>
  <version>${langchain4j.version}</version>
</dependency>

这个提供了一个工具集,可以帮助我们构建更高级的 LLM 集成来构建我们的助手。在这里,我们将创建一个 Assistant 接口,它提供聊天方法,该方法将自动调用我们之前定义的 ChatLanguageModel:

interface Assistant {
  String chat(String userMessage);
}

我们只需要要求 LangChain4j AiServices 类为我们构建一个实例:

Assistant assistant = AiServices.create(Assistant.class, model);

然后调用 chat(String) 方法:

String answer = assistant.chat("Who is Thomas Pesquet?");
Logger.info("Answer is: {}", answer);

这与之前的行为相同。那么我们为什么要更改代码呢?首先,它更优雅,但更重要的是,你现在可以使用简单的注释(annotation)向 LLM 发出一些指令:

interface Assistant {
  @SystemMessage("Please answer in a funny way.")
  String chat(String userMessage);
}

现在给出的是:

Ah, Thomas Pesquet is actually a super secret spy disguised as an astronaut! 
He's out there in space fighting aliens and saving the world one spacewalk at a time. 
Or maybe he's just a really cool French astronaut who has been to the International 
Space Station. But my spy theory is much more exciting, don't you think?

如果你想运行此代码,请查看 Step2AssistantTest.java 类。

切换到另一个 LLM

我们可以使用出色的 Ollama 项目。它有助于在你的机器上本地运行 LLM。

让我们添加 langchain4j-ollama artifact:

<dependency>
  <groupId>dev.langchain4j</groupId>
  <artifactId>langchain4j-ollama</artifactId>
  <version>${langchain4j.version}</version>
</dependency>

当我们使用测试运行示例代码时,我们将 Testcontainers 添加到我们的项目中:

<dependency>
  <groupId>org.testcontainers</groupId>
  <artifactId>ollama</artifactId>
  <version>1.20.1</version>
  <scope>test</scope>
</dependency>

我们现在可以启动/停止 Docker 容器:

static String MODEL_NAME = "mistral";
static String DOCKER_IMAGE_NAME = "langchain4j/ollama-" + MODEL_NAME + ":latest";

static OllamaContainer ollama = new OllamaContainer(
  DockerImageName.parse(DOCKER_IMAGE_NAME).asCompatibleSubstituteFor("ollama/ollama"));

@BeforeAll
public static void setup() {
  ollama.start();
}

@AfterAll
public static void teardown() {
  ollama.stop();
}

我们 “只” 需要将 model 对象更改为 OllamaChatModel,而不是我们之前使用的 OpenAiChatModel:

OllamaChatModel model = OllamaChatModel.builder()
  .baseUrl(ollama.getEndpoint())
  .modelName(MODEL_NAME)
  .build();

请注意,提取图像及其模型可能需要一些时间,但过一会儿,你就可以得到答案:

Oh, Thomas Pesquet, the man who single-handedly keeps the French space program running 
while sipping on his crisp rosé and munching on a baguette! He's our beloved astronaut 
with an irresistible accent that makes us all want to learn French just so we can 
understand him better. When he's not floating in space, he's probably practicing his 
best "je ne sais quoi" face for the next family photo. Vive le Thomas Pesquet! 
🚀🌍🇫🇷 #FrenchSpaceHero

记忆力更好

如果我们问多个问题,默认情况下系统不会记住之前的问题和答案。因此,如果我们在第一个问题之后问 “When was he born?”,我们的应用程序将回答:

Oh, you're asking about this legendary figure from history, huh? Well, let me tell 
you a hilarious tale! He was actually born on Leap Year's Day, but only every 400 
years! So, do the math... if we count backwards from 2020 (which is also a leap year), 
then he was born in... *drumroll please* ...1600! Isn't that a hoot? But remember 
folks, this is just a joke, and historical records may vary.

这太荒谬了。相反,我们应该使用 Chat Memory:

ChatMemory chatMemory = MessageWindowChatMemory.withMaxMessages(10);
Assistant assistant = AiServices.builder(Assistant.class)
  .chatLanguageModel(model)
  .chatMemory(chatMemory)
  .build();

现在运行同样的问题会得到一个有意义的答案:

Oh, Thomas Pesquet, the man who was probably born before sliced bread but after dinosaurs! 
You know, around the time when people started putting wheels on suitcases and calling it 
a revolution. So, roughly speaking, he came into this world somewhere in the late 70s or 
early 80s, give or take a year or two - just enough time for him to grow up, become an 
astronaut, and make us all laugh with his space-aged antics! Isn't that a hoot? 
*laughs maniacally*

结论

在下一篇文章中,我们将了解如何使用 Elasticsearch 作为嵌入存储向我们的私有数据集提问。这将为我们提供一种方法,将我们的应用程序搜索提升到一个新的水平。

准备好自己尝试一下了吗?开始免费试用。
Elasticsearch 集成了 LangChain、Cohere 等工具。加入我们的高级语义搜索网络研讨会,构建您的下一个 GenAI 应用程序!

原文:LangChain4j: Simple LLM integration into Java apps — Search Labs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2177453.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VSCode编程配置再次总结

VScode 中C++编程再次总结 0.简介 1.配置总结 1.1 launch jsion文件 launch.json文件主要用于运行和调试的配置,具有程序启动调试功能。launch.json文件会启用tasks.json的任务,并能实现调试功能。 左侧任务栏的第四个选项运行和调试,点击创建launch.json {"conf…

AI变现N种方式,新手小白必看!【保姆级教程】

风口&#xff01;风口&#xff01;风口&#xff01; 终于不用再抱怨 “我们这代人啊&#xff0c;什么也没赶上” 因为我们现在正处于风口之上&#xff01; 在当今数字化的时代 AI 绘画正以惊人的速度崛起 并向各行各业渗透 既然阻止不了时代的变化 那就让它为我们所用 …

打造高业绩朋友圈:策略与实践

在数字化时代&#xff0c;朋友圈不仅是个人生活的展示窗口&#xff0c;更是商业变现的有力平台。许多人通过精心经营朋友圈&#xff0c;实现了财富的增长&#xff0c;甚至达到了年入百万的惊人业绩。朋友圈已成为普通人实现逆袭的重要战场。 要打造一个业绩过万的朋友圈&#…

微积分入门(真的很入门)

前置知识 前置知识&#xff1a;极限 我们要求 lim ⁡ x → 1 x 2 − 1 x − 1 \lim\limits_{x \to 1}\dfrac{x^2-1}{x-1} x→1lim​x−1x2−1​。 右边我们都知道是什么意思&#xff0c;那左边是什么呢&#xff1f; 意思就是&#xff0c;当 x x x 无限接近 1 1 1 时&…

Java IO 和 NIO

在 Java 编程中&#xff0c;输入输出&#xff08;IO&#xff09;是不可或缺的部分&#xff0c;随着技术的发展&#xff0c;Java 的 IO 系统也经历了显著的变化。本文将深入探讨 Java IO 和 NIO 的历史、优缺点以及适用场景。 1. Java IO 的历史 Java IO 包&#xff08;java.i…

JVM和GC监控技术

一、监控技术简介 JVM是什么&#xff1f;项目里面有JVM吗&#xff1f;JVM跟Tomcat有什么关系&#xff1f;为什么需要去分析JVM&#xff1f; 1. JVM(全称&#xff1a;Java Virtual Machine)&#xff0c;Java虚拟机 是Java程序运行的环境&#xff0c;它是一个虚构的计算机&…

盛世欢歌,共庆华诞!祝大家国庆节快乐!

举国同庆 盛世中华 盛世欢歌&#xff0c;共庆华诞&#xff01;在这美好的时光里&#xff0c;让我们一起欢庆国庆&#xff0c;感受祖国的强大和美好。数图祝大家国庆快乐&#xff01; 国庆来临之际&#xff0c;根据国家有关规定&#xff0c;现将2024年国庆放假安排通知如下&…

JVM(HotSpot):虚拟机栈(JVM Stacks)与本地方法栈(Native Method Stacks)

文章目录 一、内存结构图二、数据结构-栈三、JVM栈四、本地方法栈五、问题辨析1、垃圾回收是否涉及栈内存&#xff1f;2、栈内存越大越好吗&#xff1f;3、方法内的局部变量是否线程安全&#xff1f;4、栈内存溢出问题 一、内存结构图 二、数据结构-栈 数据结构中&#xff0c;…

windows 系统服务在注册表中的位置

计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services 此注册表项下是系统服务安装信息 利用此注册表项可以获取服务详细信息

新版Android Studio Koala 导入github第三方依赖 maven仓库的处理方法 (java版)

以下是依赖的处理 这是由于Android Studio 构建项目模式发生改变了。 旧版项目构造 创建新的项目采用build.gradle.kts配置。 先看旧版同样的配置是什么样的。 再来查看新版带.kts后缀文件官方自带的库是怎么配置&#xff0c;模拟配置就OK。 先看libs文件这个库的写法。 …

隐藏SpringBoot自动生成的文件

第一种方法——删除 第二种方法——Settings——Editor——fail types

题库系统平台开发功能解析

题库系统开发功能介绍可以从多个方面进行阐述&#xff0c;以下是一些核心功能及其详细解释 1. 题库管理系统 题目录入与编辑&#xff1a;提供灵活的题目录入方式&#xff0c;支持手动输入、批量导入&#xff08;如从Excel、Word等文件中导入&#xff09;以及从其他题库中复制试…

HuggingChat macOS版正式发布!文章内附体验地址!我国打造糖尿病专用AI模型|AI日报

文章推荐 全新豆包AI视频模型发布&#xff01;实测下的可灵与豆包&#xff01;原来它们的差距不止一点点... 今日热点 我国团队打造糖尿病专用AI模型 上海交通大学清源研究院MIFA实验室携手复旦大学附属中山医院内分泌科&#xff0c;组建专家团队&#xff0c;联手开发一款名…

Spring Boot项目连接Oracle数据库启动报错:Undefined Error

描述&#xff1a;远程拉下来的代码&#xff0c;配置了maven仓库后&#xff0c;未进行其他修改&#xff0c;自己本地启动报错。 报错现状&#xff1a; 解决&#xff1a;添加参数-Duser.nameuser后&#xff0c;启动成功。 原因分析&#xff1a; 分析一&#xff1a; maven仓…

Altium Designer脚本系统内置函数汇总(2417个)

Altium Designer脚本系统内置函数汇总(2417个) ↑↑↑点击上方蓝字&#xff0c;关注我们&#xff01; Altium Designer 2013脚本系统内置函数&#xff0c;一共2417个。 这些函数名称复制到Altium Designer 2013脚本编辑器中会自动变为褐红色(#800000)&#xff0c;内部函数大部分…

跨境必备:3个必不可少的低预算营销渠道

不管是跨境电商卖家还是外贸从业人员&#xff0c;从个体到企业或品牌&#xff0c;流量都是宣传营销领域的重点。有流量才能让更多的消费者看到自己的产品&#xff0c;从而有机会了解产品并促成转化。 各大跨境电商平台、社交媒体平台和搜索引擎等平台都提供了付费营销功能&…

16.网络编程(下篇)

目录 1.网络编程概述 2.应用软件架构 3.网络编程三要素-IP地址 4.网络编程三要素-端口与协议 5.UDP通信程序 6.TCP通信程序 1.网络编程概述 1.1计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系…

【问题解决】win10日志错误:创建 TLS 客户端凭据时发生致命错误。 内部错误状态为 10013

背景 最近win10死机了一次&#xff0c;查看事件管理器发现有大量的报错&#xff1a;“创建 TLS 客户端凭据时发生致命错误。 内部错误状态为 10013”&#xff0c;如图&#xff1a; 解决 win键搜索internet选项 确定。 原因 参考错误&#xff1a;“ 创建 TLS 客户端凭据…

C++基础知识9 模版进阶

模版进阶 1. 非类型模板参数2. 模板的特化2.1 概念2.2 函数模板特化2.3 类模板特化2.3.1 全特化2.3.2 偏特化2.3.3 类模板特化应用示例 3 模板分离编译3.1 什么是分离编译3.2 模板的分离编译3.3 解决方法 4. 模板总结 1. 非类型模板参数 模板参数分类类型形参与非类型形参。 类…

有些硬盘录像机接入视频汇聚平台EasyCVR后通道不显示/显示不全,该如何处理?

EasyCVR视频监控汇聚管理平台是一款针对大中型项目设计的跨区域网络化视频监控集中管理平台。该平台不仅具备视频资源管理、设备管理、用户管理、运维管理和安全管理等功能&#xff0c;还支持多种主流标准协议&#xff0c;如GB28181、RTSP/Onvif、RTMP、部标JT808、GA/T 1400协…