目录

二、项目整体架构与技术栈详解

2.1 整体架构分层

2.2 完整技术栈清单

2.3 配套配置文件说明

三、核心模块功能拆解与代码逻辑解析

3.1 环境加载与全局配置模块

3.2 业务工具集:Agent 可自主调用三大工具

3.3 LangGraph ReAct 智能体核心逻辑

3.4 FastAPI 后端接口与邮件发送底层实现

3.5 Streamlit 前端交互页面

四、项目部署完整操作流程

4.1 环境依赖安装

4.2 私密配置文件.env 填写

4.3 启动服务顺序

4.4 功能测试示例

五、项目优势与落地价值

5.1 技术层面优势

5.2 业务落地价值

六、项目优化扩展方向

七、总结


电商、线上服务行业的客服体系长期存在难以根治的短板。传统规则式客服机器人依赖固定关键词匹配,只能应对标准化问题,面对用户复杂、多轮、交叉咨询场景时极易失效;人工客服人力成本高、响应延迟、对话记录留存与追溯困难,用户索要聊天记录时,人工导出、发送流程繁琐低效。

大模型与智能 Agent 技术的成熟,为客服系统重构提供了全新思路。区别于普通对话机器人,基于 LangGraph 构建的 ReAct 智能客服具备自主工具调用、逻辑推理、多轮记忆、业务操作联动能力,不再局限于问答,可自主完成订单查询、库存核验、邮件归档全流程业务闭环。

本文将完整拆解一套可本地部署、开箱即用的自主客服 Agent 项目,技术栈融合 FastAPI 后端、Streamlit 可视化前端、LangGraph 智能体框架、硅基流动开源大模型 API、QQ 邮箱 SMTP 邮件服务,实现「用户对话 - 自主工具调用 - 自动归档对话记录邮件」完整链路,全部代码开源可复现,适配中小企业轻量化客服场景。

二、项目整体架构与技术栈详解

2.1 整体架构分层

项目分为三层架构,解耦清晰,便于独立迭代、部署扩展:

  1. 前端交互层(Streamlit):轻量化网页聊天界面,无需前端开发基础,快速搭建对话页面,提供邮箱配置、对话展示、Agent 思考过程可视化、邮件发送状态提示功能,本地运行即可访问网页客户端。
  2. 后端服务层(FastAPI):提供高性能 HTTP 接口,负责接收前端对话请求、维护用户独立对话记忆、驱动 LangGraph 智能体执行推理、封装 SMTP 邮件发送逻辑,处理全局环境配置与跨域请求。
  3. 智能体核心层(LangGraph + 硅基流动大模型):项目核心,基于 ReAct 范式构建自主 Agent,内置订单查询、库存查询、邮件发送三大业务工具;大模型负责自主判断是否调用工具、选择对应工具、组装参数,LangGraph 管理 Agent 思考、行动、观察循环流程,实现自主决策。

2.2 完整技术栈清单

  1. 后端核心:fastapi + uvicorn,高性能异步接口框架,低延迟支撑多用户并发对话;
  2. 智能体框架:langchainlanggraphlangchain-openai,标准化大模型调用、工具定义、Agent 状态流转;
  3. 大模型服务:硅基流动 SiliconFlow API,兼容 OpenAI 调用格式,搭载 Qwen2.5-32B-Instruct 开源大模型,无需本地部署大模型,降低硬件门槛;
  4. 前端界面:streamlit,Python 快速 Web 开发工具,零 HTML/CSS/JS 编写交互式网页;
  5. 环境与工具依赖:python-dotenv读取.env 私密配置文件、requests前端请求后端接口、内置smtplib实现邮件发送;
  6. 基础库:Python 内置 os、email、pydantic 用于配置读取、邮件封装、请求参数校验。

2.3 配套配置文件说明

