LangChain實戰(二十一):構建自動化AI客服系統

本文是《LangChain實戰課》系列的第二十一篇,將帶領您構建一個完整的自動化AI客服系統。通過結合對話記憶、工具調用和業務知識庫,我們將創建一個能夠處理復雜客戶查詢的智能客服解決方案。

前言

在現代商業環境中,客戶服務是企業成功的關鍵因素之一。傳統客服系統往往面臨響應速度慢、人力成本高、服務時間有限等挑戰。通過結合LangChain的先進技術,我們可以構建一個智能的自動化客服系統,提供24/7的高效服務,同時保持人性化的交互體驗。

系統架構設計

核心組件

我們的自動化AI客服系統包含以下核心組件:

  1. 對話管理:處理多輪對話,維護對話上下文

  2. 工具調用:集成外部系統和API,執行具體操作

  3. 知識庫檢索:從企業文檔中檢索相關信息

  4. 意圖識別:理解用戶查詢的真實意圖

  5. 響應生成:生成自然、準確的回復

系統架構圖

用戶接口 → 對話管理器 → 意圖識別器 → 工具執行器↓           ↓知識庫檢索   外部系統集成↓           ↓響應生成器 ← 結果處理器

環境準備與安裝

首先安裝必要的依賴包:

# 安裝核心庫
pip install langchain openai python-dotenv# 安裝向量數據庫和嵌入模型
pip install chromadb sentence-transformers# 安裝文檔處理工具
pip install pymupdf python-pptx python-docx# 安裝Web框架(可選,用于API接口)
pip install flask fastapi# 安裝其他工具庫
pip install requests beautifulsoup4

設置環境變量:

export OPENAI_API_KEY="your-openai-api-key"

構建核心組件

1. 對話記憶管理

from langchain.memory import ConversationBufferWindowMemory, CombinedMemory
from langchain.schema import BaseMemory
from typing import Dict, List, Any
import jsonclass EnhancedConversationMemory:def __init__(self, k=10):# 短期記憶:保存最近k輪對話self.short_term_memory = ConversationBufferWindowMemory(memory_key="short_term",k=k,return_messages=True)# 長期記憶(簡化實現,實際應用中可以使用數據庫)self.long_term_memory = {}# 用戶信息記憶self.user_profile_memory = {}def save_conversation(self, user_id: str, query: str, response: str):"""保存對話記錄"""# 更新短期記憶self.short_term_memory.save_context({"input": query},{"output": response})# 更新長期記憶if user_id not in self.long_term_memory:self.long_term_memory[user_id] = []self.long_term_memory[user_id].append({"timestamp": self._get_timestamp(),"query": query,"response": response})def get_conversation_history(self, user_id: str, limit: int = 5) -> List[Dict]:"""獲取對話歷史"""if user_id in self.long_term_memory:return self.long_term_memory[user_id][-limit:]return []def update_user_profile(self, user_id: str, key: str, value: Any):"""更新用戶信息"""if user_id not in self.user_profile_memory:self.user_profile_memory[user_id] = {}self.user_profile_memory[user_id][key] = valuedef get_user_profile(self, user_id: str) -> Dict:"""獲取用戶信息"""return self.user_profile_memory.get(user_id, {})def get_memory_context(self, user_id: str) -> str:"""獲取記憶上下文"""context_parts = []# 添加用戶信息profile = self.get_user_profile(user_id)if profile:context_parts.append("用戶信息:")for key, value in profile.items():context_parts.append(f"- {key}: {value}")# 添加對話歷史history = self.get_conversation_history(user_id)if history:context_parts.append("對話歷史:")for i, item in enumerate(history[-3:], 1):  # 最近3條context_parts.append(f"{i}. 用戶: {item['query']}")context_parts.append(f"   助手: {item['response']}")return "\n".join(context_parts) if context_parts else "無歷史記錄"def _get_timestamp(self):"""獲取時間戳"""from datetime import datetimereturn datetime.now().isoformat()# 使用示例
memory_manager = EnhancedConversationMemory(k=8)# 模擬對話
user_id = "user_123"
memory_manager.save_conversation(user_id, "你好,我想查詢訂單狀態", "好的,請提供您的訂單號")
memory_manager.save_conversation(user_id, "訂單號是ORD123456", "正在查詢訂單ORD123456...")# 獲取記憶上下文
context = memory_manager.get_memory_context(user_id)
print("記憶上下文:\n", context)

2. 業務知識庫構建

