vector-graph-rag 0.3.1__tar.gz → 0.4.0__tar.gz

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 (201) hide show
  1. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/.env.example +5 -3
  2. vector_graph_rag-0.4.0/.github/workflows/release.yml +69 -0
  3. vector_graph_rag-0.4.0/CHANGELOG.md +16 -0
  4. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/PKG-INFO +3 -3
  5. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/README.md +1 -1
  6. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/docs/architecture/design-philosophy.md +3 -7
  7. vector_graph_rag-0.4.0/docs/assets/evaluation/quality-latency.png +0 -0
  8. vector_graph_rag-0.4.0/docs/assets/evaluation/quality-latency.svg +438 -0
  9. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/docs/evaluation.md +14 -16
  10. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/docs/guides/reranking.md +17 -11
  11. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/docs/index.md +2 -2
  12. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/docs/reference/python-api.md +4 -3
  13. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/evaluation/README.md +11 -9
  14. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/evaluation/evaluate.py +4 -4
  15. vector_graph_rag-0.4.0/evaluation/jev/README.md +15 -0
  16. vector_graph_rag-0.4.0/evaluation/jev/two-stage/README.md +91 -0
  17. vector_graph_rag-0.3.1/evaluation/jev/two-stage/plot-data.json → vector_graph_rag-0.4.0/evaluation/jev/two-stage/chart-data.json +26 -18
  18. vector_graph_rag-0.4.0/evaluation/jev/two-stage/comparison.csv +16 -0
  19. vector_graph_rag-0.4.0/evaluation/jev/two-stage/flash-summary.json +218 -0
  20. vector_graph_rag-0.4.0/evaluation/jev/two-stage/plot.py +34 -0
  21. vector_graph_rag-0.4.0/evaluation/jev/two-stage/results.json.gz +0 -0
  22. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/evaluation/jev/two-stage/summarize.py +5 -1
  23. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/evaluation/jev/two-stage/summary.json +0 -20
  24. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/pyproject.toml +2 -2
  25. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/__init__.py +1 -1
  26. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/config.py +4 -1
  27. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/llm/cache.py +3 -3
  28. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/llm/extractor.py +9 -7
  29. vector_graph_rag-0.4.0/src/vector_graph_rag/llm/generation.py +53 -0
  30. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/llm/reranker.py +23 -26
  31. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/rag.py +1 -1
  32. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/tests/conftest.py +1 -1
  33. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/tests/test_api.py +1 -1
  34. vector_graph_rag-0.4.0/tests/test_generation_api.py +102 -0
  35. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/tests/test_observability.py +7 -4
  36. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/uv.lock +2 -2
  37. vector_graph_rag-0.3.1/.github/workflows/release.yml +0 -38
  38. vector_graph_rag-0.3.1/docs/assets/evaluation/api-cost-latency.png +0 -0
  39. vector_graph_rag-0.3.1/docs/assets/evaluation/api-cost-latency.svg +0 -537
  40. vector_graph_rag-0.3.1/docs/assets/evaluation/quality-latency.png +0 -0
  41. vector_graph_rag-0.3.1/docs/assets/evaluation/quality-latency.svg +0 -390
  42. vector_graph_rag-0.3.1/docs/assets/evaluation/retrieval-comparison.png +0 -0
  43. vector_graph_rag-0.3.1/docs/assets/evaluation/retrieval-comparison.svg +0 -689
  44. vector_graph_rag-0.3.1/evaluation/jev/README.md +0 -21
  45. vector_graph_rag-0.3.1/evaluation/jev/api-cost-latency-data.json +0 -77
  46. vector_graph_rag-0.3.1/evaluation/jev/api-cost-latency.md +0 -42
  47. vector_graph_rag-0.3.1/evaluation/jev/comparison-chart-data.json +0 -126
  48. vector_graph_rag-0.3.1/evaluation/jev/historical-500.md +0 -99
  49. vector_graph_rag-0.3.1/evaluation/jev/manifest.json +0 -6009
  50. vector_graph_rag-0.3.1/evaluation/jev/plot_api_comparison.py +0 -184
  51. vector_graph_rag-0.3.1/evaluation/jev/plot_retrieval.py +0 -157
  52. vector_graph_rag-0.3.1/evaluation/jev/results.json +0 -4002
  53. vector_graph_rag-0.3.1/evaluation/jev/summarize.py +0 -86
  54. vector_graph_rag-0.3.1/evaluation/jev/summary.json +0 -226
  55. vector_graph_rag-0.3.1/evaluation/jev/two-stage/README.md +0 -82
  56. vector_graph_rag-0.3.1/evaluation/jev/two-stage/plot.py +0 -164
  57. vector_graph_rag-0.3.1/evaluation/jev/two-stage/results.json.gz +0 -0
  58. vector_graph_rag-0.3.1/evaluation/jev/validation.json +0 -14
  59. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/.dockerignore +0 -0
  60. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/.github/workflows/docs.yml +0 -0
  61. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/.gitignore +0 -0
  62. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/AGENTS.md +0 -0
  63. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/CLAUDE.md +0 -0
  64. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/Dockerfile +0 -0
  65. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/LICENSE +0 -0
  66. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/api/__init__.py +0 -0
  67. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/api/main.py +0 -0
  68. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/api/schemas.py +0 -0
  69. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/docs/architecture/how-it-works.md +0 -0
  70. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/docs/assets/logo.png +0 -0
  71. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/docs/assets/logo.svg +0 -0
  72. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/docs/faq.md +0 -0
  73. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/docs/getting-started.md +0 -0
  74. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/docs/guides/document-import.md +0 -0
  75. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/docs/guides/embedding-providers.md +0 -0
  76. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/docs/guides/frontend.md +0 -0
  77. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/docs/guides/incremental-updates.md +0 -0
  78. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/docs/guides/index.md +0 -0
  79. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/docs/guides/multi-tenancy.md +0 -0
  80. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/docs/guides/observability.md +0 -0
  81. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/docs/reference/rest-api.md +0 -0
  82. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/docs/stylesheets/custom.css +0 -0
  83. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/docs/use-cases.md +0 -0
  84. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/evaluation/data/2wikimultihopqa.json +0 -0
  85. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/evaluation/data/2wikimultihopqa_corpus.json +0 -0
  86. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/evaluation/data/hotpotqa.json +0 -0
  87. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/evaluation/data/hotpotqa_corpus.json +0 -0
  88. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/evaluation/data/musique.json +0 -0
  89. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/evaluation/data/musique_corpus.json +0 -0
  90. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/evaluation/data/ner_cache/2wikimultihopqa_queries.named_entity_output.tsv +0 -0
  91. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/evaluation/data/ner_cache/hotpotqa_queries.named_entity_output.tsv +0 -0
  92. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/evaluation/data/ner_cache/hotpotqa_train_queries.named_entity_output.tsv +0 -0
  93. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/evaluation/data/ner_cache/musique_queries.named_entity_output.tsv +0 -0
  94. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/evaluation/data/ner_cache/sample_queries.named_entity_output.tsv +0 -0
  95. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/evaluation/data/openie_2wikimultihopqa_results_ner_gpt-3.5-turbo-1106_6119.json +0 -0
  96. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/evaluation/data/openie_hotpotqa_results_ner_gpt-3.5-turbo-1106_9221.json +0 -0
  97. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/evaluation/data/openie_musique_results_ner_gpt-3.5-turbo-1106_11656.json +0 -0
  98. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/evaluation/data/openie_test_sample_results_ner_gpt-3.5-turbo-1106_20.json +0 -0
  99. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/evaluation/data/test_sample.json +0 -0
  100. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/evaluation/data/test_sample_corpus.json +0 -0
  101. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/evaluation/jev/two-stage/manifest.json +0 -0
  102. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/evaluation/jev/two-stage/validation.json +0 -0
  103. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/.gitignore +0 -0
  104. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/README.md +0 -0
  105. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/eslint.config.js +0 -0
  106. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/index.html +0 -0
  107. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/package-lock.json +0 -0
  108. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/package.json +0 -0
  109. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/public/vite.svg +0 -0
  110. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/App.css +0 -0
  111. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/App.tsx +0 -0
  112. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/api/client.ts +0 -0
  113. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/api/queries.ts +0 -0
  114. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/assets/react.svg +0 -0
  115. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/components/graph/EntityNode.tsx +0 -0
  116. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/components/graph/GraphCanvas.tsx +0 -0
  117. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/components/graph/GraphLegend.tsx +0 -0
  118. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/components/graph/RelationEdge.tsx +0 -0
  119. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/components/graph/index.ts +0 -0
  120. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/components/import/CreateGraphDialog.tsx +0 -0
  121. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/components/import/FileUploader.tsx +0 -0
  122. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/components/import/GraphSelector.tsx +0 -0
  123. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/components/import/GraphStatsPreview.tsx +0 -0
  124. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/components/import/ImportDialog.tsx +0 -0
  125. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/components/import/ImportProgress.tsx +0 -0
  126. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/components/import/ImportSettings.tsx +0 -0
  127. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/components/import/UrlInput.tsx +0 -0
  128. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/components/panels/AnswerPanel.tsx +0 -0
  129. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/components/panels/NodeDetailPanel.tsx +0 -0
  130. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/components/panels/index.ts +0 -0
  131. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/components/search/SearchInput.tsx +0 -0
  132. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/components/search/index.ts +0 -0
  133. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/components/settings/SettingsDialog.tsx +0 -0
  134. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/components/timeline/ProcessTimeline.tsx +0 -0
  135. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/components/timeline/index.ts +0 -0
  136. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/components/ui/Header.tsx +0 -0
  137. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/components/ui/button.tsx +0 -0
  138. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/components/ui/dialog.tsx +0 -0
  139. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/components/ui/input.tsx +0 -0
  140. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/components/ui/label.tsx +0 -0
  141. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/components/ui/progress.tsx +0 -0
  142. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/components/ui/switch.tsx +0 -0
  143. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/components/ui/tabs.tsx +0 -0
  144. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/hooks/use-toast.ts +0 -0
  145. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/index.css +0 -0
  146. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/main.tsx +0 -0
  147. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/stores/datasetStore.ts +0 -0
  148. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/stores/graphStore.ts +0 -0
  149. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/stores/searchStore.ts +0 -0
  150. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/types/api.ts +0 -0
  151. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/utils/cn.ts +0 -0
  152. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/src/utils/graphLayout.ts +0 -0
  153. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/tsconfig.app.json +0 -0
  154. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/tsconfig.json +0 -0
  155. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/tsconfig.node.json +0 -0
  156. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/frontend/vite.config.ts +0 -0
  157. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/mkdocs.yml +0 -0
  158. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/api/__init__.py +0 -0
  159. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/api/app.py +0 -0
  160. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/graph/__init__.py +0 -0
  161. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/graph/builder.py +0 -0
  162. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/graph/graph.py +0 -0
  163. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/graph/knowledge_graph.py +0 -0
  164. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/graph/retriever.py +0 -0
  165. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/llm/__init__.py +0 -0
  166. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/llm/jev.py +0 -0
  167. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/loaders/__init__.py +0 -0
  168. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/loaders/chunker.py +0 -0
  169. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/loaders/converter.py +0 -0
  170. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/loaders/docling.py +0 -0
  171. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/loaders/mineru.py +0 -0
  172. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/loaders/url_fetcher.py +0 -0
  173. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/models.py +0 -0
  174. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/observability.py +0 -0
  175. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/storage/__init__.py +0 -0
  176. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/storage/embedding_providers/__init__.py +0 -0
  177. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/storage/embedding_providers/google.py +0 -0
  178. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/storage/embedding_providers/huggingface.py +0 -0
  179. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/storage/embedding_providers/jina.py +0 -0
  180. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/storage/embedding_providers/local.py +0 -0
  181. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/storage/embedding_providers/mistral.py +0 -0
  182. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/storage/embedding_providers/ollama.py +0 -0
  183. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/storage/embedding_providers/onnx.py +0 -0
  184. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/storage/embedding_providers/openai.py +0 -0
  185. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/storage/embedding_providers/utils.py +0 -0
  186. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/storage/embedding_providers/voyage.py +0 -0
  187. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/storage/embeddings.py +0 -0
  188. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/src/vector_graph_rag/storage/milvus.py +0 -0
  189. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/tests/__init__.py +0 -0
  190. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/tests/test_api_settings.py +0 -0
  191. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/tests/test_embedding_providers.py +0 -0
  192. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/tests/test_evaluation_manifest.py +0 -0
  193. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/tests/test_graph.py +0 -0
  194. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/tests/test_jev_reranker.py +0 -0
  195. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/tests/test_jev_two_stage.py +0 -0
  196. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/tests/test_loaders.py +0 -0
  197. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/tests/test_milvus_store.py +0 -0
  198. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/tests/test_rag_incremental.py +0 -0
  199. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/tests/test_rag_metadata_filter.py +0 -0
  200. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/tests/test_rag_passage_order.py +0 -0
  201. {vector_graph_rag-0.3.1 → vector_graph_rag-0.4.0}/tests/test_task_models.py +0 -0
