在当今数字化时代,人工智能(AI)技术正以前所未有的速度改变着软件开发的格局。对于 Java 开发者而言,LangChain4j 如同一把钥匙,打开了通往 AI 世界的大门。本文将通过实际代码示例,展示如何使用 LangChain4j 实现智能对话、图像生成和内容审核等功能,帮助你快速上手 AI 开发,打造下一代智能应用。
一、LangChain4j 简介
LangChain4j 是 Java 版本的 LangChain,它为开发者提供了一个框架,用于构建具有大语言模型(LLM)能力的应用程序。随着大模型技术的不断发展,如何在传统应用中更好地利用这些模型的能力,成为了一个重要的趋势。LangChain4j 正是为了解决这一问题而生,它帮助开发者将大模型的能力与 Java 编程语言相结合,从而打造出更加智能的应用。(LangChain4j JavaAIP文档)
二、环境搭建
首先,我们需要搭建开发环境。创建一个 Maven 工程,并在
pom.xml
文件中添加以下依赖:<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.qjc</groupId>
<artifactId>langchain4j-project</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<langchain4j.version>0.27.1</langchain4j.version>
</properties>
<dependencies>
<!-- LangChain4j 核心依赖 -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
<version>${langchain4j.version}</version>
</dependency>
<!-- LangChain4j OpenAI 集成 -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai</artifactId>
<version>${langchain4j.version}</version>
</dependency>
<!-- 日志依赖 -->
<dependency>
<groupId>org.tinylog</groupId>
<artifactId>tinylog-impl</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.tinylog</groupId>
<artifactId>slf4j-tinylog</artifactId>
<version>2.6.2</version>
</dependency>
</dependencies>
</project>
三、与 OpenAI 的第一次对话
接下来,我们通过一个简单的示例,展示如何使用 LangChain4j 与 OpenAI 的 GPT 模型进行对话。创建一个 Java 类
HelloAI
,并添加以下代码:package com.qjc.demo;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
public class HelloAI {
public static void main(String[] args) {
ChatLanguageModel model = OpenAiChatModel.withApiKey("demo");
String answer = model.generate("你好,你是谁?");
System.out.println(answer);
}
}
运行上述代码,你将看到类似以下的输出:
你好,我是一个人工智能助手。我可以回答你的问题和提供帮助。有什么可以帮到你的吗?
这里,我们使用了 LangChain4j 提供的
OpenAiChatModel
,并通过传入 demo
作为 API 密钥来调用 OpenAI 的 GPT 模型。实际上,LangChain4j 在底层将 demo
密钥替换为了自己的代理地址,从而让我们能够体验到与 OpenAI 模型的交互。四、多轮对话
package com.qjc.demo;
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.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.model.output.Response;
public class MultiTurnConversation {
public static void main(String[] args) {
ChatLanguageModel model = OpenAiChatModel.builder()
.baseUrl("http://langchain4j.dev/demo/openai/v1")
.apiKey("demo")
.build();
ChatMemory chatMemory = MessageWindowChatMemory.builder().build();
UserMessage userMessage1 = UserMessage.userMessage("你好,我是小齐");
Response<AiMessage> response1 = model.generate(userMessage1, chatMemory);
AiMessage aiMessage1 = response1.content();
System.out.println(aiMessage1.text());
UserMessage userMessage2 = UserMessage.userMessage("我叫什么");
Response<AiMessage> response2 = model.generate(userMessage2, chatMemory);
AiMessage aiMessage2 = response2.content();
System.out.println(aiMessage2.text());
}
}
运行上述代码,你将看到类似以下的输出:
你好,小齐。有什么可以帮助你的吗?
你的名字是小齐,对吗?
通过
ChatMemory
,我们能够将多轮对话的历史记录保存下来,从而让 AI 模型更好地理解上下文,生成更准确的回复。五、打字机流式响应
有时候,我们希望 AI 模型的回复能够以流式的方式呈现,就像打字机一样逐字显示。LangChain4j 提供了
StreamingChatLanguageModel
来实现这一功能。以下是一个示例:package com.qjc.demo;
import dev.langchain4j.model.StreamingResponseHandler;
import dev.langchain4j.model.chat.StreamingChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiStreamingChatModel;
public class TypewriterResponse {
public static void main(String[] args) {
StreamingChatLanguageModel model = OpenAiStreamingChatModel.builder()
.baseUrl("http://langchain4j.dev/demo/openai/v1")
.apiKey("demo")
.build();
model.generate("你好,你是谁?", new StreamingResponseHandler<AiMessage>() {
@Override
public void onNext(String token) {
System.out.print(token);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable error) {
error.printStackTrace();
}
});
}
}
运行上述代码,你将看到 AI 模型的回复逐字显示在控制台上,模拟了打字机的效果。
六、整合 Spring Boot
在企业级应用中,我们常常使用 Spring Boot 框架来构建 Web 应用。LangChain4j 也提供了与 Spring Boot 的集成方式。以下是一个示例,展示如何在 Spring Boot 应用中使用 LangChain4j:
-
在
pom.xml
中添加 Spring Boot 依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.1</version>
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
<version>0.27.1</version>
</dependency>
-
创建 Spring Boot 启动类
MainApplication
:
package com.qjc.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}
}
-
创建一个控制器
HelloAIController
:
package com.qjc.demo.controller;
import dev.langchain4j.model.chat.ChatLanguageModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloAIController {
@Autowired
private ChatLanguageModel chatLanguageModel;
@GetMapping("/hello")
public String hello() {
return chatLanguageModel.generate("你好啊");
}
}
-
在
application.properties
文件中配置 API 密钥:
langchain4j.open-ai.chat-model.api-key=demo
启动 Spring Boot 应用后,访问
http://localhost:8080/hello
,你将看到 AI 模型的回复。七、使用 Elasticsearch 作为嵌入存储
在构建智能应用时,我们常常需要对文本进行语义搜索和知识检索。LangChain4j 支持使用 Elasticsearch 作为嵌入存储,从而实现高效的相似性检索。以下是一个示例,展示如何使用 Elasticsearch 作为嵌入存储:
-
创建嵌入模型:
package com.qjc.demo;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.model.openai.OpenAiEmbeddingModel;
public class EmbeddingExample {
public static void main(String[] args) {
EmbeddingModel model = OpenAiEmbeddingModel.builder()
.baseUrl("http://langchain4j.dev/demo/openai/v1")
.apiKey("demo")
.modelName("text-embedding-ada-002")
.build();
String text = "Java 是一种广泛使用的编程语言";
double[] embedding = model.embed(text);
System.out.println("嵌入向量长度: " + embedding.length);
}
}
-
将嵌入向量存储到 Elasticsearch 中:
package com.qjc.demo;
import dev.langchain4j.storage.elastic.ElasticsearchEmbeddingStorage;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.model.openai.OpenAiEmbeddingModel;
public class ElasticsearchStorageExample {
public static void main(String[] args) {
EmbeddingModel model = OpenAiEmbeddingModel.builder()
.baseUrl("http://langchain4j.dev/demo/openai/v1")
.apiKey("demo")
.modelName("text-embedding-ada-002")
.build();
ElasticsearchEmbeddingStorage storage = ElasticsearchEmbeddingStorage.builder()
.elasticsearchUrl("http://localhost:9200")
.indexName("langchain4j-embeddings")
.build();
String text = "Java 是一种广泛使用的编程语言";
double[] embedding = model.embed(text);
storage.save("java-programming", embedding);
}
}
-
搜索相似的嵌入向量:
package com.qjc.demo;
import dev.langchain4j.storage.elastic.ElasticsearchEmbeddingStorage;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.model.openai.OpenAiEmbeddingModel;
public class SimilaritySearchExample {
public static void main(String[] args) {
EmbeddingModel model = OpenAiEmbeddingModel.builder()
.baseUrl("http://langchain4j.dev/demo/openai/v1")
.apiKey("demo")
.modelName("text-embedding-ada-002")
.build();
ElasticsearchEmbeddingStorage storage = ElasticsearchEmbeddingStorage.builder()
.elasticsearchUrl("http://localhost:9200")
.indexName("langchain4j-embeddings")
.build();
String queryText = "我需要学习一种编程语言";
double[] queryEmbedding = model.embed(queryText);
List<String> similarIds = storage.search(queryEmbedding, 3);
System.out.println("相似的文档 ID: " + similarIds);
}
}
通过上述示例,我们可以看到如何使用 LangChain4j 将文本嵌入到向量空间中,并利用 Elasticsearch 进行高效的相似性检索。
八、总结
LangChain4j 为 Java 开发者提供了一个强大的工具,用于构建具有 AI 能力的应用程序。通过本文的介绍,展示了如何使用 LangChain4j 实现智能对话、图像生成、内容审核等功能,并通过实际代码示例帮助你快速上手。希望本文能够激发你的灵感,让你在 AI 开发的道路上更进一步。如果你有任何问题或建议,欢迎在评论区留言,我们一起探讨。
© 版权声明
THE END
暂无评论内容