smart_rag 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/.env.example +252 -0
  3. data/.rspec +2 -0
  4. data/AGENTS.md +33 -0
  5. data/API_DOCUMENTATION.md +828 -0
  6. data/CHANGELOG.md +16 -1
  7. data/ER-diagram.mmd +144 -0
  8. data/Gemfile +50 -0
  9. data/Gemfile.lock +398 -0
  10. data/Hybrid_Reranking.md +171 -0
  11. data/README.en.md +420 -28
  12. data/README.md +534 -63
  13. data/Rakefile +268 -0
  14. data/SETUP_GUIDE.md +650 -0
  15. data/SmartChunking.md +180 -0
  16. data/USAGE_EXAMPLES.md +1002 -0
  17. data/config/llm_config.yml +4 -2
  18. data/config/smart_rag.yml +45 -1
  19. data/config.ru +15 -0
  20. data/db/migrations/006_create_text_search_configs.rb +3 -2
  21. data/db/migrations/008_create_embeddings.rb +5 -4
  22. data/db/migrations/012_add_metadata_to_source_sections.rb +11 -0
  23. data/db/migrations/013_create_media_jobs.rb +25 -0
  24. data/db/migrations/014_add_media_job_operations_indexes.rb +11 -0
  25. data/db/migrations/015_add_media_leases_and_objects.rb +80 -0
  26. data/db/migrations/016_add_document_principals_and_staging_references.rb +38 -0
  27. data/db/migrations/017_add_media_job_request_fingerprint.rb +48 -0
  28. data/db/seeds/text_search_configs.sql +3 -3
  29. data/design.md +1057 -0
  30. data/docs/API_DOCUMENTATION.md +838 -0
  31. data/docs/DOCUMENTATION_INDEX.en.md +60 -0
  32. data/docs/DOCUMENTATION_INDEX.md +65 -0
  33. data/docs/FIX_SUMMARY.md +256 -0
  34. data/docs/FIX_SUMMARY_COMPLETE.md +273 -0
  35. data/docs/Hybrid_Reranking.md +171 -0
  36. data/docs/MIGRATION_GUIDE.md +151 -0
  37. data/docs/PERFORMANCE_GUIDE.md +58 -0
  38. data/docs/SETUP_GUIDE.md +659 -0
  39. data/docs/SmartChunking.md +180 -0
  40. data/docs/USAGE_EXAMPLES.md +1008 -0
  41. data/docs/design.md +1057 -0
  42. data/docs/evidence_pack.md +211 -0
  43. data/docs/requirements.md +376 -0
  44. data/docs/retrieval_plan.md +251 -0
  45. data/docs/smartrag_improvement_plan.md +201 -0
  46. data/docs/smartrag_refactor.md +216 -0
  47. data/docs/todo.md +931 -0
  48. data/examples/common.rb +1 -1
  49. data/exe/smart-rag-db +163 -0
  50. data/exe/smart-rag-media-worker +34 -0
  51. data/lib/smart_rag/config.rb +12 -0
  52. data/lib/smart_rag/core/document_processor.rb +80 -16
  53. data/lib/smart_rag/core/local_content_store.rb +51 -0
  54. data/lib/smart_rag/core/media_extractors.rb +140 -0
  55. data/lib/smart_rag/core/media_job_queue.rb +353 -0
  56. data/lib/smart_rag/core/media_metadata_extractor.rb +188 -0
  57. data/lib/smart_rag/core/media_object_registry.rb +79 -0
  58. data/lib/smart_rag/core/media_processor.rb +228 -0
  59. data/lib/smart_rag/core/media_safety_policy.rb +61 -0
  60. data/lib/smart_rag/core/s3_content_store.rb +78 -0
  61. data/lib/smart_rag/core/transcript_normalizer.rb +44 -0
  62. data/lib/smart_rag/core/video_semantic_extractor.rb +130 -0
  63. data/lib/smart_rag/http_access_policy.rb +86 -0
  64. data/lib/smart_rag/http_app.rb +188 -0
  65. data/lib/smart_rag/models/embedding.rb +1 -1
  66. data/lib/smart_rag/models/research_topic.rb +1 -1
  67. data/lib/smart_rag/models/research_topic_section.rb +5 -0
  68. data/lib/smart_rag/models/research_topic_tag.rb +5 -0
  69. data/lib/smart_rag/models/search_log.rb +1 -1
  70. data/lib/smart_rag/models/section_fts.rb +5 -0
  71. data/lib/smart_rag/models/section_tag.rb +5 -0
  72. data/lib/smart_rag/models/source_document.rb +1 -1
  73. data/lib/smart_rag/models/source_section.rb +1 -1
  74. data/lib/smart_rag/models/tag.rb +1 -1
  75. data/lib/smart_rag/models/text_search_config.rb +5 -0
  76. data/lib/smart_rag/retrieve.rb +72 -1
  77. data/lib/smart_rag/services/embedding_service.rb +1 -1
  78. data/lib/smart_rag/services/fulltext_search_service.rb +11 -13
  79. data/lib/smart_rag/services/hybrid_search_service.rb +15 -11
  80. data/lib/smart_rag/services/summarization_service.rb +1 -1
  81. data/lib/smart_rag/services/tag_service.rb +1 -1
  82. data/lib/smart_rag/version.rb +1 -1
  83. data/lib/smart_rag.rb +264 -30
  84. data/patch_language.rb +27 -0
  85. data/requirements.md +376 -0
  86. data/source_documents_export.json +11072 -0
  87. data/todo.md +931 -0
  88. data/workers/analyze_content.rb +6 -2
  89. data/workers/get_embedding.rb +1 -1
  90. metadata +151 -38