@@ -36,7 +36,9 @@ MILVUS_URI=./vector_graph_rag.db
36
36
  # Model Configuration (Optional - uses VGRAG_ prefix)
37
37
  # ============================================================================
38
38
  # LLM model for triplet extraction and reranking
39
- # VGRAG_LLM_MODEL=gpt-4o-mini
39
+ # GPT-6 uses Responses; other configured models use Chat Completions.
40
+ # VGRAG_LLM_MODEL=gpt-6-luna
41
+ # VGRAG_LLM_REASONING_EFFORT=medium
40
42
 
41
43
  # Embedding model (HuggingFace model name or OpenAI model name)
42
44
  # VGRAG_EMBEDDING_MODEL=facebook/contriever
@@ -101,9 +103,9 @@ MILVUS_URI=./vector_graph_rag.db
101
103
  # VGRAG_PASSAGE_COLLECTION=vgrag_passages
102
104
 
103
105
  # Task-specific models override the shared VGRAG_LLM_MODEL.
104
- # VGRAG_EXTRACTOR_MODEL=gpt-5-mini
106
+ # VGRAG_EXTRACTOR_MODEL=gpt-6-luna
105
107
  # VGRAG_RERANKER_MODEL=jev
106
- # VGRAG_ANSWER_MODEL=gpt-4o-mini
108
+ # VGRAG_ANSWER_MODEL=gpt-6-luna
107
109
  # TYPESAFE_API_KEY=your-key
