LangChain4j(Java 版 LangChain)速成教学

收到评论区的朋友邀请,我写一下这个教学,我本人是java转行,所以还是有java的基础,

不讲废话哦,直接开始,

一、LangChain4j 是什么?

  • Java 实现的 LangChain 框架
  • 让你用 Java 调大模型(如 OpenAI)、加记忆、连知识库、做 Agent
  • 核心思想:Model + Prompt + Chain = App

说白了也就那一套,前端还是tomcat之类的。

然后很多朋友还会问也没有类似fastapi的前端框架,

现在正常的话是几步走,首先假设我们有三年开发经验,(现在是面试吹牛时间)

那么第一步就是了解需求,第二步骤是技术选型,第三步是和产品或者其他伙伴讨论可行性,第四步就是问客户意见/或者给几个方案,第五步就是快速迭代开发,最后才是优化剩余的小部分(这个一听就知道你在公司做过实际开发而且具备自己的思考hh)

那么同样的,我们这里以实际案例作为来说,这里用langchian4j,肯定就是搞agent了,

首先不考虑工作流或者模型的部分,因为这里暂时讲纯代码,那么我们肯定就只能去找替代品了,

因为没有能实现这个或者比这个优秀的框架,所以暂时选择:Spring Boot + Springdoc OpenAPI/Javalin,

那么为什么选择这个,首先要考虑fastapi是什么,有什么特点,(我这里废话很多,但是全是有用的东西,我在教你怎么做事情)

其实反而是这个东西在中国的教育是最欠缺的。他的特点也就是速度快,生成文档,有个代码补全之类的乱七八糟的。

这里就不上代码了,你知道有这么个东西然后面试吹牛吹的过就可以了,Springdoc OpenAPI这个是比较全的生产级,

下面这个javalin是比较轻便的,你下来整着玩一下就行了,现在技术迭代确实很快,每天都有新鲜玩意,每天都像圣诞节。

好了接着讲上面这个langchain4J:这个其实就是传统java框架,

var model = OpenAiChatModel.builder()
6    .apiKey("sk-你的-key")
7    .modelName("gpt-4o") // 或 gpt-3.5-turbo
8    .build();
11String answer = model.generate("你好,你是谁?");
12System.out.println(answer);

这里我们可以看到生成一套流程,在maven下载库导入包之后,可以来一个模板化框架,中间上自己要用的模型就行了。

再往下也可以配上memory(记忆),RAG之类的,然后你可以封装成类,然后让agent调用这个ai类。

核心组件如下:

ChatLanguageModel 连大模型

AiServices 自动生成 AI 接口

ChatMemory 加对话记忆

EmbeddingStore + Retriever 实现 RAG(知识库问答)

基本上讲完了,这个没什么区别,可以说只是做了一个自适应的java版。

其实编程语言是通的,反而编程框架不重要,那么编程框架不重要,继而八股文不重要,

作为程序员你真正的核心竞争力是创造价值的能力,公司不管要什么你都可以做,你想要什么东西你都可以做,

这份能力与资本才是你最值得骄傲的东西,我做过量化程序,做过市商订单撮合,做过tg的跟单bot,做过x的实用插件,

做过个人博客网站,做过链条开发,也做过rag,金融agent,网安agent,还有各种乱七八糟的东西,这份好奇心支撑着我去探索,而正是这份探索有了

现在写博客教程的经历,所以说你应该去做的是思考,去做感兴趣的事情而不是每天背八股文背各种编程语言的效用,我个人而言反倒是觉得本末倒置了。

那么也是1300字了,拜拜了,还有什么想了解的都可以评论,我都会看,也会讲网安或者solidity之类的开发。

#产品每日一题##聊聊我眼中的AI#
大模型集合 文章被收录于专栏

这里全放大模型的,需要自取,后面可能没什么空搞这些了。

