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

LangChain4j的初步学习【逐步添加中】

LangChain4j 是一个专为 Java 开发者设计的、受 Python LangChain 启发而构建的框架。它的核心目标是简化大型语言模型(LLM)的集成过程,让开发者能够轻松地将强大的 AI 功能构建到自己的 Java 应用程序中。

1. 什么是 LangChain4j?

  • 定义:一个用于 Java 应用程序的 AI 集成框架。

  • 灵感来源:Python 的 LangChain 项目,但并非其直接端口,而是根据 Java 生态的特点(如强类型、丰富的企业级库)重新设计和实现。

  • 核心价值:提供一套抽象、工具和预构建组件,将 LLM(如 OpenAI 的 GPT-4, Google 的 Gemini, 本地的 Mixtral)与外部数据和系统连接起来,从而创建功能强大、上下文感知的 AI 应用。

  • 设计哲学约定优于配置,旨在通过简洁、富有表现力且遵循 Java 习惯的 API 来降低开发复杂度。

LangChain4j 中文文档https://docs.langchain4j.info/

2. 核心概念与功能

LangChain4j 的核心是围绕一系列“概念”构建的,这些概念是构建复杂 LLM 应用的基础模块。

  1. Model(模型)

    • 抽象了与各种 LLM 提供商的交互。你可以通过更改配置轻松切换模型,而无需重写业务逻辑。

    • 支持提供商:OpenAI, Azure OpenAI, Google Gemini, Anthropic Claude, Hugging Face, Ollama(本地模型), LocalAI 等。

  2. ChatMemory(聊天记忆)

    • 管理对话的上下文历史。这是实现多轮对话的关键。

    • 类型:支持多种存储方式,如简单的内存存储、基于 Redis 或数据库的持久化存储,以确保应用重启后对话状态不丢失。

  3. Tools(工具)

    • 允许 LLM 按需执行外部动作或获取外部数据。这是将 LLM 能力与现有系统和 API 连接起来的超级能力。

    • 示例:一个“获取天气”的工具,一个“执行数据库查询”的工具,一个“调用内部 HTTP API”的工具。

    • LLM 可以根据用户请求决定调用哪个工具,并将工具执行结果融入其回复中。

  4. PromptTemplates(提示模板)

    • 帮助动态生成高质量的提示(Prompt)。它将用户输入、上下文、对话历史等变量注入到预定义的模板中,形成最终发送给 LLM 的指令。

    • 好处:提高提示词的一致性、可维护性和复用性。

  5. OutputParsers(输出解析器)

    • LLM 的输出是非结构化的文本。OutputParsers 负责将这些文本解析成结构化、可编程的对象(如 Java 对象、JSON 等)。

    • 示例:让 LLM 生成一个 Person 对象的 JSON 字符串,然后用 JsonOutputParser 将其自动反序列化为 Java 的 Person 类实例。

  6. Embeddings(嵌入) & VectorStores(向量数据库)

    • Embeddings:将文本(如文档、问答)转换为数值向量( embeddings)。

    • VectorStores:存储和检索这些向量。通过计算向量之间的相似度,可以实现语义搜索。

    • 应用场景检索增强生成(RAG)。这是 LangChain4j 最强大的功能之一。它允许你将自己的数据(PDF、Word、数据库)转换为向量并存入向量数据库。当用户提问时,系统会先从你的数据中检索最相关的信息,然后将这些信息作为上下文提供给 LLM,从而让 LLM 生成基于你自身知识的、更准确的回答,避免“幻觉”。

  7. Chains(链)

    • 将上述多个组件按顺序链接起来,形成一个复杂的工作流。一个链的输出可以作为下一个链的输入。

    • 示例RetrievalChain 就是一个预定义的链,它自动完成了“检索相关文档 -> 构建提示 -> 调用模型 -> 解析输出”的整个 RAG 流程。

  8. AI Services(AI 服务)

    • 这是 LangChain4j 中一个非常强大且具有创新性的抽象。它允许你通过定义一个 Java 接口 来创建一个 AI 应用。

    • 你可以在接口方法上使用注解(如 @SystemMessage@UserMessage@MemoryId@V)来定义行为、提示和记忆。

    • 框架会在运行时自动生成这个接口的代理实现,处理所有与 LLM 的交互、工具调用、记忆管理等复杂细节。这让代码变得极其简洁和声明式。

