JAVA AI 框架LangChain4j 入门教程

以下是一篇关于 LangChain4j 的入门使用教程,包含框架介绍和开发入门指南:


LangChain4j 入门教程

1. LangChain4j 简介

LangChain4j 是一个基于 Java 的轻量级框架,旨在简化大型语言模型(LLM)在 Java 应用中的集成。它借鉴了 Python 版 LangChain 的设计理念,提供了以下核心功能:

  • 模型集成:支持 OpenAI、HuggingFace、本地模型(如 Ollama)等。
  • 提示工程:通过模板化提示(Prompt Templates)优化与模型的交互。
  • 链式调用:将多个步骤(模型调用、工具执行)组合成可复用的流程。
  • 记忆管理:支持短期/长期记忆(如对话历史记录)。
  • 数据增强:通过检索增强生成(RAG)扩展模型知识库。
  • 工具扩展:允许自定义工具(如搜索、数据库查询)扩展模型能力。

适用场景:聊天机器人、文档问答、自动化数据处理等。


2. 环境准备

2.1 添加依赖

在 Maven 或 Gradle 项目中添加依赖:

Maven
xml 复制代码
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-open-ai</artifactId>
    <version>0.29.0</version> <!-- 使用最新版本 -->
</dependency>
Gradle
groovy 复制代码
implementation 'dev.langchain4j:langchain4j-open-ai:0.29.0'

2.2 获取 API 密钥

如需使用 OpenAI 等云服务,需注册并获取 API 密钥(示例中使用 OpenAI)。


3. 快速开始:Hello World

以下示例演示如何通过 OpenAI 生成文本:

java 复制代码
import dev.langchain4j.model.openai.OpenAiChatModel;

public class HelloWorld {
    public static void main(String[] args) {
        // 初始化 OpenAI 模型(需设置环境变量 OPENAI_API_KEY)
        OpenAiChatModel model = OpenAiChatModel.builder()
                .modelName("gpt-3.5-turbo")
                .temperature(0.3)
                .build();

        // 发送提示并获取响应
        String response = model.generate("用一句话解释量子计算");
        System.out.println(response); // 输出:量子计算利用量子比特的叠加和纠缠特性,实现远超经典计算机的并行计算能力。
    }
}

4. 核心功能详解

4.1 提示模板(Prompt Templates)

通过模板动态生成提示,提高复用性:

java 复制代码
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.model.output.Response;

public class PromptTemplateDemo {
    public static void main(String[] args) {
        OpenAiChatModel model = OpenAiChatModel.create();

        String template = "将以下文本翻译成{{language}}: {{text}}";
        String prompt = template
                .replace("{{language}}", "法语")
                .replace("{{text}}", "你好,世界!");

        Response<String> response = model.generate(prompt);
        System.out.println(response.content()); // 输出:Bonjour le monde !
    }
}

4.2 链(Chains)

将多个操作组合成链:

java 复制代码
import dev.langchain4j.chain.ConversationalChain;
import dev.langchain4j.memory.ChatMemory;
import dev.langchain4j.memory.chat.TokenWindowChatMemory;

public class ChainDemo {
    public static void main(String[] args) {
        ChatMemory memory = TokenWindowChatMemory.withMaxTokens(500);
        ConversationalChain chain = ConversationalChain.builder()
                .chatLanguageModel(OpenAiChatModel.create())
                .chatMemory(memory)
                .build();

        String answer = chain.execute("爱因斯坦最著名的成就是什么?");
        System.out.println(answer); // 输出:相对论...
    }
}

4.3 记忆(Memory)

实现多轮对话记忆:

java 复制代码
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.service.AiServices;
import dev.langchain4j.service.MemoryId;
import dev.langchain4j.service.UserMessage;

interface Assistant {
    String chat(@MemoryId String sessionId, @UserMessage String message);
}

public class MemoryDemo {
    public static void main(String[] args) {
        Assistant assistant = AiServices.builder(Assistant.class)
                .chatLanguageModel(OpenAiChatModel.create())
                .chatMemoryProvider(sessionId -> TokenWindowChatMemory.withMaxTokens(1000))
                .build();

        String sessionId = "user123";
        System.out.println(assistant.chat(sessionId, "我最喜欢的颜色是蓝色"));
        System.out.println(assistant.chat(sessionId, "我刚才说喜欢什么颜色?")); // 输出:您喜欢蓝色
    }
}

