RRF 排序融合,混合检索如何统一 BM25 和向量搜索
做混合检索时,会碰到一个很朴素的问题。 BM25 说某篇文档得了 18.6 分,向量检索说另一篇文档的相似度是 0.83。到底谁应该排在前面? 18.6 看起来比 0.83 大得多,但这两个数字根本不在同一把尺子上。直接相加没有意义,随手归一化又会受到查询、模型和数据分布影响。 RRF 提供了一个很省心的思路。 既然各路分数不好比较,那就不比较分数,只比较排名。 为什么混合检索需要结果融合 关键词检索和向量检索擅长的事情并不一样。 BM25 根据词项出现情况计算相关性,遇到错误码、产品型号和专有名词时很有优势。查询里明确出现 ERR_CONNECTION_RESET,包含同一字符串的文档通常应该优先返回。 向量检索比较的是语义表示。用户问「服务突然连不上了怎么办」,即使文档里没有完全相同的句子,只写了「连接被远端重置」,它也有机会把内容召回。 两路结果放在一起,覆盖面通常比单一路径更好。麻烦在于,它们返回的原始分数没有统一含义。 BM25...
MCP 和 Skill,到底是什么关系?
最近看 Agent 相关的项目,经常会同时碰到三个词,Function Calling、MCP 和 Skill。 它们看起来都和「让模型做事」有关,于是很容易混在一起。有人把 MCP 当成更高级的 Function Calling,也有人觉得有了 Skill 就不需要 MCP。 其实它们并不在同一层。 最简短的理解是,Function Calling 负责表达调用,MCP 负责接入能力,Skill 负责组织做事的方法。 一个让模型知道怎么开口,一个把工具接进来,一个告诉 Agent 事情应该怎么完成。 Function Calling 解决的是调用格式 大语言模型只能生成内容。哪怕它说自己要查询天气,也不会真的凭空发出网络请求。 应用需要先把可用函数的名称、用途和参数结构告诉模型。模型判断需要使用工具后,再返回一个结构化调用请求。宿主程序收到请求,执行真实函数,然后把结果放回对话。 一个简化后的工具定义可能长这样。 1234567891011{ "name": "get_weather", ...
怎么减少大模型幻觉?
大模型最麻烦的时刻,不是它说不知道。 而是它给出一个语气笃定、结构完整、甚至带着出处的答案,等你真的去查,才发现内容根本不存在。 这种现象通常被叫作幻觉。 模型不是在主观撒谎。它的核心任务是根据上下文预测接下来最可能出现的内容。当可靠信息不足时,它仍然可能生成语言上非常合理的答案。读起来顺,不等于事实正确。 所以减少幻觉,不能只靠一句「请不要胡编」。更有效的思路是让模型有依据可用,在依据不足时允许拒答,并让最终结论能够被检查。 普通使用时,先缩小回答空间 问题越开放,模型自由发挥的空间越大。 直接问「介绍一下这个项目」,模型可能自行补充作者、时间线和功能。把要求改成「只根据下面提供的...
无标题
12345678title: cookie、session、tokendate: 2026-01-26 15:53:00categories: - Javatags: - Java - 网络 - 通信 ...
MySQL的锁
MySQL锁 全局锁: flush tables with read lock,执行此条命令,整个数据库处于只读状态 unlock tables, 释放全局锁,会话断开时,也会自动释放全局锁 一般用来全库逻辑备份 表级锁:MySQL 里面表级别的锁有这几种: 表锁:通过lock tables 语句可以对表加表锁,表锁除了会限制别的线程的读写外,也会限制本线程接下来的读写操作。 元数据锁:当我们对数据库表进行操作时,会自动给这个表加上 MDL,对一张表进行 CRUD 操作时,加的是 MDL 读锁;对一张表做结构变更操作的时候,加的是 MDL 写锁;MDL 是为了保证当用户对表执行 CRUD 操作时,防止其他线程对这个表结构做了变更。 意向锁:当执行插入、更新、删除操作,需要先对表加上「意向独占锁」,然后对该记录加独占锁。意向锁的目的是为了快速判断表里是否有记录被加锁。 行级锁:InnoDB 引擎是支持行级锁的,而 MyISAM 引擎并不支持行级锁。 记录锁(Record Lock) 锁住某行记录,分为读写锁,事务提交后自动释放,例如select * from...
垃圾收集器(CMS-G1-ZGC)与垃圾回收算法
垃圾收集器(CMS-G1-ZGC) CMS 垃圾收集器 JDK1.5时引入,JDK9被标记弃用,JDK14被移除 CMS(Concurrent Mark Sweep,并发标记清除)收集器是以获取最短回收停顿时间为目标的收集器(追求低停顿),它在垃圾收集时使得用户线程和 GC 线程并发执行,因此在垃圾收集过程中用户也不会感到明显的卡顿。 初始标记:Stop The World,仅使用一条初始标记线程对所有与 GC Roots 直接关联的对象进行标记。 并发标记:使用多条标记线程,与用户线程并发执行。此过程进行可达性分析,标记出所有废弃对象。速度很慢。 重新标记:Stop The World,使用多条标记线程并发执行,将刚才并发标记过程中新出现的废弃对象标记出来。 并发清除:只使用一条 GC 线程,与用户线程并发执行,清除刚才标记的对象。这个过程非常耗时。 并发标记与并发清除过程耗时最长,且可以与用户线程一起工作,因此,总体上说,CMS 收集器的内存回收过程是与用户线程一起并发执行的。 CMS...
类加载机制与类加载器
类加载机制/类加载器 类加载的完整流程(生命周期) 类从加载到卸载经历 5 个阶段,其中加载、验证、准备、初始化、卸载的顺序是固定的,解析阶段可能与初始化交叉进行: 1. 加载(Loading) 任务:通过类的全限定名(如com.example.User)获取其字节码数据,并生成Class对象。 来源:字节码可来自本地文件、网络、数据库、动态生成(如 CGLib)等。 关键组件:类加载器(ClassLoader)负责此阶段。 2. 验证(Verification) 任务:确保字节码符合 JVM 规范,避免恶意或无效字节码危害虚拟机安全。 验证内容 文件格式验证(魔数、版本号等) 元数据验证(类继承关系、字段方法合法性) 字节码验证(指令逻辑正确性) 符号引用验证(常量池引用有效性) 3. 准备(Preparation) 任务 :为类的静态变量分配内存并设置 初始默认值 (非显式赋值)。 例如:public static int a = 10;在准备阶段a的值为0(int...
MySQL的MVCC
MVCC多版本并发控制 MVCC 的目标:让读操作尽量不阻塞写操作,写操作也尽量不阻塞读操作。 核心机制: MVCC主要依赖以下机制实现: 数据库行记录中的隐藏字段:最近修改本行数据的事务id、回滚指针指向本行数据的上个版本(其实是指向undo,通过undo计算上一个版本) •undo log:回滚日志,在insert、delete、update时产生,记载了与操作相反的操作,比如delete操作对应了一条insert日志 •readview:快照读SQL执行时产生的读视图,生成的一个快照,记录了以下字段,用于数据的可见性判断:◦ 当前活跃的事务id集合◦ 最小活跃事务id◦ 预分配事务id,即应该分配的下一个事务id◦ readview创建者id,即本事务id ...
SpringMVC执行流程
SpringMVC执行流程 请求先到 DispatcherServlet(前端控制器),它负责调度 HandlerMapping → HandlerAdapter → Controller → ViewResolver → View。 Spring MVC 采用前端控制器模式,所有请求先进入 DispatcherServlet。DispatcherServlet 通过 HandlerMapping 找到对应的 Controller,再通过 HandlerAdapter 调用方法执行。Controller 返回结果后,如果是视图名则交给 ViewResolver 解析并渲染视图;如果是 @ResponseBody,则通过 HttpMessageConverter 转换为 JSON 返回给客户端。 SpringMVC是什么? Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的 Web 框架,通过 DispatcherServlet 作为前端控制器,结合 HandlerMapping、HandlerAdapter...
MySqL事务特性,隔离级别
MySqL事务隔离级别 事务的特性: 原子性:事务要么全部提交成功要么全部失败 一致性:事务操作前和操作后具有完整性约束,数据库保持一致性状态 隔离性:事务执行时相互隔离互不影响,可以防止多个事务并发执行由于交叉执行导致的不一致 持久性:事务操作结束后修改是永久性的,即使关机故障也不会消失 MySQL InnoDB 引擎通过什么技术来保证事务的这四个特性的呢? 持久性是通过 redo log (重做日志)来保证的; 原子性是通过 undo log(回滚日志) 来保证的; 隔离性是通过 MVCC(多版本并发控制) 或锁机制来保证的; 一致性则是通过持久性+原子性+隔离性来保证; 事务的隔离级别有哪些? 读未提交 最低的隔离级别, 会导致脏读、幻读或不可重复读。 读已提交 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。这是大多数数据库(如 Oracle, SQL Server)的默认隔离级别。 ...