项目根目录.env文件统一管理所有私密、可变配置,分离代码与密钥,避免硬编码泄露敏感信息,配置项分为四类:

  1. 硅基流动大模型配置:SILICONFLOW_API_KEY接口密钥、MODEL_NAME指定调用模型;
  2. QQ 邮箱 SMTP 服务配置:SMTP_SERVER服务器地址、SMTP_PORTSSL 端口 465、SENDER_EMAIL发件邮箱、SMTP_AUTH_CODE邮箱授权码(非登录密码); 所有配置项可按需切换,例如邮箱可替换 163 邮箱,模型可更换硅基流动平台其他开源大模型。

三、核心模块功能拆解与代码逻辑解析

3.1 环境加载与全局配置模块

项目通过python-dotenv加载.env文件,使用os.getenv()读取配置并设置默认兜底值,防止配置缺失导致程序崩溃。所有全局变量统一声明,集中管理接口地址、邮箱参数、模型名称,后续修改业务参数无需遍历全代码,维护成本极低。

同时实现分用户对话记忆存储,使用字典conversation_history以用户邮箱为唯一 Key,隔离不同用户对话记录;配套get_historyadd_to_history读写记忆函数,format_dialogue_history格式化对话文本,自动过滤「发邮件、发送记录」等指令类消息,仅保留真实业务问答,保证邮件归档内容干净整洁。

3.2 业务工具集:Agent 可自主调用三大工具

基于 LangChain @tool装饰器封装标准化工具,大模型可自主识别工具用途、判断调用时机、自动填充入参,无需人工手动触发功能:

  1. 订单查询工具 check_order 内置模拟订单数据库,覆盖已发货、运输中、待签收、待发货、已取消 5 种主流订单状态,输入订单号即可返回物流商、运单号、预计送达时间、订单详情。用户咨询物流、订单进度时,Agent 会自主调用工具查询数据,而非笼统回复话术。
  2. 库存查询工具 check_inventory 存储商品库存、所属仓库数据,用户咨询商品是否有货、备货情况时,自动调取库存数量与仓库信息,支撑售前咨询场景。
  3. 邮件发送工具 send_email 作为触发标记工具,仅用于告知大模型「具备邮件发送能力」。当用户提出「把聊天记录发我邮箱」「发送对话记录」等需求时,Agent 会调用该工具,后端捕获工具调用事件后,执行底层 SMTP 邮件函数,自动读取该用户全部历史对话,格式化后发送至用户填写的邮箱。

3.3 LangGraph ReAct 智能体核心逻辑

后端代码:

import os
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from typing import List, Dict, Any
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI
from langgraph.prebuilt import create_react_agent
from dotenv import load_dotenv

load_dotenv()

# ============ 配置 ============
SILICONFLOW_API_KEY = os.getenv("SILICONFLOW_API_KEY", "你的API密钥")
MODEL_NAME = os.getenv("MODEL_NAME", "Qwen/Qwen2.5-32B-Instruct")
SMTP_SERVER = os.getenv("SMTP_SERVER", "smtp.qq.com")
SMTP_PORT = int(os.getenv("SMTP_PORT", 465))
SENDER_EMAIL = os.getenv("SENDER_EMAIL", "你的QQ账号@qq.com")
SMTP_AUTH_CODE = os.getenv("SMTP_AUTH_CODE", "你的邮箱授权码")

# ============ 对话历史存储(按邮箱) ============
conversation_history: Dict[str, List[Dict[str, str]]] = {}

def get_history(email: str) -> List[Dict[str, str]]:
    if email not in conversation_history:
        conversation_history[email] = []
    return conversation_history[email]

def add_to_history(email: str, role: str, content: str):
    history = get_history(email)
    history.append({"role": role, "content": content})

