智能客戶服務支持智能體

超越傳統客服機器人。智能體可以深度查詢知識庫、調用訂單系統API、甚至根據客戶情緒靈活處理退貨、退款、升級投訴等復雜流程。

案例:

客戶說:“我上周買的鞋子尺碼不對,想換貨但是找不到訂單頁面了。”

智能體行動: ① 通過用戶身份驗證;② 調用訂單查詢API找到該訂單;③ 檢查換貨政策;④ 生成換貨鏈接并指導用戶下一步操作;⑤ 若流程中斷,后續可主動發送郵件提醒。

1. 核心功能

  • 多輪對話與上下文理解:能理解并記憶對話上下文。
  • 工具調用(Tool Use):能調用外部API獲取真實數據(如訂單、用戶信息)。
  • 知識庫檢索(RAG):能從企業知識庫(如手冊、FAQ)中檢索精準信息。
  • 安全性與權限控制:驗證用戶身份,并基于身份控制數據訪問范圍
  • 人工接管(Human-in-the-loop):在無法處理或用戶要求時,無縫轉接人工客服

2. 技術棧選擇(企業級)

  • LLM(大腦): OpenAI GPT-4 Turbo (性價比和性能平衡)

  • 開發框架: LangChain / LangGraph (用于構建復雜、有狀態的智能體工作流)

  • 工具調用: LangChain Tools & Custom Functions

  • 知識庫: Chroma (向量數據庫,輕量且高效) + OpenAI Embeddings

  • 后端API: FastAPI (高性能、異步支持好,適合生產環境)

  • 身份認證: JWT Tokens

  • 數據持久化: SQL Database (PostgreSQL) for logging

  • 部署: Docker & Kubernetes (容器化便于擴展和管理)

架構設計
在這里插入圖片描述
在這里插入圖片描述

一、環境依賴

# 創建項目目錄并初始化虛擬環境
mkdir customer-support-agent
cd customer-support-agent
python -m venv venv
source venv/bin/activate  # Linux/Mac
# venv\Scripts\activate  # Windows# 安裝核心依賴
pip install openai langchain langgraph chromadb langchain-openai fastapi uvicorn python-jose[cryptography] passlib sqlalchemy psycopg2-binary pydantic

二、數據模型

models.py

  • UserIdentity - 用戶身份標識,跟蹤用戶身份和會話信息
  • AgentState - 智能體狀態管理,管理對話智能體的完整狀態,這是LangGraph框架中的核心概念
  • ConversationType - 對話類型枚舉,定義對話的意圖分類,限制可能的對話類型,便于處理后續的統計分析和邏輯分支
  • ConversationLog - 對話日志存儲:用于持久化存儲對話記錄到數據庫
from pydantic import BaseModel, Field #Pydantic: 提供數據驗證和設置管理的現代Python數據驗證庫
from typing import Optional, List, Dict, Any #typing: 用于類型注解,提高代碼可讀性和類型安全
from enum import Enum #enum: 用于定義枚舉類型,限制可能的取值class UserIdentity(BaseModel):"""用戶身份標識"""user_id: Optional[str] = None #user_id: 可選字段,用于已登錄用戶session_id: str #session_id: 必需字段,唯一標識一個對話會話is_authenticated: bool = False #is_authenticated: 標識用戶是否通過身份驗證class AgentState(BaseModel):"""LangGraph智能體的狀態"""#一個列表,列表中的每個元素都是字典,使用Field類來定義字段的詳細配置,...表示該字段是必需的,不能為空messages: List[Dict[str, Any]] = Field(..., description="對話消息歷史")user_identity: UserIdentity = Field(..., description="用戶身份信息")current_step: str = Field("greeting", description="當前對話步驟")#"greeting": 默認值,表示如果沒有提供值,就使用這個默認值#default_factory=dict: 使用工廠函數,每次創建新實例時都會調用dict()創建一個新的空字典extracted_info: Dict[str, Any] = Field(default_factory=dict, description="從對話中提取的結構化信息")class ConversationType(Enum):QUERY_ORDER = "query_order"  # 訂單查詢RETURN_EXCHANGE = "return_exchange"  # 退換貨GENERAL_QUESTION = "general_question" # 一般問題class ConversationLog(BaseModel):"""存入數據庫的對話日志"""session_id: str  # 會話標識user_id: Optional[str] # 可選用戶IDmessage: str # 用戶消息內容agent_response: str # 智能體回復內容intent: Optional[str] # 識別出的意圖timestamp: str # 時間戳success: bool  # 處理是否成功

