LlamaIndex文档处理指南:从基础定义到高级定制
引言
在现代信息检索和问答系统中,文档处理是构建高效索引的基础环节。LlamaIndex作为强大的索引框架,提供了灵活且功能丰富的文档处理能力。本文将深入探讨LlamaIndex中的文档定义、元数据管理以及高级定制技巧,帮助开发者充分利用这一工具。
文档基础定义
自动创建文档
LlamaIndex提供了多种数据加载器,能够自动将不同格式的数据转换为标准文档对象。最常用的方式是使用SimpleDirectoryReader从目录加载文件:
from llama_index.core import SimpleDirectoryReader
# 从指定目录加载所有文件并转换为文档对象
documents = SimpleDirectoryReader("./data").load_data()
这种方式支持多种文件格式,包括PDF、Word、Excel等,会自动处理格式转换。
手动创建文档
对于特殊需求或非标准数据源,开发者可以手动构建文档对象:
from llama_index.core import Document
# 准备文本内容列表
text_list = ["这是第一个文档内容", "这是第二个文档内容"]
# 批量创建文档对象
documents = [Document(text=t) for t in text_list]
快速原型开发
在开发调试阶段,可以使用示例文档快速测试:
# 生成一个示例文档
document = Document.example()
文档元数据管理
元数据是文档处理中非常重要的组成部分,它能为检索和问答提供丰富的上下文信息。
元数据设置方式
- 构造函数设置:在创建文档时直接指定
document = Document(
text="文档正文内容",
metadata={
"filename": "年度报告.pdf",
"category": "财务",
"author": "财务部"
}
)
- 后期动态设置:文档创建后添加或修改
document.metadata = {
"publish_date": "2023-06-15",
"confidential_level": "内部"
}
- 自动化设置:使用文件读取器自动填充
from llama_index.core import SimpleDirectoryReader
# 定义元数据处理函数
filename_fn = lambda filename: {"source_file": filename}
# 自动为每个文档设置元数据
documents = SimpleDirectoryReader(
"./data",
file_metadata=filename_fn
).load_data()
元数据类型注意事项
当与向量数据库集成时,需注意:
- 元数据键必须是字符串类型
- 元数据值只能是字符串(str)、浮点数(float)或整数(int)
文档标识符管理
文档ID在索引更新和文档管理中起着关键作用。
自动设置文档ID
# 使用文件路径作为文档ID
documents = SimpleDirectoryReader("./data", filename_as_id=True).load_data()
手动设置文档ID
# 直接设置文档ID
document.doc_id = "custom_unique_identifier_001"
注意:文档ID也可以通过node_id或id_属性设置,与TextNode对象保持一致。
高级元数据定制
控制LLM可见的元数据
有时我们需要某些元数据参与嵌入生成但不暴露给LLM:
# 排除文件名字段不让LLM看到
document.excluded_llm_metadata_keys = ["filename"]
验证LLM实际看到的内容:
from llama_index.core.schema import MetadataMode
print(document.get_content(metadata_mode=MetadataMode.LLM))
控制嵌入模型可见的元数据
类似地,可以控制哪些元数据参与嵌入生成:
# 排除作者字段不影响嵌入
document.excluded_embed_metadata_keys = ["author"]
验证嵌入模型看到的内容:
print(document.get_content(metadata_mode=MetadataMode.EMBED))
自定义元数据显示格式
LlamaIndex提供了三种属性来精细控制元数据显示格式:
-
分隔符控制:修改元数据键值对之间的分隔符
document.metadata_seperator = "::" # 默认是换行符\n -
键值对格式:自定义每个元数据项的显示模板
document.metadata_template = "{key}=>{value}" # 默认是"{key}: {value}" -
整体文本格式:控制元数据与正文的组合方式
document.text_template = "元数据: {metadata_str}\n-----\n正文: {content}"
综合示例
下面是一个整合了各项定制功能的完整示例:
from llama_index.core import Document
from llama_index.core.schema import MetadataMode
# 创建高度定制的文档
document = Document(
text="这是高度定制化的文档内容",
metadata={
"filename": "机密文档.txt",
"department": "研发中心",
"security_level": "高"
},
excluded_llm_metadata_keys=["filename"], # 文件名对LLM不可见
excluded_embed_metadata_keys=["security_level"], # 安全级别不参与嵌入
metadata_seperator=" | ", # 自定义分隔符
metadata_template="[{key}]:{value}", # 自定义键值对格式
text_template="===== 元数据 =====\n{metadata_str}\n===== 内容 =====\n{content}"
)
# 查看不同模式下文档内容的呈现
print("LLM模式下的内容:\n", document.get_content(metadata_mode=MetadataMode.LLM))
print("\n嵌入模式下的内容:\n", document.get_content(metadata_mode=MetadataMode.EMBED))
元数据自动提取进阶
LlamaIndex还支持使用LLM自动从文档内容中提取元数据,这种方法特别适用于非结构化文档,可以自动识别文档中的关键信息如作者、日期、主题等作为元数据。这部分内容将在后续文章中详细介绍。
最佳实践建议
- 保持元数据简洁:只添加对检索和问答真正有帮助的元数据
- 命名一致性:保持元数据字段命名风格一致
- 性能考虑:过多的元数据会增加处理负担,需权衡需求与性能
- 测试验证:始终验证不同模式下文档内容的实际呈现效果
通过合理利用LlamaIndex的文档处理功能,开发者可以构建更加智能和高效的检索与问答系统。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



