langchain 解析MS Word文件,然后拆分块导致内存溢出,

fkvaft9z  于 3个月前  发布在  其他
关注(0)|答案(3)|浏览(63)

检查其他资源

  • 为这个问题添加了一个非常描述性的标题。
  • 使用集成搜索在LangChain文档中进行了搜索。
  • 使用GitHub搜索查找类似的问题,但没有找到。
  • 我确信这是LangChain中的一个bug,而不是我的代码。
  • 通过更新到LangChain的最新稳定版本(或特定集成包)无法解决此bug。

示例代码

#1st key code
            loader = UnstructuredWordDocumentLoader(self.file_path, mode="paged", strategy="fast", infer_table_structure=EXTRACT_TABLES)

#2ed key code
    def create_documents(
        self, texts: List[str], metadatas: Optional[List[dict]] = None
    ) -> List[Document]:
        """Create documents from a list of texts."""
        _metadatas = metadatas or [{}] * len(texts)
        documents = []
        for i, text in enumerate(texts):
            index = 0
            previous_chunk_len = 0
            for chunk in self.split_text(text):
                metadata = copy.deepcopy(_metadatas[i])
                if self._add_start_index:
                    offset = index + previous_chunk_len - self._chunk_overlap
                    index = text.find(chunk, max(0, offset))
                    metadata["start_index"] = index
                    previous_chunk_len = len(chunk)
                new_doc = Document(page_content=chunk, metadata=metadata)
                documents.append(new_doc)
        return documents

错误信息和堆栈跟踪(如果适用)

  • 无响应*

描述

使用 from langchain_community.document_loaders import UnstructuredWordDocumentLoader 解析带有大表格的word文件,然后得到 Document 对象。如果参数 infer_table_structure=True 是默认参数,每个文档元数据属性都包含一个 text_as_html 属性,这是一个大对象。
然后当使用 TextSplitter 将文档分割成块时,每个块文档都会深度复制一次元数据。
如果有很多块,内存会急剧增加,最后出现oom,程序将终止。

系统信息

langchain==0.2.3
langchain-community==0.2.4
langchain-core==0.2.5
langchain-text-splitters==0.2.1

iyr7buue

iyr7buue1#

这个问题可能是由于元数据中的text_as_html属性导致的,它是一个大型对象,不必要地进行了深度复制。
要解决这个问题,你可以尝试以下方法:在创建UnstructuredWordDocumentLoader时,设置infer_table_structure=False,如下所示:
loader = UnstructuredWordDocumentLoader(self.file_path, mode="paged", strategy="fast", infer_table_structure=False)
这将阻止生成text_as_html属性并减少内存使用。
如果这个问题仍然存在,请再次评论此问题,我将进一步调查此问题。

ngynwnxp

ngynwnxp2#

谢谢,是的,我试过这个方法,它解决了问题。我认为在深度复制元数据时,有些情况下可能需要有选择地忽略某些属性。例如,有时需要同时设置infer_table_structure=True和拆分文本。

9rygscc1

9rygscc13#

很高兴听到这个消息 😊

相关问题