解锁AI的神秘力量:LangChain4j带你步入智能化实践之门

关注微信公众号 “程序员小胖” 每日技术干货,第一时间送达!

引言

在数字化转型的浪潮中,人工智能(AI)正逐渐成为推动企业创新和增长的关键力量。然而,将AI技术融入到日常业务流程并非易事,它需要跨越技术门槛,解决兼容性问题,并确保数据安全。今天,我们将带您了解一个革命性的AI集成框架——LangChain4j,它为Java开发者提供了一条通往智能化未来的捷径。

LangChain4j不仅仅是一个工具,它代表了一种全新的工作方式,一种将复杂AI技术变得触手可及的理念。通过这篇文章,我们将探索LangChain4j如何帮助企业解锁智能化潜能,优化业务流程,并在竞争激烈的市场中保持领先。

无论您是技术领域的探索者还是企业的决策者,LangChain4j的故事都不容错过。让我们一起启程,深入了解这个能够编织智慧链条、引领创新潮流的AI框架。

LangChain4j

Java版本的LangChain,随着大模型的不断发展,如何在程序中更好的利用大模型的能力来提高编程效率是一种趋势,LangChain是这么自己介绍自己的:

LangChain gives developers a framework to construct LLM‑powered apps easily.

意思是:LangChain提供了一个开发框架,使得开发者可以很容易的用来构建具有LLM能力的应用程序。

LLM就是Large Language Model,也就是常说的大语言模型,简称大模型。

个人认为:大模型时代,如何将大模型能力和传统应用相结合,使得传统应用更加智能,是人工智能时代的趋势。以前一个应用要获得智能,需要企业自己投入资源训练模型,而现在只需要接入大模型即可,这种便利性将使得大模型会应用得更为广泛,而如何将大模型能力和Java编程语言相结合,这就是LangChain4j所做的。

注意,大模型的能力远远不止聊天的能力,而LangChain4j就在帮助我们更好的利用大模型的能力,从而帮我们打造出更加智能的应用。

使用场景

LangChain4j 的使用场景广泛,覆盖了从基础的聊天机器人、问答系统到复杂的文档检索、知识管理、自动化工作流以及行业特定的AI解决方案等多个领域。以下是几个具体的使用场景:

  1. 客户服务自动化:企业可以利用LangChain4j构建智能客服系统,自动处理客户咨询、投诉和常见问题解答,提高服务效率和客户满意度。

  2. 内部知识管理:员工可以通过LangChain4j驱动的知识库搜索引擎快速获取公司政策、操作手册、技术文档等信息,提高工作效率。

  3. 内容创作与编辑:内容创作者和编辑团队可以利用LangChain4j辅助创作,例如自动生成文章概要、润色文本、甚至是基于现有素材生成新的创意内容。

  4. 个性化推荐系统:电商平台或媒体平台可以结合用户行为数据和LangChain4j的分析能力,提供更加个性化的商品或内容推荐。

  5. 智能分析报告:企业数据分析团队可以利用LangChain4j分析大数据集,自动生成易于理解的分析报告和业务洞察。

优势

  1. 高度模块化设计:允许开发者根据需要选择和组合模块,构建符合特定需求的解决方案,提高了灵活性和可扩展性。

  2. 强大的扩展性:支持对接多种语言模型和外部数据源,随着技术进步和新模型的出现,框架能快速适应和集成。

  3. 高效性能优化:针对Java环境进行了优化,确保模型运行高效,即使在处理大规模数据和高并发请求时也能保持良好性能。

  4. 易用性和可维护性:提供了简洁的API接口和详细的文档,降低了开发门槛,使得非AI背景的开发者也能快速上手。

  5. 丰富的社区支持和生态发展:活跃的开发者社区不断贡献新模块、案例和最佳实践,促进了框架的持续迭代和功能丰富。

  6. 企业级安全与合规:考虑到企业对数据安全和隐私的需求,LangChain4j设计时可能考虑了相应的安全措施和合规要求,确保模型的使用符合企业标准。

LangChain4j 实战

单轮对话

新建一个Maven工程,然后引入langchain4j的核心依赖、langchain4j集成OpenAi各个模型的依赖

       <dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j</artifactId><version>0.29.1</version></dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-open-ai</artifactId><version>${langchain4j.version}</version></dependency>

