如何构建有上下文记忆的AI客服助手:基于GPT-4o + Mem0 + Qdrant + Streamlit全流程实战教程

本教程展示了如何利用 GPT-4o、Mem0.ai 和 Qdrant 构建一个能够“记住”用户信息的客户支持 AI Agent。整个项目使用不到 100 行 Python 代码即可实现,适合快速部署和迭代。

随着大语言模型(LLM)在实际应用中的广泛落地,如何让 AI 拥有“记住用户”的能力,成为下一代智能助手的关键。在这篇完整的实战教程中,我将带你从 0 到 1 构建一个具备持久记忆的客户支持 AI 助手,能够持续跟踪用户的互动历史,生成更精准的回应。

如何构建有上下文记忆的AI客服助手:基于GPT-4o + Mem0 + Qdrant + Streamlit全流程实战教程

本项目将使用:

  • OpenAI 最新的 GPT-4o 模型

  • Mem0 内存管理框架

  • Qdrant 作为高性能向量数据库

  • Streamlit 打造前端聊天界面

最终效果:一个能记住用户过往对话、自动生成客户信息,并持续学习改进的 AI 客服系统。


🧰 项目功能亮点

  • 支持上下文记忆的客服助手聊天界面

  • 使用合成数据自动生成客户资料和订单历史

  • 多轮对话记忆能力,可查阅完整用户历史

  • 使用 Qdrant 持久化存储所有对话和元数据

  • 支持通过用户 ID 检索个性化记录


✅ 环境准备与依赖安装

在开始之前,请确保你已经具备以下条件:

  • 安装 Python 3.7+

  • 获取 OpenAI API Key(推荐 GPT-4o)

  • 安装 Docker(用于运行 Qdrant 向量数据库)

  • 推荐使用 VSCode / PyCharm 编辑器

第一步:克隆项目代码库

git clone https://github.com/Shubhamsaboo/awesome-llm-apps.git
cd awesome-llm-apps/ai_customer_support_agent

安装所需依赖项:

pip install -r requirements.txt

启动本地 Qdrant 实例(默认监听 6333 端口):

docker pull qdrant/qdrant

docker run -p 6333:6333 -p 6334:6334 \
    -v $(pwd)/qdrant_storage:/qdrant/storage:z \
    qdrant/qdrant

🧱 创建你的 Streamlit 客服助手前端

新建一个文件 customer_support_agent.py,并逐步填入以下内容。

1. 导入所需库

import streamlit as st
from openai import OpenAI
from mem0 import Memory
import os
import json
from datetime import datetime, timedelta

2. 设置 Streamlit 页面 UI

st.title("智能客服助手(带记忆功能) 🤖")
st.caption("欢迎来到智能客服中心,我们的 AI 会记住你的每一次提问。")

openai_api_key = st.text_input("请输入 OpenAI API Key", type="password")
if openai_api_key:
    os.environ['OPENAI_API_KEY'] = openai_api_key

🧠 构建支持“记忆”的客服Agent类

以下是核心逻辑类,封装了 GPT-4o 聊天、Mem0 管理和数据生成功能。

3. 初始化助手类与内存配置

class CustomerSupportAIAgent:
    def __init__(self):
        config = {
            "vector_store": {
                "provider": "qdrant",
                "config": {
                    "model": "gpt-4o-mini",
                    "host": "localhost",
                    "port": 6333,
                }
            },
        }
        self.memory = Memory.from_config(config)
        self.client = OpenAI()
        self.app_id = "customer-support"

4. 处理客户查询并调用记忆

    def handle_query(self, query, user_id=None):
        relevant_memories = self.memory.search(query=query, user_id=user_id)
        context = "历史交互内容如下:\n"
        for mem in relevant_memories:
            context += f"- {mem['text']}\n"

        full_prompt = f"{context}\n客户:{query}\n客服:"

        response = self.client.chat.completions.create(
            model="gpt-4o-mini",
            messages=[
                {"role": "system", "content": "你是 TechGadgets.com 的客服 AI,擅长处理电子产品订单问题。"},
                {"role": "user", "content": full_prompt}
            ]
        )
        answer = response.choices[0].message.content

        # 保存问答到记忆
        self.memory.add(query, user_id=user_id, metadata={"app_id": self.app_id, "role": "user"})
        self.memory.add(answer, user_id=user_id, metadata={"app_id": self.app_id, "role": "assistant"})

        return answer