def format_dialogue_history(email: str) -> str:
    """格式化纯对话历史,过滤掉发邮件指令"""
    history = get_history(email)
    if not history:
        return "暂无对话记录。"
    
    # 过滤掉包含发邮件相关关键词的消息(指令本身不记录到邮件)
    keywords_to_filter = ["发邮件", "发送到我的邮箱", "发送到邮箱", "把对话过程", "把记录发送", "全部对话记录", "发送邮件", "发我邮箱"]
    filtered = []
    for msg in history:
        content = msg["content"]
        if any(kw in content for kw in keywords_to_filter):
            continue
        filtered.append(msg)
    
    if not filtered:
        return "暂无有效对话记录(已过滤发邮件指令)。"
    
    text = "=== 客服对话记录 ===\n\n"
    for i, msg in enumerate(filtered, 1):
        role = "用户" if msg["role"] == "user" else "客服"
        text += f"{i}. {role}:{msg['content']}\n\n"
    return text

# ============ 工具定义 ============
@tool
def check_order(order_id: str) -> str:
    """查询订单状态"""
    orders = {
        "1001": {
            "product_name": "手机",
            "status": "已发货",
            "carrier": "顺丰速运",
            "tracking_no": "SF1234567890",
            "estimate_delivery": "2026-07-12",
            "detail": "包裹已从广州发出,预计7月12日送达"
        },
        "1002": {
            "product_name": "耳机",
            "status": "运输中",
            "carrier": "中通快递",
            "tracking_no": "ZT9876543210",
            "estimate_delivery": "2026-07-10",
            "detail": "包裹已到达郑州中转站,预计7月10日送达"
        },
        "1003": {
            "product_name": "键盘",
            "status": "已签收",
            "carrier": "京东物流",
            "tracking_no": "JD0011223344",
            "estimate_delivery": "2026-07-05",
            "detail": "包裹已于7月5日签收,签收人为小区物业"
        },
        "1004": {
            "product_name": "鼠标",
            "status": "待发货",
            "carrier": "待分配",
            "tracking_no": "暂无",
            "estimate_delivery": "2026-07-15",
            "detail": "订单已支付,等待仓库发货,预计7月15日前发出"
        },
        "1005": {
            "product_name": "电脑",
            "status": "已取消",
            "carrier": "无",
            "tracking_no": "无",
            "estimate_delivery": "无",
            "detail": "用户已取消订单,退款已原路返回"
        }
    }
    order_info = orders.get(order_id)
    if order_info:
        return (f"订单 {order_id}:{order_info['product_name']}\n"
                f"状态:{order_info['status']}\n"
                f"物流公司:{order_info['carrier']}\n"
                f"运单号:{order_info['tracking_no']}\n"
                f"预计送达:{order_info['estimate_delivery']}\n"
                f"详情:{order_info['detail']}")
    else:
        return f"订单号 {order_id} 不存在,请核对后重新查询。"

@tool
def check_inventory(product_id: str) -> str:
    """查询产品库存"""
    inventory = {
        "1001": {"product_name": "手机", "stock": 156, "warehouse": "广州仓"},
        "1002": {"product_name": "耳机", "stock": 34, "warehouse": "郑州仓"},
        "1003": {"product_name": "键盘", "stock": 89, "warehouse": "上海仓"},
        "1004": {"product_name": "鼠标", "stock": 213, "warehouse": "深圳仓"},
        "1005": {"product_name": "电脑", "stock": 7, "warehouse": "北京仓"}
    }
    product_info = inventory.get(product_id)
    if product_info:
        return (f"产品 {product_id}:{product_info['product_name']}\n"
                f"库存:{product_info['stock']} 件\n"
                f"仓库:{product_info['warehouse']}")
    else:
        return f"产品编号 {product_id} 不存在,请核对后重新查询。"

@tool
def send_email(recipient: str, subject: str, content: str) -> str:
    """
    发送邮件给用户。当用户要求发送聊天记录时,subject 写 '聊天记录',content 可留空。
    """
    return f"邮件已准备发送至 {recipient},主题:{subject}"

tools = [check_order, check_inventory, send_email]

