You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LangChain聊天机器人重复查询时如何禁用内存访问

实现方案:重复查询(间隔≥指定分钟数)时禁止调用Zep内存

核心思路

通过为每个用户维护查询历史(含内容与时间戳),在每次新查询发起时先校验是否为指定时间间隔外的重复查询,若是则跳过Zep内存加载流程,直接进入实时数据处理环节。

具体步骤

1. 构建查询历史存储

需按用户维度维护查询记录,存储结构包含:

  • 用户ID(区分不同用户)
  • 查询内容
  • 查询时间戳(精确到分钟即可)

单用户场景可直接用内存字典,多用户场景建议用轻量数据库(如SQLite、Redis)或分布式缓存实现。示例代码:

from datetime import datetime

# 多用户场景:用字典嵌套存储,key为用户ID
multi_user_query_history = {}

2. 实现重复查询校验逻辑

每次用户发起查询时,执行以下判断:

  • 对比当前查询与历史查询的匹配度(支持精确匹配或语义相似度匹配)
  • 计算当前时间与历史查询时间的间隔是否≥设定阈值(比如5分钟)

精确匹配实现

def is_repeat_query(user_id, current_query, interval_minutes=5):
    current_time = datetime.now()
    # 获取用户历史记录
    user_history = multi_user_query_history.get(user_id, {})
    last_query = user_history.get("last_query")
    last_timestamp = user_history.get("last_timestamp")

    # 无历史记录时,更新记录并返回非重复
    if not last_query or not last_timestamp:
        multi_user_query_history[user_id] = {
            "last_query": current_query.strip().lower(),
            "last_timestamp": current_time
        }
        return False

    # 校验查询内容是否重复、时间间隔是否达标
    query_match = (current_query.strip().lower() == last_query)
    time_diff = (current_time - last_timestamp).total_seconds() / 60

    # 更新为最新查询记录
    multi_user_query_history[user_id] = {
        "last_query": current_query.strip().lower(),
        "last_timestamp": current_time
    }

    return query_match and time_diff >= interval_minutes

语义相似度匹配实现(适配表述略有差异但意图一致的场景)

from sentence_transformers import SentenceTransformer, util

# 初始化轻量语义匹配模型
semantic_model = SentenceTransformer('all-MiniLM-L6-v2')

def is_semantic_repeat(user_id, current_query, interval_minutes=5, similarity_threshold=0.9):
    current_time = datetime.now()
    user_history = multi_user_query_history.get(user_id, {})
    last_query = user_history.get("last_query")
    last_timestamp = user_history.get("last_timestamp")

    if not last_query or not last_timestamp:
        multi_user_query_history[user_id] = {
            "last_query": current_query,
            "last_timestamp": current_time
        }
        return False

    # 计算语义相似度
    current_embedding = semantic_model.encode(current_query, convert_to_tensor=True)
    last_embedding = semantic_model.encode(last_query, convert_to_tensor=True)
    similarity_score = util.cos_sim(current_embedding, last_embedding).item()

    time_diff = (current_time - last_timestamp).total_seconds() / 60

    multi_user_query_history[user_id] = {
        "last_query": current_query,
        "last_timestamp": current_time
    }

    return similarity_score >= similarity_threshold and time_diff >= interval_minutes

3. 集成到LangChain的Zep内存流程中

通过两种方式实现条件性跳过内存加载:

方式一:自定义ZepMemory子类,重写加载逻辑

from langchain.memory import ZepMemory

class ConditionalZepMemory(ZepMemory):
    def __init__(self, user_id, interval_minutes=5, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.user_id = user_id
        self.interval_minutes = interval_minutes

    def load_memory_variables(self, inputs):
        current_query = inputs.get(self.input_key)
        # 判断是否需要跳过内存加载
        if is_repeat_query(self.user_id, current_query, self.interval_minutes):
            # 返回空内存变量,即不调用Zep内存
            return {self.memory_key: ""}
        # 正常情况加载Zep内存
        return super().load_memory_variables(inputs)

方式二:在链执行前动态切换内存

from langchain.chains import ConversationChain
from langchain.llms import OpenAI

# 初始化带Zep内存的正常对话链
zep_memory = ZepMemory(
    session_id="user_123",
    zep_api_url="http://localhost:8000",
    memory_key="chat_history"
)
normal_chain = ConversationChain(
    llm=OpenAI(temperature=0),
    memory=zep_memory,
    verbose=True
)

# 初始化无内存的对话链(用于重复查询场景)
no_memory_chain = ConversationChain(
    llm=OpenAI(temperature=0),
    memory=None,
    verbose=True
)

# 处理用户查询的入口函数
def handle_user_query(user_id, query):
    if is_repeat_query(user_id, query):
        # 重复查询,使用无内存链
        return no_memory_chain.run(query)
    else:
        # 正常查询,使用带Zep内存的链
        return normal_chain.run(query)

4. 适配实时数据访问逻辑

由于机器人支持实时数据访问,在跳过内存后,需确保ReACT框架优先触发实时数据工具调用。可通过调整工具优先级配置,或在无内存场景下强制启用工具调用规则,避免依赖旧记忆内容。

注意事项

  • 多用户场景必须严格按用户ID隔离查询历史,避免跨用户干扰
  • 语义相似度匹配需额外依赖模型,若追求性能可选择轻量级模型或缓存嵌入结果
  • 可定期清理过期的历史记录,减少存储占用

内容的提问来源于stack exchange,提问作者Axen_Rangs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 08:47:06