上一个系列讲了Spring AI得到反馈效果不错,有人私信我说这个和Langchain4j有什么区别。如果站在使用方面,都是基于Java的大模型应用研发的工具,本质上没太大区别。但是从细节层面来说还是有很多不同之处,所以索性借此机会,给大家分享一下Langchain4j框架。在本系列中会按照Spring AI系列的顺序来写Langchain4j,这样的好处是可以对比两者不同的细节。
注意 :由于框架不同版本改造会有些使用的不同,因此本次系列中使用基本框架是langchain4j-1.9.1,JDK版本使用的是19。另外本系列尽量使用Java原生态,尽量不依赖于Spring和Spring Boot。虽然langchain4j也支持Spring Boot集成,但是如果是使用Spring Boot框架,那为何不索性使用Spring AI。
本系列的所有代码地址: https://github.com/forever1986/langchain4j-study
目录
- [1 Scoring (Reranking) Models](#1 Scoring (Reranking) Models)
- [2 代码示例](#2 代码示例)
上一章讲了Image Models,这一章来讲一下Scoring (Reranking) Models,评分(重排序)大模型。
1 Scoring (Reranking) Models
评分/重排序模型(Scoring (Reranking) Models)是信息检索和自然语言处理中的关键技术,通过对检索结果与问题的相关性进行相关性的评分,通过评分的结果对检索结果进行重排序。这些模型通过深入分析查询(query)与文档之间的语义交互,生成更精确的相关性分数,从而提升下游任务(如问答系统或检索增强生成)的性能。简单来说,就是基于模型来评估query与查询到的文档之间的相关性,数值可以是正数或者负数,正数代表正相关,负数则代表反相关。
在Langchain4j 中,提供了 ScoringModel 接口用于定义评分(重排序)模型(Scoring (Reranking) Models),源代码如下:
java
public interface ScoringModel {
/**
* 根据给定的query对给定的text进行评分
*/
default Response<Double> score(String text, String query) {
return score(TextSegment.from(text), query);
}
/**
* 根据给定的query对给定的TextSegment进行评分
*/
default Response<Double> score(TextSegment segment, String query) {
Response<List<Double>> response = scoreAll(singletonList(segment), query);
ensureEq(response.content().size(), 1,
"Expected a single score, but received %d", response.content().size());
return Response.from(response.content().get(0), response.tokenUsage(), response.finishReason());
}
/**
* 根据给定的query对给定的List<TextSegment>进行评分
*/
Response<List<Double>> scoreAll(List<TextSegment> segments, String query);
}
从上面可以看到就是提供一个对外接口,具体实现类需要实现scoreALL方法。目前Langchain4j默认支持接入以下模型或者平台:
- In-process (ONNX):本地的Scoring (Reranking) Models,加载本地模型。
- Cohere:Cohere的一个相关性评分模型
- Jina:Jina的一个相关性评分模型
- Google Cloud Vertex AI Ranking API:谷歌的一个相关性评分模型
- Voyage AI:MongoDB旗下的一个嵌入模型,可以用于相关性评分
- Xinference:是一个开源平台,用于简化各种 AI 模型的运行和集成,可以将评分大模型放入该平台运行。
2 代码示例
代码参考lesson10子模块
本示例使用Jina的jina-reranker-v3模型对查询结果进行重排序
1)由于本次示例中需要使用 jina-reranker 模型进行结果重排,因此在 jina官方网站 注册获得API KEY(如果已经申请过了,可以省略这一步)
2)在lesson10子模块下,其pom引入:
xml
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-jina</artifactId>
</dependency>
2)在lesson10子模块下,新建ScoringRerankingModelsTest 类
java
package com.langchain.lesson10;
import dev.langchain4j.data.document.Metadata;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.model.jina.JinaScoringModel;
import dev.langchain4j.model.output.Response;
import java.util.List;
public class ScoringRerankingModelsTest {
public static void main(String[] args) {
// 1. 获取API KEY
String apiKey = System.getenv("JINA_API_KEY");
// 2. 模拟查询得到的数据
String str1 = """
ChatGLM3 是北京智谱华章科技有限公司和清华大学 KEG 实验室联合发布的对话预训练模型。
""";
String str2 = """
ChatGLM3-6B 的基础模型 ChatGLM3-6B-Base 采用了更多样的训练数据、更充分的训练步数和更合理的训练策略。在语义、数学、推理、代码、知识等不同角度的数据集上测评显示,* ChatGLM3-6B-Base 具有在 10B 以下的基础模型中最强的性能*。
""";
String str3 = """
ChatGLM3-6B 采用了全新设计的 Prompt 格式 ,除正常的多轮对话外。同时原生支持工具调用(Function Call)、代码执行(Code Interpreter)和 Agent 任务等复杂场景。
""";
String str4 = """
除了对话模型 ChatGLM3-6B 外,还开源了基础模型 ChatGLM3-6B-Base 、长文本对话模型 ChatGLM3-6B-32K 和进一步强化了对于长文本理解能力的 ChatGLM3-6B-128K。以上所有权重对学术研究完全开放 ,在填写 问卷 进行登记后亦允许免费商业使用
""";
// 3. 构建模型
JinaScoringModel jinaScoringModel = JinaScoringModel.builder()
.apiKey(apiKey)
.modelName("jina-reranker-v3")
.build();
// 4. 访问并输出结果
Response<List<Double>> response = jinaScoringModel.scoreAll(List.of(new TextSegment(str1, new Metadata())
, new TextSegment(str2, new Metadata())
, new TextSegment(str3, new Metadata())
, new TextSegment(str4, new Metadata()))
,"ChatGLM3是哪个家公司开发的模型?");
System.out.println(response);
}
}
3)运行ScoringRerankingModelsTest 测试,结果如下:

说明 :从结果上看,第一个文档的正相关性为0.66,说明这个文档与query有用度较高。其它3个文档几乎接近0,也就是既没有正相关,也不负相关。通过评分的结果,就可以对文档进行重排名。特别是对于token有限的情况下,重排序只取更有相关性的文档,这样既可以让大模型读取到有用的信息,也可以减少token数量。在前面《Langchain4j 系列之十九 - RAG之Retrieval》章节中关于重排序的 ContentAggregator ,当时没有细讲这个类的实现方式,现在来看看它的实现方式。 ContentAggregator 的aggregate()方法如下,可以看到在第114行代码中调用了reRankAndeFilter()方法,如下图:
再来看看reRankAndeFilter()方法,可以看到,其调用的就是 ScoringModel 的scoreALL()方法获得评分,然后再进行重排序的。因此这里就可以看出RAG的重排序就是使用 ScoringModel :
结语:本章通过演示 Scoring (Reranking) Models,展现Langchain4j 的评分(重排序)模型。这种模型在实际应用中非常广泛,除了现在在RAG中用于确认检索结果的相关性之外,比如检索系统的排序、构建图数据库等,都可以使用这种模型来相关性判断。
Langchain4j 系列上一章:《Langchain4j 系列之二十三 - Image Models》
Langchain4j 系列下一章:《Langchain4j 系列之二十五 - Moderation Models & Audio Models》