# ============ 初始化 Agent ============
llm = ChatOpenAI(
    base_url="https://api.siliconflow.cn/v1",
    api_key=SILICONFLOW_API_KEY,
    model=MODEL_NAME,
    temperature=0.1
)
agent = create_react_agent(llm, tools)

# ============ FastAPI 应用 ============
app = FastAPI(title="智能客服 Agent")
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_methods=["*"],
    allow_headers=["*"],
)

class ChatRequest(BaseModel):
    message: str
    user_email: str

class ChatResponse(BaseModel):
    response: str
    decision_chain: List[Dict[str, Any]]
    email_sent: bool

# ============ 邮件发送函数 ============
def send_email_to_user(recipient: str, subject: str, body: str) -> bool:
    try:
        msg = MIMEMultipart()
        msg["From"] = SENDER_EMAIL
        msg["To"] = recipient
        msg["Subject"] = subject
        msg.attach(MIMEText(body, "plain", "utf-8"))

        with smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT) as server:
            server.login(SENDER_EMAIL, SMTP_AUTH_CODE)
            server.sendmail(SENDER_EMAIL, [recipient], msg.as_string())
        return True
    except Exception as e:
        print(f"邮件发送失败: {e}")
        return False

def format_decision_chain(chain: List[Dict[str, Any]]) -> str:
    text = "=== 决策链 ===\n\n"
    for i, step in enumerate(chain, 1):
        text += f"Step {i} - {step['type'].upper()}:\n"
        if step['type'] == 'action':
            text += f"  调用工具: {step['tool']}\n"
            text += f"  输入: {step['input']}\n"
        else:
            text += f"  {step['content']}\n"
        text += "\n"
    return text

# ============ 执行 Agent ============
def run_agent(user_input: str, user_email: str) -> tuple[str, List[Dict[str, Any]], bool]:
    # 获取历史记录
    history = get_history(user_email)
    
    # 构建消息列表:包含历史 + 当前用户输入
    messages = []
    for msg in history:
        messages.append({"role": msg["role"], "content": msg["content"]})
    messages.append({"role": "user", "content": user_input})
    
    decision_chain = []
    final_answer = ""
    email_sent = False

    for step in agent.stream({"messages": messages}):
        if "agent" in step:
            msg = step["agent"]["messages"][-1]
            thought = msg.content if hasattr(msg, "content") else str(msg)
            decision_chain.append({"type": "thought", "content": thought})
            final_answer = thought

        if "tools" in step:
            msg = step["tools"]["messages"][-1]
            if hasattr(msg, "name") and msg.name:
                tool_name = msg.name
                tool_input = msg.content if hasattr(msg, "content") else str(msg)
                decision_chain.append({
                    "type": "action",
                    "tool": tool_name,
                    "input": tool_input
                })
                
                if tool_name == "send_email":
                    # 判断是否要求发送“聊天记录/对话”
                    if any(kw in tool_input for kw in ["聊天记录", "对话", "全部", "记录"]):
                        dialogue_text = format_dialogue_history(user_email)
                        if "暂无有效对话记录" in dialogue_text:
                            email_body = "您还没有有效的业务对话记录(发邮件指令已自动过滤)。"
                        else:
                            email_body = dialogue_text
                        email_sent = send_email_to_user(user_email, "客服聊天记录", email_body)
                    else:
                        # 只发送当前回答(不含决策链)
                        email_body = f"回答:{final_answer}"
                        email_sent = send_email_to_user(user_email, "客服回答", email_body)
            else:
                obs = msg.content if hasattr(msg, "content") else str(msg)
                decision_chain.append({"type": "observation", "content": obs})

    # 兜底:如果最终回答提到发邮件但未触发工具,或用户明确要求发记录
    if not email_sent and any(kw in final_answer for kw in ["发邮件", "发送邮件"]):
        dialogue_text = format_dialogue_history(user_email)
        if "暂无有效对话记录" not in dialogue_text:
            email_body = dialogue_text
        else:
            email_body = f"回答:{final_answer}"
        email_sent = send_email_to_user(user_email, "客服聊天记录", email_body)

    # 将本次对话存入历史
    add_to_history(user_email, "user", user_input)
    add_to_history(user_email, "assistant", final_answer)

    return final_answer, decision_chain, email_sent