108
110
 
109
111
  # VGRAG_JEV_MAX_CONCURRENCY=3
@@ -0,0 +1,69 @@
1
+ # Push a v-prefixed tag only after the release pull request passes validation.
2
+ name: Validate and Publish Python Package
3
+
4
+ on:
5
+ pull_request:
6
+ branches: [main]
7
+ push:
8
+ tags: ["v*"]
9
+
10
+ permissions:
11
+ contents: read
12
+
13
+ jobs:
14
+ validate:
15
+ name: Validate Python ${{ matrix.python-version }}
16
+ runs-on: ubuntu-latest
17
+ strategy:
18
+ fail-fast: false
19
+ matrix:
20
+ python-version: ["3.10", "3.12"]
21
+ steps:
22
+ - uses: actions/checkout@v4
23
+ - uses: astral-sh/setup-uv@v6
24
+ - name: Install test dependencies
25
+ run: uv sync --locked --python '${{ matrix.python-version }}' --extra dev --extra api
26
+ - name: Check package and tag versions
27
+ run: |
28
+ uv run --no-sync python - <<'PY'
29
+ import os
30
+ from importlib.metadata import version
31
+ from vector_graph_rag import __version__
32
+
33
+ package_version = version("vector-graph-rag")
34
+ assert package_version == __version__, (package_version, __version__)
35
+ if os.environ["GITHUB_REF_TYPE"] == "tag":
36
+ assert os.environ["GITHUB_REF_NAME"] == f"v{package_version}"
37
+ print(f"Validated version {package_version}")
38
+ PY
39
+ - name: Run tests
40
+ run: uv run --no-sync pytest tests -q
41
+ - name: Build distributions
42
+ run: uv build
43
+ - name: Verify wheel installation in isolation
44
+ run: |
45
+ uv run --isolated --no-project --python '${{ matrix.python-version }}' \
46
+ --with ./dist/vector_graph_rag-*.whl python -c \
47
+ 'from importlib.metadata import version; from vector_graph_rag import Settings, VectorGraphRAG, __version__; assert version("vector-graph-rag") == __version__; print(__version__)'
48
+ - name: Save validated distributions
49
+ if: matrix.python-version == '3.12'
50
+ uses: actions/upload-artifact@v4
51
+ with:
52
+ name: distributions
53
+ path: dist/
54
+
55
+ publish:
56
+ name: Publish to PyPI
57
+ if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
58
+ needs: validate
59
+ runs-on: ubuntu-latest
60
+ environment: pypi
61
+ permissions:
62
+ id-token: write
63
+ steps:
64
+ - uses: actions/download-artifact@v4
65
+ with:
66
+ name: distributions
67
+ path: dist/
68
+ - name: Publish validated distributions
69
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,16 @@
1
+ # Changelog
2
+
3
+ ## 0.4.0
4
+
5
+ ### What's changed
6
+
7
+ - Default generation tasks now use GPT-6 Luna through Responses with medium reasoning: triplet extraction, entity extraction, relationship reranking and answer generation.
8
+ - Cache keys distinguish the Responses interface and reasoning effort. Incomplete, refused or empty Responses outputs are rejected instead of cached as successful answers.
9
+ - Retrieval evaluation now compares Jev with GPT-6 Luna and official DeepSeek V4.1 Flash. The report retains the September/October 2026 evaluation timeline, reproducible Jev evidence and a link to superseded experiments.
10
+ - Publishing now requires passing tests on Python 3.10 and 3.12, matching package/tag versions, and an isolated wheel installation check.
11
+
12
+ ### Upgrading
13
+
14
+ The default model changed from GPT-4o-mini to GPT-6 Luna. Custom OpenAI-compatible endpoints must support Responses when using GPT-6 models. Explicitly configured non-GPT-6 models retain Chat Completions; set `VGRAG_LLM_MODEL` explicitly to retain your chosen model. The OpenAI SDK minimum is now 1.66.0.
15
+
16
+ Reasoning defaults to `medium` and can be configured with `VGRAG_LLM_REASONING_EFFORT`. Existing cache files are preserved, but GPT-6 Responses requests use separate cache keys. DeepSeek is an evaluation baseline, not the runtime default. Frozen benchmark results are unchanged by the runtime migration.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: vector-graph-rag
3
- Version: 0.3.1
3
+ Version: 0.4.0
4
4
  Summary: A Graph RAG implementation using pure vector search with Milvus
