LlamaIndex 0.14.7嵌入时如何排除元数据?
解决LlamaIndex嵌入时元数据过长的问题
针对你遇到的问题——即使设置了SentenceSplitter(include_metadata=False)仍报错元数据长度超过chunk size,可通过以下几种方法解决:
方法一:配置嵌入模型禁用元数据嵌入
如果你的嵌入模型支持控制是否嵌入元数据(比如OpenAIEmbedding),初始化时添加embed_metadata=False参数,让模型只嵌入文档文本,不处理元数据:
from llama_index.embeddings.openai import OpenAIEmbedding # 初始化嵌入模型时禁用元数据嵌入 embed_model = OpenAIEmbedding(embed_metadata=False) table_vec_store: SimpleVectorStore = SimpleVectorStore() pipeline: IngestionPipeline = IngestionPipeline( transformations=[ SentenceSplitter(chunk_size=300, chunk_overlap=15, include_metadata=False), embed_model ], vector_store=table_vec_store ) pipeline.run(documents=table_documents) self._table_index = VectorStoreIndex.from_vector_store(table_vec_store)
方法二:手动处理拆分与嵌入,临时移除元数据
若嵌入模型不支持禁用元数据嵌入,可手动拆分文档,临时移除元数据完成嵌入后再恢复,避免嵌入阶段处理长元数据:
from llama_index.core.node_parser import SentenceSplitter # 1. 拆分文档 splitter = SentenceSplitter(chunk_size=300, chunk_overlap=15, include_metadata=False) split_nodes = splitter.transform_documents(table_documents) # 2. 保存元数据并临时清空 temp_metadata = [node.metadata.copy() for node in split_nodes] for node in split_nodes: node.metadata = {} # 3. 嵌入处理 embedded_nodes = embed_model.embed_nodes(split_nodes) # 4. 恢复元数据 for idx, node in enumerate(embedded_nodes): node.metadata = temp_metadata[idx] # 5. 存入向量库并创建索引 table_vec_store.add(embedded_nodes) self._table_index = VectorStoreIndex.from_vector_store(table_vec_store)
方法三:临时增大chunk_size(不推荐,仅应急用)
如果上述方法都无法快速生效,可临时将chunk_size调至大于元数据最长字段的长度(比如设为400),但这可能会影响文本拆分的粒度和检索精度:
SentenceSplitter(chunk_size=400, chunk_overlap=15, include_metadata=False)
内容的提问来源于stack exchange,提问作者Trams
相关产品推荐
相关产品推荐