程序的首次运行输出,标志着我们与这门新知识的初次“问候”,也象征着大模型学习之旅的起点

package org.example;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;/*** Despriction** @author 程序员小胖* @version v1.1* @since 2024/5/8 15:07*/
public class HelloWorld {public static void main(String[] args) {ChatLanguageModel model = OpenAiChatModel.withApiKey("demo");String answer = model.generate("hello world! ");System.out.println(answer);}
}

运行代码结果为:

Hello there! How can I assist you today?

这样,我们使用LangChain4j第一次成功的和OpenAi的GPT模型进行了对话,正常来说,调用OpenAi的API接口需要在OpenAi的官网去申请ApiKey才能调用成功,而我这里传入的ApiKey为"demo"却也能调通,查看源码得知这是因为demo是openai为我们提供的测试的apiKey

在底层在构造OpenAiChatModel时,会判断传入的ApiKey是否等于"demo",如果等于会将OpenAi的原始API地址"https://api.openai.com/v1"改为"http://langchain4j.dev/demo/openai/v1",这个地址是langchain4j专门为我们准备的一个体验地址,实际上这个地址相当于是"https://api.openai.com/v1"的代理,我们请求代理时,代理会去调用真正的OpenAi接口,只不过代理会将自己的ApiKey传过去,从而拿到结果返回给我们。
所以,真正开发时,需要大家设置自己的apiKey或baseUrl,可以这么设置:

ChatLanguageModel model = OpenAiChatModel.builder().baseUrl("http://langchain4j.dev/demo/openai/v1").apiKey("demo").build();

多轮对话

我们通过ChatLanguageModel的generate()方法向大模型提出问题:

 public static void main(String[] args) {ChatLanguageModel model = OpenAiChatModel.withApiKey("demo");String answer = model.generate("你好,你是谁?");System.out.println(answer);System.out.println(model.generate("请重复"));}

运行代码结果为:

你好!我是一个人工智能助手,可以回答你的问题和提供帮助。有什么可以帮到你的吗?
请重复
    public static void main(String[] args) {ChatLanguageModel model = OpenAiChatModel.withApiKey("demo");String answer = model.generate("你好,我是程序员小胖");System.out.println(answer);System.out.println(model.generate("我叫什么名字?"));}

运行代码结果为:

你好,程序员小胖!有什么问题或者需要帮助的吗?
您叫什么名字?

一样的情况,因为第二次调用generate()方法是一次单独的会话,那么如何做到使得两次或多次generate()在同一个会话中呢?在LangChain4j中有一个ChatMemory组件,它就是专门用来实现会话功能的,但是它需要结合LangChain4j中的AiService来使用,我们后面再介绍,现在我们先使用笨办法来解决多轮对话的问题。
在ChatLanguageModel中有多个generate()重载方法:


我们前面使用的就是第一个generate()方法,而第二个和第三个generate()方法都是接收一个ChatMessage集合,并且返回一个AiMessage,那么ChatMessage和AiMessage分别都表示什么意思呢?

ChatMessage是一个接口,表示聊天消息,它有以下四种实现:

  1. UserMessage:表示用户发送给大模型的消息
  2. AiMessage:表示大模型响应给用户的消息
  3. SystemMessage:也是用户发送给大模型的消息,和UserMessage不同在于,SystemMessage一般是应用程序帮用户设置的,举个例子,假如有一个作家应用,那么“请你扮演一名作家,请帮我写一篇关于春天的作文”,其中“请你扮演一名画家”就是SystemMessage,“请帮我画一幅关于春天的作品”就是UserMessage
  4. ToolExecutionResultMessage:也是用户发送给大模型的,表示工具的执行结果。
    我们先重点关注UserMessage和AiMessage,它们就相当于请求和响应,所以如果我们想要实现多轮对话,可以这么实现:
    public static void main(String[] args) {ChatLanguageModel model = OpenAiChatModel.withApiKey("demo");UserMessage userMessage1 = UserMessage.userMessage("你好,我是程序员小胖!");Response<AiMessage> response1 = model.generate(userMessage1);AiMessage aiMessage1 = response1.content();System.out.println(aiMessage1.text());Response<AiMessage> response2 = model.generate(userMessage1, aiMessage1, UserMessage.userMessage("我叫什么"));AiMessage aiMessage2 = response2.content();System.out.println(aiMessage2.text());}

