✅ Dify分隔符功能
🎯 问题理解
当使用Dify上传CSV时,如果使用\n\n或.pdf等常见字符作为分段标识符,会导致chunk被错误切割,破坏元数据的完整性。
🔧 解决方案
在每个chunk的末尾添加一个唯一的、不会出现在正文中的特殊分隔符,Dify使用这个分隔符来准确切割chunk。
📦 实现内容
1. 核心配置
文件:src/pdf_processor/config.py
OUTPUT_CONFIG = { # Dify专用chunk分隔符(用于Dify上传时的分段标识符) "dify_chunk_separator": "<<<>>>", }2. 功能实现
文件:src/pdf_processor/metadata_manager.py
- 在
format_for_dify()方法中自动添加分隔符 - 分隔符添加在每个chunk的末尾
- 保持原有元数据结构不变
3. 命令行参数
文件:process_papers.py
新增参数:
--add-separator- 启用分隔符(默认)--no-separator- 禁用分隔符--separator- 自定义分隔符
4. 测试工具
新增文件:test_dify_separator.py
- 验证分隔符是否正确添加
- 显示CSV文件内容
- 检查所有chunk都有分隔符
📊 输出示例
CSV格式
Dify分段效果
使用正确的分隔符:
Chunk-1: content: This paper presents a novel approach for vulnerability detection using deep learning. Our method achieves state-of-the-art performance. metadata: {"category":"vulnerability_mining","year":"2024","section":"Abstract","chunk_id":1} source: test_paper.pdf Chunk-2: content: The proposed method consists of three main components... metadata: {"category":"vulnerability_mining","year":"2024","section":"Method","chunk_id":2} source: test_paper.pdf✅元数据完整保留!chunk边界准确!
🚀 使用方法
默认使用(推荐)
python process_papers.py --input ./papers每个chunk末尾会自动添加:<<<>>>
Dify导入步骤
- 上传生成的CSV文件到Dify
- 在分段设置中,设置:
- 分段标识符:
<<<>>>
- 分段标识符:
- 开始处理
自定义分隔符
python process_papers.py --input ./papers \ --separator "<<<MY_CUSTOM_SEPARATOR>>>"然后在Dify中设置对应的分段标识符。
✅ 测试结果
所有测试通过:
- ✅ 默认分隔符正常工作
- ✅ 自定义分隔符正常工作
- ✅ 禁用分隔符功能正常
- ✅ CSV输出格式正确
- ✅ 所有chunk都有分隔符
💡 分隔符设计原则
- 独特性:包含特殊字符,不会出现在正文中
- 长度适中:43个字符
- 描述性强:明确标识这是chunk结束
- 包含日期:避免未来重复
- 易于识别:便于用户查看和设置
📚 文档
新增文档:
DIFY_SEPARATOR_GUIDE.md- 完整使用指南
更新文档:
QUICK_REFERENCE.md- 添加分隔符相关命令
🔍 测试工具
# 验证分隔符功能 python test_dify_separator.py🎯 优势
与之前方案的对比
| 方案 | 问题 | 解决方案 |
|---|---|---|
使用\n\n | chunk中的换行会被误切 | ✅ 使用唯一分隔符 |
使用.pdf | 文件名会被切分 | ✅ 使用唯一分隔符 |
使用--- | 正文中的分隔符会导致错误 | ✅ 使用独特分隔符 |
| 当前方案 | - | ✅完美解决 |
核心优势
- 元数据完整性:每个chunk的元数据准确对应
- 准确分段:Dify按指定分隔符切割
- 灵活配置:支持自定义分隔符
- 易于验证:测试工具可验证
CSV输出模式
Merged模式(推荐,默认)
问题:在标准CSV格式中,分隔符在content列末尾,后面还有metadata和source列,Dify可能无法正确分段。
解决方案:使用merged模式,将所有信息合并到content列,确保分隔符在最末尾。
CSV格式对比:
Standard模式:
content,metadata,source "文本内容...<<<>>>","{""category"":""...""}",paper.pdf⚠️ 问题:分隔符后面还有列,Dify可能无法正确分段
Merged模式(推荐):
content,metadata,source "文本内容...[Metadata: {...}] [Source: paper.pdf]<<<>>>",,✅ 优势:所有信息在content中,分隔符在最末尾,准确分段
使用方法
# 默认使用merged模式(推荐) python process_papers.py --input ./papers # 显式指定merged模式 python process_papers.py --input ./papers --csv-mode merged # 使用standard模式(不推荐) python process_papers.py --input ./papers --csv-mode standard测试工具
# 测试两种CSV模式 python test_csv_modes.py📝 元数据精简
精简前
包含冗余字段:
chunk_id: 在merged模式下不需要
精简后
仅保留核心检索字段:
category: 论文类型category_cn: 中文类型year: 发表年份section: 章节char_count: 字符数source_file: 来源文件title: 论文标题
这些字段对检索和筛选最有价值,移除了对业务逻辑无用的字段。
📝 常见问题
Q: 分隔符会出现在正文中吗?A: 默认分隔符非常独特,几乎不可能出现在学术论文正文中。
Q: Dify支持这种分隔符吗?A: 支持。Dify的分段标识符可以设置为任意字符串。
Q: 分隔符会影响检索质量吗?A: 不会影响。分隔符只是用于分段,检索时仍然基于内容本身。
🎉 总结
现在的实现完全符合需求:
- ✅ 在Python代码中每个chunk末尾添加统一特殊分隔符
- ✅ 分隔符是唯一的,不会出现在正文中
- ✅ Dify使用这个分隔符准确切割chunk
- ✅ 保持了元数据的完整性