自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(49)
  • 收藏
  • 关注

原创 关于rocketmq消费超时重试

从源码我们可以看到,我们自定义的消费者代码中,执行逻辑时间设置的70s,cleanExpireMsg()方法每60s执行一次,有可能第一次执行时,方法内计算的(当前时间的时间戳 - consumeStartTimeStamp)的值小于60s,于是没有执行重发消息的操作。不得已,只能查看源码,ProcessQueue中有个cleanExpireMsg()方法,字面意思看,是清理过期方法,咱设置的consumeTimeout=1,于是每分钟会触发一次。当70s后,逻辑结束,消息进行了其他处理。

2025-08-02 10:11:34 152

原创 windows中rocketmq提示“service not available now, maybe disk full”解决

执行命令 mklink /D store D:\mq\store。删除用户目录下的store目录。以命令行方式启动cmd。

2025-08-01 08:49:15 205

原创 fastjson反序列化时_id的处理

从输出看到,json字符串的_id转为了java对象属性的id,这不是想要的结果。于是,修改java对象,使用了@JSONField(alternateNames = {"id"})属性。这篇文章中也提到了这个问题,于是使用 @JSONField(name = "_id", alternateNames = {"id"})注解。写程序时,借助fastjson,将map对象转为json字符串,然后再通过json字符串转为对应的java对象。结果转换后,结果还是不对,上网查了资料,可以看到,结果正确。

2025-07-29 17:58:36 225

原创 Redisson的布隆过滤器

判断某个元素是否存在时,也是根据m个hash函数进行运算,如果m个位置的元素都为1,说明元素存在,只要某个位置存在一个0,则说明不存在。由于hash冲突,布隆过滤器可以判断元素一定不存在,但是不能保证一定存在,其存在一定的误判率。向布隆过滤器中添加元素时,根据m个hash函数对元素进行运算,得到m个位置;解决redis缓存穿透,当判断不存在该数据时,直接返回;给出一个长度是n的数组,元素的值是0或者1;布隆过滤器用来判断某个元素是否存在。将这m个位置的元素设置为1;防止内容的重复推荐;

2025-07-27 16:17:21 307

原创 Spring AI(14)——文本分块优化

根据源码的逻辑,分割文本时,可能出现如果分隔符的索引小于minChunkSizeChars,就不会对文本进行分割,于是,就会出现句子被断开的情况。根据CL100K_BASE编码,300长度的token转为本文内容后,文本内容的长度在220-250之间(根据本例的中文文档测试,实际存在误差),转换比例在70%到80%多,为了根据特定的字符进行分割,所以minChunkSize的值最好小于210。为此,对源码进行修改,增加分割符的列表,用户可以根据文档的中英文情况,自行设置分割符。

2025-07-26 11:54:39 466

原创 Spring AI(13)——RAG之RetrievalAugmentationAdvisor

RetrievalAugmentation表示检索增强中介绍了RAG的基本使用,但是其中的QuestionAnswerAdvisor 主要作用是对向量数据库中的所有文档执行相似性搜索。RetrievalAugmentationAdvisor可以更好的体现检索增强。

2025-07-19 11:16:06 740

原创 安装docker时,yum install -y yum-utils报错的解决

centos7,安装docker时,执行yum install -y yum-utils报错。1)进入/etc/yum.repos.d目录,删除其中所有文件。3)再次执行 yum install -y yum-utils。

2025-07-16 19:41:33 258

原创 Spring AI Alibaba(2)——通过Graph实现工作流

基于 Spring AI Alibaba Graph 进行工作流的开发。工作流是以相对固化的模式来人为地拆解任务,将一个大任务拆解为包含多个分支的固化流程。工作流的优势是确定性强,模型作为流程中的一个节点起到的更多是一个分类决策、内容生成的职责,因此它更适合意图识别等类别属性强的应用场景。Spring AI Alibaba Graph 在设计理念上借鉴 LangGraph,并且增加了大量预置 Node、简化了 State 定义过程等,让开发者更容易编写对等低代码平台的工作流、多智能体等。