运行代码结果为:

你好,小胖!有什么可以帮助你的吗?
你告诉我你叫小胖。

打字机流式响应

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

public static void main(String[] args) {StreamingChatLanguageModel model = OpenAiStreamingChatModel.builder().baseUrl("http://langchain4j.dev/demo/openai/v1").apiKey("demo").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);}});}

结语

在探索LangChain4j的旅程中,我们不仅揭开了AI实践的神秘面纱,还发现了如何将这些强大的技术应用到实际业务中。随着智能化时代的大门缓缓开启,让我们携手LangChain4j,共同迈向一个更智能、更高效的未来。

参考地址:
https://www.langchain.com.cn/
https://docs.langchain4j.dev/
https://github.com/langchain4j?tab=repositories

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

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

相关文章

20230507,LIST容器

学了又忘学了又忘&#xff0c;明知道会忘又不想复习又还得学 LIST容器 1.1 基本概念 链表是一种物理存储单元上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接实现的&#xff1b;链表由一系列结点组成 结点&#xff1a;一个是存储数据元素的数据域&a…

Electron项目中将CommonJS改成使用ES 模块(ESM)语法preload.js加载报错

问题 将Electron项目原CommonJS语法改成使用ES 模块&#xff08;ESM&#xff09;语法&#xff0c;preload.js一直加载不到&#xff0c;报错如下&#xff1a; VM111 renderer_init:2 Unable to load preload script: D:\Vue\wnpm\electron\preload.js VM111 renderer_init:2 E…

NGINX App Protect现已支持NGINX开源版 全方位加强现代应用安全防护

近日&#xff0c;F5 NGINX 发布全新升级的NGINX App Protect 5.0版本&#xff0c;将先前专属于NGINX 商业版本NGINX Plus 的现代应用安全能力拓展至NGINX开源版中&#xff0c;为增强现代应用和API安全防护提供全方位支持。此次升级后&#xff0c;适用于云端及本地部署的NGINX A…

Dell EMC Storage Unity: Remove/Install Memory Module

SP A 一个内存故障 点击system view -> Enclosures->Top查看 再次查看Alert&#xff0c; 确认内存出现问题 进入Service &#xff0c; 将SP A置为service状态 移出SP A &#xff0c;进行内存更换 更换完内存后&#xff0c;将SP A插入设备&#xff0c;并进行线缆连接 进入…

Maven+Junit5 + Allure +Jenkins 搭建 UI 自动化测试实战

文章目录 效果展示Junit 5Junit 5 介绍Junit 5 与 Junit 4 对比PageFactory 模式编写自动化代码公共方法提取测试用例参数化Jenkins 搭建及配置参数化执行生成 Allure 报告Maven 常用命令介绍POM 文件效果展示 本 chat 介绍 UI 自动化测试框架的搭建: 运用 page factory 模式…

AI大模型探索之路-训练篇16:大语言模型预训练-微调技术之LoRA

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

教育界最厉害的三个名人颜廷利:处处物尽其用, 时时人尽其才

颜廷利教授在他的著作《升命学说》中提出了“净化论”&#xff0c;这一理论**强调了个人内在心灵的宁静与纯洁对于实现更高层次人生价值的重要性**。 “净化论”是中国最受欢迎的著名起名字大师颜廷利教授关于如何提升个人命运和推动社会发展的哲学思考的一部分。他在书中提出&…

Baidu Comate:智能编码助手,助力编程效率飞跃

文章目录 Baidu Comate智能助手简介安装Baidu ComateBaidu Comate主要功能代码智能补全编程知识问答官方插件函数注释行间注释生成单测代码解释调优建议函数拆分清空对话框help AutoWork工具箱 总结 Baidu Comate智能助手简介 Baidu Comate&#xff0c;Coding Mate Powered by …

Express路由

什么是路由 官方定义&#xff1a;路由确定了应用程序如何响应客户端对特定端点的请求。 路由的使用 一个路由的组成有 请求方法、路径 和 回调函数 组成。 Express中提供了一些列方法&#xff0c;可以很方便的使用路由&#xff0c;使用格式如下&#xff1a; app.<metho…

【编程题-错题集】非对称之美(找规律 / 贪心)

