LangChain4j支持的API类型

本文描述了底层的大语言模型(LLM)API。高级的LLM API参见AI服务。

1 LLM API的类型

1.1 LanguageModel

非常简单—,接受一个String作为输入,并返回一个String作为输出。

该API现正逐渐被聊天API(第二种API类型)取代。

1.2 ChatLanguageModel

这种API接受一或多个ChatMessage作为输入,并返回一个AiMessage作为输出。 ChatMessage通常包含文本,但有些LLM还支持混合文本和Image的输入。如OpenAI的gpt-4o-mini和Google的gemini-1.5-pro都属于这种。

LangChain4j中,将不再扩展对LanguageModel的支持,因此所有新功能采用ChatLanguageModel API。

ChatLanguageModel是LangChain4j中的底层API,提供了最大的功能和灵活性。还有高级API(如ChainAiServices)。

除了ChatLanguageModelLanguageModel,LangChain4j还支持以下类型的模型:

  • EmbeddingModel:可将文本转换为Embedding
  • ImageModel:可生成和编辑Image
  • ModerationModel:可检查文本中是否包含有害内容。
  • ScoringModel:可根据查询对多段文本进行评分(或排名),以确定每段文本与查询的相关性。这在RAG(检索增强生成)中非常有用。

2 ChatLanguageModel API

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

generate接受一个String作为输入并返回一个String作为输出,类似LanguageModel。这是一个便捷方法,可快速使用它,无需将String包装在UserMessage中。

但这才是实际的聊天API:

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

这些generate接受一或多个ChatMessage作为输入。ChatMessage是一个表示聊天消息的基础接口。

3 ChatMessage的类型

目前有四种聊天消息类型,每种消息对应不同的“来源”:

  • UserMessage:这是来自用户的消息。用户可以是您的应用程序的最终用户(人类)或应用程序本身。 根据LLM支持的模态,UserMessage可以包含仅文本(String)或文本和/或图像(Image)。
  • AiMessage:AI生成的消息,通常是对UserMessage的响应。 如你所见,generate返回一个包含在Response中的AiMessageAiMessage可包含文本响应(String)或请求执行工具(ToolExecutionRequest)。
  • ToolExecutionResultMessageToolExecutionRequest的结果
  • SystemMessage:系统的消息。通常,作为开发者应定义此消息的内容。可在此编写关于LLM在对话中的角色、应如何表现、以何种风格回答等指令。 LLM被训练得更关注SystemMessage,因此要小心,最好不要让最终用户随意定义或注入一些输入到SystemMessage中。 它通常位于对话的开始。

如何在对话中组合它们?

最简单的场景,可在generate方法中提供一个UserMessage实例。 这与第一个版本的generate方法类似,它接受一个String作为输入。 主要区别在于它现在返回的不是String,而是Response<AiMessage>

Response是一个包装了内容(负载)的对象,经常看到它作为*Model类的返回类型。 除了内容(在这种情况下是AiMessage),Response还包含生成的元信息:

  • TokenUsage,统计了输入(提供给generate方法的所有ChatMessage)中包含的token数及输出(AiMessage)中生成的token数,并给出总数(输入 + 输出)。需要这些信息来计算每次调用LLM的成本
  • FinishReason,枚举类型,表示生成停止的各种原因。通常,如果LLM自行决定停止生成,则原因会是FinishReason.STOP

创建UserMessage

