以下是一篇关于 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. 进阶指引
- 本地模型 :使用
langchain4j-ollama
集成本地模型(如 Llama3) - 评估与监控:集成 Prometheus 监控模型调用指标
- 复杂链设计 :通过
ConditionalChain
实现分支逻辑 - 自定义输出解析 :实现
OutputParser
处理非结构化响应
6. 注意事项
- API 密钥安全:通过环境变量或密钥管理工具存储
- 本地模型:需要部署本地推理服务(如 Ollama)
- 性能优化:合理设置超时时间与重试策略
- 错误处理 :捕获
LangChain4jException
处理模型异常
通过本教程,您已掌握 LangChain4j 的核心概念和基础用法。接下来可以尝试:
- 构建客户服务自动回复系统
- 实现基于私有数据的文档问答机器人
- 开发自动化数据分析工具
完整示例代码可参考 LangChain4j 官方 GitHub。