【微服務】SpringBoot整合LangChain4j 操作AI大模型實戰詳解
一、前言
隨著人工智能技術的飛速發展,AI大模型已經在眾多領域展現出強大的能力,為業務拓展和商業價值提升帶來了新的機遇。SpringBoot作為一款廣受歡迎的Java微服務框架,以其簡潔、高效的特點深受開發者喜愛。而LangChain4j作為一款專注于AI大模型集成的開源庫,為Java開發者提供了一種簡單且高效的方式來接入和利用各種AI大模型。本文將詳細介紹如何在SpringBoot中整合LangChain4j,實現對AI大模型的操作,幫助讀者快速上手并應用到實際項目中。
二、LangChain4j概述
(一)LangChain4j介紹
LangChain4j是一款基于Java的輕量級框架,專為Java開發者設計,旨在簡化大型語言模型(LLMs)在Java應用中的集成。它借鑒了Python版LangChain的設計理念,提供了豐富的工具和組件,幫助開發者快速構建基于LLMs的應用程序,如聊天機器人、問答系統、文本生成等。
(二)主要特點
- 模塊化架構:允許開發者根據需要選擇和使用特定功能,如模型集成、數據加載、鏈式調用等。
- 支持多種LLM提供商:如OpenAI、Hugging Face等,方便切換和集成不同模型。
- 提供鏈式調用功能:允許將多個任務串聯,如文本生成后自動進行情感分析。
- 內置多種數據加載器和處理器:支持從不同來源加載數據并進行預處理。
- 提供豐富的API和擴展點:開發者可以自定義組件以滿足特定需求。
(三)核心組件
LangChain4j的核心組件包括語言模型(Language Model)、記憶(Memory)、工具(Tool)等。其中,語言模型是核心,負責生成文本;記憶用于存儲對話歷史,以便模型能夠進行上下文相關的回答;工具則可以擴展模型的能力,例如進行搜索、調用API等。
(四)核心優勢
- 簡單易用:提供了簡潔的API,方便開發者快速上手。
- 靈活性高:支持多種語言模型和工具,可以根據需求靈活組合。
- 安全性強:提供了API Key管理等功能,保障數據安全。
(五)核心應用場景
LangChain4j適用于多種場景,包括但不限于:
- 聊天機器人:通過對話能力實現智能客服、虛擬助手等。
- 問答系統:結合知識庫,提供準確的問答服務。
- 文本生成:生成文章、故事、代碼等。
三、SpringBoot整合LangChain4j
(一)前置準備
-
獲取API Key
- 如果使用OpenAI的模型,需要在OpenAI官網注冊賬號并獲取API Key。
- 將API Key存儲在環境變量或配置文件中,避免直接寫在代碼里。
-
導入基礎依賴
- 在
pom.xml
文件中添加LangChain4j相關依賴。例如,使用OpenAI的模型時,需要添加以下依賴:<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-core</artifactId><version>最新版本號</version></dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-open-ai</artifactId><version>最新版本號</version></dependency> </dependencies>
- 在
-
添加配置文件
- 在
application.properties
或application.yml
文件中配置語言模型的關鍵參數。以OpenAI為例:langchain4j.openai.apiKey=你的OpenAI API Key
- 在
(二)對話能力使用
1. Low Level API使用
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;@Service
public class ChatService {private final ChatLanguageModel chatModel;public ChatService() {this.chatModel = new OpenAiChatModel();}public String chat(String userMessage) {return chatModel.generate(userMessage);}
}
2. High Level API使用
import dev.langchain4j.chain.ConversationalRetrievalChain;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import org.springframework.stereotype.Service;@Service
public class ChatService {private final ChatLanguageModel model;public ChatService() {model = new OpenAiChatModel();}public String chat(String userMessage) {ConversationalRetrievalChain chain = ConversationalRetrievalChain.builder().chatLanguageModel(model).build();return chain.execute(userMessage);}
}
3. 設置角色
import dev.langchain4j.template.PromptTemplate;
import org.springframework.stereotype.Service;@Service
public class PromptService {private final PromptTemplate promptTemplate = PromptTemplate.from("你是一個{{role}},請用專業的角度回答:{{question}}");private final ChatLanguageModel chatModel;public PromptService(ChatLanguageModel chatModel) {this.chatModel = chatModel;}public String getResponse(String role, String question) {String prompt = promptTemplate.apply(Parameters.from("role", role,"question", question));return chatModel.generate(prompt);}
}
(三)會話記憶
1. Low Level API的實現
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;@Service
public class ChatService {private final ChatLanguageModel chatModel;private final MessageWindowChatMemory memory;public ChatService() {this.chatModel = new OpenAiChatModel();this.memory = MessageWindowChatMemory.builder().maxMessages(50).build();}public String chat(String userMessage) {memory.add(UserMessage.from(userMessage));String response = chatModel.generate(memory.messages());memory.add(AiMessage.from(response));return response;}
}
2. High Level API的實現
import dev.langchain4j.chain.ConversationalRetrievalChain;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;@Service
public class ChatService {private final ChatLanguageModel model;private final MessageWindowChatMemory memory;public ChatService() {model = new OpenAiChatModel();memory = MessageWindowChatMemory.builder().maxMessages(50).build();}public String chat(String userMessage) {ConversationalRetrievalChain chain = ConversationalRetrievalChain.builder().chatLanguageModel(model).chatMemory(memory).build();return chain.execute(userMessage);}
}
(四)Function Calling
1. 核心概念
Function Calling允許模型調用外部函數來獲取數據或執行操作。例如,模型可以調用一個搜索API來獲取最新的信息。
2. 應用場景
- 聯網搜索:模型可以通過調用搜索API獲取實時信息。
- 調用外部API:例如調用天氣API獲取天氣信息。
3. 案例代碼
import dev.langchain4j.agent.Agent;
import dev.langchain4j.agent.AgentToolCall;
import dev.langchain4j.agent.AgentToolCallResult;
import dev.langchain4j.agent.ToolCall;
import dev.langchain4j.agent.ToolCallResult;
import dev.langchain4j.agent.tool.Tool;
import dev.langchain4j.agent.tool.ToolRegistry;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import org.springframework.stereotype.Service;@Service
public class FunctionCallingService {private final ChatLanguageModel model;private final ToolRegistry toolRegistry;public FunctionCallingService() {model = new OpenAiChatModel();toolRegistry = new ToolRegistry();}public String execute(String userMessage) {Agent agent = Agent.builder().chatLanguageModel(model).toolRegistry(toolRegistry).build();return agent.execute(userMessage);}@Tool(name = "search", description = "搜索信息")public String search(String query) {// 實現搜索邏輯,例如調用外部搜索APIreturn "搜索結果:" + query;}@Tool(name = "weather", description = "獲取天氣信息")public String getWeather(String location) {// 實現獲取天氣信息的邏輯return "天氣信息:" + location;}
}
(五)RAG(Retrieval-Augmented Generation)
1. 核心概念
RAG是一種結合檢索和生成的技術,通過檢索相關文檔來增強模型的生成能力。
2. 應用場景
- 問答系統:結合知識庫提供準確答案。
- 文檔輔助寫作:根據文檔內容生成相關內容。
3. 案例代碼
import dev.langchain4j.chain.RetrievalAugmentedGenerationChain;
import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.DocumentLoader;
import dev.langchain4j.data.document.FileDocumentLoader;
import dev.langchain4j.data.segment.TextSegmenter;
import dev.langchain4j.data.segment.TextSegmenterFactory;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.retrieval.Retriever;
import dev.langchain4j.retrieval.vectorstore.VectorStoreRetriever;
import dev.langchain4j.vectorstore.VectorStore;
import dev.langchain4j.vectorstore.VectorStoreFactory;@Service
public class RagService {private final ChatLanguageModel model;private final Retriever retriever;public RagService() {model = new OpenAiChatModel();VectorStore vectorStore = VectorStoreFactory.create();retriever = new VectorStoreRetriever(vectorStore);}public String rag(String userMessage) {RetrievalAugmentedGenerationChain chain = RetrievalAugmentedGenerationChain.builder().chatLanguageModel(model).retriever(retriever).build();return chain.execute(userMessage);}public void loadDocuments() {DocumentLoader documentLoader = new FileDocumentLoader("path/to/documents");List<Document> documents = documentLoader.load();TextSegmenter segmenter = TextSegmenterFactory.create();List<TextSegment> segments = segmenter.segment(documents);retriever.add(segments);}
}
(六)工具調用
1. 核心概念
工具調用允許模型調用外部工具來完成任務,例如調用API、執行命令等。
2. 應用場景
- 調用API:例如調用天氣API獲取天氣信息。
- 執行命令:例如調用系統命令執行操作。
3. 案例代碼
import dev.langchain4j.agent.Agent;
import dev.langchain4j.agent.AgentToolCall;
import dev.langchain4j.agent.AgentToolCallResult;
import dev.langchain4j.agent.ToolCall;
import dev.langchain4j.agent.ToolCallResult;
import dev.langchain4j.agent.tool.Tool;
import dev.langchain4j.agent.tool.ToolRegistry;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import org.springframework.stereotype.Service;@Service
public class ToolCallingService {private final ChatLanguageModel model;private final ToolRegistry toolRegistry;public ToolCallingService() {model = new OpenAiChatModel();toolRegistry = new ToolRegistry();}public String execute(String userMessage) {Agent agent = Agent.builder().chatLanguageModel(model).toolRegistry(toolRegistry).build();return agent.execute(userMessage);}@Tool(name = "search", description = "搜索信息")public String search(String query) {// 實現搜索邏輯,例如調用外部搜索APIreturn "搜索結果:" + query;}@Tool(name = "weather", description = "獲取天氣信息")public String getWeather(String location) {// 實現獲取天氣信息的邏輯return "天氣信息:" + location;}
}
(七)自定義模型
1. 核心概念
自定義模型允許開發者根據需求實現自己的語言模型,例如使用本地模型或自定義邏輯。
2. 應用場景
- 使用本地模型:例如使用本地的Transformer模型。
- 自定義邏輯:例如實現特定的文本生成邏輯。
3. 案例代碼
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.chat.ChatMessage;
import dev.langchain4j.model.chat.ChatResponse;
import org.springframework.stereotype.Service;@Service
public class CustomModelService {private final ChatLanguageModel customModel;public CustomModelService() {customModel = new CustomChatModel();}public String generate(String prompt) {return customModel.generate(prompt);}public static class CustomChatModel implements ChatLanguageModel {@Overridepublic ChatResponse generate(List<ChatMessage> messages) {// 實現自定義邏輯String response = "自定義模型生成的響應";return ChatResponse.builder().message(AiMessage.from(response)).build();}}
}
(八)自定義工具
1. 核心概念
自定義工具允許開發者根據需求實現自己的工具,例如調用外部API或執行特定操作。
2. 應用場景
- 調用外部API:例如調用天氣API獲取天氣信息。
- 執行特定操作:例如調用系統命令執行操作。
3. 案例代碼
import dev.langchain4j.agent.Agent;
import dev.langchain4j.agent.AgentToolCall;
import dev.langchain4j.agent.AgentToolCallResult;
import dev.langchain4j.agent.ToolCall;
import dev.langchain4j.agent.ToolCallResult;
import dev.langchain4j.agent.tool.Tool;
import dev.langchain4j.agent.tool.ToolRegistry;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import org.springframework.stereotype.Service;@Service
public class CustomToolService {private final ChatLanguageModel model;private final ToolRegistry toolRegistry;public CustomToolService() {model = new OpenAiChatModel();toolRegistry = new ToolRegistry();}public String execute(String userMessage) {Agent agent = Agent.builder().chatLanguageModel(model).toolRegistry(toolRegistry).build();return agent.execute(userMessage);}@Tool(name = "customTool", description = "自定義工具")public String customTool(String input) {// 實現自定義邏輯return "自定義工具的響應:" + input;}
}
(九)自定義鏈
1. 核心概念
自定義鏈允許開發者根據需求實現自己的鏈,例如將多個任務串聯起來。
2. 應用場景
- 串聯多個任務:例如先進行文本生成,再進行情感分析。
- 實現復雜邏輯:例如根據條件選擇不同的任務。
3. 案例代碼
import dev.langchain4j.chain.Chain;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import org.springframework.stereotype.Service;@Service
public class CustomChainService {private final ChatLanguageModel model;public CustomChainService() {model = new OpenAiChatModel();}public String execute(String userMessage) {CustomChain chain = new CustomChain(model);return chain.execute(userMessage);}public static class CustomChain implements Chain {private final ChatLanguageModel model;public CustomChain(ChatLanguageModel model) {this.model = model;}@Overridepublic String execute(String input) {// 實現自定義邏輯String response = model.generate(input);// 進行后續處理return response;}}
}
四、實戰案例
(一)案例背景
假設我們正在開發一個智能客服系統,需要實現以下功能:
- 用戶可以與客服機器人進行對話。
- 客服機器人能夠根據用戶的問題提供準確的答案。
- 客服機器人能夠調用外部API獲取實時信息,例如天氣信息。
(二)項目結構
src/main/java/com/example/aiassist
├── controller
│ ├── AiController.java
├── service
│ ├── ChatService.java
│ ├── FunctionCallingService.java
│ ├── RagService.java
│ ├── ToolCallingService.java
├── model
│ ├── CustomChatModel.java
│ ├── CustomTool.java
├── config
│ ├── AppConfig.java
(三)代碼實現
1. 控制器
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/api/ai")
public class AiController {private final ChatService chatService;private final FunctionCallingService functionCallingService;private final RagService ragService;private final ToolCallingService toolCallingService;@Autowiredpublic AiController(ChatService chatService, FunctionCallingService functionCallingService, RagService ragService, ToolCallingService toolCallingService) {this.chatService = chatService;this.functionCallingService = functionCallingService;this.ragService = ragService;this.toolCallingService = toolCallingService;}@PostMapping("/chat")public String chat(@RequestBody String userMessage) {return chatService.chat(userMessage);}@PostMapping("/function-calling")public String functionCalling(@RequestBody String userMessage) {return functionCallingService.execute(userMessage);}@PostMapping("/rag")public String rag(@RequestBody String userMessage) {return ragService.rag(userMessage);}@PostMapping("/tool-calling")public String toolCalling(@RequestBody String userMessage) {return toolCallingService.execute(userMessage);}
}
2. 服務層
import dev.langchain4j.agent.Agent;
import dev.langchain4j.agent.AgentToolCall;
import dev.langchain4j.agent.AgentToolCallResult;
import dev.langchain4j.agent.ToolCall;
import dev.langchain4j.agent.ToolCallResult;
import dev.langchain4j.agent.tool.Tool;
import dev.langchain4j.agent.tool.ToolRegistry;
import dev.langchain4j.chain.ConversationalRetrievalChain;
import dev.langchain4j.chain.RetrievalAugmentedGenerationChain;
import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.DocumentLoader;
import dev.langchain4j.data.document.FileDocumentLoader;
import dev.langchain4j.data.segment.TextSegmenter;
import dev.langchain4j.data.segment.TextSegmenterFactory;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.retrieval.Retriever;
import dev.langchain4j.retrieval.vectorstore.VectorStoreRetriever;
import dev.langchain4j.vectorstore.VectorStore;
import dev.langchain4j.vectorstore.VectorStoreFactory;
import org.springframework.stereotype.Service;@Service
public class ChatService {private final ChatLanguageModel model;private final ToolRegistry toolRegistry;private final Retriever retriever;public ChatService() {model = new OpenAiChatModel();toolRegistry = new ToolRegistry();VectorStore vectorStore = VectorStoreFactory.create();retriever = new VectorStoreRetriever(vectorStore);}public String chat(String userMessage) {ConversationalRetrievalChain chain = ConversationalRetrievalChain.builder().chatLanguageModel(model).toolRegistry(toolRegistry).retriever(retriever).build();return chain.execute(userMessage);}public String functionCalling(String userMessage) {Agent agent = Agent.builder().chatLanguageModel(model).toolRegistry(toolRegistry).build();return agent.execute(userMessage);}public String rag(String userMessage) {RetrievalAugmentedGenerationChain chain = RetrievalAugmentedGenerationChain.builder().chatLanguageModel(model).retriever(retriever).build();return chain.execute(userMessage);}public String toolCalling(String userMessage) {Agent agent = Agent.builder().chatLanguageModel(model).toolRegistry(toolRegistry).build();return agent.execute(userMessage);}@Tool(name = "search", description = "搜索信息")public String search(String query) {// 實現搜索邏輯return "搜索結果:" + query;}@Tool(name = "weather", description = "獲取天氣信息")public String getWeather(String location) {// 實現獲取天氣信息的邏輯return "天氣信息:" + location;}public void loadDocuments() {DocumentLoader documentLoader = new FileDocumentLoader("path/to/documents");List<Document> documents = documentLoader.load();TextSegmenter segmenter = TextSegmenterFactory.create();List<TextSegment> segments = segmenter.segment(documents);retriever.add(segments);}
}
3. 自定義模型
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.chat.ChatMessage;
import dev.langchain4j.model.chat.ChatResponse;
import org.springframework.stereotype.Service;@Service
public class CustomChatModelService {private final ChatLanguageModel customModel;public CustomChatModelService() {customModel = new CustomChatModel();}public String generate(String prompt) {return customModel.generate(prompt);}public static class CustomChatModel implements ChatLanguageModel {@Overridepublic ChatResponse generate(List<ChatMessage> messages) {// 實現自定義邏輯String response = "自定義模型生成的響應";return ChatResponse.builder().message(AiMessage.from(response)).build();}}
}
4. 自定義工具
import dev.langchain4j.agent.Agent;
import dev.langchain4j.agent.AgentToolCall;
import dev.langchain4j.agent.AgentToolCallResult;
import dev.langchain4j.agent.ToolCall;
import dev.langchain4j.agent.ToolCallResult;
import dev.langchain4j.agent.tool.Tool;
import dev.langchain4j.agent.tool.ToolRegistry;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import org.springframework.stereotype.Service;@Service
public class CustomToolService {private final ChatLanguageModel model;private final ToolRegistry toolRegistry;public CustomToolService() {model = new OpenAiChatModel();toolRegistry = new ToolRegistry();}public String execute(String userMessage) {Agent agent = Agent.builder().chatLanguageModel(model).toolRegistry(toolRegistry).build();return agent.execute(userMessage);}@Tool(name = "customTool", description = "自定義工具")public String customTool(String input) {// 實現自定義邏輯return "自定義工具的響應:" + input;}
}
五、總結
通過本文的詳細介紹,我們已經完成了在SpringBoot中整合LangChain4j的全過程。從基礎的對話能力、會話記憶,到高級的Function Calling、RAG、工具調用和自定義功能,LangChain4j為Java開發者提供了一個強大且靈活的框架來構建基于AI大模型的應用程序。通過實戰案例,我們展示了如何將這些功能應用到實際項目中,幫助讀者更好地理解和掌握。
在實際開發中,開發者可以根據具體需求靈活選擇和組合LangChain4j提供的功能,充分發揮AI大模型的能力,為用戶提供更加智能和高效的解決方案。