畫外題:

#創建實例
state = AgentState(messages=[{"role": "user", "content": "你好"}],user_identity=UserIdentity(...),  # 需要提供UserIdentity實例# current_step 使用默認值 "greeting"# extracted_info 使用默認空字典
)# 訪問屬性
print(state.current_step)  # 輸出: "greeting"
print(state.extracted_info)  # 輸出: {}

在這里插入圖片描述

三、核心工具

tools.py

  • 訂單查詢工具→ AI調用query_order_tool
  • 退換貨政策查詢工具→ AI調用query_return_policy_tool
  • 復雜問題無法解決 → AI調用create_support_ticket_tool
import requests
from langchain.tools import tool #LangChain的工具裝飾器,將函數轉換為AI可調用的工具
from typing import Type
from pydantic import BaseModel, Field
import os# 1. 訂單查詢工具
class OrderQueryInput(BaseModel):order_id: str = Field(..., description="The order ID to query")#裝飾器是一種高級功能,它允許在不修改原函數代碼的情況下,為函數添加額外的功能。
#將一個普通的 Python 函數"包裝"成一個可以被 AI 大語言模型(LLM)識別和調用的工具(Tool)
#(args_schema=OrderQueryInput):這是傳遞給 @tool 裝飾器的參數,定義了工具輸入參數的名稱、類型、描述等,幫助 AI 模型理解如何正確地調用這個函數。
@tool(args_schema=OrderQueryInput)
def query_order_tool(order_id: str) -> str: # -> str::返回類型提示,表明這個函數執行完畢后會返回一個字符串(String)類型的結果"""查詢用戶訂單信息。需要先驗證用戶身份。"""# 模擬調用內部訂單系統API# 真實環境中,這里會是 requests.get(f"{ORDER_API_URL}/{order_id}", headers=...)print(f"🔍 [Tool Call] Querying order: {order_id}")# 模擬響應 創建字典 構建了一個訂單對象的詳細信息,包括產品、尺寸、日期、狀態mock_order_data = {"order_id": order_id,"product": "Running Shoes (Model X)","size": "42","order_date": "2024-09-15","status": "Delivered","customer_id": "cust_12345"}return f"Order Details: {str(mock_order_data)}"# 2. 退換貨政策查詢工具 (RAG)
@tool # @tool 裝飾器告訴AI框架:“這個函數是我(AI)可以用的一個工具”。
def query_return_policy_tool(product_category: str) -> str:"""根據產品類別查詢退換貨政策。如果用戶未指定類別,則查詢通用政策。"""# 在真實環境中,這里會從向量數據庫檢索print(f"🔍 [Tool Call] Querying return policy for: {product_category}")policies = {"general": "You can return most items within 30 days of delivery. Items must be unworn and in original packaging.","shoes": "Shoes can be exchanged for a different size within 45 days. Must have original box and no signs of wear.","electronics": "Electronics can be returned within 14 days. Must be factory reset and all accessories included."}policy = policies.get(product_category.lower(), policies["general"])return f"Our return policy for {product_category}: {policy}"# 3. 創建客服工單工具
class CreateTicketInput(BaseModel):issue_summary: str = Field(..., description="A summary of the customer's issue")priority: str = Field("medium", description="Priority of the ticket: low, medium, high")@tool(args_schema=CreateTicketInput)
def create_support_ticket_tool(issue_summary: str, priority: str = "medium") -> str:"""在第三方系統(如Zendesk、Jira)中創建支持工單。用于當智能體無法解決問題時。"""print(f"🔍 [Tool Call] Creating Support Ticket. Priority: {priority}. Issue: {issue_summary}")# 模擬創建工單的API調用ticket_id = "TICKET-0987"return f"Successfully created a support ticket for you. Your ticket ID is {ticket_id}. A human agent will contact you shortly."

