Langchain4j 系列之二十四 - Scoring (Reranking) Models

上一个系列讲了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

相关推荐
信息快讯1 小时前
AI+有限元:复合材料研发的“时间魔法”,从10年到3周的范式革命
人工智能·机器学习·材料工程·复合材料
人工智能AI技术2 小时前
GitHub Copilot 2026新功能实操:C++跨文件上下文感知开发,效率翻倍技巧
c++·人工智能
国冶机电安装2 小时前
一道看不见的防线:生物安全洁净工程如何守住风险底线
人工智能
轻竹办公PPT2 小时前
2026 年 AI 办公趋势:AI 生成 PPT 工具谁在领先
人工智能·python
Coder_Boy_2 小时前
基于SpringAI的在线考试系统-核心业务流程图(续)
java·大数据·人工智能·spring boot·流程图
人工智能培训2 小时前
如何大幅降低大模型的训练和推理成本?
人工智能·深度学习·大模型·知识图谱·强化学习·智能体搭建·大模型工程师
人工智能AI技术2 小时前
类脑智能核心算法拆解:从统计智能到类脑智能的模型改造实战
人工智能
之之为知知2 小时前
NLP进化史:一场「打补丁」的技术接力赛
人工智能·深度学习·机器学习·自然语言处理·大模型
Francek Chen2 小时前
【自然语言处理】初探自然语言处理
人工智能·自然语言处理·nlp·easyui