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

Pydantic ValidationError报错:ConversationBufferMemory2缺少chat字段

解决ConversationBufferMemory2实例化时的ValidationError问题

当前错误

ValidationError: 

File "/code/apps/llm_module/llm.py", line 183, in get_response
    memory = ConversationBufferMemory2()
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/langchain/load/serializable.py", line 74, in __init__
    super().__init__(**kwargs)
  File "pydantic/main.py", line 341, in pydantic.main.BaseModel.__init__
pydantic.error_wrappers.ValidationError: 1 validation error for ConversationBufferMemory2
chat
  field required (type=value_error.missing)

相关代码片段

llm.py

chat = Chat.objects.get(id=chat_id)
memory = ConversationBufferMemory2()
memory.set_chat(chat)

models2.py

from langchain.memory.buffer import ConversationBufferMemory
class ConversationBufferMemory2(ConversationBufferMemory):
    """Buffer for storing conversation memory."""

    chat:Chat

    #def __init__(self,*args, **kwargs):
    #    super().__init__(*args, **kwargs)
        
    def set_chat(self,chat:Chat):
        self.chat=chat
        
    @property
    def buffer(self) -> Any:
        """String buffer of memory. Each message is separated by a newline."""
        if self.return_messages:
            return self.chat.messages
        else:
            return get_buffer_string(
                self.chat.messages,
                human_prefix=self.human_prefix,
                ai_prefix=self.ai_prefix,
            )

解决方案

方法一:实例化时直接传入chat参数

修改llm.py中的代码,直接在实例化阶段传入必填的chat字段,无需后续调用set_chat:

chat = Chat.objects.get(id=chat_id)
memory = ConversationBufferMemory2(chat=chat)

方法二:将chat字段设为可选字段

修改models2.py中chat字段的定义,标记为可选并设置默认值None,这样实例化时可以暂时不传值,之后再通过set_chat方法赋值:

from typing import Optional
from langchain.memory.buffer import ConversationBufferMemory

class ConversationBufferMemory2(ConversationBufferMemory):
    """Buffer for storing conversation memory."""

    chat: Optional[Chat] = None
    
    def set_chat(self, chat: Chat):
        self.chat = chat
        
    @property
    def buffer(self) -> Any:
        """String buffer of memory. Each message is separated by a newline."""
        if self.return_messages:
            return self.chat.messages
        else:
            return get_buffer_string(
                self.chat.messages,
                human_prefix=self.human_prefix,
                ai_prefix=self.ai_prefix,
            )

注意:使用self.chat.messages前要确保chat已经通过set_chat正确赋值,避免触发AttributeError。

方法三:重写__init__方法延迟验证(不推荐)

如果必须保留chat为必填字段但需要延迟设置,可以重写__init__方法,暂时跳过Pydantic的初始化验证:

from langchain.memory.buffer import ConversationBufferMemory

class ConversationBufferMemory2(ConversationBufferMemory):
    """Buffer for storing conversation memory."""

    chat: Chat
    
    def __init__(self, *args, **kwargs):
        # 先移除chat参数,避免初始化时触发验证
        chat = kwargs.pop('chat', None)
        super().__init__(*args, **kwargs)
        if chat is not None:
            self.chat = chat
        
    def set_chat(self, chat: Chat):
        self.chat = chat
        
    @property
    def buffer(self) -> Any:
        """String buffer of memory. Each message is separated by a newline."""
        if self.return_messages:
            return self.chat.messages
        else:
            return get_buffer_string(
                self.chat.messages,
                human_prefix=self.human_prefix,
                ai_prefix=self.ai_prefix,
            )

这种方法需要额外的参数处理逻辑,仅在特殊场景下使用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 23:45:05