from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import TextLoader, DirectoryLoader
import osclass BusinessKnowledgeBase:def __init__(self, persist_directory: str = "./knowledge_db"):self.embeddings = OpenAIEmbeddings()self.persist_directory = persist_directoryself.vectorstore = Noneself.text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000,chunk_overlap=200)def build_knowledge_base(self, data_directory: str):"""構建知識庫"""# 加載文檔loader = DirectoryLoader(data_directory,glob="**/*.txt",loader_cls=TextLoader)documents = loader.load()# 分割文檔texts = self.text_splitter.split_documents(documents)# 創建向量存儲self.vectorstore = Chroma.from_documents(documents=texts,embedding=self.embeddings,persist_directory=self.persist_directory)self.vectorstore.persist()print(f"知識庫構建完成,包含 {len(texts)} 個文檔塊")def load_knowledge_base(self):"""加載已有知識庫"""self.vectorstore = Chroma(persist_directory=self.persist_directory,embedding_function=self.embeddings)def search_relevant_info(self, query: str, k: int = 3) -> List[str]:"""搜索相關信息"""if self.vectorstore is None:return ["知識庫未初始化"]results = self.vectorstore.similarity_search(query, k=k)return [doc.page_content for doc in results]def add_document(self, document_path: str):"""添加新文檔到知識庫"""if self.vectorstore is None:self.load_knowledge_base()loader = TextLoader(document_path)documents = loader.load()texts = self.text_splitter.split_documents(documents)self.vectorstore.add_documents(texts)self.vectorstore.persist()print(f"添加了 {len(texts)} 個新文檔塊")# 使用示例
knowledge_base = BusinessKnowledgeBase()# 構建知識庫(第一次運行)
# knowledge_base.build_knowledge_base("./knowledge_documents")# 加載已有知識庫
knowledge_base.load_knowledge_base()# 搜索信息
results = knowledge_base.search_relevant_info("退貨政策是什么?")
print("相關知識:", results[0] if results else "未找到相關信息")

3. 工具集成系統

from langchain.tools import BaseTool
from pydantic import BaseModel, Field
from typing import Type, Optional
import requests
import jsonclass OrderQueryInput(BaseModel):order_id: str = Field(description="訂單編號")class 

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

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

相關文章

一人公司智能管理系統概述

系統概述 項目結構 Al_Compny系統采用前后端分離的全棧架構,項目根目錄下包含兩個主要子目錄:Al_Compny_backend(后端服務)和Al_Compny_frontend(前端應用)。核心功能模塊 Al_Compny系統是一個面向"一…

OpenWrt | 在 PPP 撥號模式下啟用 IPv6 功能

文章目錄一、WAN 口配置二、LAN 口配置三、IPv6 測試本文將詳細介紹 將光貓的網絡模式改成橋接之后使用路由器撥號的上網方式的情況下,在 OpenWrt 上使用 PPP 撥號模式上網時,啟用 IPv6 功能的方法。 一、WAN 口配置 首先,我們需要在 網絡 …

Java如何實現一個安全的登錄功能?

安全登錄系統完整教程 📋 目錄 項目概述技術棧安全特性項目結構核心組件詳解安全實現原理部署和運行安全最佳實踐常見問題解答進階擴展 🎯 項目概述 這是一個基于Spring Boot和Spring Security的完整安全登錄系統,專為初學者設計&#xff…

星辰誕愿——生日快樂