生產環境改進建議

def query_order_tool(order_id:str) -> str:try:response = requests.get(r"{os.getenv('ORDER_API_URL')}/{order_id}",headers = {"Authorization": f"Bearer {os.getenv('API_TOKEN')}"},timeout = 10)return f"Order Details:{response.json()}"except requests.RequestException as e:return f"Sorry, I couldn't retrieve your order details. Error: {str(e)}"

四、構建智能體工作流

        +-------------+|   agent     |  # 決策節點+-------------+|v (條件路由)+---------+---------+|         |         |v         v         v
+-------+   END   +-------------+
| tools |         | human_agent |
+-------+         +-------------+|                   |+--------+          |v          v+-------------+|    agent    |  # 循環回到agent+-------------+

agent.py

  • 智能體決策節點,接收當前對話狀態,調用LLM會自動決定是否需要調用工具,返回AI消息到狀態中
  • 路由函數 - 核心決策邏輯
from langgraph.graph import StateGraph, END
from langgraph.prebuilt import ToolNode
from langchain_core.messages import HumanMessage, AIMessage, ToolMessage
from langchain_openai import ChatOpenAI
from models import AgentState
from tools import query_order_tool, query_return_policy_tool, create_support_ticket_tool
from typing import Literal, Dict, Any# 初始化LLM
llm = ChatOpenAI(model="gpt-4-turbo", temperature=0) #模型選擇: gpt-4-turbo 提供強大的推理能力 溫度設置: temperature=0 確保確定性輸出,適合客服場景
# 綁定工具 工具綁定: bind_tools() 讓LLM知道可用的工具及其功能
llm_with_tools = llm.bind_tools([query_order_tool, query_return_policy_tool, create_support_ticket_tool])# 定義工具節點 ToolNode 專門處理工具調用的執行
tool_node = ToolNode(tools=[query_order_tool, query_return_policy_tool, create_support_ticket_tool])def agent_step(state: AgentState):#接收當前對話狀態"""智能體決策節點"""print(f"🤖 [Agent Step] Current Step: {state['current_step']}")messages = state["messages"]response = llm_with_tools.invoke(messages) #調用LLM生成響應,LLM會自動決定是否需要調用工具return {"messages": [response]}# 返回AI消息到狀態中def route_to_tools(state: AgentState) -> Literal["tools", "end", "human_agent"]:"""路由函數,決定下一步是調用工具、結束還是轉人工"""ai_msg = state["messages"][-1]#檢查工具調用: 如果AI消息包含tool_calls,轉到"tools"節點if not hasattr(ai_msg, 'tool_calls') or len(ai_msg.tool_calls) == 0:# 如果沒有工具調用,檢查是否需要結束或轉人工if "thank you" in state["messages"][-2].content.lower():#結束條件: 用戶說"thank you"時結束對話return "end"if "human" in state["messages"][-2].content.lower():return "human_agent"return "end"return "tools"def call_human_agent(state: AgentState):"""調用創建工單工具并結束對話"""issue_summary = f"Customer requested human agent. Conversation history: {state['messages']}"tool_input = {"issue_summary": issue_summary, "priority": "medium"}result = create_support_ticket_tool.invoke(tool_input)#返回友好的轉接消息return {"messages": [AIMessage(content=f"I've escalated your issue to our human team. {result}")]}# 構建圖
workflow = StateGraph(AgentState)
workflow.add_node("agent", agent_step)
workflow.add_node("tools", tool_node)
workflow.add_node("human_agent", call_human_agent)workflow.set_entry_point("agent")
workflow.add_conditional_edges("agent",route_to_tools,{"tools": "tools","end": END,"human_agent": "human_agent"}
)
workflow.add_edge("tools", "agent")
workflow.add_edge("human_agent", END)# 編譯圖
app = workflow.compile()

實際對話示例:

