aiecs 1.0.1__py3-none-any.whl → 1.7.17__py3-none-any.whl
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.
Potentially problematic release.
This version of aiecs might be problematic. Click here for more details.
- aiecs/__init__.py +13 -16
- aiecs/__main__.py +7 -7
- aiecs/aiecs_client.py +269 -75
- aiecs/application/executors/operation_executor.py +79 -54
- aiecs/application/knowledge_graph/__init__.py +7 -0
- aiecs/application/knowledge_graph/builder/__init__.py +37 -0
- aiecs/application/knowledge_graph/builder/data_quality.py +302 -0
- aiecs/application/knowledge_graph/builder/data_reshaping.py +293 -0
- aiecs/application/knowledge_graph/builder/document_builder.py +369 -0
- aiecs/application/knowledge_graph/builder/graph_builder.py +490 -0
- aiecs/application/knowledge_graph/builder/import_optimizer.py +396 -0
- aiecs/application/knowledge_graph/builder/schema_inference.py +462 -0
- aiecs/application/knowledge_graph/builder/schema_mapping.py +563 -0
- aiecs/application/knowledge_graph/builder/structured_pipeline.py +1384 -0
- aiecs/application/knowledge_graph/builder/text_chunker.py +317 -0
- aiecs/application/knowledge_graph/extractors/__init__.py +27 -0
- aiecs/application/knowledge_graph/extractors/base.py +98 -0
- aiecs/application/knowledge_graph/extractors/llm_entity_extractor.py +422 -0
- aiecs/application/knowledge_graph/extractors/llm_relation_extractor.py +347 -0
- aiecs/application/knowledge_graph/extractors/ner_entity_extractor.py +241 -0
- aiecs/application/knowledge_graph/fusion/__init__.py +78 -0
- aiecs/application/knowledge_graph/fusion/ab_testing.py +395 -0
- aiecs/application/knowledge_graph/fusion/abbreviation_expander.py +327 -0
- aiecs/application/knowledge_graph/fusion/alias_index.py +597 -0
- aiecs/application/knowledge_graph/fusion/alias_matcher.py +384 -0
- aiecs/application/knowledge_graph/fusion/cache_coordinator.py +343 -0
- aiecs/application/knowledge_graph/fusion/entity_deduplicator.py +433 -0
- aiecs/application/knowledge_graph/fusion/entity_linker.py +511 -0
- aiecs/application/knowledge_graph/fusion/evaluation_dataset.py +240 -0
- aiecs/application/knowledge_graph/fusion/knowledge_fusion.py +632 -0
- aiecs/application/knowledge_graph/fusion/matching_config.py +489 -0
- aiecs/application/knowledge_graph/fusion/name_normalizer.py +352 -0
- aiecs/application/knowledge_graph/fusion/relation_deduplicator.py +183 -0
- aiecs/application/knowledge_graph/fusion/semantic_name_matcher.py +464 -0
- aiecs/application/knowledge_graph/fusion/similarity_pipeline.py +534 -0
- aiecs/application/knowledge_graph/pattern_matching/__init__.py +21 -0
- aiecs/application/knowledge_graph/pattern_matching/pattern_matcher.py +342 -0
- aiecs/application/knowledge_graph/pattern_matching/query_executor.py +366 -0
- aiecs/application/knowledge_graph/profiling/__init__.py +12 -0
- aiecs/application/knowledge_graph/profiling/query_plan_visualizer.py +195 -0
- aiecs/application/knowledge_graph/profiling/query_profiler.py +223 -0
- aiecs/application/knowledge_graph/reasoning/__init__.py +27 -0
- aiecs/application/knowledge_graph/reasoning/evidence_synthesis.py +341 -0
- aiecs/application/knowledge_graph/reasoning/inference_engine.py +500 -0
- aiecs/application/knowledge_graph/reasoning/logic_form_parser.py +163 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/__init__.py +79 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/ast_builder.py +513 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/ast_nodes.py +913 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/ast_validator.py +866 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/error_handler.py +475 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/parser.py +396 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/query_context.py +208 -0
- aiecs/application/knowledge_graph/reasoning/logic_query_integration.py +170 -0
- aiecs/application/knowledge_graph/reasoning/query_planner.py +855 -0
- aiecs/application/knowledge_graph/reasoning/reasoning_engine.py +518 -0
- aiecs/application/knowledge_graph/retrieval/__init__.py +27 -0
- aiecs/application/knowledge_graph/retrieval/query_intent_classifier.py +211 -0
- aiecs/application/knowledge_graph/retrieval/retrieval_strategies.py +592 -0
- aiecs/application/knowledge_graph/retrieval/strategy_types.py +23 -0
- aiecs/application/knowledge_graph/search/__init__.py +59 -0
- aiecs/application/knowledge_graph/search/hybrid_search.py +457 -0
- aiecs/application/knowledge_graph/search/reranker.py +293 -0
- aiecs/application/knowledge_graph/search/reranker_strategies.py +535 -0
- aiecs/application/knowledge_graph/search/text_similarity.py +392 -0
- aiecs/application/knowledge_graph/traversal/__init__.py +15 -0
- aiecs/application/knowledge_graph/traversal/enhanced_traversal.py +305 -0
- aiecs/application/knowledge_graph/traversal/path_scorer.py +271 -0
- aiecs/application/knowledge_graph/validators/__init__.py +13 -0
- aiecs/application/knowledge_graph/validators/relation_validator.py +239 -0
- aiecs/application/knowledge_graph/visualization/__init__.py +11 -0
- aiecs/application/knowledge_graph/visualization/graph_visualizer.py +313 -0
- aiecs/common/__init__.py +9 -0
- aiecs/common/knowledge_graph/__init__.py +17 -0
- aiecs/common/knowledge_graph/runnable.py +471 -0
- aiecs/config/__init__.py +20 -5
- aiecs/config/config.py +762 -31
- aiecs/config/graph_config.py +131 -0
- aiecs/config/tool_config.py +435 -0
- aiecs/core/__init__.py +29 -13
- aiecs/core/interface/__init__.py +2 -2
- aiecs/core/interface/execution_interface.py +22 -22
- aiecs/core/interface/storage_interface.py +37 -88
- aiecs/core/registry/__init__.py +31 -0
- aiecs/core/registry/service_registry.py +92 -0
- aiecs/domain/__init__.py +270 -1
- aiecs/domain/agent/__init__.py +191 -0
- aiecs/domain/agent/base_agent.py +3949 -0
- aiecs/domain/agent/exceptions.py +99 -0
- aiecs/domain/agent/graph_aware_mixin.py +569 -0
- aiecs/domain/agent/hybrid_agent.py +1731 -0
- aiecs/domain/agent/integration/__init__.py +29 -0
- aiecs/domain/agent/integration/context_compressor.py +216 -0
- aiecs/domain/agent/integration/context_engine_adapter.py +587 -0
- aiecs/domain/agent/integration/protocols.py +281 -0
- aiecs/domain/agent/integration/retry_policy.py +218 -0
- aiecs/domain/agent/integration/role_config.py +213 -0
- aiecs/domain/agent/knowledge_aware_agent.py +1892 -0
- aiecs/domain/agent/lifecycle.py +291 -0
- aiecs/domain/agent/llm_agent.py +692 -0
- aiecs/domain/agent/memory/__init__.py +12 -0
- aiecs/domain/agent/memory/conversation.py +1124 -0
- aiecs/domain/agent/migration/__init__.py +14 -0
- aiecs/domain/agent/migration/conversion.py +163 -0
- aiecs/domain/agent/migration/legacy_wrapper.py +86 -0
- aiecs/domain/agent/models.py +894 -0
- aiecs/domain/agent/observability.py +479 -0
- aiecs/domain/agent/persistence.py +449 -0
- aiecs/domain/agent/prompts/__init__.py +29 -0
- aiecs/domain/agent/prompts/builder.py +159 -0
- aiecs/domain/agent/prompts/formatters.py +187 -0
- aiecs/domain/agent/prompts/template.py +255 -0
- aiecs/domain/agent/registry.py +253 -0
- aiecs/domain/agent/tool_agent.py +444 -0
- aiecs/domain/agent/tools/__init__.py +15 -0
- aiecs/domain/agent/tools/schema_generator.py +377 -0
- aiecs/domain/community/__init__.py +155 -0
- aiecs/domain/community/agent_adapter.py +469 -0
- aiecs/domain/community/analytics.py +432 -0
- aiecs/domain/community/collaborative_workflow.py +648 -0
- aiecs/domain/community/communication_hub.py +634 -0
- aiecs/domain/community/community_builder.py +320 -0
- aiecs/domain/community/community_integration.py +796 -0
- aiecs/domain/community/community_manager.py +803 -0
- aiecs/domain/community/decision_engine.py +849 -0
- aiecs/domain/community/exceptions.py +231 -0
- aiecs/domain/community/models/__init__.py +33 -0
- aiecs/domain/community/models/community_models.py +234 -0
- aiecs/domain/community/resource_manager.py +461 -0
- aiecs/domain/community/shared_context_manager.py +589 -0
- aiecs/domain/context/__init__.py +40 -10
- aiecs/domain/context/context_engine.py +1910 -0
- aiecs/domain/context/conversation_models.py +87 -53
- aiecs/domain/context/graph_memory.py +582 -0
- aiecs/domain/execution/model.py +12 -4
- aiecs/domain/knowledge_graph/__init__.py +19 -0
- aiecs/domain/knowledge_graph/models/__init__.py +52 -0
- aiecs/domain/knowledge_graph/models/entity.py +148 -0
- aiecs/domain/knowledge_graph/models/evidence.py +178 -0
- aiecs/domain/knowledge_graph/models/inference_rule.py +184 -0
- aiecs/domain/knowledge_graph/models/path.py +171 -0
- aiecs/domain/knowledge_graph/models/path_pattern.py +171 -0
- aiecs/domain/knowledge_graph/models/query.py +261 -0
- aiecs/domain/knowledge_graph/models/query_plan.py +181 -0
- aiecs/domain/knowledge_graph/models/relation.py +202 -0
- aiecs/domain/knowledge_graph/schema/__init__.py +23 -0
- aiecs/domain/knowledge_graph/schema/entity_type.py +131 -0
- aiecs/domain/knowledge_graph/schema/graph_schema.py +253 -0
- aiecs/domain/knowledge_graph/schema/property_schema.py +143 -0
- aiecs/domain/knowledge_graph/schema/relation_type.py +163 -0
- aiecs/domain/knowledge_graph/schema/schema_manager.py +691 -0
- aiecs/domain/knowledge_graph/schema/type_enums.py +209 -0
- aiecs/domain/task/dsl_processor.py +172 -56
- aiecs/domain/task/model.py +20 -8
- aiecs/domain/task/task_context.py +27 -24
- aiecs/infrastructure/__init__.py +0 -2
- aiecs/infrastructure/graph_storage/__init__.py +11 -0
- aiecs/infrastructure/graph_storage/base.py +837 -0
- aiecs/infrastructure/graph_storage/batch_operations.py +458 -0
- aiecs/infrastructure/graph_storage/cache.py +424 -0
- aiecs/infrastructure/graph_storage/distributed.py +223 -0
- aiecs/infrastructure/graph_storage/error_handling.py +380 -0
- aiecs/infrastructure/graph_storage/graceful_degradation.py +294 -0
- aiecs/infrastructure/graph_storage/health_checks.py +378 -0
- aiecs/infrastructure/graph_storage/in_memory.py +1197 -0
- aiecs/infrastructure/graph_storage/index_optimization.py +446 -0
- aiecs/infrastructure/graph_storage/lazy_loading.py +431 -0
- aiecs/infrastructure/graph_storage/metrics.py +344 -0
- aiecs/infrastructure/graph_storage/migration.py +400 -0
- aiecs/infrastructure/graph_storage/pagination.py +483 -0
- aiecs/infrastructure/graph_storage/performance_monitoring.py +456 -0
- aiecs/infrastructure/graph_storage/postgres.py +1563 -0
- aiecs/infrastructure/graph_storage/property_storage.py +353 -0
- aiecs/infrastructure/graph_storage/protocols.py +76 -0
- aiecs/infrastructure/graph_storage/query_optimizer.py +642 -0
- aiecs/infrastructure/graph_storage/schema_cache.py +290 -0
- aiecs/infrastructure/graph_storage/sqlite.py +1373 -0
- aiecs/infrastructure/graph_storage/streaming.py +487 -0
- aiecs/infrastructure/graph_storage/tenant.py +412 -0
- aiecs/infrastructure/messaging/celery_task_manager.py +92 -54
- aiecs/infrastructure/messaging/websocket_manager.py +51 -35
- aiecs/infrastructure/monitoring/__init__.py +22 -0
- aiecs/infrastructure/monitoring/executor_metrics.py +45 -11
- aiecs/infrastructure/monitoring/global_metrics_manager.py +212 -0
- aiecs/infrastructure/monitoring/structured_logger.py +3 -7
- aiecs/infrastructure/monitoring/tracing_manager.py +63 -35
- aiecs/infrastructure/persistence/__init__.py +14 -1
- aiecs/infrastructure/persistence/context_engine_client.py +184 -0
- aiecs/infrastructure/persistence/database_manager.py +67 -43
- aiecs/infrastructure/persistence/file_storage.py +180 -103
- aiecs/infrastructure/persistence/redis_client.py +74 -21
- aiecs/llm/__init__.py +73 -25
- aiecs/llm/callbacks/__init__.py +11 -0
- aiecs/llm/{custom_callbacks.py → callbacks/custom_callbacks.py} +26 -19
- aiecs/llm/client_factory.py +230 -37
- aiecs/llm/client_resolver.py +155 -0
- aiecs/llm/clients/__init__.py +38 -0
- aiecs/llm/clients/base_client.py +328 -0
- aiecs/llm/clients/google_function_calling_mixin.py +415 -0
- aiecs/llm/clients/googleai_client.py +314 -0
- aiecs/llm/clients/openai_client.py +158 -0
- aiecs/llm/clients/openai_compatible_mixin.py +367 -0
- aiecs/llm/clients/vertex_client.py +1186 -0
- aiecs/llm/clients/xai_client.py +201 -0
- aiecs/llm/config/__init__.py +51 -0
- aiecs/llm/config/config_loader.py +272 -0
- aiecs/llm/config/config_validator.py +206 -0
- aiecs/llm/config/model_config.py +143 -0
- aiecs/llm/protocols.py +149 -0
- aiecs/llm/utils/__init__.py +10 -0
- aiecs/llm/utils/validate_config.py +89 -0
- aiecs/main.py +140 -121
- aiecs/scripts/aid/VERSION_MANAGEMENT.md +138 -0
- aiecs/scripts/aid/__init__.py +19 -0
- aiecs/scripts/aid/module_checker.py +499 -0
- aiecs/scripts/aid/version_manager.py +235 -0
- aiecs/scripts/{DEPENDENCY_SYSTEM_SUMMARY.md → dependance_check/DEPENDENCY_SYSTEM_SUMMARY.md} +1 -0
- aiecs/scripts/{README_DEPENDENCY_CHECKER.md → dependance_check/README_DEPENDENCY_CHECKER.md} +1 -0
- aiecs/scripts/dependance_check/__init__.py +15 -0
- aiecs/scripts/dependance_check/dependency_checker.py +1835 -0
- aiecs/scripts/{dependency_fixer.py → dependance_check/dependency_fixer.py} +192 -90
- aiecs/scripts/{download_nlp_data.py → dependance_check/download_nlp_data.py} +203 -71
- aiecs/scripts/dependance_patch/__init__.py +7 -0
- aiecs/scripts/dependance_patch/fix_weasel/__init__.py +11 -0
- aiecs/scripts/{fix_weasel_validator.py → dependance_patch/fix_weasel/fix_weasel_validator.py} +21 -14
- aiecs/scripts/{patch_weasel_library.sh → dependance_patch/fix_weasel/patch_weasel_library.sh} +1 -1
- aiecs/scripts/knowledge_graph/__init__.py +3 -0
- aiecs/scripts/knowledge_graph/run_threshold_experiments.py +212 -0
- aiecs/scripts/migrations/multi_tenancy/README.md +142 -0
- aiecs/scripts/tools_develop/README.md +671 -0
- aiecs/scripts/tools_develop/README_CONFIG_CHECKER.md +273 -0
- aiecs/scripts/tools_develop/TOOLS_CONFIG_GUIDE.md +1287 -0
- aiecs/scripts/tools_develop/TOOL_AUTO_DISCOVERY.md +234 -0
- aiecs/scripts/tools_develop/__init__.py +21 -0
- aiecs/scripts/tools_develop/check_all_tools_config.py +548 -0
- aiecs/scripts/tools_develop/check_type_annotations.py +257 -0
- aiecs/scripts/tools_develop/pre-commit-schema-coverage.sh +66 -0
- aiecs/scripts/tools_develop/schema_coverage.py +511 -0
- aiecs/scripts/tools_develop/validate_tool_schemas.py +475 -0
- aiecs/scripts/tools_develop/verify_executor_config_fix.py +98 -0
- aiecs/scripts/tools_develop/verify_tools.py +352 -0
- aiecs/tasks/__init__.py +0 -1
- aiecs/tasks/worker.py +115 -47
- aiecs/tools/__init__.py +194 -72
- aiecs/tools/apisource/__init__.py +99 -0
- aiecs/tools/apisource/intelligence/__init__.py +19 -0
- aiecs/tools/apisource/intelligence/data_fusion.py +632 -0
- aiecs/tools/apisource/intelligence/query_analyzer.py +417 -0
- aiecs/tools/apisource/intelligence/search_enhancer.py +385 -0
- aiecs/tools/apisource/monitoring/__init__.py +9 -0
- aiecs/tools/apisource/monitoring/metrics.py +330 -0
- aiecs/tools/apisource/providers/__init__.py +112 -0
- aiecs/tools/apisource/providers/base.py +671 -0
- aiecs/tools/apisource/providers/census.py +397 -0
- aiecs/tools/apisource/providers/fred.py +535 -0
- aiecs/tools/apisource/providers/newsapi.py +409 -0
- aiecs/tools/apisource/providers/worldbank.py +352 -0
- aiecs/tools/apisource/reliability/__init__.py +12 -0
- aiecs/tools/apisource/reliability/error_handler.py +363 -0
- aiecs/tools/apisource/reliability/fallback_strategy.py +376 -0
- aiecs/tools/apisource/tool.py +832 -0
- aiecs/tools/apisource/utils/__init__.py +9 -0
- aiecs/tools/apisource/utils/validators.py +334 -0
- aiecs/tools/base_tool.py +415 -21
- aiecs/tools/docs/__init__.py +121 -0
- aiecs/tools/docs/ai_document_orchestrator.py +607 -0
- aiecs/tools/docs/ai_document_writer_orchestrator.py +2350 -0
- aiecs/tools/docs/content_insertion_tool.py +1320 -0
- aiecs/tools/docs/document_creator_tool.py +1464 -0
- aiecs/tools/docs/document_layout_tool.py +1160 -0
- aiecs/tools/docs/document_parser_tool.py +1016 -0
- aiecs/tools/docs/document_writer_tool.py +2008 -0
- aiecs/tools/knowledge_graph/__init__.py +17 -0
- aiecs/tools/knowledge_graph/graph_reasoning_tool.py +807 -0
- aiecs/tools/knowledge_graph/graph_search_tool.py +944 -0
- aiecs/tools/knowledge_graph/kg_builder_tool.py +524 -0
- aiecs/tools/langchain_adapter.py +300 -138
- aiecs/tools/schema_generator.py +455 -0
- aiecs/tools/search_tool/__init__.py +100 -0
- aiecs/tools/search_tool/analyzers.py +581 -0
- aiecs/tools/search_tool/cache.py +264 -0
- aiecs/tools/search_tool/constants.py +128 -0
- aiecs/tools/search_tool/context.py +224 -0
- aiecs/tools/search_tool/core.py +778 -0
- aiecs/tools/search_tool/deduplicator.py +119 -0
- aiecs/tools/search_tool/error_handler.py +242 -0
- aiecs/tools/search_tool/metrics.py +343 -0
- aiecs/tools/search_tool/rate_limiter.py +172 -0
- aiecs/tools/search_tool/schemas.py +275 -0
- aiecs/tools/statistics/__init__.py +80 -0
- aiecs/tools/statistics/ai_data_analysis_orchestrator.py +646 -0
- aiecs/tools/statistics/ai_insight_generator_tool.py +508 -0
- aiecs/tools/statistics/ai_report_orchestrator_tool.py +684 -0
- aiecs/tools/statistics/data_loader_tool.py +555 -0
- aiecs/tools/statistics/data_profiler_tool.py +638 -0
- aiecs/tools/statistics/data_transformer_tool.py +580 -0
- aiecs/tools/statistics/data_visualizer_tool.py +498 -0
- aiecs/tools/statistics/model_trainer_tool.py +507 -0
- aiecs/tools/statistics/statistical_analyzer_tool.py +472 -0
- aiecs/tools/task_tools/__init__.py +49 -36
- aiecs/tools/task_tools/chart_tool.py +200 -184
- aiecs/tools/task_tools/classfire_tool.py +268 -267
- aiecs/tools/task_tools/image_tool.py +220 -141
- aiecs/tools/task_tools/office_tool.py +226 -146
- aiecs/tools/task_tools/pandas_tool.py +477 -121
- aiecs/tools/task_tools/report_tool.py +390 -142
- aiecs/tools/task_tools/research_tool.py +149 -79
- aiecs/tools/task_tools/scraper_tool.py +339 -145
- aiecs/tools/task_tools/stats_tool.py +448 -209
- aiecs/tools/temp_file_manager.py +26 -24
- aiecs/tools/tool_executor/__init__.py +18 -16
- aiecs/tools/tool_executor/tool_executor.py +364 -52
- aiecs/utils/LLM_output_structor.py +74 -48
- aiecs/utils/__init__.py +14 -3
- aiecs/utils/base_callback.py +0 -3
- aiecs/utils/cache_provider.py +696 -0
- aiecs/utils/execution_utils.py +50 -31
- aiecs/utils/prompt_loader.py +1 -0
- aiecs/utils/token_usage_repository.py +37 -11
- aiecs/ws/socket_server.py +14 -4
- {aiecs-1.0.1.dist-info → aiecs-1.7.17.dist-info}/METADATA +52 -15
- aiecs-1.7.17.dist-info/RECORD +337 -0
- aiecs-1.7.17.dist-info/entry_points.txt +13 -0
- aiecs/config/registry.py +0 -19
- aiecs/domain/context/content_engine.py +0 -982
- aiecs/llm/base_client.py +0 -99
- aiecs/llm/openai_client.py +0 -125
- aiecs/llm/vertex_client.py +0 -186
- aiecs/llm/xai_client.py +0 -184
- aiecs/scripts/dependency_checker.py +0 -857
- aiecs/scripts/quick_dependency_check.py +0 -269
- aiecs/tools/task_tools/search_api.py +0 -7
- aiecs-1.0.1.dist-info/RECORD +0 -90
- aiecs-1.0.1.dist-info/entry_points.txt +0 -7
- /aiecs/scripts/{setup_nlp_data.sh → dependance_check/setup_nlp_data.sh} +0 -0
- /aiecs/scripts/{README_WEASEL_PATCH.md → dependance_patch/fix_weasel/README_WEASEL_PATCH.md} +0 -0
- /aiecs/scripts/{fix_weasel_validator.sh → dependance_patch/fix_weasel/fix_weasel_validator.sh} +0 -0
- /aiecs/scripts/{run_weasel_patch.sh → dependance_patch/fix_weasel/run_weasel_patch.sh} +0 -0
- {aiecs-1.0.1.dist-info → aiecs-1.7.17.dist-info}/WHEEL +0 -0
- {aiecs-1.0.1.dist-info → aiecs-1.7.17.dist-info}/licenses/LICENSE +0 -0
- {aiecs-1.0.1.dist-info → aiecs-1.7.17.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Result Reranking Framework
|
|
3
|
+
|
|
4
|
+
Pluggable reranking strategies for improving search result relevance.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from abc import ABC, abstractmethod
|
|
8
|
+
from typing import List, Dict, Optional, Tuple, Set
|
|
9
|
+
from enum import Enum
|
|
10
|
+
|
|
11
|
+
from aiecs.domain.knowledge_graph.models.entity import Entity
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ScoreCombinationMethod(str, Enum):
|
|
15
|
+
"""Methods for combining scores from multiple reranking strategies"""
|
|
16
|
+
|
|
17
|
+
WEIGHTED_AVERAGE = "weighted_average"
|
|
18
|
+
RRF = "rrf" # Reciprocal Rank Fusion
|
|
19
|
+
MAX = "max"
|
|
20
|
+
MIN = "min"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class RerankerStrategy(ABC):
|
|
24
|
+
"""
|
|
25
|
+
Abstract base class for reranking strategies
|
|
26
|
+
|
|
27
|
+
Each strategy computes a relevance score for entities given a query.
|
|
28
|
+
Strategies can be combined using different combination methods.
|
|
29
|
+
|
|
30
|
+
Example::
|
|
31
|
+
|
|
32
|
+
class TextSimilarityReranker(RerankerStrategy):
|
|
33
|
+
async def score(
|
|
34
|
+
self,
|
|
35
|
+
query: str,
|
|
36
|
+
entities: List[Entity]
|
|
37
|
+
) -> List[float]:
|
|
38
|
+
# Compute BM25 scores
|
|
39
|
+
return scores
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
@property
|
|
43
|
+
@abstractmethod
|
|
44
|
+
def name(self) -> str:
|
|
45
|
+
"""Strategy name for identification"""
|
|
46
|
+
|
|
47
|
+
@abstractmethod
|
|
48
|
+
async def score(self, query: str, entities: List[Entity], **kwargs) -> List[float]:
|
|
49
|
+
"""
|
|
50
|
+
Compute relevance scores for entities
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
query: Query text or context
|
|
54
|
+
entities: List of entities to score
|
|
55
|
+
**kwargs: Strategy-specific parameters
|
|
56
|
+
|
|
57
|
+
Returns:
|
|
58
|
+
List of scores (one per entity), same order as entities
|
|
59
|
+
Scores should be in range [0.0, 1.0] for best results
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def normalize_scores(scores: List[float], method: str = "min_max") -> List[float]:
|
|
64
|
+
"""
|
|
65
|
+
Normalize scores to [0.0, 1.0] range
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
scores: Raw scores to normalize
|
|
69
|
+
method: Normalization method ("min_max", "z_score", "softmax")
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
Normalized scores in [0.0, 1.0] range
|
|
73
|
+
"""
|
|
74
|
+
if not scores:
|
|
75
|
+
return []
|
|
76
|
+
|
|
77
|
+
if method == "min_max":
|
|
78
|
+
min_score = min(scores)
|
|
79
|
+
max_score = max(scores)
|
|
80
|
+
if max_score == min_score:
|
|
81
|
+
return [1.0] * len(scores)
|
|
82
|
+
return [(s - min_score) / (max_score - min_score) for s in scores]
|
|
83
|
+
|
|
84
|
+
elif method == "z_score":
|
|
85
|
+
import statistics
|
|
86
|
+
|
|
87
|
+
if len(scores) < 2:
|
|
88
|
+
return [1.0] * len(scores)
|
|
89
|
+
mean = statistics.mean(scores)
|
|
90
|
+
stdev = statistics.stdev(scores) if len(scores) > 1 else 1.0
|
|
91
|
+
if stdev == 0:
|
|
92
|
+
return [1.0] * len(scores)
|
|
93
|
+
# Normalize to [0, 1] using sigmoid
|
|
94
|
+
normalized = [(s - mean) / stdev for s in scores]
|
|
95
|
+
import math
|
|
96
|
+
|
|
97
|
+
return [1 / (1 + math.exp(-n)) for n in normalized]
|
|
98
|
+
|
|
99
|
+
elif method == "softmax":
|
|
100
|
+
import math
|
|
101
|
+
|
|
102
|
+
# Shift to avoid overflow
|
|
103
|
+
max_score = max(scores)
|
|
104
|
+
exp_scores = [math.exp(s - max_score) for s in scores]
|
|
105
|
+
sum_exp = sum(exp_scores)
|
|
106
|
+
if sum_exp == 0:
|
|
107
|
+
return [1.0 / len(scores)] * len(scores)
|
|
108
|
+
return [e / sum_exp for e in exp_scores]
|
|
109
|
+
|
|
110
|
+
else:
|
|
111
|
+
raise ValueError(f"Unknown normalization method: {method}")
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def combine_scores(
|
|
115
|
+
score_dicts: List[Dict[str, float]],
|
|
116
|
+
method: ScoreCombinationMethod = ScoreCombinationMethod.WEIGHTED_AVERAGE,
|
|
117
|
+
weights: Optional[Dict[str, float]] = None,
|
|
118
|
+
) -> Dict[str, float]:
|
|
119
|
+
"""
|
|
120
|
+
Combine scores from multiple strategies
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
score_dicts: List of {entity_id: score} dictionaries from each strategy
|
|
124
|
+
method: Combination method
|
|
125
|
+
weights: Optional weights for each strategy (for weighted_average)
|
|
126
|
+
|
|
127
|
+
Returns:
|
|
128
|
+
Combined scores as {entity_id: combined_score}
|
|
129
|
+
"""
|
|
130
|
+
if not score_dicts:
|
|
131
|
+
return {}
|
|
132
|
+
|
|
133
|
+
# Collect all entity IDs
|
|
134
|
+
all_entity_ids: Set[str] = set()
|
|
135
|
+
for score_dict in score_dicts:
|
|
136
|
+
all_entity_ids.update(score_dict.keys())
|
|
137
|
+
|
|
138
|
+
if method == ScoreCombinationMethod.WEIGHTED_AVERAGE:
|
|
139
|
+
if weights is None:
|
|
140
|
+
# Equal weights
|
|
141
|
+
weight = 1.0 / len(score_dicts)
|
|
142
|
+
weights = {f"strategy_{i}": weight for i in range(len(score_dicts))}
|
|
143
|
+
|
|
144
|
+
combined = {}
|
|
145
|
+
for entity_id in all_entity_ids:
|
|
146
|
+
weighted_sum = 0.0
|
|
147
|
+
total_weight = 0.0
|
|
148
|
+
for i, score_dict in enumerate(score_dicts):
|
|
149
|
+
strategy_name = f"strategy_{i}"
|
|
150
|
+
weight = weights.get(strategy_name, 1.0 / len(score_dicts))
|
|
151
|
+
score = score_dict.get(entity_id, 0.0)
|
|
152
|
+
weighted_sum += weight * score
|
|
153
|
+
total_weight += weight
|
|
154
|
+
combined[entity_id] = weighted_sum / total_weight if total_weight > 0 else 0.0
|
|
155
|
+
return combined
|
|
156
|
+
|
|
157
|
+
elif method == ScoreCombinationMethod.RRF:
|
|
158
|
+
# Reciprocal Rank Fusion
|
|
159
|
+
k = 60 # RRF constant
|
|
160
|
+
combined = {}
|
|
161
|
+
for entity_id in all_entity_ids:
|
|
162
|
+
rrf_score = 0.0
|
|
163
|
+
for score_dict in score_dicts:
|
|
164
|
+
if entity_id in score_dict:
|
|
165
|
+
# Get rank (1-indexed, higher score = lower rank)
|
|
166
|
+
scores = sorted(score_dict.values(), reverse=True)
|
|
167
|
+
rank = scores.index(score_dict[entity_id]) + 1
|
|
168
|
+
rrf_score += 1.0 / (k + rank)
|
|
169
|
+
combined[entity_id] = rrf_score
|
|
170
|
+
return combined
|
|
171
|
+
|
|
172
|
+
elif method == ScoreCombinationMethod.MAX:
|
|
173
|
+
combined = {}
|
|
174
|
+
for entity_id in all_entity_ids:
|
|
175
|
+
combined[entity_id] = max(score_dict.get(entity_id, 0.0) for score_dict in score_dicts)
|
|
176
|
+
return combined
|
|
177
|
+
|
|
178
|
+
elif method == ScoreCombinationMethod.MIN:
|
|
179
|
+
combined = {}
|
|
180
|
+
for entity_id in all_entity_ids:
|
|
181
|
+
combined[entity_id] = min(score_dict.get(entity_id, 1.0) for score_dict in score_dicts)
|
|
182
|
+
return combined
|
|
183
|
+
|
|
184
|
+
else:
|
|
185
|
+
raise ValueError(f"Unknown combination method: {method}")
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
class ResultReranker:
|
|
189
|
+
"""
|
|
190
|
+
Result Reranker orchestrator
|
|
191
|
+
|
|
192
|
+
Combines multiple reranking strategies to improve search result relevance.
|
|
193
|
+
|
|
194
|
+
Example::
|
|
195
|
+
|
|
196
|
+
# Create strategies
|
|
197
|
+
text_reranker = TextSimilarityReranker()
|
|
198
|
+
semantic_reranker = SemanticReranker()
|
|
199
|
+
|
|
200
|
+
# Create reranker
|
|
201
|
+
reranker = ResultReranker(
|
|
202
|
+
strategies=[text_reranker, semantic_reranker],
|
|
203
|
+
combination_method=ScoreCombinationMethod.WEIGHTED_AVERAGE,
|
|
204
|
+
weights={"text": 0.6, "semantic": 0.4}
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
# Rerank results
|
|
208
|
+
reranked = await reranker.rerank(
|
|
209
|
+
query="machine learning",
|
|
210
|
+
entities=search_results
|
|
211
|
+
)
|
|
212
|
+
"""
|
|
213
|
+
|
|
214
|
+
def __init__(
|
|
215
|
+
self,
|
|
216
|
+
strategies: List[RerankerStrategy],
|
|
217
|
+
combination_method: ScoreCombinationMethod = ScoreCombinationMethod.WEIGHTED_AVERAGE,
|
|
218
|
+
weights: Optional[Dict[str, float]] = None,
|
|
219
|
+
normalize_scores: bool = True,
|
|
220
|
+
normalization_method: str = "min_max",
|
|
221
|
+
):
|
|
222
|
+
"""
|
|
223
|
+
Initialize ResultReranker
|
|
224
|
+
|
|
225
|
+
Args:
|
|
226
|
+
strategies: List of reranking strategies
|
|
227
|
+
combination_method: Method for combining scores
|
|
228
|
+
weights: Optional weights for strategies (for weighted_average)
|
|
229
|
+
normalize_scores: Whether to normalize scores before combining
|
|
230
|
+
normalization_method: Normalization method ("min_max", "z_score", "softmax")
|
|
231
|
+
"""
|
|
232
|
+
if not strategies:
|
|
233
|
+
raise ValueError("At least one strategy is required")
|
|
234
|
+
|
|
235
|
+
self.strategies = strategies
|
|
236
|
+
self.combination_method = combination_method
|
|
237
|
+
self.weights = weights or {}
|
|
238
|
+
self.normalize_scores = normalize_scores
|
|
239
|
+
self.normalization_method = normalization_method
|
|
240
|
+
|
|
241
|
+
async def rerank(
|
|
242
|
+
self,
|
|
243
|
+
query: str,
|
|
244
|
+
entities: List[Entity],
|
|
245
|
+
top_k: Optional[int] = None,
|
|
246
|
+
**kwargs,
|
|
247
|
+
) -> List[Tuple[Entity, float]]:
|
|
248
|
+
"""
|
|
249
|
+
Rerank entities using all strategies
|
|
250
|
+
|
|
251
|
+
Args:
|
|
252
|
+
query: Query text or context
|
|
253
|
+
entities: List of entities to rerank
|
|
254
|
+
top_k: Optional limit on number of results
|
|
255
|
+
**kwargs: Additional parameters passed to strategies
|
|
256
|
+
|
|
257
|
+
Returns:
|
|
258
|
+
List of (entity, combined_score) tuples, sorted by score descending
|
|
259
|
+
"""
|
|
260
|
+
if not entities:
|
|
261
|
+
return []
|
|
262
|
+
|
|
263
|
+
# Get scores from each strategy
|
|
264
|
+
strategy_scores = []
|
|
265
|
+
for strategy in self.strategies:
|
|
266
|
+
scores = await strategy.score(query, entities, **kwargs)
|
|
267
|
+
|
|
268
|
+
# Normalize if requested
|
|
269
|
+
if self.normalize_scores:
|
|
270
|
+
scores = normalize_scores(scores, self.normalization_method)
|
|
271
|
+
|
|
272
|
+
# Convert to entity_id -> score dictionary
|
|
273
|
+
score_dict = {entity.id: score for entity, score in zip(entities, scores)}
|
|
274
|
+
strategy_scores.append(score_dict)
|
|
275
|
+
|
|
276
|
+
# Combine scores
|
|
277
|
+
combined_scores = combine_scores(
|
|
278
|
+
strategy_scores,
|
|
279
|
+
method=self.combination_method,
|
|
280
|
+
weights=self.weights,
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
# Create (entity, score) tuples
|
|
284
|
+
reranked = [(entity, combined_scores.get(entity.id, 0.0)) for entity in entities]
|
|
285
|
+
|
|
286
|
+
# Sort by score descending
|
|
287
|
+
reranked.sort(key=lambda x: x[1], reverse=True)
|
|
288
|
+
|
|
289
|
+
# Apply top_k limit
|
|
290
|
+
if top_k is not None:
|
|
291
|
+
reranked = reranked[:top_k]
|
|
292
|
+
|
|
293
|
+
return reranked
|