前言 今天這篇博客并非技術文章,而是慶祝我可愛的妹妹18歲生日以及介紹我半年以來的學習經歷 祝生網站:星辰誕愿(用戶列表里第一位就是我妹妹,希望大家能獻上自己的祝福,能分享轉發更好,我在此感謝大家。如果使用手機&…

基于STM32單片機的智能糧倉溫濕度檢測藍牙手機APP設計

基于STM32單片機的智能糧倉溫濕度檢測藍牙手機APP設計 1 系統功能介紹 本系統是一款基于STM32單片機的智能糧倉環境監測與控制裝置,核心目標是通過傳感器實時采集糧倉內的溫度和濕度信息,并結合藍牙通信模塊將數據傳輸至手機端,實現對糧倉環境…

簡單視頻轉換器 avi轉mp4

直接上代碼package com.example.videoconverter;import ws.schild.jave.Encoder; import ws.schild.jave.EncoderException; import ws.schild.jave.MultimediaObject; import ws.schild.jave.encode.AudioAttributes; import ws.schild.jave.encode.EncodingAttributes; impor…

Kafka 與 RocketMQ 核心概念與架構對比

Kafka 與 RocketMQ 核心概念與架構對比DeepSeek生成,便于記憶大概邏輯核心概念對比圖 #mermaid-svg-dEbo1XpAjfzOjvUW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-dEbo1XpAjfzOjvUW .error-icon{fill…

30分鐘深度壓測cuBLAS:從FP64到INT8全精度性能剖析

在深度學習和高性能計算領域,GPU的矩陣運算性能是衡量系統算力的核心指標之一。NVIDIA的cuBLAS庫作為CUDA平臺上最基礎的線性代數計算庫,其性能表現直接影響著上層應用的運行效率。本文將詳細介紹如何使用cublasmatmulbench工具對多GPU進行全面的性能基準…

超越模仿:探尋智能的本源

引言:超越模仿,探尋智能的本源近年來,以大語言模型(LLM)為代表的自然語言處理(NLP)技術,在模仿人類語言生成方面取得了令人矚目的成就。從流暢的對話到精煉的文本摘要,機…

ROS/ROS2課程筆記00-大綱-25-26-1

大綱 AI版 以下是基于第四代高校課程核心理念設計的《ROS2機器人程序設計(ROS2 Jazzy版)》課程大綱,突出智能互聯、跨學科融合、終身學習等特征,并融入技術賦能、生態重塑、素養導向等要求: 課程名稱:ROS…

Linux內核進程管理子系統有什么第四十六回 —— 進程主結構詳解(42)

接前一篇文章:Linux內核進程管理子系統有什么第四十五回 —— 進程主結構詳解(41) 本文內容參考: Linux內核進程管理專題報告_linux rseq-CSDN博客 《趣談Linux操作系統 核心原理篇:第三部分 進程管理》—— 劉超 《…

Linux網絡連接不上?NetworkManager提示“device not managed“!

#操作系統 #Linux #NetworkManager適用環境kylin v10Centos 8Redhat 8一、故障現象在CentOS/RHEL(同樣適用于kylin v10)系統中,管理員執行 nmcli connection up ens160 命令嘗試激活名為 ens160 的網絡連接時,遇到以下錯誤:[roo…

【系統分析師】第2章-基礎知識:數學與工程基礎(核心總結)

更多內容請見: 備考系統分析師-專欄介紹和目錄 文章目錄 一、數學統計基礎 1.1 概率論基礎 1.2 數理統計基礎 1.3 常用統計分析方法 二、圖論應用 2.1 基本概念 2.2 核心算法與應用 三、預測與決策 3.1 預測方法 3.2 決策方法 四、數學建模 4.1 建模過程 4.2 常用模型類型 五、…

StrUtil.isBlank()

這段代碼是一個條件判斷,用于檢查變量 shopJson 是否為空或空白,如果是,就直接返回 null。我們來逐句講解:原始代碼: if(StrUtil.isBlank(shopJson)) {// 3.存在,直接返回return null; }逐句解釋&#xff1…

mysql 回表查詢(二次查詢,如何檢查,如何規避)

h5打開以查看 “回表查詢”通常發生在使用二級索引(Secondary Index)的查詢中。當查詢所需的數據列并不全部包含在二級索引中時,即使使用了索引,MySQL 也需要根據索引記錄中的主鍵值,回到聚簇索引(Cluster…

深度學習(二):神經元與神經網絡

在人工智能的浪潮中,神經網絡(Neural Networks)無疑是驅動核心技術的引擎,它賦予了計算機前所未有的學習和識別能力。而這一切的起點,是受到生物大腦中基本單元——神經元(Neurons)的深刻啟發。…

JavaScript 行為型設計模式詳解

1. 觀察者模式1.1. 使用場景觀察者模式用于對象間的一對多依賴關系,當一個對象的狀態發生變化時,所有依賴于它的對象都能收到通知并自動更新。常用于事件處理、通知系統。在前端中,觀察者模式用于實現事件監聽、數據綁定等功能。1.2. 代碼實現…

指令查找表LUT

本文整理自22. FlexSPI—讀寫外部SPI NorFlash — [野火]i.MX RT庫開發實戰指南——基于i.MXRT1052 文檔 用作個人學習和分享 指令查找表LUT 訪問FLASH存儲器通常包含一些讀寫功能的的控制指令,主控設備可通過這些指令訪問FLASH存儲器。 為了適應這種需求&#…

uv使用指南

🚀 Python 打包工具 UV 使用指南 UV 是一個用 Rust 編寫的極速 Python 包管理器和解析器,旨在成為 pip、pip-tools、virtualenv 等工具的單一替代方案。 📋 目錄 核心概念與設計哲學安裝與配置基礎使用方法項目管理與工作流高級功能與技巧…

安卓學習 之 圖片控件和圖片按鈕

今天學習的是ImageView 和 ImageButton這兩個控件還是比較簡單的:先來看看最后的樣式圖片吧:從圖片中可以看到ImageView中的圖片要大很多,這是因為中的ImageView中的圖片跟ImageView控件的大小而自動調整。Imag…