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

作者:来自 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.xdnf.cn/news/1550300.html

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

相关文章

【Lcode 随笔】C语言版看了不后悔系列持续更新中。。。

文章目录 题目一&#xff1a;爬楼梯问题描述&#xff1a;题目分析&#xff1a;解题思路&#xff1a;示例代码&#xff1a;深入剖析&#xff1a; 题目二&#xff1a;打家劫舍问题描述&#xff1a;题目分析&#xff1a;解题思路&#xff1a;示例代码&#xff1a;深入剖析&#xf…

什么是数字化转型?数字化转型对企业有哪些优势?

一、什么是数字化转型&#xff1f; 定义&#xff1a; 数字化转型是指企业或组织将传统业务转化为数字化业务&#xff0c;利用人工智能、大数据、云计算、区块链、5G等数字技术提升业务效率和质量的过程。通俗来说&#xff0c;就是将数字技术应用到企业的各个方面&#xff0c;…

【C语言软开面经】

C语言软开面经 malloc calloc realloc free动态分配内存malloccalloc函数&#xff1a;realloc 函数&#xff1a;free函数&#xff1a; 堆栈-内存分区栈区&#xff08;Stack&#xff09;&#xff1a;堆区&#xff08;Heap&#xff09;&#xff1a;全局&#xff08;静态&#xff…

windows下安装rabbitMQ并开通管理界面和允许远程访问

如题&#xff0c;在windows下安装一个rabbitMQ server&#xff1b;然后用浏览器访问其管理界面&#xff1b;由于rabbitMQ的默认账号guest默认只能本机访问&#xff0c;因此需要设置允许其他机器远程访问。这跟mysql的思路很像&#xff0c;默认只能本地访问&#xff0c;要远程访…

【C++前缀和 动态规划 博弈】1140. 石子游戏 II|2034

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 C动态规划 博弈&#xff1a;往往后续状态已知&#xff0c;前续状态未知 LeetCode1140. 石子游戏 II Alice 和 Bob 继续他们的石子游戏。许多堆石子 排成一行&#xf…

android SELinux权限适配

抓log方法&#xff0c; setenforce 0, 如果不先将selinux设置为permission mode&#xff0c;会导致一个问题。 程序运行的时候遇到权限策略限制&#xff08;假设 sepolicy 1&#xff09;&#xff0c;程序运行失败。添加权限&#xff08;sepolicy 1&#xff09;&#xff0c;然后…

如何将音频转换成mp3?5个宝藏音频转换的方法,学起来!

音频文件已成为我们日常生活中不可或缺的一部分&#xff0c;无论是聆听喜爱的音乐、学习语言课程&#xff0c;还是录制会议内容&#xff0c;音频都扮演着重要角色。然而&#xff0c;随着音频格式的多样化&#xff0c;我们常常会遇到格式不兼容的问题&#xff0c;尤其是在需要将…

【完-网络安全】Windows注册表

文章目录 注册表启动项及常见作用五个根节点常见入侵方式 注册表 注册表在windows系统的配置和控制方面扮演了一个非常关键的角色&#xff0c;它既是系统全局设置的存储仓库&#xff0c;也是每个用户的设置信息的存储仓库。 启动项及常见作用 快捷键 WinR打开运行窗口&#x…

大模型增量训练--基于transformer制作一个大模型聊天机器人

针对夸夸闲聊数据集&#xff0c;利用UniLM模型进行模型训练及测试&#xff0c;更深入地了解预训练语言模型的使用方法&#xff0c;完成一个生成式闲聊机器人任务。 项目主要结构如下&#xff1a; data 存放数据的文件夹 dirty_word.txt 敏感词数据douban_kuakua_qa.txt 原始语…

ubuntu18.04安装教程

window分区 制作启动盘 插入 按F12进入启动选项页面&#xff0c;选择usb启动 选择install ubuntu 进入安装页面 选择中文&#xff08;简体&#xff09; 键盘布局选择英语&#xff08;美国&#xff09; 选择正常安装 等一小会儿 选择其他选项 分区 包括500mb系统分区 1000…

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

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

[sql-04] 连续出现至少三次的数字

数据准备 CREATE TABLE leecode_01 (id bigint not null AUTO_INCREMENT,num int DEFAULT NULL COMMENT 用户名,primary key(id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT leecode(连续出现3次的数字)insert into leecode_01(num) values(12); insert into leecode_01…

大二极限编程社团纳新

大二极限编程社团纳新 组题人&#xff1a;徐苏洋 考试时间&#xff1a;9月29日 18&#xff1a;30 - 10月2日 22&#xff1a;00 中抽取任意4小时答题 请大家写程序时打开录屏软件 EV 10月2日23&#xff1a;00 后未提交至钉钉群众默认放弃比赛&#xff0c;成绩为0分 具体分数以最…

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

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

PHP程离禁用一段IP的写法示例

PHP程离禁用一段IP的写法示例 。 在PHP中&#xff0c;如果你想禁用一段IP地址的访问&#xff0c;你可以使用$_SERVER[REMOTE_ADDR]来获取访问者的IP地址&#xff0c;然后通过判断IP地址是否在你想要禁用的范围内来决定是否拒绝服务。 以下是一个简单的例子&#xff0c;展示了…

【从0开始搭建微服务并进行部署】SpringBoot+dubbo+zookeeper

文章目录 说明环境搭建创建项目父模块设置子模块 dubbo-api子模块 dubbo-provider子模块 dubbo-consumer测试项目 docker部署项目完整项目地址 说明 jdk1.8SpringBoot2.x低版本dubbo&#xff1a;请查看之前教程【微服务】SpringBootDubboZooKeeper 实战 关于本教程将采用jdk1…

关系模型与关系代数——数据库原理 总结2

2.1 关系模型 关系数据结构 关系模型的数据结构是二维表&#xff0c;亦称为关系。关系数据库是表的集合&#xff0c;即关系的集合。表是一个实体集&#xff0c;一行就是一个实体&#xff0c;它由有关联的若干属性的值所构成。 关系模型的相关概念 列就是数据项 或 字段 或 属…

Yolov8分类检测记录

1.先到github上下载&#xff0c;ultralytics源代码 2.pycharm新建一个项目 3.准备训练数据 数据的结构如下 不需要.yaml文件&#xff0c;代码会自动识别要分的类 4.创建一个训练文件 import torch import random import cv2 import numpy as np import os from ultralytics…

Mac安装Manim并运行

1.在macOS上创建Python虚拟环境&#xff0c;可以使用venv模块&#xff0c;这是Python自带的库&#xff0c;也可以使用conda。以下是使用venv创建和使用Python虚拟环境的步骤&#xff1a; 打开终端。 创建一个新的目录来存放你的项目&#xff0c;并进入该目录&#xff1a; mk…

知识产权管理为何要迈向数字化?

在当今数字化时代&#xff0c;知识产权管理也面临着新的机遇与挑战。传统的知识产权管理方式逐渐显露出效率低下、信息不畅通等弊端。随着数字化浪潮的推进&#xff0c;知识产权管理的数字化建设已成为不可逆转的趋势。 1.提高管理效率 自动化流程&#xff1a;数字化建设可以…