LangChain4j 从入门到放弃,java可以使用的 LLM 大模型 AI 框架(2)LangChain4j 支持的 API 和消息类型

注意:本篇文章建立在官方文档的理解上,文章会围绕官方文档去书写,博主会根据对框架的理解去动态修改文章内容,由于该框架的官方文档写的并不是很详细,市面上也没有特别详细的教程,所以博主也不能很全面的理解整个框架,但是对于入门来说,已经足够了,如果有看不懂的地方建议把全部文章都阅读一遍后再回顾会有不同的理解。

LangChain4j 支持的 API 和消息类型(Chat and Language Models)

官网Chat and Language Models介绍

LangChain4j 的核心 API 类型

当前,LangChain4j 支持的 LLMs API 主要分为两种:

  • LanguageModels.
    • 早期的简单 API,只接受 String 输入并返回 String 输出。此 API 已过时,未来将主要支持新的聊天 API(即 ChatLanguageModel)。
  • ChatLanguageModels
    • 目前推荐使用的主要 API,支持更复杂的输入和输出。
    • 接受单个或多个 ChatMessages 作为输入,并返回 AiMessage 作为输出。ChatMessage 通常包含文本,但某些 LLMs 还支持文本和Images 的混合。此类聊天模型的示例包括 OpenAI 的 gpt-4o-mini 和 Google 的 gemini-1.5-pro

未来 LangChain4j 不再扩展 LanguageModel 支持,因此推荐在所有新功能中使用 ChatLanguageModel

特定功能模型类型

除了这两类核心 API,LangChain4j 还支持几种特定功能的模型类型,这些模型并非标准的聊天和语言 API,但用于特定应用场景中:

  • EmbeddingModel:用于将文本转换为向量(Embedding),便于语义搜索和聚类。
  • ImageModel:用于生成和编辑图像。
  • ModerationModel:用于检测文本是否包含有害内容,确保内容安全。
  • ScoringModel:用于根据查询对文本段落进行相关性评分,适用于 RAG(检索增强生成)任务。

ChatLanguageModel 的API

简化版 generate 方法

public interface ChatLanguageModel {String generate(String userMessage);...
}

如上所示,generate 方法接收一个 String 类型的输入,并返回一个 String 类型的输出,这与 LanguageModel 类似。这是一个简化的便捷方法,方便你快速进行测试,而无需将字符串封装在 UserMessage 中。

实际的聊天 API

    ...Response<AiMessage> generate(ChatMessage... messages);Response<AiMessage> generate(List<ChatMessage> messages);...

这两个版本的 generate 方法接受一个或多个 ChatMessage 作为输入。ChatMessage 是一个基础接口,代表一条聊天消息。

ChatMessage 的类型

ChatLanguageModelgenerate 方法接受一个或多个 ChatMessage 作为输入。ChatMessage 是聊天消息的基本结构,目前有四种类型:

  1. UserMessage
    • 表示用户的消息。用户可以是应用程序的最终用户 (人类) 或应用程序本身。根据 LLM,UserMessage 可以只包含文本 (String) 或文本和/或图像 (Image)。
  2. AiMessage
    • 由 AI 生成的响应消息,通常是为了响应 UserMessagegenerate 方法返回一个 AiMessage(包装在 Response 对象中),可以包含文本响应或请求执行特定工具的命令(ToolExecutionRequest)。
  3. ToolExecutionResultMessage
    • 表示 ToolExecutionRequest 的执行结果,将在后续内容中详细介绍。
  4. SystemMessage
    • 由系统生成的消息。通常用于定义对话的上下文和规则。开发人员可以在此提供 AI 应该扮演的角色、回答的方式和对话的基调等说明。
    • LLMs 通常更关注 SystemMessage,因此要谨慎编写此消息内容,避免最终用户任意定义或修改。

简单场景示例:

public static void main(String[] args) {// 创建一个OpenAiChatModel实例,这是ChatLanguageModel的子类实现。// LangChain4j支持多种LLM模型,每种模型类型都有相应的实现类,这里使用的是OpenAiChatModel。ChatLanguageModel model = OpenAiChatModel.builder().apiKey("demo") // 设置OpenAI API密钥。这里使用“demo”作为演示密钥,适用于临时测试,且仅限于gpt-4o-mini模型.modelName("gpt-4o-mini") // 指定要调用的模型名称(例如,gpt-4o-mini)。.build(); // 构建模型实例。// 创建一个 UserMessage 实例,表示来自用户的消息。UserMessage message = UserMessage.from("说 'Hello World'");// 将 UserMessage 作为输入并获取响应。返回的结果是一个 Response 对象,封装了 AiMessage。Response<AiMessage> response = model.generate(message);// 打印出模型响应内容的文本部分。调用 response.content().text() 获取响应的具体文本。System.out.println(response.content().text());
}

