1. LangChain4j 之入门(简单易学)

一:前言

        什么是LangChain?而LangChain4j又是什么?不知道的朋友,可以看我一下两篇文章

1分钟了解LangChain是什么? | 1分钟了解LangChain4j是什么? LangChain4j是LangChain的Java版本,帮助开发者很容易的接入大模型的框架。让Java也能捉住大模型的风口。


二:前置知识

        当我们想要用什么功能的时候,就使用对应的模型来创建对象,进行使用。LangChain4j提供了如下几种模型来使用。

模型

  • ChatLanguageModel:表示具有聊天界面的语言模型。
  • ImageModel:文本到图像生成器模型。文生图模型,一般我们会把生成图片的提示词输入给chatGpt,让它帮我们优化一下这个提示词,然后拿着优化的提示词用ModerationModel敏感字检查,检查通过后,拿着这个优化的提示词,输入给ImageModel 模型
  • StreamingLanguageModel:表示一种语言模型,该模型具有简单的文本界面(与聊天界面相对),并且每次可以流式传输一个令牌响应。(可以做到打字机流式响应)
  • ModerationModel:表示可以调节文本的模型,判断输入的文字是否有敏感词。
  • EmbeddingModel:表示可以将给定文本转换为嵌入(文本的向量表示)的模型
  • ScoringModel:能够根据查询对文本进行评分的模型。在针对同一查询对多个文本进行评分时,用于识别最相关的文本。评分模型可以用于重新排名的目的。

消息类型

  • UserMessage 用户发送给大模型的消息

        表示来自用户(通常是应用程序的最终用户)的消息。根据模型支持的模式(文本、图像、音频、视频等),用户消息可以包含单个文本(字符串)或多个内容(可以是TextContent或ImageContent)。在未来,内容类型列表将扩展以允许更多的模式(例如音频、视频等)。用户消息还可以包含用户的名称。请注意,并非所有模型都支持UserMessage中的名称。

  • AiMessage  大模型响应给用户的消息

        表示来自AI(语言模型)的响应消息。消息可以包含文本响应或执行一个/多个工具的请求。在工具执行的情况下,对该消息的响应应该是一个/多个ToolExecutionResultMessage。

  • SystemMessage  发送给大模型配置的消息

        表示系统消息,通常由开发人员定义。这种类型的信息通常提供有关AI行动的指示,例如其行为或响应风格。

  • ToolExecutionResultMessage 工具执行的结果消息

        表示响应ToolExecutionRequest的工具执行的结果。ToolExecutionRequests来自于之前的AiMessage.toolExecutionRequests()。

 

LangChain4j暂时所支持的大模型,如下:

ProviderStreamingToolsImage InputsLocalNative
Amazon Bedrock     
Anthropic 
Azure OpenAI  
ChatGLM     
DashScope  
Google Vertex AI Gemini  
Google Vertex AI PaLM 2    
Hugging Face     
Jlama  
LocalAI  
Mistral AI   
Ollama  
OpenAICompatible with: Groq, Ollama, LM Studio, GPT4All, etc.
Qianfan   
Cloudflare Workers AI     
Zhipu AI  

三:案例实践

引入Maven依赖,现在我们使用LangChain4j最新的版本 0.32.0,暂时引入的模型有openAi和智普Ai的依赖。如果用其他的大模型,引入相应的依赖就可以。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.gorgor</groupId><artifactId>ai-demo</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><langchain4j.version>0.32.0</langchain4j.version><jackson.version>2.16.1</jackson.version></properties><dependencies><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j</artifactId><version>${langchain4j.version}</version></dependency><!-- open Ai --><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-open-ai</artifactId><version>${langchain4j.version}</version></dependency><!-- 智普 Ai  --><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-zhipu-ai</artifactId><version>${langchain4j.version}</version></dependency><dependency><groupId>org.tinylog</groupId><artifactId>tinylog-impl</artifactId><version>2.6.2</version></dependency><dependency><groupId>org.tinylog</groupId><artifactId>slf4j-tinylog</artifactId><version>2.6.2</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson.version}</version></dependency></dependencies>
</project>

案例一:普通聊天

        普通聊天的话,我们只需要创建ChatLanguageModel(如有不懂,可以看上面的前置知识中的解释)对象就可以,

1. 使用openAi

   此时我们需要登录 openai的官网 https://openai.com/,注册账号,点击API login进行登录,然后在里面找到apikey,需要我们用手机号码注册一个apikey,但openai封掉了亚洲很多节点,所以亚洲的手机号可能都注册不了apikey,需要用其他国家地区的, 但LangChain4j有提供了openAi的demo的apikey,我们可以用demo这个apikey就可以去调openAi大模型。但这个key限制也很多,比如文生图等等就用不了。