# ============ API 路由 ============
@app.post("/chat", response_model=ChatResponse)
async def chat_endpoint(req: ChatRequest):
    try:
        answer, chain, sent = run_agent(req.message, req.user_email)
        return ChatResponse(
            response=answer,
            decision_chain=chain,
            email_sent=sent
        )
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@app.get("/health")
async def health():
    return {"status": "ok"}

ReAct 范式是自主 Agent 的核心设计思路,循环执行「思考 Thought - 行动 Action - 观察 Observation」三步:

  1. Thought(思考):大模型接收用户问题与历史对话,自主判断是否需要调用工具;无需工具则直接生成回答;需要工具则规划调用工具名称、入参;
  2. Action(行动):执行对应业务工具,传入模型生成参数;
  3. Observation(观察):接收工具返回结果,将业务数据返回给大模型,结合历史对话生成最终完整回复。

项目使用create_react_agent快速构建标准 ReAct 智能体,接入硅基流动兼容 OpenAI 格式的接口,base_url填写硅基官方 v1 接口地址,temperature=0.1降低模型随机性,保证订单、库存查询结果严谨、无幻觉。

后端完整记录 Agent 每一步决策过程,存储decision_chain决策链数组,前端通过折叠面板可视化展示思考、工具调用、返回结果全流程,方便调试、向用户展示客服推理逻辑,提升交互透明度。

3.4 FastAPI 后端接口与邮件发送底层实现

  1. 接口设计 仅暴露两个核心接口:/chat对话交互接口、/health健康检测接口。/chat接收用户消息、用户邮箱两个参数,调用run_agent函数驱动智能体执行完整流程,返回客服回答、完整决策链、邮件是否发送成功状态;全局开启 CORS 跨域,支持本地 Streamlit 前端跨端口访问后端服务。
  2. SMTP 邮件底层封装 send_email_to_user函数基于 SSL 加密方式连接 QQ 邮箱服务器,封装邮件标题、正文、收发件人,捕获全部异常,邮件发送失败时打印日志并返回布尔状态。区分两种邮件场景:用户索要对话记录时,发送格式化完整历史问答;单纯触发邮件工具时,仅发送单轮客服回答。同时增加兜底逻辑,若模型输出文字提及发邮件但未调用工具,程序自动补发对话记录,规避模型漏调用工具的边界问题。
  3. 对话记忆持久化逻辑 每一轮用户提问、客服回复完成后,自动写入对应邮箱的独立记忆列表,保证多轮对话上下文连贯;记忆过滤机制剔除邮件指令,避免归档内容混杂操作指令,提升邮件可读性。

3.5 Streamlit 前端交互页面

前端代码:

import streamlit as st
import requests
import json

# 页面配置
st.set_page_config(page_title="智能客服 Agent", layout="wide")
st.title("🤖 自主学习客服 Agent")

# 侧边栏 - 用户邮箱
with st.sidebar:
    st.header("📧 设置")
    user_email = st.text_input("请输入您的邮箱(接收对话记录):", placeholder="example@qq.com")
    st.markdown("---")
    st.caption("Powered by 硅基流动 + LangGraph")

# 主聊天区域
if "messages" not in st.session_state:
    st.session_state.messages = []

# 显示历史消息
for msg in st.session_state.messages:
    with st.chat_message(msg["role"]):
        st.markdown(msg["content"])

