机器学习中如何用Java高效实现LangChain入门指南

云信安装大师
90
AI 质量分
2 5 月, 2025
3 分钟阅读
0 阅读

机器学习中如何用Java高效实现LangChain入门指南

引言

LangChain是一个强大的框架,用于构建基于语言模型的应用程序。虽然Python是机器学习领域的主流语言,但很多Java开发者也希望在自己的项目中集成LangChain。本文将带你用Java实现LangChain的基本功能,包括环境搭建、API调用和简单应用开发。

准备工作

在开始之前,请确保你的开发环境满足以下要求:

  • JDK 11或更高版本
  • Maven 3.6+或Gradle 7+
  • OpenAI API密钥(或其他支持的LLM提供商)
  • IntelliJ IDEA或其他Java IDE(推荐)

第一步:添加LangChain4j依赖

LangChain4j是Java版的LangChain实现。我们首先在项目中添加依赖:

Maven项目(pom.xml):

代码片段
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j</artifactId>
    <version>0.22.0</version>
</dependency>
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-open-ai</artifactId>
    <version>0.22.0</version>
</dependency>

Gradle项目(build.gradle):

代码片段
implementation 'dev.langchain4j:langchain4j:0.22.0'
implementation 'dev.langchain4j:langchain4j-open-ai:0.22.0'

第二步:配置OpenAI客户端

我们需要配置OpenAI客户端来与GPT模型交互:

代码片段
import dev.langchain4j.model.openai.OpenAiChatModel;

public class LangChainDemo {

    public static void main(String[] args) {
        // 替换为你的OpenAI API密钥
        String apiKey = "sk-your-api-key-here";

        OpenAiChatModel model = OpenAiChatModel.builder()
                .apiKey(apiKey)
                .modelName("gpt-3.5-turbo") // 也可以使用gpt-4
                .temperature(0.3) // 控制创造性的参数,范围0-1
                .build();

        // 测试连接
        String response = model.generate("你好!");
        System.out.println("AI回复: " + response);
    }
}

参数说明:
apiKey: OpenAI的API密钥
modelName: 使用的模型名称
temperature: 控制输出的随机性,值越高输出越有创意

第三步:构建简单的问答系统

让我们构建一个简单的问答应用:

代码片段
import dev.langchain4j.data.message.AiMessage;
import dev.langchain4j.data.message.UserMessage;
import dev.langchain4j.memory.ChatMemory;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.model.output.Response;

public class SimpleQABot {

    private final OpenAiChatModel model;
    private final ChatMemory memory;

    public SimpleQABot(String apiKey) {
        this.model = OpenAiChatModel.builder()
                .apiKey(apiKey)
                .modelName("gpt-3.5-turbo")
                .build();

        // 创建聊天内存,保留最近的10条消息作为上下文
        this.memory = MessageWindowChatMemory.withMaxMessages(10);
    }

    public String ask(String question) {
        // 将用户问题添加到内存
        memory.add(UserMessage.from(question));

        // 发送聊天历史给模型并获取响应
        Response<AiMessage> response = model.generate(memory.messages());

        // 获取AI回复内容
        String answer = response.content().text();

        // 将AI回复添加到内存
        memory.add(response.content());

        return answer;
    }

    public static void main(String[] args) {
        SimpleQABot bot = new SimpleQABot("sk-your-api-key-here");

        System.out.println(bot.ask("Java中的String类有哪些常用方法?"));
        System.out.println(bot.ask("能详细解释一下substring方法吗?"));
    }
}

代码解析:
1. MessageWindowChatMemory用于保存对话上下文,让AI能记住之前的对话内容。
2. UserMessageAiMessage分别代表用户和AI的消息。
3. model.generate()方法接收消息列表并返回AI的响应。

第四步:文档问答系统实现

更实用的场景是从文档中提取信息回答问题。以下是实现方法:

代码片段
import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.FileSystemDocumentLoader;
import dev.langchain4j.data.document.splitter.DocumentSplitters;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.model.embedding.AllMiniLmL6V2EmbeddingModel;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.store.embedding.EmbeddingStore;
import dev.langchain4j.store.embedding.EmbeddingStoreIngestor;
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;

import java.nio.file.Path;

public class DocumentQABot {

    private final OpenAiChatModel chatModel;
    private final EmbeddingStore<TextSegment> embeddingStore;
    private final EmbeddingModel embeddingModel;

    public DocumentQABot(String apiKey) {
        this.chatModel = OpenAiChatModel.builder()
                .apiKey(apiKey)
                .modelName("gpt-3.5-turbo")
                .build();

        this.embeddingStore = new InMemoryEmbeddingStore<>();
        this.embeddingModel = new AllMiniLmL6V2EmbeddingModel();
    }

    public void ingestDocument(Path filePath) {
        // 加载文档
        Document document = FileSystemDocumentLoader.loadDocument(filePath);

        // 创建文档处理器:分割文档并生成嵌入向量
        EmbeddingStoreIngestor ingestor = EmbeddingStoreIngestor.builder()
                .documentSplitter(DocumentSplitters.recursive(500, 0))
                .embeddingModel(embeddingModel)
                .embeddingStore(embeddingStore)
                .build();

        // 处理文档并存储嵌入向量
        ingestor.ingest(document);
    }

    public String askFromDocument(String question) {
        // TODO: 实现基于嵌入向量的相似性搜索

        return "待实现";
    }

    public static void main(String[] args) {
        DocumentQABot bot = new DocumentQABot("sk-your-api-key-here");

        // 加载示例文档(假设有一个sample.txt文件)
        bot.ingestDocument(Path.of("sample.txt"));

        System.out.println(bot.askFromDocument("文档中提到的主要概念是什么?"));
    }
}

原理说明:
1. 文档加载:从文件系统加载文本内容。
2. 文档分割:将大文档分割成小片段以便处理。
3. 嵌入向量生成:使用嵌入模型将文本转换为向量表示。
4. 向量存储:将文本片段及其向量存储在内存中供后续检索。

第五步:性能优化与最佳实践

1. API调用优化

“`java
OpenAiChatModel model = OpenAiChatModel.builder()
.apiKey(apiKey)
.modelName(“gpt-3.5-turbo”)
// ↓↓↓↓优化参数↓↓↓↓
// ↓↓↓↓优化参数↓↓↓↓
// ↓↓↓↓优化参数↓↓↓↓
// ↓↓↓↓优化参数↓↓↓↓
// ↓↓↓↓优化参数↓↓↓↓
// ↓↓↓↓优化参数↓↓↓↓
// ↓↓↓↓优化参数↓↓↓↓
// ↓↓↓↓优化参数↓↓↓↓
// ↓↓↓↓优化参数↓↓↓↓
// ↓↓↓↓优化参数↓↓//// ↑↑↑↑优化结束↑↑↑↑//// ↑↑↑↑优化结束↑↑↑↑//// ↑↑↑↑优化结束↑↑↑↑//// ↑↑↑

原创 高质量