用戶: "我想查詢訂單12345"
AI: (決定調用query_order_tool) → 工具節點 → 返回結果
用戶: "謝謝你的幫助"
AI: (檢測到感謝) → 結束對話用戶: "我要找人工客服"  
AI: (檢測到"human") → 轉人工節點 → 創建工單 → 結束

五、創建FastAPI后端與安全中間件

from fastapi import FastAPI, HTTPException, Depends, Header
from fastapi.middleware.cors import CORSMiddleware
from models import UserIdentity, AgentState, ConversationLog
from agent import app as agent_app
from typing import Annotated, Optional
import uuid
import datetime
import json# 初始化FastAPI應用
app = FastAPI(title="Customer Support Agent API")# 中間件:CORS(允許前端訪問)
app.add_middleware(CORSMiddleware,allow_origins=["*"],  # 生產環境應指定具體域名allow_credentials=True,allow_methods=["*"],allow_headers=["*"],
)# 模擬用戶身份驗證(生產環境應使用JWT)
async def verify_token(authorization: Annotated[Optional[str], Header()] = None) -> UserIdentity:session_id = str(uuid.uuid4())if authorization and authorization.startswith("Bearer "):token = authorization[7:]# 這里應驗證JWT token并提取user_id# 為簡單起見,我們模擬一個已驗證用戶user_identity = UserIdentity(user_id="cust_12345", session_id=session_id, is_authenticated=True)else:# 未認證用戶只有session_iduser_identity = UserIdentity(session_id=session_id, is_authenticated=False)return user_identity# API路由
@app.post("/chat")
async def chat_endpoint(message: str,user_identity: UserIdentity = Depends(verify_token)
):"""主聊天端點"""try:# 1. 初始化或獲取對話狀態(這里應使用Redis等持久化狀態,為簡單起見我們每次新建)initial_state = AgentState(messages=[HumanMessage(content=message)],user_identity=user_identity,current_step="greeting")# 2. 執行智能體圖final_state = agent_app.invoke(initial_state)# 3. 獲取最終響應agent_response = final_state["messages"][-1].content# 4. 記錄日志(應異步寫入數據庫)log_entry = ConversationLog(session_id=user_identity.session_id,user_id=user_identity.user_id,message=message,agent_response=agent_response,intent=final_state.get("current_step"),timestamp=datetime.datetime.utcnow().isoformat(),success=True)print(f"📝 Logging conversation: {log_entry.json()}")# 5. 返回響應return {"response": agent_response,"session_id": user_identity.session_id,"user_id": user_identity.user_id}except Exception as e:print(f"? Error in chat endpoint: {e}")raise HTTPException(status_code=500, detail=str(e))@app.get("/health")
async def health_check():return {"status": "OK"}if __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=8000)

六、測試智能體

import asyncio
from models import AgentState, UserIdentity
from agent import app# 模擬一個測試用戶
test_user = UserIdentity(user_id="cust_12345", session_id="test_session_001", is_authenticated=True)def test_conversation():# 模擬用戶消息:詢問訂單狀態test_messages = ["Hi, I want to check the status of my order ORD-67890"]state = AgentState(messages=[], user_identity=test_user, current_step="start")for msg in test_messages:state["messages"].append(HumanMessage(content=msg))print(f"User: {msg}")# 調用智能體state = app.invoke(state)agent_msg = state["messages"][-1]print(f"Agent: {agent_msg.content}")if hasattr(agent_msg, 'tool_calls') and agent_msg.tool_calls:print(f"Agent called tools: {agent_msg.tool_calls}")print("---")if __name__ == "__main__":test_conversation()

七、使用Docker容器化部署

FROM python:3.11-slimWORKDIR /appCOPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txtCOPY . .EXPOSE 8000CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]

docker-compose.yml

version: '3.8'
services:support-agent:build: .ports:- "8000:8000"environment:- OPENAI_API_KEY=${OPENAI_API_KEY}# 生產環境應添加以下依賴# depends_on:#   - postgres#   - redis# postgres:#   image: postgres:13#   environment:#     POSTGRES_DB: agent_db#     POSTGRES_USER: agent#     POSTGRES_PASSWORD: password# redis:#   image: redis:7-alpine

如何運行