ChatLanguageModel model = OpenAiChatModel.builder().apiKey("demo").build();String answer = model.generate("你好,你是谁?");System.out.println(answer);

 2. 使用智普Ai

         因为openAi是国外的,有很多限制,所以下面的案例都会用智普Ai来做,智普Ai是由清华大学计算机系知识工程实验室的技术成果转化而来。官网:智谱AI开放平台 ,注册登录,并获取apikey,大家可以充一块钱去玩玩,一块钱可以玩很久。

  ChatLanguageModel chatModel = ZhipuAiChatModel.builder().apiKey("智普apikey").build();String answer = chatModel.generate("你好,你是谁?");System.out.println(answer);

 

案例二:打字机流式响应

在前面的例子中,当我们通过ChatLanguageModel的generate()方法向大模型提问时,ChatLanguageModel一次性给了整段响应结果,而不是一个字一个字打字机式的回答,不过我们可以使用OpenAiStreamingChatModel来实现打字机效果,代码如下:

 StreamingChatLanguageModel model = ZhipuAiStreamingChatModel.builder().apiKey("智普apikey").build();model.generate("你好,你是谁?", new StreamingResponseHandler<AiMessage>() {@Overridepublic void onNext(String token) {System.out.println(token);try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {throw new RuntimeException(e);}}@Overridepublic void onError(Throwable error) {System.out.println(error);}});

案例三: 检测是否存在敏感内容

 ModerationModel能够校验输入中是否存在敏感内容。在智普Ai中没找到提供这个敏感内容检测的api,所有下面案例用openai写。

ModerationModel moderationModel = OpenAiModerationModel.withApiKey("demo");
Response<Moderation> response = moderationModel.moderate("我要杀了你");
System.out.println(response.content().flaggedText());

案例四:文生图

ImageModel可以根据提示词来生成图片,一般我们会把生成图片的提示词输入给chatGpt,让它帮我们优化一下这个提示词,然后拿着优化的提示词用ModerationModel敏感字检查,检查通过后,拿着这个优化的提示词,输入给ImageModel 模型

   ImageModel imageModel = ZhipuAiImageModel.builder().apiKey("智普apikey").build();Response<Image> response = imageModel.generate("小猫");System.out.println(response.content().url());

 案例五:获取当前时间

  对于大模型而言,他们训练的数据都是之前时间的数据, 如果你问他"今天是几号?",可能他会懵逼,回答补上来.此时就要用到LangChain4j的Tools工具,而在Spring Ai中不叫Tools,而是Function call.

执行流程: 先请求智普Ai大模型 --->得到执行工具请求-->执行本地工具->再次通过请求问题,执行工具请求和执行工具结果,去调用智普Ai大模型,得到最终的接口. 执行了本地工具后,不是得到结果了吗?为什么还需要调大模型, 是因为执行工具后的结果只是几月几号,而不像人回复那样,所以重新调了一次.

        ChatLanguageModel chatModel = ZhipuAiChatModel.builder().apiKey("智普apikey").build();ToolSpecification currentTime = ToolSpecification.builder().name("currentTime").description("currentTime").build();// givenUserMessage userMessage = userMessage("今天是几号?");List<ToolSpecification> toolSpecifications = singletonList(currentTime);// when//执行工具响应(请求),大模型回调工具Response<AiMessage> response = chatModel.generate(singletonList(userMessage), toolSpecifications);// thenAiMessage aiMessage = response.content();ToolExecutionRequest toolExecutionRequest = aiMessage.toolExecutionRequests().get(0);// given//执行工具结果ToolExecutionResultMessage toolExecutionResultMessage = from(toolExecutionRequest, LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));// 请求问题(userMessage) | 执行工具响应(aiMessage) | 执行工具结果(toolExecutionResultMessage)List<ChatMessage> messages = asList(userMessage, aiMessage, toolExecutionResultMessage);// when//最终结果Response<AiMessage> secondResponse = chatModel.generate(messages);System.out.println(secondResponse.content().text());

 

四: LangChain4j和SpringBoot整合

        本来是想对接智普Ai的,但好像没看到智普Ai跟springboot整合的maven包, 但百度的qianfan就有. 下面用openai整个springboot.

