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
相关产品推荐
相关产品推荐

