大家好,这里是架构资源栈!点击上方关注,添加“星标”,一起学习大厂前沿架构!

将大型语言模型集成到Java应用程序中,可以释放强大的功能,从智能自动化到复杂的对话界面,应有尽有。本指南探讨如何使用LangChain4j和OpenAI创建一个简单而基于CLI的Java应用程序。可以将其视为Java与AI/LLM集成的“Hello World”。

学习本教程需要满足几个先决条件:

  • Java 21(此示例不依赖于特定的 JDK 发行版本,但您也可以使用最新版本)。
  • 互联网连接方便与 OpenAI 的 API 进行通信。
  • 用于身份验证的OpenAI API密钥

获取OpenAI API密钥

获取OpenAI API非常简单。请按照以下步骤操作:

  1. 注册或登录。前往OpenAI并创建一个帐户,或者如果已有帐户,请登录。
  2. 导航到“API钥匙”部分。找到账户信息中心的“API钥匙”部分。
  3. 生成并安全存储您的API密钥。点击按钮即可生成新的API密钥。请务必将其存储在安全的位置,因为您将无法再次看到它。

设置您的环境

将您的API密钥安全地存储作为环境变量。具体操作方法取决于您使用的操作系统:

  • 在Windows上,导航至:系统属性 > 用户仪表 > 添加 OPENAI\_API\_KEY。
  • 在 macOS 或 Linux 上,将导出OPENAI\_API\_KEY='your-api-key'添加到您的 .bashrc 或 .zshrc 文件。

简单的 CLI 示例:Java 和 LLM 的“Hello World”

让我们从一个极简单的示例开始,演示如何通过命令行界面使用 Java 和 OpenAI 的 GPT 模型。此示例使用 Java 内置的 HTTP 客户端向 OpenAI 发送 API 请求。

package ca.bazlur;

import java.net.http.*;
import java.net.URI;
import java.time.Duration;

public class Main {

   private static final String API_URL = "https://api.openai.com/v1/chat/completions";

   public static void main(String[] args) throws Exception {
       String apiKey = System.getenv("OPENAI_API_KEY");
       if (apiKey == null || apiKey.isBlank()) {
           System.err.println("Error: OPENAI_API_KEY environment variable not set.");
           System.exit(1);
       }

       if (args.length == 0 || args[0].isBlank()) {
           System.err.println("Error: Please provide a prompt.");
           System.exit(1);
       }

       String prompt = args[0];

       String requestBody = """
               {
                   "model": "gpt-4",
                   "messages": [{"role": "user", "content": "%s"}],
                   "temperature": 0.7,
                   "max_tokens": 150
               }
               """.formatted(prompt);


       try (HttpClient client = HttpClient.newHttpClient()) {
           HttpRequest request = HttpRequest.newBuilder()
                   .uri(URI.create(API_URL))
                   .header("Content-Type", "application/json")
                   .header("Authorization", "Bearer " + apiKey)
                   .POST(HttpRequest.BodyPublishers.ofString(requestBody))
                   .timeout(Duration.ofSeconds(30))
                   .build();
           HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
           System.out.println("ChatGPT Response: " + response.body());
       }
   }
}

在上面的代码中,我们将请求主体构建为 JSON 字符串,并指定了模型 ( GPT-4 )、用户消息、温度和最大令牌数。模型参数指定要使用的 OpenAI 模型;GPT-4 是一个功能强大且用途广泛的选项。消息队列包含对话历史记录,角色指示发送者的消息。温度和令牌最大数用于控制输出关键。

温度参数的范围从0到1,它影响生成文本的随机性。较高的温度使得输出得以产生和不可预测性,而较低的温度则导致更保守和可预测的输出。例如,如果温度为0.2,询问“尽管给我讲个笑话”可能会产生一个经典的、有趣的笑话,而温度为1.0可能会产生一个更逻辑、更原创的答案,它可能不太连贯。

max\_tokens参数生成限制文本的长度,这对于控制成本和防止响应过长至关重要。如果将max\_tokens设置为50,则模型将生成不超过50个标记的响应。设置过低可能会导致响应过早断断,而设置过高可能会导致答案冗长或杂乱无章。

然后,我们创建了一个HttpClient来发送 API 请求,并构建了一个包含 API 端点、标头(Content-Type 和 Authorization )和请求正文的HttpRequest 。我们使用 client.send()发送了请求,搜索了响应,最后将响应正文打印到控制台。

以下是如何运行以下示例中的代码:

  1. 将代码保存为Main.java。
  2. 运行代码:java Main.java“多伦多的首都是哪里?”

我们得到以下输出:

{
  "id": "chatcmpl-BDTz5FwsX1rAfcjQZYP64JBWuUopl",
  "object": "chat.completion",
  "created": 1742553223,
  "model": "gpt-4-0613",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "Toronto is a city, not a country, so it doesn't have a capital. It is the capital city of the province of Ontario in Canada.",
        "refusal": null,
        "annotations": []
      },
      "logprobs": null,
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 14,
    "completion_tokens": 31,
    "total_tokens": 45,
    "prompt_tokens_details": {
      "cached_tokens": 0,
      "audio_tokens": 0
    },
    "completion_tokens_details": {
      "reasoning_tokens": 0,
      "audio_tokens": 0,
      "accepted_prediction_tokens": 0,
      "rejected_prediction_tokens": 0
    }
  },
  "service_tier": "default",
  "system_fingerprint": null
}

