深入浅出LangChain4J
1.走进LangChain1.1.什么是LangChain4JThe goal of LangChain4J is to simplify integrating LLMs into Java applications.​ -- 《LangChain4J Doc》LangChain4J就像Java的Spring框架一样为LLM的接入提供了一套标准的接入能力。LangChain4J是LangChain在Java生态下的具体实现用于构建基于LLM的应用和Agent系统。LangChain4J为不同的LLM提供了一个统一的API屏蔽了底层API供应商的实现和调用差异开发者可以使用LangChain无缝切换不同的LLM。2.Architecture of LangChain4JLangChain4J的架构可以分为两层分别为高层和底层。高层AI服务屏蔽了底层实现的细节开发者可以实现一些业务服务的API和LLM进行交互。低层具有更高的自由度你可以任意定义组件的具体实现控制组件的组合方式等等。下面就LangChain4J的核心组件一一详细介绍。2.1.Chat and Language Model一般地LLMs的API可以分为两类LanguageModel输入输出都为String类型现在使用的越来越少了ChatModel应用广泛的一类API接收多个ChatMessage作为输入输出一个AiMessage除了文本类型之外还支持图片、音频、视频等其他模式。ChatModel是LangChain4J的低层API提供强大的灵活性和可扩展性。根据消息来源进行分类LangChain4J支持以下五种消息类型消息类型描述主要方法UserMessage用户输入的消息数据content(), name(), attributes()AiMessageAI根据输入数据生成的消息text(), thinking(), toolExceptionRequests(), attributes()ToolExecutionResultMessage工具执行结果消息SystemMessage系统发送的消息可以由开发者自定义CustomMessage自定义消息2.2.Chat Memory我们知道大模型是无状态的模型本身并不会记录对话上下文。因此如果你想要在对话中使用上下文的内容就必须主动维护管理ChatMessage。但是手动维护比较麻烦而LangChain4J提供了ChatMemory用来维护管理chatMessage.2.2.1.History VS Memory历史记录和记忆听起来似乎是同一种东西但是对于LLM Agent来说history和memory具有两种截然不同的语义history保留了用户和AI的所有会话记录用户可以在界面中看到memory记录的是专门呈现给大模型使用的信息使其表现得好像是“记住了”对话的内容实际底层实现是截然不同的算法。LangChain4J目前只提供Memroy而不提供History。下面介绍关于Memory的几点高级特性。2.2.2.Eviction Policy 淘汰策略为什么要使用淘汰策略存储空间受限Memory组件可以理解为缓存当存放的内容超过容量大小的时候需要使用一定的策略淘汰一些记忆Token成本昂贵更多的上下文记忆就代表使用更多的Token而token的增加会增加每次调用LLM的成本控制延迟发送的LLM的token越多处理他们所需要的时长越长则用户等待输出的时间越长LangChain4J目前支持两种开箱即用的记忆淘汰策略基于消息滑动窗口使用MessageWindowChatMemory作为滑动窗口仅保留最近的N条信息淘汰窗口之外的旧消息基于token的滑动窗口TokenWindowChatMemory只保留最近的N个token。但是消息是不可再分的因此如果消息不合适的话整条消息会直接被丢弃。2.2.3.Persistence 持久化默认情况下Memory是存放在内存中的如果需要保留消息可以自定义实现MessageStore将chatMessage存储在数据库中。class PersistentChatMemroyStore implements ChatMemoryStore { Override public ListChatMessage getMessages(Object memoryId) { } Override public void updateMessages(Object memoryId, ListChatMessage messages) { } Override public void deleteMessages(Object memoryId) { // TODO: Implement deleting all messages in the persistent store by memory ID. } }2.2.4.SystemMessageSystemMessage是一种特殊的消息具有如下的特性一旦添加就会一直被保留不会被淘汰策略淘汰一次只能持有一个SystemMessageSystemMessage具有唯一性重复的SystemMessage会被忽略如果不一致则会覆盖掉之前的SystemMessage2.2.5.Tool 消息配对AIMessage 中的ToolExecutionRequest和ToolExecutionResponse总是成对出现的。如果ToolExecutionRequest被淘汰了则其对应的ToolExecutionResponse消息也会被自动淘汰。2.3.Tools(Function Calling)工具(Tools)允许LLM在必要的时候调用开发者定义的一个或者多个可用工具工具是一个泛称可以表示任何东西例如网页搜索、外部API、或者执行特定的代码等等。实际上LLM并不会去主动调用工具而是通过开发人员在业务层接收LLM的回复根据LLM的意愿进行工具的调用并将执行结果反馈给LLM。一个良好的工具应当具有以下几个属性清晰明确的工具名称工具的具体描述以及应该何时使用工具每个工具的具体参数如果这个工具对于人来说一眼就能理解应该如何使用那么这个工具对于LLM也是易于使用的。Tools的定义和使用可以参考文档LangChain4J Documents2.4.Agent3.实战3.1.ChatModel3.1.1.基本聊天public static void main(String[] args) { // 1.创建 chatModel OpenAiChatModel chatModel OpenAiChatModel.builder() .apiKey(System.getenv(OPENAI_API_KEY)) .baseUrl(System.getenv(OPENAI_BASE_URL)) .modelName(System.getenv(OPENAI_MODEL)) .build(); // 2.使用 chat 方法发起对话 ChatResponse response chatModel.chat(ChatRequest.builder() .messages(UserMessage.from(Hello, could you introduce yourself ?)) .build()); // 3.控制台打印 System.out.println(response.aiMessage().text()); }3.1.2.多轮对话多轮对话和基本对话的实现方式相同只不过构建对话请求的时候需要将前文传入到messages中LLM会参考message得出合理的响应。private static void chatWithMultipleMessages() { // 1.构建 User 和AI 的多轮对话 UserMessage firstUserMessage UserMessage.from(Hello, My name is shepi, could you introduce yourself ?); AiMessage firstAiMessage CHAT_MODEL.chat( ChatRequest.builder() .messages(firstUserMessage) .build()) .aiMessage(); UserMessage secondUserMessage UserMessage.from(Please tell me my name); AiMessage secondAiMessage CHAT_MODEL.chat( ChatRequest.builder() .messages(firstUserMessage, firstAiMessage, secondUserMessage) .build()).aiMessage(); // 2.控制台打印 System.out.println(secondAiMessage.text()); }3.2.ChatMemoryChatMemory可以帮助我们维护上下文LangChain4J提供了两种开箱即用的窗口聊天记忆MessageWindowChatMemoryTokenWindowChatMemory下面是一个基于消息数量的窗口对话记忆public static void main(String[] args) { // 1.新建 messageWindow滑动窗口最大长度设置为 3 MessageWindowChatMemory chatWindow MessageWindowChatMemory.builder() .maxMessages(4) .build(); // tryChatWithCommonMessages(chatWindow); // 测试特殊的系统消息 systemMessage tryChatWithSystemMessage(chatWindow); } /** * 系统消息永远不会被驱逐 * param chatWindow */ private static void tryChatWithSystemMessage(MessageWindowChatMemory chatWindow) { // 创建系统消息 SystemMessage systemMessage SystemMessage.from(The user talking with you is shepi); chatWindow.add(systemMessage); System.out.println(systemMessage.text()); for (int i 0; i 4; i) { UserMessage userMessage null; if (i 3) { userMessage UserMessage.from(Please tell me my name); } else { userMessage UserMessage.from(lets talk about something interesting); } System.out.println(userMessage.contents()); chatWindow.add(userMessage); // 使用 chatMemory 对话 AiMessage aiMessage CHAT_MODEL.chat(ChatRequest.builder().messages(chatWindow.messages()).build()).aiMessage(); System.out.println(aiMessage.text()); chatWindow.add(aiMessage); } } private static void tryChatWithCommonMessages(MessageWindowChatMemory chatWindow) { // 2.模拟进行多轮对话 // 第一轮给出自己的名字第四轮询问AI我的名字其他两轮随便聊点什么 for (int i 0; i 4; i) { UserMessage userMessage null; if (i 0) { userMessage UserMessage.from(Hello, My name is shepi, could you introduce yourself ?); } else if (i 3) { userMessage UserMessage.from(Please tell me my name); } else { userMessage UserMessage.from(lets talk about something interesting); } System.out.println(userMessage.contents()); chatWindow.add(userMessage); // 使用 chatMemory 对话 AiMessage aiMessage CHAT_MODEL.chat(ChatRequest.builder().messages(chatWindow.messages()).build()).aiMessage(); System.out.println(aiMessage.text()); chatWindow.add(aiMessage); } }3.3.ToolsLangChain中定义Tool非常简单只需要在工具接口方法上使用注解Tool(Tool description)即可下面是一个简答的例子。public class WeatherService { Tool(获取指定城市的天气情况) public String getWeather(String city) { // 模拟天气数据 return MessageFormat. format(Todays weather in {0} is sunny with a temperature of 22 degrees., city); } }3.4.AiService (Agent 封装)AiService 是什么AiService 是 LangChain4J 提供的高层 API用于快速构建 Agent 应用。它屏蔽了工具调用的底层细节如检测 LLM 返回的函数调用请求、执行工具、将结果反馈给 LLM让开发者可以专注于业务逻辑。AiService 与 Agent 的关系AiService 是 LangChain4J 对 Agent 概念的具体实现它自动完成了 Agent Loop 中的接收输入 → 判断是否需要 Tool → 调用 Tool → 观察结果 → 生成响应开发者只需定义接口和 ToolAiService 会自动完成工具调用的编排如果想要使用上面创建的 Tool我们需要在定义AiService时传入 Tool 对象。private static final OpenAiChatModel CHAT_MODEL OpenAiChatModel.builder() .apiKey(System.getenv(OPENAI_API_KEY)) .baseUrl(System.getenv(OPENAI_BASE_URL)) .modelName(System.getenv(OPENAI_MODEL)) .build(); public static void main(String[] args) { // 根据CHAT_MODEL创建一个 chatService ChatAssistant chatService AiServices.builder(ChatAssistant.class) .chatLanguageModel(CHAT_MODEL) .tools(new WeatherService()) .chatMemory(MessageWindowChatMemory.withMaxMessages(10)) .build(); // 问题 String question 今天北京什么天气?; String answer chatService.chat(question); System.out.println(answer); }4.流式响应 (Streaming)LangChain4J 支持流式响应即 LLM 在生成内容时实时返回每个 token而不是等待完整响应后再返回。使用场景需要实时显示生成过程的场景如 ChatGPT 的打字机效果生成较长内容时提升用户体验需要提前终止不满意的输出实现方式使用StreamingAiServices代替AiServicesprivate static final OpenAiChatModel CHAT_MODEL OpenAiChatModel.builder() .apiKey(System.getenv(OPENAI_API_KEY)) .baseUrl(System.getenv(OPENAI_BASE_URL)) .modelName(System.getenv(OPENAI_MODEL)) .build(); public static void main(String[] args) { // 根据CHAT_MODEL创建一个 chatService ChatAssistant chatService AiServices.builder(ChatAssistant.class) .chatLanguageModel(CHAT_MODEL) .tools(new WeatherService()) .chatMemory(MessageWindowChatMemory.withMaxMessages(10)) .build(); // 问题 String question 今天北京什么天气?; String answer chatService.chat(question); System.out.println(answer); }流式 vs 非流式特性非流式 (AiServices)流式 (StreamingAiServices)响应方式等待完整响应后返回实时返回每个 token用户体验有等待感实时反馈体验更好实现复杂度简单稍复杂需要处理回调适用场景短文本、后台任务长文本、交互式对话学习资源推荐如果你想更深入地学习大模型以下是一些非常有价值的学习资源这些资源将帮助你从不同角度学习大模型提升你的实践能力。一、全套AGI大模型学习路线AI大模型时代的学习之旅从基础到前沿掌握人工智能的核心技能​因篇幅有限仅展示部分资料需要点击文章最下方名片即可前往获取二、640套AI大模型报告合集这套包含640份报告的合集涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师还是对AI大模型感兴趣的爱好者这套报告合集都将为您提供宝贵的信息和启示​因篇幅有限仅展示部分资料需要点击文章最下方名片即可前往获取三、AI大模型经典PDF籍随着人工智能技术的飞速发展AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型如GPT-3、BERT、XLNet等以其强大的语言理解和生成能力正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。因篇幅有限仅展示部分资料需要点击文章最下方名片即可前往获取四、AI大模型商业化落地方案作为普通人入局大模型时代需要持续学习和实践不断提高自己的技能和认知水平同时也需要有责任感和伦理意识为人工智能的健康发展贡献力量。

相关新闻

【电力系统】基于极限学习机的DC-DC转换器建模附matlab代码

【电力系统】基于极限学习机的DC-DC转换器建模附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/7/5 16:32:14 阅读更多 →
程控定量封口机-大肠菌群水质微生物检测仪在现代水质微生物检测中的技术价值与应用解析

程控定量封口机-大肠菌群水质微生物检测仪在现代水质微生物检测中的技术价值与应用解析

引言 在水质安全与卫生评价体系中,微生物指标的检测至关重要,尤其是总大肠菌群、粪大肠菌群及大肠埃希氏菌等指示菌群的定量分析,直接关系到用水安全与公共卫生保障。传统的微生物检测方法如多管发酵法和滤膜法,虽经典却存在操作…

2026/7/4 21:18:54 阅读更多 →
6个AI智能体自主运营网站,无需人工值守!

6个AI智能体自主运营网站,无需人工值守!

🔥 颠覆式实践!6 个 AI 智能体自主运营网站,写文、发推、复盘全自动化,无需人工盯屏,真正实现“部署即脱手”!作为开发者,这套基于 OpenClawVercelSupabase 的三层架构方案,实测可复…

2026/7/3 4:59:04 阅读更多 →

最新新闻

Thrift接口测试与性能分析:Team IDE的高级功能详解

Thrift接口测试与性能分析:Team IDE的高级功能详解

Thrift接口测试与性能分析:Team IDE的高级功能详解 【免费下载链接】teamide Team IDE 集成MySql、Oracle、金仓、达梦、神通等数据库、SSH、FTP、Redis、Zookeeper、Kafka、Elasticsearch、Mongodb、小工具等管理工具 项目地址: https://gitcode.com/gh_mirrors/…

2026/7/5 17:01:06 阅读更多 →
BTTV安卓版性能优化指南:提升应用流畅度的10个技巧

BTTV安卓版性能优化指南:提升应用流畅度的10个技巧

BTTV安卓版性能优化指南:提升应用流畅度的10个技巧 【免费下载链接】bttv A mod of the Twitch Android Mobile App adding BetterTTV, FrankerFaceZ and 7TV emotes 项目地址: https://gitcode.com/gh_mirrors/bt/bttv BTTV安卓版是一款为Twitch移动应用添加…

2026/7/5 16:59:06 阅读更多 →
如何贡献cs-wiki:开发者参与开源项目的详细步骤与技巧

如何贡献cs-wiki:开发者参与开源项目的详细步骤与技巧

如何贡献cs-wiki:开发者参与开源项目的详细步骤与技巧 【免费下载链接】cs-wiki 📙 致力打造完善的后端知识体系. Not only an Interview-Guide, but also a Learning-Direction. 项目地址: https://gitcode.com/gh_mirrors/cs/cs-wiki cs-wiki 是…

2026/7/5 16:59:06 阅读更多 →
Twitter API Client实战:构建自动化Twitter机器人全攻略

Twitter API Client实战:构建自动化Twitter机器人全攻略

Twitter API Client实战:构建自动化Twitter机器人全攻略 【免费下载链接】twitter-api-client A user-friendly Node.js / JavaScript client library for interacting with the Twitter API. 项目地址: https://gitcode.com/gh_mirrors/twi/twitter-api-client …

2026/7/5 16:55:06 阅读更多 →
HyperDB入门指南:5分钟快速上手分布式数据库

HyperDB入门指南:5分钟快速上手分布式数据库

HyperDB入门指南:5分钟快速上手分布式数据库 【免费下载链接】hyperdb Distributed scalable database 项目地址: https://gitcode.com/gh_mirrors/hyp/hyperdb HyperDB是一款分布式可扩展数据库,它以文件系统的隐喻构建,让开发者能够…

2026/7/5 16:53:05 阅读更多 →
【Bug已解决】Codex CLI 报错 EMFILE: too many open files 解决方案

【Bug已解决】Codex CLI 报错 EMFILE: too many open files 解决方案

【Bug已解决】Codex CLI 报错 EMFILE: too many open files 解决方案 1. 问题描述 让 Codex 处理一个规模较大的项目(比如文件数量众多的 monorepo)时,任务执行到某个阶段突然崩溃,报出文件描述符耗尽的错误: Error: E…

2026/7/5 16:53:05 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