第6章:基于LangChain如何開發Agents,附帶客戶支持智能體示例

本文主要介紹了 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 構建實用的代理系統。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70284.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70284.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70284.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android 中使用 FFmpeg 進行音視頻處理

1. FFmpeg 基礎知識 1.1 什么是 FFmpeg? FFmpeg 是一個開源的多媒體處理工具,支持音視頻的編碼、解碼、轉碼、裁剪、合并、濾鏡、流媒體等功能。它是一個命令行工具,支持多種音視頻格式和編解碼器。1.2 為什么在 Android 中使用 FFmpeg? Android 自帶的多媒體 API(如 Med…

Matplotlib 高級圖表繪制與交互式可視化(ipywidgets)

目錄: ipywidgets 介紹 1. 什么是 ipywidgets 直接開始: 動態調整正弦波頻率 隨機散點圖 啟用交互式模式 使用滑塊和下拉菜單調整圖表樣式 使用布局管理器創建復雜界面 使用動畫創建動態圖表 最后: 綜合示例:動態儀表盤 ipywidgets 介紹 1. 什么是 ipywidgets i…

【FAQ】HarmonyOS SDK 閉源開放能力 —Live View Kit (1)

1.問題描述&#xff1a; 客戶端創建實況窗后&#xff0c;通過Push kit更新實況窗內容&#xff0c;這個過程是自動更新的還是客戶端解析push消息數據后填充數據更新&#xff1f;客戶端除了接入Push kit和創建實況窗還需要做什么工作&#xff1f; 解決方案&#xff1a; 通過Pu…

uvm中的激勵是如何發送出去的

在UVM中&#xff0c;Sequence生成的激勵&#xff08;Transaction&#xff09;通過以下協作流程發送到Driver并最終驅動到DUT&#xff0c;其核心機制如下&#xff1a; --------------- --------------- ------------ ----- | Sequence | → | Seque…

SpringAI系列 - ToolCalling篇(二) - 如何設置應用側工具參數ToolContext(有坑)

目錄 一、引言二、集成ToolContext示例步驟1: 在`@Tool`標注的工具方法中集成`ToolConext`參數步驟2:`ChatClient`運行時動態設置`ToolContext`參數三、填坑一、引言 在使用AI大模型的工具調用機制時,工具參數都是由大模型解析用戶輸入上下文獲取的,由大模型提供參數給本地…

【RabbitMQ業務冪等設計】RabbitMQ消息是冪等的嗎?

在分布式系統中&#xff0c;RabbitMQ 自身不直接提供消息冪等性保障機制&#xff0c;但可通過業務邏輯設計和技術組合實現消息處理的冪等性。以下是 8 種核心實現方案及最佳實踐&#xff1a; 一、消息唯一標識符 (Message Deduplication) 原理 每條消息攜帶全局唯一ID&#xff…

網絡可靠性要求

目錄 一、背景介紹 二、環路引發的危害 1、廣播風暴 2、MAC 地址表震蕩 三、STP生成樹 1、STP的作用 2、STP工作過程 3、根橋選舉 4、根端口選舉 5、指定端口選舉 6、BPDU報文分析 7、計時器 8、端口狀態轉化 總結 一、背景介紹 為了提高網絡可靠性&#xff0c;交換網絡…

《STL 六大組件之容器探秘:深入剖析 string》

目錄 一、string 類簡介二、string 類的常用接口1. 構造函數&#xff08;constructor function&#xff09;2. 與容量相關的接口&#xff08;capacity&#xff09;3. 與迭代器有關的接口&#xff08;iterator&#xff09;4. 與元素訪問有關的接口&#xff08;element access&am…

Unreal5從入門到精通之在編輯器中更新 UserWidgets

前言 在虛幻中創建越來越復雜和靈活的 UserWidget 藍圖時,一個問題是它們在編輯器中的外觀與它們在游戲中的最終外觀可能有很大不同。 庫存面板示例 假設你想創建一個通用的庫存顯示小部件。我們可以在整個 UI 中使用它,無論我們需要在哪里顯示某些內容。 標題,描述所顯示…

計算機網絡-OSI七層參考模型與數據封裝,網絡安全零基礎入門到精通實戰教程!

目錄 一、網絡 1、網絡的定義 2、網絡的分類 3、網絡的作用 4、網絡的數據傳輸方式 5、網絡的數據通訊方式 二、OSI七層參考模型 1、網絡參考模型定義 2、分層的意義 3、分層與功能 4、TCP\IP五層模型 三、參考模型的協議 1、物理層 2、數據鏈路層 3、網絡層 4…

Python正則替換終極指南:用re.sub玩轉字符串魔法

Python正則替換終極指南&#xff1a;用re.sub玩轉字符串魔法 一、為什么re.sub是文本處理的瑞士軍刀&#xff1f; 在Python的re模塊中&#xff0c;re.sub()的周下載量突破5800萬次&#xff08;2025年PyPI數據&#xff09;&#xff0c;它實現了&#xff1a; &#x1f4cd; 模…

gen_gauss_filter用于檢測帶方向的線條

目錄 一、核心參數分析 1.1 方向覆蓋范圍 1.2 濾波器方向帶寬 二、角度配置建議 三、參數選擇依據 四、實施建議 五、模擬圖測試(項目圖檔不好直接分享) 5.1 模擬圖制作 5.2 檢測偽代碼 在Halcon中使用高斯濾波器檢測多方向線條時,角度參數的選取需要綜合考慮濾波…

C++17 中的 std::to_chars 和 std::from_chars:高效且安全的字符串轉換工具

文章目錄 1. 傳統轉換方法的局限性2. std::to_chars&#xff1a;數值到字符串的高效轉換函數原型&#xff1a;返回值&#xff1a;示例代碼&#xff1a;輸出&#xff1a; 3. std::from_chars&#xff1a;字符串到數值的高效解析函數原型&#xff1a;返回值&#xff1a;示例代碼&…

深入學習解析:183頁可編輯PPT華為市場營銷MPR+LTC流程規劃方案

華為終端正面臨銷售模式轉型的關鍵時刻&#xff0c;旨在通過構建MPRLTC項目&#xff0c;以規避對運營商定制的過度依賴&#xff0c;并探索新的增長路徑。項目核心在于建設一套全新的銷售流程與IT系統&#xff0c;支撐雙品牌及自有品牌的戰略發展。 項目總體方案聚焦于四大關鍵議…

Python正則表達式處理中日韓字符過濾全解析

Python正則表達式處理中日韓字符過濾全解析 一、核心原理&#xff1a;Unicode字符范圍定位 中日韓字符在Unicode中的分布&#xff1a; 中文&#xff1a;\u4e00-\u9fff&#xff08;基本區&#xff09; \u3400-\u4dbf&#xff08;擴展A區&#xff09; \U00020000-\U0002a6df…

基于WOA鯨魚優化的WSN網絡最優節點部署算法matlab仿真

目錄 1.程序功能描述 2.測試軟件版本以及運行結果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 鯨魚優化算法&#xff08;WOA&#xff09;是一種模擬座頭鯨捕食行為的元啟發式優化算法。其主要原理基于座頭鯨獨特的 “氣泡網” 捕食策略&#xff0c;通過數學模…

【數據分析】3 數據分析成長之路

職業發展路徑&#xff1a; 向上發展&#xff08;技術方向&#xff09;&#xff1a;可以詳細說明成為數據科學家或專家所需的具體技能和步驟&#xff0c;包括學習的算法、工具等。向下發展&#xff08;業務方向&#xff09;&#xff1a;可以探討結合業務知識的具體領域&#xff…

excel導入Mysql中時間格式異常

問題描述&#xff1a; 當使用xls/xlsx/csv導入mysql中&#xff0c;如果列是時間類型比如excel表中顯示2024/02/20 09:18:00&#xff0c;導入后時間可能就會變成1900-01-01 09:18:00這樣。 問題原因&#xff1a; 這是由于excel表中和數據庫中的時間類型不匹配導致。 問題解決…

async checkpointing

Reducing Model Checkpointing Times by Over 10x with PyTorch Distributed Asynchronous Checkpointing | PyTorch 最初來源&#xff1a;IBM Research 核心思想&#xff1a;GPU->CPU&#xff0c;用的是blocking&#xff1b;CPU->Disk&#xff0c;用的是異步不阻塞訓練…

Nginx穩定版最新1.26.2源碼包安裝【保姆級教學】

Nginx安裝及配置 開源Nginx官網地址(https://nginx.org) Nginx源碼包下載地址(https://nginx.org/en/download.html) Mainline version 主線版本 Stable version 穩定版本 Legacy versions 陳舊版本 下載Nginx源碼文件 curl -O https://nginx.org/download/nginx-1.26.2.t…