Langchain4j 系列之二十一 - Language 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 指令微调(Instruction Fine-Tuning)](#1 指令微调(Instruction Fine-Tuning))
  • [2 Langchain4j的LanguageModel](#2 Langchain4j的LanguageModel)
  • [3 示例演示](#3 示例演示)

在前面的案例中基本上都是使用ChatModel进行文本生成,除了ChatModel之外,其实还有其它的一些模型在Langchain4j已经提供了集成,以下几种不同的大模型如下图:

说明

  • chat:聊天模型,这个前面经常使用到
  • language:大语言模型,这个是聊天模型的基础模型,专注于通用文本生成任务,如文本补全、摘要、翻译或问答。而聊天模型一般都是基于大语言模型进行强化训练的结果
  • embedding:嵌入模型,将文字、图片、音频、视频等数据进行向量化处理
  • image:图像模型,专门进行图像生成或者图像识别的大模型
  • audio:语音模型,专门进行语音处理的大模型,比如语音转文字,文字转语音等
  • scoring:评分模型,比如用于重排序的模型就是评分模型中的一种
  • moderation:内容审核模型,旨在基于文本、图像、音频、视频的检测技术,可自动检测涉黄、涉暴、图文违规等内容

接下来几章,除了ChatModel之外,会详细介绍Langchain4j 如何使用这些不同模型。现在先从LanguageModel开始。

1 指令微调(Instruction Fine-Tuning)

那先了解一下之前使用到的ChatModel与LanguageModel之间的区别?

  • LanguageModel:专注于通用语言理解与生成,通过大规模文本数据训练,能够处理多种任务如文本摘要、翻译或代码生成。‌
  • Chatmodel:专门为多轮对话优化,基于对话数据训练,强调对话连贯性、意图理解和上下文维护。

可能这么说还是比较难以理解。因此在了解LanguageModel和Chatmodel区别之前,要先知道一个概念:指令微调

现在大部分大语言模型都是基于transformer结构,基于这个结构进行大量文本数据的预训练,预训练过程其实就是让大模型学会更好地预测给定序列中的下一个单词,直到序列完成。也就是说最终会训练出来的模型就是一个文本生成模型,专门预测下一个token。这种模型叫做基座模型,也就是上面提到的 LanguageModel 。但实际上,这种模型如果来作为今天经常见到的对话聊天模型是远远不够的,因为它并不会像人一样进行很好的聊天。比如问""教我如何打乒乓球",得到的回答可能是"去专业的乒乓球馆"。那么为了能达到正常人的聊天效果,这时候就需要所谓的指令微调。而今天所见到的大部分聊天模型 ChatModel ,都是基于 LanguageModel 进行指令微调的结果。

指令微调最早是来自《Finetuned Language Models Are Zero-Shot Learners》这篇论文的,这篇论文明确提出 Instruction Tuning(指令微调)的技术,它的本质目的是想将 NLP 任务转换为自然语言指令,再将其投入模型进行训练,通过给模型提供指令和选项的方式,使其能够提升Zero-Shot任务的性能表现。那么为什么不直接用自然语言指令做输入呢?如下图所示,将任务变为instruct的形式,然后让 LanguageModel 进行学习。在这种方式下,当遇到一个新的任务,通过理解其自然语言语义可以轻松实现zero-shot的扩展。

所以总结一句话:ChatModel 就是基于LanguageModel 进行指令微调的结果。

2 Langchain4j的LanguageModel

在Langchain4j中,有一个接口LanguageModel,源码如下:

java 复制代码
package dev.langchain4j.model.language;

import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.input.Prompt;
import dev.langchain4j.model.output.Response;

/**
 * Represents a language model that has a simple text interface (as opposed to a chat interface).
 * It is recommended to use the {@link ChatModel} instead,
 * as it offers more features.
 */
public interface LanguageModel {

    /**
     * 通过提示词给出一个回复
     */
    Response<String> generate(String prompt);

    /**
     * 通过提示词给出一个回复
     */
    default Response<String> generate(Prompt prompt) {
        return generate(prompt.text());
    }
}

从上面源码可以看到两个generate()方法,都是用于生成回复。从命名方式可以看出与之前命名为chat()方法不同,generate表示生成的命名方式,从这就可以看出专注生成。

3 示例演示

代码参考lesson10子模块
下面通过一个简单例子,演示Langchain4j中如何使用LanguageModel,本次示例使用Qwen大模型

1)申请阿里云的API KEY,并设置系统变量(如果已经有了,忽略这一步

2)新建lesson10子模块,其pom引入如下:

xml 复制代码
<dependencies>
    <dependency>
        <groupId>dev.langchain4j</groupId>
        <artifactId>langchain4j</artifactId>
    </dependency>
    <dependency>
         <groupId>dev.langchain4j</groupId>
         <artifactId>langchain4j-community-dashscope</artifactId>
         <version>1.9.1-beta17</version>
     </dependency>
</dependencies>

3)在lesson10子模块下,新建LanguageModelTest 类

java 复制代码
package com.langchain.lesson10;

import dev.langchain4j.community.model.dashscope.QwenLanguageModel;
import dev.langchain4j.community.model.dashscope.QwenModelName;
import dev.langchain4j.model.output.Response;

public class LanguageModelTest {
    public static void main(String[] args) {
        // 1.获取环境变量中的API KEY
        String apiKey = System.getenv("QWEN_API_KEY"); //MISTRAL_API_KEY
        // 2.创建模型
        QwenLanguageModel model = QwenLanguageModel.builder()
                .apiKey(apiKey)
                // 由于目前很多都没有开放基座模型,因此还是使用一个普通微调过的模型进行测试
                .modelName(QwenModelName.QWEN2_5_32B_INSTRUCT)
                .build();
        // 3.访问
        Response<String> response = model.generate("叫我打乒乓球?");
        System.out.println(response.content());
    }
}

4)运行LanguageModelTest 测试,结果如下:

说明 :由于很多基座模型并没有开放为API供用户使用,因此使用qwen2.5-32b-instruct,这个虽然也经过指令微调过,但是如果把模型改为qwen1.5-32b-chat,看看下面的效果:

可以明显看出两者在回答上就有很大的风格区别,这就是经过不同指令微调的结果。
结语:本章讲解了LanguageModel和ChatModel的区别,并演示了Langchain4j中LanguageModel的使用。虽然现在LanguageModel除了一些特殊场景下文本生成之外,比较少见,在Langchain4j中也是建议使用ChatModel可以替代LanguageModel,但是作为AI应用开发,还是要了解一下一些大模型训练的基本原理,对于选择模型也是一个知识输入。

Langchain4j 系列上一章:《Langchain4j 系列之二十 - RAG综合案例

Langchain4j 系列下一章:《Langchain4j 系列之二十二 - Embedding Models

相关推荐
NAGNIP6 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab7 小时前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab7 小时前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP11 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年11 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼11 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS11 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区12 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈12 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang13 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx