第6章:基于LangChain如何开发Agents,附带客户支持智能体示例

news2025/2/23 2:34:03

本文主要介绍了 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);
}

CustomerSupportAgentConfiguration

CustomerSupportAgentConfiguration 类是一个 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 构建实用的代理系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2303713.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

传统的自动化行业的触摸屏和上位机,PLC是否会被取代?

传统的自动化行业的触摸屏和上位机是否会被取代&#xff1f; 在工业自动化领域&#xff0c;触摸屏和上位机长期扮演着核心角色&#xff0c;尤其在污水处理、化工生产等场景中&#xff0c;它们通过实时数据采集、逻辑控制、报警联动等功能&#xff0c;保障了生产设备的稳定运行…

智能合约的部署

https://blog.csdn.net/qq_40261606/article/details/123249473 编译 点击图中的 “Compile 1_Storage.sol” 存和取一个数的合约&#xff0c;remix自带 pragma solidity >0.8.2 <0.9.0; /*** title Storage* dev Store & retrieve value in a variable* custom:d…

word$deepseep

1、进入官网地址。 DeepSeek 2、进入DeepSeek的API文档 3、点击DeepSeek开放平台左侧的“API Keys”, 再点击“创建API Key” 4、在弹出的对话框中&#xff0c;输入自己的API Key名称&#xff0c;点击创建。 sk-0385cad5e19346a0a4ac8b7f0d7be428 5、打开Word文档。 6、Word找…

Mac系统下使用Docker快速部署MaxKB:打造本地知识库问答系统

随着大语言模型的广泛应用&#xff0c;知识库问答系统逐渐成为提升工作效率和个人学习的有力工具。MaxKB是一款基于LLM&#xff08;Large Language Model&#xff09;大语言模型的知识库问答系统&#xff0c;支持多模型对接、文档上传和自动爬取等功能。本文将详细介绍如何在Ma…

如何为自己的 PDF 文件添加密码?在线加密 PDF 文件其实更简单

随着信息泄露和数据安全问题的日益突出&#xff0c;保护敏感信息变得尤为重要。加密 PDF 文件是一种有效的手段&#xff0c;可以确保只有授权用户才能访问或修改文档内容。本文将详细介绍如何使用 CleverPDF 在线工具为你的 PDF 文件添加密码保护&#xff0c;确保其安全性。 为…

华为昇腾910b服务器部署DeepSeek翻车现场

最近到祸一台HUAWEI Kunpeng 920 5250&#xff0c;先看看配置。之前是部署的讯飞大模型&#xff0c;发现资源利用率太低了。把5台减少到3台&#xff0c;就出了他 硬件配置信息 基本硬件信息 按照惯例先来看看配置。一共3块盘&#xff0c;500G的系统盘&#xff0c; 2块3T固态…

hive—常用的函数整理

1、size(split(...))函数用于计算分割后字符串数组的长度 实例1&#xff09;&#xff1a;由客户编号列表计算客户编号个数 --数据准备 with tmp_test01 as ( select tag074445270 tag_id,202501busi_mon , 012399931003,012399931000 index_val union all select tag07444527…

Unity Mirror 多房间匹配

文章目录 一 、一些唠叨二 、案例位置三、多房间匹配代码解析四、关于MatchInterestManagement五、总结 一 、一些唠叨 最近使用Mirror开发了一款多人同时在线的肉鸽塔防游戏,其目的是巩固一下Mirror这个插件的熟练度,另一方面是想和身边的朋友一起玩一下自己开发的游戏. 但是…

