A cup of coffee
A heart set free

微信机器人记忆系统实战:让AI学会记住每个人

前几天我跟一个做了三年客服的朋友喝酒。他说最痛苦的不是回答重复的问题,而是每次都要装作第一次见面的样子。"明明上周才聊过他家孩子考试的事,这周他又问同样的问题,我还得假装不知道重新回答一遍。"他灌了一口酒,"人都会记仇,怎么就不能记点好呢?" 🍺
file

那一刻我突然意识到,我做的那些聊天机器人也是这样——每次对话都像失忆一样,完全不记得上次聊了什么。这不是技术问题,是态度问题。


机器人为什么应该有记忆

说实话,大部分所谓的"智能客服"都蠢得可以。不是因为AI不够聪明,而是因为它们根本不记事。

你上周问过它"怎么退货",这周再问还是同样的官方话术。它不知道你是第二次问,不知道你上次退货失败了,更不知道你现在已经快被气炸了。这种体验就像每次去医院都要重新填病历,医生完全不记得你上个月刚来过。

没有记忆的机器人只是高级复读机

我见过太多这样的场景:

  • 用户:"我上次说过我喜欢跑步。"
  • 机器人:"您好!请问有什么可以帮您?" 😅
  • 用户:崩溃.jpg

这不是服务,这是折磨

一个真正有用的助手,应该记得你的习惯、你的偏好、甚至你上次抱怨过什么。

记忆让机器人从工具变成伙伴

想象一下这个场景:

你问机器人:"最近有什么好玩的?"

没有记忆的版本
"为您推荐以下活动:音乐会、展览、运动赛事……"

有记忆的版本
"上次你说喜欢跑步,这周末有个马拉松。另外你关注的那个乐队下月来开演唱会,要不要抢票?" 🏃‍♂️🎵

看到区别了吗?后者不是在回答问题,而是在关心你

三个层次的记忆缺一不可

人的记忆系统其实很复杂,但核心就三层:

记忆类型 作用 就像…
短期记忆 记住刚才聊了什么 你记得这段对话的上下文
长期记忆 保存所有历史互动 你的日记本
人格记忆 形成对某人的印象 你对朋友的整体认知

机器人也该这样。不然就像得了阿尔茨海默症——每次对话都是新的开始,永远活在当下,永远没有过去。


打造三层记忆系统:让机器人长出大脑

既然要做,就做得像样一点。我研究了一圈,发现最靠谱的方案是三层记忆架构——就像人脑一样,短期、长期、人格,缺一不可。

短期记忆:别让对话断片

短期记忆最简单,但最容易被忽略

它就是保存最近几轮对话,让机器人知道"刚才我们在聊什么"。你可以理解为工作台上的便签纸——用完就扔,但在用的时候必须一直摆在眼前。

实现起来就是把最近N条消息拼起来,塞给AI模型:

# 保存最近10轮对话
short_memory = []

def add_to_short_memory(user_msg, bot_reply):
    short_memory.append({
        "user": user_msg,
        "bot": bot_reply,
        "time": time.time()
    })
    if len(short_memory) > 10:
        short_memory.pop(0)  # 扔掉最老的记忆

为什么是10轮? 因为太少会断片,太多会让AI迷糊。就像你跟人聊天,最多也就记得最近说了啥,再往前就模糊了。

长期记忆:把聊天记录变成可检索的知识库

这才是重头戏。💾

传统做法是把聊天记录全存数据库,需要的时候全翻出来。问题是聊天记录太多了,全塞给AI它会死机,不塞又找不到关键信息。

解决方案:向量数据库 + 语义检索

听起来很高大上,其实就是把每句话变成一串数字(向量),然后通过"意思相近"来找记忆,而不是关键词匹配。

举个例子:

  • 用户上周说:"我最近在跑马拉松。"
  • 用户今天问:"有什么运动装备推荐?"

传统关键词匹配找不到关联,但向量检索能识别出"马拉松"和"运动装备"是相关的,于是翻出上周的记忆。

from sentence_transformers import SentenceTransformer
import faiss
import numpy as np