2025-07-10 21:18:23 578 1

原创 Spring AI Alibaba(1)——基本使用

Spring AI Alibaba(SAA) 是一款以 Spring AI 为基础,深度集成百炼平台,支持 ChatBot、工作流、多智能体应用开发模式的 AI 框架。在 1.0 版本中,Spring AI Alibaba 提供以下核心能力,让开发者可以快速构建自己的 Agent、Workflow 或 Multi-agent 应用。与 Spring AI 的联系和区别。

2025-07-06 16:33:35 846

原创 Spring AI(12)——调用多模态模型识别和生成图像

修改yml配置注意:这里使用智谱提供的识别图像的glm-4v-flash模型测试代码输出结果。

2025-07-06 14:33:43 367

原创 LangChain4j(20)——调用百度地图MCP服务

MCP Server | 百度地图API SDK地理编码将地址解析为对应的位置坐标输入:address地址信息输出:location逆地理编码将坐标点转换为对应语义化地址输入:location经纬度坐标输出:uid地点检索多种场景的地点以及POI检索, 包括城市检索、圆形区域检索输入:query检索关键词location圆形检索的中心点radius圆形检索的半径region城市检索指定城市输出: POI列表, 包含namelocationaddress等地点详情检索。

2025-06-27 21:35:26 763 2

原创 LangChain4j(19)——调用SearXNG搜索工具

SearXNG 是一个元搜索引擎,它聚合了其他搜索引擎的结果。

2025-06-25 19:13:13 278

原创 关于微信小程序的真机调试

勾选掉"局域网模式",但要保证电脑和手机处于同一个局域网下,也就是说它们需要连接到同一个wifi。"切换真机模式2.0",根据自己手机的系统选择对应的选项。另外,需要勾选"不校验合法域名......"

2025-06-22 09:41:30 188

原创 关于uniapp解析SSE响应数据的处理

从展示效果看,返回的数据都以“data:”开头,而且数据都发生了换行。这是由于后端返回大模型响应的数据时,需要换行的数据中间也使用了"\n\n",这就和SSE的数据格式产生了冲突。其中,"100 97 116 97 58"表示"data:","10 10"表示"\n\n",而且根据响应数据,我们发现SSE客户端是一次处理一批后端响应的数据。通过uniapp开发与大模型对话的微信小程序,并且后端需要通过SSE向小程序返回响应数据。其中通过正则表达式替换所有的"data:"和"\n\n"。

2025-06-22 09:23:18 516

原创 LangChain4j(18)——通过Xinference调用Rerank模型

也称为重排序模型,它从搜索中获取初始结果集,并重新评估它们,以确保它们更紧密地符合用户的意图。它超越了术语的表面匹配,考虑了搜索查询和文档内容之间更深层次的交互。LangChain4j支持的Rerank模型如下:其中通过onnx调用需要将模型转为onnx后调用,占用内存较多。Cohere、Jina等模型需要收费。本例采用Xinference方式调用。

2025-06-09 22:38:59 658

原创 Spring AI(11)——SSE传输的MCP服务端

支持SSE(Server-Sent Events) 基于 Spring MVC 的服务器传输和可选的STDIO运输。

2025-06-05 21:15:47 1178

原创 Spring AI(10)——STUDIO传输的MCP服务端

Spring AI MCP(模型上下文协议)服务器Starters提供了在 Spring Boot 应用程序中设置 MCP 服务器的自动配置。它支持将 MCP 服务器功能与 Spring Boot 的自动配置系统无缝集成。本文主要演示支持STDIO传输的MCP服务器。

2025-06-05 20:07:32 507

原创 Spring AI(9)——MCP客户端

