本文是《LangChain實戰課》系列的第二十一篇,將帶領您構建一個完整的自動化AI客服系統。通過結合對話記憶、工具調用和業務知識庫,我們將創建一個能夠處理復雜客戶查詢的智能客服解決方案。
前言
在現代商業環境中,客戶服務是企業成功的關鍵因素之一。傳統客服系統往往面臨響應速度慢、人力成本高、服務時間有限等挑戰。通過結合LangChain的先進技術,我們可以構建一個智能的自動化客服系統,提供24/7的高效服務,同時保持人性化的交互體驗。
系統架構設計
核心組件
我們的自動化AI客服系統包含以下核心組件:
-
對話管理:處理多輪對話,維護對話上下文
-
工具調用:集成外部系統和API,執行具體操作
-
知識庫檢索:從企業文檔中檢索相關信息
-
意圖識別:理解用戶查詢的真實意圖
-
響應生成:生成自然、準確的回復
系統架構圖
用戶接口 → 對話管理器 → 意圖識別器 → 工具執行器↓ ↓知識庫檢索 外部系統集成↓ ↓響應生成器 ← 結果處理器
環境準備與安裝
首先安裝必要的依賴包:
# 安裝核心庫
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