当前位置: 首页 > backend >正文

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

Rerank模型介绍

也称为重排序模型,它从搜索中获取初始结果集,并重新评估它们,以确保它们更紧密地符合用户的意图。 它超越了术语的表面匹配,考虑了搜索查询和文档内容之间更深层次的交互。

比如为了提高RAG的召回率和准确率,我们可以先使用RAG进行检索,针对检索后的数据,再通过Rerank模型进行重排,然后将重排后的数据交给大模型,使大模型返回更准确的信息。

LangChain4j支持的Rerank模型如下:

 其中通过onnx调用需要将模型转为onnx后调用,占用内存较多。Cohere、Jina等模型需要收费。本例采用Xinference方式调用。

通过Xinference安装模型

Xorbits Inference (Xinference) 是一个开源平台,用于简化各种 AI 模型的运行和集成。借助 Xinference,您可以使用任何开源 LLM、嵌入模型和多模态模型在云端或本地环境中运行推理,并创建强大的 AI 应用。

支持的模型的类型如下:

安装Xinference

本例使用docker进行安装,可以参考如下文档:Docker 镜像 — Xinference

安装命令如下:

docker run -e XINFERENCE_MODEL_SRC=modelscope -p 9997:9997 xprobe/xinference:latest-cpu xinference-local -H 0.0.0.0 --log-level debug

 运行Xinference

http://127.0.0.1:9997

安装Rerank模型

Launch Model选项表示Xinference支持的内置模型。

本例选择bge-reranker-base模型安装。

点击“小火箭”图标进行安装。

安装完成后,在Running Models中可以看到正在运行的model。

LangChain4j调用Rerank模型

导入jar

        <dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-community-xinference</artifactId><version>1.0.0-beta3</version></dependency>

 测试代码

package com.renr.langchain4jnew.app5;import dev.langchain4j.community.model.xinference.XinferenceScoringModel;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.model.output.Response;
import dev.langchain4j.model.scoring.ScoringModel;import java.time.Duration;
import java.util.List;/*** @Classname RerankTest* @Description TODO* @Date 2025-06-09 22:22* @Created by 老任与码*/
public class RerankTest {public static void main(String[] args) {ScoringModel model = XinferenceScoringModel.builder().baseUrl("http://127.0.0.1:9997").modelName("bge-reranker-base").timeout(Duration.ofSeconds(60)).maxRetries(1)
//                .logRequests(true)
//                .logResponses(true).build();String text ="北京市(Beijing),简称“京”,古称燕京、北平,是中华人民共和国首都、直辖市、国家中心城市、超大城市, [185]国务院批复确定的中国政治中心、文化中心、国际交往中心、科技创新中心, [1]中国历史文化名城和古都之一,世界一线城市。 [3] [142] [188]截至2023年10月,北京市下辖16个区,总面积16410.54平方千米。 [82] [193] [195]2023年末,北京市常住人口2185.8万人。 [214-215]";String query = "中国首都是哪座城市";// 根据查询的内容,对一个初始数据进行打分Response<Double> response = model.score(text, query);System.out.println(response.content());TextSegment segment1 = TextSegment.from("上海市(Shanghai),简称“沪”,别名“申”,是中华人民共和国直辖市, [38]位于中国东部,地处长江入海口, [175]境域北界长江,东濒东海,南临杭州湾,西接江苏省和浙江省,总面积6340.5平方千米, [38]下辖16个区。 [37]截至2022年末,全市常住人口2475.89万人, [204]上海话属吴语方言太湖片。 [159]市政府驻地上海市黄浦区人民大道200号。 [173]");TextSegment segment2 = TextSegment.from("北京市(Beijing),简称“京”,古称燕京、北平,是中华人民共和国首都、直辖市、国家中心城市、超大城市, [185]国务院批复确定的中国政治中心、文化中心、国际交往中心、科技创新中心, [1]中国历史文化名城和古都之一,世界一线城市。 [3] [142] [188]截至2023年10月,北京市下辖16个区,总面积16410.54平方千米。 [82] [193] [195]2023年末,北京市常住人口2185.8万人。 [214-215]");List<TextSegment> segments = List.of(segment1, segment2);String query2 = "中国首都是哪座城市";// 对多个数据进行打分Response<List<Double>> response2 = model.scoreAll(segments, query);List<Double> scores = response2.content();System.out.println(scores);}
}

执行结果

返回指定个数的score

设置topN参数,根据分数降序,返回指定个数的分数。

package com.renr.langchain4jnew.app5;import dev.langchain4j.community.model.xinference.XinferenceScoringModel;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.model.output.Response;
import dev.langchain4j.model.scoring.ScoringModel;import java.time.Duration;
import java.util.List;/*** @Classname RerankTest* @Description TODO* @Date 2025-06-09 22:22* @Created by 老任与码*/
public class RerankTest {public static void main(String[] args) {ScoringModel model = XinferenceScoringModel.builder().baseUrl("http://127.0.0.1:9997")// .apiKey(apiKey()).modelName("bge-reranker-base").timeout(Duration.ofSeconds(60)).maxRetries(1).topN(1) // 根据分数降序,返回指定个数的分数
//                .logRequests(true)
//                .logResponses(true).build();TextSegment segment1 = TextSegment.from("上海市(Shanghai),简称“沪”,别名“申”,是中华人民共和国直辖市, [38]位于中国东部,地处长江入海口, [175]境域北界长江,东濒东海,南临杭州湾,西接江苏省和浙江省,总面积6340.5平方千米, [38]下辖16个区。 [37]截至2022年末,全市常住人口2475.89万人, [204]上海话属吴语方言太湖片。 [159]市政府驻地上海市黄浦区人民大道200号。 [173]");TextSegment segment2 = TextSegment.from("北京市(Beijing),简称“京”,古称燕京、北平,是中华人民共和国首都、直辖市、国家中心城市、超大城市, [185]国务院批复确定的中国政治中心、文化中心、国际交往中心、科技创新中心, [1]中国历史文化名城和古都之一,世界一线城市。 [3] [142] [188]截至2023年10月,北京市下辖16个区,总面积16410.54平方千米。 [82] [193] [195]2023年末,北京市常住人口2185.8万人。 [214-215]");List<TextSegment> segments = List.of(segment1, segment2);String query2 = "中国首都是哪座城市";// 对多个数据进行打分Response<List<Double>> response2 = model.scoreAll(segments, query);List<Double> scores = response2.content();System.out.println(scores);}
}

http://www.xdnf.cn/news/13242.html

相关文章:

  • 打卡Day49
  • Windows11+VS2019配置Libigl-2.4.1
  • EasyImage实战:结合内网穿透技术实现私有图床部署过程
  • DBLP数据库是什么?
  • 如何用 esProc SPL 操作大 csv
  • Linux【5】-----编译和烧写Linux系统镜像(RK3568)
  • MIPI信号为什么不能进行长距离传输
  • 相关类可视化图像总结
  • 第二十三课:手搓随机森林
  • 基于PSO与BP神经网络分类模型的特征选择实战(Python实现)
  • C语言中提供的第三方库之哈希表实现
  • 比较数据迁移后MySQL数据库和达梦数据库中的表
  • 深入实战多平台抓包:Sniffmaster与常见抓包工具协同利器解析
  • 前端绘制道路鱼骨图
  • 502的普通频谱参数设置
  • 红外测温传感器如何提升智能制造水平?
  • 学习时困了怎么办
  • 2020年IS SCI2区,多样本和遗忘能力粒子群算法XPSO,深度解析+性能实测
  • Python打卡day49!!!
  • 【精彩回顾.上海交通大学专场】---大模型推理需求下的计算生态链变革
  • “概率鹦鹉”难解语义等价验证的NPC难题: 从技术本质看LLM在SQL优化任务中的致命缺陷
  • 高并发内存池的轻量级模拟-细节处理与优化部分
  • 多协议诱骗电压芯片优势,如何防止负载太大而导致充电器复位重启
  • DisplayPort 2.0协议介绍(2)
  • JavaScript 标签加载
  • AI知识库调用全攻略:四种实战方法与技术实现
  • c++第七天 继承与派生2
  • 安全编程期末复习12(红色重点向下兼容)
  • 河南建筑安全员C证考试常见题及答案解析
  • 2.7 判断.lib和.a是静态库 还是动态库的导入库