模型上下文协议 (MCP) 是一种标准化协议,使 AI 模型能够以结构化方式与外部工具和资源交互。它支持多种传输机制,以便在不同环境中提供灵活性。MCP Java SDK 提供模型上下文协议的 Java 实现,通过同步和异步通信模式实现与 AI 模型和工具的标准化交互。Spring AI MCP通过 Spring Boot 集成扩展了 MCP Java SDK,同时提供了客户端和服务器Starters。通过STDIO(in-process) 和/或SSE(远程)访问MCP服务端。

2025-05-29 17:30:42 1163

原创 LangChain4j(17)——MCP客户端

本例使用的msp服务是server-everything。它是一个 MCP 客户端构建者的测试服务器。echo回显输入消息的简单工具输入:message(string):要回显的消息返回: 带有回声消息的文本内容add将两个数字相加输入:a(number):第一个数字b(number):第二个数字返回: 添加的文本结果演示长时间作的进度通知输入:duration(number,默认值:10):持续时间(以秒为单位)

2025-05-28 17:16:45 1284 1

原创 Spring AI(8)——流式响应

通过源码可以看到,调用ChatModel对象调用stream()方法即可实现流式响应。并且其返回值有两种形式:Flux<String>和Flux<ChatResponse>。流式响应允许异步获取响应数据。通过该方式,大模型每次返回一部分token,而不是等到生成完整结果后再返回。测试代码通过ChatModel对象和ChatClient对象分别实现了流式响应。ChatModel接口继承了StreamingChatModel接口。注意:一定要通过浏览器进行测试,否则无法看到流式响应的效果。

2025-05-23 15:07:43 516

原创 Spring AI(7)——RAG

检索增强生成(RAG),用于解决将相关数据纳入提示词中以获得准确 AI 模型响应的挑战。该方法采用批处理式编程模型,从指定的文档中读取非结构化数据,进行转换,然后写入向量数据库。从高层次来看,这是一个 ETL(提取、转换和加载)管道。向量数据库用于 RAG 技术的检索部分。在将非结构化数据加载到向量数据库时,最重要的转换之一是将原始文档分割成更小的片段。将原始文档分割成更小片段的过程有两个重要步骤:在保持内容语义边界的同时将文档分割成部分。

2025-05-20 13:38:44 1050

原创 Spring AI(6)——向量存储

向量数据库是一种特殊类型的数据库,在 AI 应用中发挥着至关重要的作用。在向量数据库中,查询与传统关系型数据库不同。它们执行的是相似性搜索,而非精确匹配。当给定一个向量作为查询时,向量数据库会返回与该查询向量“相似”的向量。Spring AI 通过接口提供了一个抽象的 API,用于与向量数据库交互。

2025-05-15 10:07:10 2009 1

原创 Spring AI(5)——通过嵌入模型进行数据的向量化处理

嵌入是文本、图像或视频的数值表示,用于捕获输入之间的关系。嵌入的工作原理是将文本、图像和视频转换为浮点数数组,称为向量。这些向量旨在捕获文本、图像和视频的含义。嵌入数组的长度称为向量的维度。通过计算两个文本向量表示之间的数值距离,应用程序可以确定用于生成嵌入向量的对象之间的相似性。接口旨在轻松集成 AI 和机器学习中的嵌入模型。其主要功能是将文本转换为数值向量,通常称为嵌入。这些嵌入对于各种任务至关重要,例如语义分析和文本分类。

2025-05-14 11:37:04 1407

原创 Spring AI(4)——工具调用

Tool(name="getTodayDate", description = "获取今天日期信息")System.out.println("获取当前日期时间");大模型调用的工具通过@Toolname:工具的名称。如果未提供,将使用方法名称。AI 模型在调用工具时使用此名称进行识别。因此,同一类中不允许存在名称相同的两个工具。对于特定聊天请求,该名称在模型可用的所有工具中必须是唯一的。:工具的描述,模型可以使用此描述来理解何时以及如何调用该工具。如果未提供,将使用方法名称作为工具描述。

2025-05-13 11:54:45 1475 2

原创 Spring AI(3)——Chat Memory

