jarvis-ai-assistant 0.7.16__py3-none-any.whl → 1.0.2__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.
- jarvis/__init__.py +1 -1
- jarvis/jarvis_agent/__init__.py +567 -222
- jarvis/jarvis_agent/agent_manager.py +19 -12
- jarvis/jarvis_agent/builtin_input_handler.py +79 -11
- jarvis/jarvis_agent/config_editor.py +7 -2
- jarvis/jarvis_agent/event_bus.py +24 -13
- jarvis/jarvis_agent/events.py +19 -1
- jarvis/jarvis_agent/file_context_handler.py +67 -64
- jarvis/jarvis_agent/file_methodology_manager.py +38 -24
- jarvis/jarvis_agent/jarvis.py +186 -114
- jarvis/jarvis_agent/language_extractors/__init__.py +8 -1
- jarvis/jarvis_agent/language_extractors/c_extractor.py +7 -4
- jarvis/jarvis_agent/language_extractors/cpp_extractor.py +9 -4
- jarvis/jarvis_agent/language_extractors/go_extractor.py +7 -4
- jarvis/jarvis_agent/language_extractors/java_extractor.py +27 -20
- jarvis/jarvis_agent/language_extractors/javascript_extractor.py +22 -17
- jarvis/jarvis_agent/language_extractors/python_extractor.py +7 -4
- jarvis/jarvis_agent/language_extractors/rust_extractor.py +7 -4
- jarvis/jarvis_agent/language_extractors/typescript_extractor.py +22 -17
- jarvis/jarvis_agent/language_support_info.py +250 -219
- jarvis/jarvis_agent/main.py +19 -23
- jarvis/jarvis_agent/memory_manager.py +9 -6
- jarvis/jarvis_agent/methodology_share_manager.py +21 -15
- jarvis/jarvis_agent/output_handler.py +4 -2
- jarvis/jarvis_agent/prompt_builder.py +7 -6
- jarvis/jarvis_agent/prompt_manager.py +113 -8
- jarvis/jarvis_agent/prompts.py +317 -85
- jarvis/jarvis_agent/protocols.py +5 -2
- jarvis/jarvis_agent/run_loop.py +192 -32
- jarvis/jarvis_agent/session_manager.py +7 -3
- jarvis/jarvis_agent/share_manager.py +23 -13
- jarvis/jarvis_agent/shell_input_handler.py +12 -8
- jarvis/jarvis_agent/stdio_redirect.py +25 -26
- jarvis/jarvis_agent/task_analyzer.py +29 -23
- jarvis/jarvis_agent/task_list.py +869 -0
- jarvis/jarvis_agent/task_manager.py +26 -23
- jarvis/jarvis_agent/tool_executor.py +6 -5
- jarvis/jarvis_agent/tool_share_manager.py +24 -14
- jarvis/jarvis_agent/user_interaction.py +3 -3
- jarvis/jarvis_agent/utils.py +9 -1
- jarvis/jarvis_agent/web_bridge.py +37 -17
- jarvis/jarvis_agent/web_output_sink.py +5 -2
- jarvis/jarvis_agent/web_server.py +165 -36
- jarvis/jarvis_c2rust/__init__.py +1 -1
- jarvis/jarvis_c2rust/cli.py +260 -141
- jarvis/jarvis_c2rust/collector.py +37 -18
- jarvis/jarvis_c2rust/constants.py +60 -0
- jarvis/jarvis_c2rust/library_replacer.py +242 -1010
- jarvis/jarvis_c2rust/library_replacer_checkpoint.py +133 -0
- jarvis/jarvis_c2rust/library_replacer_llm.py +287 -0
- jarvis/jarvis_c2rust/library_replacer_loader.py +191 -0
- jarvis/jarvis_c2rust/library_replacer_output.py +134 -0
- jarvis/jarvis_c2rust/library_replacer_prompts.py +124 -0
- jarvis/jarvis_c2rust/library_replacer_utils.py +188 -0
- jarvis/jarvis_c2rust/llm_module_agent.py +98 -1044
- jarvis/jarvis_c2rust/llm_module_agent_apply.py +170 -0
- jarvis/jarvis_c2rust/llm_module_agent_executor.py +288 -0
- jarvis/jarvis_c2rust/llm_module_agent_loader.py +170 -0
- jarvis/jarvis_c2rust/llm_module_agent_prompts.py +268 -0
- jarvis/jarvis_c2rust/llm_module_agent_types.py +57 -0
- jarvis/jarvis_c2rust/llm_module_agent_utils.py +150 -0
- jarvis/jarvis_c2rust/llm_module_agent_validator.py +119 -0
- jarvis/jarvis_c2rust/loaders.py +28 -10
- jarvis/jarvis_c2rust/models.py +5 -2
- jarvis/jarvis_c2rust/optimizer.py +192 -1974
- jarvis/jarvis_c2rust/optimizer_build_fix.py +286 -0
- jarvis/jarvis_c2rust/optimizer_clippy.py +766 -0
- jarvis/jarvis_c2rust/optimizer_config.py +49 -0
- jarvis/jarvis_c2rust/optimizer_docs.py +183 -0
- jarvis/jarvis_c2rust/optimizer_options.py +48 -0
- jarvis/jarvis_c2rust/optimizer_progress.py +469 -0
- jarvis/jarvis_c2rust/optimizer_report.py +52 -0
- jarvis/jarvis_c2rust/optimizer_unsafe.py +309 -0
- jarvis/jarvis_c2rust/optimizer_utils.py +469 -0
- jarvis/jarvis_c2rust/optimizer_visibility.py +185 -0
- jarvis/jarvis_c2rust/scanner.py +229 -166
- jarvis/jarvis_c2rust/transpiler.py +531 -2732
- jarvis/jarvis_c2rust/transpiler_agents.py +503 -0
- jarvis/jarvis_c2rust/transpiler_build.py +1294 -0
- jarvis/jarvis_c2rust/transpiler_codegen.py +204 -0
- jarvis/jarvis_c2rust/transpiler_compile.py +146 -0
- jarvis/jarvis_c2rust/transpiler_config.py +178 -0
- jarvis/jarvis_c2rust/transpiler_context.py +122 -0
- jarvis/jarvis_c2rust/transpiler_executor.py +516 -0
- jarvis/jarvis_c2rust/transpiler_generation.py +278 -0
- jarvis/jarvis_c2rust/transpiler_git.py +163 -0
- jarvis/jarvis_c2rust/transpiler_mod_utils.py +225 -0
- jarvis/jarvis_c2rust/transpiler_modules.py +336 -0
- jarvis/jarvis_c2rust/transpiler_planning.py +394 -0
- jarvis/jarvis_c2rust/transpiler_review.py +1196 -0
- jarvis/jarvis_c2rust/transpiler_symbols.py +176 -0
- jarvis/jarvis_c2rust/utils.py +269 -79
- jarvis/jarvis_code_agent/after_change.py +233 -0
- jarvis/jarvis_code_agent/build_validation_config.py +37 -30
- jarvis/jarvis_code_agent/builtin_rules.py +68 -0
- jarvis/jarvis_code_agent/code_agent.py +976 -1517
- jarvis/jarvis_code_agent/code_agent_build.py +227 -0
- jarvis/jarvis_code_agent/code_agent_diff.py +246 -0
- jarvis/jarvis_code_agent/code_agent_git.py +525 -0
- jarvis/jarvis_code_agent/code_agent_impact.py +177 -0
- jarvis/jarvis_code_agent/code_agent_lint.py +283 -0
- jarvis/jarvis_code_agent/code_agent_llm.py +159 -0
- jarvis/jarvis_code_agent/code_agent_postprocess.py +105 -0
- jarvis/jarvis_code_agent/code_agent_prompts.py +46 -0
- jarvis/jarvis_code_agent/code_agent_rules.py +305 -0
- jarvis/jarvis_code_agent/code_analyzer/__init__.py +52 -48
- jarvis/jarvis_code_agent/code_analyzer/base_language.py +12 -10
- jarvis/jarvis_code_agent/code_analyzer/build_validator/__init__.py +12 -11
- jarvis/jarvis_code_agent/code_analyzer/build_validator/base.py +16 -12
- jarvis/jarvis_code_agent/code_analyzer/build_validator/cmake.py +26 -17
- jarvis/jarvis_code_agent/code_analyzer/build_validator/detector.py +558 -104
- jarvis/jarvis_code_agent/code_analyzer/build_validator/fallback.py +27 -16
- jarvis/jarvis_code_agent/code_analyzer/build_validator/go.py +22 -18
- jarvis/jarvis_code_agent/code_analyzer/build_validator/java_gradle.py +21 -16
- jarvis/jarvis_code_agent/code_analyzer/build_validator/java_maven.py +20 -16
- jarvis/jarvis_code_agent/code_analyzer/build_validator/makefile.py +27 -16
- jarvis/jarvis_code_agent/code_analyzer/build_validator/nodejs.py +47 -23
- jarvis/jarvis_code_agent/code_analyzer/build_validator/python.py +71 -37
- jarvis/jarvis_code_agent/code_analyzer/build_validator/rust.py +162 -35
- jarvis/jarvis_code_agent/code_analyzer/build_validator/validator.py +111 -57
- jarvis/jarvis_code_agent/code_analyzer/build_validator.py +18 -12
- jarvis/jarvis_code_agent/code_analyzer/context_manager.py +185 -183
- jarvis/jarvis_code_agent/code_analyzer/context_recommender.py +2 -1
- jarvis/jarvis_code_agent/code_analyzer/dependency_analyzer.py +24 -15
- jarvis/jarvis_code_agent/code_analyzer/file_ignore.py +227 -141
- jarvis/jarvis_code_agent/code_analyzer/impact_analyzer.py +321 -247
- jarvis/jarvis_code_agent/code_analyzer/language_registry.py +37 -29
- jarvis/jarvis_code_agent/code_analyzer/language_support.py +21 -13
- jarvis/jarvis_code_agent/code_analyzer/languages/__init__.py +15 -9
- jarvis/jarvis_code_agent/code_analyzer/languages/c_cpp_language.py +75 -45
- jarvis/jarvis_code_agent/code_analyzer/languages/go_language.py +87 -52
- jarvis/jarvis_code_agent/code_analyzer/languages/java_language.py +84 -51
- jarvis/jarvis_code_agent/code_analyzer/languages/javascript_language.py +94 -64
- jarvis/jarvis_code_agent/code_analyzer/languages/python_language.py +109 -71
- jarvis/jarvis_code_agent/code_analyzer/languages/rust_language.py +97 -63
- jarvis/jarvis_code_agent/code_analyzer/languages/typescript_language.py +103 -69
- jarvis/jarvis_code_agent/code_analyzer/llm_context_recommender.py +271 -268
- jarvis/jarvis_code_agent/code_analyzer/symbol_extractor.py +76 -64
- jarvis/jarvis_code_agent/code_analyzer/tree_sitter_extractor.py +92 -19
- jarvis/jarvis_code_agent/diff_visualizer.py +998 -0
- jarvis/jarvis_code_agent/lint.py +223 -524
- jarvis/jarvis_code_agent/rule_share_manager.py +158 -0
- jarvis/jarvis_code_agent/rules/clean_code.md +144 -0
- jarvis/jarvis_code_agent/rules/code_review.md +115 -0
- jarvis/jarvis_code_agent/rules/documentation.md +165 -0
- jarvis/jarvis_code_agent/rules/generate_rules.md +52 -0
- jarvis/jarvis_code_agent/rules/performance.md +158 -0
- jarvis/jarvis_code_agent/rules/refactoring.md +139 -0
- jarvis/jarvis_code_agent/rules/security.md +160 -0
- jarvis/jarvis_code_agent/rules/tdd.md +78 -0
- jarvis/jarvis_code_agent/test_rules/cpp_test.md +118 -0
- jarvis/jarvis_code_agent/test_rules/go_test.md +98 -0
- jarvis/jarvis_code_agent/test_rules/java_test.md +99 -0
- jarvis/jarvis_code_agent/test_rules/javascript_test.md +113 -0
- jarvis/jarvis_code_agent/test_rules/php_test.md +117 -0
- jarvis/jarvis_code_agent/test_rules/python_test.md +91 -0
- jarvis/jarvis_code_agent/test_rules/ruby_test.md +102 -0
- jarvis/jarvis_code_agent/test_rules/rust_test.md +86 -0
- jarvis/jarvis_code_agent/utils.py +36 -26
- jarvis/jarvis_code_analysis/checklists/loader.py +21 -21
- jarvis/jarvis_code_analysis/code_review.py +64 -33
- jarvis/jarvis_data/config_schema.json +285 -192
- jarvis/jarvis_git_squash/main.py +8 -6
- jarvis/jarvis_git_utils/git_commiter.py +53 -76
- jarvis/jarvis_mcp/__init__.py +5 -2
- jarvis/jarvis_mcp/sse_mcp_client.py +40 -30
- jarvis/jarvis_mcp/stdio_mcp_client.py +27 -19
- jarvis/jarvis_mcp/streamable_mcp_client.py +35 -26
- jarvis/jarvis_memory_organizer/memory_organizer.py +78 -55
- jarvis/jarvis_methodology/main.py +48 -39
- jarvis/jarvis_multi_agent/__init__.py +56 -23
- jarvis/jarvis_multi_agent/main.py +15 -18
- jarvis/jarvis_platform/base.py +179 -111
- jarvis/jarvis_platform/human.py +27 -16
- jarvis/jarvis_platform/kimi.py +52 -45
- jarvis/jarvis_platform/openai.py +101 -40
- jarvis/jarvis_platform/registry.py +51 -33
- jarvis/jarvis_platform/tongyi.py +68 -38
- jarvis/jarvis_platform/yuanbao.py +59 -43
- jarvis/jarvis_platform_manager/main.py +68 -76
- jarvis/jarvis_platform_manager/service.py +24 -14
- jarvis/jarvis_rag/README_CONFIG.md +314 -0
- jarvis/jarvis_rag/README_DYNAMIC_LOADING.md +311 -0
- jarvis/jarvis_rag/README_ONLINE_MODELS.md +230 -0
- jarvis/jarvis_rag/__init__.py +57 -4
- jarvis/jarvis_rag/cache.py +3 -1
- jarvis/jarvis_rag/cli.py +48 -68
- jarvis/jarvis_rag/embedding_interface.py +39 -0
- jarvis/jarvis_rag/embedding_manager.py +7 -230
- jarvis/jarvis_rag/embeddings/__init__.py +41 -0
- jarvis/jarvis_rag/embeddings/base.py +114 -0
- jarvis/jarvis_rag/embeddings/cohere.py +66 -0
- jarvis/jarvis_rag/embeddings/edgefn.py +117 -0
- jarvis/jarvis_rag/embeddings/local.py +260 -0
- jarvis/jarvis_rag/embeddings/openai.py +62 -0
- jarvis/jarvis_rag/embeddings/registry.py +293 -0
- jarvis/jarvis_rag/llm_interface.py +8 -6
- jarvis/jarvis_rag/query_rewriter.py +8 -9
- jarvis/jarvis_rag/rag_pipeline.py +61 -52
- jarvis/jarvis_rag/reranker.py +7 -75
- jarvis/jarvis_rag/reranker_interface.py +32 -0
- jarvis/jarvis_rag/rerankers/__init__.py +41 -0
- jarvis/jarvis_rag/rerankers/base.py +109 -0
- jarvis/jarvis_rag/rerankers/cohere.py +67 -0
- jarvis/jarvis_rag/rerankers/edgefn.py +140 -0
- jarvis/jarvis_rag/rerankers/jina.py +79 -0
- jarvis/jarvis_rag/rerankers/local.py +89 -0
- jarvis/jarvis_rag/rerankers/registry.py +293 -0
- jarvis/jarvis_rag/retriever.py +58 -43
- jarvis/jarvis_sec/__init__.py +66 -141
- jarvis/jarvis_sec/agents.py +21 -17
- jarvis/jarvis_sec/analysis.py +80 -33
- jarvis/jarvis_sec/checkers/__init__.py +7 -13
- jarvis/jarvis_sec/checkers/c_checker.py +356 -164
- jarvis/jarvis_sec/checkers/rust_checker.py +47 -29
- jarvis/jarvis_sec/cli.py +43 -21
- jarvis/jarvis_sec/clustering.py +430 -272
- jarvis/jarvis_sec/file_manager.py +99 -55
- jarvis/jarvis_sec/parsers.py +9 -6
- jarvis/jarvis_sec/prompts.py +4 -3
- jarvis/jarvis_sec/report.py +44 -22
- jarvis/jarvis_sec/review.py +180 -107
- jarvis/jarvis_sec/status.py +50 -41
- jarvis/jarvis_sec/types.py +3 -0
- jarvis/jarvis_sec/utils.py +160 -83
- jarvis/jarvis_sec/verification.py +411 -181
- jarvis/jarvis_sec/workflow.py +132 -21
- jarvis/jarvis_smart_shell/main.py +28 -41
- jarvis/jarvis_stats/cli.py +14 -12
- jarvis/jarvis_stats/stats.py +28 -19
- jarvis/jarvis_stats/storage.py +14 -8
- jarvis/jarvis_stats/visualizer.py +12 -7
- jarvis/jarvis_tools/base.py +5 -2
- jarvis/jarvis_tools/clear_memory.py +13 -9
- jarvis/jarvis_tools/cli/main.py +23 -18
- jarvis/jarvis_tools/edit_file.py +572 -873
- jarvis/jarvis_tools/execute_script.py +10 -7
- jarvis/jarvis_tools/file_analyzer.py +7 -8
- jarvis/jarvis_tools/meta_agent.py +287 -0
- jarvis/jarvis_tools/methodology.py +5 -3
- jarvis/jarvis_tools/read_code.py +305 -1438
- jarvis/jarvis_tools/read_symbols.py +50 -17
- jarvis/jarvis_tools/read_webpage.py +19 -18
- jarvis/jarvis_tools/registry.py +435 -156
- jarvis/jarvis_tools/retrieve_memory.py +16 -11
- jarvis/jarvis_tools/save_memory.py +8 -6
- jarvis/jarvis_tools/search_web.py +31 -31
- jarvis/jarvis_tools/sub_agent.py +32 -28
- jarvis/jarvis_tools/sub_code_agent.py +44 -60
- jarvis/jarvis_tools/task_list_manager.py +1811 -0
- jarvis/jarvis_tools/virtual_tty.py +29 -19
- jarvis/jarvis_utils/__init__.py +4 -0
- jarvis/jarvis_utils/builtin_replace_map.py +2 -1
- jarvis/jarvis_utils/clipboard.py +9 -8
- jarvis/jarvis_utils/collections.py +331 -0
- jarvis/jarvis_utils/config.py +699 -194
- jarvis/jarvis_utils/dialogue_recorder.py +294 -0
- jarvis/jarvis_utils/embedding.py +6 -3
- jarvis/jarvis_utils/file_processors.py +7 -1
- jarvis/jarvis_utils/fzf.py +9 -3
- jarvis/jarvis_utils/git_utils.py +71 -42
- jarvis/jarvis_utils/globals.py +116 -32
- jarvis/jarvis_utils/http.py +6 -2
- jarvis/jarvis_utils/input.py +318 -83
- jarvis/jarvis_utils/jsonnet_compat.py +119 -104
- jarvis/jarvis_utils/methodology.py +37 -28
- jarvis/jarvis_utils/output.py +201 -44
- jarvis/jarvis_utils/utils.py +986 -628
- {jarvis_ai_assistant-0.7.16.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/METADATA +49 -33
- jarvis_ai_assistant-1.0.2.dist-info/RECORD +304 -0
- jarvis/jarvis_code_agent/code_analyzer/structured_code.py +0 -556
- jarvis/jarvis_tools/generate_new_tool.py +0 -205
- jarvis/jarvis_tools/lsp_client.py +0 -1552
- jarvis/jarvis_tools/rewrite_file.py +0 -105
- jarvis_ai_assistant-0.7.16.dist-info/RECORD +0 -218
- {jarvis_ai_assistant-0.7.16.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/WHEEL +0 -0
- {jarvis_ai_assistant-0.7.16.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/entry_points.txt +0 -0
- {jarvis_ai_assistant-0.7.16.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/licenses/LICENSE +0 -0
- {jarvis_ai_assistant-0.7.16.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
# RAG 配置指南
|
|
2
|
+
|
|
3
|
+
本文档介绍如何配置 RAG 系统的嵌入模型和重排模型。
|
|
4
|
+
|
|
5
|
+
## 配置方式
|
|
6
|
+
|
|
7
|
+
RAG 配置通过 `rag` 环境变量或 `GLOBAL_CONFIG_DATA` 中的 `rag` 键进行设置。
|
|
8
|
+
|
|
9
|
+
## 配置结构
|
|
10
|
+
|
|
11
|
+
### 基本配置
|
|
12
|
+
|
|
13
|
+
```python
|
|
14
|
+
rag = {
|
|
15
|
+
"embedding_model": "BAAI/bge-m3", # 模型名称
|
|
16
|
+
"embedding_type": "LocalEmbeddingModel", # 模型实现类型
|
|
17
|
+
"embedding_max_length": 512, # 嵌入模型最大输入长度(token数)
|
|
18
|
+
"rerank_model": "BAAI/bge-reranker-v2-m3", # 重排模型名称
|
|
19
|
+
"reranker_type": "LocalReranker", # 重排模型实现类型
|
|
20
|
+
"reranker_max_length": 512, # 重排模型最大输入长度(token数)
|
|
21
|
+
"use_bm25": True, # 是否使用BM25
|
|
22
|
+
"use_rerank": True, # 是否使用重排
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### 高级配置(带额外参数)
|
|
27
|
+
|
|
28
|
+
```python
|
|
29
|
+
rag = {
|
|
30
|
+
"embedding_model": "BAAI/bge-m3",
|
|
31
|
+
"embedding_type": "LocalEmbeddingModel",
|
|
32
|
+
"embedding_config": {
|
|
33
|
+
# 额外的嵌入模型配置参数
|
|
34
|
+
# 这些参数会传递给模型的构造函数
|
|
35
|
+
},
|
|
36
|
+
"rerank_model": "bge-reranker-v2-m3",
|
|
37
|
+
"reranker_type": "EdgeFnReranker",
|
|
38
|
+
"reranker_config": {
|
|
39
|
+
# 额外的重排模型配置参数
|
|
40
|
+
"api_key": "your-api-key", # 如果使用在线模型
|
|
41
|
+
"base_url": "https://api.example.com/v1/rerank",
|
|
42
|
+
},
|
|
43
|
+
"use_bm25": True,
|
|
44
|
+
"use_rerank": True,
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## 配置组
|
|
49
|
+
|
|
50
|
+
类似于模型组,RAG 也支持配置组:
|
|
51
|
+
|
|
52
|
+
```python
|
|
53
|
+
rag_group = "text" # 或 "code"
|
|
54
|
+
|
|
55
|
+
rag_groups = [
|
|
56
|
+
{
|
|
57
|
+
"text": {
|
|
58
|
+
"embedding_model": "BAAI/bge-m3",
|
|
59
|
+
"embedding_type": "LocalEmbeddingModel",
|
|
60
|
+
"rerank_model": "BAAI/bge-reranker-v2-m3",
|
|
61
|
+
"reranker_type": "LocalReranker",
|
|
62
|
+
"use_bm25": True,
|
|
63
|
+
"use_rerank": True,
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"code": {
|
|
68
|
+
"embedding_model": "Qodo/Qodo-Embed-1-1.5B",
|
|
69
|
+
"embedding_type": "LocalEmbeddingModel",
|
|
70
|
+
"use_bm25": False,
|
|
71
|
+
"use_rerank": False,
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
]
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## 可用的模型类型
|
|
78
|
+
|
|
79
|
+
### 嵌入模型类型
|
|
80
|
+
|
|
81
|
+
- `LocalEmbeddingModel` - 本地 HuggingFace 模型(默认)
|
|
82
|
+
- `OpenAIEmbeddingModel` - OpenAI API
|
|
83
|
+
- `CohereEmbeddingModel` - Cohere API
|
|
84
|
+
- `EdgeFnEmbeddingModel` - EdgeFn API
|
|
85
|
+
- 自定义模型(通过动态加载)
|
|
86
|
+
|
|
87
|
+
### 重排模型类型
|
|
88
|
+
|
|
89
|
+
- `LocalReranker` - 本地 CrossEncoder 模型(默认)
|
|
90
|
+
- `CohereReranker` - Cohere API
|
|
91
|
+
- `JinaReranker` - Jina API
|
|
92
|
+
- `EdgeFnReranker` - EdgeFn API
|
|
93
|
+
- 自定义模型(通过动态加载)
|
|
94
|
+
|
|
95
|
+
## 配置示例
|
|
96
|
+
|
|
97
|
+
### 示例 1: 使用本地模型(默认)
|
|
98
|
+
|
|
99
|
+
```python
|
|
100
|
+
# 使用默认配置,无需设置
|
|
101
|
+
# 或显式设置:
|
|
102
|
+
rag = {
|
|
103
|
+
"embedding_model": "BAAI/bge-m3",
|
|
104
|
+
"embedding_type": "LocalEmbeddingModel",
|
|
105
|
+
"embedding_max_length": 512, # 根据模型调整
|
|
106
|
+
"rerank_model": "BAAI/bge-reranker-v2-m3",
|
|
107
|
+
"reranker_type": "LocalReranker",
|
|
108
|
+
"reranker_max_length": 512, # 根据模型调整
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### 示例 2: 使用 OpenAI 嵌入模型
|
|
113
|
+
|
|
114
|
+
```python
|
|
115
|
+
rag = {
|
|
116
|
+
"embedding_model": "text-embedding-3-small",
|
|
117
|
+
"embedding_type": "OpenAIEmbeddingModel",
|
|
118
|
+
"embedding_config": {
|
|
119
|
+
"api_key": "your-openai-api-key", # 或设置 OPENAI_API_KEY 环境变量
|
|
120
|
+
},
|
|
121
|
+
"rerank_model": "BAAI/bge-reranker-v2-m3",
|
|
122
|
+
"reranker_type": "LocalReranker",
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### 示例 3: 使用 EdgeFn 在线模型
|
|
127
|
+
|
|
128
|
+
```python
|
|
129
|
+
rag = {
|
|
130
|
+
"embedding_model": "BAAI/bge-m3",
|
|
131
|
+
"embedding_type": "EdgeFnEmbeddingModel",
|
|
132
|
+
"embedding_config": {
|
|
133
|
+
"api_key": "your-edgefn-api-key", # 或设置 EDGEFN_API_KEY 环境变量
|
|
134
|
+
},
|
|
135
|
+
"rerank_model": "bge-reranker-v2-m3",
|
|
136
|
+
"reranker_type": "EdgeFnReranker",
|
|
137
|
+
"reranker_config": {
|
|
138
|
+
"api_key": "your-edgefn-api-key",
|
|
139
|
+
},
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### 示例 4: 混合使用(本地嵌入 + 在线重排)
|
|
144
|
+
|
|
145
|
+
```python
|
|
146
|
+
rag = {
|
|
147
|
+
"embedding_model": "BAAI/bge-m3",
|
|
148
|
+
"embedding_type": "LocalEmbeddingModel",
|
|
149
|
+
"rerank_model": "rerank-english-v3.0",
|
|
150
|
+
"reranker_type": "CohereReranker",
|
|
151
|
+
"reranker_config": {
|
|
152
|
+
"api_key": "your-cohere-api-key", # 或设置 COHERE_API_KEY 环境变量
|
|
153
|
+
},
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### 示例 5: 使用自定义模型
|
|
158
|
+
|
|
159
|
+
```python
|
|
160
|
+
# 首先在 ~/.jarvis/embeddings/ 或 ~/.jarvis/rerankers/ 中创建自定义模型
|
|
161
|
+
# 然后配置使用:
|
|
162
|
+
|
|
163
|
+
rag = {
|
|
164
|
+
"embedding_model": "my-custom-model",
|
|
165
|
+
"embedding_type": "MyCustomEmbeddingModel", # 自定义类名
|
|
166
|
+
"embedding_config": {
|
|
167
|
+
"api_key": "your-api-key",
|
|
168
|
+
"custom_param": "value",
|
|
169
|
+
},
|
|
170
|
+
}
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## 配置优先级
|
|
174
|
+
|
|
175
|
+
配置的优先级顺序(从高到低):
|
|
176
|
+
|
|
177
|
+
1. **顶级 rag 设置** - 直接设置的配置项
|
|
178
|
+
2. **rag_group 组配置** - 通过组名选择的配置
|
|
179
|
+
3. **代码默认值** - 硬编码的默认值
|
|
180
|
+
|
|
181
|
+
## 配置函数
|
|
182
|
+
|
|
183
|
+
系统提供了以下配置函数:
|
|
184
|
+
|
|
185
|
+
### 嵌入模型配置
|
|
186
|
+
|
|
187
|
+
- `get_rag_embedding_model() -> str`: 获取嵌入模型名称
|
|
188
|
+
- `get_rag_embedding_type() -> str`: 获取嵌入模型类型
|
|
189
|
+
- `get_rag_embedding_max_length() -> int`: 获取嵌入模型最大输入长度(token数)
|
|
190
|
+
- `get_rag_embedding_config() -> Dict[str, Any]`: 获取嵌入模型额外配置
|
|
191
|
+
|
|
192
|
+
### 重排模型配置
|
|
193
|
+
|
|
194
|
+
- `get_rag_rerank_model() -> str`: 获取重排模型名称
|
|
195
|
+
- `get_rag_reranker_type() -> str`: 获取重排模型类型
|
|
196
|
+
- `get_rag_reranker_max_length() -> int`: 获取重排模型最大输入长度(token数)
|
|
197
|
+
- `get_rag_reranker_config() -> Dict[str, Any]`: 获取重排模型额外配置
|
|
198
|
+
|
|
199
|
+
### 其他配置
|
|
200
|
+
|
|
201
|
+
- `get_rag_use_bm25() -> bool`: 是否使用BM25
|
|
202
|
+
- `get_rag_use_rerank() -> bool`: 是否使用重排
|
|
203
|
+
- `get_rag_embedding_cache_path() -> str`: 嵌入缓存路径
|
|
204
|
+
- `get_rag_vector_db_path() -> str`: 向量数据库路径
|
|
205
|
+
|
|
206
|
+
## 在代码中使用配置
|
|
207
|
+
|
|
208
|
+
### 方式 1: 使用 Registry 从配置创建
|
|
209
|
+
|
|
210
|
+
```python
|
|
211
|
+
from jarvis.jarvis_rag.embeddings import EmbeddingRegistry
|
|
212
|
+
from jarvis.jarvis_rag.rerankers import RerankerRegistry
|
|
213
|
+
|
|
214
|
+
# 从配置创建模型实例
|
|
215
|
+
embedding = EmbeddingRegistry.create_from_config()
|
|
216
|
+
reranker = RerankerRegistry.create_from_config()
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### 方式 2: 手动创建(覆盖配置)
|
|
220
|
+
|
|
221
|
+
```python
|
|
222
|
+
from jarvis.jarvis_rag.embeddings import EmbeddingRegistry
|
|
223
|
+
|
|
224
|
+
registry = EmbeddingRegistry.get_global_registry()
|
|
225
|
+
embedding = registry.create_embedding(
|
|
226
|
+
"LocalEmbeddingModel",
|
|
227
|
+
model_name="custom-model",
|
|
228
|
+
cache_dir="/custom/cache"
|
|
229
|
+
)
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### 方式 3: 在 RAG Pipeline 中使用
|
|
233
|
+
|
|
234
|
+
```python
|
|
235
|
+
from jarvis.jarvis_rag import JarvisRAGPipeline
|
|
236
|
+
|
|
237
|
+
# RAG Pipeline 会自动从配置创建模型
|
|
238
|
+
pipeline = JarvisRAGPipeline()
|
|
239
|
+
# 内部会调用 EmbeddingRegistry.create_from_config() 和 RerankerRegistry.create_from_config()
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
## 环境变量
|
|
243
|
+
|
|
244
|
+
对于在线模型,建议使用环境变量存储 API 密钥:
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
export OPENAI_API_KEY="your-key"
|
|
248
|
+
export COHERE_API_KEY="your-key"
|
|
249
|
+
export EDGEFN_API_KEY="your-key"
|
|
250
|
+
export JINA_API_KEY="your-key"
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
然后在配置中只需要指定类型,不需要在 `embedding_config` 或 `reranker_config` 中提供 API 密钥。
|
|
254
|
+
|
|
255
|
+
## 向后兼容性
|
|
256
|
+
|
|
257
|
+
如果不指定 `embedding_type` 或 `reranker_type`,系统会:
|
|
258
|
+
|
|
259
|
+
1. 尝试从配置创建(如果配置了类型)
|
|
260
|
+
2. 回退到使用 `LocalEmbeddingModel` 和 `LocalReranker`(传统方式)
|
|
261
|
+
|
|
262
|
+
这确保了现有代码无需修改即可继续工作。
|
|
263
|
+
|
|
264
|
+
## 调试
|
|
265
|
+
|
|
266
|
+
如果模型创建失败,检查:
|
|
267
|
+
|
|
268
|
+
1. 配置中的类型名称是否正确(区分大小写)
|
|
269
|
+
2. 模型类型是否已在注册表中注册
|
|
270
|
+
3. 配置参数是否正确(特别是 API 密钥)
|
|
271
|
+
4. 查看控制台输出的错误信息
|
|
272
|
+
|
|
273
|
+
## 完整配置示例
|
|
274
|
+
|
|
275
|
+
```python
|
|
276
|
+
# 在环境变量或配置文件中设置
|
|
277
|
+
rag = {
|
|
278
|
+
# 嵌入模型配置
|
|
279
|
+
"embedding_model": "BAAI/bge-m3",
|
|
280
|
+
"embedding_type": "LocalEmbeddingModel",
|
|
281
|
+
"embedding_max_length": 512, # 模型最大输入token数,用于文档分割
|
|
282
|
+
"embedding_config": {
|
|
283
|
+
# 本地模型通常不需要额外配置
|
|
284
|
+
# 在线模型可能需要 api_key 等
|
|
285
|
+
},
|
|
286
|
+
|
|
287
|
+
# 重排模型配置
|
|
288
|
+
"rerank_model": "bge-reranker-v2-m3",
|
|
289
|
+
"reranker_type": "LocalReranker",
|
|
290
|
+
"reranker_max_length": 512, # 模型最大输入token数
|
|
291
|
+
"reranker_config": {
|
|
292
|
+
# 配置参数
|
|
293
|
+
},
|
|
294
|
+
|
|
295
|
+
# 功能开关
|
|
296
|
+
"use_bm25": True,
|
|
297
|
+
"use_rerank": True,
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
# 或使用配置组
|
|
301
|
+
rag_group = "text"
|
|
302
|
+
rag_groups = [
|
|
303
|
+
{
|
|
304
|
+
"text": {
|
|
305
|
+
"embedding_model": "BAAI/bge-m3",
|
|
306
|
+
"embedding_type": "LocalEmbeddingModel",
|
|
307
|
+
"rerank_model": "BAAI/bge-reranker-v2-m3",
|
|
308
|
+
"reranker_type": "LocalReranker",
|
|
309
|
+
"use_bm25": True,
|
|
310
|
+
"use_rerank": True,
|
|
311
|
+
}
|
|
312
|
+
},
|
|
313
|
+
]
|
|
314
|
+
```
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
# 动态加载自定义模型指南
|
|
2
|
+
|
|
3
|
+
本文档介绍如何使用动态加载功能添加自定义嵌入模型和重排模型。
|
|
4
|
+
|
|
5
|
+
## 概述
|
|
6
|
+
|
|
7
|
+
Jarvis RAG 框架支持动态加载自定义模型实现,类似于 `jarvis_platform` 的注册表机制。您可以在用户数据目录中创建自定义模型实现,系统会自动发现并加载它们。
|
|
8
|
+
|
|
9
|
+
## 目录结构
|
|
10
|
+
|
|
11
|
+
自定义模型应该放在以下目录:
|
|
12
|
+
|
|
13
|
+
- **嵌入模型**: `~/.jarvis/embeddings/` (或通过 `get_data_dir()` 获取的目录下的 `embeddings/`)
|
|
14
|
+
- **重排模型**: `~/.jarvis/rerankers/` (或通过 `get_data_dir()` 获取的目录下的 `rerankers/`)
|
|
15
|
+
|
|
16
|
+
这些目录会在首次使用时自动创建。
|
|
17
|
+
|
|
18
|
+
## 实现自定义嵌入模型
|
|
19
|
+
|
|
20
|
+
### 1. 创建模型文件
|
|
21
|
+
|
|
22
|
+
在 `~/.jarvis/embeddings/` 目录下创建一个 Python 文件,例如 `my_custom_embedding.py`:
|
|
23
|
+
|
|
24
|
+
```python
|
|
25
|
+
from typing import List, Optional
|
|
26
|
+
from jarvis.jarvis_rag.embedding_interface import EmbeddingInterface
|
|
27
|
+
from jarvis.jarvis_rag.embeddings.base import OnlineEmbeddingModel
|
|
28
|
+
|
|
29
|
+
class MyCustomEmbeddingModel(OnlineEmbeddingModel):
|
|
30
|
+
"""
|
|
31
|
+
自定义嵌入模型实现示例。
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
def __init__(
|
|
35
|
+
self,
|
|
36
|
+
api_key: Optional[str] = None,
|
|
37
|
+
model_name: str = "my-model",
|
|
38
|
+
base_url: str = "https://api.example.com/v1/embeddings",
|
|
39
|
+
**kwargs,
|
|
40
|
+
):
|
|
41
|
+
super().__init__(
|
|
42
|
+
api_key=api_key,
|
|
43
|
+
api_key_env="MY_API_KEY", # 环境变量名
|
|
44
|
+
base_url=base_url,
|
|
45
|
+
model_name=model_name,
|
|
46
|
+
**kwargs,
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
def _call_api(
|
|
50
|
+
self, texts: List[str], is_query: bool = False
|
|
51
|
+
) -> List[List[float]]:
|
|
52
|
+
"""
|
|
53
|
+
实现您的 API 调用逻辑。
|
|
54
|
+
"""
|
|
55
|
+
import requests
|
|
56
|
+
|
|
57
|
+
headers = {
|
|
58
|
+
"Authorization": f"Bearer {self.api_key}",
|
|
59
|
+
"Content-Type": "application/json",
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
payload = {
|
|
63
|
+
"model": self.model_name,
|
|
64
|
+
"input": texts if len(texts) > 1 else texts[0],
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
response = requests.post(
|
|
68
|
+
self.base_url, headers=headers, json=payload, timeout=60
|
|
69
|
+
)
|
|
70
|
+
response.raise_for_status()
|
|
71
|
+
|
|
72
|
+
data = response.json()
|
|
73
|
+
# 根据您的 API 响应格式解析嵌入向量
|
|
74
|
+
return data["embeddings"]
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### 2. 必需的方法
|
|
78
|
+
|
|
79
|
+
自定义嵌入模型必须实现以下方法:
|
|
80
|
+
|
|
81
|
+
- `embed_documents(texts: List[str]) -> List[List[float]]`: 为文档列表计算嵌入
|
|
82
|
+
- `embed_query(text: str) -> List[float]`: 为查询计算嵌入
|
|
83
|
+
|
|
84
|
+
如果继承自 `OnlineEmbeddingModel`,只需要实现 `_call_api` 方法。
|
|
85
|
+
|
|
86
|
+
### 3. 使用自定义模型
|
|
87
|
+
|
|
88
|
+
```python
|
|
89
|
+
from jarvis.jarvis_rag.embeddings import EmbeddingRegistry
|
|
90
|
+
|
|
91
|
+
# 获取注册表
|
|
92
|
+
registry = EmbeddingRegistry.get_global_registry()
|
|
93
|
+
|
|
94
|
+
# 查看可用的模型
|
|
95
|
+
print(registry.get_available_embeddings())
|
|
96
|
+
|
|
97
|
+
# 创建自定义模型实例
|
|
98
|
+
embedding = registry.create_embedding(
|
|
99
|
+
"MyCustomEmbeddingModel",
|
|
100
|
+
api_key="your-api-key",
|
|
101
|
+
model_name="my-model"
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
# 使用模型
|
|
105
|
+
embeddings = embedding.embed_documents(["文档1", "文档2"])
|
|
106
|
+
query_embedding = embedding.embed_query("查询文本")
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## 实现自定义重排模型
|
|
110
|
+
|
|
111
|
+
### 1. 创建模型文件
|
|
112
|
+
|
|
113
|
+
在 `~/.jarvis/rerankers/` 目录下创建一个 Python 文件,例如 `my_custom_reranker.py`:
|
|
114
|
+
|
|
115
|
+
```python
|
|
116
|
+
from typing import List, Optional
|
|
117
|
+
from langchain.docstore.document import Document
|
|
118
|
+
from jarvis.jarvis_rag.reranker_interface import RerankerInterface
|
|
119
|
+
from jarvis.jarvis_rag.rerankers.base import OnlineReranker
|
|
120
|
+
|
|
121
|
+
class MyCustomReranker(OnlineReranker):
|
|
122
|
+
"""
|
|
123
|
+
自定义重排模型实现示例。
|
|
124
|
+
"""
|
|
125
|
+
|
|
126
|
+
def __init__(
|
|
127
|
+
self,
|
|
128
|
+
api_key: Optional[str] = None,
|
|
129
|
+
model_name: str = "my-reranker",
|
|
130
|
+
base_url: str = "https://api.example.com/v1/rerank",
|
|
131
|
+
**kwargs,
|
|
132
|
+
):
|
|
133
|
+
super().__init__(
|
|
134
|
+
api_key=api_key,
|
|
135
|
+
api_key_env="MY_API_KEY",
|
|
136
|
+
base_url=base_url,
|
|
137
|
+
model_name=model_name,
|
|
138
|
+
**kwargs,
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
def _call_api(
|
|
142
|
+
self, query: str, documents: List[str]
|
|
143
|
+
) -> List[tuple[int, float]]:
|
|
144
|
+
"""
|
|
145
|
+
实现您的 API 调用逻辑。
|
|
146
|
+
返回 (索引, 分数) 元组列表,按分数降序排序。
|
|
147
|
+
"""
|
|
148
|
+
import requests
|
|
149
|
+
|
|
150
|
+
headers = {
|
|
151
|
+
"Authorization": f"Bearer {self.api_key}",
|
|
152
|
+
"Content-Type": "application/json",
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
payload = {
|
|
156
|
+
"model": self.model_name,
|
|
157
|
+
"query": query,
|
|
158
|
+
"documents": documents,
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
response = requests.post(
|
|
162
|
+
self.base_url, headers=headers, json=payload, timeout=60
|
|
163
|
+
)
|
|
164
|
+
response.raise_for_status()
|
|
165
|
+
|
|
166
|
+
data = response.json()
|
|
167
|
+
|
|
168
|
+
# 解析结果,返回 (索引, 分数) 列表
|
|
169
|
+
results = [
|
|
170
|
+
(item["index"], item["score"])
|
|
171
|
+
for item in data["results"]
|
|
172
|
+
]
|
|
173
|
+
results.sort(key=lambda x: x[1], reverse=True)
|
|
174
|
+
|
|
175
|
+
return results
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### 2. 必需的方法
|
|
179
|
+
|
|
180
|
+
自定义重排模型必须实现以下方法:
|
|
181
|
+
|
|
182
|
+
- `rerank(query: str, documents: List[Document], top_n: int = 5) -> List[Document]`: 对文档进行重排
|
|
183
|
+
|
|
184
|
+
如果继承自 `OnlineReranker`,只需要实现 `_call_api` 方法。
|
|
185
|
+
|
|
186
|
+
### 3. 使用自定义模型
|
|
187
|
+
|
|
188
|
+
```python
|
|
189
|
+
from jarvis.jarvis_rag.rerankers import RerankerRegistry
|
|
190
|
+
from langchain.docstore.document import Document
|
|
191
|
+
|
|
192
|
+
# 获取注册表
|
|
193
|
+
registry = RerankerRegistry.get_global_registry()
|
|
194
|
+
|
|
195
|
+
# 查看可用的模型
|
|
196
|
+
print(registry.get_available_rerankers())
|
|
197
|
+
|
|
198
|
+
# 创建自定义模型实例
|
|
199
|
+
reranker = registry.create_reranker(
|
|
200
|
+
"MyCustomReranker",
|
|
201
|
+
api_key="your-api-key",
|
|
202
|
+
model_name="my-reranker"
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
# 使用模型
|
|
206
|
+
documents = [
|
|
207
|
+
Document(page_content="文档1", metadata={"source": "doc1"}),
|
|
208
|
+
Document(page_content="文档2", metadata={"source": "doc2"}),
|
|
209
|
+
]
|
|
210
|
+
reranked = reranker.rerank("查询", documents, top_n=3)
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
## 实现本地模型
|
|
214
|
+
|
|
215
|
+
您也可以实现完全自定义的本地模型(不继承基类):
|
|
216
|
+
|
|
217
|
+
```python
|
|
218
|
+
from typing import List
|
|
219
|
+
from jarvis.jarvis_rag.embedding_interface import EmbeddingInterface
|
|
220
|
+
|
|
221
|
+
class MyLocalEmbeddingModel(EmbeddingInterface):
|
|
222
|
+
"""
|
|
223
|
+
完全自定义的本地嵌入模型。
|
|
224
|
+
"""
|
|
225
|
+
|
|
226
|
+
def __init__(self, model_path: str):
|
|
227
|
+
# 加载您的本地模型
|
|
228
|
+
self.model = load_your_model(model_path)
|
|
229
|
+
|
|
230
|
+
def embed_documents(self, texts: List[str]) -> List[List[float]]:
|
|
231
|
+
# 实现文档嵌入逻辑
|
|
232
|
+
return [self.model.encode(text) for text in texts]
|
|
233
|
+
|
|
234
|
+
def embed_query(self, text: str) -> List[float]:
|
|
235
|
+
# 实现查询嵌入逻辑
|
|
236
|
+
return self.model.encode(text)
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
## 验证实现
|
|
240
|
+
|
|
241
|
+
系统会自动验证您的实现:
|
|
242
|
+
|
|
243
|
+
1. **方法检查**: 确保实现了所有必需的方法
|
|
244
|
+
2. **参数检查**: 确保方法参数匹配
|
|
245
|
+
3. **类型检查**: 确保类继承自正确的接口
|
|
246
|
+
|
|
247
|
+
如果验证失败,系统会输出错误信息,但不会中断其他模型的加载。
|
|
248
|
+
|
|
249
|
+
## 注册表 API
|
|
250
|
+
|
|
251
|
+
### EmbeddingRegistry
|
|
252
|
+
|
|
253
|
+
- `get_global_registry() -> EmbeddingRegistry`: 获取全局注册表实例
|
|
254
|
+
- `get_available_embeddings() -> List[str]`: 获取所有可用的嵌入模型名称
|
|
255
|
+
- `create_embedding(name: str, *args, **kwargs) -> Optional[EmbeddingInterface]`: 创建嵌入模型实例
|
|
256
|
+
- `register_embedding(name: str, embedding_class: Type[EmbeddingInterface])`: 手动注册模型类
|
|
257
|
+
|
|
258
|
+
### RerankerRegistry
|
|
259
|
+
|
|
260
|
+
- `get_global_registry() -> RerankerRegistry`: 获取全局注册表实例
|
|
261
|
+
- `get_available_rerankers() -> List[str]`: 获取所有可用的重排模型名称
|
|
262
|
+
- `create_reranker(name: str, *args, **kwargs) -> Optional[RerankerInterface]`: 创建重排模型实例
|
|
263
|
+
- `register_reranker(name: str, reranker_class: Type[RerankerInterface])`: 手动注册模型类
|
|
264
|
+
|
|
265
|
+
## 注意事项
|
|
266
|
+
|
|
267
|
+
1. **文件命名**: 文件名应该使用下划线命名(如 `my_custom_model.py`),类名使用驼峰命名(如 `MyCustomModel`)
|
|
268
|
+
|
|
269
|
+
2. **导入依赖**: 确保您的自定义模型所需的依赖已安装
|
|
270
|
+
|
|
271
|
+
3. **错误处理**: 建议在 `_call_api` 方法中添加适当的错误处理
|
|
272
|
+
|
|
273
|
+
4. **性能考虑**: 对于批量处理,考虑实现批处理逻辑以提高效率
|
|
274
|
+
|
|
275
|
+
5. **缓存**: 如果需要缓存,可以在自定义类中添加缓存逻辑
|
|
276
|
+
|
|
277
|
+
## 示例:完整工作流
|
|
278
|
+
|
|
279
|
+
```python
|
|
280
|
+
# 1. 创建自定义模型文件 ~/.jarvis/embeddings/my_api.py
|
|
281
|
+
# (参考上面的示例代码)
|
|
282
|
+
|
|
283
|
+
# 2. 在代码中使用
|
|
284
|
+
from jarvis.jarvis_rag.embeddings import EmbeddingRegistry
|
|
285
|
+
|
|
286
|
+
registry = EmbeddingRegistry.get_global_registry()
|
|
287
|
+
|
|
288
|
+
# 检查模型是否已加载
|
|
289
|
+
if "MyApiEmbeddingModel" in registry.get_available_embeddings():
|
|
290
|
+
# 创建实例
|
|
291
|
+
embedding = registry.create_embedding(
|
|
292
|
+
"MyApiEmbeddingModel",
|
|
293
|
+
api_key="your-key"
|
|
294
|
+
)
|
|
295
|
+
|
|
296
|
+
# 使用模型
|
|
297
|
+
result = embedding.embed_query("测试查询")
|
|
298
|
+
print(result)
|
|
299
|
+
else:
|
|
300
|
+
print("模型未找到,请检查文件是否正确放置")
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
## 调试
|
|
304
|
+
|
|
305
|
+
如果模型未加载,检查:
|
|
306
|
+
|
|
307
|
+
1. 文件是否在正确的目录(`~/.jarvis/embeddings/` 或 `~/.jarvis/rerankers/`)
|
|
308
|
+
2. 文件是否以 `.py` 结尾且不以 `__` 开头
|
|
309
|
+
3. 类是否继承自正确的接口
|
|
310
|
+
4. 是否实现了所有必需的方法
|
|
311
|
+
5. 查看控制台输出的错误信息
|