# 用户输入
if prompt := st.chat_input("请输入您的问题..."):
    if not user_email:
        st.warning("请先在侧边栏输入您的邮箱!")
        st.stop()

    # 显示用户消息
    with st.chat_message("user"):
        st.markdown(prompt)
    st.session_state.messages.append({"role": "user", "content": prompt})

    # 调用后端 API
    with st.chat_message("assistant"):
        placeholder = st.empty()
        with st.spinner("Agent 思考中..."):
            try:
                response = requests.post(
                    "http://localhost:8000/chat",
                    json={"message": prompt, "user_email": user_email},
                    timeout=60
                )
                if response.status_code == 200:
                    data = response.json()
                    answer = data["response"]
                    chain = data["decision_chain"]
                    email_sent = data["email_sent"]

                    placeholder.markdown(answer)

                    # 显示决策链(可折叠)
                    with st.expander("🧠 查看 Agent 思考过程", expanded=False):
                        for step in chain:
                            if step["type"] == "thought":
                                st.info(f"💭 **思考**:{step['content']}")
                            elif step["type"] == "action":
                                st.warning(f"🔧 **调用工具**:`{step['tool']}` → 输入:{step['input']}")
                            else:
                                st.success(f"📊 **观察结果**:{step['content']}")

                    if email_sent:
                        st.success(f"✅ 对话记录已发送至 {user_email}")
                    else:
                        st.info("ℹ️ 未触发邮件发送(如需发送,请明确告诉客服)")

                    # 保存到会话
                    st.session_state.messages.append({"role": "assistant", "content": answer})
                else:
                    placeholder.error(f"API 请求失败:{response.status_code} - {response.text}")
            except requests.exceptions.ConnectionError:
                placeholder.error("❌ 无法连接到后端服务,请确保后端已启动(端口8000)")
            except Exception as e:
                placeholder.error(f"❌ 发生错误:{str(e)}")

前端轻量化无部署成本,一行命令即可启动网页客户端,功能覆盖:

  1. 侧边栏配置用户接收邮箱,未填写邮箱时拦截对话请求;
  2. 会话缓存存储网页端对话展示记录,实时渲染用户、客服对话气泡;
  3. 对话请求加载动画,捕获后端连接失败、接口报错、超时等全部异常并友好提示;
  4. 可折叠面板展示 Agent 完整思考决策链,区分思考、工具调用、观测结果三种状态,用不同颜色标识;
  5. 邮件发送结果实时提示,发送成功弹出绿色提示,未触发邮件给出灰色说明。

前后端完全解耦,前端仅通过 HTTP 请求调用后端接口,后续可替换 Vue、React 网页端、小程序客户端,无需修改智能体核心逻辑。

四、项目部署完整操作流程

4.1 环境依赖安装

新建requirements.txt文件,写入项目全部依赖包:

plaintext

fastapi
uvicorn
langchain
langgraph
langchain-openai
streamlit
requests
python-dotenv

执行安装命令:

bash

运行

pip install -r requirements.txt

4.2 私密配置文件.env 填写

  1. 硅基流动官网注册账号,创建 API Key 填入SILICONFLOW_API_KEY
  2. QQ 邮箱开启 POP3/SMTP 服务,获取 16 位授权码填入SMTP_AUTH_CODE,填写发件 QQ 邮箱;
  3. MODEL_NAME 保持Qwen/Qwen2.5-32B-Instruct,可自行替换硅基流动平台其他模型。

4.3 启动服务顺序

  1. 启动 FastAPI 后端服务,端口 8000:

bash

运行

uvicorn app:app --host 0.0.0.0 --port 8000
  1. 新开终端,启动 Streamlit 前端页面:

bash

运行

streamlit run streamlit_app.py
  1. 浏览器自动打开前端页面,侧边栏填写邮箱即可开始对话测试。

4.4 功能测试示例

  1. 业务查询:输入「查询订单 1001 物流状态」,Agent 自主调用订单工具,返回顺丰物流、预计送达时间;
  2. 库存咨询:输入「电脑产品库存还有多少」,自动调取 product_id=1005 库存数据;
  3. 邮件归档:输入「把我们刚刚的聊天记录发送到我的邮箱」,Agent 调用 send_email 工具,后端自动格式化对话历史,发送至侧边栏填写的邮箱,页面弹出发送成功提示。