大型语言模型(LLM)是无状态的,这意味着它们不保留关于以前互动的信息。为了解决这个问题,Spring AI提供了Chat Memory(聊天记忆)功能。通过Chat Memory,用户可以实现在与LLM的多次交互中存储和检索信息。聊天记忆的底层存储由ChatMemoryRepository处理,其唯一责任是存储和检索消息。决定保留哪些消息及何时删除这些消息的权利在于ChatMemory的实现。策略可能包括保留最近的N条消息,保留一定时间段的消息,或者保留指定最大令牌数的消息。

2025-05-11 18:46:53 1649

原创 Spring AI(2)—— 发送消息的API

PromptTemplate是针对用户信息的模版,类似的还有:SystemPromptTemplate,AssistantPromptTemplate。通过源码可以到,Prompt对象中包含属性为List<Message>(聊天消息的列表)和ChatOptions(大模型属性信息的对象)。如果使用不带参数的propmt()方法,需要调用额外调用user()、system()方法设置需要发送的信息。可以通过PromptTemplate设置,也可以通过user()或者system()方法设置。

2025-05-11 08:34:39 654

原创 Spring AI(1)—— 聊天模型基本使用

Spring AI 是一个用于 AI 工程的应用程序框架。其目标是将 Spring 生态系统设计原则应用于 AI 领域。下面,我们通过具体的案例来学习下Spring AI的使用。

2025-05-07 22:49:42 795

原创 LangChain4j(16)——使用milvus进行向量存储

非结构化数据(如文本、图像和音频)格式各异,蕴含丰富的潜在语义,因此分析起来极具挑战性。为了处理这种复杂性,Embeddings 被用来将非结构化数据转换成能够捕捉其基本特征的数字向量。然后将这些向量存储在向量数据库中,从而实现快速、可扩展的搜索和分析。Milvus 提供强大的数据建模功能,使您能够将非结构化或多模式数据组织成结构化的 Collections。它支持多种数据类型,适用于不同的属性模型,包括常见的数字和字符类型、各种向量类型、数组、集合和 JSON,为您节省了维护多个数据库系统的精力。

2025-05-01 07:50:40 1499

原创 LangChain4j(15)——RAG高级之跳过检索

之前的文章中,我们介绍了RAG的使用,但是,每次提问时,都会通过RAG进行检索。有时,检索是不必要执行的,比如,当用户只是说“你好”时,于是,我们需要有条件的跳过检索过程。

2025-04-30 13:42:59 414

原创 LangChain4j(14)——向量存储

Redis Stack是Redis的扩展,它提供了一系列功能的扩展扩展,比如,全文搜索、文档数据库、时间序列数据、图形数据和矢量搜索等。Redis Stack Server,由 Redis,RedisSearch,RedisJSON,RedisGraph,RedisTimeSeries 和 RedisBloom 组成RedisInsight,官方提供的强大的redis客户端工具Redis Stack 客户端 SDK,包括Java、JavaScript、Python。

2025-04-26 09:00:00 1251

原创 LangChain4j(13)——RAG高级之查询压缩

本文介绍RAG的一些高级用法(Advanced RAG),很多语法都需要借助检索增强对象RetrievalAugmentor实现。RetrievalAugmentor是 RAG 管道的入口,它负责对用户提出问题的检索信息进行增强。下面我们通过一些案例介绍下RAG的高级语法。

2025-04-23 21:01:01 858

原创 LangChain4j(12)——Naive RAG

上篇文章,我们介绍了RAG的基本,并且使用的是LangChain4j中提到的Easy RAG,Easy RAG只是提供了对RAG认知的一个基本方式,对外隐藏了很多实现细节。本文讲解LangChain4j中提到的Naive RAG,之所以称为Naive RAG,只是为了和Advanced RAG做个区分,表示其没有使用到Advanced RAG的一些高级语法。

2025-04-21 12:00:00 1088

原创 LangChain4j(11)——Easy RAG