基于flask+vue框架的的医院预约挂号系统i1616(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能:用户,医生,科室信息,就诊信息,医院概况,挂号信息,诊断信息,取消挂号 开题报告内容 基于FlaskVue框架的医院预约挂号系统开题报告 一、研究背景与意义 随着医疗技术的不断进步和人们健康意识的日益增强&#xff0c;医院就诊量逐年增加。传统的现场…

Rust编程语言入门教程(五)猜数游戏:生成、比较神秘数字并进行多次猜测

Rust 系列 &#x1f380;Rust编程语言入门教程&#xff08;一&#xff09;安装Rust&#x1f6aa; &#x1f380;Rust编程语言入门教程&#xff08;二&#xff09;hello_world&#x1f6aa; &#x1f380;Rust编程语言入门教程&#xff08;三&#xff09; Hello Cargo&#x1f…

【代码审计】-Tenda AC 18 v15.03.05.05 /goform接口文档漏洞挖掘

路由器&#xff1a;Tenda AC 18 v15.03.05.05 固件下载地址&#xff1a;https://www.tenda.com.cn/material?keywordac18 1./goform/SetSpeedWan 接口文档&#xff1a; formSetSpeedWan函数中speed_di参数缓冲区溢出漏洞&#xff1a; 使用 binwalk -eM 解包固件&#xff0c…

2025年02月21日Github流行趋势

项目名称&#xff1a;source-sdk-2013 项目地址url&#xff1a;https://github.com/ValveSoftware/source-sdk-2013项目语言&#xff1a;C历史star数&#xff1a;7343今日star数&#xff1a;929项目维护者&#xff1a;JoeLudwig, jorgenpt, narendraumate, sortie, alanedwarde…

git 克隆及拉取github项目到本地微信开发者工具,微信开发者工具通过git commit、git push上传代码到github仓库

git 克隆及拉取github项目到本地微信开发者工具&#xff0c;微信开发者工具通过git commit、git push上传代码到github仓库 git 克隆及拉取github项目到本地 先在自己的用户文件夹新建一个项目文件夹&#xff0c;取名为项目名 例如这样 C:\Users\HP\yzj-再打开一个终端页面&…

【算法基础】--前缀和

前缀和 一、一维前缀和示例模板[寻找数组的中心下标 ](https://leetcode.cn/problems/tvdfij/description/)除自身以外的数组乘积和可被k整除的子数组 一、一维前缀和 前缀和就是快速求出数组某一个连续区间内所有元素的和。 示例模板 已知一个数组arr&#xff0c;求前缀和 …

统一的多摄像头3D感知框架!PETRv2论文精读

论文地址&#xff1a;PETRv2: A Unified Framework for 3D Perception from Multi-Camera Images 源代码&#xff1a;PETR 摘要 在本文中&#xff0c;我们提出了PETRv2&#xff0c;用于从多视角图像中进行3D感知的统一框架。基于PETR [24]&#xff0c;PETRv2探索了时间建模的…

【Linux】Linux 文件系统—— 探讨软链接(symbolic link)

ℹ️大家好&#xff0c;我是练小杰&#xff0c;周五又到了&#xff0c;明天应该就是牛马的休息日了吧&#xff01;&#xff01;&#x1f606; 前天我们详细介绍了 硬链接的特点&#xff0c;现在继续探讨 软链接的特点&#xff0c;并且后续将添加更多相关知识噢&#xff0c;谢谢…

Linux-CentOS 7安装

Centos 7镜像&#xff1a;https://pan.baidu.com/s/1fkQHYT64RMFRGLZy1xnSWw 提取码: q2w2 VMware Workstation&#xff1a;https://pan.baidu.com/s/1JnRcDBIIOWGf6FnGY_0LgA 提取码: w2e2 1、打开vmware workstation 2、选择主界面的"创建新的虚拟机"或者点击左上…

AI助力下的PPT革命:DeepSeek 与Kimi的高效创作实践

清华大学出品《DeepSeek&#xff1a;从入门到精通》分享 在忙碌的职场中&#xff0c;制作一份高质量的PPT往往需要投入大量时间和精力&#xff0c;尤其是在临近截止日期时。今天&#xff0c;我们将探索如何借助 AI 工具 —— DeepSeek 和 Kimi —— 让 PPT 制作变得既快捷又高…

【opencv】图像基本操作

一.计算机眼中的图像 1.1 图像读取 cv2.IMREAD_COLOR&#xff1a;彩色图像 cv2.IMREAD_GRAYSCCALE&#xff1a;灰色图像 ①导包 import cv2 # opencv读取的格式是BGR import matplotlib.pyplot as plt import numpy as np %matplotlib inline ②读取图像 img cv2.imread(…

帆软报表FineReport入门:简单报表制作[扩展|左父格|上父格]

FineReport帮助文档 - 全面的报表使用教程和学习资料 数据库连接 点击号>>JDBC 选择要连接的数据库>>填写信息>>点击测试连接 数据库SQLite是帆软的内置数据库, 里面有练习数据 选择此数据库后,点击测试连接即可 数据库查询 方法一: 在左下角的模板数据集…