五、项目优势与落地价值

5.1 技术层面优势

  1. 自主推理,脱离固定规则:区别于传统关键词机器人,Agent 自主判断工具调用,支持混合多业务查询,例如「订单 1002 到哪了,同时看看耳机库存」,可连续调用多个工具,串联多业务数据;
  2. 记忆隔离,多用户并发适配:以邮箱为唯一标识区分对话记忆,支持多人同时访问前端,对话互不干扰;
  3. 低部署门槛:无需本地部署大模型,依托硅基流动云端 API,低配电脑即可运行;前端 Streamlit 零前端开发成本,快速上线;
  4. 安全规范:密钥、邮箱授权码统一存放.env 文件,不硬编码在代码中,降低信息泄露风险;SMTP 使用 SSL 加密发送邮件,传输过程安全;
  5. 全链路可视化调试:决策链完整记录 Agent 每一步思考与工具调用,快速定位模型幻觉、工具调用失败问题,便于迭代优化 Prompt 与工具逻辑。

5.2 业务落地价值

  1. 降低客服人力成本:自主 Agent 承接订单查询、库存咨询、对话归档标准化需求,减少人工客服重复工作量;
  2. 对话自动归档,合规可追溯:用户一键获取全部对话记录,无需人工导出整理,解决售后纠纷无凭证的痛点;
  3. 轻量化中小企业适配:整套项目无复杂中间件、数据库依赖,内存对话记忆适配小体量业务,后续可扩展 SQLite 数据库持久化记忆,适配高并发场景;
  4. 高度可扩展:新增业务仅需新增@tool工具函数,例如退款申请、优惠券查询、物流改地址等功能,无需重构对话底层逻辑。

六、项目优化扩展方向

当前版本为基础可用版本,可基于业务需求迭代升级,提供四大扩展思路:

  1. 持久化对话记忆:目前对话仅存储内存,服务重启后记录丢失,可接入 SQLite、Redis 数据库,绑定用户邮箱永久存储对话;
  2. 多模态能力扩展:接入硅基流动多模态模型,支持用户上传订单截图、商品图片,自动识别图片信息完成查询;
  3. 邮件模板美化:当前邮件为纯文本格式,修改 MIMEText 为 HTML 格式,设计美观对话记录邮件模板,区分用户、客服消息样式;
  4. 权限与限流机制:增加 API 密钥鉴权、接口请求限流,防止恶意调用大模型接口产生高额费用;
  5. 知识库 RAG 融合:接入 LangChain 向量数据库,上传商品说明书、售后政策文档,实现专业知识库问答,解决大模型专业知识幻觉问题;
  6. 多渠道接入:前端接口标准化,可对接企业微信、小程序、抖音商家后台,一套客服 Agent 支撑全渠道咨询。

七、总结

本文搭建的自主智能客服 Agent,打通了「大模型自主推理 - 业务工具调用 - 对话记录邮件归档」完整业务闭环,依托 LangGraph ReAct 框架实现真正具备自主决策能力的客服机器人,摒弃传统固定匹配规则的局限性。整套代码基于 Python 生态开发,前后端分离架构清晰,配置简单、部署轻量化,中小企业无需投入大量算法、前端开发资源即可落地使用。

硅基流动提供的开源大模型 API 大幅降低了大模型落地硬件门槛,搭配 FastAPI 高性能接口、Streamlit 快速可视化界面,兼顾开发效率与用户交互体验;内置的邮件自动归档功能直击客服行业对话追溯、凭证留存的核心痛点,具备极强的实用落地价值。同时项目模块化设计预留充足扩展空间,可根据电商、线上服务、售后咨询等不同行业业务需求持续迭代工具集与交互能力,是轻量化大模型 Agent 落地业务场景的优质实践方案。
前端页面:

收到的邮件:

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