JSON有效负载包含用途、所用模型、创建时间以及来自助手的实际消息内容等信息。,我们可以使用JSON解析器对其进行解析,然后提取需要的内容。

与LangChain4j (OpenAI SDK)集成

虽然前面的示例演示了与 OpenAI API 交互的直接方法,但它涉及手动构建 HTTP 请求并解析 JSON 响应。这可能会变得繁琐且容易出错,尤其是在构建复杂的应用程序时。

Java 原生库 LangChain4j 简化了这个过程。它提供了一个高级、可解析的 API,用于与 OpenAI 的 GPT 模型等 LLM 进行交互,从而抽象出 API 调用的简单复杂性,使开发人员能够专注于应用程序的逻辑。

LangChain4J OpenAI 示例

让我们设置一个简单的 Maven 项目或 Gradle 项目,其中包含一些依赖项。Maven pom.xml文件中的内容如下:

<dependency>
        <groupId>dev.langchain4j</groupId>
        <artifactId>langchain4j</artifactId>
        <version>1.0.0-beta2</version>
    </dependency>

    <dependency>
        <groupId>dev.langchain4j</groupId>
        <artifactId>langchain4j-open-ai</artifactId>
        <version>1.0.0-beta2</version>
    </dependency>

或者,对于build.gradle:

implementation 'dev.langchain4j:langchain4j:1.0.0-beta2'
implementation 'dev.langchain4j:langchain4j-open-ai:1.0.0-beta2'

LangChain4j 示例

现在,让我们创建一个使用 LangChain4j 与 OpenAI 交互的 Java 类:

import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;

public class LLMExample {
    public static void main(String[] args) {
        ChatLanguageModel model = OpenAiChatModel.builder()
                .apiKey(System.getenv("OPENAI_API_KEY"))
                .modelName("gpt-4")
                .temperature(0.7)
                .maxTokens(150)
                .build();

        String response = model.chat("What is the capital of Toronto?");
        System.out.println(response);
    }
}

在该代码中,我们使用构建器模式创建了一个 OpenAiChatModel实例。我们设置了 API 密钥、模型名称、温度和最大令牌数。与前面的示例一样,温度参数会影响生成文本的随机性,生成更频繁、更可预测,或者增加但缺乏连贯性;而max\_tokens参数则作为一种成本控制措施,防止响应过长。您可以尝试使用这些参数来显着改变 LLM 的输出,并根据您的特定需求进行定制。

调用模型上的chat()方法传递用户的提示,该方法返回生成的文本,最后我们将响应打印到控制台。

要运行此示例,我们执行两个步骤:

  1. 将代码保存为Maven/Gradle 项目的src/main/java目录中的LLMExample.java 。
  2. 使用Maven编译并运行代码: mvncompile exec:java -Dexec.mainClass="LLMExample"

或者,要使用 Gradle运行它,请使用以下命令: ./gradlew run

您应该在控制台上看到来自 ChatGPT 的响应。

LangChain4j和其他AI模型

除了OpenAI之外,LangChain4j还支持与其他LLM集成,开发者可以尝试不同的LLM,并选择最符合自身需求的LLM。例如,如果我们想使用Google的Gemini API,我们可以调整代码以更改基本URL和模型名称,如下图:

import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;

public class LLMGeminiExample {
   public static void main(String[] args) {
       ChatLanguageModel model = OpenAiChatModel.builder()
               .apiKey(System.getenv("GOOGLE_API_KEY"))
               .baseUrl("https://generativelanguage.googleapis.com/v1beta/openai/")
               .modelName("gemini-2.0-flash")
               .temperature(0.7)
               .maxTokens(150)
               .build();

       String response = model.chat("What is the capital of Toronto?");
       System.out.println(response);
   }
}

当然,您必须获取Gemini API密钥,您可以Google AI Studio获取。确保将其存储在环境变量中。

另外,请注意,我们使用了相同的 OpenAI 模型。事实上,这是大多数模型的标准 SDK,因此我们可以统一使用它。

这些Java和OpenAI LLM示例的源代码可以在GitHub上找到。

Java、OpenAI 和 LLM 的下一步发展方向

现在您已经创建了第一个 Java 和 LLM 应用程序,您可以扩展此基本设置,探索层次的集成,并构建更复杂的 AI 应用驱动 Java 程序。以下是一些提供进一步探索的建议:

  • 构建聊天机器人。创建一个简单的聊天机器人来回答用户关于特定主题的问题。
  • 实现文本摘要。使用法学硕士学位(LLM)来总结长篇文章或文档。
  • 创作创意内容。尝试使用法学硕士学位(LLM)创作作品、故事或代码。
  • 探索不同的AI模型。尝试与其他LLM集成,例如Anthropic API

通过一些练习和信心,您将准备好探索有关 Java 和 AI 的高级主题,包括优化和 Java 中的实际 LLM 实现。

原文地址:https://mp.weixin.qq.com/s/ojH_Pk8RIfD9x7fWsfo3NQ

本文由博客一文多发平台 OpenWrite 发布!


吾日三省吾码
25 声望4 粉丝