- 博客(44)
- 资源 (1)
- 收藏
- 关注
原创 Langchaine4j 流式输出 (6)
摘要:本文介绍了Langchaine4j大模型的流式输出功能,它允许逐步返回生成结果,提升用户体验。内容包括流式输出概念、添加Spring WebFlux和Langchain4j-Reactor依赖的配置方法、创建流式助理服务的代码示例,以及两种测试方式:通过单元测试验证流式输出功能和使用REST接口实现浏览器实时展示。还提供了相关配置参数和测试效果截图,展示了流式输出实时返回结果的特性。
2025-06-01 15:15:57
418
原创 Langchain4j Function Calling (5)
本文介绍了Langchain4j中的Function Calling(函数调用)功能。通过示例展示了不使用函数调用时LLM在处理复杂数学运算时的局限性,以及如何使用@Tool注解创建计算工具类(如加法、平方根计算)来增强模型能力。文章详细解析了函数调用的执行流程、关键注解(@Tool、@P、@ToolMemoryId)的使用方法,以及如何通过工具调用获得准确计算结果。测试案例证实了函数调用机制能有效解决复杂运算问题,并保留了对话上下文记忆。
2025-05-30 14:30:14
770
原创 Langchain4j 提示词 (4)
本文介绍了Langchain4j框架中系统提示词(@SystemMessage)和用户提示词(@UserMessage)的使用方法。系统提示词用于设定AI角色身份和行为模式,可通过注解直接配置或从资源文件加载,修改后会重置聊天记忆。用户提示词可通过{{it}}占位符引用参数,支持多参数场景下的参数名指定。测试案例展示了方言回复、日期处理和表情符号等功能实现,并通过MongoDB存储验证了系统提示词的单次传递特性。这些功能增强了AI交互的个性化和灵活性。
2025-05-30 10:39:43
1145
原创 Langchain4j 聊天记忆 (3)
Langchain4j 聊天记忆实现方案 本文介绍了Langchain4j中实现聊天记忆的几种方法: 基础测试:发现直接调用模型不具备记忆功能 手动实现:通过手动传入历史对话记录实现简单记忆 ChatMemory内置功能: 配置MessageWindowChatMemory 使用AiService自动管理对话历史 支持设置最大记忆消息数 隔离记忆: 通过memoryId实现不同会话的记忆隔离 配置ChatMemoryProvider为不同会话创建独立记忆 持久化方案: 基于MongoDB存储聊天记录 实现M
2025-05-29 13:26:17
579
原创 Langchain4j AIService (2)
AIService使用面向接口和动态代理的方式完成程序的编写,更灵活的实现高级功能。链的概念源自 Python 中的 LangChain。其理念是针对每个常见的用例都设置一条链,比如聊天机器人、检索增强生成(RAG)等。链将多个底层组件组合起来,并协调它们之间的交互。链存在的主要问题是不灵活,我们不进行深入的研究。在LangChain4j中我们使用AIService完成复杂操作。底层组件将由AIService进行组装。
2025-05-29 13:24:40
723
原创 Spring Boot 读取.env文件获取配置
Spring Boot项目可以通过在resources目录下创建.env文件存储敏感配置(如API密钥),然后在application.yml中使用spring.config.import加载该文件。配置项可通过${}占位符引用,如示例中使用了阿里百炼平台的API密钥和DeepSeek模型配置。这种方式实现了敏感信息与代码分离,支持环境变量式配置管理。(98字)
2025-05-28 09:49:38
621
原创 JVM参数调优
如果你做过JVM调优和参数配置,那么如何盘点查看JVM系统默认值?一般使用jps和jinfo进行查看(JPS:查看运行的Java进程,jinfo 是查看进程的具体信息-Xms:初始堆空间-Xmx:堆最大值-Xss:栈空间-Xms 和 -Xmx最好调整一致,防止JVM频繁进行收集和回收。
2024-04-04 16:38:51
1348
原创 阻塞队列(BlockingQueue)
在多线程领域:所谓阻塞,在某些情况下会刮起线程(即阻塞),一旦条件满足,被挂起的线程又会自动被唤醒。阻塞队列的好处是,我们不需要关心什么时候需要阻塞线程,什么时候唤醒线程。在concurrent包发布以前,在多线程环境下,我们每个程序员都必须去自己控制这些细节,尤其还要兼顾效率和线程安全,而这会给我们程序带来不小的复杂度。
2024-04-03 20:22:02
374
原创 强软弱虚 四大引用
在原来的时候,我们谈到一个类的实例化在等号的左边,就是一个对象的引用,存储在栈中而等号右边,就是实例化的对象,存储在堆中其实这样的一个引用关系,就被称为强引用红色部分在垃圾回收之外,也就是强引用的蓝色部分:属于软引用,在内存不够的时候,才回收虚引用和弱引用:每次垃圾回收的时候,都会被干掉,但是它在干掉之前还会存在引用队列中,我们可以通过引用队列进行一些通知机制。
2024-04-01 22:30:07
1059
原创 【Linux】在生产环境中,Linux系统排查常用命令
r:运行和等待的CPU时间片的进程数,原则上1核的CPU的运行队列不要超过2,整个系统的运行队列不超过总核数的2倍,否则代表系统压力过大,我们看蘑菇博客测试服务器,能发现都超过了2,说明现在压力过大。svctm的值与await的值很接近,表示几乎没有I/O等待,磁盘性能好,如果await的值远高于svctm的值,则表示I/O队列等待太长,需要优化程序或更换更快磁盘。 us:用户进程消耗CPU时间百分比,us值高,用户进程消耗CPU时间多,如果长期大于50%,优化程序。
2024-04-01 22:23:53
1665
原创 Volatile
假如开始两个线程读取主内存的数值都是1,A线程进行 number++操作,计算完成,即将刷新到主内存,此时A线程被挂起,B线程进行number++ 操作,写入主内存,这个时候主内存是2,A获取到了CPU资源,也把2写入主内存,导致了计算丢失一次(写覆盖),即保证不了原子性.,首先要将变量从主内存拷贝到自己的工作内存空间,然后对变量进行操作,操 作完成后,再将变量写会主内存,不能直接操作主内存中的变量,各个线程中的工作内存中存储着主内存中的变量副本拷贝,因。,所有线程都可以访问,
2024-03-30 10:35:37
584
原创 Semaphore(信号量)
常用于限制可以访问某些资源的线程数量,例如通过 Semaphore 限流。Semaphore 是一个计数信号量,必须由获取它的线程释放。
2024-03-30 10:20:33
159
原创 Java 线程池
获取多线程的方法,我们都知道有三种,还有一种是实现Callable接口实现Runnable接口实现Callable接口实例化Thread类使用线程池获取。
2024-03-29 18:58:37
1234
1
原创 OOM Error
但如果不断分配本地内存,堆内存很少使用,那么JVM就不需要执行GC,DirectByteBuffer对象就不会被回收,这时候堆内存充足,但本地内存可能已经使用光了,再次尝试分配本地内存就会出现OutOfMemoryError,那么程序就奔溃了。那就是GC清理的这点内存很快会再次被填满,迫使GC再次执行,这样就形成了恶性循环,CPU的使用率一直都是100%,而GC却没有任何成果。GC回收时间过长时会抛出OutOfMemoryError,过长的定义是,超过了98%的时间用来做GC,并且回收了不到2%的堆内存。
2024-03-29 16:47:53
1342
1
原创 CountDownLatch(计数器)
将CountDownLatch的计数器初始化为new CountDownLatch(n),每当一个任务线程执行完毕,就将计数器减1 countdownLatch.countDown(),当计数器的值变为0时,在CountDownLatch上await()的线程就会被唤醒。做法是初始化一个共享的CountDownLatch(1),将其计算器初始化为1,多个线程在开始执行任务前首先countdownlatch.await(),当主线程调用countDown()时,计数器变为0,多个线程同时被唤醒。
2024-03-28 14:15:47
332
原创 CyclicBarrier(循环屏障)
CyclicBarrier 的字面意思是可循环(Cyclic)使用的屏障(Barrier)。它要做的事是:让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程达到屏障时,屏障开放行,所有被放行的线程才会继续任务,线程进入屏障通过CyclicBarrier 的await()方法。
2024-03-28 14:09:31
247
原创 死锁(Dead Lock)
死锁是指两个或多个以上的进程在执行过程中,因争夺资源而造成一种互相等待的现象,若无外力干涉那他们都将无法推进下去,如果资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。解决方法:进程请求资源时,要求它不占有任何其它资源,也就是它必须一次性申请到所有的资源,这种方式会导致资源效率低。我们创建了一个资源类,然后让两个线程分别持有自己的锁,同时在尝试获取别人的,就会出现死锁现象。当我们出现死锁的时候,首先需要使用jps命令查看运行的程序。进程运行推进的顺序不对。
2024-03-27 17:13:00
588
原创 idea历史记录恢复代码
在idea中使用Git切换分支的时候,有时候会丢失代码,当这些代码没有或者的时候,使用Git相关命令就找不到代码了.这个时候代码就不能使用Git来恢复.这个时候我没就需要借助idea的历史功能来进行恢复.idea的历史功能是默认打开的,只保存,当代码丢失,应及时的操作,防止超过历史时间.
2024-03-27 13:39:45
1854
1
原创 Docker overlay2磁盘使用100%处理方法
线上一服务突然停止服务了,登入ECS查看,发现快捷命令都不提示了显示错误.在 根目录使用命令查看,发现。
2024-03-25 15:45:12
561
1
原创 Jupyter lab 禁用 Download 和 Open in New Browser Tab 按钮
Jupyter lab 禁用 Download 和 Open in New Browser Tab 按钮
2023-11-04 17:38:50
785
1
原创 表结构相同的表,获取列值不同的列名
现有两个表表结构相同,两个表的数据id是一一对应的,由于一些原因导致了两个表部分列的值不一样,现在想最小化程度的更新,去保证两个表的列数据统一.
2023-10-13 10:21:48
80
原创 iframe嵌入jupyterlab,jupyterlab 无法执行代码问题
iframe 嵌套 jupyterlab,jupyterlab 无法执行代码问题
2023-10-12 10:25:34
792
2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人