5. 获取用户所有记忆和生成合成数据

    def get_memories(self, user_id=None):
        return self.memory.get_all(user_id=user_id)

    def generate_synthetic_data(self, user_id):
        today = datetime.now()
        order_date = (today - timedelta(days=10)).strftime("%B %d, %Y")
        expected_delivery = (today + timedelta(days=2)).strftime("%B %d, %Y")

        prompt = f"""生成一个客户资料,包括:
        1. 客户基本信息
        2. 最近订单({order_date} 下单,预计 {expected_delivery} 到货)
        3. 产品名称、订单号、金额
        4. 客户地址
        5. 去年内的2-3笔历史订单
        6. 与客服的历史互动内容
        7. 购物偏好和行为模式
        请以 JSON 格式返回。"""

        response = self.client.chat.completions.create(
            model="gpt-4o-mini",
            messages=[
                {"role": "system", "content": "你是一个用于生成客户档案的 AI,请始终返回标准 JSON 格式数据。"},
                {"role": "user", "content": prompt}
            ],
            response_format={"type": "json_object"}
        )

        customer_data = json.loads(response.choices[0].message.content)

        # 写入所有数据到记忆
        for key, value in customer_data.items():
            if isinstance(value, list):
                for item in value:
                    self.memory.add(json.dumps(item), user_id=user_id, metadata={"app_id": self.app_id, "role": "system"})
            else:
                self.memory.add(f"{key}: {json.dumps(value)}", user_id=user_id, metadata={"app_id": self.app_id, "role": "system"})

        return customer_data

support_agent = CustomerSupportAIAgent()

🖥️ 构建前端交互界面(Streamlit)

6. 客户 ID 与侧边栏操作

st.sidebar.title("🆔 客户资料管理")
previous_customer_id = st.session_state.get("previous_customer_id", None)
customer_id = st.sidebar.text_input("输入客户 ID")

if customer_id != previous_customer_id:
    st.session_state.messages = []
    st.session_state.previous_customer_id = customer_id
    st.session_state.customer_data = None

if st.sidebar.button("生成合成客户数据"):
    if customer_id:
        with st.spinner("正在生成客户数据..."):
            st.session_state.customer_data = support_agent.generate_synthetic_data(customer_id)
        st.sidebar.success("生成完成!")
    else:
        st.sidebar.error("请先输入客户 ID")

if st.sidebar.button("查看客户资料"):
    if st.session_state.customer_data:
        st.sidebar.json(st.session_state.customer_data)
    else:
        st.sidebar.info("尚未生成客户资料。")

if st.sidebar.button("查看记忆内容"):
    if customer_id:
        memories = support_agent.get_memories(user_id=customer_id)
        if memories:
            st.sidebar.markdown(f"**{customer_id} 的记忆内容:**")
            for mem in memories:
                st.sidebar.markdown(f"- {mem['text']}")
        else:
            st.sidebar.info("当前客户暂无历史记录。")
    else:
        st.sidebar.error("请先输入客户 ID")

7. 聊天交互与对话历史展示

if "messages" not in st.session_state:
    st.session_state.messages = []

for message in st.session_state.messages:
    with st.chat_message(message["role"]):
        st.markdown(message["content"])

query = st.chat_input("请输入你的问题...")

if query and customer_id:
    st.session_state.messages.append({"role": "user", "content": query})
    with st.chat_message("user"):
        st.markdown(query)

    answer = support_agent.handle_query(query, user_id=customer_id)

    st.session_state.messages.append({"role": "assistant", "content": answer})
    with st.chat_message("assistant"):
        st.markdown(answer)
elif not customer_id:
    st.error("请输入客户 ID 后再开始聊天。")

🚀 启动你的应用

在项目目录下运行:

streamlit run customer_support_agent.py

浏览器中访问 http://localhost:8501 即可使用你的智能客服助手!


📌 后续拓展建议

你可以进一步拓展功能,比如:

  • 接入物流订单系统,实时查询运单状态

  • 添加语音输入和输出功能,打造语音客服机器人

  • 使用更强的嵌入模型(如 BGE-M3、Cohere Rerank)优化搜索相关性

  • 将应用部署到云端(如 Hugging Face Spaces 或 AWS EC2)

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...