01、聊天与语言模型

一、简单说明模型

LLM目前有两种API提供

  • LanguageModel:接收一个a作为输入并返回一个b作为输出,这种是已经过时的
  • ChatLanguageModel:接收多个输入,然后返回相应的输出

ChatLanguaggeModel是LangChain4j中LLM交互低级API,它提供了最大的功能和灵活性。除此之外还有一个高级API(AIService)。

ChatLanguageModel还支持的模型有:

  • EmbeddingModel:把文本转换为Embedding
  • ImageModel:用来生成和编辑图片
  • ModerationModel:这个模型可以检查文本中是否包含有害内容
  • ScoringModel:可以根据查询对多段文本进行评分(排名),实际上就是用来确定每段文本与查询的关联性,这个对于RAG来说是非常有用的

二、ChatLanguageModel的API

ChatLanguageModel是一个接口,其定义如下:

public interface ChatLanguageModel {default String generate(String userMessage) {return generate(UserMessage.from(userMessage)).content().text();}default Response<AiMessage> generate(ChatMessage... messages) {return generate(asList(messages));}Response<AiMessage> generate(List<ChatMessage> messages);default Response<AiMessage> generate(List<ChatMessage> messages, List<ToolSpecification> toolSpecifications) {throw new IllegalArgumentException("Tools are currently not supported by this model");}default Response<AiMessage> generate(List<ChatMessage> messages, ToolSpecification toolSpecification) {throw new IllegalArgumentException("Tools are currently not supported by this model");}@Experimentaldefault ChatResponse chat(ChatRequest request) {throw new UnsupportedOperationException();}@Experimentaldefault Set<Capability> supportedCapabilities() {return emptySet();}
}

注意:现在我们看的是关于LangChain4j 0.36.2版本!!

三、关于ChatMessage

这个表示是一个聊天消息,当前有四种类型的聊天消息,每种消息的“来源”对应其中一种

  1. UserMessage:来自己于用户的消息,这里指的用户可以是应用使用的最终用户或者是应用本身,它是相对于LLM大语言模型来说的
  2. AiMessage:由AI生成的消息,通常是为了响应
  3. ToolExecutionResultMessage:聊天过程中执行相关的工具(函数)的结果
  4. SystemMessage:来自己系统的消息,通常用来定义LLM在对话中的角色说明(指定AI应该如何表现以及以何种方式回答...)
  5. CustomMessage:可以包含任意属性的自定义消息,这种消息不是所有的大模型语言都支持,只有支持它的才可以使用

使用多个ChatMessage

我们看到接口中方法定义为什么我们要使用多个ChatMessage?

注意:我们在于LLM进行聊天对话时,它本质上是无状态的,它们是不会维护对话状态的,如果要支持多论对话并且让AI理解对话的上下文,那么就需要使用到多个ChatMessage。因为这个时候我们就需要把多论对话中的所有聊天消息告诉AI,让它了解整个上下文的情况,从而达到一个有状态的假象。

如下所示:

UserMessage firstUserMessage = UserMessage.from("你好,我叫鹏鹏");
AiMessage firstAiMessage = model.generate(firstUserMessage).content();
UserMessage secondUserMessage = UserMessage.from("我叫什么名字?");
AiMessage secondAiMessage = model.generate(firstUserMessage,firstAiMessage,SecondUserMessage).content();

向上面这样手动去维护与管理这些消息是很麻烦的,实际的使用中我们会使用ChatMemory(先了解后续会说)

关于UserMessage

在UserMessage这个类中我们可以看到下面这个方法:

public static UserMessage userMessage(Content... contents) {return from(contents);
}

这个方法可以传入多个Content,最终得到一个UserMessage对象

而Content是一个接口,它有如下一些实现(不同的实现可以传入不同类型的内容)

  • TextContent
  • ImageContent
  • AudioContent
  • VideoContent
  • PdfFileContent

通过这些不同的Content我们就可以把不同类型的内容转为UserMessage,然后传给LLM,如下所示:

UserMessage userMessage = UserMessage.from(TextContent.from("请描述下面的图片信息"),ImageContent.from("https://ex.com/myCat.png")
);
Response<AiMessage> response = model.generate(userMessage);
TextContent

它是最为简单的一种,就是把一个普通的文本转为一个字符串

UserMessage.from(TextContent.from("Hello")) 与 UserMessage.from("Hello")这两者没有任何区别。

一次可以向UserMessage当中提供一个或多个TextContent

UserMessage userMessage = UserMessage.from(TextContext.from("Hello"),TextContext.from("你好啊!"));
ImageContent

根据不同的LLM提供商,ImageContent可以从URL地址或者Base64的二进制数据来提供ImageContent

如下所示,使用Base64的二进数据来提供ImageContent

byte[] imageBytes = readBytes("D:\\myImage\\hi.png");
String imgData = Base64.getEncoder().encodeToString(imageBytes);
ImageContent imageContent = ImageContent.from(imgData,"image/png");
UserMessage userMessage = UserMessage.from(imageContent);
AudioContent