RAG (Retrieval-Augmented Generation),内容检索增强生成。通过RAG我们可以构建专有领域的知识库,在向大模型发送问题之前,可以先通过RAG检索相应的内容,然后将我们的问题和检索到的内容一起发给大模型,大模型根据我们给的内容进行回答,可以使回答的内容更准确。RAG 过程分为 2 个不同的阶段:索引和检索。索引阶段在索引阶段,对文档进行预处理。简单来说,会对文档进行分块,并对分块的数据进行嵌入存储(数据存入向量数据库中)。

2025-04-17 19:08:15 754

原创 LangChain4j(10)——函数工具调用

Tool("计算字符串的长度")@Tool("计算两个整数的和")@Tool("计算整数的平方根")@Tool用于对函数进行功能描述,这个很重要,描述的越清楚,大模型越容易考虑是否需要使用函数工具。

2025-04-16 19:15:32 871

原创 LangChain4j(9)——AI Services基本使用2

之前的例子中,我们只使用了String作为返回类型。❌✅上表来自。

2025-04-14 13:00:00 767

原创 LangChain4j(8)——AI Services基本使用1

之前的文章中,我们的案例使用的是LangChian4j中提供的Low Level API,这种级别的API使用灵活,但是各种对象之间关联起来相对比较麻烦。LangChain4j中还提供了High Level API,AI Services就属于High Level API。AI Services通过实现对自定义接口的代理对象,内部隐藏了诸多实现细节,可以使开发者更多的关注业务细节。AI Service提供了对格式化输入和输出转换的常规操作,而且还支持Chat Memory、工具调用、RAG等。

2025-04-12 10:44:57 1099

原创 LangChain4j(7)——输出格式化

很多大模型都支持对输出的内容进行格式化,通常情况下,一般将输出内容格式化为json数据,方便进行对象的转换。需要注意的是,某些类型不支持输出的格式化,比如我们之前案例中使用的GLM-4-Flash模型(GLM-4支持)。LangChain4j中集成了对某些LLM格式化输出的支持,根据官网说明,暂时只对Azure OpenAI、OpenAI、Google AI Gemini、Ollama提供支持。但是,不同的模型对JSON Schema的支持也不一样,比如OpenAI仅支持rootElement为。

2025-04-09 15:49:36 770

原创 LangChain4j(6)——流式响应处理

之前的案例,大模型将生成的内容一次性返回,用户需要等待较长的时间,甚至出现超时的现象。为了提高用户体验,大模型提供了流式响应数据的方式,通过流式响应,可以将生成的token逐一返回。注意:实现流式响应,需要使用针对流式响应的对象。本例使用智谱的大模型,使用的对象为ZhipuAiStreamingChatModel。onCompleteResponse:整个生成结束后,会调用该方法。通过该方法的参数,可以得到所有的响应数据。onPartialResponse:生成下一个响应内容时,会调用该方法。

2025-04-08 14:56:36 432 2

原创 LangChain4j(5)——聊天记忆的多用户支持和持久化存储

上篇文章中,我们使用Chat Memory实现了对聊天内容的储存,但是,其中的代码案例只支持存储一个用户的聊天数据。实际应用中,我们的系统肯定是多用户的,每个用户都需要维护各自的聊天数据。从源码中,我们可以看到,ChatMemoryProvider中仅包含一个get方法,我们可以使用用户id做为该方法的参数。

2025-04-08 14:10:25 775

原创 LangChain4j(4)——聊天记忆Chat Memory

比如,设置最多存储10条聊天信息,随着聊天的进行,如果聊天记录超过10条,则会淘汰Chat Memory中最老的记录。有一种比较简单的做法,我们在发送下次的问题时,可以将之前的问题和回答一并发送给大模型,这样,大模型就可以拥有Chat Memory。但是,如果为了回答新的问题,就将之前的提问和回答都发送给大模型,那么每次提问的token会越来越多,我们知道大模型是以token计费的,而更多的token,意味着更多的成本。关键代码是如下语句,其将第一次的提问和回答信息连同第二次的提问一起发送给了大模型。

2025-04-05 22:46:19 351

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除