# 初始化向量模型
model = SentenceTransformer('all-MiniLM-L6-v2')
dim = model.get_sentence_embedding_dimension()
index = faiss.IndexFlatIP(dim)  # 内积相似度索引

memory_texts = []  # 存储原始文本
memory_meta = []   # 存储元数据

def save_to_long_memory(user_id, text, tags=None):
    """保存一条长期记忆"""
    vec = model.encode([text], normalize_embeddings=True)
    vec = vec.astype("float32")

    index.add(vec)
    memory_texts.append(text)
    memory_meta.append({
        "user_id": user_id,
        "tags": tags or [],
        "timestamp": time.time()
    })

现在每次用户说话,都会被向量化存起来。需要的时候,用当前问题去检索最相关的记忆:

def recall_memories(user_id, query, top_k=5):
    """根据当前问题检索相关记忆"""
    query_vec = model.encode([query], normalize_embeddings=True)
    query_vec = query_vec.astype("float32")

    D, I = index.search(query_vec, top_k * 2)  # 多检索一些备选

    results = []
    for score, idx in zip(D[0], I[0]):
        meta = memory_meta[idx]
        # 只返回当前用户的记忆
        if meta["user_id"] == user_id:
            results.append({
                "text": memory_texts[idx],
                "score": float(score),
                "tags": meta["tags"]
            })

    return sorted(results, key=lambda x: x["score"], reverse=True)[:top_k]

这样,当用户问"有什么运动装备推荐",机器人会先去翻记忆,发现"哦,这家伙在跑马拉松",然后推荐跑鞋而不是瑜伽垫。🏃‍♂️👟

人格记忆:把用户当成一个活生生的人

光有记忆还不够,还得形成"印象"。

就像你认识一个朋友久了,不会记得每次聊天的细节,但会形成对Ta的整体认知——比如"这人挺爱运动的""说话直来直去""晚上才活跃"。

机器人也需要这种浓缩的、结构化的用户画像

用户画像包含什么?

我设计了一个相对完整的画像结构:

{
  "user_id": "wx_user_12345",
  "nickname": "老王",
  "profile": {
    "interests": ["跑步", "科技", "自动化"],
    "communication_style": "简洁直接,偶尔自嘲",
    "active_hours": ["20:00-23:00"],
    "emotion_tendency": "积极乐观",
    "relationship": "长期用户"
  },
  "behavior_stats": {
    "total_messages": 342,
    "avg_msg_length": 45,
    "last_active": "2025-11-14 21:30"
  },
  "preference_tags": {
    "运动": 0.85,
    "技术": 0.72,
    "美食": 0.43
  },
  "memory_summary": "这人热爱跑步,经常提到马拉松训练。对技术工具很感兴趣,之前聊过自动化脚本和AI应用。交流风格偏理性,喜欢简洁的回答。"
}

画像怎么生成?

1. 关键词统计

最简单粗暴:统计高频词。

from collections import Counter
import jieba

def extract_interests(user_id, threshold=5):
    """提取用户兴趣关键词"""
    all_texts = [m["text"] for m in memory_texts 
                 if memory_meta[memory_texts.index(m)]["user_id"] == user_id]

    words = []
    for text in all_texts:
        words.extend(jieba.cut(text))

    # 过滤停用词,统计频率
    word_freq = Counter([w for w in words if len(w) > 1])
    return [w for w, count in word_freq.most_common(10) if count >= threshold]

2. 向量聚类

把用户的所有消息向量聚类,识别主题。比如聚出"运动相关""工作相关""生活琐事"几个簇。

from sklearn.cluster import KMeans

def cluster_topics(user_id, n_clusters=5):
    """聚类识别用户关注的主题"""
    user_vecs = [model.encode(m["text"]) for m in memory_texts 
                 if memory_meta[memory_texts.index(m)]["user_id"] == user_id]

    if len(user_vecs) < n_clusters:
        return []

    kmeans = KMeans(n_clusters=n_clusters, random_state=42)
    labels = kmeans.fit_predict(np.array(user_vecs))

    # 每个簇取代表性文本
    clusters = {}
    for idx, label in enumerate(labels):
        if label not in clusters:
            clusters[label] = []
        clusters[label].append(memory_texts[idx])

    return clusters