設置環境變量:

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

啟動服務

uvicorn main:app --reload

測試API

curl -X 'POST' \'http://localhost:8000/chat' \-H 'Authorization: Bearer fake_jwt_token_for_testing' \-H 'Content-Type: application/json' \-d '{"message": "I need to return my shoes, what is your policy?"}'

在這里插入圖片描述

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

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

相關文章

【MySQL|第四篇】DQL語句(二)——數據查詢語言

4、排序分頁:(1)排序:查詢數據的時候進行排序,就是根據某個字段的值,按照升序或者降序的情況將記錄顯示出來語法: select col_name,... from tb_name order by col_name [asc|desc]注意事項&…

百度文心X1.1發布!實測深度思考能力!

文章目錄背景模型實測效果事實性指令跟隨智能體模型技術解讀基準測試文心飛槳攜手共進總結背景 9月9日,WAVE SUMMIT深度學習開發者大會上,百度首席技術官、深度學習技術及應用國家工程研究中心主任王海峰正式發布了文心大模型X1.1深度思考模型&#xff…

基于Java+SpringBoot的B站評論系統架構設計與實踐深度解析

基于JavaSpringBoot的B站評論系統架構設計與實踐深度解析 前言 作為國內領先的視頻分享平臺,B站的評論系統承載著海量用戶的實時互動需求。本文將從架構師角度,基于JavaSpringBoot技術棧,深度解析評論系統的技術實現方案、核心難點及擴展性設…

賦能數字孿生:Paraverse平行云實時云渲染平臺LarkXR,提供強大的API與SDK用于二次開發和深度集成

在數字孿生滲透千行百業的今天,構建一個高保真、實時交互、可大規模訪問的虛擬孿生世界已成為核心需求。然而,對于開發者而言,從零開始構建實時云渲染、海量模型加載、數據雙向互通、多端適配、網頁嵌套,平臺定制化等底層技術難關…

基于Nginx實現反向代理、負載均衡與動靜分離完整部署指南

基于Nginx實現反向代理、負載均衡與動靜分離完整部署指南 文章目錄基于Nginx實現反向代理、負載均衡與動靜分離完整部署指南一、架構規劃與環境準備1.1 架構設計思路1.2 服務器規劃1.3 環境依賴二、部署Nginx負載均衡器2.1 安裝Nginx依賴包2.2 創建Nginx專用用戶2.3 編譯安裝Ng…

HTML5國慶網站源碼

一. 網站概述 本國慶主題網站以弘揚愛國主義精神為核心,通過豐富多元的交互功能與視覺設計,打造沉浸式國慶體驗空間。網站采用單頁面架構,通過平滑滾動實現各模塊的無縫銜接,涵蓋首頁、知識科普、互動體驗等十大功能板塊&#xf…

MySQL收集processlist記錄的shell工具mysql_collect_processlist

文章目錄安裝指南日志文件內容日志分析參考1.簡單檢索2.統計不同狀態的語句的數量3.按照時間統計注意事項倉庫這是一個純腳本工具,用于從MySQL的information_schema.processlist視圖中定期收集數據并保存到本地日志文件。支持MYSQL5.7-9.4版本。 template copy fro…

工業RFID現場網關模塊:實現多協議互通,128臺讀寫設備互連!

隨著工業4.0進程加速,企業對生產系統集成度的需求不斷增長。在工廠中常需整合不同品牌PLC、驅動器、機械臂、讀寫器等設備系統,這其中就會涉及到如Profinet、EtherNet/IP、EtherCAT、Modbus TCP、CC-LINK IE等不同通訊協議連接。雖可將部分設備直接與PLC…

黑馬點評高級篇第7節課 輸入INFO replication 顯示0個從節點,但是在7002節點又顯示它已經是7001節點的從節點了

問題描述在黑馬點評高級篇第七節課的這個位置??????,當我輸入INFO replication 的時候下面本應該顯示為connected_slaves: 2,但是我的顯示的是0。然后當我切換到7002端口的節點時,又顯示7002就是7001的從節點解決我看彈幕上說在7002和7…

pcb線路板打樣廠家有哪些?