多个 ChatMessages

LLMs 本质上是无状态的,也就是说,它们不会自动记住对话的历史。为了实现多轮对话,必须手动管理对话的状态,将历史对话内容一起传入,确保 LLM 可以基于上下文理解当前请求。

假设我们要实现一个简单的聊天机器人,用户和 AI 之间的多轮对话如下:

  • 用户:你好,我叫 XX
  • AI:你好,XX,我能帮你什么吗?
  • 用户:我叫什么名字?
  • AI:XX

在此例中,如果不提供对话上下文,AI 可能会错误回答用户的问题,因为它 “忘记” 了之前的对话。这时,需要通过多个 ChatMessage 实现上下文的保留,让 AI 能正确识别用户的名字。

代码示例:

public static void main(String[] args) {// 创建一个OpenAiChatModel实例,这是ChatLanguageModel的子类实现。// LangChain4j支持多种LLM模型,每种模型类型都有相应的实现类,这里使用的是OpenAiChatModel。ChatLanguageModel model = OpenAiChatModel.builder().apiKey("demo") // 设置OpenAI API密钥。这里使用“demo”作为演示密钥,适用于临时测试,且仅限于gpt-4o-mini模型.modelName("gpt-4o-mini") // 指定要调用的模型名称(例如,gpt-4o-mini)。.build(); // 构建模型实例。// 开始多轮对话UserMessage firstUserMessage = UserMessage.from("你好,我叫 浩博");AiMessage firstAiMessage = model.generate(firstUserMessage).content();System.out.println(firstAiMessage.text()); // 输出 AI 回复// 第二轮对话UserMessage secondUserMessage = UserMessage.from("我叫什么名字?");// 传入第一轮用户消息、AI 回复和第二轮用户消息,以维持对话上下文AiMessage secondAiMessage = model.generate(firstUserMessage, firstAiMessage, secondUserMessage).content();System.out.println(secondAiMessage.text()); // 输出 AI 回应
}

通过在 generate 方法中传入多条 ChatMessage,我们让模型保持对话上下文,使其理解当前轮对话的意义。

多模态(Multimodality)

UserMessage 不仅可以包含文本,还可以包含其他类型的内容。UserMessage 包含一个 List<Content> 类型的 contentsContent 是一个接口,具有以下几种实现:

  • TextContent
  • ImageContent
  • AudioContent
  • VideoContent
  • PdfFileContent

你可以查看比较表,了解哪些 LLM 提供商支持哪些模态。

以下是一个同时发送文本和图片给 LLM 的示例:

UserMessage userMessage = UserMessage.from(TextContent.from("Describe the following image"),ImageContent.from("https://example.com/cat.jpg")
);
Response<AiMessage> response = model.generate(userMessage);

文本内容(Text Content)

TextContent 是最简单的 Content 类型,表示纯文本,并包装一个单独的 StringUserMessage.from(TextContent.from("Hello!")) 等价于 UserMessage.from("Hello!")

可以在 UserMessage 中提供一个或多个 TextContent

UserMessage userMessage = UserMessage.from(TextContent.from("Hello!"),TextContent.from("How are you?")
);

图片内容(Image Content)

根据 LLM 提供商的不同,ImageContent 可以通过远程图片的 URL 来创建(如上例所示),也可以通过 Base64 编码的二进制数据来创建:

byte[] imageBytes = readBytes("/home/me/cat.jpg");
String base64Data = Base64.getEncoder().encodeToString(imageBytes);
ImageContent imageContent = ImageContent.from(base64Data, "image/jpg");
UserMessage userMessage = UserMessage.from(imageContent);

还可以指定 DetailLevel 枚举(包括 LOWHIGHAUTO 选项)来控制模型如何处理图像。更多细节请参见文档。

音频内容(Audio Content)

AudioContentImageContent 类似,但表示的是音频内容。

视频内容(Video Content)