3. 行为模式分析

统计活跃时间、消息长度、表情使用频率等。

def analyze_behavior(user_id):
    """分析用户行为模式"""
    user_msgs = [m for m in memory_meta if m["user_id"] == user_id]

    # 活跃时间分布
    hours = [datetime.fromtimestamp(m["timestamp"]).hour 
             for m in user_msgs]
    active_hours = Counter(hours).most_common(3)

    # 消息长度
    msg_lengths = [len(memory_texts[i]) 
                   for i, m in enumerate(memory_meta) 
                   if m["user_id"] == user_id]
    avg_length = sum(msg_lengths) / len(msg_lengths) if msg_lengths else 0

    return {
        "active_hours": [f"{h[0]}:00-{h[0]+1}:00" for h in active_hours],
        "avg_msg_length": int(avg_length),
        "total_messages": len(user_msgs)
    }

4. 定期生成画像摘要

这是最关键的一步:让AI读完所有记忆,写一份人物小传

def generate_persona_summary(user_id):
    """用AI生成用户画像摘要"""
    memories = recall_memories(user_id, "", top_k=50)  # 取最相关的50条
    memory_text = "\n".join([m["text"] for m in memories])

    prompt = f"""
基于以下对话记录,请生成一份用户画像摘要(100字以内):

{memory_text}

摘要应包含:
1. 主要兴趣爱好
2. 交流风格特点
3. 行为模式
4. 情绪倾向
"""

    summary = call_ai_model(prompt)  # 调用AI生成摘要
    return summary

这样,每个用户都有了一份"档案"——机器人每次回复前都会先看一眼,就像你跟朋友聊天前会想起"哦对,这家伙是个跑步狂"。


让机器人真正懂你:记忆在对话中的应用

技术实现只是基础,真正的魔法在于怎么用这些记忆

偏好检索:优先调用相关记忆

当用户发消息时,不是无脑检索所有记忆,而是根据画像加权

比如用户画像显示Ta喜欢"运动"和"科技",那检索时就给带这些标签的记忆加分:

def smart_recall(user_id, query, persona):
    """基于用户画像的智能记忆检索"""
    memories = recall_memories(user_id, query, top_k=10)

    # 根据画像偏好加权
    interest_tags = set(persona.get("interests", []))
    for mem in memories:
        mem_tags = set(mem.get("tags", []))
        overlap = len(interest_tags & mem_tags)
        mem["score"] += overlap * 0.1  # 每个匹配标签加0.1分

    return sorted(memories, key=lambda x: x["score"], reverse=True)[:5]

效果: 当用户问"最近有什么好玩的",机器人优先想起跟Ta兴趣相关的记忆,而不是无关的闲聊。 🎯

风格适配:让回复带上人格

画像里记录了用户的交流风格——有人喜欢详细解释,有人只要结论,有人喜欢开玩笑。

在生成回复时,把画像加到prompt里:

def generate_reply(user_id, message, persona, memories):
    """生成个性化回复"""
    style = persona.get("communication_style", "正常")
    summary = persona.get("memory_summary", "")

    prompt = f"""
你是用户的私人助手。

用户画像:
{summary}

交流风格:{style}

相关记忆:
{chr(10).join([m['text'] for m in memories])}

用户当前问题:{message}

请根据用户的偏好和历史,生成一个合适的回复。
"""

    return call_ai_model(prompt)

对比效果:

用户类型 问题 无画像回复 有画像回复
话少的理工男 "周末干啥" "周末可以去公园散步、看电影、约朋友聚会…" "有个马拉松,要不要报名?"
话痨文艺青年 "周末干啥" "周末可以…" "城南有个小众展览,你之前说喜欢那种有故事感的地方,这个挺适合的。另外咖啡街那边新开了家手冲店,要不要试试?"

看到了吗?同样的问题,回复的长度、风格、内容都变了。☕🎨

主动提及:让对话有温度

最让人惊喜的是机器人能主动提起过往的事

