第6章:基于LangChain如何开发Agents,附带客户支持智能体示例
- 创业
- 2025-08-24 23:18:02

本文主要介绍了 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; // 构造函数,注入 BookingService public BookingTools(BookingService bookingService) { this.bookingService = bookingService; } // 工具方法,获取预订详情 @Tool public Booking getBookingDetails(String bookingNumber, String customerName, String customerSurname) { return bookingService.getBookingDetails(bookingNumber, customerName, customerSurname); } // 工具方法,取消预订 @Tool public 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); } CustomerSupportAgentConfigurationCustomerSupportAgentConfiguration 类是一个 Spring 配置类,主要用于配置客户支持代理所需的各种组件和服务。以下是该类的主要功能和配置:
@Configuration public class CustomerSupportAgentConfiguration { // 配置聊天记忆提供者 @Bean ChatMemoryProvider chatMemoryProvider(Tokenizer tokenizer) { return memoryId -> TokenWindowChatMemory.builder() .id(memoryId) .maxTokens(5000, tokenizer) .build(); } // 配置嵌入模型 @Bean EmbeddingModel embeddingModel() { // 不是最好的嵌入模型,但对于这个演示来说已经足够了 return new AllMiniLmL6V2EmbeddingModel(); } // 配置嵌入存储 @Bean EmbeddingStore<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; // 构造函数,注入 CustomerSupportAgent public 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 构建实用的代理系统。
第6章:基于LangChain如何开发Agents,附带客户支持智能体示例由讯客互联创业栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“第6章:基于LangChain如何开发Agents,附带客户支持智能体示例”