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

如何在LangChain中为每个用户创建ConversationBufferMemory隔离会话?

解决方案

核心思路

不需要子类化ConversationChain,LangChain本身支持为每个用户创建独立的ConversationBufferMemory实例,通过用户唯一ID关联存储即可实现会话隔离。

具体实现步骤

1. 搭建用户内存存储

用字典做临时存储(生产环境建议换成Redis、SQL数据库等持久化存储),以用户ID为键,存储对应的ConversationBufferMemory实例:

# 全局存储,生产环境替换为Redis/SQL
user_memory_store = {}

def get_user_memory(user_id: str) -> ConversationBufferMemory:
    if user_id not in user_memory_store:
        # 为新用户创建专属内存
        user_memory_store[user_id] = ConversationBufferMemory(memory_key="chat_history", k=12)
    return user_memory_store[user_id]

2. 修改FastAPI端点与LLM链逻辑

在接口中接收用户ID,获取对应内存后创建ConversationChain:

from langchain.memory import ConversationBufferMemory
from langchain.prompts import PromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationChain
from fastapi import FastAPI, Query

app = FastAPI()
OPENAI_API_KEY = "your-key-here"
interview_template = """你的对话模板内容"""

async def interview_function(input_text: str, user_id: str):
    prompt = PromptTemplate(
        input_variables=["chat_history", "input"], template=interview_template
    )
    chat_model = ChatOpenAI(
        model_name="gpt-4-1106-preview",
        temperature=0,
        openai_api_key=OPENAI_API_KEY,
        max_tokens=1000
    )
    # 获取用户专属内存
    user_memory = get_user_memory(user_id)
    llm_chain = ConversationChain(
        llm=chat_model,
        prompt=prompt,
        verbose=True,
        memory=user_memory,
    )
    
    return llm_chain.predict(input=input_text)

@app.get("/chat")
async def chat(input_text: str = Query(...), user_id: str = Query(...)):
    result = await interview_function(input_text, user_id)
    return {"response": result}

3. 持久化存储优化(可选)

如果需要持久化会话记录,用SQLChatMessageHistory替代默认内存存储,直接绑定用户ID:

from langchain.memory import ConversationBufferMemory
from langchain.memory.chat_message_histories import SQLChatMessageHistory

def get_user_memory(user_id: str) -> ConversationBufferMemory:
    # 连接数据库,每个user_id对应独立的消息历史表/条目
    message_history = SQLChatMessageHistory(
        session_id=user_id,
        connection_string="sqlite:///chat_history.db"  # 替换为你的数据库连接串
    )
    return ConversationBufferMemory(
        memory_key="chat_history",
        k=12,
        chat_memory=message_history
    )

为什么不需要子类化ConversationChain

LangChain的ConversationChain设计为与单个内存实例绑定,为每个用户创建独立的链+内存实例是最直接的会话隔离方式,子类化反而增加复杂度,且容易出现内存键访问问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:55:24