它类似于ImageContent,它表示的是音频内容

VideoContent

它类似于ImageContent,它表示的是视频内容

PdfFileContent

它类似于ImageContent,表示的是PDF文件的二进制内容

四、实践示例

POM依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-dashscope-spring-boot-starter</artifactId><!-- 添加排除项 --><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId></exclusion></exclusions></dependency><!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j</artifactId></dependency>
</dependencies>

其中SpringBoot指定版本为:3.3.5,langchain4j指定版本为0.36.2

yml配置

langchain4j:dashscope:chat-model:api-key: sk-09a****************3686d6c4cfb#model-name: deepseek-v3model-name: qwen-max-latestchat:systemMessage: 你是普京,接下来以普京的语气来进行对话

其中aipkey是在阿里百炼平台申请的aipkey,这里要使用时需要替换为自已申请好的apikey

主启动

@SpringBootApplication
public class ChatApplication {public static void main(String[] args) {SpringApplication.run(ChatApplication.class, args);}
}

controller

@Slf4j
@RestController
@RequestMapping("/chat")
public class ChatController {// 注入聊天大语言模型@Resourceprivate ChatLanguageModel chatLanguageModel;@Value("${chat.systemMessage}")private String systemMessage;@GetMapping("/simple")public String chat(@RequestParam("message") String message) {UserMessage userMessage = UserMessage.from(message);Response<AiMessage> generate = chatLanguageModel.generate(userMessage);log.info("generate: {}", generate);return generate.content().text();}@GetMapping("/sys/simple")public String chatSys(@RequestParam("message") String message) {Response<AiMessage> aiResponse;UserMessage userMessage = UserMessage.from(message);if (systemMessage != null && !systemMessage.isEmpty()) {SystemMessage systemMessage = SystemMessage.from(this.systemMessage);aiResponse = chatLanguageModel.generate(List.of(systemMessage, userMessage));} else {aiResponse = chatLanguageModel.generate(userMessage);}if (aiResponse == null) {return "大模型未返回任何内容~~~";}log.info("generate: {}", aiResponse);return aiResponse.content().text();}
}

这其中有两个不同的请求,一个是简单的聊天请求,另一个是我们指定了特定的SystemMessage的请求。

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

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

相关文章

头歌 数据采集概述答案

问题1&#xff1a;以下哪个不是Scrapy体系架构的组成部分&#xff1f; 正确答案&#xff1a;B. 支持者(Support) 解释&#xff1a;Scrapy的主要组成部分包括&#xff1a; 爬虫(Spiders)&#xff1a;定义如何爬取网站和提取数据 引擎(Engine)&#xff1a;负责控制数据流在系统中…

【uniapp】记录tabBar不显示踩坑记录

由于很久没有使用uniapp了&#xff0c;官方文档看着又杂乱&#xff0c;底部tab导航栏一直没显示&#xff0c;苦思许久&#xff0c;没有发现原因&#xff0c;最后网上搜到帖子&#xff0c;list里的第一个数据&#xff0c;pages 的第一个 path 必须与 tabBar 的第一个 pagePath 相…

JVM 知识点梳理

JDK 、JRE、JVM JDK&#xff08; Java Development Kit &#xff09; Java开发工具包 JRE 开发命令工具&#xff08;运行java.exe、编译javac.exe、javaw.exe&#xff09; JRE&#xff08; Java Runtime Environment &#xff09;Java运行环境 JVM Java核心类库&#xff08;l…

蓝桥杯 之 第27场月赛总结

文章目录 习题1.抓猪拿国一2.蓝桥字符3.蓝桥大使4.拳头对决5.未来竞赛6.备份比赛数据 习题 比赛地址 1.抓猪拿国一 十分简单的签到题 print(sum(list(range(17))))2.蓝桥字符 常见的字符匹配的问题&#xff0c;是一个二维dp的问题&#xff0c;转化为对应的动态规划求解 力扣…

Ambari、Bigtop源码编译最新支持情况汇总

以下是目前的版本情况 支持了绝大部分的组件编译及安装 版本组件名称组件版本env 版本v1.0.5Ozone1.4.11.0.5Impala4.4.11.0.5Nightingale7.7.21.0.5Categraf0.4.11.0.5VictoriaMetrics1.109.11.0.5Cloudbeaver24.3.31.0.5Celeborn0.5.31.0.5v1.0.4Doris2.1.71.0.4v1.0.3Phoen…

仅靠prompt,Agent难以自救

Alexander的观点很明确&#xff1a;未来 AI 智能体的发展方向还得是模型本身&#xff0c;而不是工作流&#xff08;Work Flow&#xff09;。还拿目前很火的 Manus 作为案例&#xff1a;他认为像 Manus 这样基于「预先编排好的提示词与工具路径」构成的工作流智能体&#xff0c;…

【Docker系列一】Docker 简介

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Sqoop 常用命令