3.代码初步

相关背景知识

开始之前需要准备一个空的SpringBoot项目。

相关依赖

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-spring-boot-starter</artifactId><version>1.4.0-beta10</version></dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-open-ai-spring-boot-starter</artifactId><version>1.3.0-beta9</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.5.18</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-open-ai</artifactId><version>1.3.0</version></dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-reactor</artifactId><version>1.0.1-beta6</version></dependency>

(1)入门程序

import dev.langchain4j.model.openai.OpenAiChatModel;public class App
{public static void main( String[] args ){OpenAiChatModel chatModel = OpenAiChatModel.builder().baseUrl("your_baseUrl")//这个需要去调用的模型的提供者的文档查看.modelName("your_modelName")//这是你调用的模型名字.apiKey("your_apiKey")//这是你的api秘钥.logRequests(true)//打印请求.logResponses(true)//打印回复.build();String result = chatModel.chat("你是谁?");//向大模型请求的问题System.out.println(result);}
}

(2)配置yml文件

langchain4j:open-ai:chat-model: #普通调用base-url: your_baseUrlapi-key: your_apiKeymodel-name: your_modelNamelog-requests: true #开启请求打印log-responses: true #开启回复打印streaming-chat-model: #流式调用base-url: your_baseUrlapi-key: your_apiKeymodel-name: your_modelNamelog-requests: true #开启请求打印log-responses: true #开启回复打印
logging:level:dev.langchain4j: debug

(3)入门接口

a.创建service相关类
import org.springframework.stereotype.Service;@Service
public interface ConsultantService {String chat(String message);
}
b.创建controller相关类
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ChatController {@Autowiredprivate ConsultantService consultantService;@RequestMapping("/chat")public String chat (String message){return consultantService.chat(message);}
}
c.创建config相关类
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.service.AiServices;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class CommonConfig {@Autowiredprivate OpenAiChatModel model;//通过你的yml文件自动创建的@Beanpublic ConsultantService consultantService(){return AiServices.builder(ConsultantService.class).chatModel(model).build();}
}
d.使用Apifox测试

e.声明式使用

不使用config类,直接在service相关方法上加上注解@AiService@AiService 是来自 LangChain4j 框架的一个注解,用于将一个接口自动装配为一个 AI 服务(即代理实现),使得你可以像调用普通方法一样调用 AI 模型。

import dev.langchain4j.service.spring.AiService;
import dev.langchain4j.service.spring.AiServiceWiringMode;@AiService(wiringMode = AiServiceWiringMode.EXPLICIT,//自动装配chatModel = "openAiChatModel"//模型Bean名,这里是LangChain4j通过yml文件自动创建的默认名字
)
public interface ConsultantService {String chat(String message);
}

wiringMode = AiServiceWiringMode.EXPLICIT

作用:

这个参数控制 Spring 如何为 @AiService 接口创建实现类(代理)。

可选值:

  • AiServiceWiringMode.EXPLICIT(显式装配)

  • AiServiceWiringMode.AUTO(自动装配)

EXPLICIT 的含义:

  • 表示你需要 手动明确地配置 所使用的 ChatModelTokenizer 等组件。

  • Spring 不会自动从上下文中查找默认的 ChatModel

  • 你必须通过 chatModel = "..." 显式指定 Spring 容器中某个 bean 的名称。

chatModel = "openAiChatModel"

作用:

指定该 AI 服务应使用 Spring 容器中名为 "openAiChatModel"ChatModel bean。

openAiChatModel 是什么?

它是 LangChain4j 为 OpenAI 类型模型 自动创建的默认 Bean 名称

当你在 application.yml 中配置了相关参数(base-url、api-key、model-name),

LangChain4j 的自动配置(LangChain4jAutoConfiguration)就会:

  • 创建一个 OpenAiChatModel 实例(或兼容 OpenAI 的客户端)。

  • 使用你提供的 base-urlapi-keymodel-name 等参数。

  • 将这个实例注册为 Spring 容器中的一个 Bean,名字叫 openAiChatModel

如果想使用多个model,你可以不使用LangChain4j自动创建Bean,在config类中写类似如下代码:

@Bean("name")//自己取个名字
public ChatModel qwenChatModel() {return OpenAiChatModel.builder().baseUrl("your_base-url").apiKey(System.getenv("your_API_KEY")).modelName("your_model_name").build();
}

在注解处写成对应名字即可使用对应模型。

(4)流式调用

a.修改service相关类
import dev.langchain4j.service.spring.AiService;
import dev.langchain4j.service.spring.AiServiceWiringMode;
import reactor.core.publisher.Flux;@AiService(wiringMode = AiServiceWiringMode.EXPLICIT,chatModel = "openAiChatModel",streamingChatModel = "openAiStreamingChatModel"
)
public interface ConsultantService {String chat(String message);Flux<String> fluxChat(String message);
}
b.修改新的接口
    @RequestMapping("/fluxChat")public Flux<String> fluxChat(String message){return consultantService.fluxChat(message);}


文章转载自:

http://2jV0cpJU.ckhry.cn
http://clRshnRR.ckhry.cn
http://F3jhizXs.ckhry.cn
http://nn9IjkEP.ckhry.cn
http://aJUGogWm.ckhry.cn
http://9PzfVOSf.ckhry.cn
http://V77npoCG.ckhry.cn
http://imtd1p1L.ckhry.cn
http://iXqe62bV.ckhry.cn
http://hz6c4gcq.ckhry.cn
http://zSbfWSdq.ckhry.cn
http://Lewb4EqC.ckhry.cn
http://3xKC0IZO.ckhry.cn
http://4No25Xfu.ckhry.cn
http://awPmrxsD.ckhry.cn
http://uLP26Fhf.ckhry.cn
http://oqEdEmfH.ckhry.cn
http://nAmrCsoV.ckhry.cn
http://MAAGHRgH.ckhry.cn
http://dAwhZnB6.ckhry.cn
http://EuLSz0SW.ckhry.cn
http://i1yVf9mi.ckhry.cn
http://XLRi84mn.ckhry.cn
http://qKvaZZqE.ckhry.cn
http://pkgJAeGn.ckhry.cn
http://cUr2aZB7.ckhry.cn
http://HvPBlbsM.ckhry.cn
http://qcSaNa0Q.ckhry.cn
http://T07Lc5PB.ckhry.cn
http://EAoIiakq.ckhry.cn
http://www.dtcms.com/a/366439.html

相关文章:

  • 聚焦功能与评价:2025 年十大低代码平台全面深度对比与选型指南
  • 百度前端社招面经
  • 【算法--链表】61.旋转链表--通俗讲解
  • [特殊字符]为什么不建议全局安装 Claude Code?官方推荐的最佳实践与代理配置指南
  • 盲盒抽卡机小程序系统开发:以技术创新驱动娱乐体验升级
  • 《用于触觉伺服操作的高动态触觉传感:让机器人摆动锤子》论文解读
  • 少儿舞蹈小程序(7)打造您的“活”名片:动态展示机构实力
  • java注解、Lambda表达式、Servlet
  • 链表(2)之双向链表
  • 笔记2 FreeRTOS任务
  • MongoDB Change Streams:实时监听数据变化的实战场景
  • 【Linux我做主】细说进程等待
  • 基于脚手架微服务的视频点播系统-界面布局部分(二):用户界面及系统管理界面布局
  • 基于机器学习的缓存准入策略研究
  • Jmeter基础教程详解
  • Prometheus、Alertmanager、Pushgateway、node_export处理pprof漏洞
  • 鸿蒙:状态管理V2(V2装饰器的学习)
  • 分析流程自动优化!Fabarta个人专属智能体「数据分析」新功能介绍
  • 0基础怎么学习数据分析、统计分析、机器学习?数学不好、一看编程就头疼,能行吗?
  • (Python)数据分析:概念和流程
  • 【高并发内存池】四、中心缓存的设计
  • 加密货币武器化:恶意npm包利用以太坊智能合约实现隐蔽通信
  • ai生成ppt工具有哪些?10款主流AI生成PPT工具盘点
  • 智慧油站新机遇:一款加油小程序如何让生意“加油”提速?
  • Ubuntu 24.04 中 nvm 安装 Node 权限问题解决
  • Jfinal-简
  • VR红色教育基地+数字党建展厅+智慧校史馆
  • 基于单片机智能水龙头/智能洗漱台设计
  • Android入门到实战(八):从发现页到详情页——跳转、传值与RecyclerView多类型布局
  • Android SystemServer 系列专题【AttentionManagerService】