maven依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.gorgor</groupId><artifactId>ai-demo</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.1</version></parent><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><langchain4j.version>0.32.0</langchain4j.version><jackson.version>2.16.1</jackson.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-open-ai-spring-boot-starter</artifactId><version>${langchain4j.version}</version></dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j</artifactId><version>${langchain4j.version}</version></dependency><!-- open Ai --><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-open-ai</artifactId><version>${langchain4j.version}</version></dependency><!-- 智普 Ai  --><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-zhipu-ai</artifactId><version>${langchain4j.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson.version}</version></dependency></dependencies>
</project>

application.yml 配置文件

langchain4j:open-ai:chat-model:api-key: demo

代码:

@RestController
public class Demo {@Autowiredprivate ChatLanguageModel chatLanguageModel;@GetMapping("testSpringboot")public String  testSpringboot(String name){return chatLanguageModel.generate(name);}
}

 

 

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

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

相关文章

提升结构安全性:应变计在现代建筑中的应用

在现代建筑领域&#xff0c;随着工程技术的不断进步&#xff0c;对结构安全性的要求也日益提高。作为一种关键的工程仪器仪表&#xff0c;应变计在提升结构安全性方面发挥着不可替代的作用。本文将深入探讨应变计在现代建筑中的应用&#xff0c;以及它如何助力工程师们实时监测…

权力之望怎么注册账号创建角色 权利之网角色账号注册教程

权力之望是一款全新的大型MMORPG游戏&#xff0c;拥有9把独特武器和56种职业组合&#xff0c;并搭配了超炫酷的战斗画面&#xff0c;全程采用低俯视角游戏&#xff0c;让玩家能体验到更强的操作感和爽快感。这款游戏主打高养成自由度玩家可以自由更换武器进行战斗&#xff0c;还…

前端面试题30(闭包和作用域链的关系)

闭包和作用域链在JavaScript中是紧密相关的两个概念&#xff0c;理解它们之间的关系对于深入掌握JavaScript的执行机制至关重要。 作用域链 作用域链是一个链接列表&#xff0c;它包含了当前执行上下文的所有父级执行上下文的变量对象。每当函数被调用时&#xff0c;JavaScri…

零基础也能成为产品册设计高手

​在当今数字化时代&#xff0c;产品册设计已成为企业营销的重要手段之一。过去&#xff0c;人们认为只有专业人士才能设计出精美的产品册&#xff0c;然而&#xff0c;随着设计工具的普及和在线学习资源的丰富&#xff0c;零基础的你也能成为产品册设计高手。本文将带你走进这…

MindsDB:一个利用企业数据构建 AI 的平台

MindsDB作为一个开源项目&#xff0c;它旨在将机器学习模型无缝集成到现有的数据库系统中&#xff0c;为用户提供实时的数据预测能力。这个项目的创新之处在于&#xff0c;它能够以简单、直观的方式让开发者和非技术人员都能够利用AI进行数据分析和预测。 它是根据企业数据库定…

航空航天单位保密网文件导出管理难点在哪里?如何解决?

航空航天单位的重要性不言而喻&#xff0c;它们在国家安全、科技进步、经济发展以及国际合作等多个领域都扮演着至关重要的角色。为了保护工作内容中的重要数据&#xff0c;遵守保密规定&#xff0c;对涉密人员、保密要害部门单位、涉密载体、涉密信息传输和涉密活动进行严格管…

glide加载mp4 源码堆栈调用核心代码分析

load 数据走的httpurlfetcher 的loaddata 从MultiLoader 调用而来 load到inputstream流后的处理 核心 图片是glide 首先创建解释器的时候 加了videodecoder 然后这里会从流中加载对应帧的图片保存在手机cache目录中 将这个file 作为bitmap传递 然后加载 private static final…

MySQL物理备份与恢复工具XtraBackend使用总结

文章目录 1.描述2.安装3.使用3.1 备份源数据库3.2 恢复到目标数据库3.2.1 恢复目录3.2.2 解压文件3.2.3 应用日志3.2.4 复制数据 4.使用总结4.1 备份4.2 恢复4.3 例子 1.描述 借助Percona XtraBackup工具实现MySQL的物理备份与恢复&#xff0c;相当于将整个MySQL进行了复制&am…

Django+vue自动化测试平台(25)-- 自动化测试之封装APscheduler定时任务框架

APscheduler简介 APscheduler全称Advanced Python Scheduler&#xff0c;作用为在指定的时间规则执行指定的作业&#xff0c;其是基于Quartz的一个Python定时任务框架&#xff0c;实现了Quartz的所有功能&#xff0c;使用起来十分方便。提供了基于日期、固定时间间隔以及cront…

