evalvault 1.60.0__tar.gz → 1.62.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 (850) hide show
  1. {evalvault-1.60.0 → evalvault-1.62.0}/PKG-INFO +4 -2
  2. {evalvault-1.60.0 → evalvault-1.62.0}/README.en.md +2 -2
  3. {evalvault-1.60.0 → evalvault-1.62.0}/README.md +1 -1
  4. {evalvault-1.60.0 → evalvault-1.62.0}/docs/INDEX.md +2 -2
  5. {evalvault-1.60.0 → evalvault-1.62.0}/docs/README.ko.md +2 -2
  6. {evalvault-1.60.0 → evalvault-1.62.0}/docs/architecture/open-rag-trace-spec.md +1 -1
  7. evalvault-1.62.0/docs/guides/AGENTS_SYSTEM_GUIDE.md +142 -0
  8. {evalvault-1.60.0 → evalvault-1.62.0}/docs/guides/DEV_GUIDE.md +10 -1
  9. {evalvault-1.60.0 → evalvault-1.62.0}/docs/guides/USER_GUIDE.md +3 -3
  10. evalvault-1.62.0/docs/guides/rag_human_feedback_calibration_implementation_plan.md +218 -0
  11. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/pages/RunDetails.tsx +303 -15
  12. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/services/api.ts +64 -0
  13. {evalvault-1.60.0 → evalvault-1.62.0}/mkdocs.yml +2 -2
  14. {evalvault-1.60.0 → evalvault-1.62.0}/pyproject.toml +3 -1
  15. evalvault-1.62.0/src/evalvault/adapters/inbound/__init__.py +6 -0
  16. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/api/adapter.py +29 -0
  17. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/api/routers/runs.py +129 -6
  18. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/commands/__init__.py +2 -0
  19. evalvault-1.62.0/src/evalvault/adapters/inbound/cli/commands/calibrate.py +111 -0
  20. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/commands/run.py +2 -2
  21. evalvault-1.62.0/src/evalvault/adapters/inbound/mcp/__init__.py +51 -0
  22. evalvault-1.62.0/src/evalvault/adapters/inbound/mcp/schemas.py +159 -0
  23. evalvault-1.62.0/src/evalvault/adapters/inbound/mcp/tools.py +710 -0
  24. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/llm_report_module.py +605 -62
  25. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/nlp_adapter.py +46 -2
  26. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/nlp_analyzer_module.py +1 -1
  27. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/storage/base_sql.py +91 -0
  28. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/storage/postgres_adapter.py +22 -0
  29. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/storage/postgres_schema.sql +14 -0
  30. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/storage/schema.sql +15 -0
  31. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/storage/sqlite_adapter.py +25 -0
  32. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/config/settings.py +1 -1
  33. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/entities/__init__.py +12 -0
  34. evalvault-1.62.0/src/evalvault/domain/entities/feedback.py +58 -0
  35. evalvault-1.62.0/src/evalvault/domain/services/satisfaction_calibration_service.py +328 -0
  36. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/ports/inbound/web_port.py +1 -1
  37. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/ports/outbound/storage_port.py +10 -0
  38. {evalvault-1.60.0 → evalvault-1.62.0}/tests/conftest.py +25 -0
  39. evalvault-1.62.0/tests/unit/adapters/inbound/mcp/test_execute_tools.py +140 -0
  40. evalvault-1.62.0/tests/unit/adapters/inbound/mcp/test_read_tools.py +96 -0
  41. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_sqlite_storage.py +28 -0
  42. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_web_adapter.py +1 -1
  43. {evalvault-1.60.0 → evalvault-1.62.0}/uv.lock +24 -1
  44. evalvault-1.60.0/src/evalvault/adapters/inbound/__init__.py +0 -5
  45. {evalvault-1.60.0 → evalvault-1.62.0}/.cursor/worktrees.json +0 -0
  46. {evalvault-1.60.0 → evalvault-1.62.0}/.dockerignore +0 -0
  47. {evalvault-1.60.0 → evalvault-1.62.0}/.env.example +0 -0
  48. {evalvault-1.60.0 → evalvault-1.62.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  49. {evalvault-1.60.0 → evalvault-1.62.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  50. {evalvault-1.60.0 → evalvault-1.62.0}/.github/ISSUE_TEMPLATE/question.md +0 -0
  51. {evalvault-1.60.0 → evalvault-1.62.0}/.github/dependabot.yml +0 -0
  52. {evalvault-1.60.0 → evalvault-1.62.0}/.github/pull_request_template.md +0 -0
  53. {evalvault-1.60.0 → evalvault-1.62.0}/.github/stale.yml +0 -0
  54. {evalvault-1.60.0 → evalvault-1.62.0}/.github/workflows/ci.yml +0 -0
  55. {evalvault-1.60.0 → evalvault-1.62.0}/.github/workflows/release.yml +0 -0
  56. {evalvault-1.60.0 → evalvault-1.62.0}/.github/workflows/stale.yml +0 -0
  57. {evalvault-1.60.0 → evalvault-1.62.0}/.gitignore +0 -0
  58. {evalvault-1.60.0 → evalvault-1.62.0}/.pre-commit-config.yaml +0 -0
  59. {evalvault-1.60.0 → evalvault-1.62.0}/.python-version +0 -0
  60. {evalvault-1.60.0 → evalvault-1.62.0}/AGENTS.md +0 -0
  61. {evalvault-1.60.0 → evalvault-1.62.0}/CHANGELOG.md +0 -0
  62. {evalvault-1.60.0 → evalvault-1.62.0}/CLAUDE.md +0 -0
  63. {evalvault-1.60.0 → evalvault-1.62.0}/CODE_OF_CONDUCT.md +0 -0
  64. {evalvault-1.60.0 → evalvault-1.62.0}/CONTRIBUTING.md +0 -0
  65. {evalvault-1.60.0 → evalvault-1.62.0}/Dockerfile +0 -0
  66. {evalvault-1.60.0 → evalvault-1.62.0}/LICENSE.md +0 -0
  67. {evalvault-1.60.0 → evalvault-1.62.0}/SECURITY.md +0 -0
  68. {evalvault-1.60.0 → evalvault-1.62.0}/agent/README.md +0 -0
  69. {evalvault-1.60.0 → evalvault-1.62.0}/agent/agent.py +0 -0
  70. {evalvault-1.60.0 → evalvault-1.62.0}/agent/client.py +0 -0
  71. {evalvault-1.60.0 → evalvault-1.62.0}/agent/config.py +0 -0
  72. {evalvault-1.60.0 → evalvault-1.62.0}/agent/main.py +0 -0
  73. {evalvault-1.60.0 → evalvault-1.62.0}/agent/memory/README.md +0 -0
  74. {evalvault-1.60.0 → evalvault-1.62.0}/agent/memory/shared/decisions.md +0 -0
  75. {evalvault-1.60.0 → evalvault-1.62.0}/agent/memory/shared/dependencies.md +0 -0
  76. {evalvault-1.60.0 → evalvault-1.62.0}/agent/memory/templates/coordinator_guide.md +0 -0
  77. {evalvault-1.60.0 → evalvault-1.62.0}/agent/memory/templates/work_log_template.md +0 -0
  78. {evalvault-1.60.0 → evalvault-1.62.0}/agent/memory_integration.py +0 -0
  79. {evalvault-1.60.0 → evalvault-1.62.0}/agent/progress.py +0 -0
  80. {evalvault-1.60.0 → evalvault-1.62.0}/agent/prompts/app_spec.txt +0 -0
  81. {evalvault-1.60.0 → evalvault-1.62.0}/agent/prompts/baseline.txt +0 -0
  82. {evalvault-1.60.0 → evalvault-1.62.0}/agent/prompts/coding_prompt.md +0 -0
  83. {evalvault-1.60.0 → evalvault-1.62.0}/agent/prompts/existing_project_prompt.md +0 -0
  84. {evalvault-1.60.0 → evalvault-1.62.0}/agent/prompts/improvement/architecture_prompt.md +0 -0
  85. {evalvault-1.60.0 → evalvault-1.62.0}/agent/prompts/improvement/base_prompt.md +0 -0
  86. {evalvault-1.60.0 → evalvault-1.62.0}/agent/prompts/improvement/coordinator_prompt.md +0 -0
  87. {evalvault-1.60.0 → evalvault-1.62.0}/agent/prompts/improvement/observability_prompt.md +0 -0
  88. {evalvault-1.60.0 → evalvault-1.62.0}/agent/prompts/initializer_prompt.md +0 -0
  89. {evalvault-1.60.0 → evalvault-1.62.0}/agent/prompts/prompt_manifest.json +0 -0
  90. {evalvault-1.60.0 → evalvault-1.62.0}/agent/prompts/system.txt +0 -0
  91. {evalvault-1.60.0 → evalvault-1.62.0}/agent/prompts.py +0 -0
  92. {evalvault-1.60.0 → evalvault-1.62.0}/agent/requirements.txt +0 -0
  93. {evalvault-1.60.0 → evalvault-1.62.0}/agent/security.py +0 -0
  94. {evalvault-1.60.0 → evalvault-1.62.0}/config/domains/insurance/memory.yaml +0 -0
  95. {evalvault-1.60.0 → evalvault-1.62.0}/config/domains/insurance/terms_dictionary_en.json +0 -0
  96. {evalvault-1.60.0 → evalvault-1.62.0}/config/domains/insurance/terms_dictionary_ko.json +0 -0
  97. {evalvault-1.60.0 → evalvault-1.62.0}/config/methods.yaml +0 -0
  98. {evalvault-1.60.0 → evalvault-1.62.0}/config/models.yaml +0 -0
  99. {evalvault-1.60.0 → evalvault-1.62.0}/config/regressions/default.json +0 -0
  100. {evalvault-1.60.0 → evalvault-1.62.0}/config/regressions/ux.json +0 -0
  101. {evalvault-1.60.0 → evalvault-1.62.0}/config/stage_metric_playbook.yaml +0 -0
  102. {evalvault-1.60.0 → evalvault-1.62.0}/config/stage_metric_thresholds.json +0 -0
  103. {evalvault-1.60.0 → evalvault-1.62.0}/data/datasets/dummy_test_dataset.json +0 -0
  104. {evalvault-1.60.0 → evalvault-1.62.0}/data/datasets/insurance_qa_korean.csv +0 -0
  105. {evalvault-1.60.0 → evalvault-1.62.0}/data/datasets/insurance_qa_korean.json +0 -0
  106. {evalvault-1.60.0 → evalvault-1.62.0}/data/datasets/insurance_qa_korean_2.json +0 -0
  107. {evalvault-1.60.0 → evalvault-1.62.0}/data/datasets/insurance_qa_korean_3.json +0 -0
  108. {evalvault-1.60.0 → evalvault-1.62.0}/data/datasets/sample.json +0 -0
  109. {evalvault-1.60.0 → evalvault-1.62.0}/data/datasets/visualization_20q_cluster_map.csv +0 -0
  110. {evalvault-1.60.0 → evalvault-1.62.0}/data/datasets/visualization_20q_korean.json +0 -0
  111. {evalvault-1.60.0 → evalvault-1.62.0}/data/datasets/visualization_2q_cluster_map.csv +0 -0
  112. {evalvault-1.60.0 → evalvault-1.62.0}/data/datasets/visualization_2q_korean.json +0 -0
  113. {evalvault-1.60.0 → evalvault-1.62.0}/data/kg/knowledge_graph.json +0 -0
  114. {evalvault-1.60.0 → evalvault-1.62.0}/data/raw/The Complete Guide to Mastering Suno Advanced Strategies for Professional Music Generation.md +0 -0
  115. {evalvault-1.60.0 → evalvault-1.62.0}/data/raw/edge_cases.json +0 -0
  116. {evalvault-1.60.0 → evalvault-1.62.0}/data/raw/run_mode_full_domain_memory.json +0 -0
  117. {evalvault-1.60.0 → evalvault-1.62.0}/data/raw/sample_rag_knowledge.txt +0 -0
  118. {evalvault-1.60.0 → evalvault-1.62.0}/dataset_templates/dataset_template.csv +0 -0
  119. {evalvault-1.60.0 → evalvault-1.62.0}/dataset_templates/dataset_template.json +0 -0
  120. {evalvault-1.60.0 → evalvault-1.62.0}/dataset_templates/dataset_template.xlsx +0 -0
  121. {evalvault-1.60.0 → evalvault-1.62.0}/dataset_templates/method_input_template.json +0 -0
  122. {evalvault-1.60.0 → evalvault-1.62.0}/docker-compose.langfuse.yml +0 -0
  123. {evalvault-1.60.0 → evalvault-1.62.0}/docker-compose.phoenix.yaml +0 -0
  124. {evalvault-1.60.0 → evalvault-1.62.0}/docker-compose.yml +0 -0
  125. {evalvault-1.60.0 → evalvault-1.62.0}/docs/ROADMAP.md +0 -0
  126. {evalvault-1.60.0 → evalvault-1.62.0}/docs/STATUS.md +0 -0
  127. {evalvault-1.60.0 → evalvault-1.62.0}/docs/api/adapters/inbound.md +0 -0
  128. {evalvault-1.60.0 → evalvault-1.62.0}/docs/api/adapters/outbound.md +0 -0
  129. {evalvault-1.60.0 → evalvault-1.62.0}/docs/api/config.md +0 -0
  130. {evalvault-1.60.0 → evalvault-1.62.0}/docs/api/domain/entities.md +0 -0
  131. {evalvault-1.60.0 → evalvault-1.62.0}/docs/api/domain/metrics.md +0 -0
  132. {evalvault-1.60.0 → evalvault-1.62.0}/docs/api/domain/services.md +0 -0
  133. {evalvault-1.60.0 → evalvault-1.62.0}/docs/api/ports/inbound.md +0 -0
  134. {evalvault-1.60.0 → evalvault-1.62.0}/docs/api/ports/outbound.md +0 -0
  135. {evalvault-1.60.0 → evalvault-1.62.0}/docs/architecture/open-rag-trace-collector.md +0 -0
  136. {evalvault-1.60.0 → evalvault-1.62.0}/docs/getting-started/INSTALLATION.md +0 -0
  137. {evalvault-1.60.0 → evalvault-1.62.0}/docs/guides/CLI_MCP_PLAN.md +0 -0
  138. /evalvault-1.60.0/docs/guides/open-rag-trace-internal-adapter.md → /evalvault-1.62.0/docs/guides/OPEN_RAG_TRACE_INTERNAL_ADAPTER.md +0 -0
  139. /evalvault-1.60.0/docs/guides/open-rag-trace-samples.md → /evalvault-1.62.0/docs/guides/OPEN_RAG_TRACE_SAMPLES.md +0 -0
  140. /evalvault-1.60.0/docs/guides/rag_human_feedback_calibration.md → /evalvault-1.62.0/docs/guides/RAG_HUMAN_FEEDBACK_CALIBRATION.md +0 -0
  141. {evalvault-1.60.0 → evalvault-1.62.0}/docs/guides/RELEASE_CHECKLIST.md +0 -0
  142. {evalvault-1.60.0 → evalvault-1.62.0}/docs/mapping/component-to-whitepaper.yaml +0 -0
  143. {evalvault-1.60.0 → evalvault-1.62.0}/docs/new_whitepaper/00_frontmatter.md +0 -0
  144. {evalvault-1.60.0 → evalvault-1.62.0}/docs/new_whitepaper/01_overview.md +0 -0
  145. {evalvault-1.60.0 → evalvault-1.62.0}/docs/new_whitepaper/02_architecture.md +0 -0
  146. {evalvault-1.60.0 → evalvault-1.62.0}/docs/new_whitepaper/03_data_flow.md +0 -0
  147. {evalvault-1.60.0 → evalvault-1.62.0}/docs/new_whitepaper/04_components.md +0 -0
  148. {evalvault-1.60.0 → evalvault-1.62.0}/docs/new_whitepaper/05_expert_lenses.md +0 -0
  149. {evalvault-1.60.0 → evalvault-1.62.0}/docs/new_whitepaper/06_implementation.md +0 -0
  150. {evalvault-1.60.0 → evalvault-1.62.0}/docs/new_whitepaper/07_advanced.md +0 -0
  151. {evalvault-1.60.0 → evalvault-1.62.0}/docs/new_whitepaper/08_customization.md +0 -0
  152. {evalvault-1.60.0 → evalvault-1.62.0}/docs/new_whitepaper/09_quality.md +0 -0
  153. {evalvault-1.60.0 → evalvault-1.62.0}/docs/new_whitepaper/10_performance.md +0 -0
  154. {evalvault-1.60.0 → evalvault-1.62.0}/docs/new_whitepaper/11_security.md +0 -0
  155. {evalvault-1.60.0 → evalvault-1.62.0}/docs/new_whitepaper/12_operations.md +0 -0
  156. {evalvault-1.60.0 → evalvault-1.62.0}/docs/new_whitepaper/13_standards.md +0 -0
  157. {evalvault-1.60.0 → evalvault-1.62.0}/docs/new_whitepaper/14_roadmap.md +0 -0
  158. {evalvault-1.60.0 → evalvault-1.62.0}/docs/new_whitepaper/INDEX.md +0 -0
  159. {evalvault-1.60.0 → evalvault-1.62.0}/docs/new_whitepaper/STYLE_GUIDE.md +0 -0
  160. {evalvault-1.60.0 → evalvault-1.62.0}/docs/stylesheets/extra.css +0 -0
  161. {evalvault-1.60.0 → evalvault-1.62.0}/docs/templates/dataset_template.csv +0 -0
  162. {evalvault-1.60.0 → evalvault-1.62.0}/docs/templates/dataset_template.json +0 -0
  163. {evalvault-1.60.0 → evalvault-1.62.0}/docs/templates/dataset_template.xlsx +0 -0
  164. {evalvault-1.60.0 → evalvault-1.62.0}/docs/templates/kg_template.json +0 -0
  165. {evalvault-1.60.0 → evalvault-1.62.0}/docs/templates/retriever_docs_template.json +0 -0
  166. {evalvault-1.60.0 → evalvault-1.62.0}/docs/tools/generate-whitepaper.py +0 -0
  167. {evalvault-1.60.0 → evalvault-1.62.0}/docs/web_ui_analysis_migration_plan.md +0 -0
  168. {evalvault-1.60.0 → evalvault-1.62.0}/dummy_test_dataset.json +0 -0
  169. {evalvault-1.60.0 → evalvault-1.62.0}/examples/README.md +0 -0
  170. {evalvault-1.60.0 → evalvault-1.62.0}/examples/benchmarks/README.md +0 -0
  171. {evalvault-1.60.0 → evalvault-1.62.0}/examples/benchmarks/korean_rag/faithfulness_test.json +0 -0
  172. {evalvault-1.60.0 → evalvault-1.62.0}/examples/benchmarks/korean_rag/insurance_qa_100.json +0 -0
  173. {evalvault-1.60.0 → evalvault-1.62.0}/examples/benchmarks/korean_rag/keyword_extraction_test.json +0 -0
  174. {evalvault-1.60.0 → evalvault-1.62.0}/examples/benchmarks/korean_rag/retrieval_test.json +0 -0
  175. {evalvault-1.60.0 → evalvault-1.62.0}/examples/benchmarks/output/comparison.json +0 -0
  176. {evalvault-1.60.0 → evalvault-1.62.0}/examples/benchmarks/output/full_results.json +0 -0
  177. {evalvault-1.60.0 → evalvault-1.62.0}/examples/benchmarks/output/leaderboard.json +0 -0
  178. {evalvault-1.60.0 → evalvault-1.62.0}/examples/benchmarks/output/results_mteb.json +0 -0
  179. {evalvault-1.60.0 → evalvault-1.62.0}/examples/benchmarks/output/retrieval_result.json +0 -0
  180. {evalvault-1.60.0 → evalvault-1.62.0}/examples/benchmarks/run_korean_benchmark.py +0 -0
  181. {evalvault-1.60.0 → evalvault-1.62.0}/examples/kg_generator_demo.py +0 -0
  182. {evalvault-1.60.0 → evalvault-1.62.0}/examples/method_plugin_template/README.md +0 -0
  183. {evalvault-1.60.0 → evalvault-1.62.0}/examples/method_plugin_template/pyproject.toml +0 -0
  184. {evalvault-1.60.0 → evalvault-1.62.0}/examples/method_plugin_template/src/method_plugin_template/__init__.py +0 -0
  185. {evalvault-1.60.0 → evalvault-1.62.0}/examples/method_plugin_template/src/method_plugin_template/methods.py +0 -0
  186. {evalvault-1.60.0 → evalvault-1.62.0}/examples/stage_events.jsonl +0 -0
  187. {evalvault-1.60.0 → evalvault-1.62.0}/examples/usecase/comprehensive_workflow_test.py +0 -0
  188. {evalvault-1.60.0 → evalvault-1.62.0}/examples/usecase/insurance_eval_dataset.json +0 -0
  189. {evalvault-1.60.0 → evalvault-1.62.0}/examples/usecase/output/comprehensive_report.html +0 -0
  190. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/.env.example +0 -0
  191. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/.gitignore +0 -0
  192. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/README.md +0 -0
  193. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/e2e/analysis-compare.spec.ts +0 -0
  194. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/e2e/analysis-lab.spec.ts +0 -0
  195. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/e2e/compare-runs.spec.ts +0 -0
  196. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/e2e/dashboard.spec.ts +0 -0
  197. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/e2e/domain-memory.spec.ts +0 -0
  198. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/e2e/evaluation-studio.spec.ts +0 -0
  199. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/e2e/knowledge-base.spec.ts +0 -0
  200. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/e2e/mocks/intents.json +0 -0
  201. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/e2e/mocks/run_details.json +0 -0
  202. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/e2e/mocks/runs.json +0 -0
  203. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/e2e/run-details.spec.ts +0 -0
  204. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/eslint.config.js +0 -0
  205. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/index.html +0 -0
  206. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/package-lock.json +0 -0
  207. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/package.json +0 -0
  208. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/playwright.config.ts +0 -0
  209. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/public/vite.svg +0 -0
  210. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/App.css +0 -0
  211. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/App.tsx +0 -0
  212. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/assets/react.svg +0 -0
  213. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/components/AnalysisNodeOutputs.tsx +0 -0
  214. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/components/InsightSpacePanel.tsx +0 -0
  215. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/components/Layout.tsx +0 -0
  216. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/components/MarkdownContent.tsx +0 -0
  217. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/components/PrioritySummaryPanel.tsx +0 -0
  218. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/components/SpaceLegend.tsx +0 -0
  219. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/components/SpacePlot2D.tsx +0 -0
  220. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/components/SpacePlot3D.tsx +0 -0
  221. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/components/StatusBadge.tsx +0 -0
  222. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/components/VirtualizedText.tsx +0 -0
  223. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/config/ui.ts +0 -0
  224. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/config.ts +0 -0
  225. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/hooks/useInsightSpace.ts +0 -0
  226. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/index.css +0 -0
  227. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/main.tsx +0 -0
  228. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/pages/AnalysisCompareView.tsx +0 -0
  229. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/pages/AnalysisLab.tsx +0 -0
  230. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/pages/AnalysisResultView.tsx +0 -0
  231. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/pages/CompareRuns.tsx +0 -0
  232. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/pages/ComprehensiveAnalysis.tsx +0 -0
  233. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/pages/CustomerReport.tsx +0 -0
  234. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/pages/Dashboard.tsx +0 -0
  235. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/pages/DomainMemory.tsx +0 -0
  236. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/pages/EvaluationStudio.tsx +0 -0
  237. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/pages/KnowledgeBase.tsx +0 -0
  238. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/pages/Settings.tsx +0 -0
  239. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/pages/Visualization.tsx +0 -0
  240. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/pages/VisualizationHome.tsx +0 -0
  241. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/types/plotly.d.ts +0 -0
  242. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/utils/format.ts +0 -0
  243. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/utils/phoenix.ts +0 -0
  244. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/utils/runAnalytics.ts +0 -0
  245. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/utils/score.ts +0 -0
  246. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/src/utils/summaryMetrics.ts +0 -0
  247. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/tailwind.config.js +0 -0
  248. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/tsconfig.app.json +0 -0
  249. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/tsconfig.json +0 -0
  250. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/tsconfig.node.json +0 -0
  251. {evalvault-1.60.0 → evalvault-1.62.0}/frontend/vite.config.ts +0 -0
  252. {evalvault-1.60.0 → evalvault-1.62.0}/package-lock.json +0 -0
  253. {evalvault-1.60.0 → evalvault-1.62.0}/reports/.gitkeep +0 -0
  254. {evalvault-1.60.0 → evalvault-1.62.0}/reports/README.md +0 -0
  255. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/analysis_0aa9fab0-6c2c-4c1c-b228-202a38a2f00c.json +0 -0
  256. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/analysis_0aa9fab0-6c2c-4c1c-b228-202a38a2f00c.md +0 -0
  257. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/analysis_2163f844-ee2c-4630-9ba8-35cd9954d92e.json +0 -0
  258. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/analysis_2163f844-ee2c-4630-9ba8-35cd9954d92e.md +0 -0
  259. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/analysis_4516d358-2797-4c46-9f14-c1d975588025.json +0 -0
  260. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/analysis_4516d358-2797-4c46-9f14-c1d975588025.md +0 -0
  261. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/analysis_4792d785-a8ea-4fd3-8a0c-dcbf1889f5fb.json +0 -0
  262. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/analysis_4792d785-a8ea-4fd3-8a0c-dcbf1889f5fb.md +0 -0
  263. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/analysis_8f825b22-87f1-4d9b-b3a0-8ff65dbec2c5.json +0 -0
  264. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/analysis_8f825b22-87f1-4d9b-b3a0-8ff65dbec2c5.md +0 -0
  265. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/analysis_9fbf4776-9f5b-4c4b-ba08-c556032cee86.json +0 -0
  266. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/analysis_9fbf4776-9f5b-4c4b-ba08-c556032cee86.md +0 -0
  267. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/analysis_e2f7e6bb-a86e-4f6a-8002-0c6f1a831775.json +0 -0
  268. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/analysis_e2f7e6bb-a86e-4f6a-8002-0c6f1a831775.md +0 -0
  269. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/analysis_f1287e90-43b6-42c8-b3ac-e6cb3e06a71e.json +0 -0
  270. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/analysis_f1287e90-43b6-42c8-b3ac-e6cb3e06a71e.md +0 -0
  271. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4516d358-2797-4c46-9f14-c1d975588025/causal_analysis.json +0 -0
  272. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4516d358-2797-4c46-9f14-c1d975588025/diagnostic.json +0 -0
  273. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4516d358-2797-4c46-9f14-c1d975588025/final_output.json +0 -0
  274. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4516d358-2797-4c46-9f14-c1d975588025/index.json +0 -0
  275. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4516d358-2797-4c46-9f14-c1d975588025/load_data.json +0 -0
  276. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4516d358-2797-4c46-9f14-c1d975588025/load_runs.json +0 -0
  277. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4516d358-2797-4c46-9f14-c1d975588025/low_samples.json +0 -0
  278. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4516d358-2797-4c46-9f14-c1d975588025/nlp_analysis.json +0 -0
  279. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4516d358-2797-4c46-9f14-c1d975588025/pattern_detection.json +0 -0
  280. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4516d358-2797-4c46-9f14-c1d975588025/priority_summary.json +0 -0
  281. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4516d358-2797-4c46-9f14-c1d975588025/ragas_eval.json +0 -0
  282. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4516d358-2797-4c46-9f14-c1d975588025/report.json +0 -0
  283. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4516d358-2797-4c46-9f14-c1d975588025/root_cause.json +0 -0
  284. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4516d358-2797-4c46-9f14-c1d975588025/statistics.json +0 -0
  285. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4516d358-2797-4c46-9f14-c1d975588025/time_series.json +0 -0
  286. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4516d358-2797-4c46-9f14-c1d975588025/trend_detection.json +0 -0
  287. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4792d785-a8ea-4fd3-8a0c-dcbf1889f5fb/causal_analysis.json +0 -0
  288. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4792d785-a8ea-4fd3-8a0c-dcbf1889f5fb/diagnostic.json +0 -0
  289. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4792d785-a8ea-4fd3-8a0c-dcbf1889f5fb/final_output.json +0 -0
  290. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4792d785-a8ea-4fd3-8a0c-dcbf1889f5fb/index.json +0 -0
  291. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4792d785-a8ea-4fd3-8a0c-dcbf1889f5fb/load_data.json +0 -0
  292. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4792d785-a8ea-4fd3-8a0c-dcbf1889f5fb/load_runs.json +0 -0
  293. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4792d785-a8ea-4fd3-8a0c-dcbf1889f5fb/low_samples.json +0 -0
  294. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4792d785-a8ea-4fd3-8a0c-dcbf1889f5fb/nlp_analysis.json +0 -0
  295. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4792d785-a8ea-4fd3-8a0c-dcbf1889f5fb/pattern_detection.json +0 -0
  296. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4792d785-a8ea-4fd3-8a0c-dcbf1889f5fb/priority_summary.json +0 -0
  297. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4792d785-a8ea-4fd3-8a0c-dcbf1889f5fb/ragas_eval.json +0 -0
  298. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4792d785-a8ea-4fd3-8a0c-dcbf1889f5fb/report.json +0 -0
  299. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4792d785-a8ea-4fd3-8a0c-dcbf1889f5fb/root_cause.json +0 -0
  300. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4792d785-a8ea-4fd3-8a0c-dcbf1889f5fb/statistics.json +0 -0
  301. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4792d785-a8ea-4fd3-8a0c-dcbf1889f5fb/time_series.json +0 -0
  302. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_4792d785-a8ea-4fd3-8a0c-dcbf1889f5fb/trend_detection.json +0 -0
  303. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_8f825b22-87f1-4d9b-b3a0-8ff65dbec2c5/causal_analysis.json +0 -0
  304. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_8f825b22-87f1-4d9b-b3a0-8ff65dbec2c5/diagnostic.json +0 -0
  305. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_8f825b22-87f1-4d9b-b3a0-8ff65dbec2c5/final_output.json +0 -0
  306. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_8f825b22-87f1-4d9b-b3a0-8ff65dbec2c5/index.json +0 -0
  307. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_8f825b22-87f1-4d9b-b3a0-8ff65dbec2c5/load_data.json +0 -0
  308. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_8f825b22-87f1-4d9b-b3a0-8ff65dbec2c5/load_runs.json +0 -0
  309. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_8f825b22-87f1-4d9b-b3a0-8ff65dbec2c5/low_samples.json +0 -0
  310. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_8f825b22-87f1-4d9b-b3a0-8ff65dbec2c5/nlp_analysis.json +0 -0
  311. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_8f825b22-87f1-4d9b-b3a0-8ff65dbec2c5/pattern_detection.json +0 -0
  312. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_8f825b22-87f1-4d9b-b3a0-8ff65dbec2c5/priority_summary.json +0 -0
  313. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_8f825b22-87f1-4d9b-b3a0-8ff65dbec2c5/ragas_eval.json +0 -0
  314. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_8f825b22-87f1-4d9b-b3a0-8ff65dbec2c5/report.json +0 -0
  315. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_8f825b22-87f1-4d9b-b3a0-8ff65dbec2c5/root_cause.json +0 -0
  316. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_8f825b22-87f1-4d9b-b3a0-8ff65dbec2c5/statistics.json +0 -0
  317. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_8f825b22-87f1-4d9b-b3a0-8ff65dbec2c5/time_series.json +0 -0
  318. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_8f825b22-87f1-4d9b-b3a0-8ff65dbec2c5/trend_detection.json +0 -0
  319. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_e2f7e6bb-a86e-4f6a-8002-0c6f1a831775/causal_analysis.json +0 -0
  320. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_e2f7e6bb-a86e-4f6a-8002-0c6f1a831775/diagnostic.json +0 -0
  321. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_e2f7e6bb-a86e-4f6a-8002-0c6f1a831775/final_output.json +0 -0
  322. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_e2f7e6bb-a86e-4f6a-8002-0c6f1a831775/index.json +0 -0
  323. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_e2f7e6bb-a86e-4f6a-8002-0c6f1a831775/load_data.json +0 -0
  324. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_e2f7e6bb-a86e-4f6a-8002-0c6f1a831775/load_runs.json +0 -0
  325. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_e2f7e6bb-a86e-4f6a-8002-0c6f1a831775/low_samples.json +0 -0
  326. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_e2f7e6bb-a86e-4f6a-8002-0c6f1a831775/nlp_analysis.json +0 -0
  327. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_e2f7e6bb-a86e-4f6a-8002-0c6f1a831775/pattern_detection.json +0 -0
  328. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_e2f7e6bb-a86e-4f6a-8002-0c6f1a831775/priority_summary.json +0 -0
  329. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_e2f7e6bb-a86e-4f6a-8002-0c6f1a831775/ragas_eval.json +0 -0
  330. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_e2f7e6bb-a86e-4f6a-8002-0c6f1a831775/report.json +0 -0
  331. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_e2f7e6bb-a86e-4f6a-8002-0c6f1a831775/root_cause.json +0 -0
  332. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_e2f7e6bb-a86e-4f6a-8002-0c6f1a831775/statistics.json +0 -0
  333. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_e2f7e6bb-a86e-4f6a-8002-0c6f1a831775/time_series.json +0 -0
  334. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_e2f7e6bb-a86e-4f6a-8002-0c6f1a831775/trend_detection.json +0 -0
  335. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_f1287e90-43b6-42c8-b3ac-e6cb3e06a71e/causal_analysis.json +0 -0
  336. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_f1287e90-43b6-42c8-b3ac-e6cb3e06a71e/diagnostic.json +0 -0
  337. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_f1287e90-43b6-42c8-b3ac-e6cb3e06a71e/final_output.json +0 -0
  338. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_f1287e90-43b6-42c8-b3ac-e6cb3e06a71e/index.json +0 -0
  339. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_f1287e90-43b6-42c8-b3ac-e6cb3e06a71e/load_data.json +0 -0
  340. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_f1287e90-43b6-42c8-b3ac-e6cb3e06a71e/load_runs.json +0 -0
  341. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_f1287e90-43b6-42c8-b3ac-e6cb3e06a71e/low_samples.json +0 -0
  342. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_f1287e90-43b6-42c8-b3ac-e6cb3e06a71e/nlp_analysis.json +0 -0
  343. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_f1287e90-43b6-42c8-b3ac-e6cb3e06a71e/pattern_detection.json +0 -0
  344. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_f1287e90-43b6-42c8-b3ac-e6cb3e06a71e/priority_summary.json +0 -0
  345. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_f1287e90-43b6-42c8-b3ac-e6cb3e06a71e/ragas_eval.json +0 -0
  346. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_f1287e90-43b6-42c8-b3ac-e6cb3e06a71e/report.json +0 -0
  347. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_f1287e90-43b6-42c8-b3ac-e6cb3e06a71e/root_cause.json +0 -0
  348. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_f1287e90-43b6-42c8-b3ac-e6cb3e06a71e/statistics.json +0 -0
  349. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_f1287e90-43b6-42c8-b3ac-e6cb3e06a71e/time_series.json +0 -0
  350. {evalvault-1.60.0 → evalvault-1.62.0}/reports/analysis/artifacts/analysis_f1287e90-43b6-42c8-b3ac-e6cb3e06a71e/trend_detection.json +0 -0
  351. {evalvault-1.60.0 → evalvault-1.62.0}/reports/comparison/artifacts/comparison_0aa9fab0_f1287e90/final_output.json +0 -0
  352. {evalvault-1.60.0 → evalvault-1.62.0}/reports/comparison/artifacts/comparison_0aa9fab0_f1287e90/index.json +0 -0
  353. {evalvault-1.60.0 → evalvault-1.62.0}/reports/comparison/artifacts/comparison_0aa9fab0_f1287e90/load_runs.json +0 -0
  354. {evalvault-1.60.0 → evalvault-1.62.0}/reports/comparison/artifacts/comparison_0aa9fab0_f1287e90/report.json +0 -0
  355. {evalvault-1.60.0 → evalvault-1.62.0}/reports/comparison/artifacts/comparison_0aa9fab0_f1287e90/run_change_detection.json +0 -0
  356. {evalvault-1.60.0 → evalvault-1.62.0}/reports/comparison/artifacts/comparison_0aa9fab0_f1287e90/run_metric_comparison.json +0 -0
  357. {evalvault-1.60.0 → evalvault-1.62.0}/reports/comparison/artifacts/comparison_8f825b22_4516d358/final_output.json +0 -0
  358. {evalvault-1.60.0 → evalvault-1.62.0}/reports/comparison/artifacts/comparison_8f825b22_4516d358/index.json +0 -0
  359. {evalvault-1.60.0 → evalvault-1.62.0}/reports/comparison/artifacts/comparison_8f825b22_4516d358/load_runs.json +0 -0
  360. {evalvault-1.60.0 → evalvault-1.62.0}/reports/comparison/artifacts/comparison_8f825b22_4516d358/report.json +0 -0
  361. {evalvault-1.60.0 → evalvault-1.62.0}/reports/comparison/artifacts/comparison_8f825b22_4516d358/run_change_detection.json +0 -0
  362. {evalvault-1.60.0 → evalvault-1.62.0}/reports/comparison/artifacts/comparison_8f825b22_4516d358/run_metric_comparison.json +0 -0
  363. {evalvault-1.60.0 → evalvault-1.62.0}/reports/comparison/artifacts/comparison_f1287e90_8f825b22/final_output.json +0 -0
  364. {evalvault-1.60.0 → evalvault-1.62.0}/reports/comparison/artifacts/comparison_f1287e90_8f825b22/index.json +0 -0
  365. {evalvault-1.60.0 → evalvault-1.62.0}/reports/comparison/artifacts/comparison_f1287e90_8f825b22/load_runs.json +0 -0
  366. {evalvault-1.60.0 → evalvault-1.62.0}/reports/comparison/artifacts/comparison_f1287e90_8f825b22/report.json +0 -0
  367. {evalvault-1.60.0 → evalvault-1.62.0}/reports/comparison/artifacts/comparison_f1287e90_8f825b22/run_change_detection.json +0 -0
  368. {evalvault-1.60.0 → evalvault-1.62.0}/reports/comparison/artifacts/comparison_f1287e90_8f825b22/run_metric_comparison.json +0 -0
  369. {evalvault-1.60.0 → evalvault-1.62.0}/reports/comparison/comparison_0aa9fab0_9fbf4776.json +0 -0
  370. {evalvault-1.60.0 → evalvault-1.62.0}/reports/comparison/comparison_0aa9fab0_9fbf4776.md +0 -0
  371. {evalvault-1.60.0 → evalvault-1.62.0}/reports/comparison/comparison_0aa9fab0_f1287e90.json +0 -0
  372. {evalvault-1.60.0 → evalvault-1.62.0}/reports/comparison/comparison_0aa9fab0_f1287e90.md +0 -0
  373. {evalvault-1.60.0 → evalvault-1.62.0}/reports/comparison/comparison_8f825b22_4516d358.json +0 -0
  374. {evalvault-1.60.0 → evalvault-1.62.0}/reports/comparison/comparison_8f825b22_4516d358.md +0 -0
  375. {evalvault-1.60.0 → evalvault-1.62.0}/reports/comparison/comparison_9fbf4776_a491fa0e.json +0 -0
  376. {evalvault-1.60.0 → evalvault-1.62.0}/reports/comparison/comparison_9fbf4776_a491fa0e.md +0 -0
  377. {evalvault-1.60.0 → evalvault-1.62.0}/reports/comparison/comparison_f1287e90_8f825b22.json +0 -0
  378. {evalvault-1.60.0 → evalvault-1.62.0}/reports/comparison/comparison_f1287e90_8f825b22.md +0 -0
  379. {evalvault-1.60.0 → evalvault-1.62.0}/reports/debug_report_r1_smoke.md +0 -0
  380. {evalvault-1.60.0 → evalvault-1.62.0}/reports/debug_report_r2_graphrag.md +0 -0
  381. {evalvault-1.60.0 → evalvault-1.62.0}/reports/debug_report_r2_graphrag_openai.md +0 -0
  382. {evalvault-1.60.0 → evalvault-1.62.0}/reports/debug_report_r3_bm25.md +0 -0
  383. {evalvault-1.60.0 → evalvault-1.62.0}/reports/debug_report_r3_bm25_langfuse3.md +0 -0
  384. {evalvault-1.60.0 → evalvault-1.62.0}/reports/debug_report_r3_dense_faiss.md +0 -0
  385. {evalvault-1.60.0 → evalvault-1.62.0}/reports/improvement_1d91a667-4288-4742-be3a-a8f5310c5140.md +0 -0
  386. {evalvault-1.60.0 → evalvault-1.62.0}/reports/r2_graphrag_openai_stage_events.jsonl +0 -0
  387. {evalvault-1.60.0 → evalvault-1.62.0}/reports/r2_graphrag_openai_stage_report.txt +0 -0
  388. {evalvault-1.60.0 → evalvault-1.62.0}/reports/r2_graphrag_stage_events.jsonl +0 -0
  389. {evalvault-1.60.0 → evalvault-1.62.0}/reports/r2_graphrag_stage_report.txt +0 -0
  390. {evalvault-1.60.0 → evalvault-1.62.0}/reports/r3_bm25_langfuse2_stage_events.jsonl +0 -0
  391. {evalvault-1.60.0 → evalvault-1.62.0}/reports/r3_bm25_langfuse3_stage_events.jsonl +0 -0
  392. {evalvault-1.60.0 → evalvault-1.62.0}/reports/r3_bm25_langfuse_stage_events.jsonl +0 -0
  393. {evalvault-1.60.0 → evalvault-1.62.0}/reports/r3_bm25_phoenix_stage_events.jsonl +0 -0
  394. {evalvault-1.60.0 → evalvault-1.62.0}/reports/r3_bm25_stage_events.jsonl +0 -0
  395. {evalvault-1.60.0 → evalvault-1.62.0}/reports/r3_bm25_stage_report.txt +0 -0
  396. {evalvault-1.60.0 → evalvault-1.62.0}/reports/r3_dense_faiss_stage_events.jsonl +0 -0
  397. {evalvault-1.60.0 → evalvault-1.62.0}/reports/r3_dense_faiss_stage_report.txt +0 -0
  398. {evalvault-1.60.0 → evalvault-1.62.0}/reports/retrieval_benchmark_smoke_precision.csv +0 -0
  399. {evalvault-1.60.0 → evalvault-1.62.0}/reports/retrieval_benchmark_smoke_precision_graphrag.csv +0 -0
  400. {evalvault-1.60.0 → evalvault-1.62.0}/reports/retrieval_benchmark_smoke_precision_multi.csv +0 -0
  401. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/benchmark/download_kmmlu.py +0 -0
  402. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/dev/open_rag_trace_demo.py +0 -0
  403. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/dev/open_rag_trace_integration_template.py +0 -0
  404. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/dev/otel-collector-config.yaml +0 -0
  405. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/dev/start_web_ui_with_phoenix.sh +0 -0
  406. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/dev/validate_open_rag_trace.py +0 -0
  407. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/dev_seed_pipeline_results.py +0 -0
  408. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/docs/__init__.py +0 -0
  409. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/docs/analyzer/__init__.py +0 -0
  410. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/docs/analyzer/ast_scanner.py +0 -0
  411. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/docs/analyzer/confidence_scorer.py +0 -0
  412. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/docs/analyzer/graph_builder.py +0 -0
  413. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/docs/analyzer/side_effect_detector.py +0 -0
  414. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/docs/generate_api_docs.py +0 -0
  415. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/docs/models/__init__.py +0 -0
  416. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/docs/models/schema.py +0 -0
  417. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/docs/renderer/__init__.py +0 -0
  418. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/docs/renderer/html_generator.py +0 -0
  419. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/ops/phoenix_watch.py +0 -0
  420. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/perf/backfill_langfuse_trace_url.py +0 -0
  421. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/perf/r3_dense_smoke.py +0 -0
  422. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/perf/r3_evalvault_run_dataset.json +0 -0
  423. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/perf/r3_retriever_docs.json +0 -0
  424. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/perf/r3_smoke_real.jsonl +0 -0
  425. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/perf/r3_stage_events_sample.jsonl +0 -0
  426. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/pipeline_template_inspect.py +0 -0
  427. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/reports/generate_release_notes.py +0 -0
  428. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/run_with_timeout.py +0 -0
  429. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/test_full_evaluation.py +0 -0
  430. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/tests/run_regressions.py +0 -0
  431. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/tests/run_retriever_stage_report_smoke.sh +0 -0
  432. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/validate_tutorials.py +0 -0
  433. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/verify_ragas_compliance.py +0 -0
  434. {evalvault-1.60.0 → evalvault-1.62.0}/scripts/verify_workflows.py +0 -0
  435. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/__init__.py +0 -0
  436. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/__init__.py +0 -0
  437. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/api/__init__.py +0 -0
  438. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/api/main.py +0 -0
  439. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/api/routers/__init__.py +0 -0
  440. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/api/routers/benchmark.py +0 -0
  441. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/api/routers/config.py +0 -0
  442. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/api/routers/domain.py +0 -0
  443. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/api/routers/knowledge.py +0 -0
  444. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/api/routers/pipeline.py +0 -0
  445. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/__init__.py +0 -0
  446. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/app.py +0 -0
  447. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/commands/agent.py +0 -0
  448. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/commands/analyze.py +0 -0
  449. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/commands/api.py +0 -0
  450. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/commands/benchmark.py +0 -0
  451. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/commands/config.py +0 -0
  452. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/commands/debug.py +0 -0
  453. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/commands/domain.py +0 -0
  454. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/commands/experiment.py +0 -0
  455. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/commands/gate.py +0 -0
  456. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/commands/generate.py +0 -0
  457. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/commands/history.py +0 -0
  458. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/commands/init.py +0 -0
  459. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/commands/kg.py +0 -0
  460. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/commands/langfuse.py +0 -0
  461. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/commands/method.py +0 -0
  462. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/commands/phoenix.py +0 -0
  463. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/commands/pipeline.py +0 -0
  464. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/commands/prompts.py +0 -0
  465. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/commands/run_helpers.py +0 -0
  466. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/commands/stage.py +0 -0
  467. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/utils/__init__.py +0 -0
  468. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/utils/analysis_io.py +0 -0
  469. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/utils/console.py +0 -0
  470. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/utils/errors.py +0 -0
  471. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/utils/formatters.py +0 -0
  472. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/utils/options.py +0 -0
  473. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/utils/presets.py +0 -0
  474. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/utils/progress.py +0 -0
  475. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/inbound/cli/utils/validators.py +0 -0
  476. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/__init__.py +0 -0
  477. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/__init__.py +0 -0
  478. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/analysis_report_module.py +0 -0
  479. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/base_module.py +0 -0
  480. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/bm25_searcher_module.py +0 -0
  481. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/causal_adapter.py +0 -0
  482. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/causal_analyzer_module.py +0 -0
  483. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/common.py +0 -0
  484. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/comparison_report_module.py +0 -0
  485. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/data_loader_module.py +0 -0
  486. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/detailed_report_module.py +0 -0
  487. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/diagnostic_playbook_module.py +0 -0
  488. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/embedding_analyzer_module.py +0 -0
  489. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/embedding_distribution_module.py +0 -0
  490. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/embedding_searcher_module.py +0 -0
  491. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/hybrid_rrf_module.py +0 -0
  492. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/hybrid_weighted_module.py +0 -0
  493. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/hypothesis_generator_module.py +0 -0
  494. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/low_performer_extractor_module.py +0 -0
  495. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/model_analyzer_module.py +0 -0
  496. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/morpheme_analyzer_module.py +0 -0
  497. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/morpheme_quality_checker_module.py +0 -0
  498. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/network_analyzer_module.py +0 -0
  499. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/pattern_detector_module.py +0 -0
  500. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/pipeline_factory.py +0 -0
  501. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/pipeline_helpers.py +0 -0
  502. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/priority_summary_module.py +0 -0
  503. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/ragas_evaluator_module.py +0 -0
  504. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/retrieval_analyzer_module.py +0 -0
  505. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/retrieval_benchmark_module.py +0 -0
  506. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/retrieval_quality_checker_module.py +0 -0
  507. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/root_cause_analyzer_module.py +0 -0
  508. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/run_analyzer_module.py +0 -0
  509. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/run_change_detector_module.py +0 -0
  510. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/run_comparator_module.py +0 -0
  511. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/run_loader_module.py +0 -0
  512. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/run_metric_comparator_module.py +0 -0
  513. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/search_comparator_module.py +0 -0
  514. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/statistical_adapter.py +0 -0
  515. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/statistical_analyzer_module.py +0 -0
  516. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/statistical_comparator_module.py +0 -0
  517. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/summary_report_module.py +0 -0
  518. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/time_series_analyzer_module.py +0 -0
  519. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/timeseries_advanced_module.py +0 -0
  520. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/trend_detector_module.py +0 -0
  521. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/analysis/verification_report_module.py +0 -0
  522. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/benchmark/__init__.py +0 -0
  523. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/benchmark/lm_eval_adapter.py +0 -0
  524. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/cache/__init__.py +0 -0
  525. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/cache/hybrid_cache.py +0 -0
  526. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/cache/memory_cache.py +0 -0
  527. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/dataset/__init__.py +0 -0
  528. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/dataset/base.py +0 -0
  529. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/dataset/csv_loader.py +0 -0
  530. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/dataset/excel_loader.py +0 -0
  531. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/dataset/json_loader.py +0 -0
  532. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/dataset/loader_factory.py +0 -0
  533. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/dataset/method_input_loader.py +0 -0
  534. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/dataset/streaming_loader.py +0 -0
  535. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/dataset/templates.py +0 -0
  536. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/dataset/thresholds.py +0 -0
  537. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/debug/__init__.py +0 -0
  538. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/debug/report_renderer.py +0 -0
  539. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/documents/__init__.py +0 -0
  540. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/documents/ocr/__init__.py +0 -0
  541. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/documents/ocr/paddleocr_backend.py +0 -0
  542. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/documents/pdf_extractor.py +0 -0
  543. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/documents/versioned_loader.py +0 -0
  544. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/domain_memory/__init__.py +0 -0
  545. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/domain_memory/domain_memory_schema.sql +0 -0
  546. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/domain_memory/sqlite_adapter.py +0 -0
  547. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/improvement/__init__.py +0 -0
  548. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/improvement/insight_generator.py +0 -0
  549. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/improvement/pattern_detector.py +0 -0
  550. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/improvement/playbook_loader.py +0 -0
  551. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/improvement/stage_metric_playbook_loader.py +0 -0
  552. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/kg/__init__.py +0 -0
  553. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/kg/graph_rag_retriever.py +0 -0
  554. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/kg/networkx_adapter.py +0 -0
  555. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/kg/parallel_kg_builder.py +0 -0
  556. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/kg/query_strategies.py +0 -0
  557. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/llm/__init__.py +0 -0
  558. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/llm/anthropic_adapter.py +0 -0
  559. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/llm/azure_adapter.py +0 -0
  560. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/llm/base.py +0 -0
  561. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/llm/instructor_factory.py +0 -0
  562. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/llm/llm_relation_augmenter.py +0 -0
  563. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/llm/ollama_adapter.py +0 -0
  564. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/llm/openai_adapter.py +0 -0
  565. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/llm/token_aware_chat.py +0 -0
  566. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/llm/vllm_adapter.py +0 -0
  567. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/methods/__init__.py +0 -0
  568. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/methods/baseline_oracle.py +0 -0
  569. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/methods/external_command.py +0 -0
  570. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/methods/registry.py +0 -0
  571. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/nlp/__init__.py +0 -0
  572. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/nlp/korean/__init__.py +0 -0
  573. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/nlp/korean/bm25_retriever.py +0 -0
  574. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/nlp/korean/dense_retriever.py +0 -0
  575. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/nlp/korean/document_chunker.py +0 -0
  576. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/nlp/korean/hybrid_retriever.py +0 -0
  577. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/nlp/korean/kiwi_tokenizer.py +0 -0
  578. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/nlp/korean/korean_evaluation.py +0 -0
  579. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/nlp/korean/korean_stopwords.py +0 -0
  580. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/nlp/korean/toolkit.py +0 -0
  581. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/phoenix/sync_service.py +0 -0
  582. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/report/__init__.py +0 -0
  583. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/report/dashboard_generator.py +0 -0
  584. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/report/llm_report_generator.py +0 -0
  585. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/report/markdown_adapter.py +0 -0
  586. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/storage/__init__.py +0 -0
  587. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/storage/benchmark_storage_adapter.py +0 -0
  588. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/tracer/__init__.py +0 -0
  589. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/tracer/open_rag_log_handler.py +0 -0
  590. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/tracer/open_rag_trace_adapter.py +0 -0
  591. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/tracer/open_rag_trace_decorators.py +0 -0
  592. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/tracer/open_rag_trace_helpers.py +0 -0
  593. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/tracer/phoenix_tracer_adapter.py +0 -0
  594. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/tracker/__init__.py +0 -0
  595. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/tracker/langfuse_adapter.py +0 -0
  596. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/tracker/mlflow_adapter.py +0 -0
  597. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/adapters/outbound/tracker/phoenix_adapter.py +0 -0
  598. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/config/__init__.py +0 -0
  599. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/config/agent_types.py +0 -0
  600. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/config/domain_config.py +0 -0
  601. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/config/instrumentation.py +0 -0
  602. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/config/langfuse_support.py +0 -0
  603. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/config/model_config.py +0 -0
  604. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/config/phoenix_support.py +0 -0
  605. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/config/playbooks/improvement_playbook.yaml +0 -0
  606. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/debug_ragas.py +0 -0
  607. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/debug_ragas_real.py +0 -0
  608. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/__init__.py +0 -0
  609. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/entities/analysis.py +0 -0
  610. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/entities/analysis_pipeline.py +0 -0
  611. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/entities/benchmark.py +0 -0
  612. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/entities/benchmark_run.py +0 -0
  613. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/entities/dataset.py +0 -0
  614. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/entities/debug.py +0 -0
  615. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/entities/experiment.py +0 -0
  616. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/entities/improvement.py +0 -0
  617. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/entities/kg.py +0 -0
  618. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/entities/memory.py +0 -0
  619. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/entities/method.py +0 -0
  620. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/entities/prompt.py +0 -0
  621. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/entities/rag_trace.py +0 -0
  622. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/entities/result.py +0 -0
  623. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/entities/stage.py +0 -0
  624. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/metrics/__init__.py +0 -0
  625. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/metrics/analysis_registry.py +0 -0
  626. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/metrics/confidence.py +0 -0
  627. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/metrics/contextual_relevancy.py +0 -0
  628. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/metrics/entity_preservation.py +0 -0
  629. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/metrics/insurance.py +0 -0
  630. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/metrics/no_answer.py +0 -0
  631. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/metrics/registry.py +0 -0
  632. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/metrics/retrieval_rank.py +0 -0
  633. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/metrics/terms_dictionary.json +0 -0
  634. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/metrics/text_match.py +0 -0
  635. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/__init__.py +0 -0
  636. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/analysis_service.py +0 -0
  637. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/async_batch_executor.py +0 -0
  638. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/batch_executor.py +0 -0
  639. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/benchmark_report_service.py +0 -0
  640. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/benchmark_runner.py +0 -0
  641. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/benchmark_service.py +0 -0
  642. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/cache_metrics.py +0 -0
  643. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/cluster_map_builder.py +0 -0
  644. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/dataset_preprocessor.py +0 -0
  645. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/debug_report_service.py +0 -0
  646. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/document_chunker.py +0 -0
  647. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/document_versioning.py +0 -0
  648. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/domain_learning_hook.py +0 -0
  649. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/embedding_overlay.py +0 -0
  650. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/entity_extractor.py +0 -0
  651. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/evaluator.py +0 -0
  652. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/experiment_comparator.py +0 -0
  653. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/experiment_manager.py +0 -0
  654. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/experiment_reporter.py +0 -0
  655. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/experiment_repository.py +0 -0
  656. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/experiment_statistics.py +0 -0
  657. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/improvement_guide_service.py +0 -0
  658. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/intent_classifier.py +0 -0
  659. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/kg_generator.py +0 -0
  660. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/memory_aware_evaluator.py +0 -0
  661. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/memory_based_analysis.py +0 -0
  662. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/method_runner.py +0 -0
  663. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/pipeline_orchestrator.py +0 -0
  664. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/pipeline_template_registry.py +0 -0
  665. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/prompt_manifest.py +0 -0
  666. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/prompt_registry.py +0 -0
  667. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/prompt_status.py +0 -0
  668. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/ragas_prompt_overrides.py +0 -0
  669. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/retrieval_metrics.py +0 -0
  670. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/retriever_context.py +0 -0
  671. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/stage_event_builder.py +0 -0
  672. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/stage_metric_guide_service.py +0 -0
  673. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/stage_metric_service.py +0 -0
  674. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/stage_summary_service.py +0 -0
  675. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/synthetic_qa_generator.py +0 -0
  676. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/testset_generator.py +0 -0
  677. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/threshold_profiles.py +0 -0
  678. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/unified_report_service.py +0 -0
  679. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/domain/services/visual_space_service.py +0 -0
  680. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/mkdocs_helpers.py +0 -0
  681. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/ports/__init__.py +0 -0
  682. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/ports/inbound/__init__.py +0 -0
  683. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/ports/inbound/analysis_pipeline_port.py +0 -0
  684. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/ports/inbound/evaluator_port.py +0 -0
  685. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/ports/inbound/learning_hook_port.py +0 -0
  686. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/ports/outbound/__init__.py +0 -0
  687. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/ports/outbound/analysis_cache_port.py +0 -0
  688. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/ports/outbound/analysis_module_port.py +0 -0
  689. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/ports/outbound/analysis_port.py +0 -0
  690. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/ports/outbound/benchmark_port.py +0 -0
  691. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/ports/outbound/causal_analysis_port.py +0 -0
  692. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/ports/outbound/dataset_port.py +0 -0
  693. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/ports/outbound/domain_memory_port.py +0 -0
  694. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/ports/outbound/embedding_port.py +0 -0
  695. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/ports/outbound/improvement_port.py +0 -0
  696. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/ports/outbound/intent_classifier_port.py +0 -0
  697. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/ports/outbound/korean_nlp_port.py +0 -0
  698. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/ports/outbound/llm_port.py +0 -0
  699. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/ports/outbound/method_port.py +0 -0
  700. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/ports/outbound/nlp_analysis_port.py +0 -0
  701. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/ports/outbound/relation_augmenter_port.py +0 -0
  702. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/ports/outbound/report_port.py +0 -0
  703. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/ports/outbound/stage_storage_port.py +0 -0
  704. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/ports/outbound/tracer_port.py +0 -0
  705. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/ports/outbound/tracker_port.py +0 -0
  706. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/reports/__init__.py +0 -0
  707. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/reports/release_notes.py +0 -0
  708. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/scripts/__init__.py +0 -0
  709. {evalvault-1.60.0 → evalvault-1.62.0}/src/evalvault/scripts/regression_runner.py +0 -0
  710. {evalvault-1.60.0 → evalvault-1.62.0}/tests/__init__.py +0 -0
  711. {evalvault-1.60.0 → evalvault-1.62.0}/tests/fixtures/README.md +0 -0
  712. {evalvault-1.60.0 → evalvault-1.62.0}/tests/fixtures/benchmark/retrieval_ground_truth_min.json +0 -0
  713. {evalvault-1.60.0 → evalvault-1.62.0}/tests/fixtures/benchmark/retrieval_ground_truth_multi.json +0 -0
  714. {evalvault-1.60.0 → evalvault-1.62.0}/tests/fixtures/e2e/auto_insurance_qa_korean_full.json +0 -0
  715. {evalvault-1.60.0 → evalvault-1.62.0}/tests/fixtures/e2e/comprehensive_dataset.json +0 -0
  716. {evalvault-1.60.0 → evalvault-1.62.0}/tests/fixtures/e2e/edge_cases.json +0 -0
  717. {evalvault-1.60.0 → evalvault-1.62.0}/tests/fixtures/e2e/edge_cases.xlsx +0 -0
  718. {evalvault-1.60.0 → evalvault-1.62.0}/tests/fixtures/e2e/evaluation_test_sample.json +0 -0
  719. {evalvault-1.60.0 → evalvault-1.62.0}/tests/fixtures/e2e/graphrag_retriever_docs.json +0 -0
  720. {evalvault-1.60.0 → evalvault-1.62.0}/tests/fixtures/e2e/graphrag_smoke.json +0 -0
  721. {evalvault-1.60.0 → evalvault-1.62.0}/tests/fixtures/e2e/insurance_document.txt +0 -0
  722. {evalvault-1.60.0 → evalvault-1.62.0}/tests/fixtures/e2e/insurance_qa_english.csv +0 -0
  723. {evalvault-1.60.0 → evalvault-1.62.0}/tests/fixtures/e2e/insurance_qa_english.json +0 -0
  724. {evalvault-1.60.0 → evalvault-1.62.0}/tests/fixtures/e2e/insurance_qa_english.xlsx +0 -0
  725. {evalvault-1.60.0 → evalvault-1.62.0}/tests/fixtures/e2e/insurance_qa_korean.csv +0 -0
  726. {evalvault-1.60.0 → evalvault-1.62.0}/tests/fixtures/e2e/insurance_qa_korean.json +0 -0
  727. {evalvault-1.60.0 → evalvault-1.62.0}/tests/fixtures/e2e/insurance_qa_korean.xlsx +0 -0
  728. {evalvault-1.60.0 → evalvault-1.62.0}/tests/fixtures/e2e/insurance_qa_korean_versioned_pdf.json +0 -0
  729. {evalvault-1.60.0 → evalvault-1.62.0}/tests/fixtures/e2e/run_mode_full_domain_memory.json +0 -0
  730. {evalvault-1.60.0 → evalvault-1.62.0}/tests/fixtures/e2e/run_mode_simple.json +0 -0
  731. {evalvault-1.60.0 → evalvault-1.62.0}/tests/fixtures/e2e/summary_eval_minimal.json +0 -0
  732. {evalvault-1.60.0 → evalvault-1.62.0}/tests/fixtures/kg/minimal_graph.json +0 -0
  733. {evalvault-1.60.0 → evalvault-1.62.0}/tests/fixtures/sample_dataset.csv +0 -0
  734. {evalvault-1.60.0 → evalvault-1.62.0}/tests/fixtures/sample_dataset.json +0 -0
  735. {evalvault-1.60.0 → evalvault-1.62.0}/tests/fixtures/sample_dataset.xlsx +0 -0
  736. {evalvault-1.60.0 → evalvault-1.62.0}/tests/integration/__init__.py +0 -0
  737. {evalvault-1.60.0 → evalvault-1.62.0}/tests/integration/benchmark/test_benchmark_service_integration.py +0 -0
  738. {evalvault-1.60.0 → evalvault-1.62.0}/tests/integration/conftest.py +0 -0
  739. {evalvault-1.60.0 → evalvault-1.62.0}/tests/integration/test_cli_integration.py +0 -0
  740. {evalvault-1.60.0 → evalvault-1.62.0}/tests/integration/test_data_flow.py +0 -0
  741. {evalvault-1.60.0 → evalvault-1.62.0}/tests/integration/test_e2e_scenarios.py +0 -0
  742. {evalvault-1.60.0 → evalvault-1.62.0}/tests/integration/test_evaluation_flow.py +0 -0
  743. {evalvault-1.60.0 → evalvault-1.62.0}/tests/integration/test_full_workflow.py +0 -0
  744. {evalvault-1.60.0 → evalvault-1.62.0}/tests/integration/test_langfuse_flow.py +0 -0
  745. {evalvault-1.60.0 → evalvault-1.62.0}/tests/integration/test_phoenix_flow.py +0 -0
  746. {evalvault-1.60.0 → evalvault-1.62.0}/tests/integration/test_pipeline_api_contracts.py +0 -0
  747. {evalvault-1.60.0 → evalvault-1.62.0}/tests/integration/test_storage_flow.py +0 -0
  748. {evalvault-1.60.0 → evalvault-1.62.0}/tests/integration/test_summary_eval_fixture.py +0 -0
  749. {evalvault-1.60.0 → evalvault-1.62.0}/tests/optional_deps.py +0 -0
  750. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/__init__.py +0 -0
  751. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/adapters/outbound/documents/test_pdf_extractor.py +0 -0
  752. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/adapters/outbound/documents/test_versioned_loader.py +0 -0
  753. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/adapters/outbound/improvement/__init__.py +0 -0
  754. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/adapters/outbound/improvement/test_insight_generator.py +0 -0
  755. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/adapters/outbound/improvement/test_pattern_detector.py +0 -0
  756. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/adapters/outbound/improvement/test_playbook_loader.py +0 -0
  757. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/adapters/outbound/improvement/test_stage_metric_playbook_loader.py +0 -0
  758. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/adapters/outbound/kg/test_graph_rag_retriever.py +0 -0
  759. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/adapters/outbound/kg/test_parallel_kg_builder.py +0 -0
  760. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/adapters/outbound/storage/test_benchmark_storage_adapter.py +0 -0
  761. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/config/test_phoenix_support.py +0 -0
  762. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/conftest.py +0 -0
  763. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/domain/metrics/test_analysis_metric_registry.py +0 -0
  764. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/domain/metrics/test_confidence.py +0 -0
  765. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/domain/metrics/test_contextual_relevancy.py +0 -0
  766. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/domain/metrics/test_entity_preservation.py +0 -0
  767. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/domain/metrics/test_metric_registry.py +0 -0
  768. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/domain/metrics/test_no_answer.py +0 -0
  769. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/domain/metrics/test_retrieval_rank.py +0 -0
  770. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/domain/metrics/test_text_match.py +0 -0
  771. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/domain/services/test_cache_metrics.py +0 -0
  772. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/domain/services/test_claim_level.py +0 -0
  773. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/domain/services/test_dataset_preprocessor.py +0 -0
  774. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/domain/services/test_document_versioning.py +0 -0
  775. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/domain/services/test_evaluator_comprehensive.py +0 -0
  776. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/domain/services/test_improvement_guide_service.py +0 -0
  777. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/domain/services/test_retrieval_metrics.py +0 -0
  778. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/domain/services/test_retriever_context.py +0 -0
  779. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/domain/services/test_stage_event_builder.py +0 -0
  780. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/domain/services/test_stage_metric_guide_service.py +0 -0
  781. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/domain/services/test_synthetic_qa_generator.py +0 -0
  782. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/domain/test_embedding_overlay.py +0 -0
  783. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/domain/test_prompt_manifest.py +0 -0
  784. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/domain/test_prompt_status.py +0 -0
  785. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/reports/test_release_notes.py +0 -0
  786. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/scripts/test_regression_runner.py +0 -0
  787. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_agent_types.py +0 -0
  788. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_analysis_entities.py +0 -0
  789. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_analysis_modules.py +0 -0
  790. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_analysis_pipeline.py +0 -0
  791. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_analysis_service.py +0 -0
  792. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_anthropic_adapter.py +0 -0
  793. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_async_batch_executor.py +0 -0
  794. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_azure_adapter.py +0 -0
  795. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_benchmark_helpers.py +0 -0
  796. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_benchmark_runner.py +0 -0
  797. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_causal_adapter.py +0 -0
  798. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_cli.py +0 -0
  799. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_cli_domain.py +0 -0
  800. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_cli_init.py +0 -0
  801. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_cli_progress.py +0 -0
  802. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_cli_utils.py +0 -0
  803. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_data_loaders.py +0 -0
  804. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_domain_config.py +0 -0
  805. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_domain_memory.py +0 -0
  806. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_entities.py +0 -0
  807. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_entities_kg.py +0 -0
  808. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_entity_extractor.py +0 -0
  809. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_evaluator.py +0 -0
  810. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_experiment.py +0 -0
  811. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_hybrid_cache.py +0 -0
  812. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_instrumentation.py +0 -0
  813. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_insurance_metric.py +0 -0
  814. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_intent_classifier.py +0 -0
  815. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_kg_generator.py +0 -0
  816. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_kg_networkx.py +0 -0
  817. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_kiwi_tokenizer.py +0 -0
  818. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_kiwi_warning_suppression.py +0 -0
  819. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_korean_dense.py +0 -0
  820. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_korean_evaluation.py +0 -0
  821. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_korean_retrieval.py +0 -0
  822. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_langfuse_tracker.py +0 -0
  823. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_llm_relation_augmenter.py +0 -0
  824. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_lm_eval_adapter.py +0 -0
  825. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_markdown_report.py +0 -0
  826. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_memory_cache.py +0 -0
  827. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_memory_services.py +0 -0
  828. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_method_plugins.py +0 -0
  829. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_mlflow_tracker.py +0 -0
  830. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_model_config.py +0 -0
  831. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_nlp_adapter.py +0 -0
  832. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_nlp_entities.py +0 -0
  833. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_ollama_adapter.py +0 -0
  834. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_openai_adapter.py +0 -0
  835. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_phoenix_adapter.py +0 -0
  836. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_pipeline_orchestrator.py +0 -0
  837. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_ports.py +0 -0
  838. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_postgres_storage.py +0 -0
  839. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_rag_trace_entities.py +0 -0
  840. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_run_memory_helpers.py +0 -0
  841. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_run_mode_fixtures.py +0 -0
  842. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_settings.py +0 -0
  843. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_stage_cli.py +0 -0
  844. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_stage_metric_service.py +0 -0
  845. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_stage_storage.py +0 -0
  846. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_stage_summary_service.py +0 -0
  847. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_statistical_adapter.py +0 -0
  848. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_streaming_loader.py +0 -0
  849. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_summary_eval_fixture.py +0 -0
  850. {evalvault-1.60.0 → evalvault-1.62.0}/tests/unit/test_testset_generator.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: evalvault
3
- Version: 1.60.0
3
+ Version: 1.62.0
4
4
  Summary: RAG evaluation system using Ragas with Phoenix/Langfuse tracing
5
5
  Project-URL: Homepage, https://github.com/ntts9990/EvalVault
6
6
  Project-URL: Documentation, https://github.com/ntts9990/EvalVault#readme
@@ -46,6 +46,7 @@ Requires-Dist: uvicorn>=0.40.0
46
46
  Requires-Dist: xlrd
47
47
  Provides-Extra: analysis
48
48
  Requires-Dist: scikit-learn>=1.3.0; extra == 'analysis'
49
+ Requires-Dist: xgboost>=2.0.0; extra == 'analysis'
49
50
  Provides-Extra: anthropic
50
51
  Requires-Dist: anthropic; extra == 'anthropic'
51
52
  Requires-Dist: langchain-anthropic; extra == 'anthropic'
@@ -86,6 +87,7 @@ Requires-Dist: rank-bm25>=0.2.2; extra == 'dev'
86
87
  Requires-Dist: ruff; extra == 'dev'
87
88
  Requires-Dist: scikit-learn<1.4.0,>=1.3.0; extra == 'dev'
88
89
  Requires-Dist: sentence-transformers>=5.2.0; extra == 'dev'
90
+ Requires-Dist: xgboost>=2.0.0; extra == 'dev'
89
91
  Provides-Extra: docs
90
92
  Requires-Dist: mkdocs-material>=9.5.0; extra == 'docs'
91
93
  Requires-Dist: mkdocs>=1.5.0; extra == 'docs'
@@ -294,7 +296,7 @@ EvalVault는 OpenTelemetry + OpenInference 기반의 **Open RAG Trace** 스키
294
296
 
295
297
  - 스펙: `docs/architecture/open-rag-trace-spec.md`
296
298
  - Collector: `docs/architecture/open-rag-trace-collector.md`
297
- - 샘플/내부 래퍼: `docs/guides/open-rag-trace-samples.md`, `docs/guides/open-rag-trace-internal-adapter.md`
299
+ - 샘플/내부 래퍼: `docs/guides/OPEN_RAG_TRACE_SAMPLES.md`, `docs/guides/OPEN_RAG_TRACE_INTERNAL_ADAPTER.md`
298
300
  - 관련 문서: `docs/INDEX.md`, `docs/architecture/open-rag-trace-collector.md`
299
301
 
300
302
  ---
@@ -150,8 +150,8 @@ The core contract is **module-level spans (`rag.module`) + log events + shared a
150
150
  **Docs**
151
151
  - `docs/architecture/open-rag-trace-spec.md`
152
152
  - `docs/architecture/open-rag-trace-collector.md`
153
- - `docs/guides/open-rag-trace-internal-adapter.md`
154
- - `docs/guides/open-rag-trace-samples.md`
153
+ - `docs/guides/OPEN_RAG_TRACE_INTERNAL_ADAPTER.md`
154
+ - `docs/guides/OPEN_RAG_TRACE_SAMPLES.md`
155
155
 
156
156
  ---
157
157
 
@@ -178,7 +178,7 @@ EvalVault는 OpenTelemetry + OpenInference 기반의 **Open RAG Trace** 스키
178
178
 
179
179
  - 스펙: `docs/architecture/open-rag-trace-spec.md`
180
180
  - Collector: `docs/architecture/open-rag-trace-collector.md`
181
- - 샘플/내부 래퍼: `docs/guides/open-rag-trace-samples.md`, `docs/guides/open-rag-trace-internal-adapter.md`
181
+ - 샘플/내부 래퍼: `docs/guides/OPEN_RAG_TRACE_SAMPLES.md`, `docs/guides/OPEN_RAG_TRACE_INTERNAL_ADAPTER.md`
182
182
  - 관련 문서: `docs/INDEX.md`, `docs/architecture/open-rag-trace-collector.md`
183
183
 
184
184
  ---
@@ -37,8 +37,8 @@ docs/
37
37
  │ ├── DEV_GUIDE.md # 개발 루틴/테스트/품질
38
38
  │ ├── CLI_MCP_PLAN.md # CLI→MCP 이식 계획 (Living Doc)
39
39
  │ ├── RELEASE_CHECKLIST.md # 배포 체크리스트
40
- │ ├── open-rag-trace-*.md # Open RAG Trace 샘플/내부 래퍼
41
- │ └── open-rag-trace-*.md
40
+ │ ├── OPEN_RAG_TRACE_*.md # Open RAG Trace 샘플/내부 래퍼
41
+ │ └── OPEN_RAG_TRACE_*.md
42
42
  ├── architecture/
43
43
  │ ├── open-rag-trace-spec.md # Open RAG Trace 스펙
44
44
  │ └── open-rag-trace-collector.md
@@ -328,8 +328,8 @@ uv run evalvault run-full tests/fixtures/e2e/insurance_qa_korean.json \
328
328
  - [new_whitepaper/INDEX.md](new_whitepaper/INDEX.md): 개발 백서 (설계/운영/품질 기준)
329
329
  - [architecture/open-rag-trace-spec.md](architecture/open-rag-trace-spec.md): Open RAG Trace 표준 (Draft)
330
330
  - [architecture/open-rag-trace-collector.md](architecture/open-rag-trace-collector.md): Collector 구성 예시
331
- - [guides/open-rag-trace-samples.md](guides/open-rag-trace-samples.md): 최소 계측 샘플
332
- - [guides/open-rag-trace-internal-adapter.md](guides/open-rag-trace-internal-adapter.md): 내부 시스템 최소 계측 래퍼
331
+ - [guides/OPEN_RAG_TRACE_SAMPLES.md](guides/OPEN_RAG_TRACE_SAMPLES.md): 최소 계측 샘플
332
+ - [guides/OPEN_RAG_TRACE_INTERNAL_ADAPTER.md](guides/OPEN_RAG_TRACE_INTERNAL_ADAPTER.md): 내부 시스템 최소 계측 래퍼
333
333
  - [CHANGELOG.md](https://github.com/ntts9990/EvalVault/blob/main/CHANGELOG.md): 릴리스 히스토리
334
334
 
335
335
  ---
@@ -178,7 +178,7 @@ RAG 서비스 (OTel SDK) ── OTLP ──> OTel Collector ──> Phoenix /
178
178
 
179
179
  ## 관련 문서
180
180
  - [open-rag-trace-collector.md](open-rag-trace-collector.md): Collector 구성 예시
181
- - [../guides/open-rag-trace-samples.md](../guides/open-rag-trace-samples.md): 최소 계측 샘플
181
+ - [../guides/OPEN_RAG_TRACE_SAMPLES.md](../guides/OPEN_RAG_TRACE_SAMPLES.md): 최소 계측 샘플
182
182
 
183
183
  ---
184
184
 
@@ -0,0 +1,142 @@
1
+ AI 에이전트 시스템 설계부터 운영까지: 최신 연구 기반 전략 가이드
2
+
3
+ 문제의식: 최근 거대언어모델(LLM) 기반 AI 에이전트 시스템이 다양한 산업에 도입되며 주목받고 있다. 기업들은 고객 서비스, 소프트웨어 개발, 교육, 의료 등 여러 분야에서 복잡한 작업을 자동화하기 위해 에이전트를 구축하고 있다 . 그러나 여러 에이전트가 동적 경로를 따라 다양한 **도구(tool)**를 호출하며 복잡하게 상호작용하는 상황에서, 응답의 정확성과 적절성을 보장하는 것이 큰 과제로 떠오르고 있다 . 다시 말해, AI 에이전트 시스템이 제대로 믿을 수 있고 유용하게 동작하는지 평가하고 통제하는 방법론이 필요하다 .
4
+
5
+ 목표: 본 보고서는 AI 에이전트 시스템을 설계, 구현, 평가, 운영하는 전 과정을 체계적으로 검토하고, 최신 연구에 기반한 개선 전략을 제안한다. 특히 인지심리학적 관점에서 사용자와 개발자의 인지 부담을 줄이는 설계 원리를 강조하고, 편집자적 관점으로 문서 구조와 표현을 다듬었다. 또한 국문학적 관점에서 정확하고 일관된 용어를 사용하고, 피칭 전문가의 시각으로 핵심 메시지를 강조하며 시각화 가능한 요소를 포함하였다.
6
+
7
+ 구성: 보고서는 네 가지 전략적 질문을 중심으로 전개된다. 각 질문은 AI 에이전트 시스템 수명주기의 한 단계를 대변하며, 단계별로 왜 이러한 접근이 필요한지, 어떻게 실현할 것인지를 탐구한다:
8
+ 1. 설계: “왜 단일 에이전트부터 시작해야 하는가?” – 복잡성을 통제하기 위한 초기 설계 전략을 다룬다.
9
+ 2. 구현: “어떻게 모듈화된 아키텍처를 구현할 것인가?” – 유지보수성과 확장성을 높이는 구현 방법을 논의한다.
10
+ 3. 평가: “AI 에이전트의 성능은 어떻게 평가해야 하는가?” – 에이전트의 지능과 행동을 종합적으로 측정하는 방법을 제시한다.
11
+ 4. 운영: “운영 단계에서 어떻게 지속적으로 개선하고 통제할 것인가?” – 배포 후 시스템을 모니터링하고 안전하게 관리하는 방안을 설명한다.
12
+
13
+ 이러한 질문 구조를 통해 독자는 각 단계의 핵심 목표와 원칙을 탐색적으로 살펴볼 수 있다. 아래 각 섹션에서는 해당 질문에 대한 해답과 구체적인 전략을 제시한다.
14
+
15
+ 왜 단일 에이전트부터 시작해야 하는가? (설계 단계)
16
+
17
+ 복잡성의 함정: 여러 에이전트를 한꺼번에 도입하면 겉보기엔 사람 팀처럼 전문화를 통해 효율을 높일 수 있을 것 같지만, 현실에서는 조율 비용과 복잡성이 폭증할 위험이 있다  . 예를 들어 10개의 에이전트가 상호 협력하면 잠재적 상호작용 경로가 45개까지 늘어나고, 각 경로마다 문맥 손실이나 충돌이 발생할 가능성이 높아진다 . 이는 사람으로 치면 동시에 너무 많은 업무를 두서없이 처리하려는 상황과 같다. 인지심리학자 Herbert Simon의 말대로, 인간 두뇌의 한계로 복잡한 문제를 한꺼번에 완벽히 해결하는 것은 어렵다. 마찬가지로 에이전트 간 조율의 인지적 부담이 커지면 시스템 신뢰성과 성능이 급격히 떨어질 수 있다.
18
+
19
+ 단일 에이전트의 이점: 반면 단일 에이전트로 시작하면 전체 시스템을 하나의 맥락으로 유지할 수 있어 설계가 단순해지고 인지적 부담이 줄어든다. 모든 정보가 한 에이전트 내에 있으므로 기억(fragmented memory) 단편화나 정보 사일로 문제가 없다  . 여러 에이전트가 서로 정보를 주고받느라 발생하는 추가 비용도 없다. 실제로 한 연구에서는 복잡한 작업을 단일 에이전트로 처리할 때 API 호출 비용이 다중 에이전트 대비 1/15 수준으로 감소한 사례를 보고하였다 . 이는 불필요한 상호 통신을 줄인 결과로, 운영 비용 절감과 응답 지연 최소화에 유리하다.
20
+
21
+ 인지 부하 관점: 단일 에이전트 접근은 사용자 및 운영자의 이해 측면에서도 유리하다. 시스템 행동의 흐름을 한 눈에 파악할 수 있어 예측 가능성과 설명 가능성이 높아진다. 에이전트가 어떤 결정을 내리는지 추적하기 쉬우므로, 문제가 생겼을 때 디버깅이나 원인 분석이 수월하다. 이는 운영자가 시스템을 신뢰하고 통제할 수 있게 해준다. Hick의 법칙 등 인지심리 이론에 따르면, 사람은 선택지가 늘어날수록 판단에 어려움을 겪는데 , 동일하게 에이전트 구성도 단순할수록 의사결정 구조가 명확해져 성능 저하 위험이 줄어든다 . 요컨대, 처음에는 단순 구조로 핵심 과제를 해결하는 에이전트 하나를 제대로 만드는 것이 바람직하다. 이후 필요에 따라 점진적으로 구조를 확장해도 늦지 않다.
22
+
23
+ 다중 에이전트가 유효한 경우: 물론 모든 경우에 단일 에이전트만 써야 하는 것은 아니다. 문제를 병렬로 나누어 처리하면 큰 이점을 얻는 상황에서는 다중 에이전트가 효과적일 수 있다. 다음과 같은 조건에서는 다중 에이전트 전략을 고려할 수 있다:
24
+ • 작업 분할의 독립성: 문제를 여러 하위 문제로 완전히 독립적으로 나눌 수 있어, 에이전트들이 상호 통신 없이 병렬 처리가 가능한 경우 . (예: 각 에이전트가 서로 다른 데이터 세트를 분석하고 최종적으로 결과만 합치는 경우)
25
+ • 읽기 위주 작업: 에이전트들이 주로 데이터를 읽고 분석만 하며, **공유 상태를 수정(write)**하지 않는 경우 . 이때 각 에이전트는 타 에이전트의 결과를 변경하지 않고 충돌 없이 자신의 분석을 완료할 수 있다.
26
+ • 결과 통합의 단순성: 개별 에이전트의 산출물을 단순한 방식으로 결합할 수 있는 경우. 예를 들어 최종 오케스트레이션이 각 에이전트의 보고서를 나열하거나 평균내는 정도로 기계적으로 수행될 때, 복잡한 조율이 불필요하다  .
27
+ • 지연보다는 속도가 중요: 응답 속도 향상이 매우 중요해서, 다중 에이전트 병렬 처리로 지연을 줄이는 이득이 추가 비용보다 가치 있을 때 . (예: 금융 시장처럼 실시간 분석이 요구되는 분야에서는 속도 향상을 위해 비용 증가를 수용)
28
+
29
+ 위 조건을 만족하면 다중 에이전트 시스템은 단일 에이전트 대비 최대 8배 이상 빠른 처리나 더 많은 패턴 발견 등의 효과를 낼 수 있다고 보고된 바 있다(블룸버그 사례) . 다만 이 경우에도 운영 비용이 증가하고(블룸버그 사례에서 단일 대비 2.3배 비용 상승) , 이러한 장점을 얻기 위해서는 엄격한 오케스트레이션과 설계 통제가 전제되어야 한다 .
30
+
31
+ 요약: 대부분의 일반적인 경우, 단순한 출발점으로 시작하여 점진적으로 복잡성을 추가하는 것이 안전하다. 아래 표는 단일 vs. 다중 에이전트 접근의 주요 장단점을 요약한 것이다:
32
+
33
+ 전략 장점 (인지적/기술적 이익) 단점 (인지적/기술적 부담)
34
+ 단일 에이전트 - 통합된 맥락으로 일관성 유지- 에이전트 간 조율 오버헤드 없음- 설계 단순하며 디버깅 용이- 비용 및 지연 최소화  - 하나의 에이전트가 모든 작업을 처리해야 함- 복잡한 문제에 대해 전문화 부족- 병렬 처리 이점 제한
35
+ 다중 에이전트 - 전문화된 역할로 복잡 작업 분담- 병렬 처리로 속도 향상 가능- 특정 에이전트는 심층 분석에 집중  - 상호 조율 복잡성 증가 - 맥락 공유 어려움으로 오류 위험 - 운영 비용 상승 (컨텍스트 재구성 등) 
36
+
37
+ 위 비교에서 보듯, 단일 에이전트 방식은 인지적 부담과 기술적 부담이 모두 낮으며 초기에는 안정적인 선택이다. 이후 시스템이 성숙해지고 명확한 필요성이 생길 때, 그때 설계 원칙을 엄격히 지킨 다중 에이전트 구조를 신중히 도입하면 된다. 결론적으로 설계 단계에서는, “일단 한 명으로 완벽하게 뛰게 하고, 필요하면 팀을 늘린다”는 원칙이 성공 확률을 높여준다.
38
+
39
+ (다음 단계: 설계 원칙을 정립했다면, 이제 이를 구현 단계에서 어떻게 실현할지 살펴보자. 단일 에이전트든 추후 다중 에이전트든 모듈화된 아키텍처로 구현하는 전략이 중요하다.)*
40
+
41
+ 어떻게 모듈화된 아키텍처를 구현할 것인가? (구현 단계)
42
+
43
+ 모듈화의 필요성: 모든 공학 분야에서 복잡한 시스템은 시간이 지남에 따라 모듈형 구성 요소들의 집합으로 진화해왔다 . 소프트웨어도 초기의 절차적 일체형 코드에서 벗어나, 오늘날에는 객체 지향과 API를 통해 잘 정의된 인터페이스를 가진 재사용 가능 컴포넌트들로 문제를 분할한다 . 이러한 모듈화는 변경이 발생해도 시스템 전체에 영향이 미치지 않도록 하여 유지보수성과 확장성을 높인다. AI 에이전트 시스템도 예외가 아니어서, 복잡도를 관리 가능하도록 쪼개는 설계가 필수적이다. LLM 중심의 초기 AI 시스템은 거대한 단일 모델에 의존했지만, 이는 신뢰성, 예측 가능성 면에서 한계를 드러냈다  . 반면 최근에는 모듈형 설계로 전환함으로써 높은 제어력과 품질을 확보하려는 움직임이 뚜렷하다 . 예컨대 OpenAI의 ChatGPT도 도구 플러그인, 외부 검색 등을 통합하며 다중 컴포넌트 구조로 발전하고 있다 .
44
+
45
+ 아키텍처 구성 요소: 구현 단계에서 우선적으로 할 일은 시스템을 논리적 구성 요소로 나누는 것이다. 일반적으로 AI 에이전트 시스템은 아래와 같은 계층적 구조를 갖는다  :
46
+ • 입출력 인터페이스: 에이전트가 다룰 입력 형식과 출력 형식을 모듈로 분리한다. 예를 들어 사용자 질의가 JSON이나 특정 도메인 언어로 주어질 경우 이를 처리/생성하는 별도 컴포넌트를 둔다.
47
+ • 데이터 기반 및 지식 저장소: 에이전트가 참고할 사실 데이터베이스나 벡터 검색 엔진 등을 구성한다. 이것이 시스템의 기저 정보를 제공하며, 모든 응답의 **사실적 근거(ground truth)**가 된다 .
48
+ • 결정론적 도구 모듈: 계산기, 데이터베이스 조회, API 호출 등 결과가 확정적인 기능들을 모듈화한다. 에이전트는 자연어로 지시를 내리고, 해당 모듈이 정해진 기능을 수행해 필요한 정보를 반환하도록 한다  . 이를 통해 LLM이 모든 것을 직접 처리하지 않고 룰 기반 컴포넌트와 협업할 수 있다.
49
+ • 일반 추론 엔진: 범용적인 상식과 언어 능력을 활용해 자연어 추론을 담당하는 핵심 LLM 모듈이다 . 이는 모듈화된 시스템의 두뇌 역할을 하며, 복잡한 요구를 계획하고 조정한다.
50
+ • 도메인 특화 추론 모듈 (선택): 필요한 경우 도메인 지식에 맞게 fine-tuning되었거나 프롬프트 체계가 특별히 설계된 전문 LLM을 별도로 둘 수 있다 . 예를 들어 의료 진단 에이전트라면 의료용 특화 모듈이 일반 LLM과 연동되어 더 정확한 전문 답변을 생성한다.
51
+ • 오케스트레이션(Orchestration) & 메모리 관리: 여러 모듈 간 흐름을 제어하는 오케스트레이션 로직을 구현한다. 각 단계의 입력/출력 연결, 작업 순서, 예외 처리 규칙 등을 명시적으로 코딩하여 결정론적 제어 흐름을 수립한다 . 또한 에이전트의 메모리(대화 이력, 중간 결과 저장 등)를 한 곳에서 관리하여, 정보가 흩어지지 않고 필요한 맥락이 유지되도록 한다.
52
+ • 평가 및 피드백 모듈: (이 부분은 흔히 간과되지만) 시스템의 성능을 측정하고 피드백을 주는 **평가 하네스(harness)**를 구축한다 . 예를 들어, 중요한 내부 단계마다 올바르게 진행되고 있는지 assertion이나 자체 검증(verify) 루틴을 넣거나, 최종 출력에 대해 미리 준비된 기준 질문-답변 쌍으로 정답률을 측정하는 모듈을 통합할 수 있다. 이 모듈은 개발 단계뿐만 아니라 운영 중에도 지속적인 품질 관리에 활용된다.
53
+
54
+ 위와 같이 역할별로 명확히 분리된 구성을 만들면 여러 가지 이점이 있다. 첫째, 개발 팀 내에서 각 모듈을 병렬로 개발하고 검증할 수 있어 인지 부담을 분산시킨다. 한 개발자가 시스템 전부를 머리에 담지 않고, 자신이 맡은 모듈의 로직에 집중하면 된다. 둘째, 문제가 발생했을 때 원인 모듈을 신속히 격리할 수 있어 디버깅이 수월하다. 예컨대 출력 오류가 지식 부족인지 추론 오류인지, 또는 도구 호출 실수인지 모듈별 로그를 통해 바로 파악할 수 있다. 셋째, 새로운 기능 추가나 모델 교체도 해당 모듈만 교체하면 되므로 확장성과 유지보수성이 극대화된다  . Databricks의 모듈형 에이전트 프레임워크 사례에서는, 이러한 모듈화된 접근이 신뢰성 향상, 유지관리 용이성, 확장성 제고로 이어져 기업 환경의 요구사항을 충족시켰다고 보고한다 . 마지막으로, 모듈 간 명확한 인터페이스 계약을 정의해 두면, 각 부분이 독립적으로 업그레이드되어도 시스템 전체의 인지적 일관성(consistency)을 해치지 않는다. 이는 운영자가 시스템을 이해하고 예측하는 데에도 도움이 된다.
55
+
56
+ 스킬 기반 단일 에이전트: 한편 최신 연구에서는 단일 에이전트 내부를 스킬(skill)이라는 모듈 단위로 분해하는 흥미로운 접근도 제시된다  . 여기서 스킬이란 특정 작업을 수행하는 내부 행동 모듈로, 일종의 에이전트 내부에 장착된 도구와 같다. 다중 에이전트 시스템의 전문 에이전트들을 한 에이전트의 스킬 라이브러리로 컴파일하여 협업 대신 내부 선택으로 대체할 수 있다는 개념이다 . 이러한 접근은 에이전트 간 대화 오버헤드를 제거하여 효율을 높이는 효과가 있다  . 실제 실험에서 스킬을 사용한 단일 에이전트는 복잡한 추론 작업에서 다중 에이전트 대비 토큰 사용량과 지연을 크게 줄이면서도 유사한 정확도를 보였다  . 이는 마치 사람이 여러 전문가 팀과 회의하느라 시간을 쓰기보다는, 머릿속에 여러 전문 **사고 도식(schemas)**을 익혀놓고 혼자 생각을 전환해가며 문제를 푸는 모습과 유사하다.
57
+
58
+ 다만 스킬 수가 지나치게 많아지면 새로운 문제가 발생한다. 인간도 한 번에 너무 많은 선택지가 있으면 결정 장애가 오듯이, LLM 에이전트도 내부 스킬이 과도하게 증가하면 선택 오류율이 급증하는 현상이 관찰되었다 . 연구에 따르면 스킬 라이브러리 크기가 일정 임계치를 넘어서면 성능 저하가 **완만한 감소가 아니라 급격한 전환 현상(phase transition)**처럼 나타난다  . 이는 인지과학의 작업기억 용량 한계와 유사한 양상으로, 한번에 너무 많은 정보를 처리하면 성능이 급격히 붕괴된다는 인지 부하 이론에 부합한다  . 이러한 발견은 계층적 구조의 중요성을 부각시킨다: 인간이 복잡한 정보를 카테고리로 묶어 체계를 세우듯, 스킬도 계층적으로 그룹화하면 선택 성능 저하를 완화할 수 있다는 것이다  . 따라서 구현 단계에서 만약 단일 에이전트 내 다수의 스킬을 설계한다면, 유사한 스킬들끼리는 범주화하고, 스킬 간 중복이나 과도한 유사성을 제거하여 **혼동(confusability)**을 줄이는 것이 중요하다 . 예를 들어 8±2 개 이하의 선택지로 메뉴를 계층화하는 것이 인간에게 최적이듯, 에이전트도 한 번에 그 정도 규모의 스킬만 고민하도록 트리 구조로 스킬을 배치할 수 있다.
59
+
60
+ 구현 요약 및 권고: 모듈화된 아키텍처 구현의 핵심은 “느슨하게 결합되고 강하게 응집된(loosely coupled, highly cohesive)” 컴포넌트들의 집합을 만드는 일이다. 각 모듈은 명확한 책임을 지니고, 공개된 인터페이스로만 소통하며, 내부 구현은 캡슐화한다. 이러한 시스템을 구축할 때 도움이 되는 체크리스트를 정리하면 다음과 같다:
61
+ • 문제 분해: 요구 기능을 분석하여 상호 작용은 최소화하면서 독립적인 모듈로 최대한 쪼갰는가?
62
+ • 인터페이스 정의: 모듈 간 주고받을 정보의 형식과 프로토콜을 명시적으로 설계했는가? (예: 함수 호출 시 입력/출력 JSON 스키마 정의)
63
+ • 오케스트레이션 구현: 에이전트의 흐름 제어 로직을 상태 기계 또는 그래프로 명확히 작성하여, 에이전트들이 예상 가능한 순서로 상호작용하게 했는가 ?
64
+ • 재사용성: 각 모듈은 다른 프로젝트에도 활용 가능하도록 일반화되어 있는가? 너무 구체적 의존성이 많다면 분리하거나 설정으로 관리하도록 수정.
65
+ • 확장 대비: 향후 새로운 도구나 모델을 추가할 경우 기존 모듈을 교체/확장하기 쉬운 구조인가? 모듈 추가 시 다른 부분에 영향이 없도록 설계했는가.
66
+ • 성능 모니터링 삽입: 중요한 모듈에는 로그 및 평가 포인트를 두어, 후에 성능을 계측하고 문제 발생 시 추적할 수 있도록 구현했는가.
67
+
68
+ 위 원칙을 준수하며 구현하면, 비로소 시스템의 뼈대가 갖춰지게 된다. 이제 다음으로 중요한 것은 이렇게 구현된 에이전트 시스템이 제대로 작동하는지 측정하고 개선하는 단계, 즉 평가 단계다.
69
+
70
+ AI 에이전트의 성능은 어떻게 평가해야 하는가? (평가 단계)
71
+
72
+ 평가의 중요성: AI 에이전트 시스템은 전통 소프트웨어와 달리 확률적 거동을 보이며, 작동 과정이 복잡하고 결과의 정합성을 판단하기 어렵다 . 그럼에도 기업의 의사결정자나 사용자를 설득하려면 체계적인 평가 지표와 성과 증거가 필요하다. 그러나 현재까지 표준화된 벤치마크나 평가 척도가 부족하다는 점이 큰 도전으로 지적된다 . 일반적인 LLM 성능 평가 지표(예: 정확도, 유창성 등)는 에이전트의 복합적 행동을 충분히 반영하지 못한다 . 에이전트는 단순 답변 생성 외에도 계획 수립, 도구 활용, 멀티모달 처리, 사용자 상호작용까지 수행하기 때문에, 다차원적인 평가 프레임워크가 필요하다 .
73
+
74
+ 다차원 평가 지표: 최신 연구와 업계 사례를 살펴보면, **다음과 같은 축(dimension)**에서 에이전트 성능을 측정할 것을 권장한다:
75
+ • 임무 성공률 (Task Success Rate): 에이전트가 주어진 목표를 달성했는가를 비율로 측정한다 . 예를 들어 “사용자 문의 처리” 에이전트라면, 사용자의 문제를 실제로 해결하거나 만족시킨 세션의 비율이 될 것이다. 이 지표는 최종 산출의 효과성을 나타내며, 정량적인 1차 지표로 중요하다.
76
+ • 맥락 적합성 & 대응 품질: 에이전트의 응답이 주어진 맥락이나 질의에 적절히 부합하는지를 평가한다. 예를 들어 대화형 에이전트라면 **대화 일관성(coherence)**과 맥락 유지 능력을 본다 . 또한 에이전트가 도구를 사용하는 과정이 논리적 순서에 맞는지, 불필요한 시도를 남발하지는 않았는지도 살핀다. 이는 과정상의 정확성을 보는 지표다.
77
+ • 적응성 (Adaptability): 환경 변화나 새로운 요청 유형에 유연하게 대응할 수 있는지 측정한다 . 예컨대 지원하지 않던 기능 요구에 대해 학습이나 개선 없이 얼마나 대응가능한지, 혹은 오류 발생 시 재시도 전략이나 fallback이 있는지 평가한다. **회복탄력성(resilience)**도 이 범주에 포함된다.
78
+ • 안전성과 윤리: 에이전트가 유해하거나 편향된(output toxicity/bias) 응답을 생성하지 않고, 주어진 안전 가이드라인을 준수하는지 모니터링한다 . 이는 정성적 평가일 수 있으나, 최근에는 욕설/차별 발화 비율, 금지 주제 언급 여부 등을 정량화하기도 한다. 안전성 평가는 기업 평판과 사용자 신뢰를 위해 필수적이다.
79
+ • 사용자 만족도: 최종 사용자(또는 도메인 전문가)의 주관적 만족도를 조사한다 . 이는 설문조사, 인터뷰 또는 UX 평가를 통해 질적으로 수집할 수 있다. 예를 들어 응답의 유용성, 인터페이스의 편의성, 전반적 신뢰감 등에 대한 점수를 받는다. 자동화된 성능 지표가 포착하지 못하는 미묘한 실용성을 이 피드백이 보완해준다 .
80
+ • 효율성과 비용: 시스템의 응답 지연(latency), 처리량(thROUGHPUT), 컴퓨팅 자원 비용 등을 계측한다 . 특히 실시간 서비스라면 지연이 사용자 경험에 큰 영향을 주므로 SLI/SLO로 관리하고, 클라우드 API 비용이나 인프라 비용 대비 성능 향상을 ROI 관점에서 분석한다.
81
+
82
+ 위 항목들을 종합하여 평가해야 AI 에이전트의 전반적 가치를 객관적으로 나타낼 수 있다. 각 조직은 중요도에 따라 가중치를 둘 수 있지만, 한두 가지 지표만으로는 편향된 평가가 될 수 있으므로 가능하면 정량+정성 지표의 균형 잡힌 평가체계를 구축해야 한다  .
83
+
84
+ 평가 방법론: 이러한 지표를 활용할 때 어떻게 데이터를 수집하고 평가를 진행할지 방법론도 중요하다:
85
+ • 시나리오 기반 테스트: 실제 사용 시나리오를 최대한 모사한 테스트 세트를 만든다. 예를 들어 고객지원 챗봇이라면 다양한 문의 유형을 망라한 시나리오, 그리고 각 시나리오별 기대 답변이나 성공 기준을 정의한다. 최근에는 시나리오를 시뮬레이션 환경으로 만들어 에이전트를 반복적으로 평가하는 접근도 제안된다 .
86
+ • 자동화된 스크립트 평가: 정형화된 과제에 대해서는 자동 채점 시스템을 구축한다. 질문-답변 쌍을 만들어 에이전트의 답변을 정답과 비교하거나, 수치 계산의 정확성을 검사하는 등이다 . 다만 LLM의 유연한 응답 표현 때문에 정확 매칭이 어려우므로 루브릭 기반 채점이나 임베딩 유사도 활용 등도 고려된다.
87
+ • 휴먼 평가 및 사용자 연구: 정량 지표로 포착 어려운 부분은 실제 **인간 평가자(human raters)**를 활용한다. 예컨대 대화의 자연스러움이나 창의성은 다수 평가자에게 **평점(예: 1~5점)**을 매기게 하여 평균을 내는 방식으로 평가한다 . 현업 도메인 전문가에게 시연하고 피드백을 받거나, 최종 사용자 A/B 테스트를 통해 한쪽 시스템이 다른 쪽보다 선호되는지 실험할 수도 있다.
88
+ • 내부 과정 평가 (프로세스 평가): **“Not Just the Output”**이라는 말처럼, 에이전트의 최종 출력만 볼 것이 아니라 중간 추론 과정도 평가해야 한다는 의견이 많다. 예를 들어 에이전트가 문제를 풀 때 적절한 계획을 수립했는지, 필요한 정보를 제때 검색했는지, 오류가 발생하면 재시도를 했는지 등을 로그 분석이나 리플레이를 통해 검증한다. 이러한 과정 평가는 성능 저하 원인을 규명하고 개선점을 찾는 데 필수적이다  .
89
+ • 벤치마크와 경진대회: 가능하면 공개된 벤치마크 세트나 평가 플랫폼을 활용하여 객관적으로 비교한다. 현재까지는 표준화가 부족하지만, 예컨대 멀티에이전트 상호작용에 특화된 데이터셋이나 시나리오를 여러 기관이 공유하여 공동 평가를 진행하는 추세가 있다 . 이를 통해 우리 시스템의 수준을 업계 평균 또는 최첨단과 비교할 수 있다.
90
+
91
+ 평가의 조기 통합: 중요한 점은, 평가를 사후에 생각하지 말고 초기부터 설계에 통합하라는 것이다. 앞서 구현 단계에서 언급했듯, 개발 초기에 이미 평가 기준과 절차를 정해 두면 이후 개선 사이클을 돌릴 때 일관된 척도로 효과를 측정할 수 있다  . 예를 들어 Databricks의 Mosaic AI 에이전트 프레임워크는 개발 초기부터 평가 시나리오와 기준을 정의하고 이를 자동 실행하여, 새로운 변경이 성능에 미치는 영향을 지속적으로 모니터링한다고 한다 . 이러한 DevOps적 평가 통합은 에이전트 시스템의 데이터 주도 발전을 가능케 한다.
92
+
93
+ 평가 단계 요약 - 체크리스트: 효과적인 평가를 위해 아래와 같은 체크리스트를 참고할 수 있다:
94
+ • 명확한 성공 기준 설정: 에이전트의 목표와 역할에 비춰 무엇이 성공인지 정의했는가? (예: 사용자 문제가 해결된 상태를 성공으로 정의)
95
+ • 다양한 지표 수집: 정량 지표(정확도, 성공률, 응답속도 등)와 정성 지표(만족도, 자연스러움 등)를 균형 있게 수집하고 있는가?
96
+ • 테스트 케이스 확보: 대표 사용 시나리오를 포괄하는 테스트 세트를 마련했고, 정기적으로 이에 대해 평가를 수행하는가?
97
+ • 로그와 트레이스 활용: 에이전트의 내부 추론 로그를 저장하고 분석하여, 겉으로 드러나지 않는 오류 징후나 개선 포인트를 찾고 있는가?
98
+ • 사용자 피드백 루프: 실제 사용자나 베타테스터로부터 피드백을 수렴하는 채널이 있는가? 이를 통해 발견된 문제를 업데이트에 반영하는 루프가 구축되어 있는가?
99
+ • 지속적 평가 자동화: 코드 변경이나 모델 업데이트 시 자동으로 평가를 돌려 성능 변화를 감지하는 CI(Continuous Integration) 파이프라인이 있는가?
100
+
101
+ 평가 단계를 이행함으로써, 우리는 AI 에이전트 시스템의 강약점을 객관적으로 파악하고 데이터 기반 개선을 실현할 수 있다. 이러한 평가 결과는 경영진과 이해관계자에게 성과를 설득력 있게 제시하는 근거가 되며, 외부 발표 시에도 신뢰도를 높여준다.
102
+
103
+ (다음 단계: 평가를 통해 시스템의 성능과 한계를 파악했다면, 마지막으로 이를 현업 운영 환경에서 어떻게 지속 관리하고 개선할지 살펴보자.)
104
+
105
+ 운영 단계에서 어떻게 지속적으로 개선하고 통제할 것인가? (운영 단계)
106
+
107
+ 운영의 과제: AI 에이전트 시스템을 성공적으로 설계·구현하여 배포했더라도, 운영 단계에서는 현실 환경에서 예상치 못한 문제가 발생할 수 있다. 모델 출력의 품질이 시간이 지나며 떨어지거나(예: 최신 정보 반영 부족), 사용자가 악의적으로 프롬프트를 넣어 부적절한 응답을 유도하려 할 수도 있다 . 또한 시스템이 정상 작동하더라도, 안전성이나 규제 준수 측면에서 모니터링이 필요하다. 운영자는 여러 에이전트 인스턴스가 실시간으로 돌아가는 상황에서 문제를 사전에 감지하고 빠르게 대응할 수 있어야 한다. 이를 위해서는 지속적 모니터링, 경보 체계, 모델 업데이트, 피드백 루프 등의 운영 전략이 요구된다.
108
+
109
+ 모니터링과 경보: 운영 환경에서 에이전트의 행동을 투명하게 추적하기 위해 종합 모니터링 시스템을 구축해야 한다. 예를 들어 Mosaic AI Gateway와 같은 솔루션은 에이전트 시스템에 대한 접근 제어, 레이트 리미팅, 페이로드 로깅, 입출력 필터링 등을 제공하여, 실행 중인 에이전트를 상시 모니터링하고 이상 징후를 포착할 수 있게 한다  . 이러한 게이트웨이는 특히 안전성, 편향, 품질 지표를 실시간으로 점검하여, 임계치를 벗어날 경우 운영자에게 경보를 보낸다 . 예컨대 응답에 금지된 단어가 검출되거나, 일정 시간 이상 답변 생성이 지연되면 자동 알람을 발생시켜 조치하게 한다. 대시보드를 통해 주요 성능 지표(성공률, 평균 응답시간, 사용자 만족도 등)의 추이를 시각화하고, 이상 값 발생 시 Drill-down하여 원인을 분석할 수 있어야 한다. 이러한 모니터링 시스템을 갖추면 운영자의 인지 부담을 줄여준다. 사람이 일일이 모든 대화를 검토하지 않더라도, 시스템이 요약된 정보와 문제 시그널을 제공하므로 의사결정에 집중할 수 있다.
110
+
111
+ 안전 및 보안 통제: 운영 중 가장 신경 써야 할 부분 중 하나는 **보안(Security)과 프라이버시, 윤리(Ethics)**다  . 에이전트가 외부와 상호작용하다 보면, 악의적인 시도로 **안전장치를 우회(jailbreak)**하려는 시도가 빈발한다 . 이를 막기 위해 다층 방어 전략을 도입해야 한다 . 첫째 레이어로는 **입력 필터링(guardrail)**이 있다. 예를 들어 사용자의 프롬프트를 분석해 금지된 요청이나 의도된 프롬프트 인젝션 공격 패턴이 감지되면 이를 차단하거나 변형하는 전처리 계층을 둔다 . OpenAI 등은 이미 이러한 시큐어 프롬프트 엔지니어링을 적용하고 있다. 둘째, 출력 필터링 및 검열이다. 에이전트의 최종 답변이 나가기 전 민감정보 노출이나 명확한 유해 발언이 없는지 후처리 필터를 거쳐 필요시 수정을 가한다 . 예컨대 개인정보가 포함되었으면 마스킹하거나, 공격적 언어를 순화하는 식이다. 셋째, 모델 자체의 강화이다. 사전에 유해 예시 데이터를 활용한 adversarial training을 통해 모델이 안전정책을 내재화하도록 하고 , 답변 생성 시 정책 준수 프로세스(예: 시스템 프롬프트로 가이드라인 제공)를 적용한다. 넷째, 프라이버시 보호를 위해 필요한 경우 차등_privacy 등의 기법을 활용해 모델이 학습 데이터의 개인 정보를 역추론하거나 유출하지 못하도록 한다 . 마지막으로, 감사 로그와 재현: 모든 상호작용을 안전하게 기록하여 사후에 문제가 발생하면 **감사(audit)**를 하고 개선에 활용한다. 금융, 의료 등 규제가 엄격한 분야에서는 이런 로그 관리와 재현 환경이 필수적이다.
112
+
113
+ 지속적 학습과 개선: 운영하면서 축적되는 데이터와 피드백은 귀중한 개선 자산이다. 이를 활용해 주기적인 모델 업데이트 또는 프롬프트 튜닝을 수행해야 한다. 예를 들어 사용자가 반복해서 질문하지만 에이전트가 대답하지 못하는 패턴이 발견되면, 해당 지식을 추가하거나 스킬을 확장하는 식으로 성능을 향상시킨다. 또한 평가 단계에서 구축한 지표 대시보드를 운영 중에도 활용하여, 시간 경과에 따른 성능 추이를 모니터링한다. 만약 성능 저하 추세가 보인다면 (예: 최신 정보 필요성 증가), 이에 맞춰 모델 재학습 또는 기존 모델 교체를 검토한다. A/B 테스트를 통해 새로운 모델이나 개선된 프롬프트 체계를 소규모 트래픽에 적용해보고 기존 버전과 비교하는 것도 안전한 개선 전략이다.
114
+
115
+ 운영 단계 체크리스트: 안정적인 운영과 지속적 개선을 위해 다음 사항들을 점검해볼 수 있다:
116
+ • 모니터링 대시보드 구비: 주요 성능, 품질, 안전 지표를 실시간으로 볼 수 있는 모니터링 시스템이 구축되어 있는가? 임계치 이상일 때 자동 알람이 오는가?
117
+ • 로그 및 추적 가능성: 모든 에이전트의 행동(질문, 답변, 도구 호출 등)이 적절히 로그로 남겨지고 보관되는가? 문제가 발생하면 해당 세션을 **재현(reproduce)**하여 분석할 수 있는가?
118
+ • 안전장치 적용: 입력 및 출력에 대해 멀티 레이어 필터링이 적용되어 있는가? (금지어 필터, 콘텐츠 모더레이션 등) 모델이 민감정보를 저장/출력하지 않도록 정책이 수립되고 구현되어 있는가?
119
+ • 보안 관리: API 키나 데이터베이스 자격증명 등 비밀정보 관리가 안전하게 되고 있는가? 외부 시스템 연동 시 권한 제어와 감사 로그가 확보되어 있는가?
120
+ • 모델 개선 사이클: 운영 중 얻은 데이터를 주기적으로 리뷰하고, 모델 재훈련이나 프롬프트 개선에 반영하는 주기적 업데이트 프로세스가 존재하는가? 그 결과를 다시 배포 전에 평가하여 검증하는 절차가 있는가?
121
+ • 인력 개입 계획: 에이전트가 처리하기 곤란한 상황(예: 규정상 사람 승인이 필요한 경우, 또는 에이전트 오류 시)에 사람 운영자가 개입할 수 있는 절차가 마련되어 있는가? 예를 들어 일정 확률로 답변 전에 인간 검토 단계 삽입, 실패 시 티켓화 등.
122
+
123
+ 위와 같은 운영 상의 관리가 이루어질 때, AI 에이전트 시스템은 초기 도입에서 그치지 않고 지속적으로 신뢰성과 성능을 향상시켜 나갈 수 있다. 이는 기술 리더십 관점에서 프로젝트의 장기 성공을 담보하고, 경영진에게는 안심하고 투자할 수 있는 근거를 제공한다. 또한 외부 발표나 고객 데모 시에도 “우리는 단지 모델을 출시한 게 아니라, 운영 단계까지 고려된 시스템을 갖추고 있다”는 메시지를 전달함으로써 전문성과 책임감을 강조할 수 있다.
124
+
125
+ 맺음말: 단계별 전략의 종합과 전망
126
+
127
+ AI 에이전트 시스템을 구축하고 활용하는 것은 한 번에 끝나는 프로젝트가 아니라 계속되는 여정에 가깝다. 본 보고서에서는 그 여정을 설계-구현-평가-운영의 4단계로 구분하고, 각 단계마다 전략적 질문을 던져가며 최적의 실행 방안을 모색했다:
128
+ • 설계 단계에서는, 복잡성을 제어하고 인지적 부담을 완화하기 위해 먼저 단일 에이전트의 단순 구조로 시작할 것을 권고했다. 이는 향후 확장의 토대가 되며, 초기 실패 위험을 줄인다.
129
+ • 구현 단계에서는, 모듈화된 아키텍처를 통해 시스템을 구성함으로써 유연성, 유지보수성, 신뢰성을 확보하는 방안을 제시했다. 명확히 정의된 모듈과 인터페이스는 개발과 이해를 용이하게 하고, 필요 시 계층적 설계와 스킬 라이브러리로 내부 복잡도를 관리할 수 있다.
130
+ • 평가 단계에서는, 다차원적인 지표와 종합적인 방법론을 활용해 에이전트의 성능을 면밀히 측정하는 전략을 다루었다. 이를 통해 얻은 정량/정성 데이터는 시스템 개선의 나침반이 되며, 이해관계자 설득의 근거 자료가 된다.
131
+ • 운영 단계에서는, 모니터링과 안전장치를 갖춘 지속적 관리로 실제 환경에서의 안정성을 담보하는 방법을 제안했다. 또한 지속적 학습을 통해 시간이 지날수록 지능과 성능이 향상되는 자기진화형 시스템으로 발전시킬 수 있음을 강조했다.
132
+
133
+ 이러한 단계별 전략들은 각각 독립적으로 중요할 뿐 아니라, 선순환 사이클로 연결될 때 최대의 효과를 낸다. 설계 원칙이 올바로 구현되고, 구현된 시스템이 엄밀히 평가되며, 평가 결과가 운영 개선에 활용되고, 운영 중 얻은 인사이트가 다시 설계 개선으로 이어지는 학습 루프를 구축하는 것이다. 이를 통해 AI 에이전트 시스템은 처음에 세운 목표를 뛰어넘어, 예측하지 못했던 새로운 기회와 가치를 창출할 수 있다.
134
+
135
+ 마지막으로, AI 에이전트 분야는 매우 빠르게 발전하고 있는 만큼 최신 연구 동향과 기술 도구에 지속적인 관심을 가져야 한다. 예를 들어 에이전트의 계획능력을 높이는 새로운 알고리즘, 멀티에이전트 협업을 돕는 프레임워크, 더 나은 평가를 위한 벤치마크 등이 속속 등장하고 있다. 이러한 지식을 유연한 전략 틀 안에 수용한다면, 우리의 AI 에이전트 시스템은 기술 리더십을 유지하면서도 안정적으로 성장해 나갈 것이다.
136
+
137
+ 참고문헌:
138
+ 1. Singh, Y. V. (2025). Not Just the Output: A Smarter Way to Evaluate AI Agent Systems. Medium. (데이터 사이언스 커뮤니티의 에이전트 도입 현황과 평가 필요성 논의) 
139
+ 2. Bhavsar, P. (2025). Why Multi-Agent Systems Fail. Galileo AI Blog. (다중 에이전트 시스템의 조율 비용 문제와 성공/실패 요인 분석)  
140
+ 3. Li, X. (2026). When Single-Agent with Skills Replace Multi-Agent Systems and When They Fail. arXiv:2601.04748. (단일 에이전트의 스킬 기반 모듈화와 인지적 한계에 대한 연구)  
141
+ 4. Rao, N., Zaharia, M., Wendell, P. (2024). AI Agent Systems: Modular Engineering for Reliable Enterprise AI Applications. Databricks Blog. (엔터프라이즈용 AI 에이전트의 모듈러 아키텍처와 평가/모니터링 전략)  
142
+ 5. Liang, G., & Tong, Q. (2025). LLM-Powered AI Agent Systems and Their Applications in Industry. Proceedings of IEEE ICMLA 2025 (또는 arXiv:2505.16120). (LLM 기반 에이전트 시스템의 산업 활용과 과제 - 평가 지표 부족, 보안 등 언급)  
@@ -62,6 +62,15 @@ npm run dev
62
62
 
63
63
  ---
64
64
 
65
+ ## 타입체크 (Pyright 비활성화)
66
+
67
+ EvalVault는 Ruff만 사용합니다. Pyright/Pylance 경고가 보이면 에디터 설정을 끄세요.
68
+
69
+ - VS Code: 확장(“Pylance”, “Pyright”) 비활성화 또는 제거
70
+ - VS Code 설정 예시: `"python.analysis.typeCheckingMode": "off"`
71
+
72
+ ---
73
+
65
74
  ## 문서 작업 규칙 (Docs)
66
75
 
67
76
  - `docs/`는 **현재 프로젝트에 필요한 문서만** 유지합니다. (중복/과거 정보는 삭제)
@@ -74,4 +83,4 @@ npm run dev
74
83
 
75
84
  - 설계/컴포넌트/운영 기준: `docs/new_whitepaper/INDEX.md`
76
85
  - CLI→MCP 이식 계획: `docs/guides/CLI_MCP_PLAN.md`
77
- - Open RAG Trace 스펙/샘플: `docs/architecture/open-rag-trace-spec.md`, `docs/guides/open-rag-trace-samples.md`
86
+ - Open RAG Trace 스펙/샘플: `docs/architecture/open-rag-trace-spec.md`, `docs/guides/OPEN_RAG_TRACE_SAMPLES.md`
@@ -819,8 +819,8 @@ OpenTelemetry + OpenInference 기반의 **Open RAG Trace 표준**을 따르세
819
819
  **관련 문서**
820
820
  - `docs/architecture/open-rag-trace-spec.md`
821
821
  - `docs/architecture/open-rag-trace-collector.md`
822
- - `docs/guides/open-rag-trace-internal-adapter.md`
823
- - `docs/guides/open-rag-trace-samples.md`
822
+ - `docs/guides/OPEN_RAG_TRACE_INTERNAL_ADAPTER.md`
823
+ - `docs/guides/OPEN_RAG_TRACE_SAMPLES.md`
824
824
 
825
825
  ### 임베딩 분석 & 내보내기
826
826
 
@@ -1201,7 +1201,7 @@ Langfuse에는 테스트 케이스별 스팬과 메트릭 점수가 기록되며
1201
1201
  - [new_whitepaper/INDEX.md](../new_whitepaper/INDEX.md) - 개발 백서(설계/운영/품질 기준)
1202
1202
  - [open-rag-trace-spec.md](../architecture/open-rag-trace-spec.md) - Open RAG Trace 표준
1203
1203
  - [open-rag-trace-collector.md](../architecture/open-rag-trace-collector.md) - Collector 구성 가이드
1204
- - [open-rag-trace-internal-adapter.md](open-rag-trace-internal-adapter.md) - 내부 시스템 계측
1204
+ - [OPEN_RAG_TRACE_INTERNAL_ADAPTER.md](OPEN_RAG_TRACE_INTERNAL_ADAPTER.md) - 내부 시스템 계측
1205
1205
  - [CHANGELOG.md](https://github.com/ntts9990/EvalVault/blob/main/CHANGELOG.md) - 변경 이력
1206
1206
 
1207
1207
  ### 외부 리소스
@@ -0,0 +1,218 @@
1
+ # RAG 인간 피드백 보정: 상세 구현 계획서
2
+
3
+ 본 문서는 `docs/guides/rag_human_feedback_calibration.md`의 설계를 기반으로 EvalVault에 **사람 만족도 보정(calibration) 기능**을 구현하기 위한 상세 실행 계획을 정리합니다.
4
+
5
+ ---
6
+
7
+ ## 1. 목표/성공 기준
8
+
9
+ ### 목표
10
+ - 대표 샘플 기반 인간 평가 수집 → 보정 모델 학습 → 전체 결과에 보정 점수 적용.
11
+ - RAGAS 점수와 사용자 만족도 괴리를 줄이고, 이해 가능한 보정 지표를 제공.
12
+
13
+ ### 성공 기준
14
+ - DB에 `satisfaction_feedback` 저장/조회 가능.
15
+ - Run 상세 응답에 `calibrated_satisfaction`, `imputed`, `imputation_source` 포함.
16
+ - CLI `evalvault calibrate` 실행 시 보정 모델 성능 요약 출력.
17
+ - Web UI에서 평가 입력/조회/보정 점수 표시.
18
+
19
+ ---
20
+
21
+ ## 2. 전제 및 스코프
22
+
23
+ ### 전제
24
+ - 문서에 제시된 정책을 기본값으로 채택:
25
+ - 만족도 라벨: 1~5
26
+ - Thumb 피드백: up/down/none (약한 레이블)
27
+ - 보정 점수: `calibrated_satisfaction`
28
+ - 결측치 보정 규칙: thumb → 매핑, 없으면 모델 예측
29
+
30
+ ### 스코프
31
+ - 백엔드: StoragePort, SQL 스키마, API, CLI, 도메인 서비스
32
+ - 프론트엔드: RunDetails UI에 만족도 평가 탭 + 보정 점수 표시
33
+ - 모델: 선형 회귀 + XGBoost 회귀(선형은 설명용)
34
+
35
+ ### 비스코프(초기)
36
+ - 실시간 온라인 학습, A/B 실험 자동 트리거
37
+ - 자동 평가자(LLM Judge) 연동
38
+
39
+ ---
40
+
41
+ ## 3. 아키텍처 개요
42
+
43
+ ### 데이터 플로우
44
+ 1) 대표 샘플 선정(클러스터링) → 2) 인간 평가 수집 → 3) 피처 생성 → 4) 모델 학습 → 5) 보정 점수 추정 → 6) UI 표시
45
+
46
+ ### 재사용 가능한 기존 컴포넌트
47
+ - 클러스터링: `src/evalvault/domain/services/cluster_map_builder.py`
48
+ - NLP 피처 패턴: `src/evalvault/adapters/outbound/analysis/nlp_adapter.py`
49
+ - Storage 어댑터 패턴: `src/evalvault/adapters/outbound/storage/*_adapter.py`
50
+
51
+ ---
52
+
53
+ ## 4. 데이터 모델/스키마 설계
54
+
55
+ ### 신규 테이블
56
+ `src/evalvault/adapters/outbound/storage/schema.sql`
57
+
58
+ `satisfaction_feedback`
59
+ - `id` (PK)
60
+ - `run_id`
61
+ - `test_case_id`
62
+ - `satisfaction_score` (1~5, nullable)
63
+ - `thumb_feedback` (`up`/`down`/`none`)
64
+ - `comment` (nullable)
65
+ - `rater_id` (nullable)
66
+ - `created_at`
67
+
68
+ ### 결과 확장
69
+ - 테스트 케이스 결과: `calibrated_satisfaction`, `imputed`, `imputation_source`
70
+ - run summary: `avg_satisfaction_score`, `thumb_up_rate`, `imputed_ratio`
71
+
72
+ ---
73
+
74
+ ## 5. StoragePort/Adapter 설계
75
+
76
+ ### StoragePort 확장
77
+ `src/evalvault/ports/outbound/storage_port.py`
78
+ - `save_feedback(...)`
79
+ - `list_feedback(run_id)`
80
+ - `get_feedback_summary(run_id)`
81
+
82
+ ### 어댑터 확장
83
+ - `src/evalvault/adapters/outbound/storage/sqlite_adapter.py`
84
+ - `src/evalvault/adapters/outbound/storage/postgres_adapter.py`
85
+
86
+ ### 마이그레이션
87
+ - 기존 DB에 `satisfaction_feedback` 테이블 추가
88
+ - 인덱스: `run_id`, `test_case_id`
89
+
90
+ ---
91
+
92
+ ## 6. API 설계 (FastAPI)
93
+
94
+ ### 라우터 확장
95
+ `src/evalvault/adapters/inbound/api/routers/runs.py`
96
+
97
+ - `POST /api/v1/runs/{run_id}/feedback`
98
+ - 요청: `test_case_id`, `satisfaction_score?`, `thumb_feedback?`, `comment?`, `rater_id?`
99
+
100
+ - `GET /api/v1/runs/{run_id}/feedback`
101
+ - 응답: 피드백 리스트
102
+
103
+ - `GET /api/v1/runs/{run_id}`
104
+ - summary에 `avg_satisfaction_score`, `thumb_up_rate`, `imputed_ratio` 포함
105
+ - results[].metrics에 `calibrated_satisfaction`, `imputed`, `imputation_source` 포함
106
+
107
+ ---
108
+
109
+ ## 7. CLI 설계
110
+
111
+ ### 명령
112
+ `src/evalvault/adapters/inbound/cli/commands/calibrate.py`
113
+
114
+ ```
115
+ evalvault calibrate --run-id <ID> [--model linear|xgb|both] [--write-back]
116
+ ```
117
+
118
+ ### 출력
119
+ - 모델 성능 요약: Pearson/Spearman, MAE
120
+ - 피처 중요도(가능 시)
121
+
122
+ ---
123
+
124
+ ## 8. Web UI 설계
125
+
126
+ `frontend/src/pages/RunDetails.tsx`
127
+
128
+ ### UI 기능
129
+ - 탭: `만족도 평가`
130
+ - 별점(1~5), thumb up/down, 코멘트 입력
131
+ - 테스트 케이스별 저장
132
+
133
+ ### 표시
134
+ - Summary 카드: 평균 만족도, Thumb Up 비율, 보정 비율
135
+ - 메트릭 표에 `calibrated_satisfaction` 컬럼 추가
136
+
137
+ ---
138
+
139
+ ## 9. 보정/결측치 처리 규칙
140
+
141
+ 1. `satisfaction_score` 있음 → 그대로 사용
142
+ 2. 없고 `thumb_feedback` 있음 → 약한 레이블 매핑
143
+ - `up = 4.0`, `down = 2.0`
144
+ 3. 둘 다 없으면 모델 예측값 사용
145
+ 4. 모든 점수는 1~5로 클리핑
146
+ 5. `imputed` 및 `imputation_source` 필드 표시
147
+
148
+ ---
149
+
150
+ ## 10. 모델/피처 설계
151
+
152
+ ### 피처
153
+ - RAGAS: `faithfulness`, `answer_relevancy`, `context_precision`, `context_recall`
154
+ - 한국어 피처:
155
+ - 답변 길이
156
+ - 질문 키워드 누락률
157
+ - 형태소 다양성(TTR)
158
+
159
+ ### 모델
160
+ - 기본: 선형회귀 (설명용)
161
+ - 출력: XGBoost 회귀 (예측 성능용)
162
+
163
+ ### 의존성
164
+ - `scikit-learn`은 이미 존재
165
+ - `xgboost`는 `pyproject.toml`의 optional dependencies에 추가 필요
166
+
167
+ ---
168
+
169
+ ## 11. 대표 샘플링 전략
170
+
171
+ ### 1차 버전
172
+ - `cluster_map_builder.py`의 KMeans + TF-IDF 임베딩 활용
173
+ - 클러스터 당 centroid 가까운 케이스 1개씩 선택
174
+
175
+ ### 확장 버전
176
+ - 불확실성 기반 샘플 추가 (예측값 2.4~2.6 등)
177
+
178
+ ---
179
+
180
+ ## 12. 테스트/검증 계획
181
+
182
+ ### 단위 테스트
183
+ - StoragePort: save/list 피드백 동작
184
+ - 보정 모델: 학습/예측 결과 shape 및 범위
185
+
186
+ ### 통합 테스트
187
+ - API 엔드포인트: 저장/조회 동작
188
+
189
+ ### 품질 지표
190
+ - 상관계수, MAE
191
+ - Inter-rater agreement(가능 시): Cohen/Fleiss Kappa
192
+
193
+ ---
194
+
195
+ ## 13. 단계별 일정(제안)
196
+
197
+ 1. **DB/Storage 레이어 확장**
198
+ 2. **도메인 서비스(모델/보정 로직) 구현**
199
+ 3. **API 확장**
200
+ 4. **CLI 구현**
201
+ 5. **UI 통합**
202
+ 6. **테스트 및 검증**
203
+
204
+ ---
205
+
206
+ ## 14. 리스크 및 대응
207
+
208
+ - **라벨 노이즈**: 평가 가이드 문서화 + 다중 평가자 평균
209
+ - **샘플 편향**: 대표 샘플링 + 운영 중 추가 샘플링
210
+ - **모델 과적합**: 단순 모델 우선, 교차검증
211
+
212
+ ---
213
+
214
+ ## 15. 참고 문서
215
+
216
+ - `docs/guides/rag_human_feedback_calibration.md`
217
+ - `src/evalvault/domain/services/cluster_map_builder.py`
218
+ - `src/evalvault/adapters/outbound/analysis/nlp_adapter.py`