5
5
  Project-URL: Homepage, https://github.com/zilliztech/vector-graph-rag
6
6
  Project-URL: Documentation, https://zilliztech.github.io/vector-graph-rag/
@@ -23,7 +23,7 @@ Requires-Dist: httpx>=0.27
23
23
  Requires-Dist: langchain-core>=0.3.0
24
24
  Requires-Dist: milvus-lite<3,>=2.4.0
25
25
  Requires-Dist: numpy>=1.24.0
26
- Requires-Dist: openai>=1.0.0
26
+ Requires-Dist: openai>=1.66.0
27
27
  Requires-Dist: pydantic-settings>=2.0.0
28
28
  Requires-Dist: pydantic>=2.0.0
29
29
  Requires-Dist: pymilvus<2.6.10,>=2.4.0
@@ -398,7 +398,7 @@ Before introducing Jev, we evaluated Vector Graph RAG on three multi-hop QA benc
398
398
 
399
399
  **Two-stage Jev reaches the quality–latency Pareto frontier.**
400
400
 
401
- **86.07% average Recall@5**, the highest among the compared methods, with **3.13 seconds of additional model-call latency**. On MuSiQue and 2Wiki (1,000 questions each), two-stage Jev reaches the Pareto frontier under the reference latency estimates. This two-dataset result is separate from the historical three-dataset average above.
401
+ **86.07% average Recall@5**, the highest among the compared methods, with **3.13 seconds of additional model-call latency**. On MuSiQue and 2Wiki (1,000 questions each), two-stage Jev reaches the Pareto frontier using the displayed timings. This two-dataset result is separate from the historical three-dataset average above.
402
402
 
403
403
  ![Quality and additional model latency](docs/assets/evaluation/quality-latency.png)
404
404
 
@@ -290,7 +290,7 @@ Before introducing Jev, we evaluated Vector Graph RAG on three multi-hop QA benc
290
290
 
291
291
  **Two-stage Jev reaches the quality–latency Pareto frontier.**
292
292
 
293
- **86.07% average Recall@5**, the highest among the compared methods, with **3.13 seconds of additional model-call latency**. On MuSiQue and 2Wiki (1,000 questions each), two-stage Jev reaches the Pareto frontier under the reference latency estimates. This two-dataset result is separate from the historical three-dataset average above.
293
+ **86.07% average Recall@5**, the highest among the compared methods, with **3.13 seconds of additional model-call latency**. On MuSiQue and 2Wiki (1,000 questions each), two-stage Jev reaches the Pareto frontier using the displayed timings. This two-dataset result is separate from the historical three-dataset average above.
294
294
 
295
295
  ![Quality and additional model latency](docs/assets/evaluation/quality-latency.png)
296
296
 
@@ -119,15 +119,11 @@ The key insight is that **vector search combined with subgraph expansion already
119
119
 
120
120
  With these three mechanisms working together, the candidate set is already rich and relevant. A single LLM reranking pass is sufficient to select the best relations from this high-quality pool.
121
121
 
122
- ### The Cost Advantage
122
+ ### Model Calls and Cost
123
123
 
124
- Each LLM call adds latency (typically 1–3 seconds) and cost. For a system processing thousands of queries per day, the difference between 2 and 5 LLM calls per query is substantial:
124
+ Avoiding an iterative retrieval loop reduces the number of dependent model calls. Actual latency and cost also depend on prompt size, output length, reasoning settings, provider queueing and request concurrency; call counts alone do not establish a speedup or cost reduction.
125
125
 