Sqoop 是用于在 Hadoop 和关系型数据库&#xff08;如 MySQL、Oracle 等&#xff09;之间高效传输数据的工具。以下是常用的 Sqoop 命令及示例&#xff1a; CREATE TABLE employees (id INT AUTO_INCREMENT PRIMARY KEY, -- 自增主键&#xff0c;用于唯一标识每一行name VAR…

连续型随机变量及其分布

连续型随机变量 数学公式可以看作一门精确描述事物的语言&#xff0c;比语言尤其是汉语的模糊性精确多了&#xff01;离散型数据的处理可以通过枚举和相加进行处理。而连续型数据则没有办法这样处理。我们必须要通过函数和取值区间还有微积分计算。 &#xff3b;定义1&#x…

PostgreSQL_数据使用与日数据分享

目录 前置&#xff1a; 1 使用 1.1 获取前复权因子 1.2 查询股票的纵向数据 1.3 查询股票的横向数据 2 日数据分享&#xff08;截止至&#xff1a;2025-03-21&#xff09; 总结 前置&#xff1a; 本博文是一个系列。在本人“数据库专栏”-》“PostgreSQL_”开头的博文。…

Rocky9.5基于sealos快速部署k8s集群

首先需要下载 Sealos 命令行工具&#xff0c;sealos 是一个简单的 Golang 二进制文件&#xff0c;可以安装在大多数 Linux 操作系统中。 以下是一些基本的安装要求&#xff1a; 每个集群节点应该有不同的主机名。主机名不要带下划线。 所有节点的时间需要同步。 需要在 K8s …

qt实现一个简单http服务器和客户端

一、功能简介 服务器&#xff1a; 登录功能、下载文件功能 客户端&#xff1a; 登录功能、下载文件功能、上传成绩功能 二、服务器代码 //HttpServer.h #ifndef HTTPSERVER_H #define HTTPSERVER_H#include <QMainWindow> #include <QTcpSocket> #include <QTc…

基于Python+Django的旅游管理系统

项目介绍 PythonDjango旅游管理系统 平台采用B/S结构&#xff0c;后端采用主流的Python语言进行开发&#xff0c;前端采用主流的Vue.js进行开发。 整个平台包括前台和后台两个部分。 - 前台功能包括&#xff1a;首页、景点管理、门票管理、旅游资讯、在线反馈、。 - 后台功能包…

用数组模拟循环队列

设计一种循环队列&#xff0c;线性数据结构&#xff0c;其操作表现为 FIFO(先进先出)原则且队尾被连接在队首之后形成一个循环&#xff0c;称作“环形缓冲器” 循环队列的好处是可以利用这个队列之前使用过的空间&#xff0c;但是他的空间大小是固定的 循环队列我们使用单链表…

maven为什么发生依赖冲突?怎么解决依赖冲突?

maven为什么发生依赖冲突&#xff1f;怎么解决依赖冲突&#xff1f; 我们在开发的时候&#xff0c;偶尔会遇到依赖冲突的时候&#xff0c;一般都是NoClassDefFoundError、ClassNotFoundException、NoSuchMethodError。打开搜索框又发现有这个类&#xff0c;明明就是引入进来了&…

从国家能源到浙江交通投资,全息技术在能源交通领域的创新应用

一、3D全息技术行业应用参数及设计制作要求 全息投影 全息投影技术通过激光器、全息片等设备&#xff0c;将物体的三维信息记录下来&#xff0c;并在特定条件下再现。应用参数包括投影距离、投影面积、投影亮度等。设计制作要求&#xff1a;高清晰度、高亮度、低噪音、稳定性好…

Adobe After Effects 操作

Adobe After Effects &#xff08;AE&#xff09;可以实现将多个元素进行合成&#xff0c;实现特殊效果。AE的项目文件是aep&#xff0c;可以将素材、层、效果等一切信息&#xff0c;保存在这个项目文件中。 AE的原理&#xff0c;和PS的原理非常类似。 操作界面 操作界面如…

Flutter使用自签证书打包ipa

在 Flutter 中使用自签证书打包 IPA 文件&#xff0c;可以通过以下步骤完成&#xff1a; 1. 准备自签证书 方式一 生成自签证书&#xff1a; 打开 钥匙串访问 应用。选择 证书助理 > 创建证书。按照提示填写证书信息&#xff0c;选择证书类型为 代码签名&#xff0c;并保存…

三.Go的第一个程序hello.go

新建hello.go,代码如下 package mainimport "fmt"func main() {fmt.Println("hello world") }编译hello.go 控制台终端为hello.go同级目录 执行 go build hello.go编译成功同级目录下生成 同名exe文件 也可以直接执行 go run hello.go解释如下 一 .…

WebLogic中间件常见漏洞

一、后台弱⼝令GetShell 1.环境搭建 cd vulhub-master/weblogic/weak_password docker-compose up -d 2.访问网站并登陆后台 /console/login/LoginForm.jsp 默认账号密码&#xff1a;weblogic/Oracle123 3.点击部署&#xff0c;点击安装&#xff…