0%

简介

LangGraph4j 是一个用于在 Java 中构建有状态的、多智能体(Multi-Agent)应用程序的库,与大型语言模型(LLM)深度集成。它灵感来源于 Python 的 LangGraph 库,旨在与 LangChain4j 和 Spring AI 等主流 Java LLM 框架无缝协作。

从本质上讲,LangGraph4j 允许你定义循环图(Cyclical Graphs),让不同的组件(智能体、工具或自定义逻辑)以有状态的方式进行交互。这对于构建需要记忆、上下文以及不同”智能体”之间协作或任务交接的复杂应用程序至关重要。

Read more »

Skills(技能)是一种为 LLM 配备可复用的、自包含的行为指令的机制。一个技能(Skill)捆绑了名称、简短描述、一组指令正文(即其 content),以及可选的资源(例如参考资料、素材、模板等)。LLM 按需加载技能,保持初始上下文较小,仅在真正需要时才拉取详细指令。

注意: langchain4j Skills API 目前处于实验阶段。API 和行为在未来的版本中仍可能发生变化。

Read more »

LangChain4j 提供了对 Spring Boot 的一流集成支持,让你能够以声明式的方式在 Spring Boot 应用中快速使用 AI 服务。只需添加对应的 starter 依赖,即可自动配置 ChatModelStreamingChatModel 等核心组件,并通过 @AiService 注解轻松定义具备 AI 能力的服务接口。

要求:LangChain4j Spring Boot 集成需要 Java 17 及以上版本,同时支持 Spring Boot 3Spring Boot 4 两大系列。两个系列同步发布,共享相同的版本号。请根据你项目中使用的 Spring Boot 版本选择对应的 starter 组合。

添加 Starter 依赖

Spring Boot starter 依赖的命名规范为:

1
2
langchain4j-{集成名称}-spring-boot-starter   (Spring Boot 3)
langchain4j-{集成名称}-spring-boot4-starter (Spring Boot 4)
Read more »

分类(Classification)对于将文本归类到预定义标签中至关重要,例如情感分析意图检测实体识别,这里演示了使用 LangChain4j 的 AI 驱动服务进行情感分类

LangChain4j 支持两种常见的文本分类方法:

  1. 通过 AI Services 使用 LLM:当标签依赖于细微的自然语言推理时使用。
  2. 通过 TextClassifier 和 EmbeddingModelTextClassifier 使用嵌入:当你为每个类别提供了带标签的示例,并希望通过语义相似度进行分类时使用。

情感分类服务可用于多种应用场景,包括:

  • 客户反馈分析:将客户评论分类为积极、中性或消极。
  • 社交媒体监控:分析社交媒体评论中的情感趋势。
  • 聊天机器人响应:理解用户情感以提供更好的回复。
Read more »

Guardrails(护栏)是一种机制,用于验证 LLM 的输入和输出,确保其符合您的预期。可以使用护栏来实现以下目的(或其他功能):

  • 过滤不当内容
  • 验证输出格式
  • 限制敏感信息泄露
  • 确保回答符合业务规则

实验性功能:Guardrails 是一项实验性功能。其 API 和行为可能在未来版本中发生变化。
护栏仅在使用 AI Services 时可用。 它们是高层抽象,不能直接应用于 ChatModelStreamingChatModel

Read more »

本页介绍如何使用底层 LLM API 进行响应流式传输。如需高层级 LLM API,请参阅 AI Services

为什么需要流式传输?

LLM 逐 token 生成文本,因此许多 LLM 提供商提供了按 token 流式传输响应的方式,而无需等待整个文本生成完毕。这显著改善了用户体验,因为用户无需等待未知时长的处理时间,几乎可以立即开始阅读响应内容。

核心接口

ChatModelLanguageModel 接口分别对应 StreamingChatModelStreamingLanguageModel 接口。它们具有相似的 API支持流式传输响应。这些接口接受一个 StreamingChatResponseHandler 接口的实现作为参数。

Read more »

RAG 流程

RAG 流程分为两个截然不同的阶段:索引阶段检索阶段,LangChain4j 为两个阶段都提供了工具支持。

索引阶段

在索引阶段,文档会被预处理,以便在检索阶段实现高效搜索。这个过程会根据所使用的信息检索方法而有所不同。对于向量搜索,通常包括:清洗文档、用额外数据和元数据丰富文档、将文档分割成更小的片段(即分块)、对这些片段进行嵌入编码,最后将它们存储到嵌入存储(即向量数据库)中。

索引阶段通常发生在离线状态下,这意味着不需要终端用户等待其完成。例如,可以通过 cron 定时任务在周末每周一次重新索引公司内部文档。负责索引的代码也可以是一个单独的应用程序,仅处理索引任务。然而,在某些场景下,终端用户可能希望上传自定义文档以使其可被 LLM 访问。在这种情况下,索引应在在线状态下执行,并作为主应用程序的一部分。

以下是索引阶段的简化示意图:

1
文档 → 清洗/丰富 → 分块 → 嵌入 → 嵌入存储(向量数据库)
Read more »

一些大语言模型(LLM)除了生成文本之外,还可以触发动作。这个被称为”工具”或”函数调用”的概念,它允许 LLM 在必要时调用一个或多个通常由开发者定义的可用工具。工具可以是任何东西:网络搜索、调用外部 API,或执行特定的代码片段等。LLM 实际上不能自己调用工具,相反,它们在响应中表达调用特定工具的意图(而不是以纯文本形式响应)。

所有支持工具的 LLM 可以在此处找到(参见”Tools”列)。
并非所有 LLM 对工具的支持程度都一样,理解、选择并正确使用工具的能力在很大程度上取决于具体的模型和它的能力。有些模型可能完全不支持工具,而另一些则可能需要精心设计的提示词或额外的系统指令。


LangChain4j 工具抽象层级

LangChain4j 为使用工具提供了两个抽象层级:ChatModel级别和AI—Services级别。

Read more »

许多 LLM 和 LLM 提供商支持以结构化格式(通常是 JSON)生成输出。这些输出可以轻松映射到 Java 对象,并在应用程序的其他部分使用。

例如,假设我们有一个 Person 类:

1
2
record Person(String name, int age, double height, boolean married) {
}

我们的目标是像下面这样的非结构化文本中提取 Person 对象:

John is 42 years old and lives an independent life.
He stands 1.75 meters tall and carries himself with confidence.
Currently unmarried, he enjoys the freedom to focus on his personal goals and interests.

目前,根据 LLM 和 LLM 提供商的不同,有三种方式可以实现这一目标(从最可靠到最不可靠):

  1. JSON Schema
  2. Prompting + JSON Mode
  3. Prompting
Read more »

因为ChatModelChatMessageChatMemory 等底层组件工作非常灵活,但也正式由于给予的这些自由,迫使开发者需要编写大量的样板代码。而由于 LLM 驱动的应用程序通常需要多个组件协同工作(例如提示模板、聊天记忆、LLM、输出解析器、RAG 组件:嵌入模型和存储),并且通常涉及多次交互,协调所有这些组件变得更加繁琐。故LangChain4j 目前提供了两个高级概念来解决这个问题:AI 服务(AI Services)链(Chains),以便于开发者能专注于业务逻辑而不是底层细节。

链(Chains)

链的概念源于 Python 版的 LangChain,其理念是为每个常见用例提供一个 Chain,例如聊天机器人、RAG 等。链将多个底层组件组合起来,并协调它们之间的交互。链的主要问题在于,如果你需要自定义某些内容,它们过于僵化,所以LangChain4j 目前只实现了两个链(ConversationalChainConversationalRetrievalChain),并不计划添加更多。

Read more »