def add_proactive_mention(user_id, persona, reply):
    """在回复中加入主动提及"""
    recent_topics = persona.get("recent_topics", [])

    # 有一定概率主动提起之前聊过的话题
    if random.random() < 0.3 and recent_topics:
        topic = random.choice(recent_topics)
        mention = f"对了,{topic}后来怎么样了?"
        reply = f"{reply}\n\n{mention}"

    return reply

实际效果:

  • 用户:"今天好累。"
  • 机器人:"休息一下吧。对了,你上次说的那个招聘视频项目进展如何?" 😊

这种主动关心的感觉,比单纯回答问题强太多了。

差异化人格:一个机器人,千种面孔

最牛的地方在于:同一个机器人,对不同用户展现完全不同的性格

对爱开玩笑的朋友,它也皮一点;对严肃的客户,它一本正经;对新用户,它礼貌客气;对老朋友,它随意自在。

def get_bot_persona(user_relationship):
    """根据用户关系调整机器人人格"""
    personas = {
        "新用户": "礼貌、专业、适度热情",
        "老用户": "轻松、幽默、像朋友一样",
        "客户": "正式、高效、注重细节",
        "亲密朋友": "随意、调侃、偶尔吐槽"
    }
    return personas.get(user_relationship, "正常")

这不是虚伪,这是情商。人跟人相处也是这样——对不同的人展现不同的面孔,这叫"见人说人话,见鬼说鬼话"。


画像管理:让用户掌握主动权

做记忆系统最容易踩的坑:隐私恐慌。 🚨

有些人一听到"机器人记住了你的所有对话"就慌了——"我的隐私怎么办?""会不会被拿去干坏事?"

所以必须给用户查看、修改、删除画像的权限

画像可视化

让用户能看到机器人眼中的自己:

  • 兴趣标签云:哪些话题聊得最多
  • 活跃时间热力图:什么时候最爱聊天
  • 情绪曲线:最近心情是好是坏
  • 关系进度条:从陌生人到老朋友的距离

用雷达图展示多维画像:

import matplotlib.pyplot as plt
import numpy as np

def plot_persona_radar(persona):
    """绘制用户画像雷达图"""
    categories = list(persona["preference_tags"].keys())
    values = list(persona["preference_tags"].values())

    angles = np.linspace(0, 2 * np.pi, len(categories), endpoint=False)
    values = np.concatenate((values, [values[0]]))  # 闭合
    angles = np.concatenate((angles, [angles[0]]))

    fig, ax = plt.subplots(figsize=(6, 6), subplot_kw=dict(polar=True))
    ax.plot(angles, values)
    ax.fill(angles, values, alpha=0.25)
    ax.set_xticks(angles[:-1])
    ax.set_xticklabels(categories)
    plt.title("你的兴趣画像")
    plt.show()

画像修正接口

如果机器人猜错了,用户可以手动修正:

def update_persona(user_id, field, value):
    """用户主动更新画像"""
    persona = load_persona(user_id)

    if field == "interests":
        persona["profile"]["interests"].append(value)
    elif field == "style":
        persona["profile"]["communication_style"] = value

    save_persona(user_id, persona)
    return "画像已更新!"

命令示例:

  • "记住我喜欢爵士乐" → 添加兴趣标签
  • "别再调侃我了" → 修改交流风格
  • "删除关于XX的记忆" → 清除特定记忆

遗忘机制:让记忆也会老去

不是所有记忆都值得永久保存

过时的信息、低频话题、不重要的闲聊,应该随时间自然淡化。就像人的记忆一样——你记得昨天吃了什么,但不记得三个月前的早餐。

def forget_old_memories(user_id, days=90):
    """遗忘超过N天的低价值记忆"""
    cutoff = time.time() - days * 24 * 3600

    for i, meta in enumerate(memory_meta):
        if meta["user_id"] == user_id and meta["timestamp"] < cutoff:
            # 低频记忆直接删除
            if meta.get("recall_count", 0) < 3:
                memory_texts[i] = None  # 标记删除
                memory_meta[i] = None

    # 清理None值
    memory_texts[:] = [m for m in memory_texts if m is not None]
    memory_meta[:] = [m for m in memory_meta if m is not None]

