🏷️ Chunk标记功能说明
功能概述
Chunk标记功能会在每个文本块的末尾自动添加一个特殊标记,包含chunk的元数据信息(如chunk_id、章节、时间戳等)。这有助于在Dify知识库中更好地识别和管理chunk。
默认标记格式
启用状态
默认开启:add_chunk_marker = True
默认模板
chunk_marker_template = "\n\n--- [Chunk #{chunk_id} | Section: {section} | {timestamp}] ---"示例输出
This paper presents a novel approach for vulnerability detection using deep learning. --- [Chunk #1 | Section: Abstract | ] ---可用变量
在自定义标记模板中,可以使用以下变量:
| 变量 | 说明 | 示例 |
|---|---|---|
{chunk_id} | Chunk编号 | 1, 2, 3... |
{section} | 章节名称 | Abstract, Introduction, Method... |
{filename} | 源文件名 | paper.pdf |
{timestamp} | 处理时间戳 | |
{year} | 论文发表年份 | 2024, 2023... |
{category} | 论文类型(英文) | vulnerability_mining |
{category_cn} | 论文类型(中文) | 漏洞挖掘 |
使用方法
方法1:使用默认标记(推荐)
python process_papers.py --input ./papers方法2:禁用chunk标记
python process_papers.py --input ./papers --no-marker方法3:使用自定义标记
简洁时间戳格式
python process_papers.py --input ./papers \ --marker-template "\n\n--- [{timestamp}] Chunk #{chunk_id} ---"Dify友好格式(便于检索)
python process_papers.py --input ./papers \ --marker-template "\n\n[EOF_CHUNK]\nid:{chunk_id}\nsection:{section}\n[/EOF_CHUNK]"完整信息格式
python process_papers.py --input ./papers \ --marker-template "\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n Chunk #{chunk_id} | {section}\n {filename} | {year}\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"推荐的标记格式
1. 简洁格式(适合快速识别)
"\n\n--- [Chunk #{chunk_id}] ---"优点:
- 标记简短,不占用太多token
- 易于识别chunk边界
适用场景:
- 需要节省token空间
- 快速浏览内容
2. 详细格式(默认推荐)
"\n\n--- [Chunk #{chunk_id} | Section: {section} | {timestamp}] ---"优点:
- 包含关键信息(章节、时间戳)
- 便于调试和追踪
- 平衡信息量和简洁性
适用场景:
- 通用场景
- 需要快速定位特定章节
3. Dify友好格式(便于检索和过滤)
"\n\n[EOF_CHUNK]\nid:{chunk_id}\nsection:{section}\nyear:{year}\ncategory:{category}\n[/EOF_CHUNK]"优点:
- 使用特殊标签包围,便于正则提取
- 包含所有元数据
- 适合在Dify中进行高级过滤
适用场景:
- 需要按章节、年份、类型检索
- 构建复杂的查询条件
4. 完整信息格式(适合调试)
"\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n Chunk #{chunk_id} | {section}\n Source: {filename} | Year: {year} | Category: {category}\n Processed: {timestamp}\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"优点:
- 信息最完整
- 视觉上突出
- 便于问题追踪
适用场景:
- 调试和验证
- 需要详细的元数据
在Dify中的使用
1. 识别chunk边界
在Dify的检索结果中,可以通过标记快速识别不同的chunk:
... vulnerability detection using deep learning. --- [Chunk #5 | Section: Method | ] --- Our method consists of three main components...2. 按章节检索
在Prompt中指示模型关注特定章节:
请重点关注标记为 "Section: Abstract" 或 "Section: Conclusion" 的chunk3. 追踪来源
通过标记中的时间戳和文件名,可以追踪每个chunk的来源:
从时间戳为 的结果中查找最新处理的chunk配置文件修改
你也可以直接修改配置文件src/pdf_processor/config.py:
OUTPUT_CONFIG = { # ... 其他配置 # 是否在content末尾添加chunk标记 "add_chunk_marker": True, # chunk标记格式 "chunk_marker_template": "\n\n--- [Chunk #{chunk_id} | Section: {section}] ---", # 时间戳格式 "chunk_timestamp_format": "%Y-%m-%d %H:%M:%S", }测试工具
查看不同标记格式的效果
python test_chunk_markers.py这将展示5种不同标记格式的效果,帮助你选择最适合的格式。
简单测试单个chunk
python test_chunk_marker_simple.py注意事项
1. Token消耗
添加chunk标记会增加每个chunk的token消耗:
- 简洁格式:~10-15 tokens
- 详细格式:~20-30 tokens
- 完整格式:~50-70 tokens
建议:根据你的token预算和实际需求选择格式。
2. Dify分段设置
在使用chunk标记时,建议在Dify中:
- 索引模式:高质量
- 分段设置:使用CSV自带分段(不要自动分段)
- 预处理:保留元数据
3. 兼容性
- 所有标记格式都兼容Dify CSV导入
- 标记会被包含在content中,但不影响向量化和检索
- 可以在Prompt中指示模型忽略标记
示例场景
场景1:构建按章节检索的知识库
python process_papers.py --input ./papers \ --marker-template "\n\n[SECTION:{section}][ID:{chunk_id}]"在Dify中查询:
检索所有 [SECTION:Abstract] 或 [SECTION:Conclusion] 的内容场景2:追踪最新处理的论文
python process_papers.py --input ./papers \ --marker-template "\n\n--- [{timestamp}] {filename} Chunk #{chunk_id} ---"在Dify中查询:
找出所有时间戳为 的chunk场景3:按年份和类型筛选
python process_papers.py --input ./papers \ --marker-template "\n\n[Year:{year}][Type:{category}] Chunk #{chunk_id}"在Dify中查询:
只检索 [Year:2024] 且 [Type:vulnerability_mining] 的chunk常见问题
Q1: 可以禁用chunk标记吗?
A: 可以,使用--no-marker参数:
python process_papers.py --input ./papers --no-markerQ2: chunk标记会影响检索质量吗?
A: 影响极小。标记只占很小的比例,而且通常位于chunk末尾,不会影响主要内容。如果担心,可以使用简洁格式或禁用标记。
Q3: 可以在处理后再添加标记吗?
A: 不推荐。建议在处理时添加,这样可以确保标记与chunk同步。如果需要,可以写脚本批量修改CSV文件。
Q4: 时间戳格式可以修改吗?
A: 可以,修改配置文件中的chunk_timestamp_format:
"chunk_timestamp_format": "%Y-%m-%d" # 只保留日期Q5: 标记中的中文会显示乱码吗?
A: 不会。CSV文件使用UTF-8-BOM编码,完美支持中文。
进阶用法
动态标记格式
根据不同的论文类型使用不同的标记:
# 在 processor.py 中修改 def process_file(self, pdf_path: str) -> List[Dict]: # ... 现有代码 ... # 根据category选择标记格式 if metadata["category"] == "llm_security": OUTPUT_CONFIG["chunk_marker_template"] = "\n\n[LLM] Chunk #{chunk_id}" else: OUTPUT_CONFIG["chunk_marker_template"] = "\n\n--- [Chunk #{chunk_id}] ---" # ... 现有代码 ...添加自定义信息
在metadata中添加自定义字段,然后在标记中使用:
chunk["metadata"]["custom_field"] = "重要" template = "\n\n--- [#{chunk_id} | Tag: {custom_field}] ---"总结
Chunk标记功能提供了灵活的方式来增强CSV输出,便于在Dify中更好地管理和检索知识库内容。根据你的具体需求选择合适的标记格式,或自定义你需要的格式。
推荐配置:
- 通用场景:使用默认详细格式
- Token敏感:使用简洁格式
- 高级检索:使用Dify友好格式
祝你的知识库构建顺利!🎉