全部评论
点点关注,点点赞朋友吗,我的流量好少现在,
1 回复 分享
发布于 12-08 09:55 山东
太强了佬,支持!
点赞 回复 分享
发布于 12-11 09:38 福建
兄弟们点赞点赞
点赞 回复 分享
发布于 12-09 10:49 湖北
好好好 兄弟们点赞
点赞 回复 分享
发布于 12-09 09:41 湖北
ai怎么转后端了,这些大家都会
点赞 回复 分享
发布于 12-09 09:27 江西

相关推荐

12-08 12:43
已编辑
门头沟学院 Java
那些杀不死我的 反复追着我杀!!1.jvm包含哪几部分classloader:将编译(.java->.class)好的java字节码文件(.class文件) 加载到内存中(也就是运行时数据区Runtime data area 存放运行时数据(线程私有:栈 本地方法栈 pc ,进程级(也就是所有线程共享):堆 本地方法区)Execution engine 执行引擎,class文件被加载后 将指令和数据放在内存中 执行引擎负责将命令解释给os 也就是将JVM指令翻译为os指令集Native interface:本地库接口2.jvm内存结构/运行时数据区线程私有的:栈(每个方法执行时创建栈帧 存局部变量表等) 本地方法栈(为Native方法提供服务) 程序计数器(存当前线程执行的字节码指令地址)线程共享:堆(最大的内存区 存对象实例、类对象) 方法区 (存类有关的信息 静态变量等)3.说一下永久代和元空间都是对 方法区 的实现永久代:JDK7 及之前的实现,属于堆内存的一部分,有固定大小限制(通过-XX:PermSize/-XX:MaxPermSize设置),存储类元信息、常量池等,易触发永久代 OOM元空间:JDK8 及之后的实现,使用本地内存(不在堆中),大小受物理内存限制(默认无上限),仅需通过-XX:MetaspaceSize设置初始触发 GC 的阈值4.为什么jdk8要将永久代替换为元空间解决永久代OOM问题 简化类元数据管理 兼容JVM规范5.类加载过程加载:通过类全限定名获取字节码流,将字节码转化为方法区的类元数据,同时在堆中生成Class对象验证:确保字节码符合 JVM 规范(如文件格式验证、语义验证),防止恶意字节码破坏 JVM 安全准备:为类的静态变量分配内存并赋默认值(如 int 赋 0、对象赋 null),不执行赋值语句(赋值在初始化阶段)解析:将常量池中的符号引用替换为直接引用(如类、方法的内存地址),该阶段可延迟到初始化后执行。初始化:执行<clinit>方法(静态变量赋值 + 静态代码块),触发时机是 “主动使用”(new 对象、访问静态成员、反射、初始化子类、主类),且每个类仅初始化一次6.类加载机制(双亲委派制)1类加载器收到加载请求  -> 2将请求委托给父加载器,一直向上委托,直到启动类加载器 -> 3启动加载器检查是否能加载这个类,能则使用当前加载器,否则向下传递 ->4重复步骤3 如果找不到 class not foundJVM 默认类加载器层级:启动类加载器(Bootstrap)→扩展类加载器(Ext)→应用程序类加载器(App)→自定义类加载器7.why双亲委派保护核心类库(如String由启动类加载器加载,避免自定义类篡改替换)防止类重复加载8.自定义类加载器需要注意什么重写findClass方法(not loadClass,避免破坏双亲委派)9.双亲委派模型有哪些破坏场景 为什么要破坏Tomcat的WebAppClassLoader:Tomcat 为每个 Web 应用创建独立类加载器,优先加载应用内的类(而非委托父类),目的是隔离不同 Web 应用的类(防止不同应用的同包同类冲突)JDBC 的 SPI 加载:JDBC 的核心接口java.sql.Driver由启动类加载器加载,但具体实现(如 MySQL 驱动)在第三方包,启动类加载器无法加载,因此 DriverManager 通过线程上下文类加载器(破坏双亲委派)加载实现类(可能会让详细说一下SPI机制一些热部署实现:自定义类加载器加载更新后的类10.类卸载条件类所有实例被完全回收 类加载器被完全回收 Class对象无任何引用(FullGC时发生11.介绍一下gc机制涉及对象可回收判定、垃圾收集算法、分代收集模型、垃圾收集器、GC 触发时机等维度(问这么大 吟唱启动12.常见gc算法标记-清除,标记-复制,标记-整理,分代收集13.介绍一下CMS和G1(1)CMS 收集器(老年代专用)核心流程:初始标记(STW,标记 GC Roots 直接关联对象)→并发标记(无 STW,遍历引用链)→重新标记(STW,修正并发标记的遗漏)→并发清除(无 STW,清理可回收对象)优点:并发收集,STW 时间短,适合低延迟场景缺点:产生内存碎片、CPU 消耗高(并发阶段占用 CPU)、依赖老年代空间预留(易触发 Full GC)(2)G1 收集器(全堆收集)核心流程:将堆划分为多个大小相等的 Region,包含新生代 Region 和老年代 Region;流程为初始标记→并发标记→最终标记→筛选回收(STW,优先回收垃圾多的 Region)优点:兼顾吞吐量和延迟、可预测 STW 时间(通过-XX:MaxGCPauseMillis设置)、无内存碎片(回收时整理 Region)缺点:内存占用高(维护 Remembered Set)、小内存场景下性能不如 CMS14.jvm如何判断对象是可回收的早期方案引用计数法(无法解决循环引用问题)可达性分析算法判定对象是否不可达,结合引用类型细分可回收时机,finalize 机制完成最终判定15.能否将对象分配在栈上jvm针对“逃逸”做了优化分析对象的作用域是否逃出方法 / 线程,若逃逸则可直接分配在栈上 无需gc16.jvm调优核心思路是什么监控 分析 参数调整 验证17.一般会调整哪些jvm参数堆大小:-Xms2g -Xmx2g(初始堆 = 最大堆,避免堆动态扩展的开销)新生代大小:-Xmn512m(新生代占堆的 1/4~1/3,过小会导致对象提前进入老年代)Survivor 比例:-XX:SurvivorRatio=8(Eden:S0:S1=8:1:1,保证新生代对象有足够空间存活)晋升老年代年龄:-XX:MaxTenuringThreshold -XX:InitialTenuringThresholdGC 收集器:-XX:+UseG1GC(默认推荐,兼顾吞吐量和延迟)、-XX:+UseZGC(低延迟场景)GC 日志:-XX:+PrintGCDetails -Xloggc:gc.log(输出 GC 日志用于分析)元空间:-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m(限制元空间大小,避免元空间 OOM)18.Jvm调优经验《没有经验!!》(回去等通知吧19.内存泄漏和OOM的区别?如何排查(1)内存泄漏:对象已无业务意义,但仍被引用(如ThreadLocal......),导致无法被 GC 回收,长期积累会引发 OOM① jmap -dump:format=b,file=heap.hprof导出堆快照;② MAT分析快照,定位 “无法回收的大对象” 和 “持有其引用的 GC Roots ③结合 Arthas 的jvm/heapdump命令定位泄漏代码(如静态 Map 未清理)(2)OOM:JVM 内存不足(如堆 / 元空间 / 栈超出上限),无法为新对象分配内存,直接抛出 OOM 异常① 看 OOM 类型(堆 OOM / 元空间 OOM / 栈 OOM)② 堆 OOM 分析对象分布(是否大对象过多) 元空间 OOM 检查类加载数量(是否频繁动态生成类) 栈 OOM 检查递归深度或线程数20.线上OOM问题如何排查21.如何分析gc日志22.线上频繁FullGC如何排查23.讲一下对jvm的理解(太大了 上文内容挑一些吟唱24.jmmJava Memory Model Java 内存模型,Java 虚拟机规范中定义的一种抽象内存模型,并非物理内存的实际布局,其核心目标是解决多线程环境下的原子性、可见性、有序性问题,为多线程编程提供内存访问的一致性规则欢迎佬赐教上辈子🔪👨放🔥 这辈子十月(底)秋招!!
查看23道真题和解析
点赞 评论 收藏
分享
评论
9
20
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务