牛客对应题目链接&#xff1a;非对称之美 (nowcoder.com) 一、分析题目 找规律&#xff1a; 判断是否全都是相同字符。判断本身是否是回文。 如果这个字符串每个字符相同&#xff0c;不存在非回文子串&#xff0c;直接返回 0。如果这个字符串不是回文&#xff0c;输出字符串长度…

一、RocketMQ基本概述与部署

RocketMQ基本概述与安装 一、概述1.MQ概述1.1 用途1.2 常见MQ产品1.3 MQ常用的协议 2.RocketMQ概述2.1 发展历程 二、相关概念1.基本概念1.1 消息&#xff08;Message&#xff09;1.2 主题&#xff08;Topic&#xff09;1.3 标签&#xff08;Tag&#xff09;1.4 队列&#xff0…

STC15W1K16S和VC6.0串口通讯收发测试实例

/********************************************* STC USB 串口板 2014 4 7 20:12 发送接收数据 使用STC串口调试助手通讯正常&#xff0c;L161 **********************************************/ #include "reg51.h" #include "intrins.h" #define…

sourceTree push失败

新电脑选择commit and push&#xff0c;报错了&#xff0c;不过commit成功&#xff0c;只不过push失败了。 原因是这个&#xff0c;PuTTYs cache and carry on connecting. 这里的ssh选择的是 PuTTY/Plink&#xff0c;本地没有这个ssh密钥&#xff0c;改换成openSSH&#xff…

[oeasy]python0015_键盘改造_将esc和capslock对调_hjkl_移动_双手正位

键盘改造 &#x1f94b; 回忆上次内容 上次练习了复制粘贴 按键 作用 <kbd>y</kbd><kbd>y</kbd> 复制光标行代码 到剪贴板 <kbd>p</kbd> 粘贴剪贴板中的内容 <kbd>i</kbd> 切换到 插入模式 <kbd>h</kbd>…

如何理解GTX接收通道相关模块?(高速收发器三)

前文讲解了GTX的时钟及发送通道相关内容&#xff0c;本文讲解GTX接收通道的一些功能及其IP配置&#xff0c;接收往往比发送设计更难&#xff0c;与调制解调&#xff0c;加密解密其实相差不大&#xff0c;后者难度都比前者高出很多。GTX的接收通道的功能相比发送通道更加重要&am…

【Linux】进程的隔离和控制:namespace 隔离、cgroup 控制

文章目录 五、namespace 隔离dd -- 读取、转换并输出数据mkfs -- 格式化文件系统df -- 显示文件系统磁盘使用情况mount -- 加载文件系统到指定的加载点unshare -- 创建子进程&#xff0c;同时与父程序不共享namespace一个 demo 六、cgroup(Control Group) 相关命令pidstat -- 监…

Redis 源码安装(CentOS 单机)

序言 本文给大家介绍如何在 CentOS 上&#xff0c;通过 Redis 源码单机部署 Redis 服务。 一、部署流程 通过官网下载源码 # 下载源码 wget https://download.redis.io/redis-stable.tar.gz# 解压源码包 tar -xzvf redis-stable.tar.gz在 linux 中执行以下命令&#xff0c;安…

百度云内容审核快速配置 (java)

为什么要选择百度云 &#xff1f; 因为他免费用一年 首先要先开通百度云内容安全服务 按照操作指引走完整套 ContentCensor Java SDK目录结构** com.baidu.aip├── auth //签名相关类├── http //Http通…

深度解析DPO及其变体在多种任务上的表现如何,该如何选择

深度学习自然语言处理 原创作者&#xff1a;wkk 单位&#xff1a;亚利桑那州立大学paper&#xff1a;Insights into Alignment:Evaluating DPO and its Variants Across Multiple TasksLink&#xff1a;https://arxiv.org/pdf/2404.14723 今天&#xff0c;我要带大家深入了解一…

Qt在任务栏图标和系统托盘图标上显示红点

在任务栏图标上显示红点 关键类&#xff1a;QWinTaskbarButton #include <QWinTaskbarButton>QPointer<QWinTaskbarButton> taskbarBtn nullptr; if (!taskbarBtn) {taskbarBtn new QWinTaskbarButton(window);taskbarBtn->setWindow(window->windowHand…