126
- | Metric | Iterative (5 calls) | Single-Pass (2 calls) | Savings |
127
- |--------|---------------------|----------------------|---------|
128
- | **Latency** | ~5–15s | ~2–6s | 2–3x faster |
129
- | **Cost** (GPT-4o-mini) | ~5x base | ~2x base | 60% cheaper |
130
- | **Cost** (GPT-4o) | ~5x base | ~2x base | 60% cheaper |
126
+ See the [retrieval evaluation](../evaluation.md#jev-reranker-evaluation) for measured Jev, GPT-6 Luna and DeepSeek V4.1 Flash quality and model-call latency. Those retrieval measurements do not benchmark extraction or answer generation.
131
127
 
132
128
  > [!TIP]
133
129
  > For applications where latency and cost are secondary to accuracy on extremely complex queries (5+ hop chains, ambiguous entity resolution), iterative approaches may still be worth the overhead. See [When to Consider Alternatives](#7-when-to-consider-alternatives).
@@ -0,0 +1,438 @@
1
+ <?xml version="1.0" encoding="utf-8" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
3
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+ <svg xmlns:xlink="http://www.w3.org/1999/xlink" width="1080pt" height="612pt" viewBox="0 0 1080 612" xmlns="http://www.w3.org/2000/svg" version="1.1">
5
+ <metadata>
6
+ <rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
7
+ <cc:Work>
8
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
9
+ <dc:format>image/svg+xml</dc:format>
10
+ <dc:creator>
11
+ <cc:Agent>
12
+ <dc:title>Matplotlib v3.11.2, https://matplotlib.org/</dc:title>
13
+ </cc:Agent>
14
+ </dc:creator>
15
+ </cc:Work>
16
+ </rdf:RDF>
17
+ </metadata>
18
+ <defs>
19
+ <style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
20
+ </defs>
21
+ <g id="figure_1">
22
+ <g id="patch_1">
23
+ <path d="M 0 612
24
+ L 1080 612
25
+ L 1080 0
26
+ L 0 0
27
+ z
28
+ " style="fill: #ffffff"/>
29
+ </g>
30
+ <g id="axes_1">
31
+ <g id="patch_2">
32
+ <path d="M 97.2 495.72
33
+ L 1047.6 495.72
34
+ L 1047.6 110.16
35
+ L 97.2 110.16
36
+ z
37
+ " style="fill: #ffffff"/>
38
+ </g>
39
+ <g id="matplotlib.axis_1">
40
+ <g id="xtick_1">
41
+ <g id="line2d_1">
42
+ <defs>
43
+ <path id="m1e54ec5eb8" d="M 0 0
44
+ L 0 3.5
45
+ " style="stroke: #000000; stroke-width: 0.8"/>
46
+ </defs>
47
+ <g>
48
+ <use xlink:href="#m1e54ec5eb8" x="123.198784" y="495.72" style="stroke: #000000; stroke-width: 0.8"/>
49
+ </g>
50
+ </g>
51
+ <g id="text_1">
52
+ <text style="font-size: 12px; font-family: 'DejaVu Sans'; text-anchor: middle" x="123.198784" y="511.837187" transform="rotate(-0 123.198784 511.837187)">0</text>
53
+ </g>
54
+ </g>
55
+ <g id="xtick_2">
56
+ <g id="line2d_2">
57
+ <g>
58
+ <use xlink:href="#m1e54ec5eb8" x="238.748936" y="495.72" style="stroke: #000000; stroke-width: 0.8"/>
59
+ </g>
60
+ </g>
61
+ <g id="text_2">
62
+ <text style="font-size: 12px; font-family: 'DejaVu Sans'; text-anchor: middle" x="238.748936" y="511.837187" transform="rotate(-0 238.748936 511.837187)">2</text>
63
+ </g>
64
+ </g>
65
+ <g id="xtick_3">
66
+ <g id="line2d_3">
67
+ <g>
68
+ <use xlink:href="#m1e54ec5eb8" x="354.299088" y="495.72" style="stroke: #000000; stroke-width: 0.8"/>
69
+ </g>
70
+ </g>
71
+ <g id="text_3">
72
+ <text style="font-size: 12px; font-family: 'DejaVu Sans'; text-anchor: middle" x="354.299088" y="511.837187" transform="rotate(-0 354.299088 511.837187)">4</text>
73
+ </g>
74
+ </g>
75
+ <g id="xtick_4">
76
+ <g id="line2d_4">
77
+ <g>
78
+ <use xlink:href="#m1e54ec5eb8" x="469.84924" y="495.72" style="stroke: #000000; stroke-width: 0.8"/>
79
+ </g>
80
+ </g>
81
+ <g id="text_4">
82
+ <text style="font-size: 12px; font-family: 'DejaVu Sans'; text-anchor: middle" x="469.84924" y="511.837187" transform="rotate(-0 469.84924 511.837187)">6</text>
83
+ </g>
84
+ </g>
85
+ <g id="xtick_5">
86
+ <g id="line2d_5">
87
+ <g>
88
+ <use xlink:href="#m1e54ec5eb8" x="585.399392" y="495.72" style="stroke: #000000; stroke-width: 0.8"/>
89
+ </g>
90
+ </g>
91
+ <g id="text_5">
92
+ <text style="font-size: 12px; font-family: 'DejaVu Sans'; text-anchor: middle" x="585.399392" y="511.837187" transform="rotate(-0 585.399392 511.837187)">8</text>
93
+ </g>
94
+ </g>
95
+ <g id="xtick_6">
96
+ <g id="line2d_6">
97
+ <g>
98
+ <use xlink:href="#m1e54ec5eb8" x="700.949544" y="495.72" style="stroke: #000000; stroke-width: 0.8"/>
99
+ </g>
100
+ </g>
101
+ <g id="text_6">
102
+ <text style="font-size: 12px; font-family: 'DejaVu Sans'; text-anchor: middle" x="700.949544" y="511.837187" transform="rotate(-0 700.949544 511.837187)">10</text>
103
+ </g>
104
+ </g>
105
+ <g id="xtick_7">
106
+ <g id="line2d_7">
107
+ <g>
108
+ <use xlink:href="#m1e54ec5eb8" x="816.499696" y="495.72" style="stroke: #000000; stroke-width: 0.8"/>
109
+ </g>
110
+ </g>
111
+ <g id="text_7">
112
+ <text style="font-size: 12px; font-family: 'DejaVu Sans'; text-anchor: middle" x="816.499696" y="511.837187" transform="rotate(-0 816.499696 511.837187)">12</text>
113
+ </g>
114
+ </g>
115
+ <g id="xtick_8">
116
+ <g id="line2d_8">
117
+ <g>
118
+ <use xlink:href="#m1e54ec5eb8" x="932.049848" y="495.72" style="stroke: #000000; stroke-width: 0.8"/>
119
+ </g>
120
+ </g>
121
+ <g id="text_8">
122
+ <text style="font-size: 12px; font-family: 'DejaVu Sans'; text-anchor: middle" x="932.049848" y="511.837187" transform="rotate(-0 932.049848 511.837187)">14</text>
123
+ </g>
124
+ </g>
125
+ <g id="xtick_9">
126
+ <g id="line2d_9">
127
+ <g>
128
+ <use xlink:href="#m1e54ec5eb8" x="1047.6" y="495.72" style="stroke: #000000; stroke-width: 0.8"/>
129
+ </g>
130
+ </g>
131
+ <g id="text_9">
132
+ <text style="font-size: 12px; font-family: 'DejaVu Sans'; text-anchor: middle" x="1047.6" y="511.837187" transform="rotate(-0 1047.6 511.837187)">16</text>
133
+ </g>
134
+ </g>
135
+ <g id="text_10">
136
+ <text style="font-size: 12px; font-family: 'DejaVu Sans'; text-anchor: middle" x="572.4" y="527.838125" transform="rotate(-0 572.4 527.838125)">Additional model-call latency (s)</text>
137
+ </g>
138
+ </g>
139
+ <g id="matplotlib.axis_2">
140
+ <g id="ytick_1">
141
+ <g id="line2d_10">
142
+ <path d="M 97.2 445.429565
143
+ L 1047.6 445.429565
144
+ " clip-path="url(#pfb3f67a1a0)" style="fill: none; stroke: #e7ebef; stroke-width: 0.8; stroke-linecap: square"/>
145
+ </g>
146
+ <g id="line2d_11">
147
+ <defs>
148
+ <path id="m7e8e1ccff5" d="M 0 0
149
+ L -3.5 0
150
+ " style="stroke: #000000; stroke-width: 0.8"/>
151
+ </defs>
152
+ <g>
153
+ <use xlink:href="#m7e8e1ccff5" x="97.2" y="445.429565" style="stroke: #000000; stroke-width: 0.8"/>
154
+ </g>
155
+ </g>
156
+ <g id="text_11">
157
+ <text style="font-size: 12px; font-family: 'DejaVu Sans'; text-anchor: end" x="90.2" y="449.988159" transform="rotate(-0 90.2 449.988159)">60</text>
158
+ </g>
159
+ </g>
160
+ <g id="ytick_2">
161
+ <g id="line2d_12">
162
+ <path d="M 97.2 389.551304
163
+ L 1047.6 389.551304
164
+ " clip-path="url(#pfb3f67a1a0)" style="fill: none; stroke: #e7ebef; stroke-width: 0.8; stroke-linecap: square"/>
165
+ </g>
166
+ <g id="line2d_13">
167
+ <g>
168
+ <use xlink:href="#m7e8e1ccff5" x="97.2" y="389.551304" style="stroke: #000000; stroke-width: 0.8"/>
169
+ </g>
170
+ </g>
171
+ <g id="text_12">
172
+ <text style="font-size: 12px; font-family: 'DejaVu Sans'; text-anchor: end" x="90.2" y="394.109898" transform="rotate(-0 90.2 394.109898)">65</text>
173
+ </g>
174
+ </g>
175
+ <g id="ytick_3">
176
+ <g id="line2d_14">
177
+ <path d="M 97.2 333.673043
178
+ L 1047.6 333.673043
179
+ " clip-path="url(#pfb3f67a1a0)" style="fill: none; stroke: #e7ebef; stroke-width: 0.8; stroke-linecap: square"/>
180
+ </g>
181
+ <g id="line2d_15">
182
+ <g>
183
+ <use xlink:href="#m7e8e1ccff5" x="97.2" y="333.673043" style="stroke: #000000; stroke-width: 0.8"/>
184
+ </g>
185
+ </g>
186
+ <g id="text_13">
187
+ <text style="font-size: 12px; font-family: 'DejaVu Sans'; text-anchor: end" x="90.2" y="338.231637" transform="rotate(-0 90.2 338.231637)">70</text>
188
+ </g>
189
+ </g>
190
+ <g id="ytick_4">
191
+ <g id="line2d_16">
192
+ <path d="M 97.2 277.794783
193
+ L 1047.6 277.794783
194
+ " clip-path="url(#pfb3f67a1a0)" style="fill: none; stroke: #e7ebef; stroke-width: 0.8; stroke-linecap: square"/>
195
+ </g>
196
+ <g id="line2d_17">
197
+ <g>
198
+ <use xlink:href="#m7e8e1ccff5" x="97.2" y="277.794783" style="stroke: #000000; stroke-width: 0.8"/>
199
+ </g>
200
+ </g>
201
+ <g id="text_14">
202
+ <text style="font-size: 12px; font-family: 'DejaVu Sans'; text-anchor: end" x="90.2" y="282.353376" transform="rotate(-0 90.2 282.353376)">75</text>
203
+ </g>
204
+ </g>
205
+ <g id="ytick_5">
206
+ <g id="line2d_18">
207
+ <path d="M 97.2 221.916522
208
+ L 1047.6 221.916522
209
+ " clip-path="url(#pfb3f67a1a0)" style="fill: none; stroke: #e7ebef; stroke-width: 0.8; stroke-linecap: square"/>
210
+ </g>
211
+ <g id="line2d_19">
212
+ <g>
213
+ <use xlink:href="#m7e8e1ccff5" x="97.2" y="221.916522" style="stroke: #000000; stroke-width: 0.8"/>
214
+ </g>
215
+ </g>
216
+ <g id="text_15">
217
+ <text style="font-size: 12px; font-family: 'DejaVu Sans'; text-anchor: end" x="90.2" y="226.475115" transform="rotate(-0 90.2 226.475115)">80</text>
218
+ </g>
219
+ </g>
220
+ <g id="ytick_6">
221
+ <g id="line2d_20">
222
+ <path d="M 97.2 166.038261
223
+ L 1047.6 166.038261
224
+ " clip-path="url(#pfb3f67a1a0)" style="fill: none; stroke: #e7ebef; stroke-width: 0.8; stroke-linecap: square"/>
225
+ </g>
226
+ <g id="line2d_21">
227
+ <g>
228
+ <use xlink:href="#m7e8e1ccff5" x="97.2" y="166.038261" style="stroke: #000000; stroke-width: 0.8"/>
229
+ </g>
230
+ </g>
231
+ <g id="text_16">
232
+ <text style="font-size: 12px; font-family: 'DejaVu Sans'; text-anchor: end" x="90.2" y="170.596855" transform="rotate(-0 90.2 170.596855)">85</text>
233
+ </g>
234
+ </g>
235
+ <g id="ytick_7">
236
+ <g id="line2d_22">
237
+ <path d="M 97.2 110.16
238
+ L 1047.6 110.16
239
+ " clip-path="url(#pfb3f67a1a0)" style="fill: none; stroke: #e7ebef; stroke-width: 0.8; stroke-linecap: square"/>
240
+ </g>
241
+ <g id="line2d_23">
242
+ <g>
243
+ <use xlink:href="#m7e8e1ccff5" x="97.2" y="110.16" style="stroke: #000000; stroke-width: 0.8"/>
244
+ </g>
245
+ </g>
246
+ <g id="text_17">
247
+ <text style="font-size: 12px; font-family: 'DejaVu Sans'; text-anchor: end" x="90.2" y="114.718594" transform="rotate(-0 90.2 114.718594)">90</text>
248
+ </g>
249
+ </g>
250
+ <g id="text_18">
251
+ <text style="font-size: 12px; font-family: 'DejaVu Sans'; text-anchor: middle" x="68.047188" y="302.94" transform="rotate(-90 68.047188 302.94)">Average Recall@5 (%)</text>
252
+ </g>
253
+ </g>
254
+ <g id="line2d_24">
255
+ <path d="M 123.198784 299.028522
256
+ L 255.174996 221.497435
257
+ L 304.195667 154.117565
258
+ " clip-path="url(#pfb3f67a1a0)" style="fill: none; stroke-dasharray: 4.81,2.08; stroke-dashoffset: 0; stroke: #168568; stroke-opacity: 0.7; stroke-width: 1.3"/>
259
+ </g>
260
+ <g id="patch_3">
261
+ <path d="M 97.2 495.72
262
+ L 97.2 110.16
263
+ " style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
264
+ </g>
265
+ <g id="patch_4">
266
+ <path d="M 97.2 495.72
267
+ L 1047.6 495.72
268
+ " style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
269
+ </g>
270
+ <g id="text_19">
271
+ <text style="font-size: 11px; font-family: 'DejaVu Sans'; fill: #777f8b" transform="translate(609.843161 216.153921)">HippoRAG 2</text>
272
+ <text style="font-size: 11px; font-family: 'DejaVu Sans'; fill: #777f8b" transform="translate(609.843161 232.522437)">82.55% · ≈8.25 s</text>
273
+ </g>
274
+ <g id="text_20">
275
+ <text style="font-size: 11px; font-family: 'DejaVu Sans'; fill: #168568" transform="translate(265.174996 244.232747)">Jev · relations only</text>
276
+ <text style="font-size: 11px; font-family: 'DejaVu Sans'; fill: #168568" transform="translate(265.174996 260.601263)">80.04% · 2.28 s</text>
277
+ </g>
278
+ <g id="text_21">
279
+ <text style="font-size: 11px; font-family: 'DejaVu Sans'; fill: #168568" transform="translate(314.195667 123.883581)">Jev · two-stage</text>
280
+ <text style="font-size: 11px; font-family: 'DejaVu Sans'; fill: #168568" transform="translate(314.195667 140.421393)">86.07% · 3.13 s</text>
281
+ </g>
282
+ <g id="text_22">
283
+ <text style="font-size: 11px; font-family: 'DejaVu Sans'; fill: #a16826" transform="translate(442.363178 215.399524)">GPT-6 Luna</text>
284
+ <text style="font-size: 11px; font-family: 'DejaVu Sans'; fill: #a16826" transform="translate(442.363178 230.799524)">82.70% · 5.35 s</text>
285
+ </g>
286
+ <g id="text_23">
287
+ <text style="font-size: 11px; font-family: 'DejaVu Sans'; fill: #2674bd" transform="translate(766.993357 154.553095)">DeepSeek V4.1 Flash</text>
288
+ <text style="font-size: 11px; font-family: 'DejaVu Sans'; fill: #2674bd" transform="translate(766.993357 170.921611)">83.34% · 10.97 s</text>
289
+ </g>
290
+ <g id="text_24">
291
+ <text style="font-size: 11px; font-family: 'DejaVu Sans'; text-anchor: start; fill: #777f8b" x="135.198784" y="303.028522" transform="rotate(-0 135.198784 303.028522)">Naive RAG · NV-Embed-v2 (73.10%)</text>
292
+ </g>
293
+ <g id="text_25">
294
+ <text style="font-size: 11px; font-family: 'DejaVu Sans'; text-anchor: start; fill: #777f8b" x="135.198784" y="389.31387" transform="rotate(-0 135.198784 389.31387)">Naive RAG · BGE-large-en-v1.5 (65.38%)</text>
295
+ </g>
296
+ <g id="text_26">
297
+ <text style="font-size: 11px; font-family: 'DejaVu Sans'; text-anchor: start; fill: #777f8b" x="135.198784" y="463.957913" transform="rotate(-0 135.198784 463.957913)">Naive RAG · ColBERTv2 (58.70%)</text>
298
+ </g>
299
+ <g id="PathCollection_1">
300
+ <defs>
301
+ <path id="m767e650826" d="M -4.472136 4.472136
302
+ L 4.472136 4.472136
303
+ L 4.472136 -4.472136
304
+ L -4.472136 -4.472136
305
+ z
306
+ " style="stroke: #ffffff; stroke-width: 0.9"/>
307
+ </defs>
308
+ <g clip-path="url(#pfb3f67a1a0)">
309
+ <use xlink:href="#m767e650826" x="599.843161" y="193.418609" style="fill: #777f8b; stroke: #ffffff; stroke-width: 0.9"/>
310
+ </g>
311
+ </g>
312
+ <g id="PathCollection_2">
313
+ <defs>
314
+ <path id="mdcc981d774" d="M 0 4.472136
315
+ C 1.186024 4.472136 2.323632 4.000923 3.162278 3.162278
316
+ C 4.000923 2.323632 4.472136 1.186024 4.472136 0
317
+ C 4.472136 -1.186024 4.000923 -2.323632 3.162278 -3.162278
318
+ C 2.323632 -4.000923 1.186024 -4.472136 0 -4.472136
319
+ C -1.186024 -4.472136 -2.323632 -4.000923 -3.162278 -3.162278
320
+ C -4.000923 -2.323632 -4.472136 -1.186024 -4.472136 0
321
+ C -4.472136 1.186024 -4.000923 2.323632 -3.162278 3.162278
322
+ C -2.323632 4.000923 -1.186024 4.472136 0 4.472136
323
+ z
324
+ " style="stroke: #ffffff; stroke-width: 0.9"/>
325
+ </defs>
326
+ <g clip-path="url(#pfb3f67a1a0)">
327
+ <use xlink:href="#mdcc981d774" x="255.174996" y="221.497435" style="fill: #168568; stroke: #ffffff; stroke-width: 0.9"/>
328
+ </g>
329
+ </g>
330
+ <g id="PathCollection_3">
331
+ <defs>
332
+ <path id="mfa49a455e4" d="M 0 -6.892024
333
+ L -1.547356 -2.129753
334
+ L -6.554705 -2.129753
335
+ L -2.503674 0.813493
336
+ L -4.05103 5.575765
337
+ L -0 2.632519
338
+ L 4.05103 5.575765
339
+ L 2.503674 0.813493
340
+ L 6.554705 -2.129753
341
+ L 1.547356 -2.129753
342
+ z
343
+ " style="stroke: #ffffff; stroke-width: 0.9"/>
344
+ </defs>
345
+ <g clip-path="url(#pfb3f67a1a0)">
346
+ <use xlink:href="#mfa49a455e4" x="304.195667" y="154.117565" style="fill: #168568; stroke: #ffffff; stroke-width: 0.9"/>
347
+ </g>
348
+ </g>
349
+ <g id="PathCollection_4">
350
+ <defs>
351
+ <path id="m23881a4830" d="M 0 4.472136
352
+ C 1.186024 4.472136 2.323632 4.000923 3.162278 3.162278
353
+ C 4.000923 2.323632 4.472136 1.186024 4.472136 0
354
+ C 4.472136 -1.186024 4.000923 -2.323632 3.162278 -3.162278
355
+ C 2.323632 -4.000923 1.186024 -4.472136 0 -4.472136
356
+ C -1.186024 -4.472136 -2.323632 -4.000923 -3.162278 -3.162278
357
+ C -4.000923 -2.323632 -4.472136 -1.186024 -4.472136 0
358
+ C -4.472136 1.186024 -4.000923 2.323632 -3.162278 3.162278
359
+ C -2.323632 4.000923 -1.186024 4.472136 0 4.472136
360
+ z
361
+ " style="stroke: #ffffff; stroke-width: 0.9"/>
362
+ </defs>
363
+ <g clip-path="url(#pfb3f67a1a0)">
364
+ <use xlink:href="#m23881a4830" x="432.363178" y="191.695696" style="fill: #a16826; stroke: #ffffff; stroke-width: 0.9"/>
365
+ </g>
366
+ </g>
367
+ <g id="PathCollection_5">
368
+ <defs>
369
+ <path id="m4d7c55c37c" d="M 0 4.472136
370
+ C 1.186024 4.472136 2.323632 4.000923 3.162278 3.162278
371
+ C 4.000923 2.323632 4.472136 1.186024 4.472136 0
372
+ C 4.472136 -1.186024 4.000923 -2.323632 3.162278 -3.162278
373
+ C 2.323632 -4.000923 1.186024 -4.472136 0 -4.472136
374
+ C -1.186024 -4.472136 -2.323632 -4.000923 -3.162278 -3.162278
375
+ C -4.000923 -2.323632 -4.472136 -1.186024 -4.472136 0
376
+ C -4.472136 1.186024 -4.000923 2.323632 -3.162278 3.162278
377
+ C -2.323632 4.000923 -1.186024 4.472136 0 4.472136
378
+ z
379
+ " style="stroke: #ffffff; stroke-width: 0.9"/>
380
+ </defs>
381
+ <g clip-path="url(#pfb3f67a1a0)">
382
+ <use xlink:href="#m4d7c55c37c" x="756.993357" y="184.617783" style="fill: #2674bd; stroke: #ffffff; stroke-width: 0.9"/>
383
+ </g>
384
+ </g>
385
+ <g id="PathCollection_6">
386
+ <defs>
387
+ <path id="m077a5d3511" d="M -3.708099 3.708099
388
+ L 3.708099 3.708099
389
+ L 3.708099 -3.708099
390
+ L -3.708099 -3.708099
391
+ z
392
+ " style="stroke: #777f8b"/>
393
+ </defs>
394
+ <g clip-path="url(#pfb3f67a1a0)">
395
+ <use xlink:href="#m077a5d3511" x="123.198784" y="299.028522" style="fill: #ffffff; stroke: #777f8b"/>
396
+ </g>
397
+ </g>
398
+ <g id="PathCollection_7">
399
+ <g clip-path="url(#pfb3f67a1a0)">
400
+ <use xlink:href="#m077a5d3511" x="123.198784" y="385.31387" style="fill: #ffffff; stroke: #777f8b"/>
401
+ </g>
402
+ </g>
403
+ <g id="PathCollection_8">
404
+ <g clip-path="url(#pfb3f67a1a0)">
405
+ <use xlink:href="#m077a5d3511" x="123.198784" y="459.957913" style="fill: #ffffff; stroke: #777f8b"/>
406
+ </g>
407
+ </g>
408
+ <g id="legend_1">
409
+ <g id="line2d_25">
410
+ <path d="M 855.489375 477.837187
411
+ L 867.489375 477.837187
412
+ L 879.489375 477.837187
413
+ " style="fill: none; stroke-dasharray: 4.81,2.08; stroke-dashoffset: 0; stroke: #168568; stroke-opacity: 0.7; stroke-width: 1.3"/>
414
+ </g>
415
+ <g id="text_27">
416
+ <text style="font-size: 12px; font-family: 'DejaVu Sans'; text-anchor: start" x="889.089375" y="482.037187" transform="rotate(-0 889.089375 482.037187)">Observed Pareto frontier</text>
417
+ </g>
418
+ </g>
419
+ </g>
420
+ <g id="text_28">
421
+ <text style="font-weight: 700; font-size: 22px; font-family: 'DejaVu Sans'; text-anchor: start; fill: #253143" x="97.2" y="36.72" transform="rotate(-0 97.2 36.72)">Retrieval quality–latency trade-off</text>
422
+ </g>
423
+ <g id="text_29">
424
+ <text style="font-size: 12px; font-family: 'DejaVu Sans'; text-anchor: start; fill: #657181" x="97.2" y="70.38" transform="rotate(-0 97.2 70.38)">MuSiQue + 2Wiki · Equal-weight Recall@5 · 1,000 queries per dataset</text>
425
+ </g>
426
+ <g id="text_30">
427
+ <text style="font-size: 10px; font-family: 'DejaVu Sans'; text-anchor: start; fill: #657181" x="97.2" y="556.92" transform="rotate(-0 97.2 556.92)">Jev, Luna and Flash: measured API means. HippoRAG 2: reference estimate (≈); separate evaluation setup.</text>
428
+ </g>
429
+ <g id="text_31">
430
+ <text style="font-size: 10px; font-family: 'DejaVu Sans'; text-anchor: start; fill: #657181" x="97.2" y="578.34" transform="rotate(-0 97.2 578.34)">0 s excludes embedding, retrieval and answer generation. API means include network and provider queueing; runs differ in time/concurrency.</text>
431
+ </g>
432
+ </g>
433
+ <defs>
434
+ <clipPath id="pfb3f67a1a0">
435
+ <rect x="97.2" y="110.16" width="950.4" height="385.56"/>
436
+ </clipPath>
437
+ </defs>
438
+ </svg>