4.4 数据加载与检索增强(RAG)

从文档加载数据并增强回答:

java 复制代码
import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.parser.TextDocumentParser;
import dev.langchain4j.store.embedding.EmbeddingStore;
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;

public class RAGDemo {
    public static void main(String[] args) {
        // 1. 加载文档
        Document document = Document.from(new File("knowledge.txt"), new TextDocumentParser());

        // 2. 分割文本块
        DocumentSplitter splitter = new DocumentByParagraphSplitter();
        List<TextSegment> segments = splitter.split(document);

        // 3. 生成嵌入并存储
        EmbeddingModel embeddingModel = new OpenAIEmbeddingModel();
        EmbeddingStore<TextSegment> store = new InMemoryEmbeddingStore<>();
        store.addAll(embeddingModel.embed(segments), segments);

        // 4. 构建问答链
        ConversationalRetrievalChain chain = ConversationalRetrievalChain.builder()
                .chatLanguageModel(OpenAiChatModel.create())
                .retriever(EmbeddingStoreRetriever.from(store, embeddingModel))
                .build();

        String answer = chain.execute("文档中提到的关键技术是什么?");
        System.out.println(answer);
    }
}

4.5 工具调用(Tools)

扩展模型能力(如调用天气 API):

java 复制代码
import dev.langchain4j.agent.tool.Tool;

class WeatherTools {
    @Tool("获取指定城市的当前温度")
    double getCurrentTemperature(String city) {
        // 调用真实 API(此处模拟)
        return 25.3;
    }
}

public class ToolDemo {
    public static void main(String[] args) {
        OpenAiChatModel model = OpenAiChatModel.builder()
                .tools(new WeatherTools())
                .build();

        String response = model.generate("上海现在的温度是多少?");
        System.out.println(response); // 输出:上海当前温度为25.3摄氏度
    }
}

5. 进阶指引

  1. 本地模型 :使用 langchain4j-ollama 集成本地模型(如 Llama3)
  2. 评估与监控:集成 Prometheus 监控模型调用指标
  3. 复杂链设计 :通过 ConditionalChain 实现分支逻辑
  4. 自定义输出解析 :实现 OutputParser 处理非结构化响应

6. 注意事项

  • API 密钥安全:通过环境变量或密钥管理工具存储
  • 本地模型:需要部署本地推理服务(如 Ollama)
  • 性能优化:合理设置超时时间与重试策略
  • 错误处理 :捕获 LangChain4jException 处理模型异常

通过本教程,您已掌握 LangChain4j 的核心概念和基础用法。接下来可以尝试:

  1. 构建客户服务自动回复系统
  2. 实现基于私有数据的文档问答机器人
  3. 开发自动化数据分析工具

完整示例代码可参考 LangChain4j 官方 GitHub

相关推荐
IT猿手2 分钟前
超多目标优化:基于导航变量的多目标粒子群优化算法(NMOPSO)的无人机三维路径规划,MATLAB代码
人工智能·算法·机器学习·matlab·无人机
JolyouLu12 分钟前
PyTorch-基础(CUDA、Dataset、transforms、卷积神经网络、VGG16)
人工智能·pytorch·cnn
CS_木成河16 分钟前
【深度学习】预训练和微调概述
人工智能·深度学习·语言模型·微调·预训练
奔跑吧邓邓子19 分钟前
【Python爬虫(44)】分布式爬虫:筑牢安全防线,守护数据之旅
开发语言·分布式·爬虫·python·安全
新加坡内哥谈技术24 分钟前
微软发布Majorana 1芯片,开启量子计算新路径
人工智能·深度学习·语言模型·自然语言处理
非 白28 分钟前
【Java】单例模式
java·笔记·单例模式
C#Thread35 分钟前
C#上位机--流程控制(IF语句)
开发语言·javascript·ecmascript
IDRSolutions_CN42 分钟前
如何在 PDF 文件中嵌入自定义数据
java·经验分享·pdf·软件工程·团队开发
_风中无我。1 小时前
Spring的过滤器获取请求体中JSON参数,同时解决Controller获取不到请求体参数的问题。
java·spring·json
真智AI1 小时前
使用 DistilBERT 进行资源高效的自然语言处理
人工智能·自然语言处理