在電子制造產業升級浪潮中,PCB打樣環節的效率與品質直接影響產品迭代速度。本文聚焦國內五家具備核心技術競爭力的PCB打樣廠商,深度解析其差異化優勢,為硬件開發者提供精準選型參考。獵板PCB作為國家高新技術企業,獵板PCB在高頻高…

【python實用小腳本-211】[硬件互聯] 桌面壁紙×Python夢幻聯動|用10行代碼實現“開機盲盒”自動化改造實錄(建議收藏)

1. 場景故事 “作為HR,我曾每天手動換壁紙提神,直到某天忙到忘記,結果被同事截圖當‘黑歷史’…” → 轉折點:用Python調用Windows API寫了個“隨機壁紙機”,開機自啟,每次登錄都是新風景,現在截…

集成學習 —— 梯度提升樹GBDT、XGBoost

目錄 一、梯度提升樹 1、殘差提升樹 Boosting Decision Tree 2、梯度提升樹 Gradient Boosting Decision Tree 二、構建案例 1、 初始化弱學習器(CART樹): 2、 構建第1個弱學習器 3、 構建第2個弱學習器 4、 構建第3個弱學習器 5、 構建最終弱學習器 6、 構…

【船類】監控錄像下船舶類別檢測識別數據集:近7k圖像,6類,yolo標注

監控錄像下船舶類別檢測識別數據集概述 數據集包含 6900監控錄像下船舶類別圖像,6個標注類別: 散貨船、集裝箱船、漁船、雜貨船、礦砂船、客船 標注格式:yolo txt(格式可轉,可直接訓練) 標注工具&#…

用戶故事設計范式(As a... I want to... So that...)

我們來詳細解析一下用戶故事(User Story),包括其結構、為什么重要、如何編寫好的用戶故事以及一個完整的示例。1. 用戶故事的基本結構:三段式模板最經典和通用的用戶故事模板就是您提到的三段式:As a [角色]:目的&…

【OpenGL】LearnOpenGL學習筆記20 - 實例化 Instancing

上接:https://blog.csdn.net/weixin_44506615/article/details/151156446?spm1001.2014.3001.5501 完整代碼:https://gitee.com/Duo1J/learn-open-gl | https://github.com/Duo1J/LearnOpenGL 實例化 Instancing 以往當我們在場景中要大量繪制相同模型…

MySQL主從不一致?DBA急救手冊:14種高頻坑點+3分鐘定位+無損修復!

MySQL「主從不一致」最常見的成因、快速定位思路以及可落地的修復手段 一、為什么會不一致?14 類高頻場景類別典型表現/觸發條件快速自檢命令/日志1. 從庫被寫入業務或 DBA 直連從庫 UPDATE/INSERTSHOW VARIABLES LIKE read_only 應為 ON2. 復制過濾規則主從 binlog…

AI 網站源碼:探秘 SUNO,革新音樂創作的 AI 先鋒

在當今數字化浪潮中,人工智能(AI)正深刻地重塑各個領域,音樂創作也不例外。SUNO 作為一款引領潮流的音樂生成工具,宛如一顆璀璨新星,在音樂創作的天空中熠熠生輝,為音樂愛好者和創作者們帶來了前…

Linux:malloc背后的實現細節

目錄前言一、先搞懂基礎:程序的內存布局(關鍵前提!)二、malloc的核心實現步驟(4層架構拆解)第1層:用戶調用 → 標準庫處理(glibc的malloc.c)第2層:堆內存池管…

什么是X11轉發?

X11 轉發(X11 forwarding,ssh -X)是一種 SSH 協議功能,它允許用戶在遠程服務器上運行圖形化應用程序,并通過本地的顯示設備和輸入輸出設備與這些程序進行交互。它被開發者廣泛使用,用于在大規模、異構的服務…

Android Kotlin 動態注冊 Broadcast 的完整封裝方案

在 Kotlin 中封裝動態注冊的 Broadcast 可以讓你更優雅地管理廣播的注冊和注銷,避免內存泄漏。下面是一個完整的封裝方案: 基礎封裝類 import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import …