- 博客(44)
- 资源 (1)
- 收藏
- 关注
原创 如何设计一个可扩展的 AI Agent 架构
一个可扩展的 AI Agent 架构,应该具备模块清晰、插件机制灵活、支持上下文管理与多模型适配等能力。通过任务规划器、工具层与执行器的合理配合,AI Agent 能够自主完成复杂任务,真正成为你的智能助手。随着技术不断进步,未来的 AI Agent 架构也将朝着“多 Agent 协作”“长期记忆”“自我学习”“知识图谱融合”等方向持续演进。
2025-08-01 10:49:30
854
原创 限流算法详解:固定窗口、滑动窗口、令牌桶与漏桶算法全面对比
特性固定窗口滑动窗口令牌桶漏桶实现复杂度⭐(简单)⭐⭐(中等)⭐⭐⭐(中高)⭐⭐(中等)限流精度低高中等高是否支持突发请求否否✅❌是否平滑❌✅✅✅是否常用✅(Redis)✅(调度系统)限流并不是一刀切的“阻止请求”,而是为系统争取喘息空间。不同的限流算法背后体现的是不同的设计哲学与业务权衡。选对限流算法,既可以保护系统,又能优化用户体验。
2025-07-30 20:52:39
875
原创 检索排序(Re-ranking):搜索与推荐系统的精细化利器
Re-ranking 是搜索推荐系统中不可或缺的精细化步骤,它将粗糙的召回结果转变为精准且个性化的排序列表。随着深度学习和大语言模型的发展,Re-ranking 技术不断革新,从传统特征学习到生成式排序,为系统智能化赋能。我们在长租公寓 AI Leasing 项目中,结合规则匹配、向量检索和生成式重排序,成功构建了高效、精准且可解释的推荐体系,极大提升了用户满意度和业务效果。未来,Re-ranking 将继续是智能搜索推荐领域的核心技术方向。
2025-07-30 14:19:33
442
原创 查询改写(Query Rewriting):从搜索到生成式AI的桥梁
查询改写(Query Rewriting)是指对用户原始输入的查询进行重写、扩展或规范化,使其更容易被系统理解和处理,同时保留其原始语义。改写后的查询可以用来提升:🔍 搜索系统的召回率和准确率🧠 问答系统对意图的理解💡 推荐系统的兴趣泛化能力查询改写,是从传统搜索走向大模型智能搜索的重要一步。它不仅改善了用户体验,更成为构建高质量检索系统的关键策略之一。如果说 RAG 是“让语言模型读文档”,那么查询改写就是“让语言模型更懂你想问什么”。
2025-07-30 13:44:28
650
原创 AI Agent常见策略范式
AI Agent 在执行任务时,常见的是指其在感知、规划、行动等阶段采用的思维与执行模式。这些范式影响了 Agent 的决策效率、鲁棒性、可扩展性等。
2025-07-16 13:46:32
540
原创 Prompting Engineer 十大核心设计原则
使用“请思考”、“逐步推理”、“假设你是...”等提示语言,提高响应稳定性和可解释性。如果结果涉及事实,明确指出“仅在基于下列信息回答”。设计提示前,必须清楚要达成的具体目标(如:生成、总结、翻译、分类等)。✅ “请用200字介绍GPT-4的特点,面向中学生,用通俗语言表达”“你是一个资深法律顾问,请分析以下合同条款中可能存在的法律风险。“仅基于以下材料回答问题,若无法确认答案,请回复‘未知’。通过设定“你是XX专家/角色”引导模型从特定角度思考。:任务明确、无示例,引导模型推理完成任务。
2025-07-16 12:16:00
400
原创 一文看懂LangChain、LangGraph、LangSmith及其之间关系
LangChain 是一个开源框架,提供了一套高层 API 和模块,帮助开发者快速构建复杂的 LLM 应用(如问答系统、RAG、Agent 等)。它专注于组件组合、链式调用与外部工具整合。LangGraph 是 LangChain 团队推出的一个框架,用于实现多节点、条件跳转、并发执行的工作流系统,基于有向图思想构建。LangSmith 是 LangChain 团队提供的商业服务平台,用于可视化调试、追踪执行、性能评估、数据标注与反馈闭环。
2025-07-16 11:11:01
699
1
原创 Redis Set中 SRANDMEMBER 详解
详解Redis的Set类型中REANDMEMBER方法的使用。包括count为负数的情况;且提供实际案例参考
2022-12-18 02:58:07
1027
原创 Java的Fork-Join框架
最近在看Java stream中的parallel()方法,此方法能够将一个串行的任务流转化为并行处理以加快其处理效率。这一点非常有趣,在看过源码后发现是其使用了Java 1.7提供的Fork-Join框架在发挥作用。今天我们来说明一下Fork-Join框架的作用。Fork-Join是干啥的众所周知,有一组任务需要处理,如果没有明确的顺序先后的要求,并行处理会比串行处理快很多,更好的利用了CPU的性能。而Java中的Fork-Join框架类似于大数据处理方案中的map-reduce的分治思想:它
2021-11-10 23:54:59
5828
原创 MySQL ‘IN‘ ‘IS NULL‘ ‘IS NOT NULL‘ 到底走不走索引
看了很多篇文章,关于走不走索引这个问题真是众说纷纭,不如自己实践一波来得准。先说我的mysql版本为5.7;再说结论:有时候走,有时候不走。这个基于MySQL自身的查询优化。直接上例子!准备工作:首先创建一个students表,内含自增主键id,在name和school_id两列上建立多列索引,最后还有一个普通列age;CREATE TABLE `students` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `nam
2021-08-05 18:33:46
8488
原创 兄弟间的较量 -- ArrayList与LinkedList
日常开发的过程中我们会经常使用到List结构,很多兄弟就直接开始写些这样的语句:List<Xxx> x = new ArrayList<>();。但 List 的实现方式有很多种,在不用保证线程安全的情况下还有一种通用实现方式LinkedList。我们今天通过源码从多个维度来理解它们的原理、比较它们的异同。我信奉一个观点:不拿源码说话就没有底气,如果本文与其他文章的结论相左,请以我为准。当然,我也欢迎大家提出宝贵建议和意见。本文用到的源码我会加入中文注释以便理解。ArrayLi
2020-06-15 13:23:38
243
原创 Java 8 新日期时间 API ( 下 ) - 格式化
Java 8 对曾经的格式化方案 java.text.SimpleDateFormat 也不太满意,重新创建了一个 java.time.format 包,该包下包含了几个类和枚举用于格式化日期时间。java.time.format 包java.time.format 包提供了以下几个类用于格式化日期时间类说明DateTimeFormatter用于打印和解析日期时间对象的格式化程序DateTimeFormatterBuilder创建日期时间格式化样式的构建器Decim
2020-05-12 23:08:06
446
原创 Java 8 新日期时间 API ( 中 ) - 时区日期时间
上一章节 Java 8 新日期时间 API ( 上 ) - 本地日期时间 我们对 Java 8 重新设计的日期时间 API 做了一些基础的介绍,同时详细介绍了和本地时间有关的几个类 LocalDateTime 、LocalDate 和 LocalTime 。这三个类有选择的隐藏了时区的处理。它们内部会使用操作系统当前的时区。因此在我们使用中会将其当作不包含时区处理。与此同时,Java 在 java.time 包中也提供了几个类用于处理需要关注时区的日期时间 API: java.time.ZonedDat
2020-05-10 23:23:06
360
原创 Java 8 新日期时间 API ( 上 ) - 本地日期时间
作为开发者,经常需要处理日期时间。如果你跟随者 Java 5 一路走来,那么一定会对 java.util.Date 、java.util.Calendar 、java.util.GregoiranCalendar 和 java.text.SimpleDateFormat 四大类非常熟悉,它们分别用于处理日期、日历、日历表示、日期时间格式化。这四个类,对于编程老人来讲,应该是习惯了,但对于编程新人来讲,就有好多疑问,有好多陷阱和坑等着它们跳,比如非线程安全:java.util.Date 并不是线程安全的
2020-05-10 19:03:07
213
原创 什么是Email Bounced(被退回)
被Bounced的电子邮件是指收件人的邮件服务器拒绝并返回给原始发件人的邮件。邮件被退回表示您的邮件尚未送达,发生这种情况时,邮件应用会收到未送达的通知。退回电子邮件有两种不同类型:硬退件和软退件。软退件(Soft Bounce)电子邮件可能导致软退件的原因有很多。这些退回的电子邮件通常是由于临时传输问题引起的,例如:收件人的邮箱已满。 电子邮件太大。 您要发送到的电子邮件帐户已被...
2020-03-14 17:07:43
9558
原创 Redis各数据类型最大储存量
Strings:最大512MBLists: 2^32-1个数据 (4294967295)Sets: 2^32-1个数据 (4294967295)Hashes:2^32-1个键值对 (4294967295)Sorted sets:与Sets类型类似,没有明确说明。应该也是2^32-1个数据Reference: https://redis.io/topics/data-types...
2020-03-11 23:58:40
1501
原创 Java密码验证之passay库
写这篇文章主要基于2点:我在百度上没有搜索到关于passay库的文章,因此我希望能通过此文章来弥补这一块的空缺。“不要重复造轮子”是十分重要的。现在开始领略passay的魅力吧!在passay对应的maven仓库中,一句话形容了passay的作用:Library for checking that a password complies with a custom set of rul...
2020-01-29 22:07:56
61262
原创 Web服务Docker化的优势
docker能够简化配置一致的示例的发布流程,很好的应对了负载波动较大的情况;同时它比虚拟机更加轻量级,成本更为低廉。诸多优势下,它终于成为了新时代的宠儿。
2020-01-04 17:57:46
60286
原创 Java基础——方法参数传值问题
这篇文章我会使用简单的类比并且辅以代码示例的方式来阐述方法参数的传值问题。你只需要知道8种基本数据类型以及引用类型在JVM中的存储结构即可。如果你忘记了,没关系,我们先复习一下:8种基本数据类型分别为byte,short,int,long,float,double,char,boolean。它们在JVM中会直接以数值的形式直接存储于栈(Stack)中,而其他类型为引用类型,类型的实体存储于堆(...
2020-01-04 17:43:59
58993
原创 Centos7安装mongoDB
1. 配置MongoDB的yum源vim /etc/yum.repos.d/mongodb-org-3.4.repo进入编辑模式后添加以下内容:[mongodb-org-3.4] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64...
2019-12-29 01:20:19
59678
原创 Springboot 2.x + JPA 配置多数据源实战
在进行web开发的时候,有时候会出现需要调用另一个数据库的需求。这篇文章将教会你如何达到此目的,并提供了一键即用的完整代码给各位尝试。
2019-12-28 16:15:34
65625
原创 maven之packaging标签
在使用Java web开发的后端工程师们大部分都会使用Maven作为项目构建以及编译的工具,微服务和大中台当道的今天,我们会更加关注maven的细节,今天我们来讲一讲`<packaging>`标签的作用。
2019-12-25 23:06:01
88898
1
原创 Spring之attribute与parameter对比
前阵子在学习拦截器的时候,有一个非常有趣的应用:计算API从调用到返回的耗时。这个时候我们通常在preHandle()方法的HttpServletRequest参数对象上调用setAttribute()方法,将其实时间存入,在afterCompletion()方法中再使用getAttribute()方法读出。这个时候我在想:attribute与parameter都能通过get方法从HttpServ...
2019-12-23 23:09:58
60064
原创 Spring拦截器(Interceptor)的运用
拦截器是一种面向切面编程的设计实现,它能够方便的在API调用前后进行记录、修改request/response等操作,大大的简化了代码,提升代码复用性的同时降低了其耦合度,这是Spring给出的一种非常棒的设计模式!
2019-12-23 00:40:51
60422
原创 Springboot 2.x中server.servlet.context-path的运用
今天在开发项目的时候遇到了请求不通API的问题,最开始以为是server.servlet.context-path配置导致的问题,最终发现是由于AWS端口未开放/监听导致的connection refuse。虽然如此,仍然想记录一下server.servlet.context-path的作用。功能这个配置能够设置项目中的所有API的上下文路径(URL的一部分),与@RequestMapping...
2019-12-16 17:53:17
72976
3
原创 Java浅克隆与深克隆
通常我们想复制一个对象,可以自己new出一个对象,并对相应的属性存入数据以实现克隆的目的。可是当属性较多时,这样的方式会十分麻烦。然而Java早已考虑好一切,我们知道,所有的对象都有一个共同的父类Object,而Object类中已经定义好了protected修饰的clone()方法,今天我们从这个方法开始,讲述Java的浅克隆与深克隆。浅克隆与深克隆的区别**浅克隆:**复制对象时仅仅复制对象...
2019-11-11 00:41:22
64524
原创 Java设计模式之原型模式
在有些系统中,存在大量相同或相似对象的创建的工作,如果用传统的构造函数来创建对象,会比较复杂且耗时耗资源,用原型模式生成对象就很高效。原型模式属于对象的创建模式通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。
2019-11-10 19:01:21
59701
原创 JVM内存结构
Java虚拟机运行时数据区域被分为五个区域:堆(Heap)、栈(Stack)、方法区(Method Area)、本地方法栈(Native Stack)、程序计数器(Program Count Register)。本次将根据这5个子模块详细介绍JVM的内存结构。
2019-11-09 17:24:58
59631
原创 Java设计模式之单例模式
单例模式是常用的23种设计模式中最简单也是最常用的模式。“隐藏构造方法并提供获得类的实例的方法来达到整个系统中只有此类的唯一的实现对象”是单例的核心。饿汉式一开始就创建了资源,而懒汉式虽然一开始节约了资源,但因为锁的原因导致每次访问的时候效率降低;两种方式各有利弊。
2019-11-06 22:55:03
59675
原创 Java基础之抽象类与接口
在工作中我们并不会经常用到抽象类,或者即使使用到了也只是在遵从整个项目的架构而在生成接口。例如我们经常看到许多公司的项目中大量service实际上没有多种实现,却将Service分为了service抽象类和implement实现类两个文件。这是一件需要权衡利弊的问题,而不是应该遵从大流。先一起来看一下这些抽象的方法与类的使用吧抽象类作用:如果父类的方法本身不需要实现任何功能,仅仅是为了定义方...
2019-11-04 14:11:42
64614
原创 浅谈@Bean与@Compoment的异同之处
在Spring的历史中,我们曾经使用XML文件进行各种文件的装载与注入,但是由于XML需要额外的文件去维护,导致了代码的可读性较低、程序员编写代码较慢的问题。注解的诞生解决了很多问题。@Compoment介绍此注解作用于一个类上,表明了此类将作为一个组件类,Spring需要为此类创建一个bean。目前@Controller @Service @Repository都内含@Compoment...
2019-10-30 22:20:35
68363
2
原创 使用ResponseEntity处理API返回
最近在做Google AMP mail的时候遇到了一个问题,在调用/unsub(退订)接口的时候需要向google client返回特定的ResponseHeader。但是项目使用的是Springboot 2.x,通常使用@RestController修饰API层,无法做到动态的返回特殊的Header。那么如何对一些特殊的API做一些特别的返回值封装呢?Spring framework中的Resp...
2019-10-30 00:34:29
75376
1
转载 七个开源的 Spring Boot 前后端分离项目
前后端分离已经在慢慢走进各公司的技术栈,根据松哥了解到的消息,不少公司都已经切换到这个技术栈上面了。即使贵司目前没有切换到这个技术栈上面,松哥也非常建议大家学习一下前后端分离开发,以免在公司干了两三年,SSH 框架用的滚瓜烂熟,出来却发现自己依然没有任何优势!其实前后端分离本身并不难,后段提供接口,前端做数据展示,关键是这种思想。很多人做惯了前后端不分的开发,在做前后端分离的时候,很容易带进来一...
2019-10-15 18:12:01
1188
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人