VideoContentImageContent 类似,但表示的是视频内容。

PDF 文件内容(PDF File Content)

PdfFileContentImageContent 类似,但表示的是 PDF 文件的二进制内容。

Kotlin 扩展

ChatLanguageModel 的 Kotlin 扩展提供了用于与语言模型进行聊天交互的异步方法,充分利用了 Kotlin 的协程功能。chatAsync 方法支持对 ChatRequestChatRequest.Builder 的配置进行非阻塞处理,并返回包含模型回复的 ChatResponse。类似地,generateAsync 用于异步生成聊天消息的回复。

这些扩展简化了聊天请求的构建和会话的高效处理,非常适合在 Kotlin 应用中使用。需要注意的是,这些方法被标记为实验性功能,未来可能会有所变化。

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

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

相关文章

python异常、模块和包

文章目录 异常异常简介异常处理捕获所有异常捕获指定异常捕获多个指定异常 异常else、finally异常的传递 模块模块导入自定义模块 包自定义python包安装第三方python包 综合案例 异常 异常简介 异常就是程序运行过程中出现了错误 f open(RLlearn_2.txt, "r", enc…

Python内存泄漏 —— 宏观篇

Python内存泄漏 —— 宏观篇 应该弄清楚哪些问题 内存情况如何&#xff0c;是否一直增长&#xff1f;哪些是异常对象&#xff1f;这类对象占总内存多大比例&#xff1f;异常对象为何泄漏&#xff1f;如何使其正常释放&#xff1f;如何确定异常对象正常释放了&#xff1f;如何…

Chromium CDP 开发(五):注册自己的指令(中)

引言 在前一篇文章中&#xff0c;我们已经了解了 PDL&#xff08;Protocol Description Language&#xff09;的基本功能以及如何在其中声明 CDP&#xff08;Chrome DevTools Protocol&#xff09;指令和事件的具体内容。接下来&#xff0c;我们将深入探讨如何在实际开发中进行…

回溯算法解决全排列问题

1. 问题描述 定义&#xff1a;给定一个不含重复数字的数组 nums &#xff0c;返回其所有可能的全排列 。 示例&#xff1a; 输入数组 [1, 2, 3] 输出结果应该为&#xff1a; leetcode 地址 2. 代码实现 package com.ztq.algorithm.BackTrack;import java.util.List; impo…

金融行业 IT 实践|某信托公司:从虚拟化到容器平台的 VMware 替代与双活建设实践

随着“VMware 替代” 在金融行业的快速推进&#xff0c;不少金融用户的替代进程已逐渐从存储、虚拟化过渡到容器平台层面&#xff0c;实现更为全面的 VMware 国产化替代与架构升级。其中&#xff0c;某信托用户在使用 SmartX 超融合&#xff08;采用 VMware 虚拟化和 Tanzu 容器…

python学习——格式化字符串

在Python中&#xff0c;格式化字符串是一种将变量插入到字符串中的方法&#xff0c;使得字符串的构建更为灵活和方便。以下是一些常见的格式化字符串的方法&#xff1a; 文章目录 1. 使用百分号 % 格式化2. 使用 str.format() 方法3. 使用 f-string (格式化字符串字面量)格式说…

【上线文档】系统上线方案模板,计算机系统上线保障计划,系统运维信息系统运行保障方案,系统上线方案模板(Word原件)

一、项目背景和目标 二、项目需求分析 2.1 功能需求 2.2 非功能需求 三、系统设计 3.1 系统架构设计 3.2 数据库设计 3.3 接口设计 3.4 用户界面设计 四、系统开发 4.1 开发环境搭建 4.2 业务逻辑开发 4.3 数据库实现 4.4 接口实现 4.5 用户界面实现 五、系统测…

MySQL索引再认识

在最近的一次MySQL测试过程中&#xff0c;我的同事幺加明遇到了一些令人困惑的现象&#xff0c;这些现象超出了我们最初的预期。一直以来&#xff0c;我们在建立索引时&#xff0c;首要考虑的原则是在区分度大的字段上建立索引。然而&#xff0c;在实际测试中&#xff0c;我们发…

SQL靶场第一关

打开sql靶场 一.判断注入类型 在网址输入?id1&#xff0c;页面正常回显 我们在输入?id1,页面报错&#xff0c;说明存在sql注入 我们再输入?id1 and 11--&#xff0c;页面正常回显 我们在输入?id1 and 12--&#xff0c;页面没有回显 这里我们知道了是字符型注入 为什么是…

ollama运行qwen2.5-coder:7b

1.linux安装 curl -fsSL https://ollama.com/install.sh | sh ollama serve # 启动ollama ollama create # 从模型文件创建模型 ollama show # 显示模型信息 ollama run # 运行模型&#xff0c;会先自动下载模型 ollama pull # 从注册仓库中拉取模…

牛客——打印日期,日期累加(C++)

目录 1.日期累加 1.1题目描述 1.2思路 1.3 2.打印日期 2.1题目描述 2.2思路 2.3代码 1.日期累加 1.1题目描述 计算一个日期加上若干天后是什么日期。输入第一行表示样例个数m&#xff0c;接下来m行每行四个整数分别表示年月日和累加的天数。输出m行&#xff0c;每行按…

Stylus 浏览器扩展开发-Cursor AI辅助

项目起源 作为一个经常需要长时间盯着屏幕的开发者&#xff0c;我一直在寻找一个简单的方法来保护眼睛。最初的想法很简单&#xff1a;将网页背景色替换成护眼的豆沙绿。虽然市面上已经有类似的扩展&#xff0c;但我想要一个更加轻量且可定制的解决方案。 这个简单的需求逐渐…

AD20 原理图库和PCB库添加

一 点击右下角 二 点击Components 三 点击File-based Libraries Preferences 四 最后点击安装即可

微信小程序uni-app+vue3实现局部上下拉刷新和scroll-view动态高度计算

微信小程序uni-appvue3实现局部上下拉刷新和scroll-view动态高度计算 前言 在uni-appvue3项目开发中,经常需要实现列表的局部上下拉刷新功能。由于网上相关教程较少且比较零散,本文将详细介绍如何使用scroll-view组件实现这一功能,包括动态高度计算、下拉刷新、上拉加载等完整…

针对边缘计算优化LoRa的TinyML信道跳变管道

论文标题&#xff1a;Optimizing LoRa for Edge Computing with TinyML Pipeline for Channel Hopping&#xff08;针对边缘计算优化LoRa的TinyML信道跳变管道&#xff09; 作者信息&#xff1a;Marla Grunewald, Mounir Bensalem 和 Admela Jukan&#xff0c;来自德国布伦瑞克…

Linux-USB驱动实验

USB 是很常用的接口&#xff0c;目前大多数的设备都是 USB 接口的&#xff0c;比如鼠标、键盘、USB 摄像头等&#xff0c;我们在实际开发中也常常遇到 USB 接口的设备&#xff0c;本章我们就来学习一下如何使能 Linux内核自带的 USB 驱动。注意&#xff01;本章并不讲解具体的 …

操作系统文件管理相关习题2

文件管理的任务和功能文件管理 任务&#xff1a;对用户文件和系统文件进行组织管理&#xff0c;以方便用户使用&#xff0c;并保证文件的安全 功能&#xff1a;文件存储空间的管理&#xff0c;目录管理&#xff0c;文件读写管理和保护 目录管理 对目录管理的要求 实现按名存…

MYSQL - 索引详解

一 什么是索引&#xff1f; 实际上在上一篇介绍MYSQL的体系结构当中我们稍微提及了一点&#xff0c;在引擎层&#xff0c;我们提到不同的引擎对应的索引的实现方式&#xff0c;选择是不一样的。 简单理解&#xff0c;索引&#xff08;index&#xff09;其实就是一种帮助MYSQL高…

AI智能体Prompt预设词指令大全+GPTs应用使用

AI智能体使用指南 直接复制在AI工具助手中使用&#xff08;提问前&#xff09; 可前往SparkAi系统用户官网进行直接使用 SparkAI系统介绍文档&#xff1a;Docs 常见AI智能体GPTs应用大全在线使用 自定义添加制作AI智能体进行使用&#xff1a; 文章润色器 你是一位具有敏锐洞察…

el-tree树形结构拖拽层级错乱问题

背景: 项目中有个文件夹树形菜单,并且各级菜单中的子级元素是可以任意拖拽的,也就是树形结构拖拽修改分组。 问题分析&#xff1a; 出现拖拽层级错乱的问题&#xff0c;这通常意味着在进行节点拖拽操作后&#xff0c;树的层级关系没有正确地被维护。这可能是因为在更新节点位…