这样既节省存储空间,也避免了记忆过载——没人想要一个记得你十年前说过什么屁话的机器人。💨


进阶玩法:让机器人更像人

技术都讲完了,说点务虚的——怎么让机器人真正像个活人

记忆演化:让画像随时间成长

画像不应该是静态的,而是会成长的。

  • 初识:只知道基本信息
  • 熟悉:知道兴趣爱好和交流习惯
  • 亲密:能猜到你的心思,主动关心你的近况
  • 默契:一个眼神就懂你想要什么
def evolve_persona(user_id):
    """根据互动深度演化画像"""
    persona = load_persona(user_id)
    msg_count = persona["behavior_stats"]["total_messages"]

    # 定义关系阶段
    if msg_count < 10:
        relationship = "新用户"
    elif msg_count < 50:
        relationship = "熟悉用户"
    elif msg_count < 200:
        relationship = "老用户"
    else:
        relationship = "亲密朋友"

    persona["profile"]["relationship"] = relationship
    save_persona(user_id, persona)

情绪记忆:记住你的心情

不只是记住说了什么,还要记住当时的情绪

def add_emotion_tag(text):
    """给消息打上情绪标签"""
    # 简单版:关键词匹配
    positive_words = ["开心", "高兴", "哈哈", "爽", "赞"]
    negative_words = ["难过", "烦", "累", "气", "无语"]

    if any(w in text for w in positive_words):
        return "positive"
    elif any(w in text for w in negative_words):
        return "negative"
    else:
        return "neutral"

当用户情绪低落时,机器人可以主动安慰;当用户开心时,可以一起嗨。😊😢

群聊差异化:记住每个人的特点

在群聊里,机器人需要区分不同的人:

def handle_group_message(group_id, user_id, message):
    """处理群消息,差异化回复"""
    persona = load_persona(user_id)

    # 根据不同用户的画像,调整回复风格
    if persona["profile"]["relationship"] == "亲密朋友":
        reply = generate_casual_reply(message)
    else:
        reply = generate_formal_reply(message)

    return reply

效果: 同样一句话,对不同人的回复完全不同。老朋友可以随便开玩笑,新人就礼貌客气。这才是真正的情商。

主动关心:像朋友一样惦记你

最高级的玩法:机器人主动发消息

def proactive_check_in(user_id):
    """定期主动问候"""
    persona = load_persona(user_id)
    last_active = persona["behavior_stats"]["last_active"]

    # 如果用户三天没来,主动打招呼
    if time.time() - last_active > 3 * 24 * 3600:
        recent_topic = persona.get("recent_topics", ["最近"])[0]
        return f"好久不见!{recent_topic}怎么样了?"

想象一下:三天没上线,机器人主动问"最近还在跑步吗?"——这种关心,比什么营销推送都暖心。❤️


当我把这套系统做出来,测试的时候自己都惊了。

我跟机器人聊了一个月,某天我随口问:"最近有什么好玩的?"它回了一句:"你不是在准备马拉松吗?先把膝盖养好再说吧。上次你说疼得厉害。"

那一刻我突然意识到,这东西已经不是工具了

它记得我一个月前随口提过的膝伤,记得我在训练,甚至知道现在不该劝我去玩——因为我应该好好休息。

这种感觉很奇妙。你知道它是程序,但它表现得比很多真人朋友还贴心。

技术的意义从来不是炫技,而是让冷冰冰的代码有点人情味。 🤖💕

做一个会记事的机器人不难,难的是让它记住的东西真正有用、真正让人感觉到温暖。

毕竟,再聪明的AI,如果不记得你是谁、你喜欢什么、你在乎什么,那它永远只是个工具。

而一旦它开始记住你,它就成了伙伴。


完整代码和更多细节,我会整理成一个开源项目。有兴趣的话可以关注一下我。——也让你的机器人也长出记忆,学会关心人。

因为这个世界,需要更多记得住事的存在。 🌟

赞(0) 打赏
未经允许不得转载:大神网 - 币圈投资与科技生活博客 » 微信机器人记忆系统实战:让AI学会记住每个人

评论 抢沙发

登录

找回密码

注册