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

相关推荐
AngelPP20 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年20 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼20 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS20 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区21 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈21 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang1 天前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx
shengjk11 天前
NanoClaw 深度剖析:一个"AI 原生"架构的个人助手是如何运转的?
人工智能
西门老铁1 天前
🦞OpenClaw 让 MacMini 脱销了,而我拿出了6年陈的安卓机
人工智能