有多种方式,取决于内容。最简单的new UserMessage("Hi")UserMessage.from("Hi")`。

4 多个ChatMessage

为啥要提供多个ChatMessage作为输入,而不仅是一个? 因为LLM本质上是无状态的,这意味着它们不会维护对话的状态。 因此,如果你想支持多轮对话,则需要自己管理对话的状态。

假设想构建一个聊天机器人。想象一下用户和聊天机器人(AI)之间的简单多轮对话:

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

这就是与ChatLanguageModel交互的样子:

UserMessage firstUserMessage = UserMessage.from("Hello, my name is JavaEdge");
AiMessage firstAiMessage = model.generate(firstUserMessage).content(); // JavaEdge,我能帮你什么?
UserMessage secondUserMessage = UserMessage.from("What is my name?");
AiMessage secondAiMessage = model.generate(firstUserMessage, firstAiMessage, secondUserMessage).content(); // JavaEdge

如你所见,在第二次调用generate方法时,不仅提供了secondUserMessage,还提供了对话中的前几条消息。

手动维护和管理这些消息比较繁琐,因此引入ChatMemory

关注我,紧跟本系列专栏文章,咱们下篇再续!

作者简介:魔都架构师,多家大厂后端一线研发经验,在分布式系统设计、数据平台架构和AI应用开发等领域都有丰富实践经验。

各大技术社区头部专家博主。具有丰富的引领团队经验,深厚业务架构和解决方案的积累。

负责:

  • 中央/分销预订系统性能优化

  • 活动&券等营销中台建设

  • 交易平台及数据中台等架构和开发设计

  • 车联网核心平台-物联网连接平台、大数据平台架构设计及优化

  • LLM Agent应用开发

  • 区块链应用开发

  • 大数据开发挖掘经验

  • 推荐系统项目

    目前主攻市级软件项目设计、构建服务全社会的应用系统。

参考:

  • 编程严选网

    本文由博客一文多发平台 OpenWrite 发布!

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

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

相关文章

【Delphi】通过 LiveBindings Designer 链接控件示例

本教程展示了如何使用 LiveBindings Designer 可视化地创建控件之间的 LiveBindings&#xff0c;以便创建只需很少或无需源代码的应用程序。 在本教程中&#xff0c;您将创建一个高清多设备应用程序&#xff0c;该应用程序使用 LiveBindings 绑定多个对象&#xff0c;以更改圆…

十七、RC振荡电路

振荡电路 1、振荡电路的组成、作用、起振的相位条件以及振荡电路起振和平衡幅度条件&#xff0c; 2、RC电路阻抗与频率、相位与频率的关系曲线; 3、RC振荡电路的相位条件分析和振荡频率

【yolo算法打架行为检测行人检测】

yolo打架行为检测 yolo算法打架行为检测yolo行人检测 yolo算法打架行为检测 数据集和模型YOLO算法打架行为检测数据集1万数据集 分两个类别&#xff1a;正常&#xff0c;打架行为&#xff1b; train: ../train/images val: ../valid/images test: ../test/images nc: 2 names…

一次RPC调用过程是怎么样的?

注册中心 RPC&#xff08;Remote Procedure Call&#xff09;翻译成中文就是 {远程过程调用}。RPC 框架起到的作用就是为了实现&#xff0c;调用远程方法时&#xff0c;能够做到和调用本地方法一样&#xff0c;让开发人员更专注于业务开发&#xff0c;不用去考虑网络编程等细节…

演示jvm锁存在的问题

文章目录 1、AlbumInfoApiController --》testLock()2、redis添加键值对3、AlbumInfoServiceImpl --》testLock() 没有加锁4、使用ab工具测试4.1、安装 ab 工具4.2、查看 redis 中的值 5、添加本地锁 synchronized6、集群情况下问题演示 jvm锁&#xff1a;synchronized lock 只…

尚品汇-H5移动端整合系统(五十五)

目录&#xff1a; &#xff08;1&#xff09;运行前端页面 &#xff08;2&#xff09;启动前端页面 &#xff08;3&#xff09;添加搜索分类接口 &#xff08;4&#xff09;购物车模块修改 &#xff08;5&#xff09;登录模块 &#xff08;6&#xff09;订单模块 &#…

Golang | Leetcode Golang题解之第423题从英文中重建数字

题目&#xff1a; 题解&#xff1a; func originalDigits(s string) string {c : map[rune]int{}for _, ch : range s {c[ch]}cnt : [10]int{}cnt[0] c[z]cnt[2] c[w]cnt[4] c[u]cnt[6] c[x]cnt[8] c[g]cnt[3] c[h] - cnt[8]cnt[5] c[f] - cnt[4]cnt[7] c[s] - cnt[6]…

【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL16

使用8线-3线优先编码器Ⅰ实现16线-4线优先编码器 描述 ②请使用2片该优先编码器Ⅰ及必要的逻辑电路实现16线-4线优先编码器。优先编码器Ⅰ的真值表和代码已给出。 可将优先编码器Ⅰ的代码添加到本题答案中&#xff0c;并例化。 优先编码器Ⅰ的代码如下&#xff1a; module…

[python]从零开始的PySide安装配置教程

一、PySide是什么&#xff1f; PySide 是 Qt for Python 项目的一部分&#xff0c;它提供了与 PyQt 类似的功能&#xff0c;使开发者能够使用 Python 编程语言来构建基于 Qt 的图形用户界面 (GUI) 应用程序。PySide 是由 Qt 公司官方维护的&#xff0c;而 PyQt 则是由第三方开发…

【Pyside】pycharm2024配置conda虚拟环境

知识拓展 Pycharm 是一个由 JetBrains 开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它主要用于 Python 编程语言的开发。Pycharm 提供了代码编辑、调试、版本控制、测试等多种功能&#xff0c;以提高 Python 开发者的效率。 Pycharm 与 Python 的关系 Pycharm 是…

【JavaEE】——多线程(join阻塞,计算,引用,状态)

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯&#xff0c;你们的点赞收藏是我前进最大的动力&#xff01;&#xff01;希望本文内容能够帮助到你&#xff01; 目录 一&#xff1a;join等待线程结束 1&#xff1a;知识回顾 2&#xff1a;join的功能就是“阻塞等待” …

java之斗地主部分功能的实现

今天我们要实现斗地主中发牌和洗牌这两个功能&#xff0c;该如何去实现呢&#xff1f; 1.创建牌类&#xff1a;52张牌每一张牌包含两个属性:牌的大小和牌的花色。 故我们优先创建一个牌的类(Card)&#xff1a;包含大小和花色。 public class Card { //单张牌的大小及类型/…

无人机+自组网:中继通信增强技术详解

无人机与自组网技术的结合&#xff0c;特别是通过中继通信增强技术&#xff0c;为无人机在复杂环境中的通信提供了稳定、高效、可靠的解决方案。以下是对该技术的详细解析&#xff1a; 一、无人机自组网技术概述 无人机自组网技术是一种利用无人机作为节点&#xff0c;通过无…

proteus仿真学习(1)

一&#xff0c;创建工程 一般选择默认模式&#xff0c;不配置pcb文件 可以选用芯片型号也可以不选 不选则从零开始布局&#xff0c;没有初始最小系统。选用则有初始最小系统以及基础的main函数 本次学习使用从零开始&#xff0c;不配置固件 二&#xff0c;上手软件 1.在元件…

6--SpringBootWeb案例(详解)

目录 环境搭建 部门管理 查询部门 接口文档 代码 删除部门 接口文档 代码 新增部门 接口文档 代码 已有前端&#xff0c;根据接口文档完成后端功能的开发 成品如下&#xff1a; 环境搭建 1. 准备数据库表 (dept 、 emp) -- 部门管理 create table dept( id int un…

如何有效检测住宅IP真伪?

在当今的互联网时代&#xff0c;住宅IP&#xff08;即家庭用户通过宽带服务提供商获得的IP地址&#xff09;在跨境电商、广告投放、网络安全等多个领域扮演着重要角色。然而&#xff0c;随着网络环境的复杂化和欺诈行为的增多&#xff0c;如何有效检测和辨别住宅IP的真伪成为了…

Spring:统一结果私有属性造成的前端无法访问异常报错问题

用户未填写任何评价 1.问题复现 &#xff08;1&#xff09;看一段代码 controller&#xff1a; import lombok.extern.slf4j.Slf4j; import org.ljy.testdemo.common.Result; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.w…

Centos中关闭swap分区,关闭内存交换

概述&#xff1a; Swap 分区是 Linux 系统中扩展物理内存的一种机制。Swap的主要功能是当全部的RAM被占用并需要更多内存时&#xff0c;用磁盘空间代理RAM内存。Swap对虚拟化技术资源损耗非常大&#xff0c;一般虚拟化是不允许开启交换空间的&#xff0c;如果不关闭Swap&…

【Linux课程学习】make/Makefile:Linux项目自动化构建工具

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux课程学习 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 &#x1f349;一.make/Makefile的理解&#xff1a; …

关于STM32项目面试题02:ADC与DAC篇(输入部分NTC、AV:0-5V、AI:4-20mA和DAC的两个引脚)

博客的风格是&#xff1a;答案一定不能在问题的后面&#xff0c;要自己想、自己背&#xff1b;回答都是最精简、最精简、最精简&#xff0c;可能就几个字&#xff0c;你要自己自信的展开。 面试官01&#xff1a;什么是模数转换/ADC&#xff1f;说说模数转换的流程&#xff1f; …