2.5 C#视觉程序开发实例1----CamManager实现模拟相机采集图片

2.5 C#视觉程序开发实例1----CamManager实现模拟相机采集图片 1 目标效果视频 CamManager 2 CamManager读取本地文件时序 3 BD_Vision_Utility添加代码 3.0 导入链接库 BD_OperatorSets.dllSystem.Windows.Forms.dllOpencvSharp 3.1 导入VisionParam中创建的文件Util_FileO…

安防监控/视频汇聚平台EasyCVR设备录像回看请求播放时间和实际时间对不上,是什么原因?

安防监控EasyCVR视频汇聚平台可提供多协议&#xff08;RTSP/RTMP/国标GB28181/GAT1400/海康Ehome/大华/海康/宇视等SDK&#xff09;的设备接入、音视频采集、视频转码、处理、分发等服务&#xff0c;系统具备实时监控、云端录像、回看、告警、平台级联以及多视频流格式分发等视…

旅游计划定制小程序网页模板源码

手机在线旅游定制服务&#xff0c;定制旅游出行app小程序模板。包含&#xff1a;定制介绍、定制表单填写、我的订单等。 旅游计划定制小程序网页模板源码

C++ STL 文件系统用法介绍

目录 一. 获取当前工作目录 二:设置和读取文件写入时间 三:获取文件目录大小 四:获取文件类型信息 一. 获取当前工作目录 #include <filesystem> #include <iostream> #include <fstream> namespace fs = std::filesystem;int main() {std::cout &l…

交换机接口三种模式Access、Trunk、Hybrid

交换机接口的三种模式 1.access接口模式&#xff08;接入链路&#xff0c;接入模式&#xff09; 接收数据&#xff1a;当接收到一个无标记帧的时候&#xff0c;打上自己的PVid并接受&#xff08;就是自己的vlan标签&#xff09;。当接收到一个有标记帧的时候&#xff0c;对比…

swiftui中NavigationStack布局navigationBarTitleDisplayMode作用,以及内容顶部空白区域解决办法

写了一个小demo用于学习NavigationStack和toolbar/ToolbarItem知识&#xff0c;但是在写一个瀑布流布局的时候&#xff0c;设置了顶部的toolbar&#xff0c;然后内容区域的顶部出现了一大片空白区域&#xff0c;这样的效果并不是很美观很好看&#xff0c;所以就想着研究解决一下…

科普文:一文搞懂SpringBoot(狂神说Java)

1、Hello,World&#xff01; 1.1、SpringBoot简介 回顾什么是Spring Spring是一个开源框架&#xff0c;2003 年兴起的一个轻量级的Java 开发框架&#xff0c;作者&#xff1a;Rod Johnson 。 Spring是为了解决企业级应用开发的复杂性而创建的&#xff0c;简化开发。 Spring是…

clickhouse学习笔记(五)SQL操作

目录 一、增 二、删改 三、查询以及各种子句 1、with子句 a、表达式为常量 b、表达式为函数调用 c、表达式为子查询 2、from子句 3、array join子句 a、INNER ARRAY JOIN b、LEFT ARRAY JOIN c、数组的一些函数 groupArray groupUniqArray arrayFlatten splitBy…

Java 如何在volatile内部调用接口

在Java中&#xff0c;volatile 关键字通常用于确保变量的可见性和有序性&#xff0c;而不是用来修饰接口或方法调用的。volatile 修饰的变量会被立即同步到主存&#xff0c;并且在每次访问时都会从主存中重新读取&#xff0c;而不是从缓存中读取。这意味着对volatile变量的修改…

2005-2023年各省居民人均消费支出、城镇居民人均消费支出、农村居民人均消费支出数据(无缺失)

2005-2023年各省居民人均消费支出、城镇居民人均消费支出、农村居民人均消费支出数据&#xff08;无缺失&#xff09; 1、时间&#xff1a;2005-2023年 2、来源&#xff1a;国家统计局、统计年鉴 3、范围&#xff1a;31省 4、指标&#xff1a;全体居民人均消费支出、城镇居…

探索 Linux 的 /etc/hosts 文件:基础知识与实用指南

探索 Linux 的 /etc/hosts 文件&#xff1a;基础知识与实用指南 在 Linux 和 Unix 系统中&#xff0c;/etc/hosts 文件扮演着一个至关重要的角色。它是系统的本地 DNS&#xff08;域名系统&#xff09;解析器&#xff0c;负责将主机名映射到 IP 地址。在网络和系统管理中&…