data/SmartChunking.md ADDED
@@ -0,0 +1,180 @@
1
+ # RAGFlow SmartChunking 技术介绍
2
+
3
+ RAGFlow 的智能切片(Smart Chunking)技术是其区别于传统 RAG 框架的核心竞争力。截至 2026 年,该技术已演进为一套基于“深度文档理解”的体系化方案,旨在解决“垃圾输入导致垃圾输出(GIGO)”的行业痛点。
4
+
5
+ 以下是 RAGFlow 智能切片技术的详细介绍:
6
+
7
+ 1. 技术核心:基于布局的语义分割
8
+
9
+ 传统的 RAG 框架通常采用“固定字符数”或“简单递归”切片,这往往会切断段落或表格的语义。RAGFlow 引入了 DeepDoc 引擎,通过以下步骤实现智能切片:
10
+ 视觉布局分析 (Visual Layout Analysis):利用视觉深度学习模型识别文档中的标题、段落、列表、表格及图片位置。
11
+ 物理到逻辑的转换:不仅提取文本,更理解“什么是标题”、“什么是对应的正文”,确保切片边界严格遵循文档的逻辑结构。
12
+
13
+ 2. 场景化解析模板(Template-based Chunking)
14
+
15
+ RAGFlow 针对不同格式的文档提供了 10 余种专用解析器,确保每类文档都能按最优逻辑切分:
16
+ General(通用模式):适用于一般文章,按段落和标题层次切分。
17
+ Manual(手册模式):专为技术说明书设计,能够关联标题与多级步骤,保持上下文连贯。
18
+ Table(表格模式):自动重构表格结构,将复杂的行列关系转化为可供 LLM 理解的 Markdown 或 HTML 格式。
19
+ Paper(论文模式):识别摘要、引文、图表说明,过滤掉页眉页脚等干扰信息。
20
+ Laws/Finance(法律/金融):精准识别条款编号和报表勾稽关系。
21
+
22
+ 3. 先进算法加持
23
+
24
+ 在 2026 年的版本中,RAGFlow 结合了多项前沿算法优化检索性能:
25
+ 语义张力检测(Semantic Tension Awareness):动态感知语义转折点,避免在话题切换处进行错误分割。
26
+ RAPTOR(递归摘要树):对于超长文档,系统会递归地对切片进行聚类并生成摘要,构建层级索引,解决跨切片的全局性提问。
27
+ 父子切片(Parent-Child Chunking):检索时通过小的子切片提高匹配精度,回答时则通过父切片提供更完整的背景上下文。
28
+
29
+ 4. 独特优势:可解释性与可视化
30
+
31
+ 解析过程透明化:RAGFlow 提供可视化界面,允许用户查看文档是如何被“切碎”的,并支持手动微调分块策略。
32
+ 精准溯源:在最终生成的回答中,每个引用都能精准定位到原始 PDF 中的具体矩形区域,而非仅仅给出一个模糊的文档 ID。
33
+ 通过这些技术,RAGFlow 的智能切片不仅提高了检索召回率,还显著减少了模型因上下文缺失而产生的幻觉问题。
34
+
35
+ # SmartChunking 设计方案
36
+
37
+ 以下方案紧贴 RAGFlow 的逻辑,但用 Ruby 可实现的模块化结构组织。
38
+
39
+ 1) 模块划分
40
+
41
+ - SmartChunking::Parser
42
+ 负责不同文件类型抽取:文本行、段落、布局信息、表格、图片引用。
43
+ - 参考入口:rag\app\book.py, rag\app\manual.py, rag\app\paper.py, rag\app\laws.py
44
+ - SmartChunking::StructureDetector
45
+ 标题/层级检测、TOC/outline 辅助识别、bullet 模式匹配。
46
+ - 参考:rag\nlp\__init__.py 的 BULLET_PATTERN、bullets_category、title_frequency
47
+ - SmartChunking::Merger
48
+ 提供 tree_merge, hierarchical_merge, naive_merge 等合并策略。
49
+ - 参考:rag\nlp\__init__.py
50
+ - SmartChunking::MediaContext
51
+ 表格/图片 chunk 上下文补齐。
52
+ - 参考:rag\nlp\__init__.py 的 attach_media_context
53
+ - SmartChunking::Tokenizer
54
+ 统一 token 计数、tokenize/fine-grained tokenize。
55
+ - 参考:rag\nlp\__init__.py 的 tokenize, num_tokens_from_string(common\token_utils)
56
+ - SmartChunking::Pipeline
57
+ 根据文档类型选择策略;输出 chunk 列表。
58
+
59
+ 2) 数据结构设计
60
+
61
+ - Section
62
+
63
+ text: String
64
+ layout: String? # "title"/"text"/"head" 等
65
+ position: [pn, x1, x2, y1, y2]? # 可选
66
+ - Chunk
67
+
68
+ text: String
69
+ image: Image? # or image_id
70
+ doc_type: "text"|"table"|"image"
71
+ positions: [] # 保留布局 tags 或 box
72
+ context_above: String?
73
+ context_below: String?
74
+ metadata: { ... } # 文档名、标题 tokens、important_kwd 等
75
+
76
+ 3) 标题/层级检测(核心)
77
+
78
+ - Bullet 模式表:复刻 BULLET_PATTERN(中英文数字、章/节/条、Markdown 标题等)。
79
+ - 参考:rag\nlp\__init__.py 的 BULLET_PATTERN
80
+ - bullets_category(sections)
81
+ 统计哪组模式命中最多,选为当前文档 bullet 风格。
82
+ - title_frequency(bull, sections)
83
+ 在所有段落中计算“最常见标题级别”,作为 pivot level(论文/手册使用)。
84
+ - 参考:rag\nlp\__init__.py 的 title_frequency
85
+
86
+ 4) 层级合并策略
87
+
88
+ - tree_merge(法规类)
89
+ - 将段落映射到等级(标题/正文),构建树(Node)后截断深度。
90
+ - depth=2 更适合法规层级。
91
+ - 参考:rag\nlp\__init__.py 的 tree_merge, Node + rag\app\laws.py
92
+ - hierarchical_merge(书籍类)
93
+ - 先分类所有段落索引到各级别数组,再从高到低组合成块。
94
+ - depth=5 适合长书的层级。
95
+ - 参考:rag\nlp\__init__.py + rag\app\book.py
96
+ - title_frequency + sec_id 合并(论文/手册类)
97
+ - 找到最常见标题级别 pivot,连续相同 sec_id 合并。
98
+ - 参考:rag\app\paper.py, rag\app\manual.py
99
+
100
+ 5) 文档类型策略选择
101
+
102
+ - manual
103
+ - 如果 PDF 有可靠 outline(pdf_parser.outlines),优先用 outline level;否则 fallback 到 bullet + title_frequency。
104
+ - 合并时考虑 token 预算(小段可以拼接)。
105
+ - 参考:rag\app\manual.py
106
+ - book
107
+ - 有明显目录/章节模式,先 remove_contents_table,再 make_colon_as_title,hierarchical_merge(depth=5)。
108
+ - 如果无明显 bullet 模式,回退到 naive_merge。
109
+ - 参考:rag\app\book.py
110
+ - laws
111
+ - remove_contents_table + make_colon_as_title + tree_merge(depth=2)。
112
+ - 参考:rag\app\laws.py
113
+ - paper
114
+ - 抽取标题/作者/摘要后,正文走 title_frequency 策略。
115
+ - 抽象摘要为单独 chunk。
116
+ - 参考:rag\app\paper.py
117
+
118
+ 6) 媒体上下文补齐
119
+
120
+ - 表格/图片 chunk 常常只有结构或没有文本:
121
+ - 在 chunk 前后按 token 预算取上下文句子拼到 context_above/context_below。
122
+ - 参考:rag\nlp\__init__.py 的 attach_media_context
123
+ - Ruby 复刻建议:
124
+ - 先句子切分(按中英文标点),再按 token 预算截取。
125
+ - 保留“上下文是补丁”的标记,避免后续重复归并。
126
+
127
+ 7) 位置与版面信息
128
+
129
+ - RAGFlow 用 @@pn\tl\tr\tt\tb## 形式嵌入位置标签,再由 parser 解析出来。
130
+ - 参考:rag\app\manual.py 内 tag() 与 pdf_parser.remove_tag/extract_positions
131
+ - Ruby 复刻建议:
132
+ - 保留位置数据结构(结构化字段),不要串入文本,便于后续裁剪/高亮。
133
+
134
+ 8) Tokenizer 与分块约束
135
+
136
+ - 分块合并时使用 token 估算,而不是字符数。
137
+ - naive_merge 支持“自定义分隔符”模式(反引号中是强分割)。
138
+ - 参考:rag\nlp\__init__.py 的 naive_merge
139
+ - Ruby 复刻:
140
+ - 可接入 tiktoken Ruby 绑定或自定义 BPE tokenizer;至少要提供“近似 token 计数”能力。
141
+
142
+ 9) 关键接口建议
143
+
144
+ - SmartChunking::Pipeline.chunk(document, parser_config, doc_type)
145
+ - 输出 chunks[],每个 chunk 带 text, doc_type, positions, image, context_above, context_below.
146
+ - parser_config 推荐字段:
147
+ - chunk_token_num, delimiter, table_context_size, image_context_size, layout_recognize.
148
+
149
+ 10) 伪代码(Ruby 版)
150
+
151
+ sections, tables, images = Parser.parse(doc)
152
+ sections = Cleaner.remove_contents(sections)
153
+ sections = Cleaner.make_colon_as_title(sections)
154
+
155
+ bull = StructureDetector.bullets_category(sections.map(&:text))
156
+
157
+ chunks =
158
+ case doc_type
159
+ when :laws
160
+ Merger.tree_merge(bull, sections, depth: 2)
161
+ when :book
162
+ bull >= 0 ? Merger.hierarchical_merge(bull, sections, depth: 5) :
163
+ Merger.naive_merge(sections, token_limit)
164
+ when :paper, :manual
165
+ pivot, levels = StructureDetector.title_frequency(bull, sections)
166
+ Merger.merge_by_pivot(sections, levels, pivot, token_limit)
167
+ else
168
+ Merger.naive_merge(sections, token_limit)
169
+ end
170
+
171
+ chunks = Tokenizer.tokenize_chunks(chunks, doc_meta)
172
+ chunks = MediaContext.attach(chunks, table_ctx, image_ctx)
173
+
174
+ 需要注意的差异/风险点
175
+
176
+ - RAGFlow 在 PDF 上依赖 DeepDOC 的布局识别能力;Ruby 复刻时如果没有同级别布局解析,标题识别会明显下降。建议先做“layout-aware 解析”,再应用结构规则。
177
+ - 处理中英文 bullet 规则时,要注意正则对 Unicode 的覆盖;RAGFlow 原始正则中包含中文数字、罗马数字等。
178
+ - title_frequency 的 pivot 规则在非常短/混乱文档可能失效,务必提供 fallback(naive_merge)。
179
+
180
+ 如果你希望,我可以再给出一份“Ruby 代码骨架 + 正则集合 + 单元测试样例”,以便直接开工。你也可以告诉我你打算支持的文件类型范围,我会收敛方案。