本文主要介紹了 LangChain4j 中的 Agent(代理) 概念,以及如何使用 LangChain4j 構建代理系統,重點提供了一個客戶支持系統的智能體樣例
代理(Agents)| LangChain4j
注意: 請注意,“Agent(代理)”是一個非常寬泛的術語,具有多種定義。
概述
代理(Agent)
大多數基本的“代理”功能可以通過高層次的 AI Service 和 Tool APIs 構建。
如果你需要更多的靈活性,可以使用LangChain基礎組件的以下 API:
- ChatLanguageModel(聊天語言模型)
- ToolSpecification(工具規范)
- ChatMemory(聊天記憶)
多代理系統(Multi-Agent)
LangChain4j 不支持像 AutoGen 或 CrewAI 那樣的高層次“代理”抽象來構建多代理系統。
然而,你仍然可以通過基礎的 ChatLanguageModel、ToolSpecification 和 ChatMemory API 構建多代理系統。
示例(Examples)
客戶支持代理(Customer Support Agent):一個用于客戶支持的代理示例,展示如何利用 LangChain4j 構建能夠處理用戶問題并調用工具的智能代理。
整體項目結構如下
pom.xml:
項目的 Maven 配置文件,定義了項目的依賴、插件和構建配置。
該項目依賴于 Spring Boot 和一些 langchain4j 的庫。
主代碼目錄 (java):
dev.langchain4j.example.booking
包含與預訂相關的類,如 Booking, BookingService, Customer 等。
dev.langchain4j.example
包含主要的應用程序類和配置類,如 CustomerSupportAgentApplication, CustomerSupportAgentConfiguration, CustomerSupportAgentController 等。
資源文件目錄 (resources):
application.properties 包含 Spring Boot 應用程序的配置。
miles-of-smiles-terms-of-use.txt 是一個示例文檔,用于演示嵌入存儲的功能。
測試代碼目錄 (java):
包含測試類
如 CustomerSupportAgentIT,用于集成測試。
utils
包含一些輔助類,用于測試斷言。
測試資源文件目錄 (resources):
test.http 包含一些 HTTP 請求示例,用于測試 API。
核心代碼解析
BookingService 核心業務類
@Component
public class BookingService {// 模擬的客戶信息private static final Customer CUSTOMER = new Customer("John", "Doe");// 模擬的預訂編號private static final String BOOKING_NUMBER = "MS-777";// 模擬的預訂信息private static final Booking BOOKING = new Booking(BOOKING_NUMBER,LocalDate.of(2025, 12, 13),LocalDate.of(2025, 12, 31),CUSTOMER);// 模擬的預訂存儲private static final Map<String, Booking> BOOKINGS = new HashMap<>() {{put(BOOKING_NUMBER, BOOKING);}};// 獲取預訂詳情public Booking getBookingDetails(String bookingNumber, String customerName, String customerSurname) {ensureExists(bookingNumber, customerName, customerSurname);// 模擬數據庫查找return BOOKINGS.get(bookingNumber);}// 取消預訂public void cancelBooking(String bookingNumber, String customerName, String customerSurname) {ensureExists(bookingNumber, customerName, customerSurname);// 模擬預訂取消BOOKINGS.remove(bookingNumber);}// 確保預訂存在private void ensureExists(String bookingNumber, String customerName, String customerSurname) {// 模擬數據庫查找Booking booking = BOOKINGS.get(bookingNumber);if (booking == null) {throw new BookingNotFoundException(bookingNumber);}Customer customer = booking.customer();if (!customer.name().equals(customerName)) {throw new BookingNotFoundException(bookingNumber);}if (!customer.surname().equals(customerSurname)) {throw new BookingNotFoundException(bookingNumber);}}
}
BookingTools 工具類
這個類主要用于與智能體建立連接,將核心業務方法通過@Tool注入工具庫
package dev.langchain4j.example;import dev.langchain4j.agent.tool.Tool;
import dev.langchain4j.example.booking.Booking;
import dev.langchain4j.example.booking.BookingService;
import org.springframework.stereotype.Component;@Component
public class BookingTools {private final BookingService bookingService;// 構造函數,注入 BookingServicepublic BookingTools(BookingService bookingService) {this.bookingService = bookingService;}// 工具方法,獲取預訂詳情@Toolpublic Booking getBookingDetails(String bookingNumber, String customerName, String customerSurname) {return bookingService.getBookingDetails(bookingNumber, customerName, customerSurname);}// 工具方法,取消預訂@Toolpublic void cancelBooking(String bookingNumber, String customerName, String customerSurname) {bookingService.cancelBooking(bookingNumber, customerName, customerSurname);}
}
CustomerSupportAgent 客戶支持智能體
在這個類中,通過Prompt提示詞模版技術,定義了提示詞,和參數構建了一個系統消息,定義了客戶支持代理的行為和規則
package dev.langchain4j.example;import dev.langchain4j.service.MemoryId;
import dev.langchain4j.service.Result;
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.spring.AiService;@AiService
public interface CustomerSupportAgent {// 系統消息,定義了客戶支持代理的行為和規則@SystemMessage("""你的名字是 Roger,你是一個名為 'Miles of Smiles' 的汽車租賃公司的客戶支持代理。你友好、禮貌且簡潔。你必須遵守的規則:1. 在獲取預訂詳情或取消預訂之前,你必須確保知道客戶的名字、姓氏和預訂編號。2. 當被要求取消預訂時,首先確保預訂存在,然后要求明確的確認。取消預訂后,總是說 "我們希望很快能再次歡迎您"。3. 你應該只回答與 Miles of Smiles 業務相關的問題。當被問及與公司業務無關的問題時,道歉并說你無法提供幫助。今天是 {{current_date}}。""")Result<String> answer(@MemoryId String memoryId, @UserMessage String userMessage);
}
CustomerSupportAgentConfiguration
CustomerSupportAgentConfiguration 類是一個 Spring 配置類,主要用于配置客戶支持代理所需的各種組件和服務。以下是該類的主要功能和配置:
@Configuration
public class CustomerSupportAgentConfiguration {// 配置聊天記憶提供者@BeanChatMemoryProvider chatMemoryProvider(Tokenizer tokenizer) {return memoryId -> TokenWindowChatMemory.builder().id(memoryId).maxTokens(5000, tokenizer).build();}// 配置嵌入模型@BeanEmbeddingModel embeddingModel() {// 不是最好的嵌入模型,但對于這個演示來說已經足夠了return new AllMiniLmL6V2EmbeddingModel();}// 配置嵌入存儲@BeanEmbeddingStore<TextSegment> embeddingStore(EmbeddingModel embeddingModel, ResourceLoader resourceLoader) throws IOException {// 通常,你的嵌入存儲已經填充了你的數據。// 然而,為了演示的目的,我們將:// 1. 創建一個內存中的嵌入存儲EmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>();// 2. 加載一個示例文檔("Miles of Smiles" 使用條款)Resource resource = resourceLoader.getResource("classpath:miles-of-smiles-terms-of-use.txt");Document document = loadDocument(resource.getFile().toPath(), new TextDocumentParser());// ...existing code...}
}
聊天記憶提供者配置:
- 定義了一個 ChatMemoryProvider Bean,用于提供聊天記憶。它使用 TokenWindowChatMemory 來管理聊天記憶,并設置了最大令牌數為 5000。
嵌入模型配置:
- 定義了一個 EmbeddingModel Bean,使用 AllMiniLmL6V2EmbeddingModel 作為嵌入模型。雖然這不是最好的嵌入模型,但對于演示目的已經足夠。
嵌入存儲配置:
- 定義了一個 EmbeddingStore Bean,用于存儲嵌入數據。
- 加載了一個示例文檔(“Miles of Smiles” 使用條款),并將其分割成 100 個令牌的段落。
- 使用 EmbeddingStoreIngestor 自動將文檔段落轉換為嵌入,并存儲到嵌入存儲中。
- 該類通過配置這些組件,確保客戶支持代理能夠有效地處理和存儲嵌入數據,并提供必要的聊天記憶功能。
CustomerSupportAgentController 對外接口
CustomerSupportAgentController 類定義了對外的接口
@RestController
public class CustomerSupportAgentController {private final CustomerSupportAgent customerSupportAgent;// 構造函數,注入 CustomerSupportAgentpublic CustomerSupportAgentController(CustomerSupportAgent customerSupportAgent) {this.customerSupportAgent = customerSupportAgent;}// 處理 GET 請求,調用客戶支持代理的 answer 方法@GetMapping("/customerSupportAgent")public String customerSupportAgent(@RequestParam String sessionId, @RequestParam String userMessage) {Result<String> result = customerSupportAgent.answer(sessionId, userMessage);return result.content();}
}
以上是整個項目核心的部分,具體源碼如下
客戶支持系統智能體源碼
總結
本文簡要介紹了 LangChain4j 中的“代理”概念,并提供了構建代理的兩種方法:使用高層次的 AI Service 和 Tool APIs,或者使用低層次的 ChatLanguageModel、ToolSpecification 和 ChatMemory API。雖然 LangChain4j 不直接支持高層次的多代理系統,但開發者可以通過低層次 API 手動實現。文章還提到了一個具體的示例——客戶支持代理,展示了如何利用 LangChain4j 構建實用的代理系統。